1! RUN: %python %S/../test_errors.py %s %flang -fopenacc
2
3! Check OpenACC clause validity for the following construct and directive:
4!   2.11 Kernels Loop
5
6program openacc_kernels_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  real(8), dimension(:), allocatable :: dd
25  real(8), pointer :: p
26  logical :: ifCondition = .TRUE.
27  type(atype) :: t
28  type(atype), dimension(10) :: ta
29
30  real(8), dimension(N) :: a, f, g, h
31
32  !$acc kernels loop
33  do i = 1, N
34    a(i) = 3.14
35  end do
36
37  !$acc kernels loop num_gangs(8)
38  do i = 1, N
39    a(i) = 3.14
40  end do
41
42  !$acc kernels loop num_gangs(gang_size)
43  do i = 1, N
44    a(i) = 3.14
45  end do
46
47  !$acc kernels loop num_gangs(8)
48  do i = 1, N
49    a(i) = 3.14
50  end do
51
52  !$acc kernels loop num_workers(worker_size)
53  do i = 1, N
54    a(i) = 3.14
55  end do
56
57  !$acc kernels loop num_workers(8)
58  do i = 1, N
59    a(i) = 3.14
60  end do
61
62  !$acc kernels loop vector_length(vector_size)
63  do i = 1, N
64    a(i) = 3.14
65  end do
66
67  !$acc kernels loop vector_length(128)
68  do i = 1, N
69    a(i) = 3.14
70  end do
71
72  !$acc kernels loop num_gangs(gang_size)
73  do i = 1, N
74    a(i) = 3.14
75  end do
76
77
78  !$acc kernels loop if(.TRUE.)
79  do i = 1, N
80    a(i) = 3.14
81  end do
82
83  !$acc kernels loop if(ifCondition)
84  do i = 1, N
85    a(i) = 3.14
86  end do
87
88  !$acc kernels loop
89  do i = 1, N
90    a(i) = 3.14
91  end do
92  !ERROR: Unmatched END SERIAL LOOP directive
93  !$acc end serial loop
94
95  !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the KERNELS LOOP directive
96  !$acc kernels loop device_type(*) if(.TRUE.)
97  do i = 1, N
98    a(i) = 3.14
99  end do
100  !$acc end kernels loop
101
102  !$acc kernels loop async
103  do i = 1, N
104    a(i) = 3.14
105  end do
106
107  !$acc kernels loop async(1)
108  do i = 1, N
109    a(i) = 3.14
110  end do
111
112  !$acc kernels loop async(async1)
113  do i = 1, N
114    a(i) = 3.14
115  end do
116
117  !$acc kernels loop wait(wait1)
118  do i = 1, N
119    a(i) = 3.14
120  end do
121
122  !$acc kernels loop wait(wait1, wait2)
123  do i = 1, N
124    a(i) = 3.14
125  end do
126
127  !$acc kernels loop wait(wait1) wait(wait2)
128  do i = 1, N
129    a(i) = 3.14
130  end do
131
132  !$acc kernels loop wait(1, 2) async(3)
133  do i = 1, N
134    a(i) = 3.14
135  end do
136
137  !$acc kernels loop wait(queues: 1, 2) async(3)
138  do i = 1, N
139    a(i) = 3.14
140  end do
141
142  !$acc kernels loop wait(devnum: 1: 1, 2) async(3)
143  do i = 1, N
144    a(i) = 3.14
145  end do
146
147  !$acc kernels loop wait(devnum: 1: queues: 1, 2) async(3)
148  do i = 1, N
149    a(i) = 3.14
150  end do
151
152  !$acc kernels loop num_gangs(8)
153  do i = 1, N
154    a(i) = 3.14
155  end do
156
157  !$acc kernels loop num_workers(8)
158  do i = 1, N
159    a(i) = 3.14
160  end do
161
162  !$acc kernels loop vector_length(128)
163  do i = 1, N
164    a(i) = 3.14
165  end do
166
167  !$acc kernels loop if(.true.)
168  do i = 1, N
169    a(i) = 3.14
170  end do
171
172  !$acc kernels loop if(ifCondition)
173  do i = 1, N
174    a(i) = 3.14
175  end do
176
177  !ERROR: At most one IF clause can appear on the KERNELS LOOP directive
178  !$acc kernels loop if(.true.) if(ifCondition)
179  do i = 1, N
180    a(i) = 3.14
181  end do
182
183  !$acc kernels loop self
184  do i = 1, N
185    a(i) = 3.14
186  end do
187
188  !$acc kernels loop self(.true.)
189  do i = 1, N
190    a(i) = 3.14
191  end do
192
193  !$acc kernels loop self(ifCondition)
194  do i = 1, N
195    a(i) = 3.14
196  end do
197
198  !$acc kernels loop copy(aa) copyin(bb) copyout(cc)
199  do i = 1, N
200    a(i) = 3.14
201  end do
202
203  !$acc kernels loop copy(aa, bb) copyout(zero: cc)
204  do i = 1, N
205    a(i) = 3.14
206  end do
207
208  !$acc kernels loop present(aa, bb) create(cc)
209  do i = 1, N
210    a(i) = 3.14
211  end do
212
213  !$acc kernels loop copyin(readonly: aa, bb) create(zero: cc)
214  do i = 1, N
215    a(i) = 3.14
216  end do
217
218  !$acc kernels loop deviceptr(aa, bb) no_create(cc)
219  do i = 1, N
220    a(i) = 3.14
221  end do
222
223  !ERROR: Argument `aa` on the ATTACH clause must be a variable or array with the POINTER or ALLOCATABLE attribute
224  !$acc kernels loop attach(aa, dd, p)
225  do i = 1, N
226    a(i) = 3.14
227  end do
228
229  !$acc kernels loop private(aa, bb, cc)
230  do i = 1, N
231    a(i) = 3.14
232  end do
233
234  !$acc kernels loop default(none)
235  do i = 1, N
236    a(i) = 3.14
237  end do
238
239  !$acc kernels loop default(present)
240  do i = 1, N
241    a(i) = 3.14
242  end do
243
244  !ERROR: At most one DEFAULT clause can appear on the KERNELS LOOP directive
245  !$acc kernels loop default(none) default(present)
246  do i = 1, N
247    a(i) = 3.14
248  end do
249
250  !$acc kernels loop device_type(*)
251  do i = 1, N
252    a(i) = 3.14
253  end do
254
255  !$acc kernels loop device_type(1)
256  do i = 1, N
257    a(i) = 3.14
258  end do
259
260  !$acc kernels loop device_type(1, 3)
261  do i = 1, N
262    a(i) = 3.14
263  end do
264
265  !$acc kernels loop device_type(*) async wait num_gangs(8) num_workers(8) vector_length(128)
266  do i = 1, N
267    a(i) = 3.14
268  end do
269
270  !$acc kernels loop device_type(*) async
271  do i = 1, N
272    a(i) = 3.14
273  end do
274
275  !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the KERNELS LOOP directive
276  !$acc kernels loop device_type(*) if(.TRUE.)
277  do i = 1, N
278    a(i) = 3.14
279  end do
280
281end program openacc_kernels_loop_validity
282