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