Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s
      2 
      3 int foo();
      4 
      5 template <class T>
      6 T foo() {
      7  T k;
      8   #pragma omp for ordered
      9   for (int i = 0; i < 10; ++i) {
     10     L1:
     11       foo();
     12     #pragma omp ordered
     13     {
     14       foo();
     15       goto L1; // expected-error {{use of undeclared label 'L1'}}
     16     }
     17   }
     18   #pragma omp for ordered
     19   for (int i = 0; i < 10; ++i) {
     20     foo();
     21     goto L2; // expected-error {{use of undeclared label 'L2'}}
     22     #pragma omp ordered
     23     {
     24       L2:
     25       foo();
     26     }
     27   }
     28   #pragma omp for ordered
     29   for (int i = 0; i < 10; ++i) {
     30     #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}}
     31     {
     32       foo();
     33     }
     34   }
     35   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
     36   for (int i = 0; i < 10; ++i) {
     37     #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
     38     {
     39       foo();
     40     }
     41   }
     42   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
     43   for (int i = 0; i < 10; ++i) {
     44     #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}}
     45     {
     46       foo();
     47     }
     48   }
     49   #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
     50   {
     51     foo();
     52   }
     53   #pragma omp simd
     54   for (int i = 0; i < 10; ++i) {
     55     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     56     {
     57       foo();
     58     }
     59   }
     60   #pragma omp simd
     61   for (int i = 0; i < 10; ++i) {
     62     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     63     {
     64       foo();
     65     }
     66   }
     67   #pragma omp for simd
     68   for (int i = 0; i < 10; ++i) {
     69     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     70     {
     71       foo();
     72     }
     73   }
     74   #pragma omp for simd
     75   for (int i = 0; i < 10; ++i) {
     76     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     77     {
     78       foo();
     79     }
     80   }
     81   #pragma omp parallel for simd
     82   for (int i = 0; i < 10; ++i) {
     83     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     84     {
     85       foo();
     86     }
     87   }
     88   #pragma omp parallel for simd
     89   for (int i = 0; i < 10; ++i) {
     90     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     91     {
     92       foo();
     93     }
     94     #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
     95   }
     96 #pragma omp parallel for ordered
     97   for (int i = 0; i < 10; ++i) {
     98     #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
     99     #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
    100   }
    101 #pragma omp parallel for ordered(2) // expected-note 5 {{'ordered' clause with specified parameter}}
    102   for (int i = 0; i < 10; ++i) {
    103     for (int j = 0; j < 10; ++j) {
    104 #pragma omp ordered depend // expected-error {{expected '(' after 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
    105 #pragma omp ordered depend( // expected-error {{expected ')'}} expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-note {{to match this '('}}
    106 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}}
    107 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-note {{to match this '('}}
    108 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
    109 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}}
    110 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}}
    111 #pragma omp ordered depend(source)
    112                            if (i == j)
    113 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
    114                              ;
    115                            if (i == j)
    116 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
    117                              ;
    118 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}}
    119 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}}
    120 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}}
    121 #pragma omp ordered depend(in : i) // expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
    122 #pragma omp ordered depend(sink : i, j)
    123 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}}
    124 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
    125 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}}
    126 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}}
    127 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(sink : i-0, j+sizeof(T))
    128 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(source) // expected-error {{'depend(source)' clause cannot be mixed with 'depend(sink:vec)' clauses}}
    129 #pragma omp ordered depend(source) depend(sink : i-0, j+sizeof(T)) // expected-error {{'depend(sink:vec)' clauses cannot be mixed with 'depend(source)' clause}}
    130     }
    131   }
    132   return T();
    133 }
    134 
    135 int foo() {
    136 int k;
    137   #pragma omp for ordered
    138   for (int i = 0; i < 10; ++i) {
    139     L1:
    140       foo();
    141     #pragma omp ordered
    142     {
    143       foo();
    144       goto L1; // expected-error {{use of undeclared label 'L1'}}
    145     }
    146   }
    147   #pragma omp for ordered
    148   for (int i = 0; i < 10; ++i) {
    149     foo();
    150     goto L2; // expected-error {{use of undeclared label 'L2'}}
    151     #pragma omp ordered
    152     {
    153       L2:
    154       foo();
    155     }
    156   }
    157   #pragma omp for ordered
    158   for (int i = 0; i < 10; ++i) {
    159     #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}}
    160     {
    161       foo();
    162     }
    163   }
    164   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
    165   for (int i = 0; i < 10; ++i) {
    166     #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
    167     {
    168       foo();
    169     }
    170   }
    171   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
    172   for (int i = 0; i < 10; ++i) {
    173     #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}}
    174     {
    175       foo();
    176     }
    177   }
    178   #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
    179   {
    180     foo();
    181   }
    182   #pragma omp simd
    183   for (int i = 0; i < 10; ++i) {
    184     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    185     {
    186       foo();
    187     }
    188   }
    189   #pragma omp simd
    190   for (int i = 0; i < 10; ++i) {
    191     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    192     {
    193       foo();
    194     }
    195   }
    196   #pragma omp for simd
    197   for (int i = 0; i < 10; ++i) {
    198     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    199     {
    200       foo();
    201     }
    202   }
    203   #pragma omp for simd
    204   for (int i = 0; i < 10; ++i) {
    205     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    206     {
    207       foo();
    208     }
    209   }
    210   #pragma omp parallel for simd
    211   for (int i = 0; i < 10; ++i) {
    212     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    213     {
    214       foo();
    215     }
    216   }
    217   #pragma omp parallel for simd
    218   for (int i = 0; i < 10; ++i) {
    219     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    220     {
    221       foo();
    222     }
    223     #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
    224   }
    225 #pragma omp parallel for ordered
    226   for (int i = 0; i < 10; ++i) {
    227     #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
    228     #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
    229   }
    230 #pragma omp parallel for ordered(2) // expected-note 5 {{'ordered' clause with specified parameter}}
    231   for (int i = 0; i < 10; ++i) {
    232     for (int j = 0; j < 10; ++j) {
    233 #pragma omp ordered depend // expected-error {{expected '(' after 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
    234 #pragma omp ordered depend( // expected-error {{expected ')'}} expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-note {{to match this '('}}
    235 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}}
    236 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-note {{to match this '('}}
    237 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
    238 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}}
    239 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}}
    240 #pragma omp ordered depend(source)
    241                            if (i == j)
    242 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
    243                              ;
    244                            if (i == j)
    245 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
    246                              ;
    247 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}}
    248 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}}
    249 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}}
    250 #pragma omp ordered depend(in : i) // expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
    251 #pragma omp ordered depend(sink : i, j)
    252 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}}
    253 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
    254 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}}
    255 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}}
    256 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(sink : i-0, j+sizeof(int))
    257 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(source) // expected-error {{'depend(source)' clause cannot be mixed with 'depend(sink:vec)' clauses}}
    258 #pragma omp ordered depend(source) depend(sink : i-0, j+sizeof(int)) // expected-error {{'depend(sink:vec)' clauses cannot be mixed with 'depend(source)' clause}}
    259     }
    260   }
    261 
    262   return foo<int>(); // expected-note {{in instantiation of function template specialization 'foo<int>' requested here}}
    263 }
    264