1*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized
2d1e40fbfSAlexey Bataev
3*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
4a8a9153aSAlexey Bataev
5e04483eeSAlexey Bataev extern int omp_default_mem_alloc;
foo()6d1e40fbfSAlexey Bataev void foo() {
7d1e40fbfSAlexey Bataev }
8d1e40fbfSAlexey Bataev
foobool(int argc)9d1e40fbfSAlexey Bataev bool foobool(int argc) {
10d1e40fbfSAlexey Bataev return argc;
11d1e40fbfSAlexey Bataev }
12d1e40fbfSAlexey Bataev
13d1e40fbfSAlexey Bataev struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
14d1e40fbfSAlexey Bataev extern S1 a;
15d1e40fbfSAlexey Bataev class S2 {
16d1e40fbfSAlexey Bataev mutable int a;
17d1e40fbfSAlexey Bataev
18d1e40fbfSAlexey Bataev public:
S2()19d1e40fbfSAlexey Bataev S2() : a(0) {}
S2(const S2 & s2)204a5bb772SAlexey Bataev S2(const S2 &s2) : a(s2.a) {}
21d1e40fbfSAlexey Bataev static float S2s;
22d1e40fbfSAlexey Bataev static const float S2sc;
23d1e40fbfSAlexey Bataev };
24d1e40fbfSAlexey Bataev const float S2::S2sc = 0;
25d1e40fbfSAlexey Bataev const S2 b;
26d1e40fbfSAlexey Bataev const S2 ba[5];
27d1e40fbfSAlexey Bataev class S3 {
28d1e40fbfSAlexey Bataev int a;
29d1e40fbfSAlexey Bataev S3 &operator=(const S3 &s3);
30d1e40fbfSAlexey Bataev
31d1e40fbfSAlexey Bataev public:
S3()32d1e40fbfSAlexey Bataev S3() : a(0) {}
S3(const S3 & s3)334a5bb772SAlexey Bataev S3(const S3 &s3) : a(s3.a) {}
34d1e40fbfSAlexey Bataev };
35d1e40fbfSAlexey Bataev const S3 c;
36d1e40fbfSAlexey Bataev const S3 ca[5];
37d1e40fbfSAlexey Bataev extern const int f;
384a5bb772SAlexey Bataev class S4 {
39d1e40fbfSAlexey Bataev int a;
40d1e40fbfSAlexey Bataev S4();
414a5bb772SAlexey Bataev S4(const S4 &s4); // expected-note 2 {{implicitly declared private here}}
42d1e40fbfSAlexey Bataev
43d1e40fbfSAlexey Bataev public:
S4(int v)44d1e40fbfSAlexey Bataev S4(int v) : a(v) {}
45d1e40fbfSAlexey Bataev };
464a5bb772SAlexey Bataev class S5 {
47d1e40fbfSAlexey Bataev int a;
S5(const S5 & s5)484a5bb772SAlexey Bataev S5(const S5 &s5) : a(s5.a) {} // expected-note 4 {{implicitly declared private here}}
49d1e40fbfSAlexey Bataev
50d1e40fbfSAlexey Bataev public:
S5()51d1e40fbfSAlexey Bataev S5() : a(0) {}
S5(int v)52d1e40fbfSAlexey Bataev S5(int v) : a(v) {}
53d1e40fbfSAlexey Bataev };
54d1e40fbfSAlexey Bataev class S6 {
55d1e40fbfSAlexey Bataev int a;
S6()56d1e40fbfSAlexey Bataev S6() : a(0) {}
57d1e40fbfSAlexey Bataev
58d1e40fbfSAlexey Bataev public:
S6(const S6 & s6)59d1e40fbfSAlexey Bataev S6(const S6 &s6) : a(s6.a) {}
S6(int v)60d1e40fbfSAlexey Bataev S6(int v) : a(v) {}
61d1e40fbfSAlexey Bataev };
62d1e40fbfSAlexey Bataev
63d1e40fbfSAlexey Bataev S3 h;
64d1e40fbfSAlexey Bataev #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
65d1e40fbfSAlexey Bataev
66d1e40fbfSAlexey Bataev template <class I, class C>
foomain(int argc,char ** argv)67d1e40fbfSAlexey Bataev int foomain(int argc, char **argv) {
684a5bb772SAlexey Bataev I e(4);
694a5bb772SAlexey Bataev C g(5);
70*a914888bSAlexey Bataev int i, z;
71bd9fec1eSAlexey Bataev int &j = i;
72d1e40fbfSAlexey Bataev #pragma omp parallel
73d1e40fbfSAlexey Bataev #pragma omp single firstprivate // expected-error {{expected '(' after 'firstprivate'}}
74d1e40fbfSAlexey Bataev foo();
75d1e40fbfSAlexey Bataev #pragma omp parallel
76d1e40fbfSAlexey Bataev #pragma omp single firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
77d1e40fbfSAlexey Bataev foo();
78d1e40fbfSAlexey Bataev #pragma omp parallel
79d1e40fbfSAlexey Bataev #pragma omp single firstprivate() // expected-error {{expected expression}}
80d1e40fbfSAlexey Bataev foo();
81d1e40fbfSAlexey Bataev #pragma omp parallel
82d1e40fbfSAlexey Bataev #pragma omp single firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
83d1e40fbfSAlexey Bataev foo();
84d1e40fbfSAlexey Bataev #pragma omp parallel
85c5970623SAlexey Bataev #pragma omp single firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
86d1e40fbfSAlexey Bataev foo();
87d1e40fbfSAlexey Bataev #pragma omp parallel
88d1e40fbfSAlexey Bataev #pragma omp single firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
89d1e40fbfSAlexey Bataev foo();
90d1e40fbfSAlexey Bataev #pragma omp parallel
91e04483eeSAlexey Bataev #pragma omp single 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 '('}}
92d1e40fbfSAlexey Bataev foo();
93d1e40fbfSAlexey Bataev #pragma omp parallel
94d1e40fbfSAlexey Bataev #pragma omp single firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
95d1e40fbfSAlexey Bataev foo();
96d1e40fbfSAlexey Bataev #pragma omp parallel
97*a914888bSAlexey Bataev #pragma omp single firstprivate(z, a, b) // expected-error {{firstprivate variable with incomplete type 'S1'}}
98d1e40fbfSAlexey Bataev foo();
99d1e40fbfSAlexey Bataev #pragma omp parallel
100d1e40fbfSAlexey Bataev #pragma omp single firstprivate(argv[1]) // expected-error {{expected variable name}}
101d1e40fbfSAlexey Bataev foo();
102d1e40fbfSAlexey Bataev #pragma omp parallel
1034a5bb772SAlexey Bataev #pragma omp single firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
104d1e40fbfSAlexey Bataev foo();
105d1e40fbfSAlexey Bataev #pragma omp parallel
106d1e40fbfSAlexey Bataev #pragma omp single firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
107d1e40fbfSAlexey Bataev foo();
108d1e40fbfSAlexey Bataev #pragma omp parallel
109d1e40fbfSAlexey Bataev #pragma omp single linear(i) // expected-error {{unexpected OpenMP clause 'linear' in directive '#pragma omp single'}}
110d1e40fbfSAlexey Bataev foo();
111d1e40fbfSAlexey Bataev #pragma omp parallel
112d1e40fbfSAlexey Bataev {
113d1e40fbfSAlexey Bataev int v = 0;
114d1e40fbfSAlexey Bataev int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp single' directive into a parallel or another task region?}}
115dffa93a6SAlexey Bataev #pragma omp single firstprivate(i) // expected-error {{firstprivate variable must be shared}}
116d1e40fbfSAlexey Bataev foo();
117d1e40fbfSAlexey Bataev v += i;
118d1e40fbfSAlexey Bataev }
119d1e40fbfSAlexey Bataev #pragma omp parallel shared(i)
120d1e40fbfSAlexey Bataev #pragma omp parallel private(i)
121bd9fec1eSAlexey Bataev #pragma omp single firstprivate(j)
122d1e40fbfSAlexey Bataev foo();
123d1e40fbfSAlexey Bataev #pragma omp parallel
124d1e40fbfSAlexey Bataev #pragma omp single firstprivate(i)
125d1e40fbfSAlexey Bataev foo();
126d1e40fbfSAlexey Bataev #pragma omp parallel
1274a5bb772SAlexey Bataev #pragma omp single firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
128d1e40fbfSAlexey Bataev foo();
129d1e40fbfSAlexey Bataev #pragma omp parallel private(i) // expected-note {{defined as private}}
130d1e40fbfSAlexey Bataev #pragma omp single firstprivate(i) // expected-error {{firstprivate variable must be shared}}
131d1e40fbfSAlexey Bataev foo();
132d1e40fbfSAlexey Bataev #pragma omp parallel reduction(+ : i) // expected-note {{defined as reduction}}
133d1e40fbfSAlexey Bataev #pragma omp single firstprivate(i) // expected-error {{firstprivate variable must be shared}}
134d1e40fbfSAlexey Bataev foo();
135d1e40fbfSAlexey Bataev return 0;
136d1e40fbfSAlexey Bataev }
137d1e40fbfSAlexey Bataev
1386ddfe1a6SAlexey Bataev namespace A {
1396ddfe1a6SAlexey Bataev double x;
1406ddfe1a6SAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
1416ddfe1a6SAlexey Bataev }
1426ddfe1a6SAlexey Bataev namespace B {
1436ddfe1a6SAlexey Bataev using A::x;
1446ddfe1a6SAlexey Bataev }
1456ddfe1a6SAlexey Bataev
main(int argc,char ** argv)146d1e40fbfSAlexey Bataev int main(int argc, char **argv) {
147d1e40fbfSAlexey Bataev const int d = 5;
148d1e40fbfSAlexey Bataev const int da[5] = {0};
1494a5bb772SAlexey Bataev S4 e(4);
1504a5bb772SAlexey Bataev S5 g(5);
151d1e40fbfSAlexey Bataev S3 m;
152d1e40fbfSAlexey Bataev S6 n(2);
153*a914888bSAlexey Bataev int i, z;
154bd9fec1eSAlexey Bataev int &j = i;
155d1e40fbfSAlexey Bataev #pragma omp parallel
156d1e40fbfSAlexey Bataev #pragma omp single firstprivate // expected-error {{expected '(' after 'firstprivate'}}
157d1e40fbfSAlexey Bataev foo();
158d1e40fbfSAlexey Bataev #pragma omp parallel
159d1e40fbfSAlexey Bataev #pragma omp single firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
160d1e40fbfSAlexey Bataev foo();
161d1e40fbfSAlexey Bataev #pragma omp parallel
162d1e40fbfSAlexey Bataev #pragma omp single firstprivate() // expected-error {{expected expression}}
163d1e40fbfSAlexey Bataev foo();
164d1e40fbfSAlexey Bataev #pragma omp parallel
165d1e40fbfSAlexey Bataev #pragma omp single firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
166d1e40fbfSAlexey Bataev foo();
167d1e40fbfSAlexey Bataev #pragma omp parallel
168c5970623SAlexey Bataev #pragma omp single firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
169d1e40fbfSAlexey Bataev foo();
170d1e40fbfSAlexey Bataev #pragma omp parallel
171d1e40fbfSAlexey Bataev #pragma omp single firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
172d1e40fbfSAlexey Bataev foo();
173d1e40fbfSAlexey Bataev #pragma omp parallel
174*a914888bSAlexey Bataev #pragma omp single firstprivate(argc, z)
175d1e40fbfSAlexey Bataev foo();
176d1e40fbfSAlexey Bataev #pragma omp parallel
177d1e40fbfSAlexey Bataev #pragma omp single firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
178d1e40fbfSAlexey Bataev foo();
179d1e40fbfSAlexey Bataev #pragma omp parallel
180d1e40fbfSAlexey Bataev #pragma omp single firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
181d1e40fbfSAlexey Bataev foo();
182d1e40fbfSAlexey Bataev #pragma omp parallel
183d1e40fbfSAlexey Bataev #pragma omp single firstprivate(argv[1]) // expected-error {{expected variable name}}
184d1e40fbfSAlexey Bataev foo();
185d1e40fbfSAlexey Bataev #pragma omp parallel
186d1e40fbfSAlexey Bataev #pragma omp single firstprivate(2 * 2) // expected-error {{expected variable name}}
187d1e40fbfSAlexey Bataev foo();
188d1e40fbfSAlexey Bataev #pragma omp parallel
189d1e40fbfSAlexey Bataev #pragma omp single firstprivate(ba) // OK
190d1e40fbfSAlexey Bataev foo();
191d1e40fbfSAlexey Bataev #pragma omp parallel
192d1e40fbfSAlexey Bataev #pragma omp single firstprivate(ca) // OK
193d1e40fbfSAlexey Bataev foo();
194d1e40fbfSAlexey Bataev #pragma omp parallel
195d1e40fbfSAlexey Bataev #pragma omp single firstprivate(da) // OK
196d1e40fbfSAlexey Bataev foo();
197d1e40fbfSAlexey Bataev int xa;
198d1e40fbfSAlexey Bataev #pragma omp parallel
199d1e40fbfSAlexey Bataev #pragma omp single firstprivate(xa) // OK
200d1e40fbfSAlexey Bataev foo();
201d1e40fbfSAlexey Bataev #pragma omp parallel
202d1e40fbfSAlexey Bataev #pragma omp single firstprivate(S2::S2s) // OK
203d1e40fbfSAlexey Bataev foo();
204d1e40fbfSAlexey Bataev #pragma omp parallel
205d1e40fbfSAlexey Bataev #pragma omp single firstprivate(S2::S2sc) // OK
206d1e40fbfSAlexey Bataev foo();
207d1e40fbfSAlexey Bataev #pragma omp parallel
208d1e40fbfSAlexey Bataev #pragma omp single safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp single'}}
209d1e40fbfSAlexey Bataev foo();
210d1e40fbfSAlexey Bataev #pragma omp parallel
2114a5bb772SAlexey Bataev #pragma omp single firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
212d1e40fbfSAlexey Bataev foo();
213d1e40fbfSAlexey Bataev #pragma omp parallel
214d1e40fbfSAlexey Bataev #pragma omp single firstprivate(m) // OK
215d1e40fbfSAlexey Bataev foo();
216d1e40fbfSAlexey Bataev #pragma omp parallel
2176ddfe1a6SAlexey Bataev #pragma omp single firstprivate(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be firstprivate}}
218d1e40fbfSAlexey Bataev foo();
219d1e40fbfSAlexey Bataev #pragma omp parallel
220d1e40fbfSAlexey Bataev #pragma omp single private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}}
221d1e40fbfSAlexey Bataev foo();
222d1e40fbfSAlexey Bataev #pragma omp parallel shared(xa)
223d1e40fbfSAlexey Bataev #pragma omp single firstprivate(xa) // OK: may be firstprivate
224d1e40fbfSAlexey Bataev foo();
225d1e40fbfSAlexey Bataev #pragma omp parallel
226bd9fec1eSAlexey Bataev #pragma omp single firstprivate(j)
227d1e40fbfSAlexey Bataev foo();
228d1e40fbfSAlexey Bataev #pragma omp parallel
2294a5bb772SAlexey Bataev #pragma omp single firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
230d1e40fbfSAlexey Bataev foo();
231d1e40fbfSAlexey Bataev #pragma omp parallel
232d1e40fbfSAlexey Bataev #pragma omp single firstprivate(n) // OK
233d1e40fbfSAlexey Bataev foo();
234d1e40fbfSAlexey Bataev #pragma omp parallel
235d1e40fbfSAlexey Bataev {
236d1e40fbfSAlexey Bataev int v = 0;
237d1e40fbfSAlexey Bataev int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp single' directive into a parallel or another task region?}}
238dffa93a6SAlexey Bataev #pragma omp single firstprivate(i) // expected-error {{firstprivate variable must be shared}}
239d1e40fbfSAlexey Bataev foo();
240d1e40fbfSAlexey Bataev v += i;
241d1e40fbfSAlexey Bataev }
242d1e40fbfSAlexey Bataev #pragma omp parallel private(i) // expected-note {{defined as private}}
243d1e40fbfSAlexey Bataev #pragma omp single firstprivate(i) // expected-error {{firstprivate variable must be shared}}
244d1e40fbfSAlexey Bataev foo();
245d1e40fbfSAlexey Bataev #pragma omp parallel reduction(+ : i) // expected-note {{defined as reduction}}
246d1e40fbfSAlexey Bataev #pragma omp single firstprivate(i) // expected-error {{firstprivate variable must be shared}}
247d1e40fbfSAlexey Bataev foo();
2484eea8c6bSKelvin Li static int t;
2494eea8c6bSKelvin Li #pragma omp single firstprivate(t) // OK
2504eea8c6bSKelvin Li foo();
251d1e40fbfSAlexey Bataev
252d1e40fbfSAlexey Bataev return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
253d1e40fbfSAlexey Bataev }
254