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