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