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