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) {}
20f82886e5SAlexander Musman };
21f82886e5SAlexander Musman const S2 b;
22f82886e5SAlexander Musman const S2 ba[5];
23f82886e5SAlexander Musman class S3 {
24f82886e5SAlexander Musman int a;
25f82886e5SAlexander Musman
26f82886e5SAlexander Musman public:
S3()27f82886e5SAlexander Musman S3() : a(0) {}
28f82886e5SAlexander Musman };
29f82886e5SAlexander Musman const S3 ca[5];
3003b340a3SAlexey Bataev class S4 {
31f82886e5SAlexander Musman int a;
3203b340a3SAlexey Bataev S4(); // expected-note {{implicitly declared private here}}
33f82886e5SAlexander Musman
34f82886e5SAlexander Musman public:
S4(int v)3548c0bfb9SAlexey Bataev S4(int v) : a(v) {
3648c0bfb9SAlexey Bataev #pragma omp for simd private(a) private(this->a)
3748c0bfb9SAlexey Bataev for (int k = 0; k < v; ++k)
3848c0bfb9SAlexey Bataev ++this->a;
3948c0bfb9SAlexey Bataev }
40f82886e5SAlexander Musman };
4103b340a3SAlexey Bataev class S5 {
42f82886e5SAlexander Musman int a;
S5()4303b340a3SAlexey Bataev S5() : a(0) {} // expected-note {{implicitly declared private here}}
44f82886e5SAlexander Musman
45f82886e5SAlexander Musman public:
S5(int v)46f82886e5SAlexander Musman S5(int v) : a(v) {}
operator =(S5 & s)4748c0bfb9SAlexey Bataev S5 &operator=(S5 &s) {
4848c0bfb9SAlexey Bataev #pragma omp for simd private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}
4948c0bfb9SAlexey Bataev for (int k = 0; k < s.a; ++k)
5048c0bfb9SAlexey Bataev ++s.a;
5148c0bfb9SAlexey Bataev return *this;
5248c0bfb9SAlexey Bataev }
5348c0bfb9SAlexey Bataev };
5448c0bfb9SAlexey Bataev
5548c0bfb9SAlexey Bataev template <typename T>
5648c0bfb9SAlexey Bataev class S6 {
5748c0bfb9SAlexey Bataev public:
5848c0bfb9SAlexey Bataev T a;
5948c0bfb9SAlexey Bataev
S6()6048c0bfb9SAlexey Bataev S6() : a(0) {}
S6(T v)6148c0bfb9SAlexey Bataev S6(T v) : a(v) {
6248c0bfb9SAlexey Bataev #pragma omp for simd private(a) private(this->a)
6348c0bfb9SAlexey Bataev for (int k = 0; k < v; ++k)
6448c0bfb9SAlexey Bataev ++this->a;
6548c0bfb9SAlexey Bataev }
operator =(S6 & s)6648c0bfb9SAlexey Bataev S6 &operator=(S6 &s) {
6748c0bfb9SAlexey Bataev #pragma omp for simd private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}
6848c0bfb9SAlexey Bataev for (int k = 0; k < s.a; ++k)
6948c0bfb9SAlexey Bataev ++s.a;
7048c0bfb9SAlexey Bataev return *this;
7148c0bfb9SAlexey Bataev }
7248c0bfb9SAlexey Bataev };
7348c0bfb9SAlexey Bataev
7448c0bfb9SAlexey Bataev template <typename T>
7548c0bfb9SAlexey Bataev class S7 : public T {
7648c0bfb9SAlexey Bataev T a;
S7()7748c0bfb9SAlexey Bataev S7() : a(0) {}
7848c0bfb9SAlexey Bataev
7948c0bfb9SAlexey Bataev public:
S7(T v)8048c0bfb9SAlexey Bataev S7(T v) : a(v) {
8148c0bfb9SAlexey Bataev #pragma omp for simd private(a) private(this->a) private(T::a)
8248c0bfb9SAlexey Bataev for (int k = 0; k < a.a; ++k)
8348c0bfb9SAlexey Bataev ++this->a.a;
8448c0bfb9SAlexey Bataev }
operator =(S7 & s)8548c0bfb9SAlexey Bataev S7 &operator=(S7 &s) {
8648c0bfb9SAlexey Bataev #pragma omp for 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}}
8748c0bfb9SAlexey Bataev for (int k = 0; k < s.a.a; ++k)
8848c0bfb9SAlexey Bataev ++s.a.a;
8948c0bfb9SAlexey Bataev return *this;
9048c0bfb9SAlexey Bataev }
91f82886e5SAlexander Musman };
92f82886e5SAlexander Musman
93f82886e5SAlexander Musman S3 h;
94f82886e5SAlexander Musman #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
95f82886e5SAlexander Musman
96f82886e5SAlexander Musman template <class I, class C>
foomain(I argc,C ** argv)97f82886e5SAlexander Musman int foomain(I argc, C **argv) {
98f82886e5SAlexander Musman I e(4);
99f82886e5SAlexander Musman I g(5);
100f82886e5SAlexander Musman int i;
101bd9fec1eSAlexey Bataev int &j = i;
102f82886e5SAlexander Musman #pragma omp for simd private // expected-error {{expected '(' after 'private'}}
103f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
104f82886e5SAlexander Musman ++k;
105f82886e5SAlexander Musman #pragma omp for simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
106f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
107f82886e5SAlexander Musman ++k;
108f82886e5SAlexander Musman #pragma omp for simd private() // expected-error {{expected expression}}
109f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
110f82886e5SAlexander Musman ++k;
111f82886e5SAlexander Musman #pragma omp for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
112f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
113f82886e5SAlexander Musman ++k;
114c5970623SAlexey Bataev #pragma omp for simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
115f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
116f82886e5SAlexander Musman ++k;
117f82886e5SAlexander Musman #pragma omp for simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
118f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
119f82886e5SAlexander Musman ++k;
120e04483eeSAlexey Bataev #pragma omp for 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 '('}}
121f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
122f82886e5SAlexander Musman ++k;
123f82886e5SAlexander Musman #pragma omp for simd private(S1) // expected-error {{'S1' does not refer to a value}}
124f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
125f82886e5SAlexander Musman ++k;
126f82886e5SAlexander Musman #pragma omp for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
127f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
128f82886e5SAlexander Musman ++k;
129f82886e5SAlexander Musman #pragma omp for simd private(argv[1]) // expected-error {{expected variable name}}
130f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
131f82886e5SAlexander Musman ++k;
132f82886e5SAlexander Musman #pragma omp for simd private(e, g)
133f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
134f82886e5SAlexander Musman ++k;
135f82886e5SAlexander Musman #pragma omp for simd private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
136f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
137f82886e5SAlexander Musman ++k;
138f82886e5SAlexander Musman #pragma omp for simd shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp for simd'}}
139f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
140f82886e5SAlexander Musman ++k;
141f82886e5SAlexander Musman #pragma omp parallel
142f82886e5SAlexander Musman {
143f82886e5SAlexander Musman int v = 0;
144f82886e5SAlexander Musman int i;
145f82886e5SAlexander Musman #pragma omp for simd private(i)
146f82886e5SAlexander Musman for (int k = 0; k < argc; ++k) {
147f82886e5SAlexander Musman i = k;
148f82886e5SAlexander Musman v += i;
149f82886e5SAlexander Musman }
150f82886e5SAlexander Musman }
151f82886e5SAlexander Musman #pragma omp parallel shared(i)
152f82886e5SAlexander Musman #pragma omp parallel private(i)
153bd9fec1eSAlexey Bataev #pragma omp for simd private(j)
154f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
155f82886e5SAlexander Musman ++k;
156f82886e5SAlexander Musman #pragma omp for simd private(i)
157f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
158f82886e5SAlexander Musman ++k;
159f82886e5SAlexander Musman return 0;
160f82886e5SAlexander Musman }
161f82886e5SAlexander Musman
1626ddfe1a6SAlexey Bataev namespace A {
1636ddfe1a6SAlexey Bataev double x;
1646ddfe1a6SAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
1656ddfe1a6SAlexey Bataev }
1666ddfe1a6SAlexey Bataev namespace B {
1676ddfe1a6SAlexey Bataev using A::x;
1686ddfe1a6SAlexey Bataev }
1696ddfe1a6SAlexey Bataev
main(int argc,char ** argv)170f82886e5SAlexander Musman int main(int argc, char **argv) {
17103b340a3SAlexey Bataev S4 e(4);
17203b340a3SAlexey Bataev S5 g(5);
17348c0bfb9SAlexey Bataev S6<float> s6(0.0) , s6_0(1.0);
17448c0bfb9SAlexey Bataev S7<S6<float> > s7(0.0) , s7_0(1.0);
175f82886e5SAlexander Musman int i;
176bd9fec1eSAlexey Bataev int &j = i;
177f82886e5SAlexander Musman #pragma omp for simd private // expected-error {{expected '(' after 'private'}}
178f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
179f82886e5SAlexander Musman ++k;
180f82886e5SAlexander Musman #pragma omp for simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
181f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
182f82886e5SAlexander Musman ++k;
183f82886e5SAlexander Musman #pragma omp for simd private() // expected-error {{expected expression}}
184f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
185f82886e5SAlexander Musman ++k;
186f82886e5SAlexander Musman #pragma omp for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
187f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
188f82886e5SAlexander Musman ++k;
189c5970623SAlexey Bataev #pragma omp for simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
190f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
191f82886e5SAlexander Musman ++k;
192f82886e5SAlexander Musman #pragma omp for simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
193f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
194f82886e5SAlexander Musman ++k;
195f82886e5SAlexander Musman #pragma omp for simd private(argc)
196f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
197f82886e5SAlexander Musman ++k;
198f82886e5SAlexander Musman #pragma omp for simd private(S1) // expected-error {{'S1' does not refer to a value}}
199f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
200f82886e5SAlexander Musman ++k;
201f82886e5SAlexander Musman #pragma omp for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
202f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
203f82886e5SAlexander Musman ++k;
204f82886e5SAlexander Musman #pragma omp for simd private(argv[1]) // expected-error {{expected variable name}}
205f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
206f82886e5SAlexander Musman ++k;
20703b340a3SAlexey Bataev #pragma omp for simd private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
208f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
209f82886e5SAlexander Musman ++k;
2106ddfe1a6SAlexey Bataev #pragma omp for simd private(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}
211f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
212f82886e5SAlexander Musman ++k;
213f82886e5SAlexander Musman #pragma omp for simd shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp for simd'}}
214f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
215f82886e5SAlexander Musman ++k;
216f82886e5SAlexander Musman #pragma omp parallel
217f82886e5SAlexander Musman {
218f82886e5SAlexander Musman int i;
219f82886e5SAlexander Musman #pragma omp for simd private(i)
220f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
221f82886e5SAlexander Musman ++k;
222f82886e5SAlexander Musman }
223f82886e5SAlexander Musman #pragma omp parallel shared(i)
224f82886e5SAlexander Musman #pragma omp parallel private(i)
225bd9fec1eSAlexey Bataev #pragma omp for simd private(j)
226f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
227f82886e5SAlexander Musman ++k;
228f82886e5SAlexander Musman #pragma omp for simd private(i)
229f82886e5SAlexander Musman for (int k = 0; k < argc; ++k)
230f82886e5SAlexander Musman ++k;
2314eea8c6bSKelvin Li static int m;
2324eea8c6bSKelvin Li #pragma omp for simd private(m)
2334eea8c6bSKelvin Li for (int k = 0; k < argc; ++k)
2344eea8c6bSKelvin Li m = k + 2;
235f82886e5SAlexander Musman
23648c0bfb9SAlexey Bataev s6 = s6_0; // expected-note {{in instantiation of member function 'S6<float>::operator=' requested here}}
23748c0bfb9SAlexey Bataev s7 = s7_0; // expected-note {{in instantiation of member function 'S7<S6<float>>::operator=' requested here}}
23848c0bfb9SAlexey Bataev return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}
239f82886e5SAlexander Musman }
240f82886e5SAlexander Musman
241