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