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