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;
xxx(int argc)6*195ae903SAlexey Bataev void xxx(int argc) {
7*195ae903SAlexey Bataev   int i, lin, step; // expected-note {{initialize the variable 'lin' to silence this warning}} expected-note {{initialize the variable 'step' to silence this warning}}
8*195ae903SAlexey Bataev #pragma omp parallel for simd linear(i, lin : step) // expected-warning {{variable 'lin' is uninitialized when used here}} expected-warning {{variable 'step' is uninitialized when used here}}
9*195ae903SAlexey Bataev   for (i = 0; i < 10; ++i)
10*195ae903SAlexey Bataev     ;
11*195ae903SAlexey Bataev }
12*195ae903SAlexey Bataev 
13e4e893bbSAlexander Musman namespace X {
14e4e893bbSAlexander Musman   int x;
15e4e893bbSAlexander Musman };
16e4e893bbSAlexander Musman 
17e4e893bbSAlexander Musman struct B {
18e4e893bbSAlexander Musman   static int ib; // expected-note {{'B::ib' declared here}}
bfooB19e4e893bbSAlexander Musman   static int bfoo() { return 8; }
20e4e893bbSAlexander Musman };
21e4e893bbSAlexander Musman 
bfoo()22e4e893bbSAlexander Musman int bfoo() { return 4; }
23e4e893bbSAlexander Musman 
24e4e893bbSAlexander Musman int z;
25e4e893bbSAlexander Musman const int C1 = 1;
26e4e893bbSAlexander Musman const int C2 = 2;
test_linear_colons()27e4e893bbSAlexander Musman void test_linear_colons()
28e4e893bbSAlexander Musman {
29e4e893bbSAlexander Musman   int B = 0;
30e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(B:bfoo())
31e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
32e4e893bbSAlexander Musman   // expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'}}
33e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(B::ib:B:bfoo())
34e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
35e4e893bbSAlexander Musman   // expected-error@+1 {{use of undeclared identifier 'ib'; did you mean 'B::ib'}}
36e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(B:ib)
37e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
38e4e893bbSAlexander Musman   // expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'?}}
39e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(z:B:ib)
40e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
41e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(B:B::bfoo())
42e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
43e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(X::x : ::z)
44e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
45e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(B,::z, X::x)
46e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
47e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(::z)
48e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
49e4e893bbSAlexander Musman   // expected-error@+1 {{expected variable name}}
50e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(B::bfoo())
51e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
52e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(B::ib,B:C1+C2)
53e4e893bbSAlexander Musman   for (int i = 0; i < 10; ++i) ;
54e4e893bbSAlexander Musman }
55e4e893bbSAlexander Musman 
test_template(T * arr,N num)56e4e893bbSAlexander Musman template<int L, class T, class N> T test_template(T* arr, N num) {
57e4e893bbSAlexander Musman   N i;
58e4e893bbSAlexander Musman   T sum = (T)0;
59e4e893bbSAlexander Musman   T ind2 = - num * L; // expected-note {{'ind2' defined here}}
60e4e893bbSAlexander Musman   // expected-error@+1 {{argument of a linear clause should be of integral or pointer type}}
61e4e893bbSAlexander Musman #pragma omp parallel for simd linear(ind2:L)
62e4e893bbSAlexander Musman   for (i = 0; i < num; ++i) {
63e4e893bbSAlexander Musman     T cur = arr[(int)ind2];
64e4e893bbSAlexander Musman     ind2 += L;
65e4e893bbSAlexander Musman     sum += cur;
66e4e893bbSAlexander Musman   }
67e4e893bbSAlexander Musman   return T();
68e4e893bbSAlexander Musman }
69e4e893bbSAlexander Musman 
test_warn()70e4e893bbSAlexander Musman template<int LEN> int test_warn() {
71e4e893bbSAlexander Musman   int ind2 = 0;
72e4e893bbSAlexander Musman   // expected-warning@+1 {{zero linear step (ind2 should probably be const)}}
73e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(ind2:LEN)
74e4e893bbSAlexander Musman   for (int i = 0; i < 100; i++) {
75e4e893bbSAlexander Musman     ind2 += LEN;
76e4e893bbSAlexander Musman   }
77e4e893bbSAlexander Musman   return ind2;
78e4e893bbSAlexander Musman }
79e4e893bbSAlexander Musman 
80e4e893bbSAlexander Musman struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
81e4e893bbSAlexander Musman extern S1 a;
82e4e893bbSAlexander Musman class S2 {
83e4e893bbSAlexander Musman   mutable int a;
84e4e893bbSAlexander Musman public:
S2()85e4e893bbSAlexander Musman   S2():a(0) { }
86e4e893bbSAlexander Musman };
87e4e893bbSAlexander Musman const S2 b; // expected-note 2 {{'b' defined here}}
88e4e893bbSAlexander Musman const S2 ba[5];
89e4e893bbSAlexander Musman class S3 {
90e4e893bbSAlexander Musman   int a;
91e4e893bbSAlexander Musman public:
S3()92e4e893bbSAlexander Musman   S3():a(0) { }
93e4e893bbSAlexander Musman };
94e4e893bbSAlexander Musman const S3 ca[5];
95e4e893bbSAlexander Musman class S4 {
96e4e893bbSAlexander Musman   int a;
97e4e893bbSAlexander Musman   S4();
98e4e893bbSAlexander Musman public:
S4(int v)99e4e893bbSAlexander Musman   S4(int v):a(v) { }
100e4e893bbSAlexander Musman };
101e4e893bbSAlexander Musman class S5 {
102e4e893bbSAlexander Musman   int a;
S5()103e4e893bbSAlexander Musman   S5():a(0) {}
104e4e893bbSAlexander Musman public:
S5(int v)105e4e893bbSAlexander Musman   S5(int v):a(v) { }
106e4e893bbSAlexander Musman };
107e4e893bbSAlexander Musman 
108e4e893bbSAlexander Musman S3 h;
109e4e893bbSAlexander Musman #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
110e4e893bbSAlexander Musman 
foomain(I argc,C ** argv)111e4e893bbSAlexander Musman template<class I, class C> int foomain(I argc, C **argv) {
112e4e893bbSAlexander Musman   I e(4);
113e4e893bbSAlexander Musman   I g(5);
114a914888bSAlexey Bataev   int i, z;
115bd9fec1eSAlexey Bataev   int &j = i;
116e4e893bbSAlexander Musman   #pragma omp parallel for simd linear // expected-error {{expected '(' after 'linear'}}
117e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
118e4e893bbSAlexander Musman   #pragma omp parallel for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
119e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
120e4e893bbSAlexander Musman   #pragma omp parallel for simd linear () // expected-error {{expected expression}}
121e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
122e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
123e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
124c5970623SAlexey Bataev   #pragma omp parallel for simd linear (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
125e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
126e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
127e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
128e04483eeSAlexey Bataev   #pragma omp parallel for simd linear (argc : 5) 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 '('}}
129e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
130e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (S1) // expected-error {{'S1' does not refer to a value}}
131e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
132e4e893bbSAlexander Musman   // expected-error@+2 {{linear variable with incomplete type 'S1'}}
133bae586fbSJoel E. Denny   // expected-error@+1 {{argument of a linear clause should be of integral or pointer type, not 'S2'}}
134e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (a, b:B::ib)
135e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
136e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (argv[1]) // expected-error {{expected variable name}}
137e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
138e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(e, g)
139e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
140e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(h) // expected-error {{threadprivate or thread local variable cannot be linear}}
141e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
142a914888bSAlexey Bataev   #pragma omp parallel for simd linear(i, z)
143e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
144e4e893bbSAlexander Musman   #pragma omp parallel
145e4e893bbSAlexander Musman   {
146e4e893bbSAlexander Musman     int v = 0;
147e4e893bbSAlexander Musman     int i;
148e4e893bbSAlexander Musman     #pragma omp parallel for simd linear(v:i)
149e4e893bbSAlexander Musman     for (int k = 0; k < argc; ++k) { i = k; v += i; }
150e4e893bbSAlexander Musman   }
151bd9fec1eSAlexey Bataev   #pragma omp parallel for simd linear(j)
152e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
153e4e893bbSAlexander Musman   int v = 0;
154e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(v:j)
155e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) { ++k; v += j; }
156e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(i)
157e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
158e4e893bbSAlexander Musman   return 0;
159e4e893bbSAlexander Musman }
160e4e893bbSAlexander Musman 
1616ddfe1a6SAlexey Bataev namespace A {
1626ddfe1a6SAlexey Bataev double x;
1636ddfe1a6SAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
1646ddfe1a6SAlexey Bataev }
1656ddfe1a6SAlexey Bataev namespace C {
1666ddfe1a6SAlexey Bataev using A::x;
1676ddfe1a6SAlexey Bataev }
1686ddfe1a6SAlexey Bataev 
main(int argc,char ** argv)169e4e893bbSAlexander Musman int main(int argc, char **argv) {
170e4e893bbSAlexander Musman   double darr[100];
171e4e893bbSAlexander Musman   // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}}
172e4e893bbSAlexander Musman   test_template<-4>(darr, 4);
173e4e893bbSAlexander Musman   // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}}
174e4e893bbSAlexander Musman   test_warn<0>();
175e4e893bbSAlexander Musman 
176e4e893bbSAlexander Musman   S4 e(4); // expected-note {{'e' defined here}}
177e4e893bbSAlexander Musman   S5 g(5); // expected-note {{'g' defined here}}
178a914888bSAlexey Bataev   int i, z;
179bd9fec1eSAlexey Bataev   int &j = i;
180e4e893bbSAlexander Musman   #pragma omp parallel for simd linear // expected-error {{expected '(' after 'linear'}}
181e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
182e4e893bbSAlexander Musman   #pragma omp parallel for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
183e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
184e4e893bbSAlexander Musman   #pragma omp parallel for simd linear () // expected-error {{expected expression}}
185e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
186e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
187e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
188c5970623SAlexey Bataev   #pragma omp parallel for simd linear (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
189e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
190e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
191e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
192a914888bSAlexey Bataev   #pragma omp parallel for simd linear (argc, z)
193e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
194e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (S1) // expected-error {{'S1' does not refer to a value}}
195e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
196e4e893bbSAlexander Musman   // expected-error@+2 {{linear variable with incomplete type 'S1'}}
197bae586fbSJoel E. Denny   // expected-error@+1 {{argument of a linear clause should be of integral or pointer type, not 'S2'}}
198e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (a, b)
199e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
200e4e893bbSAlexander Musman   #pragma omp parallel for simd linear (argv[1]) // expected-error {{expected variable name}}
201e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
202e4e893bbSAlexander Musman   // expected-error@+2 {{argument of a linear clause should be of integral or pointer type, not 'S4'}}
203e4e893bbSAlexander Musman   // expected-error@+1 {{argument of a linear clause should be of integral or pointer type, not 'S5'}}
204e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(e, g)
205e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
2066ddfe1a6SAlexey Bataev   #pragma omp parallel for simd linear(h, C::x) // expected-error 2 {{threadprivate or thread local variable cannot be linear}}
207e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
208e4e893bbSAlexander Musman   #pragma omp parallel
209e4e893bbSAlexander Musman   {
210e4e893bbSAlexander Musman     int i;
211e4e893bbSAlexander Musman     #pragma omp parallel for simd linear(i)
212e4e893bbSAlexander Musman     for (int k = 0; k < argc; ++k) ++k;
213e4e893bbSAlexander Musman     #pragma omp parallel for simd linear(i : 4)
214e4e893bbSAlexander Musman     for (int k = 0; k < argc; ++k) { ++k; i += 4; }
215e4e893bbSAlexander Musman   }
216bd9fec1eSAlexey Bataev   #pragma omp parallel for simd linear(j)
217e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
218e4e893bbSAlexander Musman   #pragma omp parallel for simd linear(i)
219e4e893bbSAlexander Musman   for (int k = 0; k < argc; ++k) ++k;
220e4e893bbSAlexander Musman 
2212bbf7217SAlexey Bataev   foomain<int,char>(argc,argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}
222e4e893bbSAlexander Musman   return 0;
223e4e893bbSAlexander Musman }
224e4e893bbSAlexander Musman 
225