blob: 7a4aaae52cbd053692516bff219effe14d2f699d [file] [log] [blame]
! { dg-do run }
! Check whether absent optional arguments are properly
! handled with use_device_{addr,ptr}.
program main
use iso_c_binding, only: c_ptr, c_loc, c_associated
implicit none (type, external)
integer, allocatable :: a_w, a_x(:)
integer, pointer :: p_w, p_x(:)
nullify (p_w, p_x)
call foo()
! unallocated/disassociated actual arguments to nonallocatable, nonpointer
! dummy arguments are regarded as absent
call foo (w=a_w, x=a_x)
call foo (w=p_w, x=p_x)
contains
subroutine foo(v, w, x, y, z, cptr, cptr_in)
integer, target, optional, value :: v
integer, target, optional :: w
integer, target, optional :: x(:)
integer, target, optional, allocatable :: y
integer, target, optional, allocatable :: z(:)
type(c_ptr), target, optional, value :: cptr
type(c_ptr), target, optional, value, intent(in) :: cptr_in
integer :: d
! Need to map per-VALUE arguments, if present
if (present(v)) then
!$omp target enter data map(to:v)
stop 1 ! but it shall not be present in this test case.
end if
if (present(cptr)) then
!$omp target enter data map(to:cptr)
stop 2 ! but it shall not be present in this test case.
end if
if (present(cptr_in)) then
!$omp target enter data map(to:cptr_in)
stop 3 ! but it shall not be present in this test case.
end if
!$omp target data map(d) use_device_addr(v, w, x, y, z, cptr, cptr_in)
if (present(v)) then; v = 5; stop 11; endif
if (present(w)) then; w = 5; stop 12; endif
if (present(x)) then; x(1) = 5; stop 13; endif
if (present(y)) then; y = 5; stop 14; endif
if (present(z)) then; z(1) = 5; stop 15; endif
if (present(cptr)) then; cptr = c_loc(v); stop 16; endif
if (present(cptr_in)) then
if (c_associated(cptr_in, c_loc(x))) stop 17
stop 18
endif
!$omp end target data
! Using 'v' in use_device_ptr gives an ICE
! TODO: Find out what the OpenMP spec permits for use_device_ptr
!$omp target data map(d) use_device_ptr(w, x, y, z, cptr, cptr_in)
if (present(w)) then; w = 5; stop 21; endif
if (present(x)) then; x(1) = 5; stop 22; endif
if (present(y)) then; y = 5; stop 23; endif
if (present(z)) then; z(1) = 5; stop 24; endif
if (present(cptr)) then; cptr = c_loc(x); stop 25; endif
if (present(cptr_in)) then
if (c_associated(cptr_in, c_loc(x))) stop 26
stop 27
endif
!$omp end target data
end subroutine foo
end program main