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