Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s
      2 
      3 void foo();
      4 
      5 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel sections'}}
      6 #pragma omp parallel sections
      7 
      8 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel sections'}}
      9 #pragma omp parallel sections foo
     10 
     11 void test_no_clause() {
     12   int i;
     13 #pragma omp parallel sections
     14   {
     15     foo();
     16   }
     17 
     18 // expected-error@+2 {{the statement for '#pragma omp parallel sections' must be a compound statement}}
     19 #pragma omp parallel sections
     20   ++i;
     21 
     22 #pragma omp parallel sections
     23   {
     24     foo();
     25     foo(); // expected-error {{statement in 'omp parallel sections' directive must be enclosed into a section region}}
     26   }
     27 
     28 }
     29 
     30 void test_branch_protected_scope() {
     31   int i = 0;
     32 L1:
     33   ++i;
     34 
     35   int x[24];
     36 
     37 #pragma omp parallel sections
     38   {
     39     if (i == 5)
     40       goto L1; // expected-error {{use of undeclared label 'L1'}}
     41     else if (i == 6)
     42       return; // expected-error {{cannot return from OpenMP region}}
     43     else if (i == 7)
     44       goto L2;
     45     else if (i == 8) {
     46     L2:
     47       x[i]++;
     48     }
     49 #pragma omp section
     50     if (i == 5)
     51       goto L1; // expected-error {{use of undeclared label 'L1'}}
     52     else if (i == 6)
     53       return; // expected-error {{cannot return from OpenMP region}}
     54     else if (i == 7)
     55       goto L3;
     56     else if (i == 8) {
     57     L3:
     58       x[i]++;
     59     }
     60   }
     61 
     62   if (x[0] == 0)
     63     goto L2; // expected-error {{use of undeclared label 'L2'}}
     64   else if (x[1] == 1)
     65     goto L1;
     66   goto L3; // expected-error {{use of undeclared label 'L3'}}
     67 }
     68 
     69 void test_invalid_clause() {
     70   int i;
     71 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
     72 #pragma omp parallel sections foo bar
     73   {
     74     foo();
     75 // expected-error@+1 {{unexpected OpenMP clause 'nowait' in directive '#pragma omp section'}}
     76 #pragma omp section nowait
     77     ;
     78   }
     79 }
     80 
     81 void test_non_identifiers() {
     82   int i, x;
     83 
     84 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
     85 #pragma omp parallel sections;
     86   {
     87     foo();
     88   }
     89 // expected-error@+2 {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel sections'}}
     90 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
     91 #pragma omp parallel sections linear(x);
     92   {
     93     foo();
     94   }
     95 
     96 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
     97 #pragma omp parallel sections private(x);
     98   {
     99     foo();
    100   }
    101 
    102 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
    103 #pragma omp parallel sections, private(x);
    104   {
    105     foo();
    106   }
    107 }
    108 
    109 void test_private() {
    110   int i;
    111 // expected-error@+2 {{expected expression}}
    112 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
    113 #pragma omp parallel sections private(
    114   {
    115     foo();
    116   }
    117 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    118 // expected-error@+1 2 {{expected expression}}
    119 #pragma omp parallel sections private(,
    120   {
    121     foo();
    122   }
    123 // expected-error@+1 2 {{expected expression}}
    124 #pragma omp parallel sections private(, )
    125   {
    126     foo();
    127   }
    128 // expected-error@+1 {{expected expression}}
    129 #pragma omp parallel sections private()
    130   {
    131     foo();
    132   }
    133 // expected-error@+1 {{expected expression}}
    134 #pragma omp parallel sections private(int)
    135   {
    136     foo();
    137   }
    138 // expected-error@+1 {{expected variable name}}
    139 #pragma omp parallel sections private(0)
    140   {
    141     foo();
    142   }
    143 
    144   int x, y, z;
    145 #pragma omp parallel sections private(x)
    146   {
    147     foo();
    148   }
    149 #pragma omp parallel sections private(x, y)
    150   {
    151     foo();
    152   }
    153 #pragma omp parallel sections private(x, y, z)
    154   {
    155     foo();
    156   }
    157 }
    158 
    159 void test_lastprivate() {
    160   int i;
    161 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    162 // expected-error@+1 {{expected expression}}
    163 #pragma omp parallel sections lastprivate(
    164   {
    165     foo();
    166   }
    167 
    168 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    169 // expected-error@+1 2 {{expected expression}}
    170 #pragma omp parallel sections lastprivate(,
    171   {
    172     foo();
    173   }
    174 // expected-error@+1 2 {{expected expression}}
    175 #pragma omp parallel sections lastprivate(, )
    176   {
    177     foo();
    178   }
    179 // expected-error@+1 {{expected expression}}
    180 #pragma omp parallel sections lastprivate()
    181   {
    182     foo();
    183   }
    184 // expected-error@+1 {{expected expression}}
    185 #pragma omp parallel sections lastprivate(int)
    186   {
    187     foo();
    188   }
    189 // expected-error@+1 {{expected variable name}}
    190 #pragma omp parallel sections lastprivate(0)
    191   {
    192     foo();
    193   }
    194 
    195   int x, y, z;
    196 #pragma omp parallel sections lastprivate(x)
    197   {
    198     foo();
    199   }
    200 #pragma omp parallel sections lastprivate(x, y)
    201   {
    202     foo();
    203   }
    204 #pragma omp parallel sections lastprivate(x, y, z)
    205   {
    206     foo();
    207   }
    208 }
    209 
    210 void test_firstprivate() {
    211   int i;
    212 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    213 // expected-error@+1 {{expected expression}}
    214 #pragma omp parallel sections firstprivate(
    215   {
    216     foo();
    217   }
    218 
    219 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    220 // expected-error@+1 2 {{expected expression}}
    221 #pragma omp parallel sections firstprivate(,
    222   {
    223     foo();
    224   }
    225 // expected-error@+1 2 {{expected expression}}
    226 #pragma omp parallel sections firstprivate(, )
    227   {
    228     foo();
    229   }
    230 // expected-error@+1 {{expected expression}}
    231 #pragma omp parallel sections firstprivate()
    232   {
    233     foo();
    234   }
    235 // expected-error@+1 {{expected expression}}
    236 #pragma omp parallel sections firstprivate(int)
    237   {
    238     foo();
    239   }
    240 // expected-error@+1 {{expected variable name}}
    241 #pragma omp parallel sections firstprivate(0)
    242   {
    243     foo();
    244   }
    245 
    246   int x, y, z;
    247 #pragma omp parallel sections lastprivate(x) firstprivate(x)
    248   {
    249     foo();
    250   }
    251 #pragma omp parallel sections lastprivate(x, y) firstprivate(x, y)
    252   {
    253     foo();
    254   }
    255 #pragma omp parallel sections lastprivate(x, y, z) firstprivate(x, y, z)
    256   {
    257     foo();
    258   }
    259 }
    260 
    261