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