| ! Test allocatables in HAS_DEVICE_ADDR. |
| |
| program main |
| use omp_lib |
| use iso_c_binding |
| implicit none |
| |
| integer, parameter :: N = 5 |
| integer, allocatable :: x |
| integer, allocatable :: y(:) |
| call scalar_dummy (x) |
| call array_dummy (y) |
| call array_dummy_optional (y) |
| call array_dummy_optional () |
| |
| contains |
| subroutine scalar_dummy (a) |
| integer, allocatable :: a |
| |
| allocate (a) |
| a = 24 |
| |
| !$omp target data map(a) use_device_addr(a) |
| !$omp target has_device_addr(a) |
| a = 42 |
| !$omp end target |
| !$omp end target data |
| if (a /= 42) stop 1 |
| |
| deallocate (a) |
| end subroutine scalar_dummy |
| |
| subroutine array_dummy (a) |
| integer, allocatable :: a(:) |
| integer :: i |
| |
| allocate (a(N)) |
| a = 42 |
| |
| !$omp target data map(a) use_device_addr(a) |
| !$omp target has_device_addr(a) |
| a = [(i, i=1, N)] |
| !$omp end target |
| !$omp end target data |
| if (any (a /= [(i, i=1, N)])) stop 2 |
| |
| deallocate (a) |
| end subroutine array_dummy |
| |
| subroutine array_dummy_optional (a) |
| integer, optional, allocatable :: a(:) |
| integer :: i |
| |
| if (present (a)) then |
| allocate (a(N)) |
| a = 42 |
| end if |
| |
| !$omp target data map(a) use_device_addr(a) |
| !$omp target has_device_addr(a) |
| if (present (a)) a = [(i, i=1, N)] |
| !$omp end target |
| !$omp end target data |
| |
| if (present (a)) then |
| if (any (a /= [(i, i=1, N)])) stop 2 |
| deallocate (a) |
| end if |
| end subroutine array_dummy_optional |
| |
| end program main |