program main use omp_lib use iso_c_binding implicit none integer, parameter :: N = 5 integer :: i, x(N), y(N), z(N:2*N-1) target :: z x = 42 y = 43 z = 44 call foo (x, y, z) if (any (x /= [(i, i = 1, N)])) stop 1 if (any (y /= [(2*i, i = 1, N)])) stop 2 if (any (z /= [(3*i, i = 1, N)])) stop 3 contains subroutine foo(a, b, c) integer :: a(:) integer :: b(*) integer, pointer, intent(in) :: c(:) !$omp target data map(a,b(:N),c) use_device_addr(a,b(:N),c) !$omp target has_device_addr(A,B(:N),C) if (lbound(a,dim=1) /= 1 .or. ubound(a,dim=1) /= N) stop 10 if (lbound(b,dim=1) /= 1) stop 11 if (lbound(c,dim=1) /= N .or. ubound(c,dim=1) /= 2*N-1) stop 12 if (any (a /= 42)) stop 13 if (any (b(:N) /= 43)) stop 14 if (any (c /= 44)) stop 15 a = [(i, i=1, N)] b(:N) = [(2*i, i = 1, N)] c = [(3*i, i = 1, N)] !$omp end target !$omp end target data end subroutine foo end program main