1! { dg-do run }
2
3module target6
4contains
5  subroutine foo (p, v, w, n)
6    double precision, pointer :: p(:), v(:), w(:)
7    double precision :: q(n)
8    integer :: i, n
9    !$omp target data if (n > 256) map (to: v(1:n), w(:n)) map (from: p(1:n), q)
10    !$omp target if (n > 256)
11    !$omp parallel do simd
12      do i = 1, n
13        p(i) = v(i) * w(i)
14        q(i) = p(i)
15      end do
16    !$omp end target
17    !$omp target update if (n > 256) from (p)
18    do i = 1, n
19      if (p(i) /= i * iand (i, 63)) call abort
20      v(i) = v(i) + 1
21    end do
22    !$omp target update if (n > 256) to (v(1:n))
23    !$omp target if (n > 256)
24    !$omp parallel do simd
25      do i = 1, n
26        p(i) = v(i) * w(i)
27      end do
28    !$omp end target
29    !$omp end target data
30    do i = 1, n
31      if (q(i) /= (v(i) - 1) * w(i)) call abort
32      if (p(i) /= q(i) + w(i)) call abort
33    end do
34  end subroutine
35end module target6
36  use target6, only : foo
37  integer :: n, i
38  double precision, pointer :: p(:), v(:), w(:)
39  n = 10000
40  allocate (p(n), v(n), w(n))
41  do i = 1, n
42    v(i) = i
43    w(i) = iand (i, 63)
44  end do
45  call foo (p, v, w, n)
46  do i = 1, n
47    if (p(i) /= (i + 1) * iand (i, 63)) call abort
48  end do
49  deallocate (p, v, w)
50end
51