! { dg-do run } interface subroutine bar (q) integer :: q(19:) end subroutine end interface integer :: q(7:15) q(:) = 5 call bar (q) end subroutine bar (q) use iso_c_binding, only: c_ptr, c_loc, c_int integer :: a, b, c, d(2:3,4:5), q(19:), h, k, m, n, o, p integer(c_int), target :: e(64) type (c_ptr) :: f, g(64) logical :: l a = 1 b = 2 c = 3 d = 4 l = .false. f = c_loc (e) call foo contains subroutine foo use iso_c_binding, only: c_sizeof !$omp simd linear(a:2) linear(b:1) do a = 1, 20, 2 b = b + 1 end do !$omp end simd if (a /= 21 .or. b /= 12) call abort !$omp simd aligned(f : c_sizeof (e(1))) do b = 1, 64 g(b) = f end do !$omp end simd !$omp parallel !$omp single !$omp taskgroup !$omp task depend(out : a, d(2:2,4:5)) a = a + 1 d(2:2,4:5) = d(2:2,4:5) + 1 !$omp end task !$omp task depend(in : a, d(2:2,4:5)) if (a /= 22) call abort if (any (d(2:2,4:5) /= 5)) call abort !$omp end task !$omp end taskgroup !$omp end single !$omp end parallel b = 10 !$omp target data map (tofrom: a, d(2:3,4:4), q) map (from: l) !$omp target map (tofrom: b, d(2:3,4:4)) l = .false. if (a /= 22 .or. any (q /= 5)) l = .true. if (lbound (q, 1) /= 19 .or. ubound (q, 1) /= 27) l = .true. if (d(2,4) /= 5 .or. d(3,4) /= 4) l = .true. l = l .or. (b /= 10) a = 6 b = 11 q = 8 d(2:3,4:4) = 9 !$omp end target !$omp target update from (a, q, d(2:3,4:4), l) if (a /= 6 .or. l .or. b /= 11 .or. any (q /= 8)) call abort if (any (d(2:3,4:4) /= 9) .or. d(2,5) /= 5 .or. d(3,5) /= 4) call abort a = 12 b = 13 q = 14 d = 15 !$omp target update to (a, q, d(2:3,4:4)) !$omp target map (tofrom: b, d(2:3,4:4)) if (a /= 12 .or. b /= 13 .or. any (q /= 14)) l = .true. l = l .or. any (d(2:3,4:4) /= 15) !$omp end target a = 0 b = 1 c = 100 h = 8 m = 0 n = 64 o = 16 if (l) call abort !$omp target teams distribute parallel do simd if (.not.l) device(a) & !$omp & num_teams(b) dist_schedule(static, c) num_threads (h) & !$omp & reduction (+: m) safelen (n) schedule(static, o) do p = 1, 64 m = m + 1 end do !$omp end target teams distribute parallel do simd if (m /= 64) call abort !$omp end target data end subroutine foo end subroutine bar