| ! { dg-do compile } |
| ! Test argument checking for C_LOC with subcomponent parameters. |
| module c_vhandle_mod |
| use iso_c_binding |
| |
| type double_vector_item |
| real(kind(1.d0)), allocatable :: v(:) |
| end type double_vector_item |
| type(double_vector_item), allocatable, target :: dbv_pool(:) |
| real(kind(1.d0)), allocatable, target :: vv(:) |
| |
| type foo |
| integer :: i |
| end type foo |
| type foo_item |
| type(foo), pointer :: v => null() |
| end type foo_item |
| type(foo_item), allocatable :: foo_pool(:) |
| |
| type foo_item2 |
| type(foo), pointer :: v(:) => null() |
| end type foo_item2 |
| type(foo_item2), allocatable :: foo_pool2(:) |
| |
| |
| contains |
| |
| type(c_ptr) function get_double_vector_address(handle) |
| integer(c_int), intent(in) :: handle |
| |
| if (.true.) then ! The ultimate component is an allocatable target |
| get_double_vector_address = c_loc(dbv_pool(handle)%v) |
| else |
| get_double_vector_address = c_loc(vv) |
| endif |
| |
| end function get_double_vector_address |
| |
| |
| type(c_ptr) function get_foo_address(handle) |
| integer(c_int), intent(in) :: handle |
| get_foo_address = c_loc(foo_pool(handle)%v) |
| |
| get_foo_address = c_loc(foo_pool2(handle)%v) ! { dg-error "must be a scalar" } |
| end function get_foo_address |
| |
| |
| end module c_vhandle_mod |
| |