blob: 53e5a18714dec80846c5a80be7edbce6b8ff4cc2 [file]
! Offloading test that verifies a type(c_ptr) and type(c_funptr) nested inside
! a derived type are mapped correctly to the target device, i.e. their
! underlying address values are transferred intact when the enclosing derived
! type is mapped. This exercises the handling of ISO C interoperable types
! nested within derived types across the host/device boundary.
! REQUIRES: flang, amdgpu
! RUN: %libomptarget-compile-fortran-run-and-check-generic
program target_map_cptr_cfunptr
use iso_c_binding
implicit none
type :: iso_holder
integer :: id
type(c_ptr) :: ptr
type(c_funptr) :: funptr
end type iso_holder
integer, target :: data
type(iso_holder) :: holder
integer(c_intptr_t) :: host_ptr_val, dev_ptr_val
integer(c_intptr_t) :: host_fun_val, dev_fun_val
data = 42
! Populate the derived type with the host address values.
holder%ptr = c_loc(data)
holder%funptr = c_funloc(dummy_proc)
host_ptr_val = transfer(holder%ptr, host_ptr_val)
host_fun_val = transfer(holder%funptr, host_fun_val)
dev_ptr_val = 0
dev_fun_val = 0
! Map the whole derived type (containing the nested c_ptr/c_funptr) to the
! device and read back their bit values from within the target region.
!$omp target map(to: holder) &
!$omp& map(from: dev_ptr_val, dev_fun_val)
dev_ptr_val = transfer(holder%ptr, dev_ptr_val)
dev_fun_val = transfer(holder%funptr, dev_fun_val)
!$omp end target
! CHECK: nested c_ptr mapped correctly
if (dev_ptr_val == host_ptr_val) then
print *, "nested c_ptr mapped correctly"
else
print *, "nested c_ptr mapping FAILED"
end if
! CHECK: nested c_funptr mapped correctly
if (dev_fun_val == host_fun_val) then
print *, "nested c_funptr mapped correctly"
else
print *, "nested c_funptr mapping FAILED"
end if
contains
subroutine dummy_proc() bind(C)
end subroutine dummy_proc
end program target_map_cptr_cfunptr