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