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