1*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
284d0b3efSAlexey Bataev 
3*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
4a8a9153aSAlexey Bataev 
foo()584d0b3efSAlexey Bataev void foo() {
684d0b3efSAlexey Bataev }
784d0b3efSAlexey Bataev 
foobool(int argc)884d0b3efSAlexey Bataev bool foobool(int argc) {
984d0b3efSAlexey Bataev   return argc;
1084d0b3efSAlexey Bataev }
1184d0b3efSAlexey Bataev 
1284d0b3efSAlexey Bataev struct S1; // expected-note {{declared here}}
1384d0b3efSAlexey Bataev class S2 {
1484d0b3efSAlexey Bataev   mutable int a;
1584d0b3efSAlexey Bataev 
1684d0b3efSAlexey Bataev public:
S2()1784d0b3efSAlexey Bataev   S2() : a(0) {}
operator =(S2 & s2)1884d0b3efSAlexey Bataev   S2 &operator=(S2 &s2) { return *this; }
1984d0b3efSAlexey Bataev };
2084d0b3efSAlexey Bataev class S3 {
2184d0b3efSAlexey Bataev   int a;
2284d0b3efSAlexey Bataev 
2384d0b3efSAlexey Bataev public:
S3()2484d0b3efSAlexey Bataev   S3() : a(0) {}
operator =(S3 & s3)2584d0b3efSAlexey Bataev   S3 &operator=(S3 &s3) { return *this; }
2684d0b3efSAlexey Bataev };
27f56f98c9SAlexey Bataev class S4 {
2884d0b3efSAlexey Bataev   int a;
2984d0b3efSAlexey Bataev   S4();
30f56f98c9SAlexey Bataev   S4 &operator=(const S4 &s4); // expected-note {{implicitly declared private here}}
3184d0b3efSAlexey Bataev 
3284d0b3efSAlexey Bataev public:
S4(int v)3384d0b3efSAlexey Bataev   S4(int v) : a(v) {}
3484d0b3efSAlexey Bataev };
35f56f98c9SAlexey Bataev class S5 {
3684d0b3efSAlexey Bataev   int a;
S5()3784d0b3efSAlexey Bataev   S5() : a(0) {}
operator =(const S5 & s5)38f56f98c9SAlexey Bataev   S5 &operator=(const S5 &s5) { return *this; } // expected-note {{implicitly declared private here}}
3984d0b3efSAlexey Bataev 
4084d0b3efSAlexey Bataev public:
S5(int v)4184d0b3efSAlexey Bataev   S5(int v) : a(v) {}
4284d0b3efSAlexey Bataev };
4384d0b3efSAlexey Bataev template <class T>
4484d0b3efSAlexey Bataev class ST {
4584d0b3efSAlexey Bataev public:
4684d0b3efSAlexey Bataev   static T s;
4784d0b3efSAlexey Bataev };
4884d0b3efSAlexey Bataev 
4984d0b3efSAlexey Bataev S2 k;
5084d0b3efSAlexey Bataev S3 h;
51f56f98c9SAlexey Bataev S4 l(3);
52f56f98c9SAlexey Bataev S5 m(4);
5384d0b3efSAlexey Bataev #pragma omp threadprivate(h, k, l, m)
5484d0b3efSAlexey Bataev 
556ddfe1a6SAlexey Bataev namespace A {
566ddfe1a6SAlexey Bataev double x;
576ddfe1a6SAlexey Bataev #pragma omp threadprivate(x)
586ddfe1a6SAlexey Bataev }
596ddfe1a6SAlexey Bataev namespace B {
606ddfe1a6SAlexey Bataev using A::x;
616ddfe1a6SAlexey Bataev }
626ddfe1a6SAlexey Bataev 
main(int argc,char ** argv)6384d0b3efSAlexey Bataev int main(int argc, char **argv) {
6484d0b3efSAlexey Bataev   int i;
6584d0b3efSAlexey Bataev #pragma omp parallel sections copyin // expected-error {{expected '(' after 'copyin'}}
6684d0b3efSAlexey Bataev   {
6784d0b3efSAlexey Bataev     foo();
6884d0b3efSAlexey Bataev   }
6984d0b3efSAlexey Bataev #pragma omp parallel sections copyin( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
7084d0b3efSAlexey Bataev   {
7184d0b3efSAlexey Bataev     foo();
7284d0b3efSAlexey Bataev   }
7384d0b3efSAlexey Bataev #pragma omp parallel sections copyin() // expected-error {{expected expression}}
7484d0b3efSAlexey Bataev   {
7584d0b3efSAlexey Bataev     foo();
7684d0b3efSAlexey Bataev   }
7784d0b3efSAlexey Bataev #pragma omp parallel sections copyin(k // expected-error {{expected ')'}} expected-note {{to match this '('}}
7884d0b3efSAlexey Bataev   {
7984d0b3efSAlexey Bataev     foo();
8084d0b3efSAlexey Bataev   }
81c5970623SAlexey Bataev #pragma omp parallel sections copyin(h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
8284d0b3efSAlexey Bataev   {
8384d0b3efSAlexey Bataev     foo();
8484d0b3efSAlexey Bataev   }
8584d0b3efSAlexey Bataev #pragma omp parallel sections copyin(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
8684d0b3efSAlexey Bataev   {
8784d0b3efSAlexey Bataev     foo();
8884d0b3efSAlexey Bataev   }
89f56f98c9SAlexey Bataev #pragma omp parallel sections copyin(l) // expected-error {{'operator=' is a private member of 'S4'}}
9084d0b3efSAlexey Bataev   {
9184d0b3efSAlexey Bataev     foo();
9284d0b3efSAlexey Bataev   }
9384d0b3efSAlexey Bataev #pragma omp parallel sections copyin(S1) // expected-error {{'S1' does not refer to a value}}
9484d0b3efSAlexey Bataev   {
9584d0b3efSAlexey Bataev     foo();
9684d0b3efSAlexey Bataev   }
9784d0b3efSAlexey Bataev #pragma omp parallel sections copyin(argv[1]) // expected-error {{expected variable name}}
9884d0b3efSAlexey Bataev   {
9984d0b3efSAlexey Bataev     foo();
10084d0b3efSAlexey Bataev   }
10184d0b3efSAlexey Bataev #pragma omp parallel sections copyin(i) // expected-error {{copyin variable must be threadprivate}}
10284d0b3efSAlexey Bataev   {
10384d0b3efSAlexey Bataev     foo();
10484d0b3efSAlexey Bataev   }
105f56f98c9SAlexey Bataev #pragma omp parallel sections copyin(m) // expected-error {{'operator=' is a private member of 'S5'}}
10684d0b3efSAlexey Bataev   {
10784d0b3efSAlexey Bataev     foo();
10884d0b3efSAlexey Bataev   }
1096ddfe1a6SAlexey Bataev #pragma omp parallel sections copyin(ST < int > ::s, B::x) // expected-error {{copyin variable must be threadprivate}}
11084d0b3efSAlexey Bataev   {
11184d0b3efSAlexey Bataev     foo();
11284d0b3efSAlexey Bataev   }
11384d0b3efSAlexey Bataev 
11484d0b3efSAlexey Bataev   return 0;
11584d0b3efSAlexey Bataev }
116