Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -verify %s
      2 
      3 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel for'}}
      4 #pragma omp parallel for
      5 
      6 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel for'}}
      7 #pragma omp parallel for foo
      8 
      9 void test_no_clause() {
     10   int i;
     11 #pragma omp parallel for
     12   for (i = 0; i < 16; ++i)
     13     ;
     14 
     15 // expected-error@+2 {{statement after '#pragma omp parallel for' must be a for loop}}
     16 #pragma omp parallel 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 for
     28   for (i = 0; i < 16; ++i) {
     29     if (i == 5)
     30       goto L1; // expected-error {{use of undeclared label 'L1'}}
     31     else if (i == 6)
     32       return; // expected-error {{cannot return from OpenMP region}}
     33     else if (i == 7)
     34       goto L2;
     35     else if (i == 8) {
     36     L2:
     37       x[i]++;
     38     }
     39   }
     40 
     41   if (x[0] == 0)
     42     goto L2; // expected-error {{use of undeclared label 'L2'}}
     43   else if (x[1] == 1)
     44     goto L1;
     45 }
     46 
     47 void test_invalid_clause() {
     48   int i;
     49 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}
     50 #pragma omp parallel for foo bar
     51   for (i = 0; i < 16; ++i)
     52     ;
     53 }
     54 
     55 void test_non_identifiers() {
     56   int i, x;
     57 
     58 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}
     59 #pragma omp parallel for;
     60   for (i = 0; i < 16; ++i)
     61     ;
     62 // expected-error@+2 {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel for'}}
     63 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}
     64 #pragma omp parallel for linear(x);
     65   for (i = 0; i < 16; ++i)
     66     ;
     67 
     68 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}
     69 #pragma omp parallel for private(x);
     70   for (i = 0; i < 16; ++i)
     71     ;
     72 
     73 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}
     74 #pragma omp parallel for, private(x);
     75   for (i = 0; i < 16; ++i)
     76     ;
     77 }
     78 
     79 extern int foo();
     80 
     81 void test_collapse() {
     82   int i;
     83 // expected-error@+1 {{expected '('}}
     84 #pragma omp parallel for collapse
     85   for (i = 0; i < 16; ++i)
     86     ;
     87 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
     88 #pragma omp parallel for collapse(
     89   for (i = 0; i < 16; ++i)
     90     ;
     91 // expected-error@+1 {{expected expression}}
     92 #pragma omp parallel for collapse()
     93   for (i = 0; i < 16; ++i)
     94     ;
     95 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
     96 #pragma omp parallel for collapse(,
     97   for (i = 0; i < 16; ++i)
     98     ;
     99 // expected-error@+1 {{expected expression}}  expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
    100 #pragma omp parallel for collapse(, )
    101   for (i = 0; i < 16; ++i)
    102     ;
    103 // expected-warning@+2 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}
    104 // expected-error@+1 {{expected '('}}
    105 #pragma omp parallel for collapse 4)
    106   for (i = 0; i < 16; ++i)
    107     ;
    108 // expected-error@+2 {{expected ')'}}
    109 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    110 #pragma omp parallel for collapse(4
    111   for (i = 0; i < 16; ++i)
    112     ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}
    113 // expected-error@+2 {{expected ')'}}
    114 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    115 #pragma omp parallel for collapse(4,
    116   for (i = 0; i < 16; ++i)
    117     ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}
    118 // expected-error@+2 {{expected ')'}}
    119 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    120 #pragma omp parallel for collapse(4, )
    121   for (i = 0; i < 16; ++i)
    122     ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}
    123 // expected-note@+1 {{as specified in 'collapse' clause}}
    124 #pragma omp parallel for collapse(4)
    125   for (i = 0; i < 16; ++i)
    126     ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}
    127 // expected-error@+2 {{expected ')'}}
    128 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    129 #pragma omp parallel for collapse(4 4)
    130   for (i = 0; i < 16; ++i)
    131     ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}
    132 // expected-error@+2 {{expected ')'}}
    133 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    134 #pragma omp parallel for collapse(4, , 4)
    135   for (i = 0; i < 16; ++i)
    136     ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}
    137 #pragma omp parallel for collapse(4)
    138   for (int i1 = 0; i1 < 16; ++i1)
    139     for (int i2 = 0; i2 < 16; ++i2)
    140       for (int i3 = 0; i3 < 16; ++i3)
    141         for (int i4 = 0; i4 < 16; ++i4)
    142           foo();
    143 // expected-error@+2 {{expected ')'}}
    144 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}
    145 #pragma omp parallel for collapse(4, 8)
    146   for (i = 0; i < 16; ++i)
    147     ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}
    148 // expected-error@+1 {{expression is not an integer constant expression}}
    149 #pragma omp parallel for collapse(2.5)
    150   for (i = 0; i < 16; ++i)
    151     ;
    152 // expected-error@+1 {{expression is not an integer constant expression}}
    153 #pragma omp parallel for collapse(foo())
    154   for (i = 0; i < 16; ++i)
    155     ;
    156 // expected-error@+1 {{argument to 'collapse' clause must be a positive integer value}}
    157 #pragma omp parallel for collapse(-5)
    158   for (i = 0; i < 16; ++i)
    159     ;
    160 // expected-error@+1 {{argument to 'collapse' clause must be a positive integer value}}
    161 #pragma omp parallel for collapse(0)
    162   for (i = 0; i < 16; ++i)
    163     ;
    164 // expected-error@+1 {{argument to 'collapse' clause must be a positive integer value}}
    165 #pragma omp parallel for collapse(5 - 5)
    166   for (i = 0; i < 16; ++i)
    167     ;
    168 }
    169 
    170 void test_private() {
    171   int i;
    172 // expected-error@+2 {{expected expression}}
    173 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
    174 #pragma omp parallel for private(
    175   for (i = 0; i < 16; ++i)
    176     ;
    177 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    178 // expected-error@+1 2 {{expected expression}}
    179 #pragma omp parallel for private(,
    180   for (i = 0; i < 16; ++i)
    181     ;
    182 // expected-error@+1 2 {{expected expression}}
    183 #pragma omp parallel for private(, )
    184   for (i = 0; i < 16; ++i)
    185     ;
    186 // expected-error@+1 {{expected expression}}
    187 #pragma omp parallel for private()
    188   for (i = 0; i < 16; ++i)
    189     ;
    190 // expected-error@+1 {{expected expression}}
    191 #pragma omp parallel for private(int)
    192   for (i = 0; i < 16; ++i)
    193     ;
    194 // expected-error@+1 {{expected variable name}}
    195 #pragma omp parallel for private(0)
    196   for (i = 0; i < 16; ++i)
    197     ;
    198 
    199   int x, y, z;
    200 #pragma omp parallel for private(x)
    201   for (i = 0; i < 16; ++i)
    202     ;
    203 #pragma omp parallel for private(x, y)
    204   for (i = 0; i < 16; ++i)
    205     ;
    206 #pragma omp parallel for private(x, y, z)
    207   for (i = 0; i < 16; ++i) {
    208     x = y * i + z;
    209   }
    210 }
    211 
    212 void test_lastprivate() {
    213   int i;
    214 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    215 // expected-error@+1 {{expected expression}}
    216 #pragma omp parallel for lastprivate(
    217   for (i = 0; i < 16; ++i)
    218     ;
    219 
    220 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    221 // expected-error@+1 2 {{expected expression}}
    222 #pragma omp parallel for lastprivate(,
    223   for (i = 0; i < 16; ++i)
    224     ;
    225 // expected-error@+1 2 {{expected expression}}
    226 #pragma omp parallel for lastprivate(, )
    227   for (i = 0; i < 16; ++i)
    228     ;
    229 // expected-error@+1 {{expected expression}}
    230 #pragma omp parallel for lastprivate()
    231   for (i = 0; i < 16; ++i)
    232     ;
    233 // expected-error@+1 {{expected expression}}
    234 #pragma omp parallel for lastprivate(int)
    235   for (i = 0; i < 16; ++i)
    236     ;
    237 // expected-error@+1 {{expected variable name}}
    238 #pragma omp parallel for lastprivate(0)
    239   for (i = 0; i < 16; ++i)
    240     ;
    241 
    242   int x, y, z;
    243 #pragma omp parallel for lastprivate(x)
    244   for (i = 0; i < 16; ++i)
    245     ;
    246 #pragma omp parallel for lastprivate(x, y)
    247   for (i = 0; i < 16; ++i)
    248     ;
    249 #pragma omp parallel for lastprivate(x, y, z)
    250   for (i = 0; i < 16; ++i)
    251     ;
    252 }
    253 
    254 void test_firstprivate() {
    255   int i;
    256 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    257 // expected-error@+1 {{expected expression}}
    258 #pragma omp parallel for firstprivate(
    259   for (i = 0; i < 16; ++i)
    260     ;
    261 
    262 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
    263 // expected-error@+1 2 {{expected expression}}
    264 #pragma omp parallel for firstprivate(,
    265   for (i = 0; i < 16; ++i)
    266     ;
    267 // expected-error@+1 2 {{expected expression}}
    268 #pragma omp parallel for firstprivate(, )
    269   for (i = 0; i < 16; ++i)
    270     ;
    271 // expected-error@+1 {{expected expression}}
    272 #pragma omp parallel for firstprivate()
    273   for (i = 0; i < 16; ++i)
    274     ;
    275 // expected-error@+1 {{expected expression}}
    276 #pragma omp parallel for firstprivate(int)
    277   for (i = 0; i < 16; ++i)
    278     ;
    279 // expected-error@+1 {{expected variable name}}
    280 #pragma omp parallel for firstprivate(0)
    281   for (i = 0; i < 16; ++i)
    282     ;
    283 
    284   int x, y, z;
    285 #pragma omp parallel for lastprivate(x) firstprivate(x)
    286   for (i = 0; i < 16; ++i)
    287     ;
    288 #pragma omp parallel for lastprivate(x, y) firstprivate(x, y)
    289   for (i = 0; i < 16; ++i)
    290     ;
    291 #pragma omp parallel for lastprivate(x, y, z) firstprivate(x, y, z)
    292   for (i = 0; i < 16; ++i)
    293     ;
    294 }
    295 
    296 void test_loop_messages() {
    297   float a[100], b[100], c[100];
    298 // expected-error@+2 {{variable must be of integer or pointer type}}
    299 #pragma omp parallel for
    300   for (float fi = 0; fi < 10.0; fi++) {
    301     c[(int)fi] = a[(int)fi] + b[(int)fi];
    302   }
    303 // expected-error@+2 {{variable must be of integer or pointer type}}
    304 #pragma omp parallel for
    305   for (double fi = 0; fi < 10.0; fi++) {
    306     c[(int)fi] = a[(int)fi] + b[(int)fi];
    307   }
    308 }
    309 
    310