1! { dg-do run }
2!
3program subarrays
4  integer, parameter     :: n = 20, c = 10, low = 5, high = 10
5  integer                :: i, a(n), b(n)
6
7  a(:) = 0
8  b(:) = 0
9
10  ! COPY
11
12  !$acc parallel copy (a(low:high))
13  !$acc loop
14  do i = low, high
15     a(i) = i
16  end do
17  !$acc end parallel
18
19  do i = low, high
20     b(i) = i
21  end do
22
23  call check (a, b, n)
24
25  ! COPYOUT
26
27  a(:) = 0
28
29  !$acc parallel copyout (a(low:high))
30  !$acc loop
31  do i = low, high
32     a(i) = i
33  end do
34  !$acc end parallel
35
36  do i = low, high
37     if (a(i) .ne. b(i)) STOP 1
38  end do
39  call check (a, b, n)
40
41  ! COPYIN
42
43  a(:) = 0
44
45  !$acc parallel copyout (a(low:high)) copyin (b(low:high))
46  !$acc loop
47  do i = low, high
48     a(i) = b(i)
49  end do
50  !$acc end parallel
51
52  call check (a, b, n)
53
54  ! PRESENT_OR_COPY
55
56  a(:) = 0
57
58  !$acc parallel pcopy (a(low:high))
59  !$acc loop
60  do i = low, high
61     a(i) = i
62  end do
63  !$acc end parallel
64
65  call check (a, b, n)
66
67  ! PRESENT_OR_COPYOUT
68
69  a(:) = 0
70
71  !$acc parallel pcopyout (a(low:high))
72  !$acc loop
73  do i = low, high
74     a(i) = i
75  end do
76  !$acc end parallel
77
78  call check (a, b, n)
79
80  ! PRESENT_OR_COPYIN
81
82  a(:) = 0
83
84  !$acc parallel pcopyout (a(low:high)) &
85  !$acc & pcopyin (b(low:high))
86  !$acc loop
87  do i = low, high
88     a(i) = b(i)
89  end do
90  !$acc end parallel
91
92  call check (a, b, n)
93end program subarrays
94
95subroutine check (a, b, n)
96  integer :: n, a(n), b(n)
97  integer :: i
98
99  do i = 1, n
100     if (a(i) .ne. b(i)) STOP 2
101  end do
102end subroutine check
103