1! RUN: %python %S/../test_errors.py %s %flang -fopenacc
2
3! Check OpenACC clause validity for the following construct and directive:
4!   2.9 Loop
5
6program openacc_loop_validity
7
8  implicit none
9
10  type atype
11    real(8), dimension(10) :: arr
12    real(8) :: s
13  end type atype
14
15  integer :: i, j, b, gang_size, vector_size, worker_size
16  integer, parameter :: N = 256
17  integer, dimension(N) :: c
18  logical, dimension(N) :: d, e
19  integer :: async1
20  integer :: wait1, wait2
21  real :: reduction_r
22  logical :: reduction_l
23  real(8), dimension(N, N) :: aa, bb, cc
24  logical :: ifCondition = .TRUE.
25  type(atype) :: t
26  type(atype), dimension(10) :: ta
27
28  real(8), dimension(N) :: a, f, g, h
29
30  !$acc parallel
31  !$acc loop tile(2)
32  do i = 1, N
33    a(i) = 3.14
34  end do
35  !$acc end parallel
36
37  !$acc parallel device_type(*) num_gangs(2)
38  !$acc loop
39  do i = 1, N
40    a(i) = 3.14
41  end do
42  !$acc end parallel
43
44  !$acc parallel
45  !$acc loop seq
46  do i = 1, N
47    a(i) = 3.14
48  end do
49  !$acc end parallel
50
51  !$acc parallel
52  !$acc loop independent
53  do i = 1, N
54    a(i) = 3.14
55  end do
56  !$acc end parallel
57
58  !$acc parallel
59  !$acc loop auto
60  do i = 1, N
61    a(i) = 3.14
62  end do
63  !$acc end parallel
64
65  !$acc parallel
66  !ERROR: At most one VECTOR clause can appear on the LOOP directive
67  !$acc loop vector vector(128)
68  do i = 1, N
69    a(i) = 3.14
70  end do
71  !$acc end parallel
72
73  !$acc parallel
74  !$acc loop vector
75  do i = 1, N
76    a(i) = 3.14
77  end do
78  !$acc end parallel
79
80  !$acc parallel
81  !$acc loop vector(10)
82  do i = 1, N
83    a(i) = 3.14
84  end do
85  !$acc end parallel
86
87  !$acc parallel
88  !$acc loop vector(vector_size)
89  do i = 1, N
90    a(i) = 3.14
91  end do
92  !$acc end parallel
93
94  !$acc parallel
95  !$acc loop vector(length: vector_size)
96  do i = 1, N
97    a(i) = 3.14
98  end do
99  !$acc end parallel
100
101  !$acc parallel
102  !ERROR: At most one WORKER clause can appear on the LOOP directive
103  !$acc loop worker worker(10)
104  do i = 1, N
105    a(i) = 3.14
106  end do
107  !$acc end parallel
108
109  !$acc parallel
110  !$acc loop worker
111  do i = 1, N
112    a(i) = 3.14
113  end do
114  !$acc end parallel
115
116  !$acc parallel
117  !$acc loop worker(10)
118  do i = 1, N
119    a(i) = 3.14
120  end do
121  !$acc end parallel
122
123  !$acc parallel
124  !$acc loop worker(worker_size)
125  do i = 1, N
126    a(i) = 3.14
127  end do
128  !$acc end parallel
129
130  !$acc parallel
131  !$acc loop worker(num: worker_size)
132  do i = 1, N
133    a(i) = 3.14
134  end do
135  !$acc end parallel
136
137  !$acc parallel
138  !ERROR: At most one GANG clause can appear on the LOOP directive
139  !$acc loop gang gang(gang_size)
140  do i = 1, N
141    a(i) = 3.14
142  end do
143  !$acc end parallel
144
145  !$acc parallel
146  !$acc loop gang(gang_size)
147  do i = 1, N
148    a(i) = 3.14
149  end do
150  !$acc end parallel
151
152  !$acc parallel
153  !$acc loop gang(num: gang_size)
154  do i = 1, N
155    a(i) = 3.14
156  end do
157  !$acc end parallel
158
159  !$acc parallel
160  !$acc loop gang(gang_size, static:*)
161  do i = 1, N
162    a(i) = 3.14
163  end do
164  !$acc end parallel
165
166  !$acc parallel
167  !$acc loop gang(num: gang_size, static:*)
168  do i = 1, N
169    a(i) = 3.14
170  end do
171  !$acc end parallel
172
173  !$acc parallel
174  !$acc loop gang(num: gang_size, static: gang_size)
175  do i = 1, N
176    a(i) = 3.14
177  end do
178  !$acc end parallel
179
180  !$acc parallel
181  !$acc loop private(b, a(:))
182  do i = 1, N
183    a(i) = b
184  end do
185  !$acc end parallel
186
187  !$acc parallel
188  !$acc loop tile(*)
189  do i = 1, N
190    a(i) = b
191  end do
192  !$acc end parallel
193
194  !$acc parallel
195  !$acc loop tile(2, 2)
196  do i = 1, N
197    do j = 1, N
198      a(i) = b
199    end do
200  end do
201  !$acc end parallel
202
203  !$acc parallel
204  !ERROR: The parameter of the COLLAPSE clause must be a constant positive integer expression
205  !$acc loop collapse(-1)
206  do i = 1, N
207    do j = 1, N
208      a(i) = 3.14 + j
209    end do
210  end do
211  !$acc end parallel
212
213  !$acc parallel
214  !ERROR: Clause PRIVATE is not allowed after clause DEVICE_TYPE on the LOOP directive
215  !$acc loop device_type(*) private(i)
216  do i = 1, N
217    a(i) = 3.14
218  end do
219  !$acc end parallel
220
221  !$acc parallel
222  !ERROR: Clause GANG is not allowed if clause SEQ appears on the LOOP directive
223  !$acc loop gang seq
224  do i = 1, N
225    a(i) = 3.14
226  end do
227  !$acc end parallel
228
229  !$acc parallel
230  !ERROR: Clause WORKER is not allowed if clause SEQ appears on the LOOP directive
231  !$acc loop worker seq
232  do i = 1, N
233    a(i) = 3.14
234  end do
235  !$acc end parallel
236
237  !$acc parallel
238  !ERROR: Clause VECTOR is not allowed if clause SEQ appears on the LOOP directive
239  !$acc loop vector seq
240  do i = 1, N
241    a(i) = 3.14
242  end do
243  !$acc end parallel
244
245  !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the PARALLEL directive
246  !$acc parallel device_type(*) if(.TRUE.)
247  !$acc loop
248  do i = 1, N
249    a(i) = 3.14
250  end do
251  !$acc end parallel
252
253end program openacc_loop_validity
254