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