| ! Test optional dummy arguments in HAS_DEVICE_ADDR. | 
 |  | 
 | program main | 
 |   use omp_lib | 
 |   use iso_c_binding | 
 |   implicit none | 
 |  | 
 |   integer, target :: x | 
 |   integer, pointer :: ptr | 
 |   integer, parameter :: N=7 | 
 |   real :: y1(N), y2(N) | 
 |   integer, target :: y3(N:2*N-1) | 
 |   integer :: i | 
 |  | 
 |   x = 24 | 
 |   ptr => x | 
 |   y1 = 42.24 | 
 |   y2 = 42.24 | 
 |   y3 = 42 | 
 |  | 
 |   call optional_scalar (is_present=.false.) | 
 |   if (x /= 24) stop 1 | 
 |  | 
 |   call optional_scalar (x, is_present=.true.) | 
 |   if (x /= 42) stop 2 | 
 |  | 
 |   call optional_ptr (is_present=.false.) | 
 |   if (x /= 42) stop 3 | 
 |   if (ptr /= 42) stop 4 | 
 |  | 
 |   call optional_ptr (ptr, is_present=.true.) | 
 |   if (x /= 84) stop 5 | 
 |   if (ptr /= 84) stop 6 | 
 |  | 
 |   call optional_array (is_present=.false.) | 
 |   if (any (y1 /= [(42.24, i=1, N)])) stop 7 | 
 |   if (any (y2 /= [(42.24, i=1, N)])) stop 8 | 
 |   if (any (y3 /= [(42, i=1, N)])) stop 9 | 
 |  | 
 |   call optional_array (y1, y2, y3, is_present=.true.) | 
 |   if (any (y1 /= [(42.24+i, i=1, N)])) stop 10 | 
 |   if (any (y2 /= [(42.24+2*i, i=1, N)])) stop 11 | 
 |   if (any (y3 /= [(42+3*i, i=1, N)])) stop 12 | 
 |  | 
 | contains | 
 |   subroutine optional_scalar (a, is_present) | 
 |     integer, optional :: a | 
 |     logical, value :: is_present | 
 |  | 
 |     !$omp target data map(a) use_device_addr(a) | 
 |       !$omp target has_device_addr(a) | 
 |         if (is_present) a = 42 | 
 |       !$omp end target | 
 |     !$omp end target data | 
 |   end subroutine optional_scalar | 
 |  | 
 |   subroutine optional_ptr (a, is_present) | 
 |     integer, pointer, optional :: a | 
 |     logical, value :: is_present | 
 |     !$omp target data map(a) use_device_addr(a) | 
 |       !$omp target has_device_addr(a) | 
 |         if (is_present) a = 84 | 
 |       !$omp end target | 
 |     !$omp end target data | 
 |   end subroutine optional_ptr | 
 |  | 
 |   subroutine optional_array (a, b, c, is_present) | 
 |     real, optional :: a(:), b(*) | 
 |     integer, optional, pointer, intent(in) :: c(:) | 
 |     logical, value :: is_present | 
 |     integer :: i | 
 |  | 
 |     !$omp target data map(a, b(:N), c) use_device_addr(a, b, c) | 
 |       !$omp target has_device_addr(a, b, c) | 
 |         if (is_present) then | 
 |           if (lbound(a,dim=1) /= 1 .or. ubound(a,dim=1) /= N) stop 21 | 
 |           if (lbound(b,dim=1) /= 1) stop 22 | 
 |           if (lbound(c,dim=1) /= N .or. ubound(c,dim=1) /= 2*N-1) stop 23 | 
 |           if (any (a /= [(42.24, i = 1, N)])) stop 24 | 
 |           if (any (b(:N) /= [(42.24, i = 1, N)])) stop 25 | 
 |           if (any (c /= [(42, i = 1, N)])) stop 26 | 
 |           a = [(42.24+i, i=1, N)] | 
 |           b(:N) = [(42.24+2*i, i=1, N)] | 
 |           c = [(42+3*i, i=1, N)] | 
 |         end if | 
 |       !$omp end target | 
 |     !$omp end target data | 
 |   end subroutine optional_array | 
 |  | 
 | end program main |