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