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