! { dg-do run } ! ! PR fortran/96668 implicit none integer, pointer :: p1(:), p2(:), p3(:) integer, allocatable :: a1(:), a2(:) p1 => null() p3 => null() !$omp target enter data map(to:p3) !$omp target data map(a1, a2, p1) !$omp target if (allocated (a1)) stop 1 if (allocated (a2)) stop 1 if (associated (p1)) stop 1 if (associated (p3)) stop 1 !$omp end target allocate (a1, source=[10,11,12,13,14]) allocate (a2, source=[10,11,12,13,14]) allocate (p1, source=[9,8,7,6,5,4]) allocate (p3, source=[4,5,6]) p2 => p1 !$omp target enter data map(to:p3) ! allocatable, TR9 requires 'always' modifier: !$omp target map(always, tofrom: a1) if (.not. allocated(a1)) stop 2 if (size(a1) /= 5) stop 3 if (any (a1 /= [10,11,12,13,14])) stop 5 a1(:) = [101, 102, 103, 104, 105] !$omp end target ! allocatable, extension (OpenMP 6.0?): without 'always' !$omp target if (.not. allocated(a2)) stop 2 if (size(a2) /= 5) stop 3 if (any (a2 /= [10,11,12,13,14])) stop 5 a2(:) = [101, 102, 103, 104, 105] !$omp end target ! pointer: target is automatically mapped ! without requiring an explicit mapping or even the always modifier !$omp target !! map(always, tofrom: p1) if (.not. associated(p1)) stop 7 if (size(p1) /= 6) stop 8 if (any (p1 /= [9,8,7,6,5,4])) stop 10 p1(:) = [-1, -2, -3, -4, -5, -6] !$omp end target !$omp target !! map(always, tofrom: p3) if (.not. associated(p3)) stop 7 if (size(p3) /= 3) stop 8 if (any (p3 /= [4,5,6])) stop 10 p3(:) = [23,24,25] !$omp end target if (any (p1 /= [-1, -2, -3, -4, -5, -6])) stop 141 !$omp target exit data map(from:p3) !$omp target exit data map(from:p3) if (any (p3 /= [23,24,25])) stop 141 allocate (p1, source=[99,88,77,66,55,44,33]) !$omp target ! And this also should work if (.not. associated(p1)) stop 7 if (size(p1) /= 7) stop 8 if (any (p1 /= [99,88,77,66,55,44,33])) stop 10 p1(:) = [-11, -22, -33, -44, -55, -66, -77] !$omp end target !$omp end target data if (any (a1 /= [101, 102, 103, 104, 105])) stop 12 if (any (a2 /= [101, 102, 103, 104, 105])) stop 12 if (any (p1 /= [-11, -22, -33, -44, -55, -66, -77])) stop 142 if (any (p2 /= [-1, -2, -3, -4, -5, -6])) stop 143 block integer, pointer :: tmp(:), tmp2(:), tmp3(:) tmp => p1 tmp2 => p2 tmp3 => p3 !$omp target enter data map(to:p3) !$omp target data map(to: p1, p2) p1 => null () p2 => null () p3 => null () !$omp target map(always, tofrom: p1) if (associated (p1)) stop 22 !$omp end target if (associated (p1)) stop 22 !$omp target if (associated (p2)) stop 22 !$omp end target if (associated (p2)) stop 22 !$omp target if (associated (p3)) stop 22 !$omp end target if (associated (p3)) stop 22 !$omp end target data !$omp target exit data map(from:p3) deallocate(tmp, tmp2, tmp3) end block deallocate(a1, a2) end