Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -fsyntax-only -fopenmp -triple x86_64-unknown-unknown -verify %s
      2 
      3 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp for'}}
      4 #pragma omp for
      5 
      6 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp for'}}
      7 #pragma omp for foo
      8 
      9 void test_no_clause() {
     10   int i;
     11 #pragma omp for
     12   for (i = 0; i < 16; ++i)
     13     ;
     14 
     15 // expected-error@+2 {{statement after '#pragma omp for' must be a for loop}}
     16 #pragma omp for
     17   ++i;
     18 }
     19 
     20 void test_branch_protected_scope() {
     21   int i = 0;
     22 L1:
     23   ++i;
     24 
     25   int x[24];
     26 
     27 #pragma omp parallel
     28 #pragma omp for
     29   for (i = 0; i < 16; ++i) {
     30     if (i == 5)
     31       goto L1; // expected-error {{use of undeclared label 'L1'}}
     32     else if (i == 6)
     33       return; // expected-error {{cannot return from OpenMP region}}
     34     else if (i == 7)
     35       goto L2;
     36     else if (i == 8) {
     37     L2:
     38       x[i]++;
     39     }
     40   }
     41 
     42   if (x[0] == 0)
     43     goto L2; // expected-error {{use of undeclared label 'L2'}}
     44   else if (x[1] == 1)
     45     goto L1;
     46 }
     47 
     48 void test_invalid_clause() {
     49   int i;
     50 #pragma omp parallel
     51 // expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
     52 #pragma omp for foo bar
     53   for (i = 0; i < 16; ++i)
     54     ;
     55 }
     56 
     57 void test_non_identifiers() {
     58   int i, x;
     59 
     60 #pragma omp parallel
     61 // expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
     62 #pragma omp for;
     63   for (i = 0; i < 16; ++i)
     64     ;
     65 // expected-warning@+2 {{extra tokens at the end of '#pragma omp for' are ignored}}
     66 #pragma omp parallel
     67 #pragma omp for linear(x);
     68   for (i = 0; i < 16; ++i)
     69     ;
     70 
     71 #pragma omp parallel
     72 // expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
     73 #pragma omp for private(x);
     74   for (i = 0; i < 16; ++i)
     75     ;
     76 
     77 #pragma omp parallel
     78 // expected-warning@+1 {{extra tokens at the end of '#pragma omp for' are ignored}}
     79 #pragma omp for, private(x);
     80   for (i = 0; i < 16; ++i)
     81     ;
     82 }
     83 
     84 extern int foo();
     85 
     86 void test_collapse() {
     87   int i;
     88 #pragma omp parallel
     89 // expected-error@+1 {{expected '('}}
     90 #pragma omp for collapse
     91   for (i = 0; i < 16; ++i)
     92     ;
     93 #pragma omp parallel
     94 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
     95 #pragma omp for collapse(
     96   for (i = 0; i < 16; ++i)
     97     ;
     98 #pragma omp parallel
     99 // expected-error@+1 {{expected expression}}
    100 #pragma omp for collapse()
    101   for (i = 0; i < 16; ++i)
    102     ;
    103 #pragma omp parallel
    104 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
    105 #pragma omp for collapse(,
    106   for (i = 0; i < 16; ++i)
    107     ;
    108 #pragma omp parallel
    109 // expected-error@+1 {{expected expression}}  expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
    110 #pragma omp for collapse(, )
    111   for (i = 0; i < 16; ++i)
    112     ;
    113 #pragma omp parallel
    114 // expected-warning@+2 {{extra tokens at the end of '#pragma omp for' are ignored}}
    115 // expected-error@+1 {{expected '('}}
    116 #pragma omp for collapse 4)
    117   for (i = 0; i < 16; ++i)
    118     ;
    119 #pragma omp parallel
    120 // expected-error@+2 {{expected ')'}}
    121 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    122 #pragma omp for collapse(4
    123   for (i = 0; i < 16; ++i)
    124     ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
    125 #pragma omp parallel
    126 // expected-error@+2 {{expected ')'}}
    127 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    128 #pragma omp for collapse(4,
    129   for (i = 0; i < 16; ++i)
    130     ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
    131 #pragma omp parallel
    132 // expected-error@+2 {{expected ')'}}
    133 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    134 #pragma omp for collapse(4, )
    135   for (i = 0; i < 16; ++i)
    136     ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
    137 #pragma omp parallel
    138 // expected-note@+1 {{as specified in 'collapse' clause}}
    139 #pragma omp for collapse(4)
    140   for (i = 0; i < 16; ++i)
    141     ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
    142 #pragma omp parallel
    143 // expected-error@+2 {{expected ')'}}
    144 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    145 #pragma omp for collapse(4 4)
    146   for (i = 0; i < 16; ++i)
    147     ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
    148 #pragma omp parallel
    149 // expected-error@+2 {{expected ')'}}
    150 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    151 #pragma omp for collapse(4, , 4)
    152   for (i = 0; i < 16; ++i)
    153     ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
    154 #pragma omp parallel
    155 #pragma omp for collapse(4)
    156   for (int i1 = 0; i1 < 16; ++i1)
    157     for (int i2 = 0; i2 < 16; ++i2)
    158       for (int i3 = 0; i3 < 16; ++i3)
    159         for (int i4 = 0; i4 < 16; ++i4)
    160           foo();
    161 #pragma omp parallel
    162 // expected-error@+2 {{expected ')'}}
    163 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    164 #pragma omp for collapse(4, 8)
    165   for (i = 0; i < 16; ++i)
    166     ; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
    167 #pragma omp parallel
    168 // expected-error@+1 {{expression is not an integer constant expression}}
    169 #pragma omp for collapse(2.5)
    170   for (i = 0; i < 16; ++i)
    171     ;
    172 #pragma omp parallel
    173 // expected-error@+1 {{expression is not an integer constant expression}}
    174 #pragma omp for collapse(foo())
    175   for (i = 0; i < 16; ++i)
    176     ;
    177 #pragma omp parallel
    178 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
    179 #pragma omp for collapse(-5)
    180   for (i = 0; i < 16; ++i)
    181     ;
    182 #pragma omp parallel
    183 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
    184 #pragma omp for collapse(0)
    185   for (i = 0; i < 16; ++i)
    186     ;
    187 #pragma omp parallel
    188 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
    189 #pragma omp for collapse(5 - 5)
    190   for (i = 0; i < 16; ++i)
    191     ;
    192 #pragma omp parallel
    193 #pragma omp for collapse(2)
    194   for (i = 0; i < 16; ++i)
    195 // expected-note@+1 {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for' directive into a parallel or another task region?}}
    196     for (int j = 0; j < 16; ++j)
    197 // expected-error@+2 {{reduction variable must be shared}}
    198 // expected-error@+1 {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
    199 #pragma omp for reduction(+ : i, j)
    200       for (int k = 0; k < 16; ++k)
    201         i += j;
    202 }
    203 
    204 void test_private() {
    205   int i;
    206 #pragma omp parallel
    207 // expected-error@+2 {{expected expression}}
    208 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
    209 #pragma omp for private(
    210   for (i = 0; i < 16; ++i)
    211     ;
    212 #pragma omp parallel
    213 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    214 // expected-error@+1 2 {{expected expression}}
    215 #pragma omp for private(,
    216   for (i = 0; i < 16; ++i)
    217     ;
    218 #pragma omp parallel
    219 // expected-error@+1 2 {{expected expression}}
    220 #pragma omp for private(, )
    221   for (i = 0; i < 16; ++i)
    222     ;
    223 #pragma omp parallel
    224 // expected-error@+1 {{expected expression}}
    225 #pragma omp for private()
    226   for (i = 0; i < 16; ++i)
    227     ;
    228 #pragma omp parallel
    229 // expected-error@+1 {{expected expression}}
    230 #pragma omp for private(int)
    231   for (i = 0; i < 16; ++i)
    232     ;
    233 #pragma omp parallel
    234 // expected-error@+1 {{expected variable name}}
    235 #pragma omp for private(0)
    236   for (i = 0; i < 16; ++i)
    237     ;
    238 
    239   int x, y, z;
    240 #pragma omp parallel
    241 #pragma omp for private(x)
    242   for (i = 0; i < 16; ++i)
    243     ;
    244 #pragma omp parallel
    245 #pragma omp for private(x, y)
    246   for (i = 0; i < 16; ++i)
    247     ;
    248 #pragma omp parallel
    249 #pragma omp for private(x, y, z)
    250   for (i = 0; i < 16; ++i) {
    251     x = y * i + z;
    252   }
    253 }
    254 
    255 void test_lastprivate() {
    256   int i;
    257 #pragma omp parallel
    258 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    259 // expected-error@+1 {{expected expression}}
    260 #pragma omp for lastprivate(
    261   for (i = 0; i < 16; ++i)
    262     ;
    263 
    264 #pragma omp parallel
    265 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    266 // expected-error@+1 2 {{expected expression}}
    267 #pragma omp for lastprivate(,
    268   for (i = 0; i < 16; ++i)
    269     ;
    270 #pragma omp parallel
    271 // expected-error@+1 2 {{expected expression}}
    272 #pragma omp for lastprivate(, )
    273   for (i = 0; i < 16; ++i)
    274     ;
    275 #pragma omp parallel
    276 // expected-error@+1 {{expected expression}}
    277 #pragma omp for lastprivate()
    278   for (i = 0; i < 16; ++i)
    279     ;
    280 #pragma omp parallel
    281 // expected-error@+1 {{expected expression}}
    282 #pragma omp for lastprivate(int)
    283   for (i = 0; i < 16; ++i)
    284     ;
    285 #pragma omp parallel
    286 // expected-error@+1 {{expected variable name}}
    287 #pragma omp for lastprivate(0)
    288   for (i = 0; i < 16; ++i)
    289     ;
    290 
    291   int x, y, z;
    292 #pragma omp parallel
    293 #pragma omp for lastprivate(x)
    294   for (i = 0; i < 16; ++i)
    295     ;
    296 #pragma omp parallel
    297 #pragma omp for lastprivate(x, y)
    298   for (i = 0; i < 16; ++i)
    299     ;
    300 #pragma omp parallel
    301 #pragma omp for lastprivate(x, y, z)
    302   for (i = 0; i < 16; ++i)
    303     ;
    304 }
    305 
    306 void test_firstprivate() {
    307   int i;
    308 #pragma omp parallel
    309 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    310 // expected-error@+1 {{expected expression}}
    311 #pragma omp for firstprivate(
    312   for (i = 0; i < 16; ++i)
    313     ;
    314 
    315 #pragma omp parallel
    316 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    317 // expected-error@+1 2 {{expected expression}}
    318 #pragma omp for firstprivate(,
    319   for (i = 0; i < 16; ++i)
    320     ;
    321 #pragma omp parallel
    322 // expected-error@+1 2 {{expected expression}}
    323 #pragma omp for firstprivate(, )
    324   for (i = 0; i < 16; ++i)
    325     ;
    326 #pragma omp parallel
    327 // expected-error@+1 {{expected expression}}
    328 #pragma omp for firstprivate()
    329   for (i = 0; i < 16; ++i)
    330     ;
    331 #pragma omp parallel
    332 // expected-error@+1 {{expected expression}}
    333 #pragma omp for firstprivate(int)
    334   for (i = 0; i < 16; ++i)
    335     ;
    336 #pragma omp parallel
    337 // expected-error@+1 {{expected variable name}}
    338 #pragma omp for firstprivate(0)
    339   for (i = 0; i < 16; ++i)
    340     ;
    341 
    342   int x, y, z;
    343 #pragma omp parallel
    344 #pragma omp for lastprivate(x) firstprivate(x)
    345   for (i = 0; i < 16; ++i)
    346     ;
    347 #pragma omp parallel
    348 #pragma omp for lastprivate(x, y) firstprivate(x, y)
    349   for (i = 0; i < 16; ++i)
    350     ;
    351 #pragma omp parallel
    352 #pragma omp for lastprivate(x, y, z) firstprivate(x, y, z)
    353   for (i = 0; i < 16; ++i)
    354     ;
    355 }
    356 
    357 void test_loop_messages() {
    358   float a[100], b[100], c[100];
    359 #pragma omp parallel
    360 // expected-error@+2 {{variable must be of integer or pointer type}}
    361 #pragma omp for
    362   for (float fi = 0; fi < 10.0; fi++) {
    363     c[(int)fi] = a[(int)fi] + b[(int)fi];
    364   }
    365 #pragma omp parallel
    366 // expected-error@+2 {{variable must be of integer or pointer type}}
    367 #pragma omp for
    368   for (double fi = 0; fi < 10.0; fi++) {
    369     c[(int)fi] = a[(int)fi] + b[(int)fi];
    370   }
    371 
    372   // expected-warning@+2 {{OpenMP loop iteration variable cannot have more than 64 bits size and will be narrowed}}
    373   #pragma omp for
    374   for (__int128 ii = 0; ii < 10; ii++) {
    375     c[ii] = a[ii] + b[ii];
    376   }
    377 }
    378 
    379