| ! { dg-do compile } |
| ! |
| ! PR fortran/37829 |
| ! |
| ! Contributed by James Van Buskirk and Jerry DeLisle. |
| ! |
| ! Fix derived-type loading with ISO_BIND_C's C_PTR/C_FUNPTR. |
| |
| module m3 |
| use ISO_C_BINDING |
| implicit none |
| private |
| |
| public kill_C_PTR |
| interface |
| function kill_C_PTR() bind(C) |
| import |
| implicit none |
| type(C_PTR) kill_C_PTR |
| end function kill_C_PTR |
| end interface |
| |
| public kill_C_FUNPTR |
| interface |
| function kill_C_FUNPTR() bind(C) |
| import |
| implicit none |
| type(C_FUNPTR) kill_C_FUNPTR |
| end function kill_C_FUNPTR |
| end interface |
| end module m3 |
| |
| module m1 |
| use m3 |
| end module m1 |
| |
| program X |
| use m1 |
| use ISO_C_BINDING |
| implicit none |
| type(C_PTR) cp |
| type(C_FUNPTR) fp |
| integer(C_INT),target :: i |
| interface |
| function fun() bind(C) |
| use ISO_C_BINDING |
| implicit none |
| real(C_FLOAT) fun |
| end function fun |
| end interface |
| |
| cp = C_NULL_PTR |
| cp = C_LOC(i) |
| fp = C_NULL_FUNPTR |
| fp = C_FUNLOC(fun) |
| end program X |
| |
| function fun() bind(C) |
| use ISO_C_BINDING |
| implicit none |
| real(C_FLOAT) fun |
| fun = 1.0 |
| end function fun |
| |
| function kill_C_PTR() bind(C) |
| use ISO_C_BINDING |
| implicit none |
| type(C_PTR) kill_C_PTR |
| integer(C_INT), pointer :: p |
| allocate(p) |
| kill_C_PTR = C_LOC(p) |
| end function kill_C_PTR |
| |
| function kill_C_FUNPTR() bind(C) |
| use ISO_C_BINDING |
| implicit none |
| type(C_FUNPTR) kill_C_FUNPTR |
| interface |
| function fun() bind(C) |
| use ISO_C_BINDING |
| implicit none |
| real(C_FLOAT) fun |
| end function fun |
| end interface |
| kill_C_FUNPTR = C_FUNLOC(fun) |
| end function kill_C_FUNPTR |