I actually only fill this to ensure my test case does not get lost. Fortran 2003 contains ("12.4 Procedure reference"):
"C1229 (R1221) A procedure-name shall be the name of an external procedure, a dummy procedure, a module procedure, a procedure pointer, or a specific intrinsic function that is listed in 13.6 and not marked with a bullet(*). NOTE 12.16 -- This standard does not allow internal procedures to be used as actual arguments, in part to simplify the problem of ensuring that internal procedures with recursive hosts access entities from the correct instance (12.5.2.3) of the host." In Fortran 2008 (draft 07-007r3) this restriction is gone: "C1235 (R1223) A procedure-name shall be the name of an external, internal, module, or dummy procedure, a specific intrinsic function listed in 13.6 and not marked with a bullet (*), or a procedure pointer." Test program (initially created for PR 34133): ! { dg-do run } ! PR fortran/34133 ! ! Test of using internal bind(C) procedures as ! actual argument. Bind(c) on internal procedures and ! internal procedures are actual argument are ! Fortran 2008 (draft) extension. ! module test_mod use iso_c_binding implicit none contains subroutine test_sub(a, arg, res) interface subroutine a(x) bind(C) import integer(c_int), intent(inout) :: x end subroutine a end interface integer(c_int), intent(inout) :: arg integer(c_int), intent(in) :: res call a(arg) if(arg /= res) call abort() end subroutine test_sub subroutine test_func(a, arg, res) interface integer(c_int) function a(x) bind(C) import integer(c_int), intent(in) :: x end function a end interface integer(c_int), intent(in) :: arg integer(c_int), intent(in) :: res if(a(arg) /= res) call abort() end subroutine test_func end module test_mod program main use test_mod implicit none call test_sub (one, 33, 7*33) call test_func(two, 23, -123*23) contains subroutine one(x) bind(c) integer(c_int),intent(inout) :: x x = 7*x end subroutine one integer(c_int) function two(y) bind(c) integer(c_int),intent(in) :: y two = -123*y end function two end program main ! { dg-final { cleanup-modules "test_mod" } } -- Summary: F2008: Allow internal procedures as actual argument Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: fortran AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: burnus at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34162