b9dc11b673
Fix-up for commit a2c26c5031
(r278046) "Fortran]
Support absent optional args with use_device_{ptr,addr}".
libgomp/
* testsuite/libgomp.fortran/use_device_ptr-optional-2.f90: Add
'dg-do run'.
73 lines
2.5 KiB
Fortran
73 lines
2.5 KiB
Fortran
! { 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
|