Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -verify -fopenmp %s
      2 
      3 void foo() {
      4 }
      5 
      6 bool foobool(int argc) {
      7   return argc;
      8 }
      9 
     10 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
     11 extern S1 a;
     12 class S2 {
     13   mutable int a;
     14 
     15 public:
     16   S2() : a(0) {}
     17   S2(const S2 &s2) : a(s2.a) {}
     18   static float S2s;
     19   static const float S2sc;
     20 };
     21 const float S2::S2sc = 0;
     22 const S2 b;
     23 const S2 ba[5];
     24 class S3 {
     25   int a;
     26   S3 &operator=(const S3 &s3);
     27 
     28 public:
     29   S3() : a(0) {}
     30   S3(const S3 &s3) : a(s3.a) {}
     31 };
     32 const S3 c;
     33 const S3 ca[5];
     34 extern const int f;
     35 class S4 {
     36   int a;
     37   S4();
     38   S4(const S4 &s4); // expected-note 2 {{implicitly declared private here}}
     39 
     40 public:
     41   S4(int v) : a(v) {}
     42 };
     43 class S5 {
     44   int a;
     45   S5(const S5 &s5) : a(s5.a) {} // expected-note 4 {{implicitly declared private here}}
     46 
     47 public:
     48   S5() : a(0) {}
     49   S5(int v) : a(v) {}
     50 };
     51 class S6 {
     52   int a;
     53   S6() : a(0) {}
     54 
     55 public:
     56   S6(const S6 &s6) : a(s6.a) {}
     57   S6(int v) : a(v) {}
     58 };
     59 
     60 S3 h;
     61 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
     62 
     63 template <class I, class C>
     64 int foomain(int argc, char **argv) {
     65   I e(4);
     66   C g(5);
     67   int i;
     68   int &j = i;
     69 #pragma omp parallel sections firstprivate // expected-error {{expected '(' after 'firstprivate'}}
     70   {
     71     foo();
     72   }
     73 #pragma omp parallel sections firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     74   {
     75     foo();
     76   }
     77 #pragma omp parallel sections firstprivate() // expected-error {{expected expression}}
     78   {
     79     foo();
     80   }
     81 #pragma omp parallel sections firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
     82   {
     83     foo();
     84   }
     85 #pragma omp parallel sections firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     86   {
     87     foo();
     88   }
     89 #pragma omp parallel sections firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
     90   {
     91     foo();
     92   }
     93 #pragma omp parallel sections firstprivate(argc)
     94   {
     95     foo();
     96   }
     97 #pragma omp parallel sections firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
     98   {
     99     foo();
    100   }
    101 #pragma omp parallel sections firstprivate(a, b) // expected-error {{firstprivate variable with incomplete type 'S1'}}
    102   {
    103     foo();
    104   }
    105 #pragma omp parallel sections firstprivate(argv[1]) // expected-error {{expected variable name}}
    106   {
    107     foo();
    108   }
    109 #pragma omp parallel sections firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
    110   {
    111     foo();
    112   }
    113 #pragma omp parallel sections firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
    114   {
    115     foo();
    116   }
    117 #pragma omp parallel sections linear(i) // expected-error {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel sections'}}
    118   {
    119     foo();
    120   }
    121 #pragma omp parallel
    122   {
    123     int v = 0;
    124     int i;
    125 #pragma omp parallel sections firstprivate(i)
    126     {
    127       foo();
    128     }
    129     v += i;
    130   }
    131 #pragma omp parallel shared(i)
    132 #pragma omp parallel private(i)
    133 #pragma omp parallel sections firstprivate(j)
    134   {
    135     foo();
    136   }
    137 #pragma omp parallel sections firstprivate(i)
    138   {
    139     foo();
    140   }
    141 #pragma omp parallel sections lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
    142   {
    143     foo();
    144   }
    145 #pragma omp parallel private(i)
    146 #pragma omp parallel sections firstprivate(i)
    147   {
    148     foo();
    149   }
    150 #pragma omp parallel reduction(+ : i)
    151 #pragma omp parallel sections firstprivate(i)
    152   {
    153     foo();
    154   }
    155   return 0;
    156 }
    157 
    158 namespace A {
    159 double x;
    160 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
    161 }
    162 namespace B {
    163 using A::x;
    164 }
    165 
    166 int main(int argc, char **argv) {
    167   const int d = 5;
    168   const int da[5] = {0};
    169   S4 e(4);
    170   S5 g(5);
    171   S3 m;
    172   S6 n(2);
    173   int i;
    174   int &j = i;
    175 #pragma omp parallel sections firstprivate // expected-error {{expected '(' after 'firstprivate'}}
    176   {
    177     foo();
    178   }
    179 #pragma omp parallel sections firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    180   {
    181     foo();
    182   }
    183 #pragma omp parallel sections firstprivate() // expected-error {{expected expression}}
    184   {
    185     foo();
    186   }
    187 #pragma omp parallel sections firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
    188   {
    189     foo();
    190   }
    191 #pragma omp parallel sections firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    192   {
    193     foo();
    194   }
    195 #pragma omp parallel sections firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
    196   {
    197     foo();
    198   }
    199 #pragma omp parallel sections firstprivate(argc)
    200   {
    201     foo();
    202   }
    203 #pragma omp parallel sections firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
    204   {
    205     foo();
    206   }
    207 #pragma omp parallel sections firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
    208   {
    209     foo();
    210   }
    211 #pragma omp parallel sections firstprivate(argv[1]) // expected-error {{expected variable name}}
    212   {
    213     foo();
    214   }
    215 #pragma omp parallel sections firstprivate(2 * 2) // expected-error {{expected variable name}}
    216   {
    217     foo();
    218   }
    219 #pragma omp parallel sections firstprivate(ba) // OK
    220   {
    221     foo();
    222   }
    223 #pragma omp parallel sections firstprivate(ca) // OK
    224   {
    225     foo();
    226   }
    227 #pragma omp parallel sections firstprivate(da) // OK
    228   {
    229     foo();
    230   }
    231   int xa;
    232 #pragma omp parallel sections firstprivate(xa) // OK
    233   {
    234     foo();
    235   }
    236 #pragma omp parallel sections firstprivate(S2::S2s) // OK
    237   {
    238     foo();
    239   }
    240 #pragma omp parallel sections firstprivate(S2::S2sc) // OK
    241   {
    242     foo();
    243   }
    244 #pragma omp parallel sections safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp parallel sections'}}
    245   {
    246     foo();
    247   }
    248 #pragma omp parallel sections firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
    249   {
    250     foo();
    251   }
    252 #pragma omp parallel sections firstprivate(m) // OK
    253   {
    254     foo();
    255   }
    256 #pragma omp parallel sections firstprivate(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be firstprivate}}
    257   {
    258     foo();
    259   }
    260 #pragma omp parallel sections private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}}
    261   {
    262     foo();
    263   }
    264 #pragma omp parallel shared(xa)
    265 #pragma omp parallel sections firstprivate(xa) // OK: may be firstprivate
    266   {
    267     foo();
    268   }
    269 #pragma omp parallel sections firstprivate(j)
    270   {
    271     foo();
    272   }
    273 #pragma omp parallel sections lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
    274   {
    275     foo();
    276   }
    277 #pragma omp parallel sections lastprivate(n) firstprivate(n) // OK
    278   {
    279     foo();
    280   }
    281 #pragma omp parallel
    282   {
    283     int v = 0;
    284     int i;
    285 #pragma omp parallel sections firstprivate(i)
    286     {
    287       foo();
    288     }
    289     v += i;
    290   }
    291 #pragma omp parallel private(i)
    292 #pragma omp parallel sections firstprivate(i)
    293   {
    294     foo();
    295   }
    296 #pragma omp parallel reduction(+ : i)
    297 #pragma omp parallel sections firstprivate(i)
    298   {
    299     foo();
    300   }
    301   static int r;
    302 #pragma omp parallel sections firstprivate(r) // OK
    303   {
    304     foo();
    305   }
    306 
    307   return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
    308 }
    309