! Based on libgomp.c/target-23.c ! { dg-additional-options "-fdump-tree-original" } ! { dg-final { scan-tree-dump "omp target update to\\(xxs\\\[3\\\] \\\[len: 2\\\]\\)" "original" } } ! { dg-final { scan-tree-dump "omp target update to\\(s\\.s \\\[len: 4\\\]\\)" "original" } } ! { dg-final { scan-tree-dump "omp target update from\\(s\\.s \\\[len: 4\\\]\\)" "original" } } module m implicit none type S_type integer s integer, pointer :: u(:) => null() integer :: v(0:4) end type S_type integer, volatile :: z end module m program main use m implicit none integer, target :: u(0:9) = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] logical :: err type (S_type) :: s integer, pointer :: v(:) integer(kind=2) :: xxs(5) err = .false. s = S_type(9, v=[10, 11, 12, 13, 14]) s%u(0:) => u(3:) v(-4+3:) => u(3:) xxs = [-1,-2,-3,-4,-5] !$omp target enter data map (to: s%s, s%u, s%u(0:5)) map (alloc: s%v(1:4), xxs(3:5)) s%s = s%s + 1 u(3) = u(3) + 1 s%v(1) = s%v(1) + 1 xxs(3) = -33 xxs(4) = -44 xxs(5) = -55 !$omp target update to (xxs(4)) !$omp target update to (s%s) to (s%u(0:2), s%v(1:4)) !$omp target map (alloc: s%s, s%v(1:4)) map (from: err) err = .false. if (s%s /= 10 .or. s%v(1) /= 12 .or. s%v(2) /= 12 .or. s%v(3) /= 13) & err = .true. if (v(-1) /= 4 .or. v(0) /= 4 .or. v(1) /= 5 .or. v(2) /= 6 .or. v(3) /= 7) & err = .true. if (xxs(4) /= -44) & err = .true. s%s = s%s + 1 s%v(2) = s%v(2) + 2 v(-1) = 5 v(3) = 9 !$omp end target if (err) & error stop !$omp target map (alloc: s%u(0:5)) err = .false. if (s%u(0) /= 5 .or. s%u(1) /= 4 .or. s%u(2) /= 5 .or. s%u(3) /= 6 .or. s%u(4) /= 9) & err = .true. s%u(1) = 12 !$omp end target !$omp target update from (s%s, s%u(0:5)) from (s%v(1:4)) if (err .or. s%s /= 11 .or. u(0) /= 0 .or. u(1) /= 1 .or. u(2) /= 2 .or. u(3) /= 5 & .or. u(4) /= 12 .or. u(5) /= 5 .or. u(6) /= 6 .or. u(7) /= 9 .or. u(8) /= 8 & .or. u(9) /= 9 .or. s%v(0) /= 10 .or. s%v(1) /= 12 .or. s%v(2) /= 14 & .or. s%v(3) /= 13 .or. s%v(4) /= 14) & error stop ! !$omp target exit data map (release: s%s) ! !$omp target exit data map (release: s%u(0:5)) ! !$omp target exit data map (delete: s%v(1:4)) ! !$omp target exit data map (release: s%s) end