1 // RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s
2 
3 void bar();
4 
5 template <class T>
6 void foo() {
7   T a = T();
8 // PARALLEL DIRECTIVE
9 #pragma omp parallel
10 #pragma omp for
11   for (int i = 0; i < 10; ++i)
12     ;
13 #pragma omp parallel
14 #pragma omp simd
15   for (int i = 0; i < 10; ++i)
16     ;
17 #pragma omp parallel
18 #pragma omp for simd
19   for (int i = 0; i < 10; ++i)
20     ;
21 #pragma omp parallel
22 #pragma omp sections
23   {
24     bar();
25   }
26 #pragma omp parallel
27 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}}
28   {
29     bar();
30   }
31 #pragma omp parallel
32 #pragma omp single
33   bar();
34 
35 #pragma omp parallel
36 #pragma omp master
37   {
38     bar();
39   }
40 #pragma omp parallel
41 #pragma omp critical
42   {
43     bar();
44   }
45 #pragma omp parallel
46 #pragma omp parallel for
47   for (int i = 0; i < 10; ++i)
48     ;
49 #pragma omp parallel
50 #pragma omp parallel for simd
51   for (int i = 0; i < 10; ++i)
52     ;
53 #pragma omp parallel
54 #pragma omp parallel sections
55   {
56     bar();
57   }
58 #pragma omp parallel
59 #pragma omp task
60   {
61     bar();
62   }
63 #pragma omp parallel
64   {
65 #pragma omp taskyield
66     bar();
67   }
68 #pragma omp parallel
69   {
70 #pragma omp barrier
71     bar();
72   }
73 #pragma omp parallel
74   {
75 #pragma omp taskwait
76     bar();
77   }
78 #pragma omp parallel
79   {
80 #pragma omp flush
81     bar();
82   }
83 #pragma omp parallel
84   {
85 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
86     bar();
87   }
88 #pragma omp parallel
89   {
90 #pragma omp atomic
91     ++a;
92   }
93 #pragma omp parallel
94   {
95 #pragma omp target
96     ++a;
97   }
98 #pragma omp parallel
99   {
100 #pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
101     ++a;
102   }
103 #pragma omp parallel
104   {
105 #pragma omp taskloop
106   for (int i = 0; i < 10; ++i)
107     ++a;
108   }
109 #pragma omp parallel
110   {
111 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
112     for (int i = 0; i < 10; ++i)
113       ;
114   }
115 
116 // SIMD DIRECTIVE
117 #pragma omp simd
118   for (int i = 0; i < 10; ++i) {
119 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
120     for (int i = 0; i < 10; ++i)
121       ;
122   }
123 #pragma omp simd
124   for (int i = 0; i < 10; ++i) {
125 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
126     for (int i = 0; i < 10; ++i)
127       ;
128   }
129 #pragma omp simd
130   for (int i = 0; i < 10; ++i) {
131 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
132     for (int i = 0; i < 10; ++i)
133       ;
134   }
135 #pragma omp simd
136   for (int i = 0; i < 10; ++i) {
137 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
138     for (int i = 0; i < 10; ++i)
139       ;
140   }
141 #pragma omp simd
142   for (int i = 0; i < 10; ++i) {
143 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
144     {
145       bar();
146     }
147   }
148 #pragma omp simd
149   for (int i = 0; i < 10; ++i) {
150 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
151     {
152       bar();
153     }
154   }
155 #pragma omp simd
156   for (int i = 0; i < 10; ++i) {
157 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
158     {
159       bar();
160     }
161   }
162 #pragma omp simd
163   for (int i = 0; i < 10; ++i) {
164 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}
165     {
166       bar();
167     }
168   }
169 #pragma omp simd
170   for (int i = 0; i < 10; ++i) {
171 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}
172     {
173       bar();
174     }
175   }
176 #pragma omp simd
177   for (int i = 0; i < 10; ++i) {
178 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
179     for (int i = 0; i < 10; ++i)
180       ;
181   }
182 #pragma omp simd
183   for (int i = 0; i < 10; ++i) {
184 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
185     for (int i = 0; i < 10; ++i)
186       ;
187   }
188 #pragma omp simd
189   for (int i = 0; i < 10; ++i) {
190 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
191     {
192       bar();
193     }
194   }
195 #pragma omp simd
196   for (int i = 0; i < 10; ++i) {
197 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}
198     {
199       bar();
200     }
201   }
202 #pragma omp simd
203   for (int i = 0; i < 10; ++i) {
204 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}
205     bar();
206   }
207 #pragma omp simd
208   for (int i = 0; i < 10; ++i) {
209 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}
210     bar();
211   }
212 #pragma omp simd
213   for (int i = 0; i < 10; ++i) {
214 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
215     bar();
216   }
217 #pragma omp simd
218   for (int i = 0; i < 10; ++i) {
219 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}
220     bar();
221   }
222 #pragma omp simd
223   for (int i = 0; i < 10; ++i) {
224 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
225     bar();
226   }
227 #pragma omp simd
228   for (int i = 0; i < 10; ++i) {
229 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}
230     ++a;
231   }
232 #pragma omp simd
233   for (int i = 0; i < 10; ++i) {
234 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}}
235     ++a;
236   }
237 #pragma omp simd
238   for (int i = 0; i < 10; ++i) {
239 #pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}}
240     ++a;
241   }
242 #pragma omp simd
243   for (int i = 0; i < 10; ++i) {
244 #pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside a simd region}}
245   for (int i = 0; i < 10; ++i)
246     ++a;
247   }
248 #pragma omp simd
249   for (int i = 0; i < 10; ++i) {
250 #pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}}
251     for (int j = 0; j < 10; ++j)
252       ;
253   }
254 
255 // FOR DIRECTIVE
256 #pragma omp for
257   for (int i = 0; i < 10; ++i) {
258 #pragma omp for // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
259     for (int i = 0; i < 10; ++i)
260       ;
261   }
262 #pragma omp for
263   for (int i = 0; i < 10; ++i) {
264 #pragma omp simd
265     for (int i = 0; i < 10; ++i)
266       ;
267   }
268 #pragma omp for
269   for (int i = 0; i < 10; ++i) {
270 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
271     for (int i = 0; i < 10; ++i)
272       ;
273   }
274 #pragma omp for
275   for (int i = 0; i < 10; ++i) {
276 #pragma omp parallel
277     for (int i = 0; i < 10; ++i)
278       ;
279   }
280 #pragma omp for
281   for (int i = 0; i < 10; ++i) {
282 #pragma omp sections // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
283     {
284       bar();
285     }
286   }
287 #pragma omp for
288   for (int i = 0; i < 10; ++i) {
289 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}}
290     {
291       bar();
292     }
293   }
294 #pragma omp for
295   for (int i = 0; i < 10; ++i) {
296 #pragma omp single // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
297     {
298       bar();
299     }
300   }
301 
302 #pragma omp for
303   for (int i = 0; i < 10; ++i) {
304 #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}}
305     {
306       bar();
307     }
308   }
309 #pragma omp for
310   for (int i = 0; i < 10; ++i) {
311 #pragma omp critical
312     {
313       bar();
314     }
315   }
316 #pragma omp for
317   for (int i = 0; i < 10; ++i) {
318 #pragma omp parallel
319     {
320 #pragma omp single // OK
321       {
322         bar();
323       }
324 #pragma omp for // OK
325       for (int i = 0; i < 10; ++i)
326         ;
327 #pragma omp sections // OK
328       {
329         bar();
330       }
331     }
332   }
333 #pragma omp for
334   for (int i = 0; i < 10; ++i) {
335 #pragma omp parallel for
336     for (int i = 0; i < 10; ++i)
337       ;
338   }
339 #pragma omp for
340   for (int i = 0; i < 10; ++i) {
341 #pragma omp parallel for simd
342     for (int i = 0; i < 10; ++i)
343       ;
344   }
345 #pragma omp for
346   for (int i = 0; i < 10; ++i) {
347 #pragma omp parallel sections
348     {
349       bar();
350     }
351   }
352 #pragma omp for
353   for (int i = 0; i < 10; ++i) {
354 #pragma omp task
355     {
356       bar();
357     }
358   }
359 #pragma omp for
360   for (int i = 0; i < 10; ++i) {
361 #pragma omp taskyield
362     bar();
363   }
364 #pragma omp for
365   for (int i = 0; i < 10; ++i) {
366 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'for' region}}
367     bar();
368   }
369 #pragma omp for
370   for (int i = 0; i < 10; ++i) {
371 #pragma omp taskwait
372     bar();
373   }
374 #pragma omp for
375   for (int i = 0; i < 10; ++i) {
376 #pragma omp flush
377     bar();
378   }
379 #pragma omp for
380   for (int i = 0; i < 10; ++i) {
381 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
382     bar();
383   }
384 #pragma omp for ordered
385   for (int i = 0; i < 10; ++i) {
386 #pragma omp ordered // OK
387     bar();
388   }
389 #pragma omp for
390   for (int i = 0; i < 10; ++i) {
391 #pragma omp atomic
392     ++a;
393   }
394 #pragma omp for
395   for (int i = 0; i < 10; ++i) {
396 #pragma omp target
397     ++a;
398   }
399 #pragma omp for
400   for (int i = 0; i < 10; ++i) {
401 #pragma omp teams // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
402     ++a;
403   }
404 #pragma omp for
405   for (int i = 0; i < 10; ++i) {
406 #pragma omp taskloop
407   for (int i = 0; i < 10; ++i)
408     ++a;
409   }
410 #pragma omp for
411   for (int i = 0; i < 10; ++i) {
412 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
413     for (int j = 0; j < 10; ++j)
414       ;
415   }
416 
417 // FOR SIMD DIRECTIVE
418 #pragma omp for simd
419   for (int i = 0; i < 10; ++i) {
420 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
421     for (int i = 0; i < 10; ++i)
422       ;
423   }
424 #pragma omp for simd
425   for (int i = 0; i < 10; ++i) {
426 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
427     for (int i = 0; i < 10; ++i)
428       ;
429   }
430 #pragma omp for simd
431   for (int i = 0; i < 10; ++i) {
432 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
433     for (int i = 0; i < 10; ++i)
434       ;
435   }
436 #pragma omp for simd
437   for (int i = 0; i < 10; ++i) {
438 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
439     for (int i = 0; i < 10; ++i)
440       ;
441   }
442 #pragma omp for simd
443   for (int i = 0; i < 10; ++i) {
444 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
445     {
446       bar();
447     }
448   }
449 #pragma omp for simd
450   for (int i = 0; i < 10; ++i) {
451 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
452     {
453       bar();
454     }
455   }
456 #pragma omp for simd
457   for (int i = 0; i < 10; ++i) {
458 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
459     {
460       bar();
461     }
462   }
463 #pragma omp for simd
464   for (int i = 0; i < 10; ++i) {
465 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}
466     {
467       bar();
468     }
469   }
470 #pragma omp for simd
471   for (int i = 0; i < 10; ++i) {
472 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}
473     {
474       bar();
475     }
476   }
477 #pragma omp for simd
478   for (int i = 0; i < 10; ++i) {
479 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
480     for (int i = 0; i < 10; ++i)
481       ;
482   }
483 #pragma omp for simd
484   for (int i = 0; i < 10; ++i) {
485 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
486     for (int i = 0; i < 10; ++i)
487       ;
488   }
489 #pragma omp for simd
490   for (int i = 0; i < 10; ++i) {
491 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
492     {
493       bar();
494     }
495   }
496 #pragma omp for simd
497   for (int i = 0; i < 10; ++i) {
498 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}
499     {
500       bar();
501     }
502   }
503 #pragma omp for simd
504   for (int i = 0; i < 10; ++i) {
505 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}
506     bar();
507   }
508 #pragma omp for simd
509   for (int i = 0; i < 10; ++i) {
510 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}
511     bar();
512   }
513 #pragma omp for simd
514   for (int i = 0; i < 10; ++i) {
515 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
516     bar();
517   }
518 #pragma omp for simd
519   for (int i = 0; i < 10; ++i) {
520 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}
521     bar();
522   }
523 #pragma omp for simd
524   for (int i = 0; i < 10; ++i) {
525 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
526     bar();
527   }
528 #pragma omp for simd
529   for (int i = 0; i < 10; ++i) {
530 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}
531     ++a;
532   }
533 #pragma omp for simd
534   for (int i = 0; i < 10; ++i) {
535 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}}
536     ++a;
537   }
538 #pragma omp for simd
539   for (int i = 0; i < 10; ++i) {
540 #pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}}
541     ++a;
542   }
543 #pragma omp for simd
544   for (int i = 0; i < 10; ++i) {
545 #pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside a simd region}}
546   for (int i = 0; i < 10; ++i)
547     ++a;
548   }
549 #pragma omp for simd
550   for (int i = 0; i < 10; ++i) {
551 #pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}}
552     for (int j = 0; j < 10; ++j)
553       ;
554   }
555 
556 // SECTIONS DIRECTIVE
557 #pragma omp sections
558   {
559 #pragma omp for // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
560     for (int i = 0; i < 10; ++i)
561       ;
562   }
563 #pragma omp sections
564   {
565 #pragma omp simd
566     for (int i = 0; i < 10; ++i)
567       ;
568   }
569 #pragma omp sections
570   {
571 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
572     for (int i = 0; i < 10; ++i)
573       ;
574   }
575 #pragma omp sections
576   {
577 #pragma omp parallel
578     for (int i = 0; i < 10; ++i)
579       ;
580   }
581 #pragma omp sections
582   {
583 #pragma omp sections // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
584     {
585       bar();
586     }
587   }
588 #pragma omp sections
589   {
590 #pragma omp section
591     {
592       bar();
593     }
594   }
595 #pragma omp sections
596   {
597 #pragma omp parallel
598     {
599 #pragma omp single // OK
600       {
601         bar();
602       }
603 #pragma omp for // OK
604       for (int i = 0; i < 10; ++i)
605         ;
606 #pragma omp sections // OK
607       {
608         bar();
609       }
610     }
611   }
612 #pragma omp sections
613   {
614 #pragma omp parallel
615     {
616 #pragma omp master // OK
617       {
618         bar();
619       }
620 #pragma omp for // OK
621       for (int i = 0; i < 10; ++i)
622         ;
623 #pragma omp master // OK
624       {
625         bar();
626       }
627     }
628 #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}}
629     bar();
630   }
631 #pragma omp sections
632   {
633 #pragma omp parallel
634     {
635 #pragma omp critical(A) // OK
636       {
637         bar();
638       }
639 #pragma omp for // OK
640       for (int i = 0; i < 10; ++i)
641         ;
642 #pragma omp critical // OK
643       {
644         bar();
645       }
646     }
647 #pragma omp critical(A) // expected-error {{statement in 'omp sections' directive must be enclosed into a section region}}
648     bar();
649   }
650 #pragma omp sections
651   {
652 #pragma omp parallel for
653     for (int i = 0; i < 10; ++i)
654       ;
655   }
656 #pragma omp sections
657   {
658 #pragma omp parallel for simd
659     for (int i = 0; i < 10; ++i)
660       ;
661   }
662 #pragma omp sections
663   {
664 #pragma omp parallel sections
665     {
666       bar();
667     }
668   }
669 #pragma omp sections
670   {
671 #pragma omp task
672     {
673       bar();
674     }
675   }
676 #pragma omp sections
677   {
678 #pragma omp taskyield
679   }
680 #pragma omp sections
681   {
682 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'sections' region}}
683   }
684 #pragma omp sections
685   {
686 #pragma omp taskwait
687   }
688 #pragma omp sections
689   {
690 #pragma omp flush
691   }
692 #pragma omp sections
693   {
694 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
695     bar();
696   }
697 #pragma omp sections
698   {
699 #pragma omp atomic
700     ++a;
701   }
702 #pragma omp sections
703   {
704 #pragma omp target
705     ++a;
706   }
707 #pragma omp sections
708   {
709 #pragma omp teams // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
710     ++a;
711   }
712 #pragma omp sections
713   {
714 #pragma omp taskloop
715   for (int i = 0; i < 10; ++i)
716     ++a;
717   }
718 #pragma omp sections
719   {
720 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
721     for (int i = 0; i < 10; ++i)
722       ;
723   }
724 
725 // SECTION DIRECTIVE
726 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}}
727   {
728     bar();
729   }
730 #pragma omp sections
731   {
732 #pragma omp section
733     {
734 #pragma omp for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
735       for (int i = 0; i < 10; ++i)
736         ;
737     }
738   }
739 #pragma omp sections
740   {
741 #pragma omp section
742     {
743 #pragma omp simd
744       for (int i = 0; i < 10; ++i)
745         ;
746     }
747   }
748 #pragma omp sections
749   {
750 #pragma omp section
751     {
752 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
753       for (int i = 0; i < 10; ++i)
754         ;
755     }
756   }
757 #pragma omp sections
758   {
759 #pragma omp section
760     {
761 #pragma omp parallel
762       for (int i = 0; i < 10; ++i)
763         ;
764     }
765   }
766 #pragma omp sections
767   {
768 #pragma omp section
769     {
770 #pragma omp sections // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
771       {
772         bar();
773       }
774     }
775   }
776 #pragma omp sections
777   {
778 #pragma omp section
779     {
780 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}}
781       {
782         bar();
783       }
784     }
785   }
786 #pragma omp sections
787   {
788 #pragma omp section
789     {
790 #pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
791       bar();
792 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
793       bar();
794 #pragma omp critical
795       bar();
796     }
797   }
798 #pragma omp sections
799   {
800 #pragma omp section
801     {
802 #pragma omp parallel
803       {
804 #pragma omp single // OK
805         {
806           bar();
807         }
808 #pragma omp for // OK
809         for (int i = 0; i < 10; ++i)
810           ;
811 #pragma omp for simd // OK
812         for (int i = 0; i < 10; ++i)
813           ;
814 #pragma omp sections // OK
815         {
816           bar();
817         }
818       }
819     }
820   }
821 #pragma omp sections
822   {
823 #pragma omp section
824     {
825 #pragma omp parallel for
826       for (int i = 0; i < 10; ++i)
827         ;
828     }
829   }
830 #pragma omp sections
831   {
832 #pragma omp section
833     {
834 #pragma omp parallel for simd
835       for (int i = 0; i < 10; ++i)
836         ;
837     }
838   }
839 #pragma omp sections
840   {
841 #pragma omp section
842     {
843 #pragma omp parallel sections
844       {
845         bar();
846       }
847     }
848   }
849 #pragma omp sections
850   {
851 #pragma omp section
852     {
853 #pragma omp task
854       {
855         bar();
856       }
857     }
858   }
859 #pragma omp sections
860   {
861 #pragma omp section
862     {
863 #pragma omp taskyield
864       bar();
865     }
866   }
867 #pragma omp sections
868   {
869 #pragma omp section
870     {
871 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}}
872       bar();
873     }
874   }
875 #pragma omp sections
876   {
877 #pragma omp section
878     {
879 #pragma omp taskwait
880       bar();
881     }
882   }
883 #pragma omp sections
884   {
885 #pragma omp section
886     {
887 #pragma omp flush
888       bar();
889     }
890   }
891 #pragma omp sections
892   {
893 #pragma omp section
894     {
895 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
896       bar();
897     }
898   }
899 #pragma omp sections
900   {
901 #pragma omp section
902 #pragma omp atomic
903     ++a;
904   }
905 #pragma omp sections
906   {
907 #pragma omp section
908 #pragma omp target
909     ++a;
910   }
911 #pragma omp sections
912   {
913 #pragma omp section
914 #pragma omp teams // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
915     ++a;
916   }
917 #pragma omp sections
918   {
919 #pragma omp section
920 #pragma omp taskloop
921   for (int i = 0; i < 10; ++i)
922     ++a;
923   }
924 #pragma omp sections
925   {
926 #pragma omp section
927 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
928     for (int i = 0; i < 10; ++i)
929       ;
930   }
931 
932 // SINGLE DIRECTIVE
933 #pragma omp single
934   {
935 #pragma omp for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
936     for (int i = 0; i < 10; ++i)
937       ;
938   }
939 #pragma omp single
940   {
941 #pragma omp simd
942     for (int i = 0; i < 10; ++i)
943       ;
944   }
945 #pragma omp single
946   {
947 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
948     for (int i = 0; i < 10; ++i)
949       ;
950   }
951 #pragma omp single
952   {
953 #pragma omp parallel
954     for (int i = 0; i < 10; ++i)
955       ;
956   }
957 #pragma omp single
958   {
959 #pragma omp single // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
960     {
961       bar();
962     }
963   }
964 #pragma omp single
965   {
966 #pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}}
967     {
968       bar();
969     }
970   }
971 #pragma omp single
972   {
973 #pragma omp critical
974     {
975       bar();
976     }
977   }
978 #pragma omp single
979   {
980 #pragma omp sections // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
981     {
982       bar();
983     }
984   }
985 #pragma omp single
986   {
987 #pragma omp parallel
988     {
989 #pragma omp single // OK
990       {
991         bar();
992       }
993 #pragma omp for // OK
994       for (int i = 0; i < 10; ++i)
995         ;
996 #pragma omp for simd // OK
997       for (int i = 0; i < 10; ++i)
998         ;
999 #pragma omp sections // OK
1000       {
1001         bar();
1002       }
1003     }
1004   }
1005 #pragma omp single
1006   {
1007 #pragma omp parallel for
1008     for (int i = 0; i < 10; ++i)
1009       ;
1010   }
1011 #pragma omp single
1012   {
1013 #pragma omp parallel for simd
1014     for (int i = 0; i < 10; ++i)
1015       ;
1016   }
1017 #pragma omp single
1018   {
1019 #pragma omp parallel sections
1020     {
1021       bar();
1022     }
1023   }
1024 #pragma omp single
1025   {
1026 #pragma omp task
1027     {
1028       bar();
1029     }
1030   }
1031 #pragma omp single
1032   {
1033 #pragma omp taskyield
1034     bar();
1035   }
1036 #pragma omp single
1037   {
1038 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}}
1039     bar();
1040   }
1041 #pragma omp single
1042   {
1043 #pragma omp taskwait
1044     bar();
1045   }
1046 #pragma omp single
1047   {
1048 #pragma omp flush
1049     bar();
1050   }
1051 #pragma omp single
1052   {
1053 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
1054     bar();
1055   }
1056 #pragma omp single
1057   {
1058 #pragma omp atomic
1059     ++a;
1060   }
1061 #pragma omp single
1062   {
1063 #pragma omp target
1064     ++a;
1065   }
1066 #pragma omp single
1067   {
1068 #pragma omp teams // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
1069     ++a;
1070   }
1071 #pragma omp single
1072   {
1073 #pragma omp taskloop
1074   for (int i = 0; i < 10; ++i)
1075     ++a;
1076   }
1077 #pragma omp single
1078   {
1079 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
1080     for (int i = 0; i < 10; ++i)
1081       ;
1082   }
1083 
1084 // MASTER DIRECTIVE
1085 #pragma omp master
1086   {
1087 #pragma omp for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
1088     for (int i = 0; i < 10; ++i)
1089       ;
1090   }
1091 #pragma omp master
1092   {
1093 #pragma omp simd
1094     for (int i = 0; i < 10; ++i)
1095       ;
1096   }
1097 #pragma omp master
1098   {
1099 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
1100     for (int i = 0; i < 10; ++i)
1101       ;
1102   }
1103 #pragma omp master
1104   {
1105 #pragma omp parallel
1106     for (int i = 0; i < 10; ++i)
1107       ;
1108   }
1109 #pragma omp master
1110   {
1111 #pragma omp single // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
1112     {
1113       bar();
1114     }
1115   }
1116 #pragma omp master
1117   {
1118 #pragma omp master // OK, though second 'master' is redundant
1119     {
1120       bar();
1121     }
1122   }
1123 #pragma omp master
1124   {
1125 #pragma omp critical
1126     {
1127       bar();
1128     }
1129   }
1130 #pragma omp master
1131   {
1132 #pragma omp sections // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
1133     {
1134       bar();
1135     }
1136   }
1137 #pragma omp master
1138   {
1139 #pragma omp parallel
1140     {
1141 #pragma omp master // OK
1142       {
1143         bar();
1144       }
1145 #pragma omp for // OK
1146       for (int i = 0; i < 10; ++i)
1147         ;
1148 #pragma omp for simd // OK
1149       for (int i = 0; i < 10; ++i)
1150         ;
1151 #pragma omp sections // OK
1152       {
1153         bar();
1154       }
1155     }
1156   }
1157 #pragma omp master
1158   {
1159 #pragma omp parallel for
1160     for (int i = 0; i < 10; ++i)
1161       ;
1162   }
1163 #pragma omp master
1164   {
1165 #pragma omp parallel for simd
1166     for (int i = 0; i < 10; ++i)
1167       ;
1168   }
1169 #pragma omp master
1170   {
1171 #pragma omp parallel sections
1172     {
1173       bar();
1174     }
1175   }
1176 #pragma omp master
1177   {
1178 #pragma omp task
1179     {
1180       bar();
1181     }
1182   }
1183 #pragma omp master
1184   {
1185 #pragma omp taskyield
1186     bar();
1187   }
1188 #pragma omp master
1189   {
1190 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}}
1191     bar();
1192   }
1193 #pragma omp master
1194   {
1195 #pragma omp taskwait
1196     bar();
1197   }
1198 #pragma omp master
1199   {
1200 #pragma omp flush
1201     bar();
1202   }
1203 #pragma omp master
1204   {
1205 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
1206     bar();
1207   }
1208 #pragma omp master
1209   {
1210 #pragma omp atomic
1211     ++a;
1212   }
1213 #pragma omp master
1214   {
1215 #pragma omp target
1216     ++a;
1217   }
1218 #pragma omp master
1219   {
1220 #pragma omp teams // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
1221     ++a;
1222   }
1223 #pragma omp master
1224   {
1225 #pragma omp taskloop
1226   for (int i = 0; i < 10; ++i)
1227     ++a;
1228   }
1229 #pragma omp master
1230   {
1231 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
1232     for (int i = 0; i < 10; ++i)
1233       ;
1234   }
1235 
1236 // CRITICAL DIRECTIVE
1237 #pragma omp critical
1238   {
1239 #pragma omp for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
1240     for (int i = 0; i < 10; ++i)
1241       ;
1242   }
1243 #pragma omp critical
1244   {
1245 #pragma omp simd
1246     for (int i = 0; i < 10; ++i)
1247       ;
1248   }
1249 #pragma omp critical
1250   {
1251 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
1252     for (int i = 0; i < 10; ++i)
1253       ;
1254   }
1255 #pragma omp critical
1256   {
1257 #pragma omp parallel
1258     for (int i = 0; i < 10; ++i)
1259       ;
1260   }
1261 #pragma omp critical
1262   {
1263 #pragma omp single // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
1264     {
1265       bar();
1266     }
1267   }
1268 #pragma omp critical
1269   {
1270 #pragma omp master // OK, though second 'master' is redundant
1271     {
1272       bar();
1273     }
1274   }
1275 #pragma omp critical
1276   {
1277 #pragma omp critical
1278     {
1279       bar();
1280     }
1281   }
1282 #pragma omp critical
1283   {
1284 #pragma omp sections // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
1285     {
1286       bar();
1287     }
1288   }
1289 #pragma omp critical
1290   {
1291 #pragma omp parallel
1292     {
1293 #pragma omp master // OK
1294       {
1295         bar();
1296       }
1297 #pragma omp for // OK
1298       for (int i = 0; i < 10; ++i)
1299         ;
1300 #pragma omp for simd // OK
1301       for (int i = 0; i < 10; ++i)
1302         ;
1303 #pragma omp sections // OK
1304       {
1305         bar();
1306       }
1307     }
1308   }
1309 #pragma omp critical
1310   {
1311 #pragma omp parallel for
1312     for (int i = 0; i < 10; ++i)
1313       ;
1314   }
1315 #pragma omp critical
1316   {
1317 #pragma omp parallel for simd
1318     for (int i = 0; i < 10; ++i)
1319       ;
1320   }
1321 #pragma omp critical
1322   {
1323 #pragma omp parallel sections
1324     {
1325       bar();
1326     }
1327   }
1328 #pragma omp critical
1329   {
1330 #pragma omp task
1331     {
1332       bar();
1333     }
1334   }
1335 #pragma omp critical
1336   {
1337 #pragma omp taskyield
1338     bar();
1339   }
1340 #pragma omp critical
1341   {
1342 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}}
1343     bar();
1344   }
1345 #pragma omp critical
1346   {
1347 #pragma omp taskwait
1348     bar();
1349   }
1350 #pragma omp critical(Tuzik)
1351   {
1352 #pragma omp critical(grelka)
1353     bar();
1354   }
1355 #pragma omp critical(Belka) // expected-note {{previous 'critical' region starts here}}
1356   {
1357 #pragma omp critical(Belka) // expected-error {{cannot nest 'critical' regions having the same name 'Belka'}}
1358     {
1359 #pragma omp critical(Tuzik)
1360       {
1361 #pragma omp parallel
1362 #pragma omp critical(grelka)
1363         {
1364           bar();
1365         }
1366       }
1367     }
1368   }
1369 #pragma omp critical
1370   {
1371 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
1372     bar();
1373   }
1374 #pragma omp critical
1375   {
1376 #pragma omp atomic
1377     ++a;
1378   }
1379 #pragma omp critical
1380   {
1381 #pragma omp target
1382     ++a;
1383   }
1384 #pragma omp critical
1385   {
1386 #pragma omp teams // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
1387     ++a;
1388   }
1389 #pragma omp critical
1390   {
1391 #pragma omp taskloop
1392   for (int i = 0; i < 10; ++i)
1393     ++a;
1394   }
1395 #pragma omp critical
1396   {
1397 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
1398     for (int i = 0; i < 10; ++i)
1399       ;
1400   }
1401 
1402 // PARALLEL FOR DIRECTIVE
1403 #pragma omp parallel for
1404   for (int i = 0; i < 10; ++i) {
1405 #pragma omp for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
1406     for (int i = 0; i < 10; ++i)
1407       ;
1408   }
1409 #pragma omp parallel for
1410   for (int i = 0; i < 10; ++i) {
1411 #pragma omp simd
1412     for (int i = 0; i < 10; ++i)
1413       ;
1414   }
1415 #pragma omp parallel for
1416   for (int i = 0; i < 10; ++i) {
1417 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
1418     for (int i = 0; i < 10; ++i)
1419       ;
1420   }
1421 #pragma omp parallel for
1422   for (int i = 0; i < 10; ++i) {
1423 #pragma omp parallel
1424     for (int i = 0; i < 10; ++i)
1425       ;
1426   }
1427 #pragma omp parallel for
1428   for (int i = 0; i < 10; ++i) {
1429 #pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
1430     {
1431       bar();
1432     }
1433   }
1434 #pragma omp parallel for
1435   for (int i = 0; i < 10; ++i) {
1436 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}}
1437     {
1438       bar();
1439     }
1440   }
1441 #pragma omp parallel for
1442   for (int i = 0; i < 10; ++i) {
1443 #pragma omp single // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
1444     {
1445       bar();
1446     }
1447   }
1448 
1449 #pragma omp parallel for
1450   for (int i = 0; i < 10; ++i) {
1451 #pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}}
1452     {
1453       bar();
1454     }
1455   }
1456 
1457 #pragma omp parallel for
1458   for (int i = 0; i < 10; ++i) {
1459 #pragma omp critical
1460     {
1461       bar();
1462     }
1463   }
1464 
1465 #pragma omp parallel for
1466   for (int i = 0; i < 10; ++i) {
1467 #pragma omp parallel
1468     {
1469 #pragma omp single // OK
1470       {
1471         bar();
1472       }
1473 #pragma omp for // OK
1474       for (int i = 0; i < 10; ++i)
1475         ;
1476 #pragma omp for simd // OK
1477       for (int i = 0; i < 10; ++i)
1478         ;
1479 #pragma omp sections // OK
1480       {
1481         bar();
1482       }
1483     }
1484   }
1485 #pragma omp parallel for
1486   for (int i = 0; i < 10; ++i) {
1487 #pragma omp parallel for
1488     for (int i = 0; i < 10; ++i)
1489       ;
1490   }
1491 #pragma omp parallel for
1492   for (int i = 0; i < 10; ++i) {
1493 #pragma omp parallel for simd
1494     for (int i = 0; i < 10; ++i)
1495       ;
1496   }
1497 #pragma omp parallel for
1498   for (int i = 0; i < 10; ++i) {
1499 #pragma omp parallel sections
1500     {
1501       bar();
1502     }
1503   }
1504 #pragma omp parallel for
1505   for (int i = 0; i < 10; ++i) {
1506 #pragma omp task
1507     {
1508       bar();
1509     }
1510   }
1511 #pragma omp parallel for
1512   for (int i = 0; i < 10; ++i) {
1513 #pragma omp taskyield
1514     bar();
1515   }
1516 #pragma omp parallel for
1517   for (int i = 0; i < 10; ++i) {
1518 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}}
1519     bar();
1520   }
1521 #pragma omp parallel for
1522   for (int i = 0; i < 10; ++i) {
1523 #pragma omp taskwait
1524     bar();
1525   }
1526 #pragma omp parallel for
1527   for (int i = 0; i < 10; ++i) {
1528 #pragma omp flush
1529     bar();
1530   }
1531 #pragma omp parallel for
1532   for (int i = 0; i < 10; ++i) {
1533 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
1534     bar();
1535   }
1536 #pragma omp parallel for ordered
1537   for (int i = 0; i < 10; ++i) {
1538 #pragma omp ordered // OK
1539     bar();
1540   }
1541 #pragma omp parallel for
1542   for (int i = 0; i < 10; ++i) {
1543 #pragma omp atomic
1544     ++a;
1545   }
1546 #pragma omp parallel for
1547   for (int i = 0; i < 10; ++i) {
1548 #pragma omp target
1549     ++a;
1550   }
1551 #pragma omp parallel for
1552   for (int i = 0; i < 10; ++i) {
1553 #pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
1554     ++a;
1555   }
1556 #pragma omp parallel for
1557   for (int i = 0; i < 10; ++i) {
1558 #pragma omp taskloop
1559   for (int i = 0; i < 10; ++i)
1560     ++a;
1561   }
1562 #pragma omp parallel for
1563   for (int i = 0; i < 10; ++i) {
1564 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
1565     for (int j = 0; j < 10; ++j)
1566       ;
1567   }
1568 
1569 // PARALLEL FOR SIMD DIRECTIVE
1570 #pragma omp parallel for simd
1571   for (int i = 0; i < 10; ++i) {
1572 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1573     for (int i = 0; i < 10; ++i)
1574       ;
1575   }
1576 #pragma omp parallel for simd
1577   for (int i = 0; i < 10; ++i) {
1578 #pragma omp simd// expected-error {{OpenMP constructs may not be nested inside a simd region}}
1579     for (int i = 0; i < 10; ++i)
1580       ;
1581   }
1582 #pragma omp parallel for simd
1583   for (int i = 0; i < 10; ++i) {
1584 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1585     for (int i = 0; i < 10; ++i)
1586       ;
1587   }
1588 #pragma omp parallel for simd
1589   for (int i = 0; i < 10; ++i) {
1590 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1591     for (int i = 0; i < 10; ++i)
1592       ;
1593   }
1594 #pragma omp parallel for simd
1595   for (int i = 0; i < 10; ++i) {
1596 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1597     {
1598       bar();
1599     }
1600   }
1601 #pragma omp parallel for simd
1602   for (int i = 0; i < 10; ++i) {
1603 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1604     {
1605       bar();
1606     }
1607   }
1608 #pragma omp parallel for simd
1609   for (int i = 0; i < 10; ++i) {
1610 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1611     {
1612       bar();
1613     }
1614   }
1615 
1616 #pragma omp parallel for simd
1617   for (int i = 0; i < 10; ++i) {
1618 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1619     {
1620       bar();
1621     }
1622   }
1623 
1624 #pragma omp parallel for simd
1625   for (int i = 0; i < 10; ++i) {
1626 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1627     {
1628       bar();
1629     }
1630   }
1631 
1632 #pragma omp parallel for simd
1633   for (int i = 0; i < 10; ++i) {
1634 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1635     {
1636 #pragma omp single
1637       {
1638         bar();
1639       }
1640 #pragma omp for
1641       for (int i = 0; i < 10; ++i)
1642         ;
1643 #pragma omp for simd
1644       for (int i = 0; i < 10; ++i)
1645         ;
1646 #pragma omp sections
1647       {
1648         bar();
1649       }
1650     }
1651   }
1652 #pragma omp parallel for simd
1653   for (int i = 0; i < 10; ++i) {
1654 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1655     for (int i = 0; i < 10; ++i)
1656       ;
1657   }
1658 #pragma omp parallel for simd
1659   for (int i = 0; i < 10; ++i) {
1660 #pragma omp parallel for simd// expected-error {{OpenMP constructs may not be nested inside a simd region}}
1661     for (int i = 0; i < 10; ++i)
1662       ;
1663   }
1664 #pragma omp parallel for simd
1665   for (int i = 0; i < 10; ++i) {
1666 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1667     {
1668       bar();
1669     }
1670   }
1671 #pragma omp parallel for simd
1672   for (int i = 0; i < 10; ++i) {
1673 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1674     {
1675       bar();
1676     }
1677   }
1678 #pragma omp parallel for simd
1679   for (int i = 0; i < 10; ++i) {
1680 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1681     bar();
1682   }
1683 #pragma omp parallel for simd
1684   for (int i = 0; i < 10; ++i) {
1685 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1686     bar();
1687   }
1688 #pragma omp parallel for simd
1689   for (int i = 0; i < 10; ++i) {
1690 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1691     bar();
1692   }
1693 #pragma omp parallel for simd
1694   for (int i = 0; i < 10; ++i) {
1695 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1696     bar();
1697   }
1698 #pragma omp parallel for simd
1699   for (int i = 0; i < 10; ++i) {
1700 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1701     bar();
1702   }
1703 #pragma omp parallel for simd
1704   for (int i = 0; i < 10; ++i) {
1705 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1706     bar();
1707   }
1708 #pragma omp parallel for simd
1709   for (int i = 0; i < 10; ++i) {
1710 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1711     ++a;
1712   }
1713 #pragma omp parallel for simd
1714   for (int i = 0; i < 10; ++i) {
1715 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1716     ++a;
1717   }
1718 #pragma omp parallel for simd
1719   for (int i = 0; i < 10; ++i) {
1720 #pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1721     ++a;
1722   }
1723 #pragma omp parallel for simd
1724   for (int i = 0; i < 10; ++i) {
1725 #pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1726   for (int i = 0; i < 10; ++i)
1727     ++a;
1728   }
1729 #pragma omp parallel for simd
1730   for (int i = 0; i < 10; ++i) {
1731 #pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1732     for (int j = 0; j < 10; ++j)
1733       ;
1734   }
1735 
1736 // PARALLEL SECTIONS DIRECTIVE
1737 #pragma omp parallel sections
1738   {
1739 #pragma omp for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
1740     for (int i = 0; i < 10; ++i)
1741       ;
1742   }
1743 #pragma omp parallel sections
1744   {
1745 #pragma omp simd
1746     for (int i = 0; i < 10; ++i)
1747       ;
1748   }
1749 #pragma omp parallel sections
1750   {
1751 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
1752     for (int i = 0; i < 10; ++i)
1753       ;
1754   }
1755 #pragma omp parallel sections
1756   {
1757 #pragma omp parallel
1758     for (int i = 0; i < 10; ++i)
1759       ;
1760   }
1761 #pragma omp parallel sections
1762   {
1763 #pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
1764     {
1765       bar();
1766     }
1767   }
1768 #pragma omp parallel sections
1769   {
1770 #pragma omp section
1771     {
1772       bar();
1773     }
1774   }
1775 #pragma omp parallel sections
1776   {
1777 #pragma omp section
1778     {
1779 #pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
1780       bar();
1781     }
1782   }
1783 #pragma omp parallel sections
1784   {
1785 #pragma omp section
1786     {
1787 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
1788       bar();
1789     }
1790   }
1791 #pragma omp parallel sections
1792   {
1793 #pragma omp section
1794     {
1795 #pragma omp critical
1796       bar();
1797     }
1798   }
1799 #pragma omp parallel sections
1800   {
1801 #pragma omp parallel
1802     {
1803 #pragma omp single // OK
1804       {
1805         bar();
1806       }
1807 #pragma omp for // OK
1808       for (int i = 0; i < 10; ++i)
1809         ;
1810 #pragma omp for simd // OK
1811       for (int i = 0; i < 10; ++i)
1812         ;
1813 #pragma omp sections // OK
1814       {
1815         bar();
1816       }
1817     }
1818   }
1819 #pragma omp parallel sections
1820   {
1821 #pragma omp parallel for
1822     for (int i = 0; i < 10; ++i)
1823       ;
1824   }
1825 #pragma omp parallel sections
1826   {
1827 #pragma omp parallel for simd
1828     for (int i = 0; i < 10; ++i)
1829       ;
1830   }
1831 #pragma omp parallel sections
1832   {
1833 #pragma omp parallel sections
1834     {
1835       bar();
1836     }
1837   }
1838 #pragma omp parallel sections
1839   {
1840 #pragma omp task
1841     {
1842       bar();
1843     }
1844   }
1845 #pragma omp parallel sections
1846   {
1847 #pragma omp taskyield
1848   }
1849 #pragma omp parallel sections
1850   {
1851 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}}
1852   }
1853 #pragma omp parallel sections
1854   {
1855 #pragma omp taskwait
1856   }
1857 #pragma omp parallel sections
1858   {
1859 #pragma omp flush
1860   }
1861 #pragma omp parallel sections
1862   {
1863 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
1864     bar();
1865   }
1866 #pragma omp parallel sections
1867   {
1868 #pragma omp atomic
1869     ++a;
1870   }
1871 #pragma omp parallel sections
1872   {
1873 #pragma omp target
1874     ++a;
1875   }
1876 #pragma omp parallel sections
1877   {
1878 #pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
1879     ++a;
1880   }
1881 #pragma omp parallel sections
1882   {
1883 #pragma omp taskloop
1884   for (int i = 0; i < 10; ++i)
1885     ++a;
1886   }
1887 #pragma omp parallel sections
1888   {
1889 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
1890     for (int i = 0; i < 10; ++i)
1891       ;
1892   }
1893 
1894 // TASK DIRECTIVE
1895 #pragma omp task
1896 #pragma omp for // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
1897   for (int i = 0; i < 10; ++i)
1898     ;
1899 #pragma omp task
1900 #pragma omp simd
1901   for (int i = 0; i < 10; ++i)
1902     ;
1903 #pragma omp task
1904 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
1905   for (int i = 0; i < 10; ++i)
1906     ;
1907 #pragma omp task
1908 #pragma omp sections // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
1909   {
1910     bar();
1911   }
1912 #pragma omp task
1913 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}}
1914   {
1915     bar();
1916   }
1917 #pragma omp task
1918 #pragma omp single // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
1919   bar();
1920 #pragma omp task
1921 #pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}}
1922   bar();
1923 #pragma omp task
1924 #pragma omp critical
1925   bar();
1926 
1927 #pragma omp task
1928 #pragma omp parallel for
1929   for (int i = 0; i < 10; ++i)
1930     ;
1931 #pragma omp task
1932 #pragma omp parallel for simd
1933   for (int i = 0; i < 10; ++i)
1934     ;
1935 #pragma omp task
1936 #pragma omp parallel sections
1937   {
1938     bar();
1939   }
1940 #pragma omp task
1941 #pragma omp task
1942   {
1943     bar();
1944   }
1945 #pragma omp task
1946   {
1947 #pragma omp taskyield
1948     bar();
1949   }
1950 #pragma omp task
1951   {
1952 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}}
1953     bar();
1954   }
1955 #pragma omp task
1956   {
1957 #pragma omp taskwait
1958     bar();
1959   }
1960 #pragma omp task
1961   {
1962 #pragma omp flush
1963     bar();
1964   }
1965 #pragma omp task
1966   {
1967 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
1968     bar();
1969   }
1970 #pragma omp task
1971   {
1972 #pragma omp atomic
1973     ++a;
1974   }
1975 #pragma omp task
1976   {
1977 #pragma omp target
1978     ++a;
1979   }
1980 #pragma omp task
1981   {
1982 #pragma omp teams // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
1983     ++a;
1984   }
1985 #pragma omp task
1986   {
1987 #pragma omp taskloop
1988   for (int i = 0; i < 10; ++i)
1989     ++a;
1990   }
1991 #pragma omp task
1992   {
1993 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
1994     for (int i = 0; i < 10; ++i)
1995       ;
1996   }
1997 
1998 // ORDERED DIRECTIVE
1999 #pragma omp ordered
2000   {
2001 #pragma omp for // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
2002     for (int i = 0; i < 10; ++i)
2003       ;
2004   }
2005 #pragma omp ordered
2006   {
2007 #pragma omp simd
2008     for (int i = 0; i < 10; ++i)
2009       ;
2010   }
2011 #pragma omp ordered
2012   {
2013 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
2014     for (int i = 0; i < 10; ++i)
2015       ;
2016   }
2017 #pragma omp ordered
2018   {
2019 #pragma omp parallel
2020     for (int i = 0; i < 10; ++i)
2021       ;
2022   }
2023 #pragma omp ordered
2024   {
2025 #pragma omp single // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
2026     {
2027       bar();
2028     }
2029   }
2030 #pragma omp ordered
2031   {
2032 #pragma omp master // OK, though second 'ordered' is redundant
2033     {
2034       bar();
2035     }
2036   }
2037 #pragma omp ordered
2038   {
2039 #pragma omp critical
2040     {
2041       bar();
2042     }
2043   }
2044 #pragma omp ordered
2045   {
2046 #pragma omp sections // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
2047     {
2048       bar();
2049     }
2050   }
2051 #pragma omp ordered
2052   {
2053 #pragma omp parallel for ordered
2054     for (int j = 0; j < 10; ++j) {
2055 #pragma omp ordered // OK
2056       {
2057         bar();
2058       }
2059     }
2060   }
2061 #pragma omp ordered
2062   {
2063 #pragma omp parallel for simd ordered
2064     for (int j = 0; j < 10; ++j) {
2065 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
2066       {
2067         bar();
2068       }
2069     }
2070   }
2071 #pragma omp ordered
2072   {
2073 #pragma omp parallel for simd ordered
2074     for (int j = 0; j < 10; ++j) {
2075 #pragma omp ordered simd
2076       {
2077         bar();
2078       }
2079     }
2080   }
2081 #pragma omp ordered
2082   {
2083 #pragma omp parallel for
2084     for (int i = 0; i < 10; ++i)
2085       ;
2086   }
2087 #pragma omp ordered
2088   {
2089 #pragma omp parallel for simd
2090     for (int i = 0; i < 10; ++i)
2091       ;
2092   }
2093 #pragma omp ordered
2094   {
2095 #pragma omp parallel sections
2096     {
2097       bar();
2098     }
2099   }
2100 #pragma omp ordered
2101   {
2102 #pragma omp task
2103     {
2104       bar();
2105     }
2106   }
2107 #pragma omp ordered
2108   {
2109 #pragma omp taskyield
2110     bar();
2111   }
2112 #pragma omp ordered
2113   {
2114 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'ordered' region}}
2115     bar();
2116   }
2117 #pragma omp ordered
2118   {
2119 #pragma omp taskwait
2120     bar();
2121   }
2122 #pragma omp ordered
2123   {
2124 #pragma omp flush
2125     bar();
2126   }
2127 #pragma omp ordered
2128   {
2129 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
2130     bar();
2131   }
2132 #pragma omp ordered
2133   {
2134 #pragma omp atomic
2135     ++a;
2136   }
2137 #pragma omp ordered
2138   {
2139 #pragma omp target
2140     ++a;
2141   }
2142 #pragma omp ordered
2143   {
2144 #pragma omp teams // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
2145     ++a;
2146   }
2147 #pragma omp ordered
2148   {
2149 #pragma omp taskloop
2150   for (int i = 0; i < 10; ++i)
2151     ++a;
2152   }
2153 #pragma omp ordered
2154   {
2155 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
2156     for (int i = 0; i < 10; ++i)
2157       ;
2158   }
2159 
2160 // ATOMIC DIRECTIVE
2161 #pragma omp atomic
2162   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2163   // expected-note@+1 {{expected an expression statement}}
2164   {
2165 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2166     for (int i = 0; i < 10; ++i)
2167       ;
2168   }
2169 #pragma omp atomic
2170   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2171   // expected-note@+1 {{expected an expression statement}}
2172   {
2173 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2174     for (int i = 0; i < 10; ++i)
2175       ;
2176   }
2177 #pragma omp atomic
2178   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2179   // expected-note@+1 {{expected an expression statement}}
2180   {
2181 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2182     for (int i = 0; i < 10; ++i)
2183       ;
2184   }
2185 #pragma omp atomic
2186   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2187   // expected-note@+1 {{expected an expression statement}}
2188   {
2189 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2190     for (int i = 0; i < 10; ++i)
2191       ;
2192   }
2193 #pragma omp atomic
2194   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2195   // expected-note@+1 {{expected an expression statement}}
2196   {
2197 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2198     {
2199       bar();
2200     }
2201   }
2202 #pragma omp atomic
2203   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2204   // expected-note@+1 {{expected an expression statement}}
2205   {
2206 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2207     {
2208       bar();
2209     }
2210   }
2211 #pragma omp atomic
2212   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2213   // expected-note@+1 {{expected an expression statement}}
2214   {
2215 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2216     {
2217       bar();
2218     }
2219   }
2220 #pragma omp atomic
2221   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2222   // expected-note@+1 {{expected an expression statement}}
2223   {
2224 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2225     {
2226       bar();
2227     }
2228   }
2229 #pragma omp atomic
2230   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2231   // expected-note@+1 {{expected an expression statement}}
2232   {
2233 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2234     {
2235       bar();
2236     }
2237   }
2238 #pragma omp atomic
2239   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2240   // expected-note@+1 {{expected an expression statement}}
2241   {
2242 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2243     for (int i = 0; i < 10; ++i)
2244       ;
2245   }
2246 #pragma omp atomic
2247   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2248   // expected-note@+1 {{expected an expression statement}}
2249   {
2250 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2251     for (int i = 0; i < 10; ++i)
2252       ;
2253   }
2254 #pragma omp atomic
2255   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2256   // expected-note@+1 {{expected an expression statement}}
2257   {
2258 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2259     {
2260       bar();
2261     }
2262   }
2263 #pragma omp atomic
2264   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2265   // expected-note@+1 {{expected an expression statement}}
2266   {
2267 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2268     {
2269       bar();
2270     }
2271   }
2272 #pragma omp atomic
2273   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2274   // expected-note@+1 {{expected an expression statement}}
2275   {
2276 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2277     bar();
2278   }
2279 #pragma omp atomic
2280   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2281   // expected-note@+1 {{expected an expression statement}}
2282   {
2283 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2284     bar();
2285   }
2286 #pragma omp atomic
2287   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2288   // expected-note@+1 {{expected an expression statement}}
2289   {
2290 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2291     bar();
2292   }
2293 #pragma omp atomic
2294   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2295   // expected-note@+1 {{expected an expression statement}}
2296   {
2297 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2298     bar();
2299   }
2300 #pragma omp atomic
2301   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2302   // expected-note@+1 {{expected an expression statement}}
2303   {
2304 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2305     bar();
2306   }
2307 #pragma omp atomic
2308   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2309   // expected-note@+1 {{expected an expression statement}}
2310   {
2311 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2312     ++a;
2313   }
2314 #pragma omp atomic
2315   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2316   // expected-note@+1 {{expected an expression statement}}
2317   {
2318 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2319     ++a;
2320   }
2321 #pragma omp atomic
2322   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2323   // expected-note@+1 {{expected an expression statement}}
2324   {
2325 #pragma omp teams // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2326     ++a;
2327   }
2328 #pragma omp atomic
2329   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2330   // expected-note@+1 {{expected an expression statement}}
2331   {
2332 #pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2333   for (int i = 0; i < 10; ++i)
2334     ++a;
2335   }
2336 #pragma omp atomic
2337   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
2338   // expected-note@+1 {{expected an expression statement}}
2339   {
2340 #pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2341     for (int i = 0; i < 10; ++i)
2342       ;
2343   }
2344 
2345 // TARGET DIRECTIVE
2346 #pragma omp target
2347 #pragma omp parallel
2348   bar();
2349 #pragma omp target
2350 #pragma omp for
2351   for (int i = 0; i < 10; ++i)
2352     ;
2353 #pragma omp target
2354 #pragma omp simd
2355   for (int i = 0; i < 10; ++i)
2356     ;
2357 #pragma omp target
2358 #pragma omp for simd
2359   for (int i = 0; i < 10; ++i)
2360     ;
2361 #pragma omp target
2362 #pragma omp sections
2363   {
2364     bar();
2365   }
2366 #pragma omp target
2367 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a target region}}
2368   {
2369     bar();
2370   }
2371 #pragma omp target
2372 #pragma omp single
2373   bar();
2374 
2375 #pragma omp target
2376 #pragma omp master
2377   {
2378     bar();
2379   }
2380 #pragma omp target
2381 #pragma omp critical
2382   {
2383     bar();
2384   }
2385 #pragma omp target
2386 #pragma omp parallel for
2387   for (int i = 0; i < 10; ++i)
2388     ;
2389 #pragma omp target
2390 #pragma omp parallel for simd
2391   for (int i = 0; i < 10; ++i)
2392     ;
2393 #pragma omp target
2394 #pragma omp parallel sections
2395   {
2396     bar();
2397   }
2398 #pragma omp target
2399 #pragma omp task
2400   {
2401     bar();
2402   }
2403 #pragma omp target
2404   {
2405 #pragma omp taskyield
2406     bar();
2407   }
2408 #pragma omp target
2409   {
2410 #pragma omp barrier
2411     bar();
2412   }
2413 #pragma omp target
2414   {
2415 #pragma omp taskwait
2416     bar();
2417   }
2418 #pragma omp target
2419   {
2420 #pragma omp flush
2421     bar();
2422   }
2423 #pragma omp target
2424   {
2425 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
2426     bar();
2427   }
2428 #pragma omp target
2429   {
2430 #pragma omp atomic
2431     ++a;
2432   }
2433 #pragma omp target
2434   {
2435 #pragma omp target
2436     ++a;
2437   }
2438 #pragma omp target
2439   {
2440 #pragma omp teams
2441     ++a;
2442   }
2443 #pragma omp target // expected-error {{target construct with nested teams region contains statements outside of the teams construct}}
2444   {
2445     ++a;           // expected-note {{statement outside teams construct here}}
2446 #pragma omp teams  // expected-note {{nested teams construct here}}
2447     ++a;
2448   }
2449 #pragma omp target
2450   {
2451 #pragma omp taskloop
2452   for (int i = 0; i < 10; ++i)
2453     ++a;
2454   }
2455 #pragma omp target
2456   {
2457 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
2458     for (int i = 0; i < 10; ++i)
2459       ;
2460   }
2461 
2462 // TEAMS DIRECTIVE
2463 #pragma omp target
2464 #pragma omp teams
2465 #pragma omp parallel
2466   bar();
2467 #pragma omp target
2468 #pragma omp teams
2469 #pragma omp for // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
2470   for (int i = 0; i < 10; ++i)
2471     ;
2472 #pragma omp target
2473 #pragma omp teams
2474 #pragma omp simd // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp simd' directive into a parallel region?}}
2475   for (int i = 0; i < 10; ++i)
2476     ;
2477 #pragma omp target
2478 #pragma omp teams
2479 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
2480   for (int i = 0; i < 10; ++i)
2481     ;
2482 #pragma omp target
2483 #pragma omp teams
2484 #pragma omp sections // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
2485   {
2486     bar();
2487   }
2488 #pragma omp target
2489 #pragma omp teams
2490 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a teams region}}
2491   {
2492     bar();
2493   }
2494 #pragma omp target
2495 #pragma omp teams
2496 #pragma omp single // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
2497   bar();
2498 
2499 #pragma omp target
2500 #pragma omp teams
2501 #pragma omp master // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp master' directive into a parallel region?}}
2502   {
2503     bar();
2504   }
2505 #pragma omp target
2506 #pragma omp teams
2507 #pragma omp critical // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp critical' directive into a parallel region?}}
2508   {
2509     bar();
2510   }
2511 #pragma omp target
2512 #pragma omp teams
2513 #pragma omp parallel for
2514   for (int i = 0; i < 10; ++i)
2515     ;
2516 #pragma omp target
2517 #pragma omp teams
2518 #pragma omp parallel for simd
2519   for (int i = 0; i < 10; ++i)
2520     ;
2521 #pragma omp target
2522 #pragma omp teams
2523 #pragma omp parallel sections
2524   {
2525     bar();
2526   }
2527 #pragma omp target
2528 #pragma omp teams
2529 #pragma omp task // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp task' directive into a parallel region?}}
2530   {
2531     bar();
2532   }
2533 #pragma omp target
2534 #pragma omp teams
2535   {
2536 #pragma omp taskyield // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskyield' directive into a parallel region?}}
2537     bar();
2538   }
2539 #pragma omp target
2540 #pragma omp teams
2541   {
2542 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp barrier' directive into a parallel region?}}
2543     bar();
2544   }
2545 #pragma omp target
2546 #pragma omp teams
2547   {
2548 #pragma omp taskwait // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
2549     bar();
2550   }
2551 #pragma omp target
2552 #pragma omp teams
2553   {
2554 #pragma omp flush // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp flush' directive into a parallel region?}}
2555     bar();
2556   }
2557 #pragma omp target
2558 #pragma omp teams
2559   {
2560 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
2561     bar();
2562   }
2563 #pragma omp target
2564 #pragma omp teams
2565   {
2566 #pragma omp atomic // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp atomic' directive into a parallel region?}}
2567     ++a;
2568   }
2569 #pragma omp target
2570 #pragma omp teams
2571   {
2572 #pragma omp target // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp target' directive into a parallel region?}}
2573     ++a;
2574   }
2575 #pragma omp target
2576 #pragma omp teams
2577   {
2578 #pragma omp teams // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
2579     ++a;
2580   }
2581 #pragma omp target
2582 #pragma omp teams
2583   {
2584 #pragma omp taskloop // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskloop' directive into a parallel region?}}
2585   for (int i = 0; i < 10; ++i)
2586     ++a;
2587   }
2588 #pragma omp target
2589 #pragma omp teams
2590 #pragma omp distribute
2591   for (int i = 0; i < 10; ++i)
2592     ;
2593 #pragma omp target
2594 #pragma omp teams
2595 #pragma omp distribute
2596   for (int i = 0; i < 10; ++i)
2597     ;
2598 #pragma omp distribute
2599   for (int j = 0; j < 10; ++j)
2600     ;
2601 
2602 // TASKLOOP DIRECTIVE
2603 #pragma omp taskloop
2604   for (int i = 0; i < 10; ++i) {
2605 #pragma omp for // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
2606     for (int i = 0; i < 10; ++i)
2607       ;
2608   }
2609 #pragma omp taskloop
2610   for (int i = 0; i < 10; ++i) {
2611 #pragma omp simd
2612     for (int i = 0; i < 10; ++i)
2613       ;
2614   }
2615 #pragma omp taskloop
2616   for (int i = 0; i < 10; ++i) {
2617 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
2618     for (int i = 0; i < 10; ++i)
2619       ;
2620   }
2621 #pragma omp taskloop
2622   for (int i = 0; i < 10; ++i) {
2623 #pragma omp parallel
2624     for (int i = 0; i < 10; ++i)
2625       ;
2626   }
2627 #pragma omp taskloop
2628   for (int i = 0; i < 10; ++i) {
2629 #pragma omp sections // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
2630     {
2631       bar();
2632     }
2633   }
2634 #pragma omp taskloop
2635   for (int i = 0; i < 10; ++i) {
2636 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a taskloop region}}
2637     {
2638       bar();
2639     }
2640   }
2641 #pragma omp taskloop
2642   for (int i = 0; i < 10; ++i) {
2643 #pragma omp single // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
2644     {
2645       bar();
2646     }
2647   }
2648 
2649 #pragma omp taskloop
2650   for (int i = 0; i < 10; ++i) {
2651 #pragma omp master // expected-error {{region cannot be closely nested inside 'taskloop' region}}
2652     {
2653       bar();
2654     }
2655   }
2656 #pragma omp taskloop
2657   for (int i = 0; i < 10; ++i) {
2658 #pragma omp critical
2659     {
2660       bar();
2661     }
2662   }
2663 #pragma omp taskloop
2664   for (int i = 0; i < 10; ++i) {
2665 #pragma omp parallel
2666     {
2667 #pragma omp single // OK
2668       {
2669         bar();
2670       }
2671 #pragma omp for // OK
2672       for (int i = 0; i < 10; ++i)
2673         ;
2674 #pragma omp sections // OK
2675       {
2676         bar();
2677       }
2678     }
2679   }
2680 #pragma omp taskloop
2681   for (int i = 0; i < 10; ++i) {
2682 #pragma omp parallel for
2683     for (int i = 0; i < 10; ++i)
2684       ;
2685   }
2686 #pragma omp taskloop
2687   for (int i = 0; i < 10; ++i) {
2688 #pragma omp parallel for simd
2689     for (int i = 0; i < 10; ++i)
2690       ;
2691   }
2692 #pragma omp taskloop
2693   for (int i = 0; i < 10; ++i) {
2694 #pragma omp parallel sections
2695     {
2696       bar();
2697     }
2698   }
2699 #pragma omp taskloop
2700   for (int i = 0; i < 10; ++i) {
2701 #pragma omp task
2702     {
2703       bar();
2704     }
2705   }
2706 #pragma omp taskloop
2707   for (int i = 0; i < 10; ++i) {
2708 #pragma omp taskyield
2709     bar();
2710   }
2711 #pragma omp taskloop
2712   for (int i = 0; i < 10; ++i) {
2713 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'taskloop' region}}
2714     bar();
2715   }
2716 #pragma omp taskloop
2717   for (int i = 0; i < 10; ++i) {
2718 #pragma omp taskwait
2719     bar();
2720   }
2721 #pragma omp taskloop
2722   for (int i = 0; i < 10; ++i) {
2723 #pragma omp flush
2724     bar();
2725   }
2726 #pragma omp taskloop
2727   for (int i = 0; i < 10; ++i) {
2728 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
2729     bar();
2730   }
2731 #pragma omp taskloop
2732   for (int i = 0; i < 10; ++i) {
2733 #pragma omp atomic
2734     ++a;
2735   }
2736 #pragma omp taskloop
2737   for (int i = 0; i < 10; ++i) {
2738 #pragma omp target
2739     ++a;
2740   }
2741 #pragma omp taskloop
2742   for (int i = 0; i < 10; ++i) {
2743 #pragma omp teams // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
2744     ++a;
2745   }
2746 #pragma omp taskloop
2747   for (int i = 0; i < 10; ++i) {
2748 #pragma omp taskloop
2749   for (int i = 0; i < 10; ++i)
2750     ++a;
2751   }
2752 // DISTRIBUTE DIRECTIVE
2753 #pragma omp target
2754 #pragma omp teams
2755 #pragma omp distribute
2756   for (int i = 0; i < 10; ++i) {
2757 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'distribute' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
2758     for (int i = 0; i < 10; ++i)
2759       ;
2760   }
2761 #pragma omp target
2762 #pragma omp teams
2763 #pragma omp distribute
2764   for (int i = 0; i < 10; ++i) {
2765 #pragma omp for
2766     for (int i = 0; i < 10; ++i)
2767       ;
2768   }
2769 #pragma omp target
2770 #pragma omp teams
2771 #pragma omp distribute
2772   for (int i = 0; i < 10; ++i) {
2773 #pragma omp simd
2774     for (int i = 0; i < 10; ++i)
2775       ;
2776   }
2777 #pragma omp target
2778 #pragma omp teams
2779 #pragma omp distribute
2780   for (int i = 0; i < 10; ++i) {
2781 #pragma omp for simd
2782     for (int i = 0; i < 10; ++i)
2783       ;
2784   }
2785 #pragma omp target
2786 #pragma omp teams
2787 #pragma omp distribute
2788   for (int i = 0; i < 10; ++i) {
2789 #pragma omp parallel
2790     for (int i = 0; i < 10; ++i)
2791       ;
2792   }
2793 #pragma omp target
2794 #pragma omp teams
2795 #pragma omp distribute
2796   for (int i = 0; i < 10; ++i) {
2797 #pragma omp sections
2798     {
2799       bar();
2800     }
2801   }
2802 #pragma omp target
2803 #pragma omp teams
2804 #pragma omp distribute
2805   for (int i = 0; i < 10; ++i) {
2806 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a distribute region}}
2807     {
2808       bar();
2809     }
2810   }
2811 #pragma omp target
2812 #pragma omp teams
2813 #pragma omp distribute
2814   for (int i = 0; i < 10; ++i) {
2815 #pragma omp single
2816     {
2817       bar();
2818     }
2819   }
2820 #pragma omp target
2821 #pragma omp teams
2822 #pragma omp distribute
2823   for (int i = 0; i < 10; ++i) {
2824 #pragma omp master
2825     {
2826       bar();
2827     }
2828   }
2829 #pragma omp target
2830 #pragma omp teams
2831 #pragma omp distribute
2832   for (int i = 0; i < 10; ++i) {
2833 #pragma omp critical
2834     {
2835       bar();
2836     }
2837   }
2838 #pragma omp target
2839 #pragma omp teams
2840 #pragma omp distribute
2841   for (int i = 0; i < 10; ++i) {
2842 #pragma omp parallel
2843     {
2844 #pragma omp single
2845       {
2846 	bar();
2847       }
2848     }
2849   }
2850 #pragma omp target
2851 #pragma omp teams
2852 #pragma omp distribute
2853   for (int i = 0; i < 10; ++i) {
2854 #pragma omp parallel for
2855     for (int i = 0; i < 10; ++i)
2856       ;
2857   }
2858 #pragma omp target
2859 #pragma omp teams
2860 #pragma omp distribute
2861   for (int i = 0; i < 10; ++i) {
2862 #pragma omp parallel for simd
2863     for (int i = 0; i < 10; ++i)
2864       ;
2865   }
2866 #pragma omp target
2867 #pragma omp teams
2868 #pragma omp distribute
2869   for (int i = 0; i < 10; ++i) {
2870 #pragma omp parallel sections
2871     {
2872       bar();
2873     }
2874   }
2875 #pragma omp target
2876 #pragma omp teams
2877 #pragma omp distribute
2878   for (int i = 0; i < 10; ++i) {
2879 #pragma omp task
2880     {
2881       bar();
2882     }
2883   }
2884 #pragma omp target
2885 #pragma omp teams
2886 #pragma omp distribute
2887   for (int i = 0; i < 10; ++i) {
2888 #pragma omp taskyield
2889     bar();
2890   }
2891 #pragma omp target
2892 #pragma omp teams
2893 #pragma omp distribute
2894   for (int i = 0; i < 10; ++i) {
2895 #pragma omp barrier
2896     bar();
2897   }
2898 #pragma omp target
2899 #pragma omp teams
2900 #pragma omp distribute
2901   for (int i = 0; i < 10; ++i) {
2902 #pragma omp taskwait
2903     bar();
2904   }
2905 #pragma omp target
2906 #pragma omp teams
2907 #pragma omp distribute
2908   for (int i = 0; i < 10; ++i) {
2909 #pragma omp flush
2910     bar();
2911   }
2912 #pragma omp target
2913 #pragma omp teams
2914 #pragma omp distribute
2915   for (int i = 0; i < 10; ++i) {
2916 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'distribute' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
2917     bar();
2918   }
2919 #pragma omp target
2920 #pragma omp teams
2921 #pragma omp distribute
2922   for (int i = 0; i < 10; ++i) {
2923 #pragma omp atomic
2924     ++a;
2925   }
2926 #pragma omp target
2927 #pragma omp teams
2928 #pragma omp distribute
2929   for (int i = 0; i < 10; ++i) {
2930 #pragma omp target
2931     ++a;
2932   }
2933 #pragma omp target
2934 #pragma omp teams
2935 #pragma omp distribute
2936   for (int i = 0; i < 10; ++i) {
2937 #pragma omp teams // expected-error {{region cannot be closely nested inside 'distribute' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
2938     ++a;
2939   }
2940 }
2941 
2942 void foo() {
2943   int a = 0;
2944 // PARALLEL DIRECTIVE
2945 #pragma omp parallel
2946 #pragma omp for
2947   for (int i = 0; i < 10; ++i)
2948     ;
2949 #pragma omp parallel
2950 #pragma omp simd
2951   for (int i = 0; i < 10; ++i)
2952     ;
2953 #pragma omp parallel
2954 #pragma omp for simd
2955   for (int i = 0; i < 10; ++i)
2956     ;
2957 #pragma omp parallel
2958 #pragma omp sections
2959   {
2960     bar();
2961   }
2962 #pragma omp parallel
2963 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}}
2964   {
2965     bar();
2966   }
2967 #pragma omp parallel
2968 #pragma omp sections
2969   {
2970     bar();
2971   }
2972 #pragma omp parallel
2973 #pragma omp single
2974   bar();
2975 #pragma omp parallel
2976 #pragma omp master
2977   bar();
2978 #pragma omp parallel
2979 #pragma omp critical
2980   bar();
2981 #pragma omp parallel
2982 #pragma omp parallel for
2983   for (int i = 0; i < 10; ++i)
2984     ;
2985 #pragma omp parallel
2986 #pragma omp parallel for simd
2987   for (int i = 0; i < 10; ++i)
2988     ;
2989 #pragma omp parallel
2990 #pragma omp parallel sections
2991   {
2992     bar();
2993   }
2994 #pragma omp parallel
2995 #pragma omp task
2996   {
2997     bar();
2998   }
2999 #pragma omp parallel
3000   {
3001 #pragma omp taskyield
3002     bar();
3003   }
3004 #pragma omp parallel
3005   {
3006 #pragma omp barrier
3007     bar();
3008   }
3009 #pragma omp parallel
3010   {
3011 #pragma omp taskwait
3012     bar();
3013   }
3014 #pragma omp parallel
3015   {
3016 #pragma omp flush
3017     bar();
3018   }
3019 #pragma omp parallel
3020   {
3021 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
3022     bar();
3023   }
3024 #pragma omp parallel
3025   {
3026 #pragma omp atomic
3027     ++a;
3028   }
3029 #pragma omp parallel
3030   {
3031 #pragma omp target
3032     ++a;
3033   }
3034 #pragma omp parallel
3035   {
3036 #pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
3037     ++a;
3038   }
3039 #pragma omp parallel
3040   {
3041 #pragma omp taskloop
3042   for (int i = 0; i < 10; ++i)
3043     ++a;
3044   }
3045 #pragma omp parallel
3046   {
3047 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
3048     for (int i = 0; i < 10; ++i)
3049       ;
3050   }
3051 
3052 // SIMD DIRECTIVE
3053 #pragma omp simd
3054   for (int i = 0; i < 10; ++i) {
3055 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3056     for (int i = 0; i < 10; ++i)
3057       ;
3058   }
3059 #pragma omp simd
3060   for (int i = 0; i < 10; ++i) {
3061 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3062     for (int i = 0; i < 10; ++i)
3063       ;
3064   }
3065 #pragma omp simd
3066   for (int i = 0; i < 10; ++i) {
3067 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3068     for (int i = 0; i < 10; ++i)
3069       ;
3070   }
3071 #pragma omp simd
3072   for (int i = 0; i < 10; ++i) {
3073 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3074     for (int i = 0; i < 10; ++i)
3075       ;
3076   }
3077 #pragma omp simd
3078   for (int i = 0; i < 10; ++i) {
3079 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3080     {
3081       bar();
3082     }
3083   }
3084 #pragma omp simd
3085   for (int i = 0; i < 10; ++i) {
3086 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3087     {
3088       bar();
3089     }
3090   }
3091 #pragma omp simd
3092   for (int i = 0; i < 10; ++i) {
3093 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3094     bar();
3095 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3096     bar();
3097   }
3098 #pragma omp simd
3099   for (int i = 0; i < 10; ++i) {
3100 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3101     bar();
3102 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3103     bar();
3104   }
3105 #pragma omp simd
3106   for (int i = 0; i < 10; ++i) {
3107 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3108     for (int i = 0; i < 10; ++i)
3109       ;
3110   }
3111 #pragma omp simd
3112   for (int i = 0; i < 10; ++i) {
3113 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3114     for (int i = 0; i < 10; ++i)
3115       ;
3116   }
3117 #pragma omp simd
3118   for (int i = 0; i < 10; ++i) {
3119 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3120     {
3121       bar();
3122     }
3123   }
3124 #pragma omp simd
3125   for (int i = 0; i < 10; ++i) {
3126 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3127     {
3128       bar();
3129     }
3130   }
3131 #pragma omp simd
3132   for (int i = 0; i < 10; ++i) {
3133 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3134     bar();
3135   }
3136 #pragma omp simd
3137   for (int i = 0; i < 10; ++i) {
3138 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3139     bar();
3140   }
3141 #pragma omp simd
3142   for (int i = 0; i < 10; ++i) {
3143 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3144     bar();
3145   }
3146 #pragma omp simd
3147   for (int i = 0; i < 10; ++i) {
3148 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3149     bar();
3150   }
3151 #pragma omp simd
3152   for (int i = 0; i < 10; ++i) {
3153 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3154     bar();
3155   }
3156 #pragma omp simd
3157   for (int i = 0; i < 10; ++i) {
3158 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3159     ++a;
3160   }
3161 #pragma omp simd
3162   for (int i = 0; i < 10; ++i) {
3163 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3164     ++a;
3165   }
3166 #pragma omp simd
3167   for (int i = 0; i < 10; ++i) {
3168 #pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3169     ++a;
3170   }
3171 #pragma omp simd
3172   for (int i = 0; i < 10; ++i) {
3173 #pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3174   for (int i = 0; i < 10; ++i)
3175     ++a;
3176   }
3177 #pragma omp simd
3178   for (int i = 0; i < 10; ++i) {
3179 #pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3180     for (int j = 0; j < 10; ++j)
3181       ;
3182   }
3183 
3184 // FOR DIRECTIVE
3185 #pragma omp for
3186   for (int i = 0; i < 10; ++i) {
3187 #pragma omp for // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
3188     for (int i = 0; i < 10; ++i)
3189       ;
3190   }
3191 #pragma omp for
3192   for (int i = 0; i < 10; ++i) {
3193 #pragma omp simd
3194     for (int i = 0; i < 10; ++i)
3195       ;
3196   }
3197 #pragma omp for
3198   for (int i = 0; i < 10; ++i) {
3199 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
3200     for (int i = 0; i < 10; ++i)
3201       ;
3202   }
3203 #pragma omp for
3204   for (int i = 0; i < 10; ++i) {
3205 #pragma omp parallel
3206     for (int i = 0; i < 10; ++i)
3207       ;
3208   }
3209 #pragma omp for
3210   for (int i = 0; i < 10; ++i) {
3211 #pragma omp sections // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
3212     {
3213       bar();
3214     }
3215   }
3216 #pragma omp for
3217   for (int i = 0; i < 10; ++i) {
3218 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}}
3219     {
3220       bar();
3221     }
3222   }
3223 #pragma omp for
3224   for (int i = 0; i < 10; ++i) {
3225 #pragma omp single // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
3226     bar();
3227 #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}}
3228     bar();
3229 #pragma omp critical
3230     bar();
3231   }
3232 #pragma omp for
3233   for (int i = 0; i < 10; ++i) {
3234 #pragma omp parallel
3235     {
3236 #pragma omp single // OK
3237       {
3238         bar();
3239       }
3240 #pragma omp for // OK
3241       for (int i = 0; i < 10; ++i)
3242         ;
3243 #pragma omp for simd // OK
3244       for (int i = 0; i < 10; ++i)
3245         ;
3246 #pragma omp sections // OK
3247       {
3248         bar();
3249       }
3250     }
3251   }
3252 #pragma omp for
3253   for (int i = 0; i < 10; ++i) {
3254 #pragma omp parallel for
3255     for (int i = 0; i < 10; ++i)
3256       ;
3257   }
3258 #pragma omp for
3259   for (int i = 0; i < 10; ++i) {
3260 #pragma omp parallel for simd
3261     for (int i = 0; i < 10; ++i)
3262       ;
3263   }
3264 #pragma omp for
3265   for (int i = 0; i < 10; ++i) {
3266 #pragma omp parallel sections
3267     {
3268       bar();
3269     }
3270   }
3271 #pragma omp for
3272   for (int i = 0; i < 10; ++i) {
3273 #pragma omp task
3274     {
3275       bar();
3276     }
3277   }
3278 #pragma omp for
3279   for (int i = 0; i < 10; ++i) {
3280 #pragma omp taskyield
3281     bar();
3282   }
3283 #pragma omp for
3284   for (int i = 0; i < 10; ++i) {
3285 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'for' region}}
3286     bar();
3287   }
3288 #pragma omp for
3289   for (int i = 0; i < 10; ++i) {
3290 #pragma omp taskwait
3291     bar();
3292   }
3293 #pragma omp for
3294   for (int i = 0; i < 10; ++i) {
3295 #pragma omp flush
3296     bar();
3297   }
3298 #pragma omp for
3299   for (int i = 0; i < 10; ++i) {
3300 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
3301     bar();
3302   }
3303 #pragma omp for ordered
3304   for (int i = 0; i < 10; ++i) {
3305 #pragma omp ordered // OK
3306     bar();
3307   }
3308 #pragma omp for
3309   for (int i = 0; i < 10; ++i) {
3310 #pragma omp atomic
3311     ++a;
3312   }
3313 #pragma omp for
3314   for (int i = 0; i < 10; ++i) {
3315 #pragma omp target
3316     ++a;
3317   }
3318 #pragma omp for
3319   for (int i = 0; i < 10; ++i) {
3320 #pragma omp teams // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
3321     ++a;
3322   }
3323 #pragma omp for
3324   for (int i = 0; i < 10; ++i) {
3325 #pragma omp taskloop
3326   for (int i = 0; i < 10; ++i)
3327     ++a;
3328   }
3329 #pragma omp for
3330   for (int i = 0; i < 10; ++i) {
3331 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
3332     for (int j = 0; j < 10; ++j)
3333       ;
3334   }
3335 
3336 // FOR SIMD DIRECTIVE
3337 #pragma omp for simd
3338   for (int i = 0; i < 10; ++i) {
3339 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3340     for (int i = 0; i < 10; ++i)
3341       ;
3342   }
3343 #pragma omp for simd
3344   for (int i = 0; i < 10; ++i) {
3345 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3346     for (int i = 0; i < 10; ++i)
3347       ;
3348   }
3349 #pragma omp for simd
3350   for (int i = 0; i < 10; ++i) {
3351 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3352     for (int i = 0; i < 10; ++i)
3353       ;
3354   }
3355 #pragma omp for simd
3356   for (int i = 0; i < 10; ++i) {
3357 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3358     for (int i = 0; i < 10; ++i)
3359       ;
3360   }
3361 #pragma omp for simd
3362   for (int i = 0; i < 10; ++i) {
3363 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3364     {
3365       bar();
3366     }
3367   }
3368 #pragma omp for simd
3369   for (int i = 0; i < 10; ++i) {
3370 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3371     {
3372       bar();
3373     }
3374   }
3375 #pragma omp for simd
3376   for (int i = 0; i < 10; ++i) {
3377 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3378     bar();
3379 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3380     bar();
3381   }
3382 #pragma omp for simd
3383   for (int i = 0; i < 10; ++i) {
3384 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3385     bar();
3386 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3387     bar();
3388   }
3389 #pragma omp for simd
3390   for (int i = 0; i < 10; ++i) {
3391 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3392     for (int i = 0; i < 10; ++i)
3393       ;
3394   }
3395 #pragma omp for simd
3396   for (int i = 0; i < 10; ++i) {
3397 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3398     for (int i = 0; i < 10; ++i)
3399       ;
3400   }
3401 #pragma omp for simd
3402   for (int i = 0; i < 10; ++i) {
3403 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3404     {
3405       bar();
3406     }
3407   }
3408 #pragma omp for simd
3409   for (int i = 0; i < 10; ++i) {
3410 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3411     {
3412       bar();
3413     }
3414   }
3415 #pragma omp for simd
3416   for (int i = 0; i < 10; ++i) {
3417 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3418     bar();
3419   }
3420 #pragma omp for simd
3421   for (int i = 0; i < 10; ++i) {
3422 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3423     bar();
3424   }
3425 #pragma omp for simd
3426   for (int i = 0; i < 10; ++i) {
3427 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3428     bar();
3429   }
3430 #pragma omp for simd
3431   for (int i = 0; i < 10; ++i) {
3432 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3433     bar();
3434   }
3435 #pragma omp for simd
3436   for (int i = 0; i < 10; ++i) {
3437 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3438     bar();
3439   }
3440 #pragma omp for simd
3441   for (int i = 0; i < 10; ++i) {
3442 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3443     ++a;
3444   }
3445 #pragma omp for simd
3446   for (int i = 0; i < 10; ++i) {
3447 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3448     ++a;
3449   }
3450 #pragma omp for simd
3451   for (int i = 0; i < 10; ++i) {
3452 #pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3453     ++a;
3454   }
3455 #pragma omp for simd
3456   for (int i = 0; i < 10; ++i) {
3457 #pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3458   for (int i = 0; i < 10; ++i)
3459     ++a;
3460   }
3461 #pragma omp for simd
3462   for (int i = 0; i < 10; ++i) {
3463 #pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}}
3464     for (int j = 0; j < 10; ++j)
3465       ;
3466   }
3467 
3468 // SECTIONS DIRECTIVE
3469 #pragma omp sections
3470   {
3471 #pragma omp for // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
3472     for (int i = 0; i < 10; ++i)
3473       ;
3474   }
3475 #pragma omp sections
3476   {
3477 #pragma omp simd
3478     for (int i = 0; i < 10; ++i)
3479       ;
3480   }
3481 #pragma omp sections
3482   {
3483 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
3484     for (int i = 0; i < 10; ++i)
3485       ;
3486   }
3487 #pragma omp sections
3488   {
3489 #pragma omp parallel
3490     for (int i = 0; i < 10; ++i)
3491       ;
3492   }
3493 #pragma omp sections
3494   {
3495 #pragma omp sections // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
3496     {
3497       bar();
3498     }
3499   }
3500 #pragma omp sections
3501   {
3502 #pragma omp section
3503     {
3504       bar();
3505     }
3506   }
3507 #pragma omp sections
3508   {
3509 #pragma omp critical
3510     bar();
3511 #pragma omp single // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
3512     bar();
3513 #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}}
3514     bar();
3515   }
3516 #pragma omp sections
3517   {
3518 #pragma omp parallel
3519     {
3520 #pragma omp single // OK
3521       {
3522         bar();
3523       }
3524 #pragma omp for // OK
3525       for (int i = 0; i < 10; ++i)
3526         ;
3527 #pragma omp for simd // OK
3528       for (int i = 0; i < 10; ++i)
3529         ;
3530 #pragma omp sections // OK
3531       {
3532         bar();
3533       }
3534     }
3535   }
3536 #pragma omp sections
3537   {
3538 #pragma omp parallel for
3539     for (int i = 0; i < 10; ++i)
3540       ;
3541   }
3542 #pragma omp sections
3543   {
3544 #pragma omp parallel for simd
3545     for (int i = 0; i < 10; ++i)
3546       ;
3547   }
3548 #pragma omp sections
3549   {
3550 #pragma omp parallel sections
3551     {
3552       bar();
3553     }
3554   }
3555 #pragma omp sections
3556   {
3557 #pragma omp task
3558     {
3559       bar();
3560     }
3561   }
3562 #pragma omp sections
3563   {
3564 #pragma omp taskyield
3565   }
3566 #pragma omp sections
3567   {
3568 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'sections' region}}
3569     bar();
3570   }
3571 #pragma omp sections
3572   {
3573 #pragma omp taskwait
3574   }
3575 #pragma omp sections
3576   {
3577 #pragma omp flush
3578   }
3579 #pragma omp sections
3580   {
3581 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
3582     bar();
3583   }
3584 #pragma omp sections
3585   {
3586 #pragma omp atomic
3587     ++a;
3588   }
3589 #pragma omp sections
3590   {
3591 #pragma omp target
3592     ++a;
3593   }
3594 #pragma omp sections
3595   {
3596 #pragma omp teams // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
3597     ++a;
3598   }
3599 #pragma omp sections
3600   {
3601 #pragma omp taskloop
3602   for (int i = 0; i < 10; ++i)
3603     ++a;
3604   }
3605 #pragma omp sections
3606   {
3607 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
3608     for (int i = 0; i < 10; ++i)
3609       ;
3610   }
3611 
3612 // SECTION DIRECTIVE
3613 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}}
3614   {
3615     bar();
3616   }
3617 #pragma omp sections
3618   {
3619 #pragma omp section
3620     {
3621 #pragma omp for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
3622       for (int i = 0; i < 10; ++i)
3623         ;
3624     }
3625   }
3626 #pragma omp sections
3627   {
3628 #pragma omp section
3629     {
3630 #pragma omp simd
3631       for (int i = 0; i < 10; ++i)
3632         ;
3633     }
3634   }
3635 #pragma omp sections
3636   {
3637 #pragma omp section
3638     {
3639 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
3640       for (int i = 0; i < 10; ++i)
3641         ;
3642     }
3643   }
3644 #pragma omp sections
3645   {
3646 #pragma omp section
3647     {
3648 #pragma omp parallel
3649       for (int i = 0; i < 10; ++i)
3650         ;
3651     }
3652   }
3653 #pragma omp sections
3654   {
3655 #pragma omp section
3656     {
3657 #pragma omp sections // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
3658       {
3659         bar();
3660       }
3661     }
3662   }
3663 #pragma omp sections
3664   {
3665 #pragma omp section
3666     {
3667 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}}
3668       {
3669         bar();
3670       }
3671     }
3672   }
3673 #pragma omp sections
3674   {
3675 #pragma omp section
3676     {
3677 #pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
3678       bar();
3679 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
3680       bar();
3681 #pragma omp critical
3682       bar();
3683     }
3684   }
3685 #pragma omp sections
3686   {
3687 #pragma omp section
3688     {
3689 #pragma omp parallel
3690       {
3691 #pragma omp single // OK
3692         {
3693           bar();
3694         }
3695 #pragma omp for // OK
3696         for (int i = 0; i < 10; ++i)
3697           ;
3698 #pragma omp for simd // OK
3699         for (int i = 0; i < 10; ++i)
3700           ;
3701 #pragma omp sections // OK
3702         {
3703           bar();
3704         }
3705       }
3706     }
3707   }
3708 #pragma omp sections
3709   {
3710 #pragma omp section
3711     {
3712 #pragma omp parallel for
3713       for (int i = 0; i < 10; ++i)
3714         ;
3715     }
3716   }
3717 #pragma omp sections
3718   {
3719 #pragma omp section
3720     {
3721 #pragma omp parallel for simd
3722       for (int i = 0; i < 10; ++i)
3723         ;
3724     }
3725   }
3726 #pragma omp sections
3727   {
3728 #pragma omp section
3729     {
3730 #pragma omp parallel sections
3731       {
3732         bar();
3733       }
3734     }
3735   }
3736 #pragma omp sections
3737   {
3738 #pragma omp section
3739     {
3740 #pragma omp task
3741       {
3742         bar();
3743       }
3744     }
3745   }
3746 #pragma omp sections
3747   {
3748 #pragma omp section
3749     {
3750 #pragma omp taskyield
3751       bar();
3752     }
3753   }
3754 #pragma omp sections
3755   {
3756 #pragma omp section
3757     {
3758 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}}
3759       bar();
3760     }
3761   }
3762 #pragma omp sections
3763   {
3764 #pragma omp section
3765     {
3766 #pragma omp taskwait
3767       bar();
3768     }
3769   }
3770 #pragma omp sections
3771   {
3772 #pragma omp section
3773     {
3774 #pragma omp flush
3775       bar();
3776     }
3777   }
3778 #pragma omp sections
3779   {
3780 #pragma omp section
3781     {
3782 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
3783       bar();
3784     }
3785   }
3786 #pragma omp sections
3787   {
3788 #pragma omp section
3789     {
3790 #pragma omp atomic
3791       ++a;
3792     }
3793   }
3794 #pragma omp sections
3795   {
3796 #pragma omp section
3797     {
3798 #pragma omp target
3799       ++a;
3800     }
3801   }
3802 #pragma omp sections
3803   {
3804 #pragma omp section
3805     {
3806 #pragma omp teams // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
3807       ++a;
3808     }
3809   }
3810 #pragma omp sections
3811   {
3812 #pragma omp section
3813     {
3814 #pragma omp taskloop
3815   for (int i = 0; i < 10; ++i)
3816       ++a;
3817     }
3818   }
3819 #pragma omp sections
3820   {
3821 #pragma omp section
3822 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
3823     for (int i = 0; i < 10; ++i)
3824       ;
3825   }
3826 
3827 // SINGLE DIRECTIVE
3828 #pragma omp single
3829   {
3830 #pragma omp for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
3831     for (int i = 0; i < 10; ++i)
3832       ;
3833   }
3834 #pragma omp single
3835   {
3836 #pragma omp simd
3837     for (int i = 0; i < 10; ++i)
3838       ;
3839   }
3840 #pragma omp single
3841   {
3842 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
3843     for (int i = 0; i < 10; ++i)
3844       ;
3845   }
3846 #pragma omp single
3847   {
3848 #pragma omp parallel
3849     for (int i = 0; i < 10; ++i)
3850       ;
3851   }
3852 #pragma omp single
3853   {
3854 #pragma omp single // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
3855     {
3856       bar();
3857     }
3858 #pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}}
3859     bar();
3860 #pragma omp critical
3861     bar();
3862   }
3863 #pragma omp single
3864   {
3865 #pragma omp sections // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
3866     {
3867       bar();
3868     }
3869   }
3870 #pragma omp single
3871   {
3872 #pragma omp parallel
3873     {
3874 #pragma omp single // OK
3875       {
3876         bar();
3877       }
3878 #pragma omp for // OK
3879       for (int i = 0; i < 10; ++i)
3880         ;
3881 #pragma omp for simd // OK
3882       for (int i = 0; i < 10; ++i)
3883         ;
3884 #pragma omp sections // OK
3885       {
3886         bar();
3887       }
3888     }
3889   }
3890 #pragma omp single
3891   {
3892 #pragma omp parallel for
3893     for (int i = 0; i < 10; ++i)
3894       ;
3895   }
3896 #pragma omp single
3897   {
3898 #pragma omp parallel for simd
3899     for (int i = 0; i < 10; ++i)
3900       ;
3901   }
3902 #pragma omp single
3903   {
3904 #pragma omp parallel sections
3905     {
3906       bar();
3907     }
3908   }
3909 #pragma omp single
3910   {
3911 #pragma omp task
3912     {
3913       bar();
3914     }
3915   }
3916 #pragma omp single
3917   {
3918 #pragma omp taskyield
3919     bar();
3920   }
3921 #pragma omp single
3922   {
3923 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}}
3924     bar();
3925   }
3926 #pragma omp single
3927   {
3928 #pragma omp taskwait
3929     bar();
3930   }
3931 #pragma omp single
3932   {
3933 #pragma omp flush
3934     bar();
3935   }
3936 #pragma omp single
3937   {
3938 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
3939     bar();
3940   }
3941 #pragma omp single
3942   {
3943 #pragma omp atomic
3944     ++a;
3945   }
3946 #pragma omp single
3947   {
3948 #pragma omp target
3949     ++a;
3950   }
3951 #pragma omp single
3952   {
3953 #pragma omp teams // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
3954     ++a;
3955   }
3956 #pragma omp single
3957   {
3958 #pragma omp taskloop
3959   for (int i = 0; i < 10; ++i)
3960     ++a;
3961   }
3962 #pragma omp single
3963   {
3964 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
3965     for (int i = 0; i < 10; ++i)
3966       ;
3967   }
3968 
3969 // MASTER DIRECTIVE
3970 #pragma omp master
3971   {
3972 #pragma omp for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
3973     for (int i = 0; i < 10; ++i)
3974       ;
3975   }
3976 #pragma omp master
3977   {
3978 #pragma omp simd
3979     for (int i = 0; i < 10; ++i)
3980       ;
3981   }
3982 #pragma omp master
3983   {
3984 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
3985     for (int i = 0; i < 10; ++i)
3986       ;
3987   }
3988 #pragma omp master
3989   {
3990 #pragma omp parallel
3991     for (int i = 0; i < 10; ++i)
3992       ;
3993   }
3994 #pragma omp master
3995   {
3996 #pragma omp single // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
3997     {
3998       bar();
3999     }
4000   }
4001 #pragma omp master
4002   {
4003 #pragma omp master // OK, though second 'master' is redundant
4004     {
4005       bar();
4006     }
4007   }
4008 #pragma omp master
4009   {
4010 #pragma omp critical
4011     {
4012       bar();
4013     }
4014   }
4015 #pragma omp master
4016   {
4017 #pragma omp sections // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
4018     {
4019       bar();
4020     }
4021   }
4022 #pragma omp master
4023   {
4024 #pragma omp parallel
4025     {
4026 #pragma omp master // OK
4027       {
4028         bar();
4029       }
4030 #pragma omp for // OK
4031       for (int i = 0; i < 10; ++i)
4032         ;
4033 #pragma omp for simd // OK
4034       for (int i = 0; i < 10; ++i)
4035         ;
4036 #pragma omp sections // OK
4037       {
4038         bar();
4039       }
4040     }
4041   }
4042 #pragma omp master
4043   {
4044 #pragma omp parallel for
4045     for (int i = 0; i < 10; ++i)
4046       ;
4047   }
4048 #pragma omp master
4049   {
4050 #pragma omp parallel for simd
4051     for (int i = 0; i < 10; ++i)
4052       ;
4053   }
4054 #pragma omp master
4055   {
4056 #pragma omp parallel sections
4057     {
4058       bar();
4059     }
4060   }
4061 #pragma omp master
4062   {
4063 #pragma omp task
4064     {
4065       bar();
4066     }
4067   }
4068 #pragma omp master
4069   {
4070 #pragma omp taskyield
4071     bar();
4072   }
4073 #pragma omp master
4074   {
4075 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}}
4076     bar();
4077   }
4078 #pragma omp master
4079   {
4080 #pragma omp taskwait
4081     bar();
4082   }
4083 #pragma omp master
4084   {
4085 #pragma omp flush
4086     bar();
4087   }
4088 #pragma omp master
4089   {
4090 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
4091     bar();
4092   }
4093 #pragma omp master
4094   {
4095 #pragma omp atomic
4096     ++a;
4097   }
4098 #pragma omp master
4099   {
4100 #pragma omp target
4101     ++a;
4102   }
4103 #pragma omp master
4104   {
4105 #pragma omp teams // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
4106     ++a;
4107   }
4108 #pragma omp master
4109   {
4110 #pragma omp taskloop
4111   for (int i = 0; i < 10; ++i)
4112     ++a;
4113   }
4114 #pragma omp master
4115   {
4116 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
4117     for (int i = 0; i < 10; ++i)
4118       ;
4119   }
4120 
4121 // CRITICAL DIRECTIVE
4122 #pragma omp critical
4123   {
4124 #pragma omp for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
4125     for (int i = 0; i < 10; ++i)
4126       ;
4127   }
4128 #pragma omp critical
4129   {
4130 #pragma omp simd
4131     for (int i = 0; i < 10; ++i)
4132       ;
4133   }
4134 #pragma omp critical
4135   {
4136 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
4137     for (int i = 0; i < 10; ++i)
4138       ;
4139   }
4140 #pragma omp critical
4141   {
4142 #pragma omp parallel
4143     for (int i = 0; i < 10; ++i)
4144       ;
4145   }
4146 #pragma omp critical
4147   {
4148 #pragma omp single // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
4149     {
4150       bar();
4151     }
4152   }
4153 #pragma omp critical
4154   {
4155 #pragma omp master // OK, though second 'master' is redundant
4156     {
4157       bar();
4158     }
4159   }
4160 #pragma omp critical
4161   {
4162 #pragma omp critical
4163     {
4164       bar();
4165     }
4166   }
4167 #pragma omp critical
4168   {
4169 #pragma omp sections // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
4170     {
4171       bar();
4172     }
4173   }
4174 #pragma omp critical
4175   {
4176 #pragma omp parallel
4177     {
4178 #pragma omp master // OK
4179       {
4180         bar();
4181       }
4182 #pragma omp for // OK
4183       for (int i = 0; i < 10; ++i)
4184         ;
4185 #pragma omp for simd // OK
4186       for (int i = 0; i < 10; ++i)
4187         ;
4188 #pragma omp sections // OK
4189       {
4190         bar();
4191       }
4192     }
4193   }
4194 #pragma omp critical
4195   {
4196 #pragma omp parallel for
4197     for (int i = 0; i < 10; ++i)
4198       ;
4199   }
4200 #pragma omp critical
4201   {
4202 #pragma omp parallel for simd
4203     for (int i = 0; i < 10; ++i)
4204       ;
4205   }
4206 #pragma omp critical
4207   {
4208 #pragma omp parallel sections
4209     {
4210       bar();
4211     }
4212   }
4213 #pragma omp critical
4214   {
4215 #pragma omp task
4216     {
4217       bar();
4218     }
4219   }
4220 #pragma omp critical
4221   {
4222 #pragma omp taskyield
4223     bar();
4224   }
4225 #pragma omp critical
4226   {
4227 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}}
4228     bar();
4229   }
4230 #pragma omp critical
4231   {
4232 #pragma omp taskwait
4233     bar();
4234   }
4235 #pragma omp critical(Belka)
4236   {
4237 #pragma omp critical(Strelka)
4238     bar();
4239   }
4240 #pragma omp critical(Tuzik) // expected-note {{previous 'critical' region starts here}}
4241   {
4242 #pragma omp critical(grelka) // expected-note {{previous 'critical' region starts here}}
4243     {
4244 #pragma omp critical(Tuzik) // expected-error {{cannot nest 'critical' regions having the same name 'Tuzik'}}
4245       {
4246 #pragma omp parallel
4247 #pragma omp critical(grelka) // expected-error {{cannot nest 'critical' regions having the same name 'grelka'}}
4248         {
4249           bar();
4250         }
4251       }
4252     }
4253   }
4254 #pragma omp critical
4255   {
4256 #pragma omp flush
4257     bar();
4258   }
4259 #pragma omp critical
4260   {
4261 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
4262     bar();
4263   }
4264 #pragma omp critical
4265   {
4266 #pragma omp atomic
4267     ++a;
4268   }
4269 #pragma omp critical
4270   {
4271 #pragma omp target
4272     ++a;
4273   }
4274 #pragma omp critical
4275   {
4276 #pragma omp teams // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
4277     ++a;
4278   }
4279 #pragma omp critical
4280   {
4281 #pragma omp taskloop
4282   for (int i = 0; i < 10; ++i)
4283     ++a;
4284   }
4285 #pragma omp critical
4286   {
4287 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
4288     for (int i = 0; i < 10; ++i)
4289       ;
4290   }
4291 
4292 // PARALLEL FOR DIRECTIVE
4293 #pragma omp parallel for
4294   for (int i = 0; i < 10; ++i) {
4295 #pragma omp for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
4296     for (int i = 0; i < 10; ++i)
4297       ;
4298   }
4299 #pragma omp parallel for
4300   for (int i = 0; i < 10; ++i) {
4301 #pragma omp simd
4302     for (int i = 0; i < 10; ++i)
4303       ;
4304   }
4305 #pragma omp parallel for
4306   for (int i = 0; i < 10; ++i) {
4307 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
4308     for (int i = 0; i < 10; ++i)
4309       ;
4310   }
4311 
4312 #pragma omp parallel for
4313   for (int i = 0; i < 10; ++i) {
4314 #pragma omp parallel
4315     for (int i = 0; i < 10; ++i)
4316       ;
4317   }
4318 #pragma omp parallel for
4319   for (int i = 0; i < 10; ++i) {
4320 #pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
4321     {
4322       bar();
4323     }
4324   }
4325 #pragma omp parallel for
4326   for (int i = 0; i < 10; ++i) {
4327 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}}
4328     {
4329       bar();
4330     }
4331   }
4332 #pragma omp parallel for
4333   for (int i = 0; i < 10; ++i) {
4334 #pragma omp single // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
4335     {
4336       bar();
4337     }
4338 #pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}}
4339     {
4340       bar();
4341     }
4342 #pragma omp critical
4343     {
4344       bar();
4345     }
4346   }
4347 #pragma omp parallel for
4348   for (int i = 0; i < 10; ++i) {
4349 #pragma omp parallel
4350     {
4351 #pragma omp single // OK
4352       {
4353         bar();
4354       }
4355 #pragma omp master // OK
4356       {
4357         bar();
4358       }
4359 #pragma omp critical // OK
4360       {
4361         bar();
4362       }
4363 #pragma omp for // OK
4364       for (int i = 0; i < 10; ++i)
4365         ;
4366 #pragma omp for simd // OK
4367       for (int i = 0; i < 10; ++i)
4368         ;
4369 #pragma omp sections // OK
4370       {
4371         bar();
4372       }
4373     }
4374   }
4375 #pragma omp parallel for
4376   for (int i = 0; i < 10; ++i) {
4377 #pragma omp parallel for
4378     for (int i = 0; i < 10; ++i)
4379       ;
4380   }
4381 #pragma omp parallel for
4382   for (int i = 0; i < 10; ++i) {
4383 #pragma omp parallel for simd
4384     for (int i = 0; i < 10; ++i)
4385       ;
4386   }
4387 #pragma omp parallel for
4388   for (int i = 0; i < 10; ++i) {
4389 #pragma omp parallel sections
4390     {
4391       bar();
4392     }
4393   }
4394 #pragma omp parallel for
4395   for (int i = 0; i < 10; ++i) {
4396 #pragma omp task
4397     {
4398       bar();
4399     }
4400   }
4401 #pragma omp parallel for
4402   for (int i = 0; i < 10; ++i) {
4403 #pragma omp taskyield
4404     bar();
4405   }
4406 #pragma omp parallel for
4407   for (int i = 0; i < 10; ++i) {
4408 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}}
4409     bar();
4410   }
4411 #pragma omp parallel for
4412   for (int i = 0; i < 10; ++i) {
4413 #pragma omp taskwait
4414     bar();
4415   }
4416 #pragma omp parallel for
4417   for (int i = 0; i < 10; ++i) {
4418 #pragma omp flush
4419     bar();
4420   }
4421 #pragma omp parallel for
4422   for (int i = 0; i < 10; ++i) {
4423 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
4424     bar();
4425   }
4426 #pragma omp parallel for ordered
4427   for (int i = 0; i < 10; ++i) {
4428 #pragma omp ordered // OK
4429     bar();
4430   }
4431 #pragma omp parallel for
4432   for (int i = 0; i < 10; ++i) {
4433 #pragma omp atomic
4434     ++a;
4435   }
4436 #pragma omp parallel for
4437   for (int i = 0; i < 10; ++i) {
4438 #pragma omp target
4439     ++a;
4440   }
4441 #pragma omp parallel for
4442   for (int i = 0; i < 10; ++i) {
4443 #pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
4444     ++a;
4445   }
4446 #pragma omp parallel for
4447   for (int i = 0; i < 10; ++i) {
4448 #pragma omp taskloop
4449   for (int i = 0; i < 10; ++i)
4450     ++a;
4451   }
4452 #pragma omp parallel for
4453   for (int i = 0; i < 10; ++i) {
4454 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
4455     for (int j = 0; j < 10; ++j)
4456       ;
4457   }
4458 
4459 // PARALLEL FOR SIMD DIRECTIVE
4460 #pragma omp parallel for simd
4461   for (int i = 0; i < 10; ++i) {
4462 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4463     for (int i = 0; i < 10; ++i)
4464       ;
4465   }
4466 #pragma omp parallel for simd
4467   for (int i = 0; i < 10; ++i) {
4468 #pragma omp simd// expected-error {{OpenMP constructs may not be nested inside a simd region}}
4469     for (int i = 0; i < 10; ++i)
4470       ;
4471   }
4472 #pragma omp parallel for simd
4473   for (int i = 0; i < 10; ++i) {
4474 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4475     for (int i = 0; i < 10; ++i)
4476       ;
4477   }
4478 #pragma omp parallel for simd
4479   for (int i = 0; i < 10; ++i) {
4480 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4481     for (int i = 0; i < 10; ++i)
4482       ;
4483   }
4484 #pragma omp parallel for simd
4485   for (int i = 0; i < 10; ++i) {
4486 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4487     {
4488       bar();
4489     }
4490   }
4491 #pragma omp parallel for simd
4492   for (int i = 0; i < 10; ++i) {
4493 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4494     {
4495       bar();
4496     }
4497   }
4498 #pragma omp parallel for simd
4499   for (int i = 0; i < 10; ++i) {
4500 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4501     {
4502       bar();
4503     }
4504   }
4505 
4506 #pragma omp parallel for simd
4507   for (int i = 0; i < 10; ++i) {
4508 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4509     {
4510       bar();
4511     }
4512   }
4513 
4514 #pragma omp parallel for simd
4515   for (int i = 0; i < 10; ++i) {
4516 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4517     {
4518       bar();
4519     }
4520   }
4521 
4522 #pragma omp parallel for simd
4523   for (int i = 0; i < 10; ++i) {
4524 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4525     {
4526 #pragma omp single
4527       {
4528         bar();
4529       }
4530 #pragma omp for
4531       for (int i = 0; i < 10; ++i)
4532         ;
4533 #pragma omp for simd
4534       for (int i = 0; i < 10; ++i)
4535         ;
4536 #pragma omp sections
4537       {
4538         bar();
4539       }
4540     }
4541   }
4542 #pragma omp parallel for simd
4543   for (int i = 0; i < 10; ++i) {
4544 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4545     for (int i = 0; i < 10; ++i)
4546       ;
4547   }
4548 #pragma omp parallel for simd
4549   for (int i = 0; i < 10; ++i) {
4550 #pragma omp parallel for simd// expected-error {{OpenMP constructs may not be nested inside a simd region}}
4551     for (int i = 0; i < 10; ++i)
4552       ;
4553   }
4554 #pragma omp parallel for simd
4555   for (int i = 0; i < 10; ++i) {
4556 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4557     {
4558       bar();
4559     }
4560   }
4561 #pragma omp parallel for simd
4562   for (int i = 0; i < 10; ++i) {
4563 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4564     {
4565       bar();
4566     }
4567   }
4568 #pragma omp parallel for simd
4569   for (int i = 0; i < 10; ++i) {
4570 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4571     bar();
4572   }
4573 #pragma omp parallel for simd
4574   for (int i = 0; i < 10; ++i) {
4575 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4576     bar();
4577   }
4578 #pragma omp parallel for simd
4579   for (int i = 0; i < 10; ++i) {
4580 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4581     bar();
4582   }
4583 #pragma omp parallel for simd
4584   for (int i = 0; i < 10; ++i) {
4585 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4586     bar();
4587   }
4588 #pragma omp parallel for simd
4589   for (int i = 0; i < 10; ++i) {
4590 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4591     bar();
4592   }
4593 #pragma omp parallel for simd
4594   for (int i = 0; i < 10; ++i) {
4595 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4596     bar();
4597   }
4598 #pragma omp parallel for simd
4599   for (int i = 0; i < 10; ++i) {
4600 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4601     ++a;
4602   }
4603 #pragma omp parallel for simd
4604   for (int i = 0; i < 10; ++i) {
4605 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4606     ++a;
4607   }
4608 #pragma omp parallel for simd
4609   for (int i = 0; i < 10; ++i) {
4610 #pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4611     ++a;
4612   }
4613 #pragma omp parallel for simd
4614   for (int i = 0; i < 10; ++i) {
4615 #pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4616   for (int i = 0; i < 10; ++i)
4617     ++a;
4618   }
4619 #pragma omp parallel for simd
4620   for (int i = 0; i < 10; ++i) {
4621 #pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}}
4622     for (int j = 0; j < 10; ++j)
4623       ;
4624   }
4625 
4626 // PARALLEL SECTIONS DIRECTIVE
4627 #pragma omp parallel sections
4628   {
4629 #pragma omp for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
4630     for (int i = 0; i < 10; ++i)
4631       ;
4632   }
4633 #pragma omp parallel sections
4634   {
4635 #pragma omp simd
4636     for (int i = 0; i < 10; ++i)
4637       ;
4638   }
4639 #pragma omp parallel sections
4640   {
4641 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
4642     for (int i = 0; i < 10; ++i)
4643       ;
4644   }
4645 #pragma omp parallel sections
4646   {
4647 #pragma omp parallel
4648     for (int i = 0; i < 10; ++i)
4649       ;
4650   }
4651 #pragma omp parallel sections
4652   {
4653 #pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
4654     {
4655       bar();
4656     }
4657   }
4658 #pragma omp parallel sections
4659   {
4660 #pragma omp section
4661     {
4662       bar();
4663     }
4664   }
4665 #pragma omp parallel sections
4666   {
4667 #pragma omp section
4668     {
4669 #pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
4670       bar();
4671 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
4672       bar();
4673 #pragma omp critical
4674       bar();
4675     }
4676   }
4677 #pragma omp parallel sections
4678   {
4679 #pragma omp parallel
4680     {
4681 #pragma omp single // OK
4682       {
4683         bar();
4684       }
4685 #pragma omp master // OK
4686       {
4687         bar();
4688       }
4689 #pragma omp critical // OK
4690       {
4691         bar();
4692       }
4693 #pragma omp for // OK
4694       for (int i = 0; i < 10; ++i)
4695         ;
4696 #pragma omp for simd // OK
4697       for (int i = 0; i < 10; ++i)
4698         ;
4699 #pragma omp sections // OK
4700       {
4701         bar();
4702       }
4703     }
4704   }
4705 #pragma omp parallel sections
4706   {
4707 #pragma omp parallel for
4708     for (int i = 0; i < 10; ++i)
4709       ;
4710   }
4711 #pragma omp parallel sections
4712   {
4713 #pragma omp parallel for simd
4714     for (int i = 0; i < 10; ++i)
4715       ;
4716   }
4717 #pragma omp parallel sections
4718   {
4719 #pragma omp parallel sections
4720     {
4721       bar();
4722     }
4723   }
4724 #pragma omp parallel sections
4725   {
4726 #pragma omp task
4727     {
4728       bar();
4729     }
4730   }
4731 #pragma omp parallel sections
4732   {
4733 #pragma omp taskyield
4734   }
4735 #pragma omp parallel sections
4736   {
4737 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}}
4738   }
4739 #pragma omp parallel sections
4740   {
4741 #pragma omp taskwait
4742   }
4743 #pragma omp parallel sections
4744   {
4745 #pragma omp flush
4746   }
4747 #pragma omp parallel sections
4748   {
4749 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
4750     bar();
4751   }
4752 #pragma omp parallel sections
4753   {
4754 #pragma omp atomic
4755     ++a;
4756   }
4757 #pragma omp parallel sections
4758   {
4759 #pragma omp target
4760     ++a;
4761   }
4762 #pragma omp parallel sections
4763   {
4764 #pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
4765     ++a;
4766   }
4767 #pragma omp parallel sections
4768   {
4769 #pragma omp taskloop
4770   for (int i = 0; i < 10; ++i)
4771     ++a;
4772   }
4773 #pragma omp parallel sections
4774   {
4775 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
4776     for (int i = 0; i < 10; ++i)
4777       ;
4778   }
4779 
4780 // TASK DIRECTIVE
4781 #pragma omp task
4782 #pragma omp for // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
4783   for (int i = 0; i < 10; ++i)
4784     ;
4785 #pragma omp task
4786 #pragma omp simd
4787   for (int i = 0; i < 10; ++i)
4788     ;
4789 #pragma omp task
4790 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
4791   for (int i = 0; i < 10; ++i)
4792     ;
4793 #pragma omp task
4794 #pragma omp sections // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
4795   {
4796     bar();
4797   }
4798 #pragma omp task
4799 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}}
4800   {
4801     bar();
4802   }
4803 #pragma omp task
4804 #pragma omp single // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
4805   bar();
4806 #pragma omp task
4807 #pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}}
4808   bar();
4809 #pragma omp task
4810 #pragma omp critical
4811   bar();
4812 #pragma omp task
4813 #pragma omp parallel for
4814   for (int i = 0; i < 10; ++i)
4815     ;
4816 #pragma omp task
4817 #pragma omp parallel for simd
4818   for (int i = 0; i < 10; ++i)
4819     ;
4820 #pragma omp task
4821 #pragma omp parallel sections
4822   {
4823     bar();
4824   }
4825 #pragma omp task
4826 #pragma omp task
4827   {
4828     bar();
4829   }
4830 #pragma omp task
4831   {
4832 #pragma omp taskyield
4833     bar();
4834   }
4835 #pragma omp task
4836   {
4837 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}}
4838     bar();
4839   }
4840 #pragma omp task
4841   {
4842 #pragma omp taskwait
4843     bar();
4844   }
4845 #pragma omp task
4846   {
4847 #pragma omp flush
4848     bar();
4849   }
4850 #pragma omp task
4851   {
4852 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
4853     bar();
4854   }
4855 #pragma omp task
4856   {
4857 #pragma omp atomic
4858     ++a;
4859   }
4860 #pragma omp task
4861   {
4862 #pragma omp target
4863     ++a;
4864   }
4865 #pragma omp task
4866   {
4867 #pragma omp teams // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
4868     ++a;
4869   }
4870 #pragma omp task
4871   {
4872 #pragma omp taskloop
4873   for (int i = 0; i < 10; ++i)
4874     ++a;
4875   }
4876 #pragma omp task
4877   {
4878 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
4879     for (int i = 0; i < 10; ++i)
4880       ;
4881   }
4882 
4883 // ATOMIC DIRECTIVE
4884 #pragma omp atomic
4885   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4886   // expected-note@+1 {{expected an expression statement}}
4887   {
4888 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4889     for (int i = 0; i < 10; ++i)
4890       ;
4891   }
4892 #pragma omp atomic
4893   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4894   // expected-note@+1 {{expected an expression statement}}
4895   {
4896 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4897     for (int i = 0; i < 10; ++i)
4898       ;
4899   }
4900 #pragma omp atomic
4901   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4902   // expected-note@+1 {{expected an expression statement}}
4903   {
4904 #pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4905     for (int i = 0; i < 10; ++i)
4906       ;
4907   }
4908 #pragma omp atomic
4909   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4910   // expected-note@+1 {{expected an expression statement}}
4911   {
4912 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4913     for (int i = 0; i < 10; ++i)
4914       ;
4915   }
4916 #pragma omp atomic
4917   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4918   // expected-note@+1 {{expected an expression statement}}
4919   {
4920 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4921     {
4922       bar();
4923     }
4924   }
4925 #pragma omp atomic
4926   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4927   // expected-note@+1 {{expected an expression statement}}
4928   {
4929 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4930     {
4931       bar();
4932     }
4933   }
4934 #pragma omp atomic
4935   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4936   // expected-note@+1 {{expected an expression statement}}
4937   {
4938 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4939     {
4940       bar();
4941     }
4942   }
4943 #pragma omp atomic
4944   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4945   // expected-note@+1 {{expected an expression statement}}
4946   {
4947 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4948     {
4949       bar();
4950     }
4951   }
4952 #pragma omp atomic
4953   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4954   // expected-note@+1 {{expected an expression statement}}
4955   {
4956 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4957     {
4958       bar();
4959     }
4960   }
4961 #pragma omp atomic
4962   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4963   // expected-note@+1 {{expected an expression statement}}
4964   {
4965 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4966     for (int i = 0; i < 10; ++i)
4967       ;
4968   }
4969 #pragma omp atomic
4970   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4971   // expected-note@+1 {{expected an expression statement}}
4972   {
4973 #pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4974     for (int i = 0; i < 10; ++i)
4975       ;
4976   }
4977 #pragma omp atomic
4978   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4979   // expected-note@+1 {{expected an expression statement}}
4980   {
4981 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4982     {
4983       bar();
4984     }
4985   }
4986 #pragma omp atomic
4987   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4988   // expected-note@+1 {{expected an expression statement}}
4989   {
4990 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
4991     {
4992       bar();
4993     }
4994   }
4995 #pragma omp atomic
4996   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
4997   // expected-note@+1 {{expected an expression statement}}
4998   {
4999 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5000     bar();
5001   }
5002 #pragma omp atomic
5003   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
5004   // expected-note@+1 {{expected an expression statement}}
5005   {
5006 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5007     bar();
5008   }
5009 #pragma omp atomic
5010   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
5011   // expected-note@+1 {{expected an expression statement}}
5012   {
5013 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5014     bar();
5015   }
5016 #pragma omp atomic
5017   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
5018   // expected-note@+1 {{expected an expression statement}}
5019   {
5020 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5021     bar();
5022   }
5023 #pragma omp atomic
5024   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
5025   // expected-note@+1 {{expected an expression statement}}
5026   {
5027 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5028     bar();
5029   }
5030 #pragma omp atomic
5031   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
5032   // expected-note@+1 {{expected an expression statement}}
5033   {
5034 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5035     ++a;
5036   }
5037 #pragma omp atomic
5038   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
5039   // expected-note@+1 {{expected an expression statement}}
5040   {
5041 #pragma omp target // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5042     ++a;
5043   }
5044 #pragma omp atomic
5045   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
5046   // expected-note@+1 {{expected an expression statement}}
5047   {
5048 #pragma omp teams // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5049     ++a;
5050   }
5051 #pragma omp atomic
5052   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
5053   // expected-note@+1 {{expected an expression statement}}
5054   {
5055 #pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5056   for (int i = 0; i < 10; ++i)
5057     ++a;
5058   }
5059 #pragma omp atomic
5060   // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an l-value expression with scalar type}}
5061   // expected-note@+1 {{expected an expression statement}}
5062   {
5063 #pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
5064     for (int i = 0; i < 10; ++i)
5065       ;
5066   }
5067 
5068 // TARGET DIRECTIVE
5069 #pragma omp target
5070 #pragma omp parallel
5071   bar();
5072 #pragma omp target
5073 #pragma omp for
5074   for (int i = 0; i < 10; ++i)
5075     ;
5076 #pragma omp target
5077 #pragma omp simd
5078   for (int i = 0; i < 10; ++i)
5079     ;
5080 #pragma omp target
5081 #pragma omp for simd
5082   for (int i = 0; i < 10; ++i)
5083     ;
5084 #pragma omp target
5085 #pragma omp sections
5086   {
5087     bar();
5088   }
5089 #pragma omp target
5090 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a target region}}
5091   {
5092     bar();
5093   }
5094 #pragma omp target
5095 #pragma omp single
5096   bar();
5097 
5098 #pragma omp target
5099 #pragma omp master
5100   {
5101     bar();
5102   }
5103 #pragma omp target
5104 #pragma omp critical
5105   {
5106     bar();
5107   }
5108 #pragma omp target
5109 #pragma omp parallel for
5110   for (int i = 0; i < 10; ++i)
5111     ;
5112 #pragma omp target
5113 #pragma omp parallel for simd
5114   for (int i = 0; i < 10; ++i)
5115     ;
5116 #pragma omp target
5117 #pragma omp parallel sections
5118   {
5119     bar();
5120   }
5121 #pragma omp target
5122 #pragma omp task
5123   {
5124     bar();
5125   }
5126 #pragma omp target
5127   {
5128 #pragma omp taskyield
5129     bar();
5130   }
5131 #pragma omp target
5132   {
5133 #pragma omp barrier
5134     bar();
5135   }
5136 #pragma omp target
5137   {
5138 #pragma omp taskwait
5139     bar();
5140   }
5141 #pragma omp target
5142   {
5143 #pragma omp flush
5144     bar();
5145   }
5146 #pragma omp target
5147   {
5148 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
5149     bar();
5150   }
5151 #pragma omp target
5152   {
5153 #pragma omp atomic
5154     ++a;
5155   }
5156 #pragma omp target
5157   {
5158 #pragma omp target
5159     ++a;
5160   }
5161 #pragma omp target
5162   {
5163 #pragma omp teams
5164     ++a;
5165   }
5166 #pragma omp target // expected-error {{target construct with nested teams region contains statements outside of the teams construct}}
5167   {
5168     ++a;          // expected-note {{statement outside teams construct here}}
5169 #pragma omp teams // expected-note {{nested teams construct here}}
5170     ++a;
5171   }
5172 #pragma omp target
5173   {
5174 #pragma omp taskloop
5175   for (int i = 0; i < 10; ++i)
5176     ++a;
5177   }
5178 #pragma omp target
5179   {
5180 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
5181     for (int i = 0; i < 10; ++i)
5182       ;
5183   }
5184 
5185 // TEAMS DIRECTIVE
5186 #pragma omp target
5187 #pragma omp teams
5188 #pragma omp parallel
5189   bar();
5190 #pragma omp target
5191 #pragma omp teams
5192 #pragma omp for // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
5193   for (int i = 0; i < 10; ++i)
5194     ;
5195 #pragma omp target
5196 #pragma omp teams
5197 #pragma omp simd // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp simd' directive into a parallel region?}}
5198   for (int i = 0; i < 10; ++i)
5199     ;
5200 #pragma omp target
5201 #pragma omp teams
5202 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
5203   for (int i = 0; i < 10; ++i)
5204     ;
5205 #pragma omp target
5206 #pragma omp teams
5207 #pragma omp sections // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
5208   {
5209     bar();
5210   }
5211 #pragma omp target
5212 #pragma omp teams
5213 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a teams region}}
5214   {
5215     bar();
5216   }
5217 #pragma omp target
5218 #pragma omp teams
5219 #pragma omp single // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
5220   bar();
5221 
5222 #pragma omp target
5223 #pragma omp teams
5224 #pragma omp master // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp master' directive into a parallel region?}}
5225   {
5226     bar();
5227   }
5228 #pragma omp target
5229 #pragma omp teams
5230 #pragma omp critical // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp critical' directive into a parallel region?}}
5231   {
5232     bar();
5233   }
5234 #pragma omp target
5235 #pragma omp teams
5236 #pragma omp parallel for
5237   for (int i = 0; i < 10; ++i)
5238     ;
5239 #pragma omp target
5240 #pragma omp teams
5241 #pragma omp parallel for simd
5242   for (int i = 0; i < 10; ++i)
5243     ;
5244 #pragma omp target
5245 #pragma omp teams
5246 #pragma omp parallel sections
5247   {
5248     bar();
5249   }
5250 #pragma omp target
5251 #pragma omp teams
5252 #pragma omp task // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp task' directive into a parallel region?}}
5253   {
5254     bar();
5255   }
5256 #pragma omp target
5257 #pragma omp teams
5258   {
5259 #pragma omp taskyield // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskyield' directive into a parallel region?}}
5260     bar();
5261   }
5262 #pragma omp target
5263 #pragma omp teams
5264   {
5265 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp barrier' directive into a parallel region?}}
5266     bar();
5267   }
5268 #pragma omp target
5269 #pragma omp teams
5270   {
5271 #pragma omp taskwait // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
5272     bar();
5273   }
5274 #pragma omp target
5275 #pragma omp teams
5276   {
5277 #pragma omp flush // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp flush' directive into a parallel region?}}
5278     bar();
5279   }
5280 #pragma omp target
5281 #pragma omp teams
5282   {
5283 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
5284     bar();
5285   }
5286 #pragma omp target
5287 #pragma omp teams
5288   {
5289 #pragma omp atomic // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp atomic' directive into a parallel region?}}
5290     ++a;
5291   }
5292 #pragma omp target
5293 #pragma omp teams
5294   {
5295 #pragma omp target // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp target' directive into a parallel region?}}
5296     ++a;
5297   }
5298 #pragma omp target
5299 #pragma omp teams
5300   {
5301 #pragma omp teams // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
5302     ++a;
5303   }
5304 #pragma omp target
5305 #pragma omp teams
5306   {
5307 #pragma omp taskloop // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskloop' directive into a parallel region?}}
5308   for (int i = 0; i < 10; ++i)
5309     ++a;
5310   }
5311 #pragma omp target
5312 #pragma omp teams
5313 #pragma omp distribute
5314   for (int i = 0; i < 10; ++i)
5315     ;
5316 #pragma omp target
5317 #pragma omp teams
5318 #pragma omp distribute
5319   for (int i = 0; i < 10; ++i)
5320     ;
5321 #pragma omp distribute
5322   for (int j = 0; j < 10; ++j)
5323     ;
5324 
5325 // TASKLOOP DIRECTIVE
5326 #pragma omp taskloop
5327   for (int i = 0; i < 10; ++i) {
5328 #pragma omp for // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
5329     for (int i = 0; i < 10; ++i)
5330       ;
5331   }
5332 #pragma omp taskloop
5333   for (int i = 0; i < 10; ++i) {
5334 #pragma omp simd
5335     for (int i = 0; i < 10; ++i)
5336       ;
5337   }
5338 #pragma omp taskloop
5339   for (int i = 0; i < 10; ++i) {
5340 #pragma omp for simd // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}}
5341     for (int i = 0; i < 10; ++i)
5342       ;
5343   }
5344 #pragma omp taskloop
5345   for (int i = 0; i < 10; ++i) {
5346 #pragma omp parallel
5347     for (int i = 0; i < 10; ++i)
5348       ;
5349   }
5350 #pragma omp taskloop
5351   for (int i = 0; i < 10; ++i) {
5352 #pragma omp sections // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
5353     {
5354       bar();
5355     }
5356   }
5357 #pragma omp taskloop
5358   for (int i = 0; i < 10; ++i) {
5359 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a taskloop region}}
5360     {
5361       bar();
5362     }
5363   }
5364 #pragma omp taskloop
5365   for (int i = 0; i < 10; ++i) {
5366 #pragma omp single // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
5367     {
5368       bar();
5369     }
5370   }
5371 
5372 #pragma omp taskloop
5373   for (int i = 0; i < 10; ++i) {
5374 #pragma omp master // expected-error {{region cannot be closely nested inside 'taskloop' region}}
5375     {
5376       bar();
5377     }
5378   }
5379 #pragma omp taskloop
5380   for (int i = 0; i < 10; ++i) {
5381 #pragma omp critical
5382     {
5383       bar();
5384     }
5385   }
5386 #pragma omp taskloop
5387   for (int i = 0; i < 10; ++i) {
5388 #pragma omp parallel
5389     {
5390 #pragma omp single // OK
5391       {
5392         bar();
5393       }
5394 #pragma omp for // OK
5395       for (int i = 0; i < 10; ++i)
5396         ;
5397 #pragma omp sections // OK
5398       {
5399         bar();
5400       }
5401     }
5402   }
5403 #pragma omp taskloop
5404   for (int i = 0; i < 10; ++i) {
5405 #pragma omp parallel for
5406     for (int i = 0; i < 10; ++i)
5407       ;
5408   }
5409 #pragma omp taskloop
5410   for (int i = 0; i < 10; ++i) {
5411 #pragma omp parallel for simd
5412     for (int i = 0; i < 10; ++i)
5413       ;
5414   }
5415 #pragma omp taskloop
5416   for (int i = 0; i < 10; ++i) {
5417 #pragma omp parallel sections
5418     {
5419       bar();
5420     }
5421   }
5422 #pragma omp taskloop
5423   for (int i = 0; i < 10; ++i) {
5424 #pragma omp task
5425     {
5426       bar();
5427     }
5428   }
5429 #pragma omp taskloop
5430   for (int i = 0; i < 10; ++i) {
5431 #pragma omp taskyield
5432     bar();
5433   }
5434 #pragma omp taskloop
5435   for (int i = 0; i < 10; ++i) {
5436 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'taskloop' region}}
5437     bar();
5438   }
5439 #pragma omp taskloop
5440   for (int i = 0; i < 10; ++i) {
5441 #pragma omp taskwait
5442     bar();
5443   }
5444 #pragma omp taskloop
5445   for (int i = 0; i < 10; ++i) {
5446 #pragma omp flush
5447     bar();
5448   }
5449 #pragma omp taskloop
5450   for (int i = 0; i < 10; ++i) {
5451 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
5452     bar();
5453   }
5454 #pragma omp taskloop
5455   for (int i = 0; i < 10; ++i) {
5456 #pragma omp atomic
5457     ++a;
5458   }
5459 #pragma omp taskloop
5460   for (int i = 0; i < 10; ++i) {
5461 #pragma omp target
5462     ++a;
5463   }
5464 #pragma omp taskloop
5465   for (int i = 0; i < 10; ++i) {
5466 #pragma omp teams // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
5467     ++a;
5468   }
5469 #pragma omp taskloop
5470   for (int i = 0; i < 10; ++i) {
5471 #pragma omp taskloop
5472   for (int i = 0; i < 10; ++i)
5473     ++a;
5474   }
5475 
5476 // DISTRIBUTE DIRECTIVE
5477 #pragma omp target
5478 #pragma omp teams
5479 #pragma omp distribute
5480   for (int i = 0; i < 10; ++i) {
5481 #pragma omp distribute // expected-error {{region cannot be closely nested inside 'distribute' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}
5482     for (int i = 0; i < 10; ++i)
5483       ;
5484   }
5485 #pragma omp target
5486 #pragma omp teams
5487 #pragma omp distribute
5488   for (int i = 0; i < 10; ++i) {
5489 #pragma omp for
5490     for (int i = 0; i < 10; ++i)
5491       ;
5492   }
5493 #pragma omp target
5494 #pragma omp teams
5495 #pragma omp distribute
5496   for (int i = 0; i < 10; ++i) {
5497 #pragma omp simd
5498     for (int i = 0; i < 10; ++i)
5499       ;
5500   }
5501 #pragma omp target
5502 #pragma omp teams
5503 #pragma omp distribute
5504   for (int i = 0; i < 10; ++i) {
5505 #pragma omp for simd
5506     for (int i = 0; i < 10; ++i)
5507       ;
5508   }
5509 #pragma omp target
5510 #pragma omp teams
5511 #pragma omp distribute
5512   for (int i = 0; i < 10; ++i) {
5513 #pragma omp parallel
5514     for (int i = 0; i < 10; ++i)
5515       ;
5516   }
5517 #pragma omp target
5518 #pragma omp teams
5519 #pragma omp distribute
5520   for (int i = 0; i < 10; ++i) {
5521 #pragma omp sections
5522     {
5523       bar();
5524     }
5525   }
5526 #pragma omp target
5527 #pragma omp teams
5528 #pragma omp distribute
5529   for (int i = 0; i < 10; ++i) {
5530 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a distribute region}}
5531     {
5532       bar();
5533     }
5534   }
5535 #pragma omp target
5536 #pragma omp teams
5537 #pragma omp distribute
5538   for (int i = 0; i < 10; ++i) {
5539 #pragma omp single
5540     {
5541       bar();
5542     }
5543   }
5544 #pragma omp target
5545 #pragma omp teams
5546 #pragma omp distribute
5547   for (int i = 0; i < 10; ++i) {
5548 #pragma omp master
5549     {
5550       bar();
5551     }
5552   }
5553 #pragma omp target
5554 #pragma omp teams
5555 #pragma omp distribute
5556   for (int i = 0; i < 10; ++i) {
5557 #pragma omp critical
5558     {
5559       bar();
5560     }
5561   }
5562 #pragma omp target
5563 #pragma omp teams
5564 #pragma omp distribute
5565   for (int i = 0; i < 10; ++i) {
5566 #pragma omp parallel
5567     {
5568 #pragma omp single
5569       {
5570 	bar();
5571       }
5572     }
5573   }
5574 #pragma omp target
5575 #pragma omp teams
5576 #pragma omp distribute
5577   for (int i = 0; i < 10; ++i) {
5578 #pragma omp parallel for
5579     for (int i = 0; i < 10; ++i)
5580       ;
5581   }
5582 #pragma omp target
5583 #pragma omp teams
5584 #pragma omp distribute
5585   for (int i = 0; i < 10; ++i) {
5586 #pragma omp parallel for simd
5587     for (int i = 0; i < 10; ++i)
5588       ;
5589   }
5590 #pragma omp target
5591 #pragma omp teams
5592 #pragma omp distribute
5593   for (int i = 0; i < 10; ++i) {
5594 #pragma omp parallel sections
5595     {
5596       bar();
5597     }
5598   }
5599 #pragma omp target
5600 #pragma omp teams
5601 #pragma omp distribute
5602   for (int i = 0; i < 10; ++i) {
5603 #pragma omp task
5604     {
5605       bar();
5606     }
5607   }
5608 #pragma omp target
5609 #pragma omp teams
5610 #pragma omp distribute
5611   for (int i = 0; i < 10; ++i) {
5612 #pragma omp taskyield
5613     bar();
5614   }
5615 #pragma omp target
5616 #pragma omp teams
5617 #pragma omp distribute
5618   for (int i = 0; i < 10; ++i) {
5619 #pragma omp barrier
5620     bar();
5621   }
5622 #pragma omp target
5623 #pragma omp teams
5624 #pragma omp distribute
5625   for (int i = 0; i < 10; ++i) {
5626 #pragma omp taskwait
5627     bar();
5628   }
5629 #pragma omp target
5630 #pragma omp teams
5631 #pragma omp distribute
5632   for (int i = 0; i < 10; ++i) {
5633 #pragma omp flush
5634     bar();
5635   }
5636 #pragma omp target
5637 #pragma omp teams
5638 #pragma omp distribute
5639   for (int i = 0; i < 10; ++i) {
5640 #pragma omp ordered // expected-error {{region cannot be closely nested inside 'distribute' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}
5641     bar();
5642   }
5643 #pragma omp target
5644 #pragma omp teams
5645 #pragma omp distribute
5646   for (int i = 0; i < 10; ++i) {
5647 #pragma omp atomic
5648     ++a;
5649   }
5650 #pragma omp target
5651 #pragma omp teams
5652 #pragma omp distribute
5653   for (int i = 0; i < 10; ++i) {
5654 #pragma omp target
5655     ++a;
5656   }
5657 #pragma omp target
5658 #pragma omp teams
5659 #pragma omp distribute
5660   for (int i = 0; i < 10; ++i) {
5661 #pragma omp teams // expected-error {{region cannot be closely nested inside 'distribute' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}
5662     ++a;
5663   }
5664   return foo<int>();
5665 }
5666 
5667