1*5bbceadfSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized
2*5bbceadfSAlexey Bataev 
3*5bbceadfSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
4*5bbceadfSAlexey Bataev 
5*5bbceadfSAlexey Bataev typedef void **omp_allocator_handle_t;
6*5bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_default_mem_alloc;
7*5bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_large_cap_mem_alloc;
8*5bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_const_mem_alloc;
9*5bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_high_bw_mem_alloc;
10*5bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_low_lat_mem_alloc;
11*5bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_cgroup_mem_alloc;
12*5bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_pteam_mem_alloc;
13*5bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_thread_mem_alloc;
14*5bbceadfSAlexey Bataev 
15*5bbceadfSAlexey Bataev void foo() {
16*5bbceadfSAlexey Bataev }
17*5bbceadfSAlexey Bataev 
18*5bbceadfSAlexey Bataev bool foobool(int argc) {
19*5bbceadfSAlexey Bataev   return argc;
20*5bbceadfSAlexey Bataev }
21*5bbceadfSAlexey Bataev 
22*5bbceadfSAlexey Bataev struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
23*5bbceadfSAlexey Bataev extern S1 a;
24*5bbceadfSAlexey Bataev class S2 {
25*5bbceadfSAlexey Bataev   mutable int a;
26*5bbceadfSAlexey Bataev 
27*5bbceadfSAlexey Bataev public:
28*5bbceadfSAlexey Bataev   S2() : a(0) {}
29*5bbceadfSAlexey Bataev };
30*5bbceadfSAlexey Bataev const S2 b;
31*5bbceadfSAlexey Bataev const S2 ba[5];
32*5bbceadfSAlexey Bataev class S3 {
33*5bbceadfSAlexey Bataev   int a;
34*5bbceadfSAlexey Bataev 
35*5bbceadfSAlexey Bataev public:
36*5bbceadfSAlexey Bataev   S3() : a(0) {}
37*5bbceadfSAlexey Bataev };
38*5bbceadfSAlexey Bataev const S3 ca[5];
39*5bbceadfSAlexey Bataev class S4 {
40*5bbceadfSAlexey Bataev   int a;
41*5bbceadfSAlexey Bataev   S4(); // expected-note {{implicitly declared private here}}
42*5bbceadfSAlexey Bataev 
43*5bbceadfSAlexey Bataev public:
44*5bbceadfSAlexey Bataev   S4(int v) : a(v) {
45*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a)
46*5bbceadfSAlexey Bataev     for (int k = 0; k < v; ++k)
47*5bbceadfSAlexey Bataev       ++this->a;
48*5bbceadfSAlexey Bataev   }
49*5bbceadfSAlexey Bataev };
50*5bbceadfSAlexey Bataev class S5 {
51*5bbceadfSAlexey Bataev   int a;
52*5bbceadfSAlexey Bataev   S5() : a(0) {} // expected-note {{implicitly declared private here}}
53*5bbceadfSAlexey Bataev 
54*5bbceadfSAlexey Bataev public:
55*5bbceadfSAlexey Bataev   S5(int v) : a(v) {}
56*5bbceadfSAlexey Bataev   S5 &operator=(S5 &s) {
57*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}
58*5bbceadfSAlexey Bataev     for (int k = 0; k < s.a; ++k)
59*5bbceadfSAlexey Bataev       ++s.a;
60*5bbceadfSAlexey Bataev     return *this;
61*5bbceadfSAlexey Bataev   }
62*5bbceadfSAlexey Bataev };
63*5bbceadfSAlexey Bataev 
64*5bbceadfSAlexey Bataev template <typename T>
65*5bbceadfSAlexey Bataev class S6 {
66*5bbceadfSAlexey Bataev public:
67*5bbceadfSAlexey Bataev   T a;
68*5bbceadfSAlexey Bataev 
69*5bbceadfSAlexey Bataev   S6() : a(0) {}
70*5bbceadfSAlexey Bataev   S6(T v) : a(v) {
71*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) allocate(omp_thread_mem_alloc: a) // expected-warning {{allocator with the 'thread' trait access has unspecified behavior on 'parallel master taskloop' directive}}
72*5bbceadfSAlexey Bataev     for (int k = 0; k < v; ++k)
73*5bbceadfSAlexey Bataev       ++this->a;
74*5bbceadfSAlexey Bataev   }
75*5bbceadfSAlexey Bataev   S6 &operator=(S6 &s) {
76*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}
77*5bbceadfSAlexey Bataev     for (int k = 0; k < s.a; ++k)
78*5bbceadfSAlexey Bataev       ++s.a;
79*5bbceadfSAlexey Bataev     return *this;
80*5bbceadfSAlexey Bataev   }
81*5bbceadfSAlexey Bataev };
82*5bbceadfSAlexey Bataev 
83*5bbceadfSAlexey Bataev template <typename T>
84*5bbceadfSAlexey Bataev class S7 : public T {
85*5bbceadfSAlexey Bataev   T a;
86*5bbceadfSAlexey Bataev   S7() : a(0) {}
87*5bbceadfSAlexey Bataev 
88*5bbceadfSAlexey Bataev public:
89*5bbceadfSAlexey Bataev   S7(T v) : a(v) {
90*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) private(T::a)
91*5bbceadfSAlexey Bataev     for (int k = 0; k < a.a; ++k)
92*5bbceadfSAlexey Bataev       ++this->a.a;
93*5bbceadfSAlexey Bataev   }
94*5bbceadfSAlexey Bataev   S7 &operator=(S7 &s) {
95*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) private(s.a) private(s.T::a) // expected-error 2 {{expected variable name or data member of current class}}
96*5bbceadfSAlexey Bataev     for (int k = 0; k < s.a.a; ++k)
97*5bbceadfSAlexey Bataev       ++s.a.a;
98*5bbceadfSAlexey Bataev     return *this;
99*5bbceadfSAlexey Bataev   }
100*5bbceadfSAlexey Bataev };
101*5bbceadfSAlexey Bataev 
102*5bbceadfSAlexey Bataev S3 h;
103*5bbceadfSAlexey Bataev #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
104*5bbceadfSAlexey Bataev 
105*5bbceadfSAlexey Bataev template <class I, class C>
106*5bbceadfSAlexey Bataev int foomain(I argc, C **argv) {
107*5bbceadfSAlexey Bataev   I e(4);
108*5bbceadfSAlexey Bataev   I g(5);
109*5bbceadfSAlexey Bataev   int i, z;
110*5bbceadfSAlexey Bataev   int &j = i;
111*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private // expected-error {{expected '(' after 'private'}}
112*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
113*5bbceadfSAlexey Bataev     ++k;
114*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
115*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
116*5bbceadfSAlexey Bataev     ++k;
117*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private() // expected-error {{expected expression}}
118*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
119*5bbceadfSAlexey Bataev     ++k;
120*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
121*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
122*5bbceadfSAlexey Bataev     ++k;
123*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
124*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
125*5bbceadfSAlexey Bataev     ++k;
126*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
127*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
128*5bbceadfSAlexey Bataev     ++k;
129*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc) allocate , allocate(, allocate(omp_default , allocate(omp_default_mem_alloc, allocate(omp_default_mem_alloc:, allocate(omp_default_mem_alloc: argc, allocate(omp_default_mem_alloc: argv), allocate(argv) // expected-error {{expected '(' after 'allocate'}} expected-error 2 {{expected expression}} expected-error 2 {{expected ')'}} expected-error {{use of undeclared identifier 'omp_default'}} expected-note 2 {{to match this '('}}
130*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
131*5bbceadfSAlexey Bataev     ++k;
132*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(S1) // expected-error {{'S1' does not refer to a value}}
133*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
134*5bbceadfSAlexey Bataev     ++k;
135*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
136*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
137*5bbceadfSAlexey Bataev     ++k;
138*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argv[1]) // expected-error {{expected variable name}}
139*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
140*5bbceadfSAlexey Bataev     ++k;
141*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(e, g, z)
142*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
143*5bbceadfSAlexey Bataev     ++k;
144*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
145*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
146*5bbceadfSAlexey Bataev     ++k;
147*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop shared(i)
148*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
149*5bbceadfSAlexey Bataev     ++k;
150*5bbceadfSAlexey Bataev #pragma omp parallel
151*5bbceadfSAlexey Bataev   {
152*5bbceadfSAlexey Bataev     int v = 0;
153*5bbceadfSAlexey Bataev     int i;
154*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(i)
155*5bbceadfSAlexey Bataev     for (int k = 0; k < argc; ++k) {
156*5bbceadfSAlexey Bataev       i = k;
157*5bbceadfSAlexey Bataev       v += i;
158*5bbceadfSAlexey Bataev     }
159*5bbceadfSAlexey Bataev   }
160*5bbceadfSAlexey Bataev #pragma omp parallel shared(i)
161*5bbceadfSAlexey Bataev #pragma omp parallel private(i)
162*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(j)
163*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
164*5bbceadfSAlexey Bataev     ++k;
165*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(i)
166*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
167*5bbceadfSAlexey Bataev     ++k;
168*5bbceadfSAlexey Bataev   return 0;
169*5bbceadfSAlexey Bataev }
170*5bbceadfSAlexey Bataev 
171*5bbceadfSAlexey Bataev void bar(S4 a[2]) {
172*5bbceadfSAlexey Bataev #pragma omp parallel
173*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a)
174*5bbceadfSAlexey Bataev   for (int i = 0; i < 2; ++i)
175*5bbceadfSAlexey Bataev     foo();
176*5bbceadfSAlexey Bataev }
177*5bbceadfSAlexey Bataev 
178*5bbceadfSAlexey Bataev namespace A {
179*5bbceadfSAlexey Bataev double x;
180*5bbceadfSAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
181*5bbceadfSAlexey Bataev }
182*5bbceadfSAlexey Bataev namespace B {
183*5bbceadfSAlexey Bataev using A::x;
184*5bbceadfSAlexey Bataev }
185*5bbceadfSAlexey Bataev 
186*5bbceadfSAlexey Bataev int main(int argc, char **argv) {
187*5bbceadfSAlexey Bataev   S4 e(4);
188*5bbceadfSAlexey Bataev   S5 g(5);
189*5bbceadfSAlexey Bataev   S6<float> s6(0.0) , s6_0(1.0); // expected-note {{in instantiation of member function 'S6<float>::S6' requested here}}
190*5bbceadfSAlexey Bataev   S7<S6<float> > s7(0.0) , s7_0(1.0);
191*5bbceadfSAlexey Bataev   int i, z;
192*5bbceadfSAlexey Bataev   int &j = i;
193*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private // expected-error {{expected '(' after 'private'}}
194*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
195*5bbceadfSAlexey Bataev     ++k;
196*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
197*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
198*5bbceadfSAlexey Bataev     ++k;
199*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private() // expected-error {{expected expression}}
200*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
201*5bbceadfSAlexey Bataev     ++k;
202*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
203*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
204*5bbceadfSAlexey Bataev     ++k;
205*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
206*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
207*5bbceadfSAlexey Bataev     ++k;
208*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
209*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
210*5bbceadfSAlexey Bataev     ++k;
211*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc)
212*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
213*5bbceadfSAlexey Bataev     ++k;
214*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(S1) // expected-error {{'S1' does not refer to a value}}
215*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
216*5bbceadfSAlexey Bataev     ++k;
217*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
218*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
219*5bbceadfSAlexey Bataev     ++k;
220*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argv[1]) // expected-error {{expected variable name}}
221*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
222*5bbceadfSAlexey Bataev     ++k;
223*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
224*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
225*5bbceadfSAlexey Bataev     ++k;
226*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
227*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
228*5bbceadfSAlexey Bataev     ++k;
229*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
230*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
231*5bbceadfSAlexey Bataev     ++k;
232*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop shared(i)
233*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
234*5bbceadfSAlexey Bataev     ++k;
235*5bbceadfSAlexey Bataev #pragma omp parallel
236*5bbceadfSAlexey Bataev   {
237*5bbceadfSAlexey Bataev     int i;
238*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(i)
239*5bbceadfSAlexey Bataev     for (int k = 0; k < argc; ++k)
240*5bbceadfSAlexey Bataev       ++k;
241*5bbceadfSAlexey Bataev   }
242*5bbceadfSAlexey Bataev #pragma omp parallel shared(i)
243*5bbceadfSAlexey Bataev #pragma omp parallel private(i)
244*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(j)
245*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
246*5bbceadfSAlexey Bataev     ++k;
247*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(i, z)
248*5bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
249*5bbceadfSAlexey Bataev     ++k;
250*5bbceadfSAlexey Bataev   static int si;
251*5bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(si) // OK
252*5bbceadfSAlexey Bataev   for(int k = 0; k < argc; ++k)
253*5bbceadfSAlexey Bataev     si = k + 1;
254*5bbceadfSAlexey Bataev 
255*5bbceadfSAlexey Bataev   s6 = s6_0; // expected-note {{in instantiation of member function 'S6<float>::operator=' requested here}}
256*5bbceadfSAlexey Bataev   s7 = s7_0; // expected-note {{in instantiation of member function 'S7<S6<float> >::operator=' requested here}}
257*5bbceadfSAlexey Bataev   return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}
258*5bbceadfSAlexey Bataev }
259*5bbceadfSAlexey Bataev 
260