1*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized
2758e55eeSAlexey Bataev 
3*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized
4a8a9153aSAlexey Bataev 
foo()5758e55eeSAlexey Bataev void foo() {
6758e55eeSAlexey Bataev }
7758e55eeSAlexey Bataev 
foobool(int argc)8758e55eeSAlexey Bataev bool foobool(int argc) {
9758e55eeSAlexey Bataev   return argc;
10758e55eeSAlexey Bataev }
11758e55eeSAlexey Bataev 
12758e55eeSAlexey Bataev struct S1; // expected-note {{declared here}}
13758e55eeSAlexey Bataev extern S1 a;
14758e55eeSAlexey Bataev class S2 {
15758e55eeSAlexey Bataev   mutable int a;
16758e55eeSAlexey Bataev public:
S2()17758e55eeSAlexey Bataev   S2():a(0) { }
S2(S2 & s2)18758e55eeSAlexey Bataev   S2(S2 &s2):a(s2.a) { }
19758e55eeSAlexey Bataev };
20758e55eeSAlexey Bataev const S2 b;
21758e55eeSAlexey Bataev const S2 ba[5];
22758e55eeSAlexey Bataev class S3 {
23758e55eeSAlexey Bataev   int a;
24758e55eeSAlexey Bataev public:
S3()25758e55eeSAlexey Bataev   S3():a(0) { }
S3(S3 & s3)26758e55eeSAlexey Bataev   S3(S3 &s3):a(s3.a) { }
27758e55eeSAlexey Bataev };
28758e55eeSAlexey Bataev const S3 c;
29758e55eeSAlexey Bataev const S3 ca[5];
30758e55eeSAlexey Bataev extern const int f;
31758e55eeSAlexey Bataev class S4 {
32758e55eeSAlexey Bataev   int a;
33758e55eeSAlexey Bataev   S4();
34758e55eeSAlexey Bataev   S4(const S4 &s4);
35758e55eeSAlexey Bataev public:
S4(int v)36758e55eeSAlexey Bataev   S4(int v):a(v) { }
37758e55eeSAlexey Bataev };
38758e55eeSAlexey Bataev class S5 {
39758e55eeSAlexey Bataev   int a;
S5()40758e55eeSAlexey Bataev   S5():a(0) {}
S5(const S5 & s5)41758e55eeSAlexey Bataev   S5(const S5 &s5):a(s5.a) { }
42758e55eeSAlexey Bataev public:
S5(int v)43758e55eeSAlexey Bataev   S5(int v):a(v) { }
44758e55eeSAlexey Bataev };
45758e55eeSAlexey Bataev 
46758e55eeSAlexey Bataev S3 h;
47758e55eeSAlexey Bataev #pragma omp threadprivate(h) // expected-note {{defined as threadprivate or thread local}}
48758e55eeSAlexey Bataev 
496ddfe1a6SAlexey Bataev namespace A {
506ddfe1a6SAlexey Bataev double x;
516ddfe1a6SAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
526ddfe1a6SAlexey Bataev }
536ddfe1a6SAlexey Bataev namespace B {
546ddfe1a6SAlexey Bataev using A::x;
556ddfe1a6SAlexey Bataev }
566ddfe1a6SAlexey Bataev 
main(int argc,char ** argv)57758e55eeSAlexey Bataev int main(int argc, char **argv) {
58758e55eeSAlexey Bataev   const int d = 5;
59758e55eeSAlexey Bataev   const int da[5] = { 0 };
60758e55eeSAlexey Bataev   S4 e(4);
61758e55eeSAlexey Bataev   S5 g(5);
62*a914888bSAlexey Bataev   int i, k;
63758e55eeSAlexey Bataev   int &j = i;
64758e55eeSAlexey Bataev   #pragma omp parallel shared // expected-error {{expected '(' after 'shared'}}
65758e55eeSAlexey Bataev   #pragma omp parallel shared ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
66758e55eeSAlexey Bataev   #pragma omp parallel shared () // expected-error {{expected expression}}
67758e55eeSAlexey Bataev   #pragma omp parallel shared (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
68c5970623SAlexey Bataev   #pragma omp parallel shared (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
69758e55eeSAlexey Bataev   #pragma omp parallel shared (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
70758e55eeSAlexey Bataev   #pragma omp parallel shared (argc)
71758e55eeSAlexey Bataev   #pragma omp parallel shared (S1) // expected-error {{'S1' does not refer to a value}}
72*a914888bSAlexey Bataev   #pragma omp parallel shared (a, b, c, d, f, k)
73758e55eeSAlexey Bataev   #pragma omp parallel shared (argv[1]) // expected-error {{expected variable name}}
74758e55eeSAlexey Bataev   #pragma omp parallel shared(ba)
75758e55eeSAlexey Bataev   #pragma omp parallel shared(ca)
76758e55eeSAlexey Bataev   #pragma omp parallel shared(da)
77758e55eeSAlexey Bataev   #pragma omp parallel shared(e, g)
786ddfe1a6SAlexey Bataev   #pragma omp parallel shared(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be shared}}
79758e55eeSAlexey Bataev   #pragma omp parallel private(i), shared(i) // expected-error {{private variable cannot be shared}} expected-note {{defined as private}}
80758e55eeSAlexey Bataev   foo();
81d5af8e47SAlexey Bataev   #pragma omp parallel firstprivate(i), shared(i) // expected-error {{firstprivate variable cannot be shared}} expected-note {{defined as firstprivate}}
82d5af8e47SAlexey Bataev   foo();
83758e55eeSAlexey Bataev   #pragma omp parallel private(i)
84758e55eeSAlexey Bataev   #pragma omp parallel shared(i)
85758e55eeSAlexey Bataev   #pragma omp parallel shared(j)
86758e55eeSAlexey Bataev   foo();
87d5af8e47SAlexey Bataev   #pragma omp parallel firstprivate(i)
88d5af8e47SAlexey Bataev   #pragma omp parallel shared(i)
89d5af8e47SAlexey Bataev   #pragma omp parallel shared(j)
90d5af8e47SAlexey Bataev   foo();
91758e55eeSAlexey Bataev 
92758e55eeSAlexey Bataev   return 0;
93758e55eeSAlexey Bataev }
94