! { dg-do run } module mymod type G integer :: x, y integer, pointer :: arr(:) integer :: z end type G end module mymod program myprog use mymod integer, target :: arr1(10) integer, target :: arr2(10) integer, target :: arr3(10) type(G), dimension(3) :: gvar integer :: i, j gvar(1)%arr => arr1 gvar(2)%arr => arr2 gvar(3)%arr => arr3 gvar(1)%arr = 0 gvar(2)%arr = 0 gvar(3)%arr = 0 i = 1 j = 1 ! Here 'gvar(i)' and 'gvar(j)' are the same element, so this should work. ! This generates a whole-array mapping for gvar(i)%arr, but with the ! "runtime implicit" bit set so the smaller subarray gvar(j)%arr(1:5) takes ! precedence. !$omp target map(gvar(i)%arr, gvar(j)%arr(1:5)) gvar(i)%arr(1) = gvar(i)%arr(1) + 1 gvar(j)%arr(1) = gvar(j)%arr(1) + 2 !$omp end target !$omp target map(gvar(i)%arr(1:5), gvar(j)%arr) gvar(i)%arr(1) = gvar(i)%arr(1) + 3 gvar(j)%arr(1) = gvar(j)%arr(1) + 4 !$omp end target ! For these ones, we know the array index is the same, so we can just ! drop the whole-array mapping. !$omp target map(gvar(i)%arr, gvar(i)%arr(1:5)) gvar(i)%arr(1) = gvar(i)%arr(1) + 1 gvar(i)%arr(1) = gvar(j)%arr(1) + 2 !$omp end target !$omp target map(gvar(i)%arr(1:5), gvar(i)%arr) gvar(i)%arr(1) = gvar(i)%arr(1) + 3 gvar(i)%arr(1) = gvar(j)%arr(1) + 4 !$omp end target if (gvar(1)%arr(1).ne.20) stop 1 end program myprog