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