blob: ffcc639e8ebe0f4799a57772be8d92c8925e2758 [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 ;
57}
58
59void test_non_identifiers() {
60 int i, x;
61
62#pragma omp parallel
63// expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
64#pragma omp for;
65 for (i = 0; i < 16; ++i)
66 ;
Alexey Bataev54acd402015-08-04 11:18:19 +000067// expected-warning@+2 {{extra tokens at the end of '#pragma omp for' are ignored}}
Alexey Bataevf29276e2014-06-18 04:14:57 +000068#pragma omp parallel
Alexey Bataevf29276e2014-06-18 04:14:57 +000069#pragma omp for linear(x);
70 for (i = 0; i < 16; ++i)
71 ;
72
73#pragma omp parallel
74// expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
75#pragma omp for private(x);
76 for (i = 0; i < 16; ++i)
77 ;
78
79#pragma omp parallel
80// expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
81#pragma omp for, private(x);
82 for (i = 0; i < 16; ++i)
83 ;
84}
85
86extern int foo();
87
88void test_collapse() {
89 int i;
90#pragma omp parallel
91// expected-error@+1 {{expected '('}}
92#pragma omp for collapse
93 for (i = 0; i < 16; ++i)
94 ;
95#pragma omp parallel
96// expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
97#pragma omp for collapse(
98 for (i = 0; i < 16; ++i)
99 ;
100#pragma omp parallel
101// expected-error@+1 {{expected expression}}
102#pragma omp for collapse()
103 for (i = 0; i < 16; ++i)
104 ;
105#pragma omp parallel
106// expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
107#pragma omp for 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 for collapse(, )
113 for (i = 0; i < 16; ++i)
114 ;
115#pragma omp parallel
116// expected-warning@+2 {{extra tokens at the end of '#pragma omp for' are ignored}}
117// expected-error@+1 {{expected '('}}
118#pragma omp for collapse 4)
119 for (i = 0; i < 16; ++i)
120 ;
121#pragma omp parallel
122// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000123// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000124#pragma omp for collapse(4
125 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000126 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000127#pragma omp parallel
128// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000129// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000130#pragma omp for collapse(4,
131 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000132 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000133#pragma omp parallel
134// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000135// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000136#pragma omp for collapse(4, )
137 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000138 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000139#pragma omp parallel
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000140// expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000141#pragma omp for collapse(4)
142 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000143 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000144#pragma omp parallel
145// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000146// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000147#pragma omp for collapse(4 4)
148 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000149 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000150#pragma omp parallel
151// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000152// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000153#pragma omp for collapse(4, , 4)
154 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000155 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000156#pragma omp parallel
157#pragma omp for collapse(4)
158 for (int i1 = 0; i1 < 16; ++i1)
159 for (int i2 = 0; i2 < 16; ++i2)
160 for (int i3 = 0; i3 < 16; ++i3)
161 for (int i4 = 0; i4 < 16; ++i4)
162 foo();
163#pragma omp parallel
164// expected-error@+2 {{expected ')'}}
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000165// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000166#pragma omp for collapse(4, 8)
167 for (i = 0; i < 16; ++i)
Alexey Bataeve2f07d42014-06-24 12:55:56 +0000168 ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000169#pragma omp parallel
170// expected-error@+1 {{expression is not an integer constant expression}}
171#pragma omp for collapse(2.5)
172 for (i = 0; i < 16; ++i)
173 ;
174#pragma omp parallel
175// expected-error@+1 {{expression is not an integer constant expression}}
176#pragma omp for collapse(foo())
177 for (i = 0; i < 16; ++i)
178 ;
179#pragma omp parallel
Alexey Bataeva0569352015-12-01 10:17:31 +0000180// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000181#pragma omp for collapse(-5)
182 for (i = 0; i < 16; ++i)
183 ;
184#pragma omp parallel
Alexey Bataeva0569352015-12-01 10:17:31 +0000185// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000186#pragma omp for collapse(0)
187 for (i = 0; i < 16; ++i)
188 ;
189#pragma omp parallel
Alexey Bataeva0569352015-12-01 10:17:31 +0000190// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000191#pragma omp for collapse(5 - 5)
192 for (i = 0; i < 16; ++i)
193 ;
Alexey Bataevcaf09b02014-07-25 06:27:47 +0000194#pragma omp parallel
195#pragma omp for collapse(2)
196 for (i = 0; i < 16; ++i)
197// 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?}}
198 for (int j = 0; j < 16; ++j)
Alexey Bataevdffa93a2015-12-10 08:20:58 +0000199// expected-error@+2 {{reduction variable must be shared}}
Alexey Bataevcaf09b02014-07-25 06:27:47 +0000200// expected-error@+1 {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
201#pragma omp for reduction(+ : i, j)
202 for (int k = 0; k < 16; ++k)
203 i += j;
Alexey Bataevf29276e2014-06-18 04:14:57 +0000204}
205
206void test_private() {
207 int i;
208#pragma omp parallel
209// expected-error@+2 {{expected expression}}
210// expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
211#pragma omp for private(
212 for (i = 0; i < 16; ++i)
213 ;
214#pragma omp parallel
215// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
Alexey Bataevc5970622016-04-01 08:43:42 +0000216// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000217#pragma omp for private(,
218 for (i = 0; i < 16; ++i)
219 ;
220#pragma omp parallel
Alexey Bataevc5970622016-04-01 08:43:42 +0000221// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000222#pragma omp for private(, )
223 for (i = 0; i < 16; ++i)
224 ;
225#pragma omp parallel
226// expected-error@+1 {{expected expression}}
227#pragma omp for private()
228 for (i = 0; i < 16; ++i)
229 ;
230#pragma omp parallel
231// expected-error@+1 {{expected expression}}
232#pragma omp for private(int)
233 for (i = 0; i < 16; ++i)
234 ;
235#pragma omp parallel
236// expected-error@+1 {{expected variable name}}
237#pragma omp for private(0)
238 for (i = 0; i < 16; ++i)
239 ;
240
241 int x, y, z;
242#pragma omp parallel
243#pragma omp for private(x)
244 for (i = 0; i < 16; ++i)
245 ;
246#pragma omp parallel
247#pragma omp for private(x, y)
248 for (i = 0; i < 16; ++i)
249 ;
250#pragma omp parallel
251#pragma omp for private(x, y, z)
252 for (i = 0; i < 16; ++i) {
253 x = y * i + z;
254 }
255}
256
257void test_lastprivate() {
258 int i;
259#pragma omp parallel
260// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
261// expected-error@+1 {{expected expression}}
262#pragma omp for lastprivate(
263 for (i = 0; i < 16; ++i)
264 ;
265
266#pragma omp parallel
267// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
Alexey Bataevc5970622016-04-01 08:43:42 +0000268// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000269#pragma omp for lastprivate(,
270 for (i = 0; i < 16; ++i)
271 ;
272#pragma omp parallel
Alexey Bataevc5970622016-04-01 08:43:42 +0000273// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000274#pragma omp for lastprivate(, )
275 for (i = 0; i < 16; ++i)
276 ;
277#pragma omp parallel
278// expected-error@+1 {{expected expression}}
279#pragma omp for lastprivate()
280 for (i = 0; i < 16; ++i)
281 ;
282#pragma omp parallel
283// expected-error@+1 {{expected expression}}
284#pragma omp for lastprivate(int)
285 for (i = 0; i < 16; ++i)
286 ;
287#pragma omp parallel
288// expected-error@+1 {{expected variable name}}
289#pragma omp for lastprivate(0)
290 for (i = 0; i < 16; ++i)
291 ;
292
293 int x, y, z;
294#pragma omp parallel
295#pragma omp for lastprivate(x)
296 for (i = 0; i < 16; ++i)
297 ;
298#pragma omp parallel
299#pragma omp for lastprivate(x, y)
300 for (i = 0; i < 16; ++i)
301 ;
302#pragma omp parallel
303#pragma omp for lastprivate(x, y, z)
304 for (i = 0; i < 16; ++i)
305 ;
306}
307
308void test_firstprivate() {
309 int i;
310#pragma omp parallel
311// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
312// expected-error@+1 {{expected expression}}
313#pragma omp for firstprivate(
314 for (i = 0; i < 16; ++i)
315 ;
316
317#pragma omp parallel
318// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
Alexey Bataevc5970622016-04-01 08:43:42 +0000319// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000320#pragma omp for firstprivate(,
321 for (i = 0; i < 16; ++i)
322 ;
323#pragma omp parallel
Alexey Bataevc5970622016-04-01 08:43:42 +0000324// expected-error@+1 2 {{expected expression}}
Alexey Bataevf29276e2014-06-18 04:14:57 +0000325#pragma omp for firstprivate(, )
326 for (i = 0; i < 16; ++i)
327 ;
328#pragma omp parallel
329// expected-error@+1 {{expected expression}}
330#pragma omp for firstprivate()
331 for (i = 0; i < 16; ++i)
332 ;
333#pragma omp parallel
334// expected-error@+1 {{expected expression}}
335#pragma omp for firstprivate(int)
336 for (i = 0; i < 16; ++i)
337 ;
338#pragma omp parallel
339// expected-error@+1 {{expected variable name}}
340#pragma omp for firstprivate(0)
341 for (i = 0; i < 16; ++i)
342 ;
343
344 int x, y, z;
345#pragma omp parallel
346#pragma omp for lastprivate(x) firstprivate(x)
347 for (i = 0; i < 16; ++i)
348 ;
349#pragma omp parallel
350#pragma omp for lastprivate(x, y) firstprivate(x, y)
351 for (i = 0; i < 16; ++i)
352 ;
353#pragma omp parallel
354#pragma omp for lastprivate(x, y, z) firstprivate(x, y, z)
355 for (i = 0; i < 16; ++i)
356 ;
357}
358
359void test_loop_messages() {
360 float a[100], b[100], c[100];
361#pragma omp parallel
362// expected-error@+2 {{variable must be of integer or pointer type}}
363#pragma omp for
364 for (float fi = 0; fi < 10.0; fi++) {
365 c[(int)fi] = a[(int)fi] + b[(int)fi];
366 }
367#pragma omp parallel
368// expected-error@+2 {{variable must be of integer or pointer type}}
369#pragma omp for
370 for (double fi = 0; fi < 10.0; fi++) {
371 c[(int)fi] = a[(int)fi] + b[(int)fi];
372 }
Alexander Musman174b3ca2014-10-06 11:16:29 +0000373
374 // expected-warning@+2 {{OpenMP loop iteration variable cannot have more than 64 bits size and will be narrowed}}
375 #pragma omp for
376 for (__int128 ii = 0; ii < 10; ii++) {
377 c[ii] = a[ii] + b[ii];
378 }
Alexey Bataevf29276e2014-06-18 04:14:57 +0000379}
380