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