Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -verify %s
      2 
      3 void bar();
      4 
      5 template <class T>
      6 void foo() {
      7 // PARALLEL DIRECTIVE
      8 #pragma omp parallel
      9 #pragma omp for
     10   for (int i = 0; i < 10; ++i)
     11     ;
     12 #pragma omp parallel
     13 #pragma omp simd
     14   for (int i = 0; i < 10; ++i)
     15     ;
     16 #pragma omp parallel
     17 #pragma omp sections
     18   {
     19     bar();
     20   }
     21 #pragma omp parallel
     22 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}}
     23   {
     24     bar();
     25   }
     26 #pragma omp parallel
     27 #pragma omp single
     28   bar();
     29 #pragma omp parallel
     30 #pragma omp parallel for
     31   for (int i = 0; i < 10; ++i)
     32     ;
     33 #pragma omp parallel
     34 #pragma omp parallel sections
     35   {
     36     bar();
     37   }
     38 
     39 // SIMD DIRECTIVE
     40 #pragma omp simd
     41   for (int i = 0; i < 10; ++i) {
     42 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     43     for (int i = 0; i < 10; ++i)
     44       ;
     45   }
     46 #pragma omp simd
     47   for (int i = 0; i < 10; ++i) {
     48 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     49     for (int i = 0; i < 10; ++i)
     50       ;
     51   }
     52 #pragma omp simd
     53   for (int i = 0; i < 10; ++i) {
     54 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     55     for (int i = 0; i < 10; ++i)
     56       ;
     57   }
     58 #pragma omp simd
     59   for (int i = 0; i < 10; ++i) {
     60 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     61     {
     62       bar();
     63     }
     64   }
     65 #pragma omp simd
     66   for (int i = 0; i < 10; ++i) {
     67 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     68     {
     69       bar();
     70     }
     71   }
     72 #pragma omp simd
     73   for (int i = 0; i < 10; ++i) {
     74 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     75     {
     76       bar();
     77     }
     78   }
     79 #pragma omp simd
     80   for (int i = 0; i < 10; ++i) {
     81 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     82     for (int i = 0; i < 10; ++i)
     83       ;
     84   }
     85 #pragma omp simd
     86   for (int i = 0; i < 10; ++i) {
     87 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     88     {
     89       bar();
     90     }
     91   }
     92 
     93 // FOR DIRECTIVE
     94 #pragma omp for
     95   for (int i = 0; i < 10; ++i) {
     96 #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?}}
     97     for (int i = 0; i < 10; ++i)
     98       ;
     99   }
    100 #pragma omp for
    101   for (int i = 0; i < 10; ++i) {
    102 #pragma omp simd
    103     for (int i = 0; i < 10; ++i)
    104       ;
    105   }
    106 #pragma omp for
    107   for (int i = 0; i < 10; ++i) {
    108 #pragma omp parallel
    109     for (int i = 0; i < 10; ++i)
    110       ;
    111   }
    112 #pragma omp for
    113   for (int i = 0; i < 10; ++i) {
    114 #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?}}
    115     {
    116       bar();
    117     }
    118   }
    119 #pragma omp for
    120   for (int i = 0; i < 10; ++i) {
    121 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}}
    122     {
    123       bar();
    124     }
    125   }
    126 #pragma omp for
    127   for (int i = 0; i < 10; ++i) {
    128 #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?}}
    129     {
    130       bar();
    131     }
    132   }
    133 #pragma omp for
    134   for (int i = 0; i < 10; ++i) {
    135 #pragma omp parallel
    136     {
    137 #pragma omp single // OK
    138       {
    139         bar();
    140       }
    141 #pragma omp for // OK
    142       for (int i = 0; i < 10; ++i)
    143         ;
    144 #pragma omp sections // OK
    145       {
    146         bar();
    147       }
    148     }
    149   }
    150 #pragma omp for
    151   for (int i = 0; i < 10; ++i) {
    152 #pragma omp parallel for
    153     for (int i = 0; i < 10; ++i)
    154       ;
    155   }
    156 #pragma omp for
    157   for (int i = 0; i < 10; ++i) {
    158 #pragma omp parallel sections
    159     {
    160       bar();
    161     }
    162   }
    163 
    164 // SECTIONS DIRECTIVE
    165 #pragma omp sections
    166   {
    167 #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?}}
    168     for (int i = 0; i < 10; ++i)
    169       ;
    170   }
    171 #pragma omp sections
    172   {
    173 #pragma omp simd
    174     for (int i = 0; i < 10; ++i)
    175       ;
    176   }
    177 #pragma omp sections
    178   {
    179 #pragma omp parallel
    180     for (int i = 0; i < 10; ++i)
    181       ;
    182   }
    183 #pragma omp sections
    184   {
    185 #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?}}
    186     {
    187       bar();
    188     }
    189   }
    190 #pragma omp sections
    191   {
    192 #pragma omp section
    193     {
    194       bar();
    195     }
    196   }
    197 #pragma omp sections
    198   {
    199 #pragma omp section
    200     {
    201 #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?}}
    202       bar();
    203     }
    204   }
    205 #pragma omp sections
    206   {
    207 #pragma omp parallel
    208     {
    209 #pragma omp single // OK
    210       {
    211         bar();
    212       }
    213 #pragma omp for // OK
    214       for (int i = 0; i < 10; ++i)
    215         ;
    216 #pragma omp sections // OK
    217       {
    218         bar();
    219       }
    220     }
    221   }
    222 #pragma omp sections
    223   {
    224 #pragma omp parallel for
    225     for (int i = 0; i < 10; ++i)
    226       ;
    227   }
    228 #pragma omp sections
    229   {
    230 #pragma omp parallel sections
    231     {
    232       bar();
    233     }
    234   }
    235 
    236 // SECTION DIRECTIVE
    237 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}}
    238   {
    239     bar();
    240   }
    241 
    242 // SINGLE DIRECTIVE
    243 #pragma omp single
    244   {
    245 #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?}}
    246     for (int i = 0; i < 10; ++i)
    247       ;
    248   }
    249 #pragma omp single
    250   {
    251 #pragma omp simd
    252     for (int i = 0; i < 10; ++i)
    253       ;
    254   }
    255 #pragma omp single
    256   {
    257 #pragma omp parallel
    258     for (int i = 0; i < 10; ++i)
    259       ;
    260   }
    261 #pragma omp single
    262   {
    263 #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?}}
    264     {
    265       bar();
    266     }
    267   }
    268 #pragma omp single
    269   {
    270 #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?}}
    271     {
    272       bar();
    273     }
    274   }
    275 #pragma omp single
    276   {
    277 #pragma omp parallel
    278     {
    279 #pragma omp single // OK
    280       {
    281         bar();
    282       }
    283 #pragma omp for // OK
    284       for (int i = 0; i < 10; ++i)
    285         ;
    286 #pragma omp sections // OK
    287       {
    288         bar();
    289       }
    290     }
    291   }
    292 #pragma omp single
    293   {
    294 #pragma omp parallel for
    295     for (int i = 0; i < 10; ++i)
    296       ;
    297   }
    298 #pragma omp single
    299   {
    300 #pragma omp parallel sections
    301     {
    302       bar();
    303     }
    304   }
    305 
    306 // PARALLEL FOR DIRECTIVE
    307 #pragma omp parallel for
    308   for (int i = 0; i < 10; ++i) {
    309 #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?}}
    310     for (int i = 0; i < 10; ++i)
    311       ;
    312   }
    313 #pragma omp parallel for
    314   for (int i = 0; i < 10; ++i) {
    315 #pragma omp simd
    316     for (int i = 0; i < 10; ++i)
    317       ;
    318   }
    319 #pragma omp parallel for
    320   for (int i = 0; i < 10; ++i) {
    321 #pragma omp parallel
    322     for (int i = 0; i < 10; ++i)
    323       ;
    324   }
    325 #pragma omp parallel for
    326   for (int i = 0; i < 10; ++i) {
    327 #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?}}
    328     {
    329       bar();
    330     }
    331   }
    332 #pragma omp parallel for
    333   for (int i = 0; i < 10; ++i) {
    334 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}}
    335     {
    336       bar();
    337     }
    338   }
    339 #pragma omp parallel for
    340   for (int i = 0; i < 10; ++i) {
    341 #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?}}
    342     {
    343       bar();
    344     }
    345   }
    346 #pragma omp parallel for
    347   for (int i = 0; i < 10; ++i) {
    348 #pragma omp parallel
    349     {
    350 #pragma omp single // OK
    351       {
    352         bar();
    353       }
    354 #pragma omp for // OK
    355       for (int i = 0; i < 10; ++i)
    356         ;
    357 #pragma omp sections // OK
    358       {
    359         bar();
    360       }
    361     }
    362   }
    363 #pragma omp parallel for
    364   for (int i = 0; i < 10; ++i) {
    365 #pragma omp parallel for
    366     for (int i = 0; i < 10; ++i)
    367       ;
    368   }
    369 #pragma omp parallel for
    370   for (int i = 0; i < 10; ++i) {
    371 #pragma omp parallel sections
    372     {
    373       bar();
    374     }
    375   }
    376 
    377 // PARALLEL SECTIONS DIRECTIVE
    378 #pragma omp parallel sections
    379   {
    380 #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?}}
    381     for (int i = 0; i < 10; ++i)
    382       ;
    383   }
    384 #pragma omp parallel sections
    385   {
    386 #pragma omp simd
    387     for (int i = 0; i < 10; ++i)
    388       ;
    389   }
    390 #pragma omp parallel sections
    391   {
    392 #pragma omp parallel
    393     for (int i = 0; i < 10; ++i)
    394       ;
    395   }
    396 #pragma omp parallel sections
    397   {
    398 #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?}}
    399     {
    400       bar();
    401     }
    402   }
    403 #pragma omp parallel sections
    404   {
    405 #pragma omp section
    406     {
    407       bar();
    408     }
    409   }
    410 #pragma omp parallel sections
    411   {
    412 #pragma omp section
    413     {
    414 #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?}}
    415       bar();
    416     }
    417   }
    418 #pragma omp parallel sections
    419   {
    420 #pragma omp parallel
    421     {
    422 #pragma omp single // OK
    423       {
    424         bar();
    425       }
    426 #pragma omp for // OK
    427       for (int i = 0; i < 10; ++i)
    428         ;
    429 #pragma omp sections // OK
    430       {
    431         bar();
    432       }
    433     }
    434   }
    435 #pragma omp parallel sections
    436   {
    437 #pragma omp parallel for
    438     for (int i = 0; i < 10; ++i)
    439       ;
    440   }
    441 #pragma omp parallel sections
    442   {
    443 #pragma omp parallel sections
    444     {
    445       bar();
    446     }
    447   }
    448 }
    449 
    450 void foo() {
    451 // PARALLEL DIRECTIVE
    452 #pragma omp parallel
    453 #pragma omp for
    454   for (int i = 0; i < 10; ++i)
    455     ;
    456 #pragma omp parallel
    457 #pragma omp simd
    458   for (int i = 0; i < 10; ++i)
    459     ;
    460 #pragma omp parallel
    461 #pragma omp sections
    462   {
    463     bar();
    464   }
    465 #pragma omp parallel
    466 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}}
    467   {
    468     bar();
    469   }
    470 #pragma omp parallel
    471 #pragma omp sections
    472   {
    473     bar();
    474   }
    475 #pragma omp parallel
    476 #pragma omp single
    477   bar();
    478 #pragma omp parallel
    479 #pragma omp parallel for
    480   for (int i = 0; i < 10; ++i)
    481     ;
    482 #pragma omp parallel
    483 #pragma omp parallel sections
    484   {
    485     bar();
    486   }
    487 
    488 // SIMD DIRECTIVE
    489 #pragma omp simd
    490   for (int i = 0; i < 10; ++i) {
    491 #pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    492     for (int i = 0; i < 10; ++i)
    493       ;
    494   }
    495 #pragma omp simd
    496   for (int i = 0; i < 10; ++i) {
    497 #pragma omp simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    498     for (int i = 0; i < 10; ++i)
    499       ;
    500   }
    501 #pragma omp simd
    502   for (int i = 0; i < 10; ++i) {
    503 #pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    504     for (int i = 0; i < 10; ++i)
    505       ;
    506   }
    507 #pragma omp simd
    508   for (int i = 0; i < 10; ++i) {
    509 #pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    510     {
    511       bar();
    512     }
    513   }
    514 #pragma omp simd
    515   for (int i = 0; i < 10; ++i) {
    516 #pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    517     {
    518       bar();
    519     }
    520   }
    521 #pragma omp simd
    522   for (int i = 0; i < 10; ++i) {
    523 #pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    524     bar();
    525   }
    526 #pragma omp simd
    527   for (int i = 0; i < 10; ++i) {
    528 #pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    529     for (int i = 0; i < 10; ++i)
    530       ;
    531   }
    532 #pragma omp simd
    533   for (int i = 0; i < 10; ++i) {
    534 #pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    535     {
    536       bar();
    537     }
    538   }
    539 
    540 // FOR DIRECTIVE
    541 #pragma omp for
    542   for (int i = 0; i < 10; ++i) {
    543 #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?}}
    544     for (int i = 0; i < 10; ++i)
    545       ;
    546   }
    547 #pragma omp for
    548   for (int i = 0; i < 10; ++i) {
    549 #pragma omp simd
    550     for (int i = 0; i < 10; ++i)
    551       ;
    552   }
    553 #pragma omp for
    554   for (int i = 0; i < 10; ++i) {
    555 #pragma omp parallel
    556     for (int i = 0; i < 10; ++i)
    557       ;
    558   }
    559 #pragma omp for
    560   for (int i = 0; i < 10; ++i) {
    561 #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?}}
    562     {
    563       bar();
    564     }
    565   }
    566 #pragma omp for
    567   for (int i = 0; i < 10; ++i) {
    568 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a for region}}
    569     {
    570       bar();
    571     }
    572   }
    573 #pragma omp for
    574   for (int i = 0; i < 10; ++i) {
    575 #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?}}
    576     bar();
    577   }
    578 #pragma omp for
    579   for (int i = 0; i < 10; ++i) {
    580 #pragma omp parallel
    581     {
    582 #pragma omp single // OK
    583       {
    584         bar();
    585       }
    586 #pragma omp for // OK
    587       for (int i = 0; i < 10; ++i)
    588         ;
    589 #pragma omp sections // OK
    590       {
    591         bar();
    592       }
    593     }
    594   }
    595 #pragma omp for
    596   for (int i = 0; i < 10; ++i) {
    597 #pragma omp parallel for
    598     for (int i = 0; i < 10; ++i)
    599       ;
    600   }
    601 #pragma omp for
    602   for (int i = 0; i < 10; ++i) {
    603 #pragma omp parallel sections
    604     {
    605       bar();
    606     }
    607   }
    608 
    609 // SECTIONS DIRECTIVE
    610 #pragma omp sections
    611   {
    612 #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?}}
    613     for (int i = 0; i < 10; ++i)
    614       ;
    615   }
    616 #pragma omp sections
    617   {
    618 #pragma omp simd
    619     for (int i = 0; i < 10; ++i)
    620       ;
    621   }
    622 #pragma omp sections
    623   {
    624 #pragma omp parallel
    625     for (int i = 0; i < 10; ++i)
    626       ;
    627   }
    628 #pragma omp sections
    629   {
    630 #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?}}
    631     {
    632       bar();
    633     }
    634   }
    635 #pragma omp sections
    636   {
    637 #pragma omp section
    638     {
    639       bar();
    640     }
    641   }
    642 #pragma omp sections
    643   {
    644 #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?}}
    645     bar();
    646   }
    647 #pragma omp sections
    648   {
    649 #pragma omp parallel
    650     {
    651 #pragma omp single // OK
    652       {
    653         bar();
    654       }
    655 #pragma omp for // OK
    656       for (int i = 0; i < 10; ++i)
    657         ;
    658 #pragma omp sections // OK
    659       {
    660         bar();
    661       }
    662     }
    663   }
    664 #pragma omp sections
    665   {
    666 #pragma omp parallel for
    667     for (int i = 0; i < 10; ++i)
    668       ;
    669   }
    670 #pragma omp sections
    671   {
    672 #pragma omp parallel sections
    673     {
    674       bar();
    675     }
    676   }
    677 
    678 // SECTION DIRECTIVE
    679 #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}}
    680   {
    681     bar();
    682   }
    683 
    684 // SINGLE DIRECTIVE
    685 #pragma omp single
    686   {
    687 #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?}}
    688     for (int i = 0; i < 10; ++i)
    689       ;
    690   }
    691 #pragma omp single
    692   {
    693 #pragma omp simd
    694     for (int i = 0; i < 10; ++i)
    695       ;
    696   }
    697 #pragma omp single
    698   {
    699 #pragma omp parallel
    700     for (int i = 0; i < 10; ++i)
    701       ;
    702   }
    703 #pragma omp single
    704   {
    705 #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?}}
    706     {
    707       bar();
    708     }
    709   }
    710 #pragma omp single
    711   {
    712 #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?}}
    713     {
    714       bar();
    715     }
    716   }
    717 #pragma omp single
    718   {
    719 #pragma omp parallel
    720     {
    721 #pragma omp single // OK
    722       {
    723         bar();
    724       }
    725 #pragma omp for // OK
    726       for (int i = 0; i < 10; ++i)
    727         ;
    728 #pragma omp sections // OK
    729       {
    730         bar();
    731       }
    732     }
    733   }
    734 #pragma omp single
    735   {
    736 #pragma omp parallel for
    737     for (int i = 0; i < 10; ++i)
    738       ;
    739   }
    740 #pragma omp single
    741   {
    742 #pragma omp parallel sections
    743     {
    744       bar();
    745     }
    746   }
    747 
    748 // PARALLEL FOR DIRECTIVE
    749 #pragma omp parallel for
    750   for (int i = 0; i < 10; ++i) {
    751 #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?}}
    752     for (int i = 0; i < 10; ++i)
    753       ;
    754   }
    755 #pragma omp parallel for
    756   for (int i = 0; i < 10; ++i) {
    757 #pragma omp simd
    758     for (int i = 0; i < 10; ++i)
    759       ;
    760   }
    761 #pragma omp parallel for
    762   for (int i = 0; i < 10; ++i) {
    763 #pragma omp parallel
    764     for (int i = 0; i < 10; ++i)
    765       ;
    766   }
    767 #pragma omp parallel for
    768   for (int i = 0; i < 10; ++i) {
    769 #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?}}
    770     {
    771       bar();
    772     }
    773   }
    774 #pragma omp parallel for
    775   for (int i = 0; i < 10; ++i) {
    776 #pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}}
    777     {
    778       bar();
    779     }
    780   }
    781 #pragma omp parallel for
    782   for (int i = 0; i < 10; ++i) {
    783 #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?}}
    784     {
    785       bar();
    786     }
    787   }
    788 #pragma omp parallel for
    789   for (int i = 0; i < 10; ++i) {
    790 #pragma omp parallel
    791     {
    792 #pragma omp single // OK
    793       {
    794         bar();
    795       }
    796 #pragma omp for // OK
    797       for (int i = 0; i < 10; ++i)
    798         ;
    799 #pragma omp sections // OK
    800       {
    801         bar();
    802       }
    803     }
    804   }
    805 #pragma omp parallel for
    806   for (int i = 0; i < 10; ++i) {
    807 #pragma omp parallel for
    808     for (int i = 0; i < 10; ++i)
    809       ;
    810   }
    811 #pragma omp parallel for
    812   for (int i = 0; i < 10; ++i) {
    813 #pragma omp parallel sections
    814     {
    815       bar();
    816     }
    817   }
    818 
    819 // PARALLEL SECTIONS DIRECTIVE
    820 #pragma omp parallel sections
    821   {
    822 #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?}}
    823     for (int i = 0; i < 10; ++i)
    824       ;
    825   }
    826 #pragma omp parallel sections
    827   {
    828 #pragma omp simd
    829     for (int i = 0; i < 10; ++i)
    830       ;
    831   }
    832 #pragma omp parallel sections
    833   {
    834 #pragma omp parallel
    835     for (int i = 0; i < 10; ++i)
    836       ;
    837   }
    838 #pragma omp parallel sections
    839   {
    840 #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?}}
    841     {
    842       bar();
    843     }
    844   }
    845 #pragma omp parallel sections
    846   {
    847 #pragma omp section
    848     {
    849       bar();
    850     }
    851   }
    852 #pragma omp parallel sections
    853   {
    854 #pragma omp section
    855     {
    856 #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?}}
    857       bar();
    858     }
    859   }
    860 #pragma omp parallel sections
    861   {
    862 #pragma omp parallel
    863     {
    864 #pragma omp single // OK
    865       {
    866         bar();
    867       }
    868 #pragma omp for // OK
    869       for (int i = 0; i < 10; ++i)
    870         ;
    871 #pragma omp sections // OK
    872       {
    873         bar();
    874       }
    875     }
    876   }
    877 #pragma omp parallel sections
    878   {
    879 #pragma omp parallel for
    880     for (int i = 0; i < 10; ++i)
    881       ;
    882   }
    883 #pragma omp parallel sections
    884   {
    885 #pragma omp parallel sections
    886     {
    887       bar();
    888     }
    889   }
    890   return foo<int>();
    891 }
    892 
    893