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