xref: /aosp_15_r20/external/clang/test/OpenMP/simd_linear_messages.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace X {
4*67e74705SXin Li   int x;
5*67e74705SXin Li };
6*67e74705SXin Li 
7*67e74705SXin Li struct B {
8*67e74705SXin Li   static int ib; // expected-note {{'B::ib' declared here}}
bfooB9*67e74705SXin Li   static int bfoo() { return 8; }
10*67e74705SXin Li };
11*67e74705SXin Li 
bfoo()12*67e74705SXin Li int bfoo() { return 4; }
13*67e74705SXin Li 
14*67e74705SXin Li int z;
15*67e74705SXin Li const int C1 = 1;
16*67e74705SXin Li const int C2 = 2;
test_linear_colons()17*67e74705SXin Li void test_linear_colons()
18*67e74705SXin Li {
19*67e74705SXin Li   int B = 0;
20*67e74705SXin Li   #pragma omp simd linear(B:bfoo())
21*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
22*67e74705SXin Li   // expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'}}
23*67e74705SXin Li   #pragma omp simd linear(B::ib:B:bfoo())
24*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
25*67e74705SXin Li   // expected-error@+1 {{use of undeclared identifier 'ib'; did you mean 'B::ib'}}
26*67e74705SXin Li   #pragma omp simd linear(B:ib)
27*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
28*67e74705SXin Li   // expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'?}}
29*67e74705SXin Li   #pragma omp simd linear(z:B:ib)
30*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
31*67e74705SXin Li   #pragma omp simd linear(B:B::bfoo())
32*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
33*67e74705SXin Li   #pragma omp simd linear(X::x : ::z)
34*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
35*67e74705SXin Li   #pragma omp simd linear(B,::z, X::x)
36*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
37*67e74705SXin Li   #pragma omp simd linear(::z)
38*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
39*67e74705SXin Li   // expected-error@+1 {{expected variable name}}
40*67e74705SXin Li   #pragma omp simd linear(B::bfoo())
41*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
42*67e74705SXin Li   #pragma omp simd linear(B::ib,B:C1+C2)
43*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
44*67e74705SXin Li }
45*67e74705SXin Li 
test_template(T * arr,N num)46*67e74705SXin Li template<int L, class T, class N> T test_template(T* arr, N num) {
47*67e74705SXin Li   N i;
48*67e74705SXin Li   T sum = (T)0;
49*67e74705SXin Li   T ind2 = - num * L; // expected-note {{'ind2' defined here}}
50*67e74705SXin Li   // expected-error@+1 {{argument of a linear clause should be of integral or pointer type}}
51*67e74705SXin Li #pragma omp simd linear(ind2:L)
52*67e74705SXin Li   for (i = 0; i < num; ++i) {
53*67e74705SXin Li     T cur = arr[(int)ind2];
54*67e74705SXin Li     ind2 += L;
55*67e74705SXin Li     sum += cur;
56*67e74705SXin Li   }
57*67e74705SXin Li   return T();
58*67e74705SXin Li }
59*67e74705SXin Li 
test_warn()60*67e74705SXin Li template<int LEN> int test_warn() {
61*67e74705SXin Li   int ind2 = 0;
62*67e74705SXin Li   // expected-warning@+1 {{zero linear step (ind2 should probably be const)}}
63*67e74705SXin Li   #pragma omp simd linear(ind2:LEN)
64*67e74705SXin Li   for (int i = 0; i < 100; i++) {
65*67e74705SXin Li     ind2 += LEN;
66*67e74705SXin Li   }
67*67e74705SXin Li   return ind2;
68*67e74705SXin Li }
69*67e74705SXin Li 
70*67e74705SXin Li struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
71*67e74705SXin Li extern S1 a;
72*67e74705SXin Li class S2 {
73*67e74705SXin Li   mutable int a;
74*67e74705SXin Li public:
S2()75*67e74705SXin Li   S2():a(0) { }
76*67e74705SXin Li };
77*67e74705SXin Li const S2 b; // expected-note 2 {{'b' defined here}}
78*67e74705SXin Li const S2 ba[5];
79*67e74705SXin Li class S3 {
80*67e74705SXin Li   int a;
81*67e74705SXin Li public:
S3()82*67e74705SXin Li   S3():a(0) { }
83*67e74705SXin Li };
84*67e74705SXin Li const S3 ca[5];
85*67e74705SXin Li class S4 {
86*67e74705SXin Li   int a;
87*67e74705SXin Li   S4();
88*67e74705SXin Li public:
S4(int v)89*67e74705SXin Li   S4(int v):a(v) { }
90*67e74705SXin Li };
91*67e74705SXin Li class S5 {
92*67e74705SXin Li   int a;
S5()93*67e74705SXin Li   S5():a(0) {}
94*67e74705SXin Li public:
S5(int v)95*67e74705SXin Li   S5(int v):a(v) { }
96*67e74705SXin Li };
97*67e74705SXin Li 
98*67e74705SXin Li S3 h;
99*67e74705SXin Li #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
100*67e74705SXin Li 
foomain(I argc,C ** argv)101*67e74705SXin Li template<class I, class C> int foomain(I argc, C **argv) {
102*67e74705SXin Li   I e(4);
103*67e74705SXin Li   I g(5);
104*67e74705SXin Li   int i;
105*67e74705SXin Li   int &j = i;
106*67e74705SXin Li   #pragma omp simd linear // expected-error {{expected '(' after 'linear'}}
107*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
108*67e74705SXin Li   #pragma omp simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
109*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
110*67e74705SXin Li   #pragma omp simd linear (val // expected-error {{use of undeclared identifier 'val'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
111*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
112*67e74705SXin Li   #pragma omp simd linear (uval( // expected-error {{expected expression}} expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}
113*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
114*67e74705SXin Li   #pragma omp simd linear (ref() // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
115*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
116*67e74705SXin Li   #pragma omp simd linear (foo() // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
117*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
118*67e74705SXin Li   #pragma omp simd linear () // expected-error {{expected expression}}
119*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
120*67e74705SXin Li   #pragma omp simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
121*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
122*67e74705SXin Li   #pragma omp simd linear (val argc // expected-error {{use of undeclared identifier 'val'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
123*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
124*67e74705SXin Li   #pragma omp simd linear (val(argc, // expected-error {{expected expression}} expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}
125*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
126*67e74705SXin Li   #pragma omp simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
127*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
128*67e74705SXin Li   #pragma omp simd linear (argc : 5)
129*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
130*67e74705SXin Li   #pragma omp simd linear (S1) // expected-error {{'S1' does not refer to a value}}
131*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
132*67e74705SXin Li   // expected-error@+2 {{linear variable with incomplete type 'S1'}}
133*67e74705SXin Li   // expected-error@+1 {{const-qualified variable cannot be linear}}
134*67e74705SXin Li   #pragma omp simd linear (val(a, b):B::ib)
135*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
136*67e74705SXin Li   #pragma omp simd linear (argv[1]) // expected-error {{expected variable name}}
137*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
138*67e74705SXin Li   #pragma omp simd linear(ref(e, g)) // expected-error 2 {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'ref'}}
139*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
140*67e74705SXin Li   #pragma omp simd linear(h) // expected-error {{threadprivate or thread local variable cannot be linear}}
141*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
142*67e74705SXin Li   #pragma omp simd linear(uval(i)) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}}
143*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
144*67e74705SXin Li   #pragma omp parallel
145*67e74705SXin Li   {
146*67e74705SXin Li     int v = 0;
147*67e74705SXin Li     int i;
148*67e74705SXin Li     #pragma omp simd linear(v:i)
149*67e74705SXin Li     for (int k = 0; k < argc; ++k) { i = k; v += i; }
150*67e74705SXin Li   }
151*67e74705SXin Li   #pragma omp simd linear(ref(j))
152*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
153*67e74705SXin Li   #pragma omp simd linear(uval(j))
154*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
155*67e74705SXin Li   int v = 0;
156*67e74705SXin Li   #pragma omp simd linear(v:j)
157*67e74705SXin Li   for (int k = 0; k < argc; ++k) { ++k; v += j; }
158*67e74705SXin Li   #pragma omp simd linear(i)
159*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
160*67e74705SXin Li   return 0;
161*67e74705SXin Li }
162*67e74705SXin Li 
163*67e74705SXin Li namespace A {
164*67e74705SXin Li double x;
165*67e74705SXin Li #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
166*67e74705SXin Li }
167*67e74705SXin Li namespace C {
168*67e74705SXin Li using A::x;
169*67e74705SXin Li }
170*67e74705SXin Li 
linear_modifiers(int argc)171*67e74705SXin Li void linear_modifiers(int argc) {
172*67e74705SXin Li   int &f = argc;
173*67e74705SXin Li   #pragma omp simd linear(f)
174*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
175*67e74705SXin Li   #pragma omp simd linear(val(f))
176*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
177*67e74705SXin Li   #pragma omp simd linear(uval(f))
178*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
179*67e74705SXin Li   #pragma omp simd linear(ref(f))
180*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
181*67e74705SXin Li   #pragma omp simd linear(foo(f)) // expected-error {{expected one of 'ref', val' or 'uval' modifiers}}
182*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
183*67e74705SXin Li }
184*67e74705SXin Li 
185*67e74705SXin Li int f;
main(int argc,char ** argv)186*67e74705SXin Li int main(int argc, char **argv) {
187*67e74705SXin Li   double darr[100];
188*67e74705SXin Li   // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}}
189*67e74705SXin Li   test_template<-4>(darr, 4);
190*67e74705SXin Li   // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}}
191*67e74705SXin Li   test_warn<0>();
192*67e74705SXin Li 
193*67e74705SXin Li   S4 e(4); // expected-note {{'e' defined here}}
194*67e74705SXin Li   S5 g(5); // expected-note {{'g' defined here}}
195*67e74705SXin Li   int i;
196*67e74705SXin Li   int &j = i;
197*67e74705SXin Li   #pragma omp simd linear(f) linear(f) // expected-error {{linear variable cannot be linear}} expected-note {{defined as linear}}
198*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
199*67e74705SXin Li   #pragma omp simd linear // expected-error {{expected '(' after 'linear'}}
200*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
201*67e74705SXin Li   #pragma omp simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
202*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
203*67e74705SXin Li   #pragma omp simd linear () // expected-error {{expected expression}}
204*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
205*67e74705SXin Li   #pragma omp simd linear (val // expected-error {{use of undeclared identifier 'val'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
206*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
207*67e74705SXin Li   #pragma omp simd linear (ref()) // expected-error {{expected expression}}
208*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
209*67e74705SXin Li   #pragma omp simd linear (foo()) // expected-error {{expected expression}}
210*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
211*67e74705SXin Li   #pragma omp simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
212*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
213*67e74705SXin Li   #pragma omp simd linear (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
214*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
215*67e74705SXin Li   #pragma omp simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
216*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
217*67e74705SXin Li   #pragma omp simd linear (argc)
218*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
219*67e74705SXin Li   #pragma omp simd linear (S1) // expected-error {{'S1' does not refer to a value}}
220*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
221*67e74705SXin Li   // expected-error@+2 {{linear variable with incomplete type 'S1'}}
222*67e74705SXin Li   // expected-error@+1 {{const-qualified variable cannot be linear}}
223*67e74705SXin Li   #pragma omp simd linear(a, b)
224*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
225*67e74705SXin Li   #pragma omp simd linear (argv[1]) // expected-error {{expected variable name}}
226*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
227*67e74705SXin Li   // expected-error@+2 {{argument of a linear clause should be of integral or pointer type, not 'S4'}}
228*67e74705SXin Li   // expected-error@+1 {{argument of a linear clause should be of integral or pointer type, not 'S5'}}
229*67e74705SXin Li   #pragma omp simd linear(val(e, g))
230*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
231*67e74705SXin Li   #pragma omp simd linear(h, C::x) // expected-error 2 {{threadprivate or thread local variable cannot be linear}}
232*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
233*67e74705SXin Li   #pragma omp parallel
234*67e74705SXin Li   {
235*67e74705SXin Li     int i;
236*67e74705SXin Li     #pragma omp simd linear(val(i))
237*67e74705SXin Li     for (int k = 0; k < argc; ++k) ++k;
238*67e74705SXin Li     #pragma omp simd linear(uval(i) : 4) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}}
239*67e74705SXin Li     for (int k = 0; k < argc; ++k) { ++k; i += 4; }
240*67e74705SXin Li   }
241*67e74705SXin Li   #pragma omp simd linear(ref(j))
242*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
243*67e74705SXin Li   #pragma omp simd linear(i)
244*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
245*67e74705SXin Li 
246*67e74705SXin Li   foomain<int,char>(argc,argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}
247*67e74705SXin Li   return 0;
248*67e74705SXin Li }
249*67e74705SXin Li 
250