blob: 901d66dd688cf26af8049454f8599c3d9011e467 [file] [log] [blame]
Alexey Bataevdb390212015-05-20 04:24:19 +00001// RUN: %clang_cc1 -fsyntax-only -fopenmp -triple x86_64-unknown-unknown -verify %s
Alexey Bataevf29276e2014-06-18 04:14:57 +00002
Alexey Bataeva8a9153a2017-12-29 18:07:07 +00003// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -triple x86_64-unknown-unknown -verify %s
4
Alexey Bataevf29276e2014-06-18 04:14:57 +00005// 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
11void 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
22void test_branch_protected_scope() {
23 int i = 0;
24L1:
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
50void 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 ;
Alexey Bataevf3c832a2018-01-09 19:21:04 +000057// 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 ;
Alexey Bataevf29276e2014-06-18 04:14:57 +000071}
72
73void 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 ;
Alexey Bataev54acd402015-08-04 11:18:19 +000081// expected-warning@+2 {{extra tokens at the end of '#pragma omp for' are ignored}}
Alexey Bataevf29276e2014-06-18 04:14:57 +000082#pragma omp parallel
Alexey Bataevf29276e2014-06-18 04:14:57 +000083#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
100extern int foo();
101
102void 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 ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000137// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000138#pragma omp for collapse(4
139 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000140 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000141#pragma omp parallel
142// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000143// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000144#pragma omp for collapse(4,
145 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000146 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000147#pragma omp parallel
148// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000149// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000150#pragma omp for collapse(4, )
151 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000152 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000153#pragma omp parallel
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000154// expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000155#pragma omp for collapse(4)
156 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000157 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000158#pragma omp parallel
159// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000160// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000161#pragma omp for collapse(4 4)
162 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000163 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000164#pragma omp parallel
165// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000166// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000167#pragma omp for collapse(4, , 4)
168 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000169 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000170#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 ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000179// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000180#pragma omp for collapse(4, 8)
181 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000182 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000183#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
Alexey Bataeva0569352015-12-01 10:17:31 +0000194// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000195#pragma omp for collapse(-5)
196 for (i = 0; i < 16; ++i)
197 ;
198#pragma omp parallel
Alexey Bataeva0569352015-12-01 10:17:31 +0000199// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000200#pragma omp for collapse(0)
201 for (i = 0; i < 16; ++i)
202 ;
203#pragma omp parallel
Alexey Bataeva0569352015-12-01 10:17:31 +0000204// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000205#pragma omp for collapse(5 - 5)
206 for (i = 0; i < 16; ++i)
207 ;
Alexey Bataevcaf09b02014-07-25 06:27:47 +0000208#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)
Alexey Bataevdffa93a2015-12-10 08:20:58 +0000213// expected-error@+2 {{reduction variable must be shared}}
Alexey Bataevcaf09b02014-07-25 06:27:47 +0000214// 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;
Alexey Bataevf29276e2014-06-18 04:14:57 +0000218}
219
220void 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 '('}}
Alexey Bataevc5970622016-04-01 08:43:42 +0000230// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000231#pragma omp for private(,
232 for (i = 0; i < 16; ++i)
233 ;
234#pragma omp parallel
Alexey Bataevc5970622016-04-01 08:43:42 +0000235// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000236#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
271void 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 '('}}
Alexey Bataevc5970622016-04-01 08:43:42 +0000282// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000283#pragma omp for lastprivate(,
284 for (i = 0; i < 16; ++i)
285 ;
286#pragma omp parallel
Alexey Bataevc5970622016-04-01 08:43:42 +0000287// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000288#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
322void 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 '('}}
Alexey Bataevc5970622016-04-01 08:43:42 +0000333// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000334#pragma omp for firstprivate(,
335 for (i = 0; i < 16; ++i)
336 ;
337#pragma omp parallel
Alexey Bataevc5970622016-04-01 08:43:42 +0000338// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000339#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
373void 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 }
Alexander Musman174b3ca2014-10-06 11:16:29 +0000387
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 }
Alexey Bataevf29276e2014-06-18 04:14:57 +0000393}
394