1*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized
2f82886e5SAlexander Musman 
3*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
4a8a9153aSAlexey Bataev 
5e04483eeSAlexey Bataev extern int omp_default_mem_alloc;
foo()6f82886e5SAlexander Musman void foo() {
7f82886e5SAlexander Musman }
8f82886e5SAlexander Musman 
foobool(int argc)9f82886e5SAlexander Musman bool foobool(int argc) {
10f82886e5SAlexander Musman   return argc;
11f82886e5SAlexander Musman }
12f82886e5SAlexander Musman 
13f82886e5SAlexander Musman struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
14f82886e5SAlexander Musman extern S1 a;
15f82886e5SAlexander Musman class S2 {
16f82886e5SAlexander Musman   mutable int a;
17f82886e5SAlexander Musman 
18f82886e5SAlexander Musman public:
S2()19f82886e5SAlexander Musman   S2() : a(0) {}
S2(const S2 & s2)204a5bb772SAlexey Bataev   S2(const S2 &s2) : a(s2.a) {}
21f82886e5SAlexander Musman   static float S2s;
22f82886e5SAlexander Musman   static const float S2sc;
23f82886e5SAlexander Musman };
24f82886e5SAlexander Musman const float S2::S2sc = 0;
25f82886e5SAlexander Musman const S2 b;
26f82886e5SAlexander Musman const S2 ba[5];
27f82886e5SAlexander Musman class S3 {
28f82886e5SAlexander Musman   int a;
29f82886e5SAlexander Musman   S3 &operator=(const S3 &s3);
30f82886e5SAlexander Musman 
31f82886e5SAlexander Musman public:
S3()32f82886e5SAlexander Musman   S3() : a(0) {}
S3(const S3 & s3)334a5bb772SAlexey Bataev   S3(const S3 &s3) : a(s3.a) {}
34f82886e5SAlexander Musman };
35f82886e5SAlexander Musman const S3 c;
36f82886e5SAlexander Musman const S3 ca[5];
37f82886e5SAlexander Musman extern const int f;
384a5bb772SAlexey Bataev class S4 {
39f82886e5SAlexander Musman   int a;
40f82886e5SAlexander Musman   S4();
414a5bb772SAlexey Bataev   S4(const S4 &s4); // expected-note 2 {{implicitly declared private here}}
42f82886e5SAlexander Musman 
43f82886e5SAlexander Musman public:
S4(int v)44f82886e5SAlexander Musman   S4(int v) : a(v) {}
45f82886e5SAlexander Musman };
464a5bb772SAlexey Bataev class S5 {
47f82886e5SAlexander Musman   int a;
S5(const S5 & s5)484a5bb772SAlexey Bataev   S5(const S5 &s5) : a(s5.a) {} // expected-note 4 {{implicitly declared private here}}
49f82886e5SAlexander Musman 
50f82886e5SAlexander Musman public:
S5()51f82886e5SAlexander Musman   S5() : a(0) {}
S5(int v)52f82886e5SAlexander Musman   S5(int v) : a(v) {}
53f82886e5SAlexander Musman };
54f82886e5SAlexander Musman class S6 {
55f82886e5SAlexander Musman   int a;
S6()56f82886e5SAlexander Musman   S6() : a(0) {}
57f82886e5SAlexander Musman 
58f82886e5SAlexander Musman public:
S6(const S6 & s6)59f82886e5SAlexander Musman   S6(const S6 &s6) : a(s6.a) {}
S6(int v)60f82886e5SAlexander Musman   S6(int v) : a(v) {}
61f82886e5SAlexander Musman };
62f82886e5SAlexander Musman 
63f82886e5SAlexander Musman S3 h;
64f82886e5SAlexander Musman #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
65f82886e5SAlexander Musman 
66f82886e5SAlexander Musman template <class I, class C>
foomain(int argc,char ** argv)67f82886e5SAlexander Musman int foomain(int argc, char **argv) {
684a5bb772SAlexey Bataev   I e(4);
694a5bb772SAlexey Bataev   C g(5);
70f82886e5SAlexander Musman   int i;
71bd9fec1eSAlexey Bataev   int &j = i;
72f82886e5SAlexander Musman #pragma omp parallel
73f82886e5SAlexander Musman #pragma omp for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}}
74f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
75f82886e5SAlexander Musman     ++k;
76f82886e5SAlexander Musman #pragma omp parallel
77f82886e5SAlexander Musman #pragma omp for simd firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
78f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
79f82886e5SAlexander Musman     ++k;
80f82886e5SAlexander Musman #pragma omp parallel
81f82886e5SAlexander Musman #pragma omp for simd firstprivate() // expected-error {{expected expression}}
82f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
83f82886e5SAlexander Musman     ++k;
84f82886e5SAlexander Musman #pragma omp parallel
85f82886e5SAlexander Musman #pragma omp for simd firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
86f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
87f82886e5SAlexander Musman     ++k;
88f82886e5SAlexander Musman #pragma omp parallel
89c5970623SAlexey Bataev #pragma omp for simd firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
90f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
91f82886e5SAlexander Musman     ++k;
92f82886e5SAlexander Musman #pragma omp parallel
93f82886e5SAlexander Musman #pragma omp for simd firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
94f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
95f82886e5SAlexander Musman     ++k;
96f82886e5SAlexander Musman #pragma omp parallel
97e04483eeSAlexey Bataev #pragma omp 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 '('}}
98f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
99f82886e5SAlexander Musman     ++k;
100f82886e5SAlexander Musman #pragma omp parallel
101f82886e5SAlexander Musman #pragma omp for simd firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
102f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
103f82886e5SAlexander Musman     ++k;
104f82886e5SAlexander Musman #pragma omp parallel
1054a5bb772SAlexey Bataev #pragma omp for simd firstprivate(a, b) // expected-error {{a firstprivate variable with incomplete type 'S1'}}
106f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
107f82886e5SAlexander Musman     ++k;
108f82886e5SAlexander Musman #pragma omp parallel
109f82886e5SAlexander Musman #pragma omp for simd firstprivate(argv[1]) // expected-error {{expected variable name}}
110f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
111f82886e5SAlexander Musman     ++k;
112f82886e5SAlexander Musman #pragma omp parallel
1134a5bb772SAlexey Bataev #pragma omp for simd firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
114f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
115f82886e5SAlexander Musman     ++k;
116f82886e5SAlexander Musman #pragma omp parallel
117f82886e5SAlexander Musman #pragma omp for simd firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
118f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
119f82886e5SAlexander Musman     ++k;
120f82886e5SAlexander Musman #pragma omp parallel
121f82886e5SAlexander Musman #pragma omp for simd linear(i)
122f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
123f82886e5SAlexander Musman     ++k;
124f82886e5SAlexander Musman #pragma omp parallel
125f82886e5SAlexander Musman   {
126f82886e5SAlexander Musman     int v = 0;
127f82886e5SAlexander Musman     int i;                      // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for simd' directive into a parallel or another task region?}}
128dffa93a6SAlexey Bataev #pragma omp for simd firstprivate(i) // expected-error {{firstprivate variable must be shared}}
129f82886e5SAlexander Musman     for (int k = 0; k < argc; ++k) {
130f82886e5SAlexander Musman       i = k;
131f82886e5SAlexander Musman       v += i;
132f82886e5SAlexander Musman     }
133f82886e5SAlexander Musman   }
134f82886e5SAlexander Musman #pragma omp parallel shared(i)
135f82886e5SAlexander Musman #pragma omp parallel private(i)
136bd9fec1eSAlexey Bataev #pragma omp for simd firstprivate(j)
137f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
138f82886e5SAlexander Musman     ++k;
139f82886e5SAlexander Musman #pragma omp parallel
140f82886e5SAlexander Musman #pragma omp for simd firstprivate(i)
141f82886e5SAlexander Musman   for (int k = 0; k < argc; ++k)
142f82886e5SAlexander Musman     ++k;
143f82886e5SAlexander Musman #pragma omp parallel
1444a5bb772SAlexey Bataev #pragma omp for simd lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
145f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
146f82886e5SAlexander Musman     foo();
147f82886e5SAlexander Musman #pragma omp parallel private(i) // expected-note {{defined as private}}
148f82886e5SAlexander Musman #pragma omp for simd firstprivate(i) // expected-error {{firstprivate variable must be shared}}
149f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
150f82886e5SAlexander Musman     foo();
151f82886e5SAlexander Musman #pragma omp parallel reduction(+ : i) // expected-note {{defined as reduction}}
152f82886e5SAlexander Musman #pragma omp for simd firstprivate(i)       // expected-error {{firstprivate variable must be shared}}
153a839dddfSAlexey Bataev   for (int k = 0; k < argc; ++k)
154f82886e5SAlexander Musman     foo();
155f82886e5SAlexander Musman   return 0;
156f82886e5SAlexander Musman }
157f82886e5SAlexander Musman 
1586ddfe1a6SAlexey Bataev namespace A {
1596ddfe1a6SAlexey Bataev double x;
1606ddfe1a6SAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
1616ddfe1a6SAlexey Bataev }
1626ddfe1a6SAlexey Bataev namespace B {
1636ddfe1a6SAlexey Bataev using A::x;
1646ddfe1a6SAlexey Bataev }
1656ddfe1a6SAlexey Bataev 
main(int argc,char ** argv)166f82886e5SAlexander Musman int main(int argc, char **argv) {
167f82886e5SAlexander Musman   const int d = 5;
168f82886e5SAlexander Musman   const int da[5] = {0};
1694a5bb772SAlexey Bataev   S4 e(4);
1704a5bb772SAlexey Bataev   S5 g(5);
171f82886e5SAlexander Musman   S3 m;
172f82886e5SAlexander Musman   S6 n(2);
173f82886e5SAlexander Musman   int i;
174bd9fec1eSAlexey Bataev   int &j = i;
175f82886e5SAlexander Musman #pragma omp parallel
176f82886e5SAlexander Musman #pragma omp for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}}
177f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
178f82886e5SAlexander Musman     foo();
179f82886e5SAlexander Musman #pragma omp parallel
180f82886e5SAlexander Musman #pragma omp for simd firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
181f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
182f82886e5SAlexander Musman     foo();
183f82886e5SAlexander Musman #pragma omp parallel
184f82886e5SAlexander Musman #pragma omp for simd firstprivate() // expected-error {{expected expression}}
185f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
186f82886e5SAlexander Musman     foo();
187f82886e5SAlexander Musman #pragma omp parallel
188f82886e5SAlexander Musman #pragma omp for simd firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
189f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
190f82886e5SAlexander Musman     foo();
191f82886e5SAlexander Musman #pragma omp parallel
192c5970623SAlexey Bataev #pragma omp for simd firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
193f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
194f82886e5SAlexander Musman     foo();
195f82886e5SAlexander Musman #pragma omp parallel
196f82886e5SAlexander Musman #pragma omp for simd firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
197f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
198f82886e5SAlexander Musman     foo();
199f82886e5SAlexander Musman #pragma omp parallel
200f82886e5SAlexander Musman #pragma omp for simd firstprivate(argc)
201f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
202f82886e5SAlexander Musman     foo();
203f82886e5SAlexander Musman #pragma omp parallel
204f82886e5SAlexander Musman #pragma omp for simd firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
205f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
206f82886e5SAlexander Musman     foo();
207f82886e5SAlexander Musman #pragma omp parallel
208f82886e5SAlexander Musman #pragma omp for simd firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
209f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
210f82886e5SAlexander Musman     foo();
211f82886e5SAlexander Musman #pragma omp parallel
212f82886e5SAlexander Musman #pragma omp for simd firstprivate(argv[1]) // expected-error {{expected variable name}}
213f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
214f82886e5SAlexander Musman     foo();
215f82886e5SAlexander Musman #pragma omp parallel
216f82886e5SAlexander Musman #pragma omp for simd firstprivate(2 * 2) // expected-error {{expected variable name}}
217f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
218f82886e5SAlexander Musman     foo();
219f82886e5SAlexander Musman #pragma omp parallel
220f82886e5SAlexander Musman #pragma omp for simd firstprivate(ba) // OK
221f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
222f82886e5SAlexander Musman     foo();
223f82886e5SAlexander Musman #pragma omp parallel
224f82886e5SAlexander Musman #pragma omp for simd firstprivate(ca) // OK
225f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
226f82886e5SAlexander Musman     foo();
227f82886e5SAlexander Musman #pragma omp parallel
228f82886e5SAlexander Musman #pragma omp for simd firstprivate(da) // OK
229f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
230f82886e5SAlexander Musman     foo();
231f82886e5SAlexander Musman   int xa;
232f82886e5SAlexander Musman #pragma omp parallel
233f82886e5SAlexander Musman #pragma omp for simd firstprivate(xa) // OK
234f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
235f82886e5SAlexander Musman     foo();
236f82886e5SAlexander Musman #pragma omp parallel
237f82886e5SAlexander Musman #pragma omp for simd firstprivate(S2::S2s) // OK
238f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
239f82886e5SAlexander Musman     foo();
240f82886e5SAlexander Musman #pragma omp parallel
241f82886e5SAlexander Musman #pragma omp for simd firstprivate(S2::S2sc) // OK
242f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
243f82886e5SAlexander Musman     foo();
244f82886e5SAlexander Musman #pragma omp parallel
245f82886e5SAlexander Musman #pragma omp for simd safelen(5)
246f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
247f82886e5SAlexander Musman     foo();
248f82886e5SAlexander Musman #pragma omp parallel
2494a5bb772SAlexey Bataev #pragma omp for simd firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
250f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
251f82886e5SAlexander Musman     foo();
252f82886e5SAlexander Musman #pragma omp parallel
253f82886e5SAlexander Musman #pragma omp for simd firstprivate(m) // OK
254f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
255f82886e5SAlexander Musman     foo();
256f82886e5SAlexander Musman #pragma omp parallel
257f82886e5SAlexander Musman #pragma omp for simd firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
258f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
259f82886e5SAlexander Musman     foo();
260f82886e5SAlexander Musman #pragma omp parallel
2616ddfe1a6SAlexey Bataev #pragma omp for simd firstprivate(B::x) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
2626ddfe1a6SAlexey Bataev   for (i = 0; i < argc; ++i)
2636ddfe1a6SAlexey Bataev     foo();
2646ddfe1a6SAlexey Bataev #pragma omp parallel
265f82886e5SAlexander Musman #pragma omp for simd private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}}
266f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
267f82886e5SAlexander Musman     foo();
268f82886e5SAlexander Musman #pragma omp parallel
269f82886e5SAlexander Musman #pragma omp for simd firstprivate(i) // expected-note {{defined as firstprivate}}
270f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)    // expected-error {{loop iteration variable in the associated loop of 'omp for simd' directive may not be firstprivate, predetermined as linear}}
271f82886e5SAlexander Musman     foo();
272f82886e5SAlexander Musman #pragma omp parallel shared(xa)
273f82886e5SAlexander Musman #pragma omp for simd firstprivate(xa) // OK: may be firstprivate
274f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
275f82886e5SAlexander Musman     foo();
276f82886e5SAlexander Musman #pragma omp parallel
277bd9fec1eSAlexey Bataev #pragma omp for simd firstprivate(j)
278f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
279f82886e5SAlexander Musman     foo();
280f82886e5SAlexander Musman #pragma omp parallel
2814a5bb772SAlexey Bataev #pragma omp for simd lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
282f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
283f82886e5SAlexander Musman     foo();
284f82886e5SAlexander Musman #pragma omp parallel
285f82886e5SAlexander Musman #pragma omp for simd lastprivate(n) firstprivate(n) // OK
286f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
287f82886e5SAlexander Musman     foo();
288f82886e5SAlexander Musman #pragma omp parallel
289f82886e5SAlexander Musman   {
290f82886e5SAlexander Musman     int v = 0;
291f82886e5SAlexander Musman     int i;                      // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for simd' directive into a parallel or another task region?}}
292dffa93a6SAlexey Bataev #pragma omp for simd firstprivate(i) // expected-error {{firstprivate variable must be shared}}
293f82886e5SAlexander Musman     for (int k = 0; k < argc; ++k) {
294f82886e5SAlexander Musman       i = k;
295f82886e5SAlexander Musman       v += i;
296f82886e5SAlexander Musman     }
297f82886e5SAlexander Musman   }
298f82886e5SAlexander Musman #pragma omp parallel private(i) // expected-note {{defined as private}}
299f82886e5SAlexander Musman #pragma omp for simd firstprivate(i) // expected-error {{firstprivate variable must be shared}}
300f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
301f82886e5SAlexander Musman     foo();
302f82886e5SAlexander Musman #pragma omp parallel reduction(+ : i) // expected-note {{defined as reduction}}
303f82886e5SAlexander Musman #pragma omp for simd firstprivate(i)       // expected-error {{firstprivate variable must be shared}}
304f82886e5SAlexander Musman   for (i = 0; i < argc; ++i)
305f82886e5SAlexander Musman     foo();
3064eea8c6bSKelvin Li   static int si;
3074eea8c6bSKelvin Li #pragma omp for simd firstprivate(si)
3084eea8c6bSKelvin Li   for (i = 0; i < argc; ++i)
3094eea8c6bSKelvin Li     si = i + 1;
310f82886e5SAlexander Musman 
311f82886e5SAlexander Musman   return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
312f82886e5SAlexander Musman }
313