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