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