1 | // RUN: %clang_cc1 -fsyntax-only -fopenmp -triple x86_64-unknown-unknown -verify %s |
2 | |
3 | // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -triple x86_64-unknown-unknown -verify %s |
4 | |
5 | // expected-error@+1 {{unexpected OpenMP directive '#pragma omp taskloop'}} |
6 | #pragma omp taskloop |
7 | |
8 | // expected-error@+1 {{unexpected OpenMP directive '#pragma omp taskloop'}} |
9 | #pragma omp taskloop foo |
10 | |
11 | void test_no_clause() { |
12 | int i; |
13 | #pragma omp taskloop |
14 | for (i = 0; i < 16; ++i) |
15 | ; |
16 | |
17 | // expected-error@+2 {{statement after '#pragma omp taskloop' must be a for loop}} |
18 | #pragma omp taskloop |
19 | ++i; |
20 | } |
21 | |
22 | void test_branch_protected_scope() { |
23 | int i = 0; |
24 | L1: |
25 | ++i; |
26 | |
27 | int x[24]; |
28 | |
29 | #pragma omp parallel |
30 | #pragma omp taskloop |
31 | for (i = 0; i < 16; ++i) { |
32 | if (i == 5) |
33 | goto L1; // expected-error {{use of undeclared label 'L1'}} |
34 | else if (i == 6) |
35 | return; // expected-error {{cannot return from OpenMP region}} |
36 | else if (i == 7) |
37 | goto L2; |
38 | else if (i == 8) { |
39 | L2: |
40 | x[i]++; |
41 | } |
42 | } |
43 | |
44 | if (x[0] == 0) |
45 | goto L2; // expected-error {{use of undeclared label 'L2'}} |
46 | else if (x[1] == 1) |
47 | goto L1; |
48 | } |
49 | |
50 | void test_invalid_clause() { |
51 | int i; |
52 | #pragma omp parallel |
53 | // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop' are ignored}} |
54 | #pragma omp taskloop foo bar |
55 | for (i = 0; i < 16; ++i) |
56 | ; |
57 | // expected-error@+1 {{directive '#pragma omp taskloop' cannot contain more than one 'nogroup' clause}} |
58 | #pragma omp taskloop nogroup nogroup |
59 | for (i = 0; i < 16; ++i) |
60 | ; |
61 | } |
62 | |
63 | void test_non_identifiers() { |
64 | int i, x; |
65 | |
66 | #pragma omp parallel |
67 | // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop' are ignored}} |
68 | #pragma omp taskloop; |
69 | for (i = 0; i < 16; ++i) |
70 | ; |
71 | // expected-warning@+3 {{extra tokens at the end of '#pragma omp taskloop' are ignored}} |
72 | // expected-error@+2 {{unexpected OpenMP clause 'linear' in directive '#pragma omp taskloop'}} |
73 | #pragma omp parallel |
74 | #pragma omp taskloop linear(x); |
75 | for (i = 0; i < 16; ++i) |
76 | ; |
77 | |
78 | #pragma omp parallel |
79 | // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop' are ignored}} |
80 | #pragma omp taskloop private(x); |
81 | for (i = 0; i < 16; ++i) |
82 | ; |
83 | |
84 | #pragma omp parallel |
85 | // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop' are ignored}} |
86 | #pragma omp taskloop, private(x); |
87 | for (i = 0; i < 16; ++i) |
88 | ; |
89 | } |
90 | |
91 | extern int foo(); |
92 | |
93 | void test_collapse() { |
94 | int i; |
95 | #pragma omp parallel |
96 | // expected-error@+1 {{expected '('}} |
97 | #pragma omp taskloop collapse |
98 | for (i = 0; i < 16; ++i) |
99 | ; |
100 | #pragma omp parallel |
101 | // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
102 | #pragma omp taskloop collapse( |
103 | for (i = 0; i < 16; ++i) |
104 | ; |
105 | #pragma omp parallel |
106 | // expected-error@+1 {{expected expression}} |
107 | #pragma omp taskloop collapse() |
108 | for (i = 0; i < 16; ++i) |
109 | ; |
110 | #pragma omp parallel |
111 | // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
112 | #pragma omp taskloop collapse(, |
113 | for (i = 0; i < 16; ++i) |
114 | ; |
115 | #pragma omp parallel |
116 | // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
117 | #pragma omp taskloop collapse(, ) |
118 | for (i = 0; i < 16; ++i) |
119 | ; |
120 | #pragma omp parallel |
121 | // expected-warning@+2 {{extra tokens at the end of '#pragma omp taskloop' are ignored}} |
122 | // expected-error@+1 {{expected '('}} |
123 | #pragma omp taskloop collapse 4) |
124 | for (i = 0; i < 16; ++i) |
125 | ; |
126 | #pragma omp parallel |
127 | // expected-error@+2 {{expected ')'}} |
128 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
129 | #pragma omp taskloop collapse(4 |
130 | for (i = 0; i < 16; ++i) |
131 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop', but found only 1}} |
132 | #pragma omp parallel |
133 | // expected-error@+2 {{expected ')'}} |
134 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
135 | #pragma omp taskloop collapse(4, |
136 | for (i = 0; i < 16; ++i) |
137 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop', but found only 1}} |
138 | #pragma omp parallel |
139 | // expected-error@+2 {{expected ')'}} |
140 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
141 | #pragma omp taskloop collapse(4, ) |
142 | for (i = 0; i < 16; ++i) |
143 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop', but found only 1}} |
144 | #pragma omp parallel |
145 | // expected-note@+1 {{as specified in 'collapse' clause}} |
146 | #pragma omp taskloop collapse(4) |
147 | for (i = 0; i < 16; ++i) |
148 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop', but found only 1}} |
149 | #pragma omp parallel |
150 | // expected-error@+2 {{expected ')'}} |
151 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
152 | #pragma omp taskloop collapse(4 4) |
153 | for (i = 0; i < 16; ++i) |
154 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop', but found only 1}} |
155 | #pragma omp parallel |
156 | // expected-error@+2 {{expected ')'}} |
157 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
158 | #pragma omp taskloop collapse(4, , 4) |
159 | for (i = 0; i < 16; ++i) |
160 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop', but found only 1}} |
161 | #pragma omp parallel |
162 | #pragma omp taskloop collapse(4) |
163 | for (int i1 = 0; i1 < 16; ++i1) |
164 | for (int i2 = 0; i2 < 16; ++i2) |
165 | for (int i3 = 0; i3 < 16; ++i3) |
166 | for (int i4 = 0; i4 < 16; ++i4) |
167 | foo(); |
168 | #pragma omp parallel |
169 | // expected-error@+2 {{expected ')'}} |
170 | // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} |
171 | #pragma omp taskloop collapse(4, 8) |
172 | for (i = 0; i < 16; ++i) |
173 | ; // expected-error {{expected 4 for loops after '#pragma omp taskloop', but found only 1}} |
174 | #pragma omp parallel |
175 | // expected-error@+1 {{expression is not an integer constant expression}} |
176 | #pragma omp taskloop collapse(2.5) |
177 | for (i = 0; i < 16; ++i) |
178 | ; |
179 | #pragma omp parallel |
180 | // expected-error@+1 {{expression is not an integer constant expression}} |
181 | #pragma omp taskloop collapse(foo()) |
182 | for (i = 0; i < 16; ++i) |
183 | ; |
184 | #pragma omp parallel |
185 | // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} |
186 | #pragma omp taskloop collapse(-5) |
187 | for (i = 0; i < 16; ++i) |
188 | ; |
189 | #pragma omp parallel |
190 | // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} |
191 | #pragma omp taskloop collapse(0) |
192 | for (i = 0; i < 16; ++i) |
193 | ; |
194 | #pragma omp parallel |
195 | // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} |
196 | #pragma omp taskloop collapse(5 - 5) |
197 | for (i = 0; i < 16; ++i) |
198 | ; |
199 | } |
200 | |
201 | void test_private() { |
202 | int i; |
203 | #pragma omp parallel |
204 | // expected-error@+2 {{expected expression}} |
205 | // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
206 | #pragma omp taskloop private( |
207 | for (i = 0; i < 16; ++i) |
208 | ; |
209 | #pragma omp parallel |
210 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
211 | // expected-error@+1 2 {{expected expression}} |
212 | #pragma omp taskloop private(, |
213 | for (i = 0; i < 16; ++i) |
214 | ; |
215 | #pragma omp parallel |
216 | // expected-error@+1 2 {{expected expression}} |
217 | #pragma omp taskloop private(, ) |
218 | for (i = 0; i < 16; ++i) |
219 | ; |
220 | #pragma omp parallel |
221 | // expected-error@+1 {{expected expression}} |
222 | #pragma omp taskloop private() |
223 | for (i = 0; i < 16; ++i) |
224 | ; |
225 | #pragma omp parallel |
226 | // expected-error@+1 {{expected expression}} |
227 | #pragma omp taskloop private(int) |
228 | for (i = 0; i < 16; ++i) |
229 | ; |
230 | #pragma omp parallel |
231 | // expected-error@+1 {{expected variable name}} |
232 | #pragma omp taskloop private(0) |
233 | for (i = 0; i < 16; ++i) |
234 | ; |
235 | |
236 | int x, y, z; |
237 | #pragma omp parallel |
238 | #pragma omp taskloop private(x) |
239 | for (i = 0; i < 16; ++i) |
240 | ; |
241 | #pragma omp parallel |
242 | #pragma omp taskloop private(x, y) |
243 | for (i = 0; i < 16; ++i) |
244 | ; |
245 | #pragma omp parallel |
246 | #pragma omp taskloop private(x, y, z) |
247 | for (i = 0; i < 16; ++i) { |
248 | x = y * i + z; |
249 | } |
250 | } |
251 | |
252 | void test_lastprivate() { |
253 | int i; |
254 | #pragma omp parallel |
255 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
256 | // expected-error@+1 {{expected expression}} |
257 | #pragma omp taskloop lastprivate( |
258 | for (i = 0; i < 16; ++i) |
259 | ; |
260 | |
261 | #pragma omp parallel |
262 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
263 | // expected-error@+1 2 {{expected expression}} |
264 | #pragma omp taskloop lastprivate(, |
265 | for (i = 0; i < 16; ++i) |
266 | ; |
267 | #pragma omp parallel |
268 | // expected-error@+1 2 {{expected expression}} |
269 | #pragma omp taskloop lastprivate(, ) |
270 | for (i = 0; i < 16; ++i) |
271 | ; |
272 | #pragma omp parallel |
273 | // expected-error@+1 {{expected expression}} |
274 | #pragma omp taskloop lastprivate() |
275 | for (i = 0; i < 16; ++i) |
276 | ; |
277 | #pragma omp parallel |
278 | // expected-error@+1 {{expected expression}} |
279 | #pragma omp taskloop lastprivate(int) |
280 | for (i = 0; i < 16; ++i) |
281 | ; |
282 | #pragma omp parallel |
283 | // expected-error@+1 {{expected variable name}} |
284 | #pragma omp taskloop lastprivate(0) |
285 | for (i = 0; i < 16; ++i) |
286 | ; |
287 | |
288 | int x, y, z; |
289 | #pragma omp parallel |
290 | #pragma omp taskloop lastprivate(x) |
291 | for (i = 0; i < 16; ++i) |
292 | ; |
293 | #pragma omp parallel |
294 | #pragma omp taskloop lastprivate(x, y) |
295 | for (i = 0; i < 16; ++i) |
296 | ; |
297 | #pragma omp parallel |
298 | #pragma omp taskloop lastprivate(x, y, z) |
299 | for (i = 0; i < 16; ++i) |
300 | ; |
301 | } |
302 | |
303 | void test_firstprivate() { |
304 | int i; |
305 | #pragma omp parallel |
306 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
307 | // expected-error@+1 {{expected expression}} |
308 | #pragma omp taskloop firstprivate( |
309 | for (i = 0; i < 16; ++i) |
310 | ; |
311 | |
312 | #pragma omp parallel |
313 | // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
314 | // expected-error@+1 2 {{expected expression}} |
315 | #pragma omp taskloop firstprivate(, |
316 | for (i = 0; i < 16; ++i) |
317 | ; |
318 | #pragma omp parallel |
319 | // expected-error@+1 2 {{expected expression}} |
320 | #pragma omp taskloop firstprivate(, ) |
321 | for (i = 0; i < 16; ++i) |
322 | ; |
323 | #pragma omp parallel |
324 | // expected-error@+1 {{expected expression}} |
325 | #pragma omp taskloop firstprivate() |
326 | for (i = 0; i < 16; ++i) |
327 | ; |
328 | #pragma omp parallel |
329 | // expected-error@+1 {{expected expression}} |
330 | #pragma omp taskloop firstprivate(int) |
331 | for (i = 0; i < 16; ++i) |
332 | ; |
333 | #pragma omp parallel |
334 | // expected-error@+1 {{expected variable name}} |
335 | #pragma omp taskloop firstprivate(0) |
336 | for (i = 0; i < 16; ++i) |
337 | ; |
338 | |
339 | int x, y, z; |
340 | #pragma omp parallel |
341 | #pragma omp taskloop lastprivate(x) firstprivate(x) |
342 | for (i = 0; i < 16; ++i) |
343 | ; |
344 | #pragma omp parallel |
345 | #pragma omp taskloop lastprivate(x, y) firstprivate(x, y) |
346 | for (i = 0; i < 16; ++i) |
347 | ; |
348 | #pragma omp parallel |
349 | #pragma omp taskloop lastprivate(x, y, z) firstprivate(x, y, z) |
350 | for (i = 0; i < 16; ++i) |
351 | ; |
352 | } |
353 | |
354 | void test_loop_messages() { |
355 | float a[100], b[100], c[100]; |
356 | #pragma omp parallel |
357 | // expected-error@+2 {{variable must be of integer or pointer type}} |
358 | #pragma omp taskloop |
359 | for (float fi = 0; fi < 10.0; fi++) { |
360 | c[(int)fi] = a[(int)fi] + b[(int)fi]; |
361 | } |
362 | #pragma omp parallel |
363 | // expected-error@+2 {{variable must be of integer or pointer type}} |
364 | #pragma omp taskloop |
365 | for (double fi = 0; fi < 10.0; fi++) { |
366 | c[(int)fi] = a[(int)fi] + b[(int)fi]; |
367 | } |
368 | |
369 | // expected-warning@+2 {{OpenMP loop iteration variable cannot have more than 64 bits size and will be narrowed}} |
370 | #pragma omp taskloop |
371 | for (__int128 ii = 0; ii < 10; ii++) { |
372 | c[ii] = a[ii] + b[ii]; |
373 | } |
374 | } |
375 | |
376 | |