| ! 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! |