blob: 5b4d2dc5c6cd8fd37bb8f894af8719c01e34549f [file] [edit]
! This checks that attach never prevents pointer attachment when specified.
! NOTE: We have to make sure the old default auto attach behaviour is off to
! yield the correct results for this test. Otherwise the second target will
! be treated as if we'd had the attach always specified!
! REQUIRES: flang, amdgpu
! RUN: %libomptarget-compile-fortran-generic
! RUN: env LIBOMPTARGET_TREAT_ATTACH_AUTO_AS_ALWAYS=0 %libomptarget-run-generic 2>&1 | %fcheck-generic
program main
implicit none
integer, pointer :: map_ptr(:)
integer, target :: a(10)
integer, target :: b(10)
integer :: index, n
logical :: correct
correct = .true.
n = 10
do index = 1, n
a(index) = 10
b(index) = 20
end do
map_ptr => a
! This should map a and map_ptr to device, and attach map_ptr
! to a (as it is assigned to it above).
!$omp target enter data map(ref_ptr_ptee, to: map_ptr)
map_ptr => b
! As "b" hasn't been mapped to device yet, the first time it's mapped will
! be when map_ptr is re-mapped (implicitly or explicitly), the default behavior
! when LIBOMPTARGET_TREAT_ATTACH_AUTO_AS_ALWAYS is switched off would force attachment
! of map_ptr to b as we've assigned it above. To prevent this and test the never
! attachment, we can apply attach(never), which prevents this reattachment from
! occurring
!$omp target map(to: index) map(tofrom: correct) map(attach(never): map_ptr)
do index = 1, n
if (map_ptr(index) /= 10) then
correct = .false.
endif
end do
!$omp end target
if (correct .NEQV. .true.) then
print*, "Failed!"
stop 1
endif
print*, "Passed!"
end program
!CHECK: Passed!