Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -verify -fopenmp=libiomp5 %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 };
     18 const S2 b;
     19 const S2 ba[5];
     20 class S3 {
     21   int a;
     22 
     23 public:
     24   S3() : a(0) {}
     25 };
     26 const S3 ca[5];
     27 class S4 {
     28   int a;
     29   S4(); // expected-note {{implicitly declared private here}}
     30 
     31 public:
     32   S4(int v) : a(v) {}
     33 };
     34 class S5 {
     35   int a;
     36   S5() : a(0) {} // expected-note {{implicitly declared private here}}
     37 
     38 public:
     39   S5(int v) : a(v) {}
     40 };
     41 
     42 S3 h;
     43 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
     44 
     45 template <class I, class C>
     46 int foomain(I argc, C **argv) {
     47   I e(4);
     48   I g(5);
     49   int i;
     50   int &j = i;           // expected-note {{'j' defined here}}
     51 #pragma omp parallel for simd private // expected-error {{expected '(' after 'private'}}
     52   for (int k = 0; k < argc; ++k)
     53     ++k;
     54 #pragma omp parallel for simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     55   for (int k = 0; k < argc; ++k)
     56     ++k;
     57 #pragma omp parallel for simd private() // expected-error {{expected expression}}
     58   for (int k = 0; k < argc; ++k)
     59     ++k;
     60 #pragma omp parallel for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
     61   for (int k = 0; k < argc; ++k)
     62     ++k;
     63 #pragma omp parallel for simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     64   for (int k = 0; k < argc; ++k)
     65     ++k;
     66 #pragma omp parallel for simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
     67   for (int k = 0; k < argc; ++k)
     68     ++k;
     69 #pragma omp parallel for simd private(argc)
     70   for (int k = 0; k < argc; ++k)
     71     ++k;
     72 #pragma omp parallel for simd private(S1) // expected-error {{'S1' does not refer to a value}}
     73   for (int k = 0; k < argc; ++k)
     74     ++k;
     75 #pragma omp parallel for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
     76   for (int k = 0; k < argc; ++k)
     77     ++k;
     78 #pragma omp parallel for simd private(argv[1]) // expected-error {{expected variable name}}
     79   for (int k = 0; k < argc; ++k)
     80     ++k;
     81 #pragma omp parallel for simd private(e, g)
     82   for (int k = 0; k < argc; ++k)
     83     ++k;
     84 #pragma omp parallel for simd private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
     85   for (int k = 0; k < argc; ++k)
     86     ++k;
     87 #pragma omp parallel for simd nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp parallel for simd'}}
     88   for (int k = 0; k < argc; ++k)
     89     ++k;
     90 #pragma omp parallel
     91   {
     92     int v = 0;
     93     int i;
     94 #pragma omp parallel for simd private(i)
     95     for (int k = 0; k < argc; ++k) {
     96       i = k;
     97       v += i;
     98     }
     99   }
    100 #pragma omp parallel shared(i)
    101 #pragma omp parallel private(i)
    102 #pragma omp parallel for simd private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}}
    103   for (int k = 0; k < argc; ++k)
    104     ++k;
    105 #pragma omp parallel for simd private(i)
    106   for (int k = 0; k < argc; ++k)
    107     ++k;
    108   return 0;
    109 }
    110 
    111 namespace A {
    112 double x;
    113 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
    114 }
    115 namespace B {
    116 using A::x;
    117 }
    118 
    119 int main(int argc, char **argv) {
    120   S4 e(4);
    121   S5 g(5);
    122   int i;
    123   int &j = i;           // expected-note {{'j' defined here}}
    124 #pragma omp parallel for simd private // expected-error {{expected '(' after 'private'}}
    125   for (int k = 0; k < argc; ++k)
    126     ++k;
    127 #pragma omp parallel for simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    128   for (int k = 0; k < argc; ++k)
    129     ++k;
    130 #pragma omp parallel for simd private() // expected-error {{expected expression}}
    131   for (int k = 0; k < argc; ++k)
    132     ++k;
    133 #pragma omp parallel for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
    134   for (int k = 0; k < argc; ++k)
    135     ++k;
    136 #pragma omp parallel for simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    137   for (int k = 0; k < argc; ++k)
    138     ++k;
    139 #pragma omp parallel for simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
    140   for (int k = 0; k < argc; ++k)
    141     ++k;
    142 #pragma omp parallel for simd private(argc)
    143   for (int k = 0; k < argc; ++k)
    144     ++k;
    145 #pragma omp parallel for simd private(S1) // expected-error {{'S1' does not refer to a value}}
    146   for (int k = 0; k < argc; ++k)
    147     ++k;
    148 #pragma omp parallel for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
    149   for (int k = 0; k < argc; ++k)
    150     ++k;
    151 #pragma omp parallel for simd private(argv[1]) // expected-error {{expected variable name}}
    152   for (int k = 0; k < argc; ++k)
    153     ++k;
    154 #pragma omp parallel for simd private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
    155   for (int k = 0; k < argc; ++k)
    156     ++k;
    157 #pragma omp parallel for simd private(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}
    158   for (int k = 0; k < argc; ++k)
    159     ++k;
    160 #pragma omp parallel for simd nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp parallel for simd'}}
    161   for (int k = 0; k < argc; ++k)
    162     ++k;
    163 #pragma omp parallel
    164   {
    165     int i;
    166 #pragma omp parallel for simd private(i)
    167     for (int k = 0; k < argc; ++k)
    168       ++k;
    169   }
    170 #pragma omp parallel shared(i)
    171 #pragma omp parallel private(i)
    172 #pragma omp parallel for simd private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}}
    173   for (int k = 0; k < argc; ++k)
    174     ++k;
    175 #pragma omp parallel for simd private(i)
    176   for (int k = 0; k < argc; ++k)
    177     ++k;
    178 
    179   return 0;
    180 }
    181 
    182