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