Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -verify -fopenmp %s
      2 
      3 void foo() {
      4 }
      5 
      6 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} expected-note 1 {{forward declaration of 'S1'}} expected-note {{forward declaration of 'S1'}}
      7 extern S1 a;
      8 class S2 {
      9   mutable int a;
     10 
     11 public:
     12   S2() : a(0) {}
     13   static float S2s; // expected-note {{static data member is predetermined as shared}} expected-note 1 {{static data member is predetermined as shared}}
     14 };
     15 const S2 b;
     16 const S2 ba[5];
     17 class S3 {
     18   int a;
     19 
     20 public:
     21   S3() : a(0) {}
     22 };
     23 const S3 c; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}}
     24 const S3 ca[5]; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}}
     25 extern const int f; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}}
     26 
     27 int threadvar;
     28 #pragma omp threadprivate(threadvar) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}}
     29 
     30 class S4 {
     31   int a;
     32   S4(); // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}}
     33 
     34 public:
     35   S4(int v) : a(v) {}
     36 };
     37 class S5 {
     38   int a;
     39   S5() : a(0) {} // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}}
     40 
     41 public:
     42   S5(int v) : a(v) {}
     43 };
     44 namespace A {
     45 double x;
     46 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}} expected-note 2 {{defined as threadprivate or thread local}}
     47 }
     48 namespace B {
     49 using A::x;
     50 }
     51 
     52 S3 h;
     53 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
     54 
     55 template <class I, class C, class D, class E>
     56 int foomain(I argc, C **argv) {
     57   const I d = 5; // expected-note {{constant variable is predetermined as shared}}
     58   const I da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}}
     59   D e(4);
     60   E g[] = {5, 6};
     61   I i;
     62   I &j = i;
     63 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}}
     64 {}
     65 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     66 {}
     67 #pragma omp target parallel private() // expected-error {{expected expression}}
     68 {}
     69 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
     70 {}
     71 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     72 {}
     73 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
     74 {}
     75 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}}
     76 {}
     77 #pragma omp target parallel private(argc)
     78 {}
     79 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}}
     80 {}
     81 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
     82 {}
     83 #pragma omp target parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}}
     84 {}
     85 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}}
     86 {}
     87 #pragma omp target parallel private(ba)
     88 {}
     89 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}}
     90 {}
     91 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}}
     92 {}
     93 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}}
     94 {}
     95 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
     96 {}
     97   #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}
     98   {}
     99   #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}}
    100   foo();
    101   #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}}
    102   foo();
    103   #pragma omp target parallel private(i)
    104   {}
    105   #pragma omp target parallel private(j)
    106   foo();
    107   #pragma omp parallel firstprivate(i)
    108   for (int k = 0; k < 10; ++k) {
    109     #pragma omp target parallel private(i)
    110     foo();
    111   }
    112   static int m;
    113   #pragma omp target parallel private(m) // OK
    114   foo();
    115 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
    116 {}
    117 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
    118 #pragma omp parallel
    119   {
    120     int v = 0;
    121     int i;
    122   }
    123 #pragma omp target parallel shared(i)
    124 {}
    125 #pragma omp target parallel private(i)
    126 {}
    127 #pragma omp target parallel private(j)
    128 {}
    129 #pragma omp target parallel private(i)
    130 {}
    131   static int si;
    132 #pragma omp target parallel private(si) // OK
    133   {}
    134   return 0;
    135 }
    136 
    137 void bar(S4 a[2]) {
    138 #pragma omp parallel
    139 #pragma omp target parallel private(a)
    140   {}
    141 }
    142 
    143 int main(int argc, char **argv) {
    144   const int d = 5; // expected-note {{constant variable is predetermined as shared}}
    145   const int da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}}
    146   S4 e(4);
    147   S5 g[] = {5, 6};
    148   int i;
    149   int &j = i;
    150 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}}
    151 {}
    152 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    153 {}
    154 #pragma omp target parallel private() // expected-error {{expected expression}}
    155 {}
    156 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
    157 {}
    158 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    159 {}
    160 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
    161 {}
    162 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}}
    163 {}
    164 #pragma omp target parallel private(argc)
    165 {}
    166 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}}
    167 {}
    168 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
    169 {}
    170 #pragma omp target parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}}
    171 {}
    172 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}}
    173 {}
    174 #pragma omp target parallel private(ba)
    175 {}
    176 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}}
    177 {}
    178 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}}
    179 {}
    180 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}}
    181 {}
    182 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
    183 {}
    184   #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}
    185   {}
    186   #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}}
    187   foo();
    188   #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}}
    189   foo();
    190   #pragma omp target parallel private(i)
    191   {}
    192   #pragma omp target parallel private(j)
    193   foo();
    194   #pragma omp parallel firstprivate(i)
    195   for (int k = 0; k < 10; ++k) {
    196     #pragma omp target parallel private(i)
    197     foo();
    198   }
    199   static int m;
    200   #pragma omp target parallel private(m) // OK
    201   foo();
    202 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
    203 {}
    204 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
    205 #pragma omp parallel
    206   {
    207     int i;
    208   }
    209 #pragma omp target parallel shared(i)
    210 {}
    211 #pragma omp target parallel private(i)
    212 {}
    213 #pragma omp target parallel private(j)
    214 {}
    215 #pragma omp target parallel private(i)
    216 {}
    217   static int si;
    218 #pragma omp target parallel private(si) // OK
    219   {}
    220   return foomain<int, char, S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char, S4, S5>' requested here}}
    221 }
    222 
    223