1a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized
2e4e893bbSAlexander Musman
3a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
4a8a9153aSAlexey Bataev
5e04483eeSAlexey Bataev extern int omp_default_mem_alloc;
foo()6e4e893bbSAlexander Musman void foo() {
7e4e893bbSAlexander Musman }
8e4e893bbSAlexander Musman
foobool(int argc)9e4e893bbSAlexander Musman bool foobool(int argc) {
10e4e893bbSAlexander Musman return argc;
11e4e893bbSAlexander Musman }
12e4e893bbSAlexander Musman
xxx(int argc)13*25569296SAlexey Bataev void xxx(int argc) {
14*25569296SAlexey Bataev int fp; // expected-note {{initialize the variable 'fp' to silence this warning}}
15*25569296SAlexey Bataev #pragma omp parallel for simd firstprivate(fp) // expected-warning {{variable 'fp' is uninitialized when used here}}
16*25569296SAlexey Bataev for (int i = 0; i < 10; ++i)
17*25569296SAlexey Bataev ;
18*25569296SAlexey Bataev }
19*25569296SAlexey Bataev
20e4e893bbSAlexander Musman struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
21e4e893bbSAlexander Musman extern S1 a;
22e4e893bbSAlexander Musman class S2 {
23e4e893bbSAlexander Musman mutable int a;
24e4e893bbSAlexander Musman
25e4e893bbSAlexander Musman public:
S2()26e4e893bbSAlexander Musman S2() : a(0) {}
S2(const S2 & s2)274a5bb772SAlexey Bataev S2(const S2 &s2) : a(s2.a) {}
28e4e893bbSAlexander Musman static float S2s;
29e4e893bbSAlexander Musman static const float S2sc;
30e4e893bbSAlexander Musman };
31e4e893bbSAlexander Musman const float S2::S2sc = 0;
32e4e893bbSAlexander Musman const S2 b;
33e4e893bbSAlexander Musman const S2 ba[5];
34e4e893bbSAlexander Musman class S3 {
35e4e893bbSAlexander Musman int a;
36e4e893bbSAlexander Musman S3 &operator=(const S3 &s3);
37e4e893bbSAlexander Musman
38e4e893bbSAlexander Musman public:
S3()39e4e893bbSAlexander Musman S3() : a(0) {}
S3(const S3 & s3)404a5bb772SAlexey Bataev S3(const S3 &s3) : a(s3.a) {}
41e4e893bbSAlexander Musman };
42e4e893bbSAlexander Musman const S3 c;
43e4e893bbSAlexander Musman const S3 ca[5];
44e4e893bbSAlexander Musman extern const int f;
454a5bb772SAlexey Bataev class S4 {
46e4e893bbSAlexander Musman int a;
47e4e893bbSAlexander Musman S4();
484a5bb772SAlexey Bataev S4(const S4 &s4); // expected-note 2 {{implicitly declared private here}}
49e4e893bbSAlexander Musman
50e4e893bbSAlexander Musman public:
S4(int v)51e4e893bbSAlexander Musman S4(int v) : a(v) {}
52e4e893bbSAlexander Musman };
534a5bb772SAlexey Bataev class S5 {
54e4e893bbSAlexander Musman int a;
S5(const S5 & s5)554a5bb772SAlexey Bataev S5(const S5 &s5) : a(s5.a) {} // expected-note 4 {{implicitly declared private here}}
56e4e893bbSAlexander Musman
57e4e893bbSAlexander Musman public:
S5()58e4e893bbSAlexander Musman S5() : a(0) {}
S5(int v)59e4e893bbSAlexander Musman S5(int v) : a(v) {}
60e4e893bbSAlexander Musman };
61e4e893bbSAlexander Musman class S6 {
62e4e893bbSAlexander Musman int a;
S6()63e4e893bbSAlexander Musman S6() : a(0) {}
64e4e893bbSAlexander Musman
65e4e893bbSAlexander Musman public:
S6(const S6 & s6)66e4e893bbSAlexander Musman S6(const S6 &s6) : a(s6.a) {}
S6(int v)67e4e893bbSAlexander Musman S6(int v) : a(v) {}
68e4e893bbSAlexander Musman };
69e4e893bbSAlexander Musman
70e4e893bbSAlexander Musman S3 h;
71e4e893bbSAlexander Musman #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
72e4e893bbSAlexander Musman
73e4e893bbSAlexander Musman template <class I, class C>
foomain(int argc,char ** argv)74e4e893bbSAlexander Musman int foomain(int argc, char **argv) {
754a5bb772SAlexey Bataev I e(4);
764a5bb772SAlexey Bataev C g(5);
77a914888bSAlexey Bataev int i, z;
78bd9fec1eSAlexey Bataev int &j = i;
79e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}}
80e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
81e4e893bbSAlexander Musman ++k;
82e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
83e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
84e4e893bbSAlexander Musman ++k;
85e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate() // expected-error {{expected expression}}
86e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
87e4e893bbSAlexander Musman ++k;
88e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
89e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
90e4e893bbSAlexander Musman ++k;
91c5970623SAlexey Bataev #pragma omp parallel for simd firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
92e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
93e4e893bbSAlexander Musman ++k;
94e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
95e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
96e4e893bbSAlexander Musman ++k;
97e04483eeSAlexey Bataev #pragma omp parallel for simd firstprivate(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 '('}}
98e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
99e4e893bbSAlexander Musman ++k;
100e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
101e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
102e4e893bbSAlexander Musman ++k;
103e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(a, b) // expected-error {{firstprivate variable with incomplete type 'S1'}}
104e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
105e4e893bbSAlexander Musman ++k;
106e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(argv[1]) // expected-error {{expected variable name}}
107e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
108e4e893bbSAlexander Musman ++k;
1094a5bb772SAlexey Bataev #pragma omp parallel for simd firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
110e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
111e4e893bbSAlexander Musman ++k;
112a914888bSAlexey Bataev #pragma omp parallel for simd firstprivate(h, z) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
113e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
114e4e893bbSAlexander Musman ++k;
115e4e893bbSAlexander Musman #pragma omp parallel for simd linear(i)
116e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
117e4e893bbSAlexander Musman ++k;
118e4e893bbSAlexander Musman {
119e4e893bbSAlexander Musman int v = 0;
120e4e893bbSAlexander Musman int i;
121e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(i)
122e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k) {
123e4e893bbSAlexander Musman i = k;
124e4e893bbSAlexander Musman v += i;
125e4e893bbSAlexander Musman }
126e4e893bbSAlexander Musman }
127e4e893bbSAlexander Musman #pragma omp parallel shared(i)
128e4e893bbSAlexander Musman #pragma omp parallel private(i)
129bd9fec1eSAlexey Bataev #pragma omp parallel for simd firstprivate(j)
130e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
131e4e893bbSAlexander Musman ++k;
132e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(i)
133e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k)
134e4e893bbSAlexander Musman ++k;
1354a5bb772SAlexey Bataev #pragma omp parallel for simd lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
136e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
137e4e893bbSAlexander Musman foo();
138e4e893bbSAlexander Musman #pragma omp parallel private(i)
13905be1da2SAlexey Bataev #pragma omp parallel for simd firstprivate(i) // expected-note 2 {{defined as firstprivate}}
14005be1da2SAlexey Bataev for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be firstprivate, predetermined as linear}}
141e4e893bbSAlexander Musman foo();
142e4e893bbSAlexander Musman #pragma omp parallel reduction(+ : i)
14305be1da2SAlexey Bataev #pragma omp parallel for simd firstprivate(i) // expected-note 2 {{defined as firstprivate}}
14405be1da2SAlexey Bataev for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be firstprivate, predetermined as linear}}
145e4e893bbSAlexander Musman foo();
146e4e893bbSAlexander Musman return 0;
147e4e893bbSAlexander Musman }
148e4e893bbSAlexander Musman
1496ddfe1a6SAlexey Bataev namespace A {
1506ddfe1a6SAlexey Bataev double x;
1516ddfe1a6SAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
1526ddfe1a6SAlexey Bataev }
1536ddfe1a6SAlexey Bataev namespace B {
1546ddfe1a6SAlexey Bataev using A::x;
1556ddfe1a6SAlexey Bataev }
1566ddfe1a6SAlexey Bataev
main(int argc,char ** argv)157e4e893bbSAlexander Musman int main(int argc, char **argv) {
158e4e893bbSAlexander Musman const int d = 5;
159e4e893bbSAlexander Musman const int da[5] = {0};
1604a5bb772SAlexey Bataev S4 e(4);
1614a5bb772SAlexey Bataev S5 g(5);
162e4e893bbSAlexander Musman S3 m;
163e4e893bbSAlexander Musman S6 n(2);
164a914888bSAlexey Bataev int i, z;
165bd9fec1eSAlexey Bataev int &j = i;
166e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}}
167e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
168e4e893bbSAlexander Musman foo();
169e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
170e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
171e4e893bbSAlexander Musman foo();
172e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate() // expected-error {{expected expression}}
173e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
174e4e893bbSAlexander Musman foo();
175e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
176e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
177e4e893bbSAlexander Musman foo();
178c5970623SAlexey Bataev #pragma omp parallel for simd firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
179e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
180e4e893bbSAlexander Musman foo();
181e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
182e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
183e4e893bbSAlexander Musman foo();
184a914888bSAlexey Bataev #pragma omp parallel for simd firstprivate(argc, z)
185e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
186e4e893bbSAlexander Musman foo();
187e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
188e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
189e4e893bbSAlexander Musman foo();
190e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
191e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
192e4e893bbSAlexander Musman foo();
193e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(argv[1]) // expected-error {{expected variable name}}
194e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
195e4e893bbSAlexander Musman foo();
196e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(2 * 2) // expected-error {{expected variable name}}
197e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
198e4e893bbSAlexander Musman foo();
199e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(ba) // OK
200e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
201e4e893bbSAlexander Musman foo();
202e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(ca) // OK
203e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
204e4e893bbSAlexander Musman foo();
205e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(da) // OK
206e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
207e4e893bbSAlexander Musman foo();
208e4e893bbSAlexander Musman int xa;
209e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(xa) // OK
210e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
211e4e893bbSAlexander Musman foo();
212e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(S2::S2s) // OK
213e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
214e4e893bbSAlexander Musman foo();
215e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(S2::S2sc) // OK
216e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
217e4e893bbSAlexander Musman foo();
218e4e893bbSAlexander Musman #pragma omp parallel for simd safelen(5)
219e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
220e4e893bbSAlexander Musman foo();
2214a5bb772SAlexey Bataev #pragma omp parallel for simd firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
222e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
223e4e893bbSAlexander Musman foo();
224e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(m) // OK
225e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
226e4e893bbSAlexander Musman foo();
2276ddfe1a6SAlexey Bataev #pragma omp parallel for simd firstprivate(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be firstprivate}}
228e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
229e4e893bbSAlexander Musman foo();
230e4e893bbSAlexander Musman #pragma omp parallel for simd private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}}
231e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
232e4e893bbSAlexander Musman foo();
233e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(i) // expected-note {{defined as firstprivate}}
234e4e893bbSAlexander Musman for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be firstprivate, predetermined as linear}}
235e4e893bbSAlexander Musman foo();
236e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(xa) // OK: may be firstprivate
237e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
238e4e893bbSAlexander Musman foo();
239bd9fec1eSAlexey Bataev #pragma omp parallel for simd firstprivate(j)
240e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
241e4e893bbSAlexander Musman foo();
2424a5bb772SAlexey Bataev #pragma omp parallel for simd lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
243e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
244e4e893bbSAlexander Musman foo();
245e4e893bbSAlexander Musman #pragma omp parallel for simd lastprivate(n) firstprivate(n) // OK
246e4e893bbSAlexander Musman for (i = 0; i < argc; ++i)
247e4e893bbSAlexander Musman foo();
248e4e893bbSAlexander Musman #pragma omp parallel
249e4e893bbSAlexander Musman {
250e4e893bbSAlexander Musman int v = 0;
251e4e893bbSAlexander Musman int i;
252e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(i)
253e4e893bbSAlexander Musman for (int k = 0; k < argc; ++k) {
254e4e893bbSAlexander Musman i = k;
255e4e893bbSAlexander Musman v += i;
256e4e893bbSAlexander Musman }
257e4e893bbSAlexander Musman }
258e4e893bbSAlexander Musman #pragma omp parallel private(i)
259e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(i) // expected-note {{defined as firstprivate}}
260e4e893bbSAlexander Musman for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be firstprivate, predetermined as linear}}
261e4e893bbSAlexander Musman foo();
262e4e893bbSAlexander Musman #pragma omp parallel reduction(+ : i)
263e4e893bbSAlexander Musman #pragma omp parallel for simd firstprivate(i) // expected-note {{defined as firstprivate}}
264e4e893bbSAlexander Musman for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be firstprivate, predetermined as linear}}
265e4e893bbSAlexander Musman foo();
2664eea8c6bSKelvin Li static int si;
2674eea8c6bSKelvin Li #pragma omp parallel for simd firstprivate(si) // OK
2684eea8c6bSKelvin Li for (i = 0; i < argc; ++i)
2694eea8c6bSKelvin Li si = i + 2;
270e4e893bbSAlexander Musman
271e4e893bbSAlexander Musman return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
272e4e893bbSAlexander Musman }
273