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