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