1 // RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -verify %s
2 
3 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp simd'}}
4 #pragma omp simd
5 
6 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp simd'}}
7 #pragma omp simd foo
8 
9 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp simd'}}
10 #pragma omp simd safelen(4)
11 
test_no_clause()12 void test_no_clause() {
13   int i;
14 #pragma omp simd
15   for (i = 0; i < 16; ++i)
16     ;
17 
18 // expected-error@+2 {{statement after '#pragma omp simd' must be a for loop}}
19 #pragma omp simd
20   ++i;
21 }
22 
test_branch_protected_scope()23 void test_branch_protected_scope() {
24   int i = 0;
25 L1:
26   ++i;
27 
28   int x[24];
29 
30 #pragma omp simd
31   for (i = 0; i < 16; ++i) {
32     if (i == 5)
33       goto L1; // expected-error {{use of undeclared label 'L1'}}
34     else if (i == 6)
35       return; // expected-error {{cannot return from OpenMP region}}
36     else if (i == 7)
37       goto L2;
38     else if (i == 8) {
39     L2:
40       x[i]++;
41     }
42   }
43 
44   if (x[0] == 0)
45     goto L2; // expected-error {{use of undeclared label 'L2'}}
46   else if (x[1] == 1)
47     goto L1;
48 }
49 
test_invalid_clause()50 void test_invalid_clause() {
51   int i;
52 // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}}
53 #pragma omp simd foo bar
54   for (i = 0; i < 16; ++i)
55     ;
56 }
57 
test_non_identifiers()58 void test_non_identifiers() {
59   int i, x;
60 
61 // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}}
62 #pragma omp simd;
63   for (i = 0; i < 16; ++i)
64     ;
65 // expected-error@+2 {{unexpected OpenMP clause 'firstprivate' in directive '#pragma omp simd'}}
66 // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}}
67 #pragma omp simd firstprivate(x);
68   for (i = 0; i < 16; ++i)
69     ;
70 
71 // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}}
72 #pragma omp simd private(x);
73   for (i = 0; i < 16; ++i)
74     ;
75 
76 // expected-warning@+1 {{extra tokens at the end of '#pragma omp simd' are ignored}}
77 #pragma omp simd, private(x);
78   for (i = 0; i < 16; ++i)
79     ;
80 }
81 
82 extern int foo();
test_safelen()83 void test_safelen() {
84   int i;
85 // expected-error@+1 {{expected '('}}
86 #pragma omp simd safelen
87   for (i = 0; i < 16; ++i)
88     ;
89 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
90 #pragma omp simd safelen(
91   for (i = 0; i < 16; ++i)
92     ;
93 // expected-error@+1 {{expected expression}}
94 #pragma omp simd safelen()
95   for (i = 0; i < 16; ++i)
96     ;
97 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
98 #pragma omp simd safelen(,
99   for (i = 0; i < 16; ++i)
100     ;
101 // expected-error@+1 {{expected expression}}  expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
102 #pragma omp simd safelen(, )
103   for (i = 0; i < 16; ++i)
104     ;
105 // expected-warning@+2 {{extra tokens at the end of '#pragma omp simd' are ignored}}
106 // expected-error@+1 {{expected '('}}
107 #pragma omp simd safelen 4)
108   for (i = 0; i < 16; ++i)
109     ;
110 // expected-error@+2 {{expected ')'}}
111 // expected-note@+1 {{to match this '('}}
112 #pragma omp simd safelen(4
113   for (i = 0; i < 16; ++i)
114     ;
115 // expected-error@+2 {{expected ')'}}
116 // expected-note@+1 {{to match this '('}}
117 #pragma omp simd safelen(4,
118   for (i = 0; i < 16; ++i)
119     ;
120 // expected-error@+2 {{expected ')'}}
121 // expected-note@+1 {{to match this '('}}
122 #pragma omp simd safelen(4, )
123   for (i = 0; i < 16; ++i)
124     ;
125 // xxpected-error@+1 {{expected expression}}
126 #pragma omp simd safelen(4)
127   for (i = 0; i < 16; ++i)
128     ;
129 // expected-error@+2 {{expected ')'}}
130 // expected-note@+1 {{to match this '('}}
131 #pragma omp simd safelen(4 4)
132   for (i = 0; i < 16; ++i)
133     ;
134 // expected-error@+2 {{expected ')'}}
135 // expected-note@+1 {{to match this '('}}
136 #pragma omp simd safelen(4, , 4)
137   for (i = 0; i < 16; ++i)
138     ;
139 #pragma omp simd safelen(4)
140   for (i = 0; i < 16; ++i)
141     ;
142 // expected-error@+2 {{expected ')'}}
143 // expected-note@+1 {{to match this '('}}
144 #pragma omp simd safelen(4, 8)
145   for (i = 0; i < 16; ++i)
146     ;
147 // expected-error@+1 {{expression is not an integer constant expression}}
148 #pragma omp simd safelen(2.5)
149   for (i = 0; i < 16; ++i)
150     ;
151 // expected-error@+1 {{expression is not an integer constant expression}}
152 #pragma omp simd safelen(foo())
153   for (i = 0; i < 16; ++i)
154     ;
155 // expected-error@+1 {{argument to 'safelen' clause must be a positive integer value}}
156 #pragma omp simd safelen(-5)
157   for (i = 0; i < 16; ++i)
158     ;
159 // expected-error@+1 {{argument to 'safelen' clause must be a positive integer value}}
160 #pragma omp simd safelen(0)
161   for (i = 0; i < 16; ++i)
162     ;
163 // expected-error@+1 {{argument to 'safelen' clause must be a positive integer value}}
164 #pragma omp simd safelen(5 - 5)
165   for (i = 0; i < 16; ++i)
166     ;
167 }
168 
test_collapse()169 void test_collapse() {
170   int i;
171 // expected-error@+1 {{expected '('}}
172 #pragma omp simd collapse
173   for (i = 0; i < 16; ++i)
174     ;
175 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
176 #pragma omp simd collapse(
177   for (i = 0; i < 16; ++i)
178     ;
179 // expected-error@+1 {{expected expression}}
180 #pragma omp simd collapse()
181   for (i = 0; i < 16; ++i)
182     ;
183 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
184 #pragma omp simd collapse(,
185   for (i = 0; i < 16; ++i)
186     ;
187 // expected-error@+1 {{expected expression}}  expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
188 #pragma omp simd collapse(, )
189   for (i = 0; i < 16; ++i)
190     ;
191 // expected-warning@+2 {{extra tokens at the end of '#pragma omp simd' are ignored}}
192 // expected-error@+1 {{expected '('}}
193 #pragma omp simd collapse 4)
194   for (i = 0; i < 16; ++i)
195     ;
196 // expected-error@+2 {{expected ')'}}
197 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
198 #pragma omp simd collapse(4
199   for (i = 0; i < 16; ++i)
200     ; // expected-error {{expected 4 for loops after '#pragma omp simd', but found only 1}}
201 // expected-error@+2 {{expected ')'}}
202 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
203 #pragma omp simd collapse(4,
204   for (i = 0; i < 16; ++i)
205     ; // expected-error {{expected 4 for loops after '#pragma omp simd', but found only 1}}
206 // expected-error@+2 {{expected ')'}}
207 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
208 #pragma omp simd collapse(4, )
209   for (i = 0; i < 16; ++i)
210     ; // expected-error {{expected 4 for loops after '#pragma omp simd', but found only 1}}
211 // xxpected-error@+1 {{expected expression}} expected-note@+1 {{as specified in 'collapse' clause}}
212 #pragma omp simd collapse(4)
213   for (i = 0; i < 16; ++i)
214     ; // expected-error {{expected 4 for loops after '#pragma omp simd', but found only 1}}
215 // expected-error@+2 {{expected ')'}}
216 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
217 #pragma omp simd collapse(4 4)
218   for (i = 0; i < 16; ++i)
219     ; // expected-error {{expected 4 for loops after '#pragma omp simd', but found only 1}}
220 // expected-error@+2 {{expected ')'}}
221 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
222 #pragma omp simd collapse(4, , 4)
223   for (i = 0; i < 16; ++i)
224     ; // expected-error {{expected 4 for loops after '#pragma omp simd', but found only 1}}
225 #pragma omp simd collapse(4)
226   for (int i1 = 0; i1 < 16; ++i1)
227     for (int i2 = 0; i2 < 16; ++i2)
228       for (int i3 = 0; i3 < 16; ++i3)
229         for (int i4 = 0; i4 < 16; ++i4)
230           foo();
231 // expected-error@+2 {{expected ')'}}
232 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
233 #pragma omp simd collapse(4, 8)
234   for (i = 0; i < 16; ++i)
235     ; // expected-error {{expected 4 for loops after '#pragma omp simd', but found only 1}}
236 // expected-error@+1 {{expression is not an integer constant expression}}
237 #pragma omp simd collapse(2.5)
238   for (i = 0; i < 16; ++i)
239     ;
240 // expected-error@+1 {{expression is not an integer constant expression}}
241 #pragma omp simd collapse(foo())
242   for (i = 0; i < 16; ++i)
243     ;
244 // expected-error@+1 {{argument to 'collapse' clause must be a positive integer value}}
245 #pragma omp simd collapse(-5)
246   for (i = 0; i < 16; ++i)
247     ;
248 // expected-error@+1 {{argument to 'collapse' clause must be a positive integer value}}
249 #pragma omp simd collapse(0)
250   for (i = 0; i < 16; ++i)
251     ;
252 // expected-error@+1 {{argument to 'collapse' clause must be a positive integer value}}
253 #pragma omp simd collapse(5 - 5)
254   for (i = 0; i < 16; ++i)
255     ;
256 // expected-note@+2 {{defined as reduction}}
257 #pragma omp parallel
258 #pragma omp simd collapse(2) reduction(+ : i)
259   for (i = 0; i < 16; ++i)
260     // 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?}}
261     for (int j = 0; j < 16; ++j)
262 // expected-error@+3 {{reduction variable must be shared}}
263 // expected-error@+2 {{private variable cannot be reduction}}
264 // expected-error@+1 {{OpenMP constructs may not be nested inside a simd region}}
265 #pragma omp for reduction(+ : i, j)
266       for (int k = 0; k < 16; ++k)
267         i += j;
268 }
269 
test_linear()270 void test_linear() {
271   int i;
272 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
273 #pragma omp simd linear(
274   for (i = 0; i < 16; ++i)
275     ;
276 // expected-error@+2 {{expected expression}}
277 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
278 #pragma omp simd linear(,
279   for (i = 0; i < 16; ++i)
280     ;
281 // expected-error@+2 {{expected expression}}
282 // expected-error@+1 {{expected expression}}
283 #pragma omp simd linear(, )
284   for (i = 0; i < 16; ++i)
285     ;
286 // expected-error@+1 {{expected expression}}
287 #pragma omp simd linear()
288   for (i = 0; i < 16; ++i)
289     ;
290 // expected-error@+1 {{expected expression}}
291 #pragma omp simd linear(int)
292   for (i = 0; i < 16; ++i)
293     ;
294 // expected-error@+1 {{expected variable name}}
295 #pragma omp simd linear(0)
296   for (i = 0; i < 16; ++i)
297     ;
298 // expected-error@+1 {{use of undeclared identifier 'x'}}
299 #pragma omp simd linear(x)
300   for (i = 0; i < 16; ++i)
301     ;
302 // expected-error@+2 {{use of undeclared identifier 'x'}}
303 // expected-error@+1 {{use of undeclared identifier 'y'}}
304 #pragma omp simd linear(x, y)
305   for (i = 0; i < 16; ++i)
306     ;
307 // expected-error@+3 {{use of undeclared identifier 'x'}}
308 // expected-error@+2 {{use of undeclared identifier 'y'}}
309 // expected-error@+1 {{use of undeclared identifier 'z'}}
310 #pragma omp simd linear(x, y, z)
311   for (i = 0; i < 16; ++i)
312     ;
313 
314   int x, y;
315 // expected-error@+1 {{expected expression}}
316 #pragma omp simd linear(x :)
317   for (i = 0; i < 16; ++i)
318     ;
319 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
320 #pragma omp simd linear(x :, )
321   for (i = 0; i < 16; ++i)
322     ;
323 #pragma omp simd linear(x : 1)
324   for (i = 0; i < 16; ++i)
325     ;
326 #pragma omp simd linear(x : 2 * 2)
327   for (i = 0; i < 16; ++i)
328     ;
329 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
330 #pragma omp simd linear(x : 1, y)
331   for (i = 0; i < 16; ++i)
332     ;
333 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
334 #pragma omp simd linear(x : 1, y, z : 1)
335   for (i = 0; i < 16; ++i)
336     ;
337 
338 // expected-note@+2 {{defined as linear}}
339 // expected-error@+1 {{linear variable cannot be linear}}
340 #pragma omp simd linear(x) linear(x)
341   for (i = 0; i < 16; ++i)
342     ;
343 
344 // expected-note@+2 {{defined as private}}
345 // expected-error@+1 {{private variable cannot be linear}}
346 #pragma omp simd private(x) linear(x)
347   for (i = 0; i < 16; ++i)
348     ;
349 
350 // expected-note@+2 {{defined as linear}}
351 // expected-error@+1 {{linear variable cannot be private}}
352 #pragma omp simd linear(x) private(x)
353   for (i = 0; i < 16; ++i)
354     ;
355 
356 // expected-warning@+1 {{zero linear step (x and other variables in clause should probably be const)}}
357 #pragma omp simd linear(x, y : 0)
358   for (i = 0; i < 16; ++i)
359     ;
360 
361 // expected-note@+2 {{defined as linear}}
362 // expected-error@+1 {{linear variable cannot be lastprivate}}
363 #pragma omp simd linear(x) lastprivate(x)
364   for (i = 0; i < 16; ++i)
365     ;
366 
367 // expected-note@+2 {{defined as lastprivate}}
368 // expected-error@+1 {{lastprivate variable cannot be linear}}
369 #pragma omp simd lastprivate(x) linear(x)
370   for (i = 0; i < 16; ++i)
371     ;
372 }
373 
test_aligned()374 void test_aligned() {
375   int i;
376 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
377 #pragma omp simd aligned(
378   for (i = 0; i < 16; ++i)
379     ;
380 // expected-error@+2 {{expected expression}}
381 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
382 #pragma omp simd aligned(,
383   for (i = 0; i < 16; ++i)
384     ;
385 // expected-error@+2 {{expected expression}}
386 // expected-error@+1 {{expected expression}}
387 #pragma omp simd aligned(, )
388   for (i = 0; i < 16; ++i)
389     ;
390 // expected-error@+1 {{expected expression}}
391 #pragma omp simd aligned()
392   for (i = 0; i < 16; ++i)
393     ;
394 // expected-error@+1 {{expected expression}}
395 #pragma omp simd aligned(int)
396   for (i = 0; i < 16; ++i)
397     ;
398 // expected-error@+1 {{expected variable name}}
399 #pragma omp simd aligned(0)
400   for (i = 0; i < 16; ++i)
401     ;
402 // expected-error@+1 {{use of undeclared identifier 'x'}}
403 #pragma omp simd aligned(x)
404   for (i = 0; i < 16; ++i)
405     ;
406 // expected-error@+2 {{use of undeclared identifier 'x'}}
407 // expected-error@+1 {{use of undeclared identifier 'y'}}
408 #pragma omp simd aligned(x, y)
409   for (i = 0; i < 16; ++i)
410     ;
411 // expected-error@+3 {{use of undeclared identifier 'x'}}
412 // expected-error@+2 {{use of undeclared identifier 'y'}}
413 // expected-error@+1 {{use of undeclared identifier 'z'}}
414 #pragma omp simd aligned(x, y, z)
415   for (i = 0; i < 16; ++i)
416     ;
417 
418   int *x, y, z[25]; // expected-note 4 {{'y' defined here}}
419 #pragma omp simd aligned(x)
420   for (i = 0; i < 16; ++i)
421     ;
422 #pragma omp simd aligned(z)
423   for (i = 0; i < 16; ++i)
424     ;
425 // expected-error@+1 {{expected expression}}
426 #pragma omp simd aligned(x :)
427   for (i = 0; i < 16; ++i)
428     ;
429 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
430 #pragma omp simd aligned(x :, )
431   for (i = 0; i < 16; ++i)
432     ;
433 #pragma omp simd aligned(x : 1)
434   for (i = 0; i < 16; ++i)
435     ;
436 #pragma omp simd aligned(x : 2 * 2)
437   for (i = 0; i < 16; ++i)
438     ;
439 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
440 #pragma omp simd aligned(x : 1, y)
441   for (i = 0; i < 16; ++i)
442     ;
443 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
444 #pragma omp simd aligned(x : 1, y, z : 1)
445   for (i = 0; i < 16; ++i)
446     ;
447 
448 // expected-error@+1 {{argument of aligned clause should be array or pointer, not 'int'}}
449 #pragma omp simd aligned(x, y)
450   for (i = 0; i < 16; ++i)
451     ;
452 // expected-error@+1 {{argument of aligned clause should be array or pointer, not 'int'}}
453 #pragma omp simd aligned(x, y, z)
454   for (i = 0; i < 16; ++i)
455     ;
456 
457 // expected-note@+2 {{defined as aligned}}
458 // expected-error@+1 {{a variable cannot appear in more than one aligned clause}}
459 #pragma omp simd aligned(x) aligned(z, x)
460   for (i = 0; i < 16; ++i)
461     ;
462 
463 // expected-note@+3 {{defined as aligned}}
464 // expected-error@+2 {{a variable cannot appear in more than one aligned clause}}
465 // expected-error@+1 2 {{argument of aligned clause should be array or pointer, not 'int'}}
466 #pragma omp simd aligned(x, y, z) aligned(y, z)
467   for (i = 0; i < 16; ++i)
468     ;
469 }
470 
test_private()471 void test_private() {
472   int i;
473 // expected-error@+2 {{expected expression}}
474 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
475 #pragma omp simd private(
476   for (i = 0; i < 16; ++i)
477     ;
478 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
479 // expected-error@+1 2 {{expected expression}}
480 #pragma omp simd private(,
481   for (i = 0; i < 16; ++i)
482     ;
483 // expected-error@+1 2 {{expected expression}}
484 #pragma omp simd private(, )
485   for (i = 0; i < 16; ++i)
486     ;
487 // expected-error@+1 {{expected expression}}
488 #pragma omp simd private()
489   for (i = 0; i < 16; ++i)
490     ;
491 // expected-error@+1 {{expected expression}}
492 #pragma omp simd private(int)
493   for (i = 0; i < 16; ++i)
494     ;
495 // expected-error@+1 {{expected variable name}}
496 #pragma omp simd private(0)
497   for (i = 0; i < 16; ++i)
498     ;
499 
500   int x, y, z;
501 #pragma omp simd private(x)
502   for (i = 0; i < 16; ++i)
503     ;
504 #pragma omp simd private(x, y)
505   for (i = 0; i < 16; ++i)
506     ;
507 #pragma omp simd private(x, y, z)
508   for (i = 0; i < 16; ++i) {
509     x = y * i + z;
510   }
511 }
512 
test_firstprivate()513 void test_firstprivate() {
514   int i;
515 // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}}
516 // expected-error@+2 {{unexpected OpenMP clause 'firstprivate' in directive '#pragma omp simd'}}
517 // expected-error@+1 {{expected expression}}
518 #pragma omp simd firstprivate(
519   for (i = 0; i < 16; ++i)
520     ;
521 }
522 
test_lastprivate()523 void test_lastprivate() {
524   int i;
525 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
526 // expected-error@+1 {{expected expression}}
527 #pragma omp simd lastprivate(
528   for (i = 0; i < 16; ++i)
529     ;
530 
531 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
532 // expected-error@+1 2 {{expected expression}}
533 #pragma omp simd lastprivate(,
534   for (i = 0; i < 16; ++i)
535     ;
536 // expected-error@+1 2 {{expected expression}}
537 #pragma omp simd lastprivate(, )
538   for (i = 0; i < 16; ++i)
539     ;
540 // expected-error@+1 {{expected expression}}
541 #pragma omp simd lastprivate()
542   for (i = 0; i < 16; ++i)
543     ;
544 // expected-error@+1 {{expected expression}}
545 #pragma omp simd lastprivate(int)
546   for (i = 0; i < 16; ++i)
547     ;
548 // expected-error@+1 {{expected variable name}}
549 #pragma omp simd lastprivate(0)
550   for (i = 0; i < 16; ++i)
551     ;
552 
553   int x, y, z;
554 #pragma omp simd lastprivate(x)
555   for (i = 0; i < 16; ++i)
556     ;
557 #pragma omp simd lastprivate(x, y)
558   for (i = 0; i < 16; ++i)
559     ;
560 #pragma omp simd lastprivate(x, y, z)
561   for (i = 0; i < 16; ++i)
562     ;
563 }
564 
test_reduction()565 void test_reduction() {
566   int i, x, y;
567 // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}}
568 // expected-error@+2 {{expected identifier}}
569 // expected-warning@+1 {{missing ':' after reduction identifier - ignoring}}
570 #pragma omp simd reduction(
571   for (i = 0; i < 16; ++i)
572     ;
573 // expected-error@+2 {{expected identifier}}
574 // expected-warning@+1 {{missing ':' after reduction identifier - ignoring}}
575 #pragma omp simd reduction()
576   for (i = 0; i < 16; ++i)
577     ;
578 // expected-error@+2 {{expected expression}}
579 // expected-warning@+1 {{missing ':' after reduction identifier - ignoring}}
580 #pragma omp simd reduction(x)
581   for (i = 0; i < 16; ++i)
582     ;
583 // expected-error@+1 {{expected identifier}}
584 #pragma omp simd reduction( : x)
585   for (i = 0; i < 16; ++i)
586     ;
587 // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}}
588 // expected-error@+2 {{expected identifier}}
589 // expected-warning@+1 {{missing ':' after reduction identifier - ignoring}}
590 #pragma omp simd reduction(,
591   for (i = 0; i < 16; ++i)
592     ;
593 // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}}
594 // expected-error@+2 {{expected expression}}
595 // expected-warning@+1 {{missing ':' after reduction identifier - ignoring}}
596 #pragma omp simd reduction(+
597   for (i = 0; i < 16; ++i)
598     ;
599 
600 // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}}
601 //
602 // expected-error@+1 {{expected expression}}
603 #pragma omp simd reduction(+:
604   for (i = 0; i < 16; ++i)
605     ;
606 // expected-error@+1 {{expected expression}}
607 #pragma omp simd reduction(+ :)
608   for (i = 0; i < 16; ++i)
609     ;
610 // expected-error@+1 {{expected expression}}
611 #pragma omp simd reduction(+ :, y)
612   for (i = 0; i < 16; ++i)
613     ;
614 // expected-error@+1 {{expected expression}}
615 #pragma omp simd reduction(+ : x, + : y)
616   for (i = 0; i < 16; ++i)
617     ;
618 // expected-error@+1 {{expected identifier}}
619 #pragma omp simd reduction(% : x)
620   for (i = 0; i < 16; ++i)
621     ;
622 
623 #pragma omp simd reduction(+ : x)
624   for (i = 0; i < 16; ++i)
625     ;
626 #pragma omp simd reduction(* : x)
627   for (i = 0; i < 16; ++i)
628     ;
629 #pragma omp simd reduction(- : x)
630   for (i = 0; i < 16; ++i)
631     ;
632 #pragma omp simd reduction(& : x)
633   for (i = 0; i < 16; ++i)
634     ;
635 #pragma omp simd reduction(| : x)
636   for (i = 0; i < 16; ++i)
637     ;
638 #pragma omp simd reduction(^ : x)
639   for (i = 0; i < 16; ++i)
640     ;
641 #pragma omp simd reduction(&& : x)
642   for (i = 0; i < 16; ++i)
643     ;
644 #pragma omp simd reduction(|| : x)
645   for (i = 0; i < 16; ++i)
646     ;
647 #pragma omp simd reduction(max : x)
648   for (i = 0; i < 16; ++i)
649     ;
650 #pragma omp simd reduction(min : x)
651   for (i = 0; i < 16; ++i)
652     ;
653   struct X {
654     int x;
655   };
656   struct X X;
657 // expected-error@+1 {{expected variable name}}
658 #pragma omp simd reduction(+ : X.x)
659   for (i = 0; i < 16; ++i)
660     ;
661 // expected-error@+1 {{expected variable name}}
662 #pragma omp simd reduction(+ : x + x)
663   for (i = 0; i < 16; ++i)
664     ;
665 }
666 
test_loop_messages()667 void test_loop_messages() {
668   float a[100], b[100], c[100];
669 // expected-error@+2 {{variable must be of integer or pointer type}}
670 #pragma omp simd
671   for (float fi = 0; fi < 10.0; fi++) {
672     c[(int)fi] = a[(int)fi] + b[(int)fi];
673   }
674 // expected-error@+2 {{variable must be of integer or pointer type}}
675 #pragma omp simd
676   for (double fi = 0; fi < 10.0; fi++) {
677     c[(int)fi] = a[(int)fi] + b[(int)fi];
678   }
679 }
680 
681