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