! { dg-do run } ! Comprehensive run-time test for use_device_addr ! ! Differs from use_device_addr-1.f90 by using a 4-byte variable (c_float) ! ! This test case assumes that a 'var' appearing in 'use_device_addr' is ! only used as 'c_loc(var)' - such that only the actual data is used/usable ! on the device - and not meta data ((dynamic) type information, 'present()' ! status, array shape). ! ! Untested in this test case are: ! - arrays with array descriptor ! - polymorphic variables ! - absent optional arguments ! module target_procs use iso_c_binding implicit none (type, external) private public :: copy3_array, copy3_scalar contains subroutine copy3_array_int(from_ptr, to_ptr, N) !$omp declare target real(c_float) :: from_ptr(:) real(c_float) :: to_ptr(:) integer, value :: N integer :: i !$omp parallel do do i = 1, N to_ptr(i) = 3 * from_ptr(i) end do !$omp end parallel do end subroutine copy3_array_int subroutine copy3_scalar_int(from, to) !$omp declare target real(c_float) :: from, to to = 3 * from end subroutine copy3_scalar_int subroutine copy3_array(from, to, N) type(c_ptr), value :: from, to integer, value :: N real(c_float), pointer :: from_ptr(:), to_ptr(:) call c_f_pointer(from, from_ptr, shape=[N]) call c_f_pointer(to, to_ptr, shape=[N]) call do_offload_scalar(from_ptr,to_ptr) contains subroutine do_offload_scalar(from_r, to_r) real(c_float), target :: from_r(:), to_r(:) ! The extra function is needed as is_device_ptr ! requires non-value, non-pointer dummy arguments !$omp target is_device_ptr(from_r, to_r) call copy3_array_int(from_r, to_r, N) !$omp end target end subroutine do_offload_scalar end subroutine copy3_array subroutine copy3_scalar(from, to) type(c_ptr), value, target :: from, to real(c_float), pointer :: from_ptr(:), to_ptr(:) ! Standard-conform detour of using an array as at time of writing ! is_device_ptr below does not handle scalars call c_f_pointer(from, from_ptr, shape=[1]) call c_f_pointer(to, to_ptr, shape=[1]) call do_offload_scalar(from_ptr,to_ptr) contains subroutine do_offload_scalar(from_r, to_r) real(c_float), target :: from_r(:), to_r(:) ! The extra function is needed as is_device_ptr ! requires non-value, non-pointer dummy arguments !$omp target is_device_ptr(from_r, to_r) call copy3_scalar_int(from_r(1), to_r(1)) !$omp end target end subroutine do_offload_scalar end subroutine copy3_scalar end module target_procs ! Test local dummy arguments (w/o optional) module test_dummies use iso_c_binding use target_procs implicit none (type, external) private public :: test_dummy_call_1, test_dummy_call_2 contains subroutine test_dummy_call_1() integer, parameter :: N = 1000 ! scalars real(c_float), target :: aa, bb real(c_float), target, allocatable :: cc, dd real(c_float), pointer :: ee, ff ! non-descriptor arrays real(c_float), target :: gg(N), hh(N) allocate(cc, dd, ee, ff) aa = 11.0_c_float bb = 22.0_c_float cc = 33.0_c_float dd = 44.0_c_float ee = 55.0_c_float ff = 66.0_c_float gg = 77.0_c_float hh = 88.0_c_float call test_dummy_callee_1(aa, bb, cc, dd, ee, ff, gg, hh, N) deallocate(ee, ff) ! pointers, only end subroutine test_dummy_call_1 subroutine test_dummy_callee_1(aa, bb, cc, dd, ee, ff, gg, hh, N) ! scalars real(c_float), target :: aa, bb real(c_float), target, allocatable :: cc, dd real(c_float), pointer :: ee, ff ! non-descriptor arrays real(c_float), target :: gg(N), hh(N) integer, value :: N !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) call copy3_scalar(c_loc(aa), c_loc(bb)) !$omp end target data if (abs(aa - 11.0_c_float) > 10.0_c_float * epsilon(aa)) stop 1 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 2 !$omp target data map(to:cc) map(from:dd) use_device_addr(cc,dd) call copy3_scalar(c_loc(cc), c_loc(dd)) !$omp end target data if (abs(cc - 33.0_c_float) > 10.0_c_float * epsilon(cc)) stop 3 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 4 !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) call copy3_scalar(c_loc(ee), c_loc(ff)) !$omp end target data if (abs(ee - 55.0_c_float) > 10.0_c_float * epsilon(ee)) stop 5 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 6 !$omp target data map(to:gg) map(from:hh) use_device_addr(gg,hh) call copy3_array(c_loc(gg), c_loc(hh), N) !$omp end target data if (any(abs(gg - 77.0_c_float) > 10.0_c_float * epsilon(gg))) stop 7 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 8 end subroutine test_dummy_callee_1 ! Save device ptr - and recall pointer subroutine test_dummy_call_2() integer, parameter :: N = 1000 ! scalars real(c_float), target :: aa, bb real(c_float), target, allocatable :: cc, dd real(c_float), pointer :: ee, ff ! non-descriptor arrays real(c_float), target :: gg(N), hh(N) type(c_ptr) :: c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, c_gptr, c_hptr real(c_float), pointer :: aptr, bptr, cptr, dptr, eptr, fptr real(c_float), pointer :: gptr(:), hptr(:) allocate(cc, dd, ee, ff) call test_dummy_callee_2(aa, bb, cc, dd, ee, ff, gg, hh, & c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, c_gptr, c_hptr, & aptr, bptr, cptr, dptr, eptr, fptr, gptr, hptr, & N) deallocate(ee, ff) end subroutine test_dummy_call_2 subroutine test_dummy_callee_2(aa, bb, cc, dd, ee, ff, gg, hh, & c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, c_gptr, c_hptr, & aptr, bptr, cptr, dptr, eptr, fptr, gptr, hptr, & N) ! scalars real(c_float), target :: aa, bb real(c_float), target, allocatable :: cc, dd real(c_float), pointer :: ee, ff ! non-descriptor arrays real(c_float), target :: gg(N), hh(N) type(c_ptr) :: c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, c_gptr, c_hptr real(c_float), pointer :: aptr, bptr, cptr, dptr, eptr, fptr real(c_float), pointer :: gptr(:), hptr(:) integer, value :: N real(c_float) :: dummy aa = 111.0_c_float bb = 222.0_c_float cc = 333.0_c_float dd = 444.0_c_float ee = 555.0_c_float ff = 666.0_c_float gg = 777.0_c_float hh = 888.0_c_float !$omp target data map(to:aa) map(from:bb) !$omp target data map(alloc:dummy) use_device_addr(aa,bb) c_aptr = c_loc(aa) c_bptr = c_loc(bb) aptr => aa bptr => bb !$omp end target data ! check c_loc ptr once call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 9 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 10 ! check c_loc ptr again after target-value modification aa = 1111.0_c_float !$omp target update to(aa) call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 1111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 11 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 12 ! check Fortran pointer after target-value modification aa = 11111.0_c_float !$omp target update to(aa) call copy3_scalar(c_loc(aptr), c_loc(bptr)) !$omp target update from(bb) if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 13 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 14 !$omp end target data if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 15 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 16 !$omp target data map(to:cc) map(from:dd) !$omp target data map(alloc:dummy) use_device_addr(cc,dd) c_cptr = c_loc(cc) c_dptr = c_loc(dd) cptr => cc dptr => dd !$omp end target data ! check c_loc ptr once call copy3_scalar(c_cptr, c_dptr) !$omp target update from(dd) if (abs(cc - 333.0_c_float) > 10.0_c_float * epsilon(cc)) stop 17 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 18 ! check c_loc ptr again after target-value modification cc = 3333.0_c_float !$omp target update to(cc) call copy3_scalar(c_cptr, c_dptr) !$omp target update from(dd) if (abs(cc - 3333.0_c_float) > 10.0_c_float * epsilon(cc)) stop 19 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 20 ! check Fortran pointer after target-value modification cc = 33333.0_c_float !$omp target update to(cc) call copy3_scalar(c_loc(cptr), c_loc(dptr)) !$omp target update from(dd) if (abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(cc)) stop 21 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 22 !$omp end target data if (abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(dd)) stop 23 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(dd)) stop 24 !$omp target data map(to:ee) map(from:ff) !$omp target data map(alloc:dummy) use_device_addr(ee,ff) c_eptr = c_loc(ee) c_fptr = c_loc(ff) eptr => ee fptr => ff !$omp end target data ! check c_loc ptr once call copy3_scalar(c_eptr, c_fptr) !$omp target update from(ff) if (abs(ee - 555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 25 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 26 ! check c_loc ptr again after target-value modification ee = 5555.0_c_float !$omp target update to(ee) call copy3_scalar(c_eptr, c_fptr) !$omp target update from(ff) if (abs(ee - 5555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 27 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 28 ! check Fortran pointer after target-value modification ee = 55555.0_c_float !$omp target update to(ee) call copy3_scalar(c_loc(eptr), c_loc(fptr)) !$omp target update from(ff) if (abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 29 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ff)) stop 30 !$omp end target data if (abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 31 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 32 !$omp target data map(to:gg) map(from:hh) !$omp target data map(alloc:dummy) use_device_addr(gg,hh) c_gptr = c_loc(gg) c_hptr = c_loc(hh) gptr => gg hptr => hh !$omp end target data ! check c_loc ptr once call copy3_array(c_gptr, c_hptr, N) !$omp target update from(hh) if (any(abs(gg - 777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 33 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(hh))) stop 34 ! check c_loc ptr again after target-value modification gg = 7777.0_c_float !$omp target update to(gg) call copy3_array(c_gptr, c_hptr, N) !$omp target update from(hh) if (any(abs(gg - 7777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 35 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 36 ! check Fortran pointer after target-value modification gg = 77777.0_c_float !$omp target update to(gg) call copy3_array(c_loc(gptr), c_loc(hptr), N) !$omp target update from(hh) if (any(abs(gg - 77777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 37 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 38 !$omp end target data if (any(abs(gg - 77777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 39 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 40 end subroutine test_dummy_callee_2 end module test_dummies ! Test local dummy arguments + VALUE (w/o optional) module test_dummies_value use iso_c_binding use target_procs implicit none (type, external) private public :: test_dummy_val_call_1, test_dummy_val_call_2 contains subroutine test_dummy_val_call_1() ! scalars - with value, neither allocatable nor pointer no dimension permitted real(c_float), target :: aa, bb aa = 11.0_c_float bb = 22.0_c_float call test_dummy_val_callee_1(aa, bb) end subroutine test_dummy_val_call_1 subroutine test_dummy_val_callee_1(aa, bb) ! scalars real(c_float), value, target :: aa, bb !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) call copy3_scalar(c_loc(aa), c_loc(bb)) !$omp end target data if (abs(aa - 11.0_c_float) > 10.0_c_float * epsilon(aa)) stop 41 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 42 end subroutine test_dummy_val_callee_1 ! Save device ptr - and recall pointer subroutine test_dummy_val_call_2() ! scalars - with value, neither allocatable nor pointer no dimension permitted real(c_float), target :: aa, bb type(c_ptr) :: c_aptr, c_bptr real(c_float), pointer :: aptr, bptr call test_dummy_val_callee_2(aa, bb, c_aptr, c_bptr, aptr, bptr) end subroutine test_dummy_val_call_2 subroutine test_dummy_val_callee_2(aa, bb, c_aptr, c_bptr, aptr, bptr) real(c_float), value, target :: aa, bb type(c_ptr), value :: c_aptr, c_bptr real(c_float), pointer :: aptr, bptr real(c_float) :: dummy aa = 111.0_c_float bb = 222.0_c_float !$omp target data map(to:aa) map(from:bb) !$omp target data map(alloc:dummy) use_device_addr(aa,bb) c_aptr = c_loc(aa) c_bptr = c_loc(bb) aptr => aa bptr => bb !$omp end target data ! check c_loc ptr once call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 43 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 44 ! check c_loc ptr again after target-value modification aa = 1111.0_c_float !$omp target update to(aa) call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 1111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 45 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 46 ! check Fortran pointer after target-value modification aa = 11111.0_c_float !$omp target update to(aa) call copy3_scalar(c_loc(aptr), c_loc(bptr)) !$omp target update from(bb) if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 47 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 48 !$omp end target data if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 49 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 50 end subroutine test_dummy_val_callee_2 end module test_dummies_value ! Test local dummy arguments + OPTIONAL ! Values present and ptr associated to nonzero module test_dummies_opt use iso_c_binding use target_procs implicit none (type, external) private public :: test_dummy_opt_call_1, test_dummy_opt_call_2 contains subroutine test_dummy_opt_call_1() integer, parameter :: N = 1000 ! scalars real(c_float), target :: aa, bb real(c_float), target, allocatable :: cc, dd real(c_float), pointer :: ee, ff ! non-descriptor arrays real(c_float), target :: gg(N), hh(N) allocate(cc, dd, ee, ff) aa = 11.0_c_float bb = 22.0_c_float cc = 33.0_c_float dd = 44.0_c_float ee = 55.0_c_float ff = 66.0_c_float gg = 77.0_c_float hh = 88.0_c_float call test_dummy_opt_callee_1(aa, bb, cc, dd, ee, ff, gg, hh, N) call test_dummy_opt_callee_1_absent(N=N) deallocate(ee, ff) ! pointers, only end subroutine test_dummy_opt_call_1 subroutine test_dummy_opt_callee_1(aa, bb, cc, dd, ee, ff, gg, hh, N) ! scalars real(c_float), optional, target :: aa, bb real(c_float), optional, target, allocatable :: cc, dd real(c_float), optional, pointer :: ee, ff ! non-descriptor arrays real(c_float), optional, target :: gg(N), hh(N) integer, value :: N ! All shall be present - and pointing to non-NULL if (.not.present(aa) .or. .not.present(bb)) stop 51 if (.not.present(cc) .or. .not.present(dd)) stop 52 if (.not.present(ee) .or. .not.present(ff)) stop 53 if (.not.present(gg) .or. .not.present(hh)) stop 54 if (.not.associated(ee) .or. .not.associated(ff)) stop 55 !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) if (.not.present(aa) .or. .not.present(bb)) stop 56 if (.not.c_associated(c_loc(aa)) .or. .not.c_associated(c_loc(bb))) stop 57 call copy3_scalar(c_loc(aa), c_loc(bb)) !$omp end target data if (abs(aa - 11.0_c_float) > 10.0_c_float * epsilon(aa)) stop 58 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 59 !$omp target data map(to:cc) map(from:dd) use_device_addr(cc,dd) if (.not.present(cc) .or. .not.present(dd)) stop 60 if (.not.c_associated(c_loc(cc)) .or. .not.c_associated(c_loc(dd))) stop 61 call copy3_scalar(c_loc(cc), c_loc(dd)) !$omp end target data if (abs(cc - 33.0_c_float) > 10.0_c_float * epsilon(cc)) stop 62 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 63 !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) if (.not.present(ee) .or. .not.present(ff)) stop 64 if (.not.associated(ee) .or. .not.associated(ff)) stop 65 if (.not.c_associated(c_loc(ee)) .or. .not.c_associated(c_loc(ff))) stop 66 call copy3_scalar(c_loc(ee), c_loc(ff)) !$omp end target data if (abs(ee - 55.0_c_float) > 10.0_c_float * epsilon(ee)) stop 67 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 68 !$omp target data map(to:gg) map(from:hh) use_device_addr(gg,hh) if (.not.present(gg) .or. .not.present(hh)) stop 69 if (.not.c_associated(c_loc(gg)) .or. .not.c_associated(c_loc(hh))) stop 70 call copy3_array(c_loc(gg), c_loc(hh), N) !$omp end target data if (any(abs(gg - 77.0_c_float) > 10.0_c_float * epsilon(gg))) stop 71 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 72 end subroutine test_dummy_opt_callee_1 subroutine test_dummy_opt_callee_1_absent(aa, bb, cc, dd, ee, ff, gg, hh, N) ! scalars real(c_float), optional, target :: aa, bb real(c_float), optional, target, allocatable :: cc, dd real(c_float), optional, pointer :: ee, ff ! non-descriptor arrays real(c_float), optional, target :: gg(N), hh(N) integer, value :: N integer :: err ! All shall be absent if (present(aa) .or. present(bb)) stop 243 if (present(cc) .or. present(dd)) stop 244 if (present(ee) .or. present(ff)) stop 245 if (present(gg) .or. present(hh)) stop 246 !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) if (present(aa) .or. present(bb)) stop 247 !$omp end target data !$omp target data map(to:cc) map(from:dd) use_device_addr(cc,dd) if (present(cc) .or. present(dd)) stop 248 !$omp end target data !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) if (present(ee) .or. present(ff)) stop 249 !$omp end target data !$omp target data map(to:gg) map(from:hh) use_device_addr(gg,hh) if (present(gg) .or. present(hh)) stop 250 !$omp end target data end subroutine test_dummy_opt_callee_1_absent ! Save device ptr - and recall pointer subroutine test_dummy_opt_call_2() integer, parameter :: N = 1000 ! scalars real(c_float), target :: aa, bb real(c_float), target, allocatable :: cc, dd real(c_float), pointer :: ee, ff ! non-descriptor arrays real(c_float), target :: gg(N), hh(N) type(c_ptr) :: c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, c_gptr, c_hptr real(c_float), pointer :: aptr, bptr, cptr, dptr, eptr, fptr real(c_float), pointer :: gptr(:), hptr(:) allocate(cc, dd, ee, ff) call test_dummy_opt_callee_2(aa, bb, cc, dd, ee, ff, gg, hh, & c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, c_gptr, c_hptr, & aptr, bptr, cptr, dptr, eptr, fptr, gptr, hptr, & N) deallocate(ee, ff) end subroutine test_dummy_opt_call_2 subroutine test_dummy_opt_callee_2(aa, bb, cc, dd, ee, ff, gg, hh, & c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, c_gptr, c_hptr, & aptr, bptr, cptr, dptr, eptr, fptr, gptr, hptr, & N) ! scalars real(c_float), optional, target :: aa, bb real(c_float), optional, target, allocatable :: cc, dd real(c_float), optional, pointer :: ee, ff ! non-descriptor arrays real(c_float), optional, target :: gg(N), hh(N) type(c_ptr) :: c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, c_gptr, c_hptr real(c_float), optional, pointer :: aptr, bptr, cptr, dptr, eptr, fptr real(c_float), optional, pointer :: gptr(:), hptr(:) integer, value :: N real(c_float) :: dummy ! All shall be present - and pointing to non-NULL if (.not.present(aa) .or. .not.present(bb)) stop 73 if (.not.present(cc) .or. .not.present(dd)) stop 74 if (.not.present(ee) .or. .not.present(ff)) stop 75 if (.not.present(gg) .or. .not.present(hh)) stop 76 if (.not.associated(ee) .or. .not.associated(ff)) stop 77 aa = 111.0_c_float bb = 222.0_c_float cc = 333.0_c_float dd = 444.0_c_float ee = 555.0_c_float ff = 666.0_c_float gg = 777.0_c_float hh = 888.0_c_float !$omp target data map(to:aa) map(from:bb) !$omp target data map(alloc:dummy) use_device_addr(aa,bb) if (.not.present(aa) .or. .not.present(bb)) stop 78 if (.not.c_associated(c_loc(aa)) .or. .not.c_associated(c_loc(bb))) stop 79 c_aptr = c_loc(aa) c_bptr = c_loc(bb) aptr => aa bptr => bb if (.not.c_associated(c_aptr) .or. .not.c_associated(c_bptr)) stop 80 if (.not.associated(aptr) .or. .not.associated(bptr)) stop 81 !$omp end target data if (.not.present(aa) .or. .not.present(bb)) stop 82 if (.not.c_associated(c_loc(aa)) .or. .not.c_associated(c_loc(bb))) stop 83 if (.not.c_associated(c_aptr) .or. .not.c_associated(c_bptr)) stop 84 if (.not.associated(aptr) .or. .not.associated(bptr)) stop 85 ! check c_loc ptr once call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 86 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 87 ! check c_loc ptr again after target-value modification aa = 1111.0_c_float !$omp target update to(aa) call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 1111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 88 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 89 ! check Fortran pointer after target-value modification aa = 11111.0_c_float !$omp target update to(aa) call copy3_scalar(c_loc(aptr), c_loc(bptr)) !$omp target update from(bb) if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 90 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 91 !$omp end target data if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 92 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 93 !$omp target data map(to:cc) map(from:dd) !$omp target data map(alloc:dummy) use_device_addr(cc,dd) if (.not.present(cc) .or. .not.present(dd)) stop 94 if (.not.c_associated(c_loc(cc)) .or. .not.c_associated(c_loc(dd))) stop 95 c_cptr = c_loc(cc) c_dptr = c_loc(dd) cptr => cc dptr => dd if (.not.c_associated(c_cptr) .or. .not.c_associated(c_dptr)) stop 96 if (.not.associated(cptr) .or. .not.associated(dptr)) stop 97 !$omp end target data if (.not.present(cc) .or. .not.present(dd)) stop 98 if (.not.c_associated(c_loc(cc)) .or. .not.c_associated(c_loc(dd))) stop 99 if (.not.c_associated(c_cptr) .or. .not.c_associated(c_dptr)) stop 100 if (.not.associated(cptr) .or. .not.associated(dptr)) stop 101 ! check c_loc ptr once call copy3_scalar(c_cptr, c_dptr) !$omp target update from(dd) if (abs(cc - 333.0_c_float) > 10.0_c_float * epsilon(cc)) stop 102 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 103 ! check c_loc ptr again after target-value modification cc = 3333.0_c_float !$omp target update to(cc) call copy3_scalar(c_cptr, c_dptr) !$omp target update from(dd) if (abs(cc - 3333.0_c_float) > 10.0_c_float * epsilon(cc)) stop 104 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 105 ! check Fortran pointer after target-value modification cc = 33333.0_c_float !$omp target update to(cc) call copy3_scalar(c_loc(cptr), c_loc(dptr)) !$omp target update from(dd) if (abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(cc)) stop 106 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 107 !$omp end target data if (abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(dd)) stop 108 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(dd)) stop 109 !$omp target data map(to:ee) map(from:ff) !$omp target data map(alloc:dummy) use_device_addr(ee,ff) if (.not.present(ee) .or. .not.present(ff)) stop 110 if (.not.associated(ee) .or. .not.associated(ff)) stop 111 if (.not.c_associated(c_loc(ee)) .or. .not.c_associated(c_loc(ff))) stop 112 c_eptr = c_loc(ee) c_fptr = c_loc(ff) eptr => ee fptr => ff if (.not.c_associated(c_eptr) .or. .not.c_associated(c_fptr)) stop 113 if (.not.associated(eptr) .or. .not.associated(fptr)) stop 114 !$omp end target data if (.not.present(ee) .or. .not.present(ff)) stop 115 if (.not.associated(ee) .or. .not.associated(ff)) stop 116 if (.not.c_associated(c_loc(ee)) .or. .not.c_associated(c_loc(ff))) stop 117 if (.not.c_associated(c_eptr) .or. .not.c_associated(c_fptr)) stop 118 if (.not.associated(eptr) .or. .not.associated(fptr)) stop 119 ! check c_loc ptr once call copy3_scalar(c_eptr, c_fptr) !$omp target update from(ff) if (abs(ee - 555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 120 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 121 ! check c_loc ptr again after target-value modification ee = 5555.0_c_float !$omp target update to(ee) call copy3_scalar(c_eptr, c_fptr) !$omp target update from(ff) if (abs(ee - 5555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 122 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 123 ! check Fortran pointer after target-value modification ee = 55555.0_c_float !$omp target update to(ee) call copy3_scalar(c_loc(eptr), c_loc(fptr)) !$omp target update from(ff) if (abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 124 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ff)) stop 125 !$omp end target data if (abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 126 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 127 !$omp target data map(to:gg) map(from:hh) !$omp target data map(alloc:dummy) use_device_addr(gg,hh) if (.not.present(gg) .or. .not.present(hh)) stop 128 if (.not.c_associated(c_loc(gg)) .or. .not.c_associated(c_loc(hh))) stop 129 c_gptr = c_loc(gg) c_hptr = c_loc(hh) gptr => gg hptr => hh if (.not.c_associated(c_gptr) .or. .not.c_associated(c_hptr)) stop 130 if (.not.associated(gptr) .or. .not.associated(hptr)) stop 131 !$omp end target data if (.not.present(gg) .or. .not.present(hh)) stop 132 if (.not.c_associated(c_loc(gg)) .or. .not.c_associated(c_loc(hh))) stop 133 if (.not.c_associated(c_gptr) .or. .not.c_associated(c_hptr)) stop 134 if (.not.associated(gptr) .or. .not.associated(hptr)) stop 135 ! check c_loc ptr once call copy3_array(c_gptr, c_hptr, N) !$omp target update from(hh) if (any(abs(gg - 777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 136 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(hh))) stop 137 ! check c_loc ptr again after target-value modification gg = 7777.0_c_float !$omp target update to(gg) call copy3_array(c_gptr, c_hptr, N) !$omp target update from(hh) if (any(abs(gg - 7777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 138 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 139 ! check Fortran pointer after target-value modification gg = 77777.0_c_float !$omp target update to(gg) call copy3_array(c_loc(gptr), c_loc(hptr), N) !$omp target update from(hh) if (any(abs(gg - 77777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 140 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 141 !$omp end target data if (any(abs(gg - 77777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 142 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 143 end subroutine test_dummy_opt_callee_2 end module test_dummies_opt ! Test local dummy arguments + OPTIONAL + VALUE ! Values present module test_dummies_opt_value use iso_c_binding use target_procs implicit none (type, external) private public :: test_dummy_opt_val_call_1, test_dummy_opt_val_call_2 contains subroutine test_dummy_opt_val_call_1() ! scalars - with value, neither allocatable nor pointer no dimension permitted real(c_float), target :: aa, bb aa = 11.0_c_float bb = 22.0_c_float call test_dummy_opt_val_callee_1(aa, bb) end subroutine test_dummy_opt_val_call_1 subroutine test_dummy_opt_val_callee_1(aa, bb) ! scalars real(c_float), optional, value, target :: aa, bb if (.not.present(aa) .or. .not.present(bb)) stop 144 !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) if (.not.present(aa) .or. .not.present(bb)) stop 145 if (.not.c_associated(c_loc(aa)) .or. .not.c_associated(c_loc(bb))) stop 146 call copy3_scalar(c_loc(aa), c_loc(bb)) !$omp end target data if (abs(aa - 11.0_c_float) > 10.0_c_float * epsilon(aa)) stop 147 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 148 end subroutine test_dummy_opt_val_callee_1 ! Save device ptr - and recall pointer subroutine test_dummy_opt_val_call_2() ! scalars - with value, neither allocatable nor pointer no dimension permitted real(c_float), target :: aa, bb type(c_ptr) :: c_aptr, c_bptr real(c_float), pointer :: aptr, bptr call test_dummy_opt_val_callee_2(aa, bb, c_aptr, c_bptr, aptr, bptr) end subroutine test_dummy_opt_val_call_2 subroutine test_dummy_opt_val_callee_2(aa, bb, c_aptr, c_bptr, aptr, bptr) real(c_float), optional, value, target :: aa, bb type(c_ptr), optional, value :: c_aptr, c_bptr real(c_float), optional, pointer :: aptr, bptr real(c_float) :: dummy if (.not.present(aa) .or. .not.present(bb)) stop 149 if (.not.present(c_aptr) .or. .not.present(c_bptr)) stop 150 if (.not.present(aptr) .or. .not.present(bptr)) stop 151 aa = 111.0_c_float bb = 222.0_c_float !$omp target data map(to:aa) map(from:bb) if (.not.present(aa) .or. .not.present(bb)) stop 152 if (.not.present(c_aptr) .or. .not.present(c_bptr)) stop 153 if (.not.present(aptr) .or. .not.present(bptr)) stop 154 !$omp target data map(alloc:dummy) use_device_addr(aa,bb) if (.not.present(aa) .or. .not.present(bb)) stop 155 if (.not.present(c_aptr) .or. .not.present(c_bptr)) stop 156 if (.not.present(aptr) .or. .not.present(bptr)) stop 157 c_aptr = c_loc(aa) c_bptr = c_loc(bb) aptr => aa bptr => bb if (.not.c_associated(c_aptr) .or. .not.c_associated(c_bptr)) stop 158 if (.not.associated(aptr) .or. .not.associated(bptr)) stop 159 !$omp end target data ! check c_loc ptr once call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 160 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 161 ! check c_loc ptr again after target-value modification aa = 1111.0_c_float !$omp target update to(aa) call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 1111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 162 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 163 ! check Fortran pointer after target-value modification aa = 11111.0_c_float !$omp target update to(aa) call copy3_scalar(c_loc(aptr), c_loc(bptr)) !$omp target update from(bb) if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 164 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 165 !$omp end target data if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 166 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 167 end subroutine test_dummy_opt_val_callee_2 end module test_dummies_opt_value ! Test nullptr module test_nullptr use iso_c_binding implicit none (type, external) private public :: test_nullptr_1 contains subroutine test_nullptr_1() ! scalars real(c_float), pointer :: aa, bb real(c_float), pointer :: ee, ff real(c_float), allocatable, target :: gg, hh type(c_ptr) :: c_aptr, c_bptr, c_eptr, c_fptr, c_gptr, c_hptr real(c_float), pointer :: aptr, bptr, eptr, fptr, gptr, hptr aa => null() bb => null() ee => null() ff => null() if (associated(aa) .or. associated(bb)) stop 168 !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) if (c_associated(c_loc(aa)) .or. c_associated(c_loc(bb))) stop 169 c_aptr = c_loc(aa) c_bptr = c_loc(bb) aptr => aa bptr => bb if (c_associated(c_aptr) .or. c_associated(c_bptr)) stop 170 if (associated(aptr) .or. associated(bptr, bb)) stop 171 !$omp end target data if (c_associated(c_aptr) .or. c_associated(c_bptr)) stop 172 if (associated(aptr) .or. associated(bptr, bb)) stop 173 if (allocated(gg)) stop 174 !$omp target data map(tofrom:gg) use_device_addr(gg) if (c_associated(c_loc(gg))) stop 175 c_gptr = c_loc(gg) gptr => gg if (c_associated(c_gptr)) stop 176 if (associated(gptr)) stop 177 if (allocated(gg)) stop 178 !$omp end target data if (c_associated(c_gptr)) stop 179 if (associated(gptr)) stop 180 if (allocated(gg)) stop 181 call test_dummy_opt_nullptr_callee_1(ee, ff, hh, c_eptr, c_fptr, c_hptr, eptr, fptr, hptr) end subroutine test_nullptr_1 subroutine test_dummy_opt_nullptr_callee_1(ee, ff, hh, c_eptr, c_fptr, c_hptr, eptr, fptr, hptr) ! scalars real(c_float), optional, pointer :: ee, ff real(c_float), optional, allocatable, target :: hh type(c_ptr), optional :: c_eptr, c_fptr, c_hptr real(c_float), optional, pointer :: eptr, fptr, hptr if (.not.present(ee) .or. .not.present(ff)) stop 182 if (associated(ee) .or. associated(ff)) stop 183 !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) if (.not.present(ee) .or. .not.present(ff)) stop 184 if (associated(ee) .or. associated(ff)) stop 185 if (c_associated(c_loc(ee)) .or. c_associated(c_loc(ff))) stop 186 c_eptr = c_loc(ee) c_fptr = c_loc(ff) eptr => ee fptr => ff if (c_associated(c_eptr) .or. c_associated(c_fptr)) stop 187 if (associated(eptr) .or. associated(fptr)) stop 188 !$omp end target data if (c_associated(c_eptr) .or. c_associated(c_fptr)) stop 189 if (associated(eptr) .or. associated(fptr)) stop 190 if (associated(ee) .or. associated(ff)) stop 191 if (.not.present(hh)) stop 192 if (allocated(hh)) stop 193 !$omp target data map(tofrom:hh) use_device_addr(hh) if (.not.present(hh)) stop 194 if (allocated(hh)) stop 195 if (c_associated(c_loc(hh))) stop 196 c_hptr = c_loc(hh) hptr => hh if (c_associated(c_hptr)) stop 197 if (associated(hptr)) stop 198 if (allocated(hh)) stop 199 !$omp end target data if (c_associated(c_hptr)) stop 200 if (associated(hptr)) stop 201 if (allocated(hh)) stop 202 end subroutine test_dummy_opt_nullptr_callee_1 end module test_nullptr ! Test local variables module tests use iso_c_binding use target_procs implicit none (type, external) private public :: test_main_1, test_main_2 contains ! map + use_device_addr + c_loc subroutine test_main_1() integer, parameter :: N = 1000 ! scalars real(c_float), target :: aa, bb real(c_float), target, allocatable :: cc, dd real(c_float), pointer :: ee, ff ! non-descriptor arrays real(c_float), target :: gg(N), hh(N) allocate(cc, dd, ee, ff) aa = 11.0_c_float bb = 22.0_c_float cc = 33.0_c_float dd = 44.0_c_float ee = 55.0_c_float ff = 66.0_c_float gg = 77.0_c_float hh = 88.0_c_float !$omp target data map(to:aa) map(from:bb) use_device_addr(aa,bb) call copy3_scalar(c_loc(aa), c_loc(bb)) !$omp end target data if (abs(aa - 11.0_c_float) > 10.0_c_float * epsilon(aa)) stop 203 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 204 !$omp target data map(to:cc) map(from:dd) use_device_addr(cc,dd) call copy3_scalar(c_loc(cc), c_loc(dd)) !$omp end target data if (abs(cc - 33.0_c_float) > 10.0_c_float * epsilon(cc)) stop 205 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 206 !$omp target data map(to:ee) map(from:ff) use_device_addr(ee,ff) call copy3_scalar(c_loc(ee), c_loc(ff)) !$omp end target data if (abs(ee - 55.0_c_float) > 10.0_c_float * epsilon(ee)) stop 207 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 208 !$omp target data map(to:gg) map(from:hh) use_device_addr(gg,hh) call copy3_array(c_loc(gg), c_loc(hh), N) !$omp end target data if (any(abs(gg - 77.0_c_float) > 10.0_c_float * epsilon(gg))) stop 209 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 210 deallocate(ee, ff) ! pointers, only end subroutine test_main_1 ! Save device ptr - and recall pointer subroutine test_main_2 integer, parameter :: N = 1000 ! scalars real(c_float), target :: aa, bb real(c_float), target, allocatable :: cc, dd real(c_float), pointer :: ee, ff ! non-descriptor arrays real(c_float), target :: gg(N), hh(N) real(c_float) :: dummy type(c_ptr) :: c_aptr, c_bptr, c_cptr, c_dptr, c_eptr, c_fptr, c_gptr, c_hptr real(c_float), pointer :: aptr, bptr, cptr, dptr, eptr, fptr real(c_float), pointer :: gptr(:), hptr(:) allocate(cc, dd, ee, ff) aa = 111.0_c_float bb = 222.0_c_float cc = 333.0_c_float dd = 444.0_c_float ee = 555.0_c_float ff = 666.0_c_float gg = 777.0_c_float hh = 888.0_c_float !$omp target data map(to:aa) map(from:bb) !$omp target data map(alloc:dummy) use_device_addr(aa,bb) c_aptr = c_loc(aa) c_bptr = c_loc(bb) aptr => aa bptr => bb !$omp end target data ! check c_loc ptr once call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 211 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 212 ! check c_loc ptr again after target-value modification aa = 1111.0_c_float !$omp target update to(aa) call copy3_scalar(c_aptr, c_bptr) !$omp target update from(bb) if (abs(aa - 1111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 213 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 214 ! check Fortran pointer after target-value modification aa = 11111.0_c_float !$omp target update to(aa) call copy3_scalar(c_loc(aptr), c_loc(bptr)) !$omp target update from(bb) if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 215 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 216 !$omp end target data if (abs(aa - 11111.0_c_float) > 10.0_c_float * epsilon(aa)) stop 217 if (abs(3.0_c_float * aa - bb) > 10.0_c_float * epsilon(aa)) stop 218 !$omp target data map(to:cc) map(from:dd) !$omp target data map(alloc:dummy) use_device_addr(cc,dd) c_cptr = c_loc(cc) c_dptr = c_loc(dd) cptr => cc dptr => dd !$omp end target data ! check c_loc ptr once call copy3_scalar(c_cptr, c_dptr) !$omp target update from(dd) if (abs(cc - 333.0_c_float) > 10.0_c_float * epsilon(cc)) stop 219 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 220 ! check c_loc ptr again after target-value modification cc = 3333.0_c_float !$omp target update to(cc) call copy3_scalar(c_cptr, c_dptr) !$omp target update from(dd) if (abs(cc - 3333.0_c_float) > 10.0_c_float * epsilon(cc)) stop 221 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 222 ! check Fortran pointer after target-value modification cc = 33333.0_c_float !$omp target update to(cc) call copy3_scalar(c_loc(cptr), c_loc(dptr)) !$omp target update from(dd) if (abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(cc)) stop 223 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(cc)) stop 224 !$omp end target data if (abs(cc - 33333.0_c_float) > 10.0_c_float * epsilon(dd)) stop 225 if (abs(3.0_c_float * cc - dd) > 10.0_c_float * epsilon(dd)) stop 226 !$omp target data map(to:ee) map(from:ff) !$omp target data map(alloc:dummy) use_device_addr(ee,ff) c_eptr = c_loc(ee) c_fptr = c_loc(ff) eptr => ee fptr => ff !$omp end target data ! check c_loc ptr once call copy3_scalar(c_eptr, c_fptr) !$omp target update from(ff) if (abs(ee - 555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 227 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 228 ! check c_loc ptr again after target-value modification ee = 5555.0_c_float !$omp target update to(ee) call copy3_scalar(c_eptr, c_fptr) !$omp target update from(ff) if (abs(ee - 5555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 229 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 230 ! check Fortran pointer after target-value modification ee = 55555.0_c_float !$omp target update to(ee) call copy3_scalar(c_loc(eptr), c_loc(fptr)) !$omp target update from(ff) if (abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 231 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ff)) stop 232 !$omp end target data if (abs(ee - 55555.0_c_float) > 10.0_c_float * epsilon(ee)) stop 233 if (abs(3.0_c_float * ee - ff) > 10.0_c_float * epsilon(ee)) stop 234 !$omp target data map(to:gg) map(from:hh) !$omp target data map(alloc:dummy) use_device_addr(gg,hh) c_gptr = c_loc(gg) c_hptr = c_loc(hh) gptr => gg hptr => hh !$omp end target data ! check c_loc ptr once call copy3_array(c_gptr, c_hptr, N) !$omp target update from(hh) if (any(abs(gg - 777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 235 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(hh))) stop 236 ! check c_loc ptr again after target-value modification gg = 7777.0_c_float !$omp target update to(gg) call copy3_array(c_gptr, c_hptr, N) !$omp target update from(hh) if (any(abs(gg - 7777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 237 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 238 ! check Fortran pointer after target-value modification gg = 77777.0_c_float !$omp target update to(gg) call copy3_array(c_loc(gptr), c_loc(hptr), N) !$omp target update from(hh) if (any(abs(gg - 77777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 239 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 240 !$omp end target data if (any(abs(gg - 77777.0_c_float) > 10.0_c_float * epsilon(gg))) stop 241 if (any(abs(3.0_c_float * gg - hh) > 10.0_c_float * epsilon(gg))) stop 242 deallocate(ee, ff) end subroutine test_main_2 end module tests program omp_device_addr use tests use test_dummies use test_dummies_value use test_dummies_opt use test_dummies_opt_value use test_nullptr implicit none (type, external) call test_main_1() call test_main_2() call test_dummy_call_1() call test_dummy_call_2() call test_dummy_val_call_1() call test_dummy_val_call_2() call test_dummy_opt_call_1() call test_dummy_opt_call_2() call test_dummy_opt_val_call_1() call test_dummy_opt_val_call_2() call test_nullptr_1() end program omp_device_addr