1 // RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -verify %s
2 
3 void bar();
4 
5 template <class T>
6 void foo() {
7   T a = T();
8 // PARALLEL DIRECTIVE
9 #pragma omp parallel
10 #pragma omp for
11   for (int i = 0; i < 10; ++i)
12     ;
13 #pragma omp parallel
14 #pragma omp simd
15   for (int i = 0; i < 10; ++i)
16     ;
17 #pragma omp parallel
18 #pragma omp sections
19   {
20     bar();
21   }
22 #pragma omp parallel
23 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}}
24   {
25     bar();
26   }
27 #pragma omp parallel
28 #pragma omp single
29   bar();
30 
31 #pragma omp parallel
32 #pragma omp master
33   {
34     bar();
35   }
36 #pragma omp parallel
37 #pragma omp critical
38   {
39     bar();
40   }
41 #pragma omp parallel
42 #pragma omp parallel for
43   for (int i = 0; i < 10; ++i)
44     ;
45 #pragma omp parallel
46 #pragma omp parallel sections
47   {
48     bar();
49   }
50 #pragma omp parallel
51 #pragma omp task
52   {
53     bar();
54   }
55 #pragma omp parallel
56   {
57 #pragma omp taskyield
58     bar();
59   }
60 #pragma omp parallel
61   {
62 #pragma omp barrier
63     bar();
64   }
65 #pragma omp parallel
66   {
67 #pragma omp taskwait
68     bar();
69   }
70 #pragma omp parallel
71   {
72 #pragma omp flush
73     bar();
74   }
75 #pragma omp parallel
76   {
77 #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?}}
78     bar();
79   }
80 #pragma omp parallel
81   {
82 #pragma omp atomic
83     ++a;
84   }
85 
86 // SIMD DIRECTIVE
87 #pragma omp simd
88   for (int i = 0; i < 10; ++i) {
89 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
90     for (int i = 0; i < 10; ++i)
91       ;
92   }
93 #pragma omp simd
94   for (int i = 0; i < 10; ++i) {
95 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
96     for (int i = 0; i < 10; ++i)
97       ;
98   }
99 #pragma omp simd
100   for (int i = 0; i < 10; ++i) {
101 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
102     for (int i = 0; i < 10; ++i)
103       ;
104   }
105 #pragma omp simd
106   for (int i = 0; i < 10; ++i) {
107 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
108     {
109       bar();
110     }
111   }
112 #pragma omp simd
113   for (int i = 0; i < 10; ++i) {
114 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
115     {
116       bar();
117     }
118   }
119 #pragma omp simd
120   for (int i = 0; i < 10; ++i) {
121 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
122     {
123       bar();
124     }
125   }
126 #pragma omp simd
127   for (int i = 0; i < 10; ++i) {
128 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}
129     {
130       bar();
131     }
132   }
133 #pragma omp simd
134   for (int i = 0; i < 10; ++i) {
135 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}
136     {
137       bar();
138     }
139   }
140 #pragma omp simd
141   for (int i = 0; i < 10; ++i) {
142 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
143     for (int i = 0; i < 10; ++i)
144       ;
145   }
146 #pragma omp simd
147   for (int i = 0; i < 10; ++i) {
148 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
149     {
150       bar();
151     }
152   }
153 #pragma omp simd
154   for (int i = 0; i < 10; ++i) {
155 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}
156     {
157       bar();
158     }
159   }
160 #pragma omp simd
161   for (int i = 0; i < 10; ++i) {
162 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}
163     bar();
164   }
165 #pragma omp simd
166   for (int i = 0; i < 10; ++i) {
167 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}
168     bar();
169   }
170 #pragma omp simd
171   for (int i = 0; i < 10; ++i) {
172 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
173     bar();
174   }
175 #pragma omp simd
176   for (int i = 0; i < 10; ++i) {
177 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}
178     bar();
179   }
180 #pragma omp simd
181   for (int i = 0; i < 10; ++i) {
182 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
183     bar();
184   }
185 #pragma omp simd
186   for (int i = 0; i < 10; ++i) {
187 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}
188     ++a;
189   }
190 
191 // FOR DIRECTIVE
192 #pragma omp for
193   for (int i = 0; i < 10; ++i) {
194 #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?}}
195     for (int i = 0; i < 10; ++i)
196       ;
197   }
198 #pragma omp for
199   for (int i = 0; i < 10; ++i) {
200 #pragma omp simd
201     for (int i = 0; i < 10; ++i)
202       ;
203   }
204 #pragma omp for
205   for (int i = 0; i < 10; ++i) {
206 #pragma omp parallel
207     for (int i = 0; i < 10; ++i)
208       ;
209   }
210 #pragma omp for
211   for (int i = 0; i < 10; ++i) {
212 #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?}}
213     {
214       bar();
215     }
216   }
217 #pragma omp for
218   for (int i = 0; i < 10; ++i) {
219 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}}
220     {
221       bar();
222     }
223   }
224 #pragma omp for
225   for (int i = 0; i < 10; ++i) {
226 #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?}}
227     {
228       bar();
229     }
230   }
231 
232 #pragma omp for
233   for (int i = 0; i < 10; ++i) {
234 #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}}
235     {
236       bar();
237     }
238   }
239 #pragma omp for
240   for (int i = 0; i < 10; ++i) {
241 #pragma omp critical
242     {
243       bar();
244     }
245   }
246 #pragma omp for
247   for (int i = 0; i < 10; ++i) {
248 #pragma omp parallel
249     {
250 #pragma omp single // OK
251       {
252         bar();
253       }
254 #pragma omp for // OK
255       for (int i = 0; i < 10; ++i)
256         ;
257 #pragma omp sections // OK
258       {
259         bar();
260       }
261     }
262   }
263 #pragma omp for
264   for (int i = 0; i < 10; ++i) {
265 #pragma omp parallel for
266     for (int i = 0; i < 10; ++i)
267       ;
268   }
269 #pragma omp for
270   for (int i = 0; i < 10; ++i) {
271 #pragma omp parallel sections
272     {
273       bar();
274     }
275   }
276 #pragma omp for
277   for (int i = 0; i < 10; ++i) {
278 #pragma omp task
279     {
280       bar();
281     }
282   }
283 #pragma omp for
284   for (int i = 0; i < 10; ++i) {
285 #pragma omp taskyield
286     bar();
287   }
288 #pragma omp for
289   for (int i = 0; i < 10; ++i) {
290 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'for' region}}
291     bar();
292   }
293 #pragma omp for
294   for (int i = 0; i < 10; ++i) {
295 #pragma omp taskwait
296     bar();
297   }
298 #pragma omp for
299   for (int i = 0; i < 10; ++i) {
300 #pragma omp flush
301     bar();
302   }
303 #pragma omp for
304   for (int i = 0; i < 10; ++i) {
305 #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?}}
306     bar();
307   }
308 #pragma omp for ordered
309   for (int i = 0; i < 10; ++i) {
310 #pragma omp ordered // OK
311     bar();
312   }
313 #pragma omp for
314   for (int i = 0; i < 10; ++i) {
315 #pragma omp atomic
316     ++a;
317   }
318 
319 // SECTIONS DIRECTIVE
320 #pragma omp sections
321   {
322 #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?}}
323     for (int i = 0; i < 10; ++i)
324       ;
325   }
326 #pragma omp sections
327   {
328 #pragma omp simd
329     for (int i = 0; i < 10; ++i)
330       ;
331   }
332 #pragma omp sections
333   {
334 #pragma omp parallel
335     for (int i = 0; i < 10; ++i)
336       ;
337   }
338 #pragma omp sections
339   {
340 #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?}}
341     {
342       bar();
343     }
344   }
345 #pragma omp sections
346   {
347 #pragma omp section
348     {
349       bar();
350     }
351   }
352 #pragma omp sections
353   {
354 #pragma omp parallel
355     {
356 #pragma omp single // OK
357       {
358         bar();
359       }
360 #pragma omp for // OK
361       for (int i = 0; i < 10; ++i)
362         ;
363 #pragma omp sections // OK
364       {
365         bar();
366       }
367     }
368   }
369 #pragma omp sections
370   {
371 #pragma omp parallel
372     {
373 #pragma omp master // OK
374       {
375         bar();
376       }
377 #pragma omp for // OK
378       for (int i = 0; i < 10; ++i)
379         ;
380 #pragma omp master // OK
381       {
382         bar();
383       }
384     }
385 #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}}
386     bar();
387   }
388 #pragma omp sections
389   {
390 #pragma omp parallel
391     {
392 #pragma omp critical(A) // OK
393       {
394         bar();
395       }
396 #pragma omp for // OK
397       for (int i = 0; i < 10; ++i)
398         ;
399 #pragma omp critical // OK
400       {
401         bar();
402       }
403     }
404 #pragma omp critical(A) // expected-error {{statement in 'omp sections' directive must be enclosed into a section region}}
405     bar();
406   }
407 #pragma omp sections
408   {
409 #pragma omp parallel for
410     for (int i = 0; i < 10; ++i)
411       ;
412   }
413 #pragma omp sections
414   {
415 #pragma omp parallel sections
416     {
417       bar();
418     }
419   }
420 #pragma omp sections
421   {
422 #pragma omp task
423     {
424       bar();
425     }
426   }
427 #pragma omp sections
428   {
429 #pragma omp taskyield
430   }
431 #pragma omp sections
432   {
433 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'sections' region}}
434   }
435 #pragma omp sections
436   {
437 #pragma omp taskwait
438   }
439 #pragma omp sections
440   {
441 #pragma omp flush
442   }
443 #pragma omp sections
444   {
445 #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?}}
446     bar();
447   }
448 #pragma omp sections
449   {
450 #pragma omp atomic
451     ++a;
452   }
453 
454 // SECTION DIRECTIVE
455 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}}
456   {
457     bar();
458   }
459 #pragma omp sections
460   {
461 #pragma omp section
462     {
463 #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?}}
464       for (int i = 0; i < 10; ++i)
465         ;
466     }
467   }
468 #pragma omp sections
469   {
470 #pragma omp section
471     {
472 #pragma omp simd
473       for (int i = 0; i < 10; ++i)
474         ;
475     }
476   }
477 #pragma omp sections
478   {
479 #pragma omp section
480     {
481 #pragma omp parallel
482       for (int i = 0; i < 10; ++i)
483         ;
484     }
485   }
486 #pragma omp sections
487   {
488 #pragma omp section
489     {
490 #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?}}
491       {
492         bar();
493       }
494     }
495   }
496 #pragma omp sections
497   {
498 #pragma omp section
499     {
500 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}}
501       {
502         bar();
503       }
504     }
505   }
506 #pragma omp sections
507   {
508 #pragma omp section
509     {
510 #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?}}
511       bar();
512 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
513       bar();
514 #pragma omp critical
515       bar();
516     }
517   }
518 #pragma omp sections
519   {
520 #pragma omp section
521     {
522 #pragma omp parallel
523       {
524 #pragma omp single // OK
525         {
526           bar();
527         }
528 #pragma omp for // OK
529         for (int i = 0; i < 10; ++i)
530           ;
531 #pragma omp sections // OK
532         {
533           bar();
534         }
535       }
536     }
537   }
538 #pragma omp sections
539   {
540 #pragma omp section
541     {
542 #pragma omp parallel for
543       for (int i = 0; i < 10; ++i)
544         ;
545     }
546   }
547 #pragma omp sections
548   {
549 #pragma omp section
550     {
551 #pragma omp parallel sections
552       {
553         bar();
554       }
555     }
556   }
557 #pragma omp sections
558   {
559 #pragma omp section
560     {
561 #pragma omp task
562       {
563         bar();
564       }
565     }
566   }
567 #pragma omp sections
568   {
569 #pragma omp section
570     {
571 #pragma omp taskyield
572       bar();
573     }
574   }
575 #pragma omp sections
576   {
577 #pragma omp section
578     {
579 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}}
580       bar();
581     }
582   }
583 #pragma omp sections
584   {
585 #pragma omp section
586     {
587 #pragma omp taskwait
588       bar();
589     }
590   }
591 #pragma omp sections
592   {
593 #pragma omp section
594     {
595 #pragma omp flush
596       bar();
597     }
598   }
599 #pragma omp sections
600   {
601 #pragma omp section
602     {
603 #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?}}
604       bar();
605     }
606   }
607 #pragma omp sections
608   {
609 #pragma omp section
610 #pragma omp atomic
611     ++a;
612   }
613 
614 // SINGLE DIRECTIVE
615 #pragma omp single
616   {
617 #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?}}
618     for (int i = 0; i < 10; ++i)
619       ;
620   }
621 #pragma omp single
622   {
623 #pragma omp simd
624     for (int i = 0; i < 10; ++i)
625       ;
626   }
627 #pragma omp single
628   {
629 #pragma omp parallel
630     for (int i = 0; i < 10; ++i)
631       ;
632   }
633 #pragma omp single
634   {
635 #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?}}
636     {
637       bar();
638     }
639   }
640 #pragma omp single
641   {
642 #pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}}
643     {
644       bar();
645     }
646   }
647 #pragma omp single
648   {
649 #pragma omp critical
650     {
651       bar();
652     }
653   }
654 #pragma omp single
655   {
656 #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?}}
657     {
658       bar();
659     }
660   }
661 #pragma omp single
662   {
663 #pragma omp parallel
664     {
665 #pragma omp single // OK
666       {
667         bar();
668       }
669 #pragma omp for // OK
670       for (int i = 0; i < 10; ++i)
671         ;
672 #pragma omp sections // OK
673       {
674         bar();
675       }
676     }
677   }
678 #pragma omp single
679   {
680 #pragma omp parallel for
681     for (int i = 0; i < 10; ++i)
682       ;
683   }
684 #pragma omp single
685   {
686 #pragma omp parallel sections
687     {
688       bar();
689     }
690   }
691 #pragma omp single
692   {
693 #pragma omp task
694     {
695       bar();
696     }
697   }
698 #pragma omp single
699   {
700 #pragma omp taskyield
701     bar();
702   }
703 #pragma omp single
704   {
705 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}}
706     bar();
707   }
708 #pragma omp single
709   {
710 #pragma omp taskwait
711     bar();
712   }
713 #pragma omp single
714   {
715 #pragma omp flush
716     bar();
717   }
718 #pragma omp single
719   {
720 #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?}}
721     bar();
722   }
723 #pragma omp single
724   {
725 #pragma omp atomic
726     ++a;
727   }
728 
729 // MASTER DIRECTIVE
730 #pragma omp master
731   {
732 #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?}}
733     for (int i = 0; i < 10; ++i)
734       ;
735   }
736 #pragma omp master
737   {
738 #pragma omp simd
739     for (int i = 0; i < 10; ++i)
740       ;
741   }
742 #pragma omp master
743   {
744 #pragma omp parallel
745     for (int i = 0; i < 10; ++i)
746       ;
747   }
748 #pragma omp master
749   {
750 #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?}}
751     {
752       bar();
753     }
754   }
755 #pragma omp master
756   {
757 #pragma omp master // OK, though second 'master' is redundant
758     {
759       bar();
760     }
761   }
762 #pragma omp master
763   {
764 #pragma omp critical
765     {
766       bar();
767     }
768   }
769 #pragma omp master
770   {
771 #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?}}
772     {
773       bar();
774     }
775   }
776 #pragma omp master
777   {
778 #pragma omp parallel
779     {
780 #pragma omp master // OK
781       {
782         bar();
783       }
784 #pragma omp for // OK
785       for (int i = 0; i < 10; ++i)
786         ;
787 #pragma omp sections // OK
788       {
789         bar();
790       }
791     }
792   }
793 #pragma omp master
794   {
795 #pragma omp parallel for
796     for (int i = 0; i < 10; ++i)
797       ;
798   }
799 #pragma omp master
800   {
801 #pragma omp parallel sections
802     {
803       bar();
804     }
805   }
806 #pragma omp master
807   {
808 #pragma omp task
809     {
810       bar();
811     }
812   }
813 #pragma omp master
814   {
815 #pragma omp taskyield
816     bar();
817   }
818 #pragma omp master
819   {
820 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}}
821     bar();
822   }
823 #pragma omp master
824   {
825 #pragma omp taskwait
826     bar();
827   }
828 #pragma omp master
829   {
830 #pragma omp flush
831     bar();
832   }
833 #pragma omp master
834   {
835 #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?}}
836     bar();
837   }
838 #pragma omp master
839   {
840 #pragma omp atomic
841     ++a;
842   }
843 
844 // CRITICAL DIRECTIVE
845 #pragma omp critical
846   {
847 #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?}}
848     for (int i = 0; i < 10; ++i)
849       ;
850   }
851 #pragma omp critical
852   {
853 #pragma omp simd
854     for (int i = 0; i < 10; ++i)
855       ;
856   }
857 #pragma omp critical
858   {
859 #pragma omp parallel
860     for (int i = 0; i < 10; ++i)
861       ;
862   }
863 #pragma omp critical
864   {
865 #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?}}
866     {
867       bar();
868     }
869   }
870 #pragma omp critical
871   {
872 #pragma omp master // OK, though second 'master' is redundant
873     {
874       bar();
875     }
876   }
877 #pragma omp critical
878   {
879 #pragma omp critical
880     {
881       bar();
882     }
883   }
884 #pragma omp critical
885   {
886 #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?}}
887     {
888       bar();
889     }
890   }
891 #pragma omp critical
892   {
893 #pragma omp parallel
894     {
895 #pragma omp master // OK
896       {
897         bar();
898       }
899 #pragma omp for // OK
900       for (int i = 0; i < 10; ++i)
901         ;
902 #pragma omp sections // OK
903       {
904         bar();
905       }
906     }
907   }
908 #pragma omp critical
909   {
910 #pragma omp parallel for
911     for (int i = 0; i < 10; ++i)
912       ;
913   }
914 #pragma omp critical
915   {
916 #pragma omp parallel sections
917     {
918       bar();
919     }
920   }
921 #pragma omp critical
922   {
923 #pragma omp task
924     {
925       bar();
926     }
927   }
928 #pragma omp critical
929   {
930 #pragma omp taskyield
931     bar();
932   }
933 #pragma omp critical
934   {
935 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}}
936     bar();
937   }
938 #pragma omp critical
939   {
940 #pragma omp taskwait
941     bar();
942   }
943 #pragma omp critical(Tuzik)
944   {
945 #pragma omp critical(grelka)
946     bar();
947   }
948 #pragma omp critical(Belka) // expected-note {{previous 'critical' region starts here}}
949   {
950 #pragma omp critical(Belka) // expected-error {{cannot nest 'critical' regions having the same name 'Belka'}}
951     {
952 #pragma omp critical(Tuzik)
953       {
954 #pragma omp parallel
955 #pragma omp critical(grelka)
956         {
957           bar();
958         }
959       }
960     }
961   }
962 #pragma omp critical
963   {
964 #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?}}
965     bar();
966   }
967 #pragma omp critical
968   {
969 #pragma omp atomic
970     ++a;
971   }
972 
973 // PARALLEL FOR DIRECTIVE
974 #pragma omp parallel for
975   for (int i = 0; i < 10; ++i) {
976 #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?}}
977     for (int i = 0; i < 10; ++i)
978       ;
979   }
980 #pragma omp parallel for
981   for (int i = 0; i < 10; ++i) {
982 #pragma omp simd
983     for (int i = 0; i < 10; ++i)
984       ;
985   }
986 #pragma omp parallel for
987   for (int i = 0; i < 10; ++i) {
988 #pragma omp parallel
989     for (int i = 0; i < 10; ++i)
990       ;
991   }
992 #pragma omp parallel for
993   for (int i = 0; i < 10; ++i) {
994 #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?}}
995     {
996       bar();
997     }
998   }
999 #pragma omp parallel for
1000   for (int i = 0; i < 10; ++i) {
1001 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}}
1002     {
1003       bar();
1004     }
1005   }
1006 #pragma omp parallel for
1007   for (int i = 0; i < 10; ++i) {
1008 #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?}}
1009     {
1010       bar();
1011     }
1012   }
1013 
1014 #pragma omp parallel for
1015   for (int i = 0; i < 10; ++i) {
1016 #pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}}
1017     {
1018       bar();
1019     }
1020   }
1021 
1022 #pragma omp parallel for
1023   for (int i = 0; i < 10; ++i) {
1024 #pragma omp critical
1025     {
1026       bar();
1027     }
1028   }
1029 
1030 #pragma omp parallel for
1031   for (int i = 0; i < 10; ++i) {
1032 #pragma omp parallel
1033     {
1034 #pragma omp single // OK
1035       {
1036         bar();
1037       }
1038 #pragma omp for // OK
1039       for (int i = 0; i < 10; ++i)
1040         ;
1041 #pragma omp sections // OK
1042       {
1043         bar();
1044       }
1045     }
1046   }
1047 #pragma omp parallel for
1048   for (int i = 0; i < 10; ++i) {
1049 #pragma omp parallel for
1050     for (int i = 0; i < 10; ++i)
1051       ;
1052   }
1053 #pragma omp parallel for
1054   for (int i = 0; i < 10; ++i) {
1055 #pragma omp parallel sections
1056     {
1057       bar();
1058     }
1059   }
1060 #pragma omp parallel for
1061   for (int i = 0; i < 10; ++i) {
1062 #pragma omp task
1063     {
1064       bar();
1065     }
1066   }
1067 #pragma omp parallel for
1068   for (int i = 0; i < 10; ++i) {
1069 #pragma omp taskyield
1070     bar();
1071   }
1072 #pragma omp parallel for
1073   for (int i = 0; i < 10; ++i) {
1074 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}}
1075     bar();
1076   }
1077 #pragma omp parallel for
1078   for (int i = 0; i < 10; ++i) {
1079 #pragma omp taskwait
1080     bar();
1081   }
1082 #pragma omp parallel for
1083   for (int i = 0; i < 10; ++i) {
1084 #pragma omp flush
1085     bar();
1086   }
1087 #pragma omp parallel for
1088   for (int i = 0; i < 10; ++i) {
1089 #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?}}
1090     bar();
1091   }
1092 #pragma omp parallel for ordered
1093   for (int i = 0; i < 10; ++i) {
1094 #pragma omp ordered // OK
1095     bar();
1096   }
1097 #pragma omp parallel for
1098   for (int i = 0; i < 10; ++i) {
1099 #pragma omp atomic
1100     ++a;
1101   }
1102 
1103 // PARALLEL SECTIONS DIRECTIVE
1104 #pragma omp parallel sections
1105   {
1106 #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?}}
1107     for (int i = 0; i < 10; ++i)
1108       ;
1109   }
1110 #pragma omp parallel sections
1111   {
1112 #pragma omp simd
1113     for (int i = 0; i < 10; ++i)
1114       ;
1115   }
1116 #pragma omp parallel sections
1117   {
1118 #pragma omp parallel
1119     for (int i = 0; i < 10; ++i)
1120       ;
1121   }
1122 #pragma omp parallel sections
1123   {
1124 #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?}}
1125     {
1126       bar();
1127     }
1128   }
1129 #pragma omp parallel sections
1130   {
1131 #pragma omp section
1132     {
1133       bar();
1134     }
1135   }
1136 #pragma omp parallel sections
1137   {
1138 #pragma omp section
1139     {
1140 #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?}}
1141       bar();
1142     }
1143   }
1144 #pragma omp parallel sections
1145   {
1146 #pragma omp section
1147     {
1148 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
1149       bar();
1150     }
1151   }
1152 #pragma omp parallel sections
1153   {
1154 #pragma omp section
1155     {
1156 #pragma omp critical
1157       bar();
1158     }
1159   }
1160 #pragma omp parallel sections
1161   {
1162 #pragma omp parallel
1163     {
1164 #pragma omp single // OK
1165       {
1166         bar();
1167       }
1168 #pragma omp for // OK
1169       for (int i = 0; i < 10; ++i)
1170         ;
1171 #pragma omp sections // OK
1172       {
1173         bar();
1174       }
1175     }
1176   }
1177 #pragma omp parallel sections
1178   {
1179 #pragma omp parallel for
1180     for (int i = 0; i < 10; ++i)
1181       ;
1182   }
1183 #pragma omp parallel sections
1184   {
1185 #pragma omp parallel sections
1186     {
1187       bar();
1188     }
1189   }
1190 #pragma omp parallel sections
1191   {
1192 #pragma omp task
1193     {
1194       bar();
1195     }
1196   }
1197 #pragma omp parallel sections
1198   {
1199 #pragma omp taskyield
1200   }
1201 #pragma omp parallel sections
1202   {
1203 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}}
1204   }
1205 #pragma omp parallel sections
1206   {
1207 #pragma omp taskwait
1208   }
1209 #pragma omp parallel sections
1210   {
1211 #pragma omp flush
1212   }
1213 #pragma omp parallel sections
1214   {
1215 #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?}}
1216     bar();
1217   }
1218 #pragma omp parallel sections
1219   {
1220 #pragma omp atomic
1221     ++a;
1222   }
1223 
1224 // TASK DIRECTIVE
1225 #pragma omp task
1226 #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?}}
1227   for (int i = 0; i < 10; ++i)
1228     ;
1229 #pragma omp task
1230 #pragma omp simd
1231   for (int i = 0; i < 10; ++i)
1232     ;
1233 #pragma omp task
1234 #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?}}
1235   {
1236     bar();
1237   }
1238 #pragma omp task
1239 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}}
1240   {
1241     bar();
1242   }
1243 #pragma omp task
1244 #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?}}
1245   bar();
1246 #pragma omp task
1247 #pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}}
1248   bar();
1249 #pragma omp task
1250 #pragma omp critical
1251   bar();
1252 
1253 #pragma omp task
1254 #pragma omp parallel for
1255   for (int i = 0; i < 10; ++i)
1256     ;
1257 #pragma omp task
1258 #pragma omp parallel sections
1259   {
1260     bar();
1261   }
1262 #pragma omp task
1263 #pragma omp task
1264   {
1265     bar();
1266   }
1267 #pragma omp task
1268   {
1269 #pragma omp taskyield
1270     bar();
1271   }
1272 #pragma omp task
1273   {
1274 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}}
1275     bar();
1276   }
1277 #pragma omp task
1278   {
1279 #pragma omp taskwait
1280     bar();
1281   }
1282 #pragma omp task
1283   {
1284 #pragma omp flush
1285     bar();
1286   }
1287 #pragma omp task
1288   {
1289 #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?}}
1290     bar();
1291   }
1292 #pragma omp task
1293   {
1294 #pragma omp atomic
1295     ++a;
1296   }
1297 
1298 // ORDERED DIRECTIVE
1299 #pragma omp ordered
1300   {
1301 #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?}}
1302     for (int i = 0; i < 10; ++i)
1303       ;
1304   }
1305 #pragma omp ordered
1306   {
1307 #pragma omp simd
1308     for (int i = 0; i < 10; ++i)
1309       ;
1310   }
1311 #pragma omp ordered
1312   {
1313 #pragma omp parallel
1314     for (int i = 0; i < 10; ++i)
1315       ;
1316   }
1317 #pragma omp ordered
1318   {
1319 #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?}}
1320     {
1321       bar();
1322     }
1323   }
1324 #pragma omp ordered
1325   {
1326 #pragma omp master // OK, though second 'ordered' is redundant
1327     {
1328       bar();
1329     }
1330   }
1331 #pragma omp ordered
1332   {
1333 #pragma omp critical
1334     {
1335       bar();
1336     }
1337   }
1338 #pragma omp ordered
1339   {
1340 #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?}}
1341     {
1342       bar();
1343     }
1344   }
1345 #pragma omp ordered
1346   {
1347 #pragma omp parallel for ordered
1348     for (int j = 0; j < 10; ++j) {
1349 #pragma omp ordered // OK
1350       {
1351         bar();
1352       }
1353     }
1354   }
1355 #pragma omp ordered
1356   {
1357 #pragma omp parallel for
1358     for (int i = 0; i < 10; ++i)
1359       ;
1360   }
1361 #pragma omp ordered
1362   {
1363 #pragma omp parallel sections
1364     {
1365       bar();
1366     }
1367   }
1368 #pragma omp ordered
1369   {
1370 #pragma omp task
1371     {
1372       bar();
1373     }
1374   }
1375 #pragma omp ordered
1376   {
1377 #pragma omp taskyield
1378     bar();
1379   }
1380 #pragma omp ordered
1381   {
1382 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'ordered' region}}
1383     bar();
1384   }
1385 #pragma omp ordered
1386   {
1387 #pragma omp taskwait
1388     bar();
1389   }
1390 #pragma omp ordered
1391   {
1392 #pragma omp flush
1393     bar();
1394   }
1395 #pragma omp ordered
1396   {
1397 #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?}}
1398     bar();
1399   }
1400 #pragma omp ordered
1401   {
1402 #pragma omp atomic
1403     ++a;
1404   }
1405 
1406 // ATOMIC DIRECTIVE
1407 #pragma omp atomic
1408 // expected-error@+1 {{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}}
1409   {
1410 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1411     for (int i = 0; i < 10; ++i)
1412       ;
1413   }
1414 #pragma omp atomic
1415 // expected-error@+1 {{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}}
1416   {
1417 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1418     for (int i = 0; i < 10; ++i)
1419       ;
1420   }
1421 #pragma omp atomic
1422 // expected-error@+1 {{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}}
1423   {
1424 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1425     for (int i = 0; i < 10; ++i)
1426       ;
1427   }
1428 #pragma omp atomic
1429 // expected-error@+1 {{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}}
1430   {
1431 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1432     {
1433       bar();
1434     }
1435   }
1436 #pragma omp atomic
1437 // expected-error@+1 {{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}}
1438   {
1439 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1440     {
1441       bar();
1442     }
1443   }
1444 #pragma omp atomic
1445 // expected-error@+1 {{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}}
1446   {
1447 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1448     {
1449       bar();
1450     }
1451   }
1452 #pragma omp atomic
1453 // expected-error@+1 {{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}}
1454   {
1455 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1456     {
1457       bar();
1458     }
1459   }
1460 #pragma omp atomic
1461 // expected-error@+1 {{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}}
1462   {
1463 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1464     {
1465       bar();
1466     }
1467   }
1468 #pragma omp atomic
1469 // expected-error@+1 {{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}}
1470   {
1471 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1472     for (int i = 0; i < 10; ++i)
1473       ;
1474   }
1475 #pragma omp atomic
1476 // expected-error@+1 {{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}}
1477   {
1478 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1479     {
1480       bar();
1481     }
1482   }
1483 #pragma omp atomic
1484 // expected-error@+1 {{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}}
1485   {
1486 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1487     {
1488       bar();
1489     }
1490   }
1491 #pragma omp atomic
1492 // expected-error@+1 {{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}}
1493   {
1494 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1495     bar();
1496   }
1497 #pragma omp atomic
1498 // expected-error@+1 {{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}}
1499   {
1500 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1501     bar();
1502   }
1503 #pragma omp atomic
1504 // expected-error@+1 {{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}}
1505   {
1506 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1507     bar();
1508   }
1509 #pragma omp atomic
1510 // expected-error@+1 {{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}}
1511   {
1512 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1513     bar();
1514   }
1515 #pragma omp atomic
1516 // expected-error@+1 {{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}}
1517   {
1518 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1519     bar();
1520   }
1521 #pragma omp atomic
1522 // expected-error@+1 {{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}}
1523   {
1524 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
1525     ++a;
1526   }
1527 }
1528 
1529 void foo() {
1530   int a = 0;
1531 // PARALLEL DIRECTIVE
1532 #pragma omp parallel
1533 #pragma omp for
1534   for (int i = 0; i < 10; ++i)
1535     ;
1536 #pragma omp parallel
1537 #pragma omp simd
1538   for (int i = 0; i < 10; ++i)
1539     ;
1540 #pragma omp parallel
1541 #pragma omp sections
1542   {
1543     bar();
1544   }
1545 #pragma omp parallel
1546 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}}
1547   {
1548     bar();
1549   }
1550 #pragma omp parallel
1551 #pragma omp sections
1552   {
1553     bar();
1554   }
1555 #pragma omp parallel
1556 #pragma omp single
1557   bar();
1558 #pragma omp parallel
1559 #pragma omp master
1560   bar();
1561 #pragma omp parallel
1562 #pragma omp critical
1563   bar();
1564 #pragma omp parallel
1565 #pragma omp parallel for
1566   for (int i = 0; i < 10; ++i)
1567     ;
1568 #pragma omp parallel
1569 #pragma omp parallel sections
1570   {
1571     bar();
1572   }
1573 #pragma omp parallel
1574 #pragma omp task
1575   {
1576     bar();
1577   }
1578 #pragma omp parallel
1579   {
1580 #pragma omp taskyield
1581     bar();
1582   }
1583 #pragma omp parallel
1584   {
1585 #pragma omp barrier
1586     bar();
1587   }
1588 #pragma omp parallel
1589   {
1590 #pragma omp taskwait
1591     bar();
1592   }
1593 #pragma omp parallel
1594   {
1595 #pragma omp flush
1596     bar();
1597   }
1598 #pragma omp parallel
1599   {
1600 #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?}}
1601     bar();
1602   }
1603 #pragma omp parallel
1604   {
1605 #pragma omp atomic
1606     ++a;
1607   }
1608 
1609 // SIMD DIRECTIVE
1610 #pragma omp simd
1611   for (int i = 0; i < 10; ++i) {
1612 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1613     for (int i = 0; i < 10; ++i)
1614       ;
1615   }
1616 #pragma omp simd
1617   for (int i = 0; i < 10; ++i) {
1618 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1619     for (int i = 0; i < 10; ++i)
1620       ;
1621   }
1622 #pragma omp simd
1623   for (int i = 0; i < 10; ++i) {
1624 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1625     for (int i = 0; i < 10; ++i)
1626       ;
1627   }
1628 #pragma omp simd
1629   for (int i = 0; i < 10; ++i) {
1630 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1631     {
1632       bar();
1633     }
1634   }
1635 #pragma omp simd
1636   for (int i = 0; i < 10; ++i) {
1637 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1638     {
1639       bar();
1640     }
1641   }
1642 #pragma omp simd
1643   for (int i = 0; i < 10; ++i) {
1644 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1645     bar();
1646 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1647     bar();
1648   }
1649 #pragma omp simd
1650   for (int i = 0; i < 10; ++i) {
1651 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1652     bar();
1653 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1654     bar();
1655   }
1656 #pragma omp simd
1657   for (int i = 0; i < 10; ++i) {
1658 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1659     for (int i = 0; i < 10; ++i)
1660       ;
1661   }
1662 #pragma omp simd
1663   for (int i = 0; i < 10; ++i) {
1664 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1665     {
1666       bar();
1667     }
1668   }
1669 #pragma omp simd
1670   for (int i = 0; i < 10; ++i) {
1671 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1672     {
1673       bar();
1674     }
1675   }
1676 #pragma omp simd
1677   for (int i = 0; i < 10; ++i) {
1678 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1679     bar();
1680   }
1681 #pragma omp simd
1682   for (int i = 0; i < 10; ++i) {
1683 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1684     bar();
1685   }
1686 #pragma omp simd
1687   for (int i = 0; i < 10; ++i) {
1688 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1689     bar();
1690   }
1691 #pragma omp simd
1692   for (int i = 0; i < 10; ++i) {
1693 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1694     bar();
1695   }
1696 #pragma omp simd
1697   for (int i = 0; i < 10; ++i) {
1698 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1699     bar();
1700   }
1701 #pragma omp simd
1702   for (int i = 0; i < 10; ++i) {
1703 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}
1704     ++a;
1705   }
1706 
1707 // FOR DIRECTIVE
1708 #pragma omp for
1709   for (int i = 0; i < 10; ++i) {
1710 #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?}}
1711     for (int i = 0; i < 10; ++i)
1712       ;
1713   }
1714 #pragma omp for
1715   for (int i = 0; i < 10; ++i) {
1716 #pragma omp simd
1717     for (int i = 0; i < 10; ++i)
1718       ;
1719   }
1720 #pragma omp for
1721   for (int i = 0; i < 10; ++i) {
1722 #pragma omp parallel
1723     for (int i = 0; i < 10; ++i)
1724       ;
1725   }
1726 #pragma omp for
1727   for (int i = 0; i < 10; ++i) {
1728 #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?}}
1729     {
1730       bar();
1731     }
1732   }
1733 #pragma omp for
1734   for (int i = 0; i < 10; ++i) {
1735 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}}
1736     {
1737       bar();
1738     }
1739   }
1740 #pragma omp for
1741   for (int i = 0; i < 10; ++i) {
1742 #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?}}
1743     bar();
1744 #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}}
1745     bar();
1746 #pragma omp critical
1747     bar();
1748   }
1749 #pragma omp for
1750   for (int i = 0; i < 10; ++i) {
1751 #pragma omp parallel
1752     {
1753 #pragma omp single // OK
1754       {
1755         bar();
1756       }
1757 #pragma omp for // OK
1758       for (int i = 0; i < 10; ++i)
1759         ;
1760 #pragma omp sections // OK
1761       {
1762         bar();
1763       }
1764     }
1765   }
1766 #pragma omp for
1767   for (int i = 0; i < 10; ++i) {
1768 #pragma omp parallel for
1769     for (int i = 0; i < 10; ++i)
1770       ;
1771   }
1772 #pragma omp for
1773   for (int i = 0; i < 10; ++i) {
1774 #pragma omp parallel sections
1775     {
1776       bar();
1777     }
1778   }
1779 #pragma omp for
1780   for (int i = 0; i < 10; ++i) {
1781 #pragma omp task
1782     {
1783       bar();
1784     }
1785   }
1786 #pragma omp for
1787   for (int i = 0; i < 10; ++i) {
1788 #pragma omp taskyield
1789     bar();
1790   }
1791 #pragma omp for
1792   for (int i = 0; i < 10; ++i) {
1793 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'for' region}}
1794     bar();
1795   }
1796 #pragma omp for
1797   for (int i = 0; i < 10; ++i) {
1798 #pragma omp taskwait
1799     bar();
1800   }
1801 #pragma omp for
1802   for (int i = 0; i < 10; ++i) {
1803 #pragma omp flush
1804     bar();
1805   }
1806 #pragma omp for
1807   for (int i = 0; i < 10; ++i) {
1808 #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?}}
1809     bar();
1810   }
1811 #pragma omp for ordered
1812   for (int i = 0; i < 10; ++i) {
1813 #pragma omp ordered // OK
1814     bar();
1815   }
1816 #pragma omp for
1817   for (int i = 0; i < 10; ++i) {
1818 #pragma omp atomic
1819     ++a;
1820   }
1821 
1822 // SECTIONS DIRECTIVE
1823 #pragma omp sections
1824   {
1825 #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?}}
1826     for (int i = 0; i < 10; ++i)
1827       ;
1828   }
1829 #pragma omp sections
1830   {
1831 #pragma omp simd
1832     for (int i = 0; i < 10; ++i)
1833       ;
1834   }
1835 #pragma omp sections
1836   {
1837 #pragma omp parallel
1838     for (int i = 0; i < 10; ++i)
1839       ;
1840   }
1841 #pragma omp sections
1842   {
1843 #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?}}
1844     {
1845       bar();
1846     }
1847   }
1848 #pragma omp sections
1849   {
1850 #pragma omp section
1851     {
1852       bar();
1853     }
1854   }
1855 #pragma omp sections
1856   {
1857 #pragma omp critical
1858     bar();
1859 #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?}}
1860     bar();
1861 #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}}
1862     bar();
1863   }
1864 #pragma omp sections
1865   {
1866 #pragma omp parallel
1867     {
1868 #pragma omp single // OK
1869       {
1870         bar();
1871       }
1872 #pragma omp for // OK
1873       for (int i = 0; i < 10; ++i)
1874         ;
1875 #pragma omp sections // OK
1876       {
1877         bar();
1878       }
1879     }
1880   }
1881 #pragma omp sections
1882   {
1883 #pragma omp parallel for
1884     for (int i = 0; i < 10; ++i)
1885       ;
1886   }
1887 #pragma omp sections
1888   {
1889 #pragma omp parallel sections
1890     {
1891       bar();
1892     }
1893   }
1894 #pragma omp sections
1895   {
1896 #pragma omp task
1897     {
1898       bar();
1899     }
1900   }
1901 #pragma omp sections
1902   {
1903 #pragma omp taskyield
1904   }
1905 #pragma omp sections
1906   {
1907 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'sections' region}}
1908     bar();
1909   }
1910 #pragma omp sections
1911   {
1912 #pragma omp taskwait
1913   }
1914 #pragma omp sections
1915   {
1916 #pragma omp flush
1917   }
1918 #pragma omp sections
1919   {
1920 #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?}}
1921     bar();
1922   }
1923 #pragma omp sections
1924   {
1925 #pragma omp atomic
1926     ++a;
1927   }
1928 
1929 // SECTION DIRECTIVE
1930 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}}
1931   {
1932     bar();
1933   }
1934 #pragma omp sections
1935   {
1936 #pragma omp section
1937     {
1938 #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?}}
1939       for (int i = 0; i < 10; ++i)
1940         ;
1941     }
1942   }
1943 #pragma omp sections
1944   {
1945 #pragma omp section
1946     {
1947 #pragma omp simd
1948       for (int i = 0; i < 10; ++i)
1949         ;
1950     }
1951   }
1952 #pragma omp sections
1953   {
1954 #pragma omp section
1955     {
1956 #pragma omp parallel
1957       for (int i = 0; i < 10; ++i)
1958         ;
1959     }
1960   }
1961 #pragma omp sections
1962   {
1963 #pragma omp section
1964     {
1965 #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?}}
1966       {
1967         bar();
1968       }
1969     }
1970   }
1971 #pragma omp sections
1972   {
1973 #pragma omp section
1974     {
1975 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}}
1976       {
1977         bar();
1978       }
1979     }
1980   }
1981 #pragma omp sections
1982   {
1983 #pragma omp section
1984     {
1985 #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?}}
1986       bar();
1987 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
1988       bar();
1989 #pragma omp critical
1990       bar();
1991     }
1992   }
1993 #pragma omp sections
1994   {
1995 #pragma omp section
1996     {
1997 #pragma omp parallel
1998       {
1999 #pragma omp single // OK
2000         {
2001           bar();
2002         }
2003 #pragma omp for // OK
2004         for (int i = 0; i < 10; ++i)
2005           ;
2006 #pragma omp sections // OK
2007         {
2008           bar();
2009         }
2010       }
2011     }
2012   }
2013 #pragma omp sections
2014   {
2015 #pragma omp section
2016     {
2017 #pragma omp parallel for
2018       for (int i = 0; i < 10; ++i)
2019         ;
2020     }
2021   }
2022 #pragma omp sections
2023   {
2024 #pragma omp section
2025     {
2026 #pragma omp parallel sections
2027       {
2028         bar();
2029       }
2030     }
2031   }
2032 #pragma omp sections
2033   {
2034 #pragma omp section
2035     {
2036 #pragma omp task
2037       {
2038         bar();
2039       }
2040     }
2041   }
2042 #pragma omp sections
2043   {
2044 #pragma omp section
2045     {
2046 #pragma omp taskyield
2047       bar();
2048     }
2049   }
2050 #pragma omp sections
2051   {
2052 #pragma omp section
2053     {
2054 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}}
2055       bar();
2056     }
2057   }
2058 #pragma omp sections
2059   {
2060 #pragma omp section
2061     {
2062 #pragma omp taskwait
2063       bar();
2064     }
2065   }
2066 #pragma omp sections
2067   {
2068 #pragma omp section
2069     {
2070 #pragma omp flush
2071       bar();
2072     }
2073   }
2074 #pragma omp sections
2075   {
2076 #pragma omp section
2077     {
2078 #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?}}
2079       bar();
2080     }
2081   }
2082 #pragma omp sections
2083   {
2084 #pragma omp section
2085     {
2086 #pragma omp atomic
2087       ++a;
2088     }
2089   }
2090 
2091 // SINGLE DIRECTIVE
2092 #pragma omp single
2093   {
2094 #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?}}
2095     for (int i = 0; i < 10; ++i)
2096       ;
2097   }
2098 #pragma omp single
2099   {
2100 #pragma omp simd
2101     for (int i = 0; i < 10; ++i)
2102       ;
2103   }
2104 #pragma omp single
2105   {
2106 #pragma omp parallel
2107     for (int i = 0; i < 10; ++i)
2108       ;
2109   }
2110 #pragma omp single
2111   {
2112 #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?}}
2113     {
2114       bar();
2115     }
2116 #pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}}
2117     bar();
2118 #pragma omp critical
2119     bar();
2120   }
2121 #pragma omp single
2122   {
2123 #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?}}
2124     {
2125       bar();
2126     }
2127   }
2128 #pragma omp single
2129   {
2130 #pragma omp parallel
2131     {
2132 #pragma omp single // OK
2133       {
2134         bar();
2135       }
2136 #pragma omp for // OK
2137       for (int i = 0; i < 10; ++i)
2138         ;
2139 #pragma omp sections // OK
2140       {
2141         bar();
2142       }
2143     }
2144   }
2145 #pragma omp single
2146   {
2147 #pragma omp parallel for
2148     for (int i = 0; i < 10; ++i)
2149       ;
2150   }
2151 #pragma omp single
2152   {
2153 #pragma omp parallel sections
2154     {
2155       bar();
2156     }
2157   }
2158 #pragma omp single
2159   {
2160 #pragma omp task
2161     {
2162       bar();
2163     }
2164   }
2165 #pragma omp single
2166   {
2167 #pragma omp taskyield
2168     bar();
2169   }
2170 #pragma omp single
2171   {
2172 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}}
2173     bar();
2174   }
2175 #pragma omp single
2176   {
2177 #pragma omp taskwait
2178     bar();
2179   }
2180 #pragma omp single
2181   {
2182 #pragma omp flush
2183     bar();
2184   }
2185 #pragma omp single
2186   {
2187 #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?}}
2188     bar();
2189   }
2190 #pragma omp single
2191   {
2192 #pragma omp atomic
2193     ++a;
2194   }
2195 
2196 // MASTER DIRECTIVE
2197 #pragma omp master
2198   {
2199 #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?}}
2200     for (int i = 0; i < 10; ++i)
2201       ;
2202   }
2203 #pragma omp master
2204   {
2205 #pragma omp simd
2206     for (int i = 0; i < 10; ++i)
2207       ;
2208   }
2209 #pragma omp master
2210   {
2211 #pragma omp parallel
2212     for (int i = 0; i < 10; ++i)
2213       ;
2214   }
2215 #pragma omp master
2216   {
2217 #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?}}
2218     {
2219       bar();
2220     }
2221   }
2222 #pragma omp master
2223   {
2224 #pragma omp master // OK, though second 'master' is redundant
2225     {
2226       bar();
2227     }
2228   }
2229 #pragma omp master
2230   {
2231 #pragma omp critical
2232     {
2233       bar();
2234     }
2235   }
2236 #pragma omp master
2237   {
2238 #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?}}
2239     {
2240       bar();
2241     }
2242   }
2243 #pragma omp master
2244   {
2245 #pragma omp parallel
2246     {
2247 #pragma omp master // OK
2248       {
2249         bar();
2250       }
2251 #pragma omp for // OK
2252       for (int i = 0; i < 10; ++i)
2253         ;
2254 #pragma omp sections // OK
2255       {
2256         bar();
2257       }
2258     }
2259   }
2260 #pragma omp master
2261   {
2262 #pragma omp parallel for
2263     for (int i = 0; i < 10; ++i)
2264       ;
2265   }
2266 #pragma omp master
2267   {
2268 #pragma omp parallel sections
2269     {
2270       bar();
2271     }
2272   }
2273 #pragma omp master
2274   {
2275 #pragma omp task
2276     {
2277       bar();
2278     }
2279   }
2280 #pragma omp master
2281   {
2282 #pragma omp taskyield
2283     bar();
2284   }
2285 #pragma omp master
2286   {
2287 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}}
2288     bar();
2289   }
2290 #pragma omp master
2291   {
2292 #pragma omp taskwait
2293     bar();
2294   }
2295 #pragma omp master
2296   {
2297 #pragma omp flush
2298     bar();
2299   }
2300 #pragma omp master
2301   {
2302 #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?}}
2303     bar();
2304   }
2305 #pragma omp master
2306   {
2307 #pragma omp atomic
2308     ++a;
2309   }
2310 
2311 // CRITICAL DIRECTIVE
2312 #pragma omp critical
2313   {
2314 #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?}}
2315     for (int i = 0; i < 10; ++i)
2316       ;
2317   }
2318 #pragma omp critical
2319   {
2320 #pragma omp simd
2321     for (int i = 0; i < 10; ++i)
2322       ;
2323   }
2324 #pragma omp critical
2325   {
2326 #pragma omp parallel
2327     for (int i = 0; i < 10; ++i)
2328       ;
2329   }
2330 #pragma omp critical
2331   {
2332 #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?}}
2333     {
2334       bar();
2335     }
2336   }
2337 #pragma omp critical
2338   {
2339 #pragma omp master // OK, though second 'master' is redundant
2340     {
2341       bar();
2342     }
2343   }
2344 #pragma omp critical
2345   {
2346 #pragma omp critical
2347     {
2348       bar();
2349     }
2350   }
2351 #pragma omp critical
2352   {
2353 #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?}}
2354     {
2355       bar();
2356     }
2357   }
2358 #pragma omp critical
2359   {
2360 #pragma omp parallel
2361     {
2362 #pragma omp master // OK
2363       {
2364         bar();
2365       }
2366 #pragma omp for // OK
2367       for (int i = 0; i < 10; ++i)
2368         ;
2369 #pragma omp sections // OK
2370       {
2371         bar();
2372       }
2373     }
2374   }
2375 #pragma omp critical
2376   {
2377 #pragma omp parallel for
2378     for (int i = 0; i < 10; ++i)
2379       ;
2380   }
2381 #pragma omp critical
2382   {
2383 #pragma omp parallel sections
2384     {
2385       bar();
2386     }
2387   }
2388 #pragma omp critical
2389   {
2390 #pragma omp task
2391     {
2392       bar();
2393     }
2394   }
2395 #pragma omp critical
2396   {
2397 #pragma omp taskyield
2398     bar();
2399   }
2400 #pragma omp critical
2401   {
2402 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}}
2403     bar();
2404   }
2405 #pragma omp critical
2406   {
2407 #pragma omp taskwait
2408     bar();
2409   }
2410 #pragma omp critical(Belka)
2411   {
2412 #pragma omp critical(Strelka)
2413     bar();
2414   }
2415 #pragma omp critical(Tuzik) // expected-note {{previous 'critical' region starts here}}
2416   {
2417 #pragma omp critical(grelka) // expected-note {{previous 'critical' region starts here}}
2418     {
2419 #pragma omp critical(Tuzik) // expected-error {{cannot nest 'critical' regions having the same name 'Tuzik'}}
2420       {
2421 #pragma omp parallel
2422 #pragma omp critical(grelka) // expected-error {{cannot nest 'critical' regions having the same name 'grelka'}}
2423         {
2424           bar();
2425         }
2426       }
2427     }
2428   }
2429 #pragma omp critical
2430   {
2431 #pragma omp flush
2432     bar();
2433   }
2434 #pragma omp critical
2435   {
2436 #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?}}
2437     bar();
2438   }
2439 #pragma omp critical
2440   {
2441 #pragma omp atomic
2442     ++a;
2443   }
2444 
2445 // PARALLEL FOR DIRECTIVE
2446 #pragma omp parallel for
2447   for (int i = 0; i < 10; ++i) {
2448 #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?}}
2449     for (int i = 0; i < 10; ++i)
2450       ;
2451   }
2452 #pragma omp parallel for
2453   for (int i = 0; i < 10; ++i) {
2454 #pragma omp simd
2455     for (int i = 0; i < 10; ++i)
2456       ;
2457   }
2458 #pragma omp parallel for
2459   for (int i = 0; i < 10; ++i) {
2460 #pragma omp parallel
2461     for (int i = 0; i < 10; ++i)
2462       ;
2463   }
2464 #pragma omp parallel for
2465   for (int i = 0; i < 10; ++i) {
2466 #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?}}
2467     {
2468       bar();
2469     }
2470   }
2471 #pragma omp parallel for
2472   for (int i = 0; i < 10; ++i) {
2473 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}}
2474     {
2475       bar();
2476     }
2477   }
2478 #pragma omp parallel for
2479   for (int i = 0; i < 10; ++i) {
2480 #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?}}
2481     {
2482       bar();
2483     }
2484 #pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}}
2485     {
2486       bar();
2487     }
2488 #pragma omp critical
2489     {
2490       bar();
2491     }
2492   }
2493 #pragma omp parallel for
2494   for (int i = 0; i < 10; ++i) {
2495 #pragma omp parallel
2496     {
2497 #pragma omp single // OK
2498       {
2499         bar();
2500       }
2501 #pragma omp master // OK
2502       {
2503         bar();
2504       }
2505 #pragma omp critical // OK
2506       {
2507         bar();
2508       }
2509 #pragma omp for // OK
2510       for (int i = 0; i < 10; ++i)
2511         ;
2512 #pragma omp sections // OK
2513       {
2514         bar();
2515       }
2516     }
2517   }
2518 #pragma omp parallel for
2519   for (int i = 0; i < 10; ++i) {
2520 #pragma omp parallel for
2521     for (int i = 0; i < 10; ++i)
2522       ;
2523   }
2524 #pragma omp parallel for
2525   for (int i = 0; i < 10; ++i) {
2526 #pragma omp parallel sections
2527     {
2528       bar();
2529     }
2530   }
2531 #pragma omp parallel for
2532   for (int i = 0; i < 10; ++i) {
2533 #pragma omp task
2534     {
2535       bar();
2536     }
2537   }
2538 #pragma omp parallel for
2539   for (int i = 0; i < 10; ++i) {
2540 #pragma omp taskyield
2541     bar();
2542   }
2543 #pragma omp parallel for
2544   for (int i = 0; i < 10; ++i) {
2545 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}}
2546     bar();
2547   }
2548 #pragma omp parallel for
2549   for (int i = 0; i < 10; ++i) {
2550 #pragma omp taskwait
2551     bar();
2552   }
2553 #pragma omp parallel for
2554   for (int i = 0; i < 10; ++i) {
2555 #pragma omp flush
2556     bar();
2557   }
2558 #pragma omp parallel for
2559   for (int i = 0; i < 10; ++i) {
2560 #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?}}
2561     bar();
2562   }
2563 #pragma omp parallel for ordered
2564   for (int i = 0; i < 10; ++i) {
2565 #pragma omp ordered // OK
2566     bar();
2567   }
2568 #pragma omp parallel for
2569   for (int i = 0; i < 10; ++i) {
2570 #pragma omp atomic
2571     ++a;
2572   }
2573 
2574 // PARALLEL SECTIONS DIRECTIVE
2575 #pragma omp parallel sections
2576   {
2577 #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?}}
2578     for (int i = 0; i < 10; ++i)
2579       ;
2580   }
2581 #pragma omp parallel sections
2582   {
2583 #pragma omp simd
2584     for (int i = 0; i < 10; ++i)
2585       ;
2586   }
2587 #pragma omp parallel sections
2588   {
2589 #pragma omp parallel
2590     for (int i = 0; i < 10; ++i)
2591       ;
2592   }
2593 #pragma omp parallel sections
2594   {
2595 #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?}}
2596     {
2597       bar();
2598     }
2599   }
2600 #pragma omp parallel sections
2601   {
2602 #pragma omp section
2603     {
2604       bar();
2605     }
2606   }
2607 #pragma omp parallel sections
2608   {
2609 #pragma omp section
2610     {
2611 #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?}}
2612       bar();
2613 #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
2614       bar();
2615 #pragma omp critical
2616       bar();
2617     }
2618   }
2619 #pragma omp parallel sections
2620   {
2621 #pragma omp parallel
2622     {
2623 #pragma omp single // OK
2624       {
2625         bar();
2626       }
2627 #pragma omp master // OK
2628       {
2629         bar();
2630       }
2631 #pragma omp critical // OK
2632       {
2633         bar();
2634       }
2635 #pragma omp for // OK
2636       for (int i = 0; i < 10; ++i)
2637         ;
2638 #pragma omp sections // OK
2639       {
2640         bar();
2641       }
2642     }
2643   }
2644 #pragma omp parallel sections
2645   {
2646 #pragma omp parallel for
2647     for (int i = 0; i < 10; ++i)
2648       ;
2649   }
2650 #pragma omp parallel sections
2651   {
2652 #pragma omp parallel sections
2653     {
2654       bar();
2655     }
2656   }
2657 #pragma omp parallel sections
2658   {
2659 #pragma omp task
2660     {
2661       bar();
2662     }
2663   }
2664 #pragma omp parallel sections
2665   {
2666 #pragma omp taskyield
2667   }
2668 #pragma omp parallel sections
2669   {
2670 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}}
2671   }
2672 #pragma omp parallel sections
2673   {
2674 #pragma omp taskwait
2675   }
2676 #pragma omp parallel sections
2677   {
2678 #pragma omp flush
2679   }
2680 #pragma omp parallel sections
2681   {
2682 #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?}}
2683     bar();
2684   }
2685 #pragma omp parallel sections
2686   {
2687 #pragma omp atomic
2688     ++a;
2689   }
2690 
2691 // TASK DIRECTIVE
2692 #pragma omp task
2693 #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?}}
2694   for (int i = 0; i < 10; ++i)
2695     ;
2696 #pragma omp task
2697 #pragma omp simd
2698   for (int i = 0; i < 10; ++i)
2699     ;
2700 #pragma omp task
2701 #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?}}
2702   {
2703     bar();
2704   }
2705 #pragma omp task
2706 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}}
2707   {
2708     bar();
2709   }
2710 #pragma omp task
2711 #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?}}
2712   bar();
2713 #pragma omp task
2714 #pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}}
2715   bar();
2716 #pragma omp task
2717 #pragma omp critical
2718   bar();
2719 #pragma omp task
2720 #pragma omp parallel for
2721   for (int i = 0; i < 10; ++i)
2722     ;
2723 #pragma omp task
2724 #pragma omp parallel sections
2725   {
2726     bar();
2727   }
2728 #pragma omp task
2729 #pragma omp task
2730   {
2731     bar();
2732   }
2733 #pragma omp task
2734   {
2735 #pragma omp taskyield
2736     bar();
2737   }
2738 #pragma omp task
2739   {
2740 #pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}}
2741     bar();
2742   }
2743 #pragma omp task
2744   {
2745 #pragma omp taskwait
2746     bar();
2747   }
2748 #pragma omp task
2749   {
2750 #pragma omp flush
2751     bar();
2752   }
2753 #pragma omp task
2754   {
2755 #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?}}
2756     bar();
2757   }
2758 #pragma omp task
2759   {
2760 #pragma omp atomic
2761     ++a;
2762   }
2763 
2764 // ATOMIC DIRECTIVE
2765 #pragma omp atomic
2766 // expected-error@+1 {{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}}
2767   {
2768 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2769     for (int i = 0; i < 10; ++i)
2770       ;
2771   }
2772 #pragma omp atomic
2773 // expected-error@+1 {{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}}
2774   {
2775 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2776     for (int i = 0; i < 10; ++i)
2777       ;
2778   }
2779 #pragma omp atomic
2780 // expected-error@+1 {{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}}
2781   {
2782 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2783     for (int i = 0; i < 10; ++i)
2784       ;
2785   }
2786 #pragma omp atomic
2787 // expected-error@+1 {{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}}
2788   {
2789 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2790     {
2791       bar();
2792     }
2793   }
2794 #pragma omp atomic
2795 // expected-error@+1 {{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}}
2796   {
2797 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2798     {
2799       bar();
2800     }
2801   }
2802 #pragma omp atomic
2803 // expected-error@+1 {{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}}
2804   {
2805 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2806     {
2807       bar();
2808     }
2809   }
2810 #pragma omp atomic
2811 // expected-error@+1 {{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}}
2812   {
2813 #pragma omp master // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2814     {
2815       bar();
2816     }
2817   }
2818 #pragma omp atomic
2819 // expected-error@+1 {{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}}
2820   {
2821 #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2822     {
2823       bar();
2824     }
2825   }
2826 #pragma omp atomic
2827 // expected-error@+1 {{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}}
2828   {
2829 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2830     for (int i = 0; i < 10; ++i)
2831       ;
2832   }
2833 #pragma omp atomic
2834 // expected-error@+1 {{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}}
2835   {
2836 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2837     {
2838       bar();
2839     }
2840   }
2841 #pragma omp atomic
2842 // expected-error@+1 {{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}}
2843   {
2844 #pragma omp task // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2845     {
2846       bar();
2847     }
2848   }
2849 #pragma omp atomic
2850 // expected-error@+1 {{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}}
2851   {
2852 #pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2853     bar();
2854   }
2855 #pragma omp atomic
2856 // expected-error@+1 {{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}}
2857   {
2858 #pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2859     bar();
2860   }
2861 #pragma omp atomic
2862 // expected-error@+1 {{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}}
2863   {
2864 #pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2865     bar();
2866   }
2867 #pragma omp atomic
2868 // expected-error@+1 {{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}}
2869   {
2870 #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2871     bar();
2872   }
2873 #pragma omp atomic
2874 // expected-error@+1 {{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}}
2875   {
2876 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2877     bar();
2878   }
2879 #pragma omp atomic
2880 // expected-error@+1 {{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}}
2881   {
2882 #pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
2883     ++a;
2884   }
2885   return foo<int>();
2886 }
2887 
2888