xref: /aosp_15_r20/external/clang/test/OpenMP/simd_aligned_messages.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -x c++ -std=c++11 -verify -fopenmp %s
2*67e74705SXin Li 
3*67e74705SXin Li struct B {
4*67e74705SXin Li   static int ib[20]; // expected-note 0 {{'B::ib' declared here}}
bfooB5*67e74705SXin Li   static constexpr int bfoo() { return 8; }
6*67e74705SXin Li };
7*67e74705SXin Li namespace X {
8*67e74705SXin Li   B x; // expected-note {{'x' defined here}}
9*67e74705SXin Li };
bfoo()10*67e74705SXin Li constexpr int bfoo() { return 4; }
11*67e74705SXin Li 
12*67e74705SXin Li int **z;
13*67e74705SXin Li const int C1 = 1;
14*67e74705SXin Li const int C2 = 2;
test_aligned_colons(int * & rp)15*67e74705SXin Li void test_aligned_colons(int *&rp)
16*67e74705SXin Li {
17*67e74705SXin Li   int *B = 0;
18*67e74705SXin Li   #pragma omp simd aligned(B:bfoo())
19*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
20*67e74705SXin Li   // expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'}}
21*67e74705SXin Li   #pragma omp simd aligned(B::ib:B:bfoo())
22*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
23*67e74705SXin Li   #pragma omp simd aligned(B:B::bfoo())
24*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
25*67e74705SXin Li   // expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'?}}
26*67e74705SXin Li   #pragma omp simd aligned(z:B:bfoo())
27*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
28*67e74705SXin Li   #pragma omp simd aligned(B:B::bfoo())
29*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
30*67e74705SXin Li   // expected-error@+2 {{integral constant expression must have integral or unscoped enumeration type, not 'int **'}}
31*67e74705SXin Li   // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'B'}}
32*67e74705SXin Li   #pragma omp simd aligned(X::x : ::z)
33*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
34*67e74705SXin Li   // expected-error@+1 {{integral constant expression must have integral or unscoped enumeration type, not 'B'}}
35*67e74705SXin Li   #pragma omp simd aligned(B,rp,::z: X::x)
36*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
37*67e74705SXin Li   #pragma omp simd aligned(::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 aligned(B::bfoo())
41*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
42*67e74705SXin Li   // expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
43*67e74705SXin Li   #pragma omp simd aligned(B::ib,B:C1+C2)
44*67e74705SXin Li   for (int i = 0; i < 10; ++i) ;
45*67e74705SXin Li }
46*67e74705SXin Li 
47*67e74705SXin Li // expected-note@+1 {{'num' defined here}}
test_template(T * arr,N num)48*67e74705SXin Li template<int L, class T, class N> T test_template(T* arr, N num) {
49*67e74705SXin Li   N i;
50*67e74705SXin Li   T sum = (T)0;
51*67e74705SXin Li   T ind2 = - num * L;
52*67e74705SXin Li   // Negative number is passed as L.
53*67e74705SXin Li   // expected-error@+1 {{argument to 'aligned' clause must be a strictly positive integer value}}
54*67e74705SXin Li   #pragma omp simd aligned(arr:L)
55*67e74705SXin Li   for (i = 0; i < num; ++i) {
56*67e74705SXin Li     T cur = arr[(int)ind2];
57*67e74705SXin Li     ind2 += L;
58*67e74705SXin Li     sum += cur;
59*67e74705SXin Li   }
60*67e74705SXin Li   // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}}
61*67e74705SXin Li   #pragma omp simd aligned(num:4)
62*67e74705SXin Li   for (i = 0; i < num; ++i);
63*67e74705SXin Li   return T();
64*67e74705SXin Li }
65*67e74705SXin Li 
test_warn()66*67e74705SXin Li template<int LEN> int test_warn() {
67*67e74705SXin Li   int *ind2 = 0;
68*67e74705SXin Li   // expected-error@+1 {{argument to 'aligned' clause must be a strictly positive integer value}}
69*67e74705SXin Li   #pragma omp simd aligned(ind2:LEN)
70*67e74705SXin Li   for (int i = 0; i < 100; i++) {
71*67e74705SXin Li     ind2 += LEN;
72*67e74705SXin Li   }
73*67e74705SXin Li   return 0;
74*67e74705SXin Li }
75*67e74705SXin Li 
76*67e74705SXin Li struct S1; // expected-note 2 {{declared here}}
77*67e74705SXin Li extern S1 a; // expected-note {{'a' declared here}}
78*67e74705SXin Li class S2 {
79*67e74705SXin Li   mutable int a;
80*67e74705SXin Li public:
S2()81*67e74705SXin Li   S2():a(0) { }
82*67e74705SXin Li };
83*67e74705SXin Li const S2 b; // expected-note 1 {{'b' defined here}}
84*67e74705SXin Li const S2 ba[5];
85*67e74705SXin Li class S3 {
86*67e74705SXin Li   int a;
87*67e74705SXin Li public:
S3()88*67e74705SXin Li   S3():a(0) { }
89*67e74705SXin Li };
90*67e74705SXin Li const S3 ca[5];
91*67e74705SXin Li class S4 {
92*67e74705SXin Li   int a;
93*67e74705SXin Li   S4();
94*67e74705SXin Li public:
S4(int v)95*67e74705SXin Li   S4(int v):a(v) { }
96*67e74705SXin Li };
97*67e74705SXin Li class S5 {
98*67e74705SXin Li   int a;
S5()99*67e74705SXin Li   S5():a(0) {}
100*67e74705SXin Li public:
S5(int v)101*67e74705SXin Li   S5(int v):a(v) { }
102*67e74705SXin Li };
103*67e74705SXin Li 
104*67e74705SXin Li S3 h; // expected-note 2 {{'h' defined here}}
105*67e74705SXin Li #pragma omp threadprivate(h)
106*67e74705SXin Li 
foomain(I argc,C ** argv)107*67e74705SXin Li template<class I, class C> int foomain(I argc, C **argv) {
108*67e74705SXin Li   I e(argc);
109*67e74705SXin Li   I g(argc);
110*67e74705SXin Li   int i; // expected-note {{declared here}} expected-note {{'i' defined here}}
111*67e74705SXin Li   // expected-note@+2 {{declared here}}
112*67e74705SXin Li   // expected-note@+1 {{reference to 'i' is not a constant expression}}
113*67e74705SXin Li   int &j = i;
114*67e74705SXin Li   #pragma omp simd aligned // expected-error {{expected '(' after 'aligned'}}
115*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
116*67e74705SXin Li   #pragma omp simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
117*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
118*67e74705SXin Li   #pragma omp simd aligned () // expected-error {{expected expression}}
119*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
120*67e74705SXin Li   #pragma omp simd aligned (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
121*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
122*67e74705SXin Li   #pragma omp simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
123*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
124*67e74705SXin Li   #pragma omp simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
125*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
126*67e74705SXin Li   #pragma omp simd aligned (argc : 5) // expected-warning {{aligned clause will be ignored because the requested alignment is not a power of 2}}
127*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
128*67e74705SXin Li   #pragma omp simd aligned (S1) // expected-error {{'S1' does not refer to a value}}
129*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
130*67e74705SXin Li   #pragma omp simd aligned (argv[1]) // expected-error {{expected variable name}}
131*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
132*67e74705SXin Li   #pragma omp simd aligned(e, g)
133*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
134*67e74705SXin Li   // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}}
135*67e74705SXin Li   #pragma omp simd aligned(h)
136*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
137*67e74705SXin Li   // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}}
138*67e74705SXin Li   #pragma omp simd aligned(i)
139*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
140*67e74705SXin Li   #pragma omp parallel
141*67e74705SXin Li   {
142*67e74705SXin Li     int *v = 0;
143*67e74705SXin Li     I i;
144*67e74705SXin Li     #pragma omp simd aligned(v:16)
145*67e74705SXin Li     for (I k = 0; k < argc; ++k) { i = k; v += 2; }
146*67e74705SXin Li   }
147*67e74705SXin Li   float *f;
148*67e74705SXin Li   #pragma omp simd aligned(f)
149*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
150*67e74705SXin Li   int v = 0;
151*67e74705SXin Li   // expected-note@+2 {{initializer of 'j' is not a constant expression}}
152*67e74705SXin Li   // expected-error@+1 {{expression is not an integral constant expression}}
153*67e74705SXin Li   #pragma omp simd aligned(f:j)
154*67e74705SXin Li   for (I k = 0; k < argc; ++k) { ++k; v += j; }
155*67e74705SXin Li   #pragma omp simd aligned(f)
156*67e74705SXin Li   for (I k = 0; k < argc; ++k) ++k;
157*67e74705SXin Li   return 0;
158*67e74705SXin Li }
159*67e74705SXin Li 
160*67e74705SXin Li // expected-note@+1 2 {{'argc' defined here}}
main(int argc,char ** argv)161*67e74705SXin Li int main(int argc, char **argv) {
162*67e74705SXin Li   double darr[100];
163*67e74705SXin Li   // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}}
164*67e74705SXin Li   test_template<-4>(darr, 4);
165*67e74705SXin Li   test_warn<4>(); // ok
166*67e74705SXin Li   // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}}
167*67e74705SXin Li   test_warn<0>();
168*67e74705SXin Li 
169*67e74705SXin Li   int i;
170*67e74705SXin Li   int &j = i;
171*67e74705SXin Li   #pragma omp simd aligned // expected-error {{expected '(' after 'aligned'}}
172*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
173*67e74705SXin Li   #pragma omp simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
174*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
175*67e74705SXin Li   #pragma omp simd aligned () // expected-error {{expected expression}}
176*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
177*67e74705SXin Li   #pragma omp simd aligned (argv // expected-error {{expected ')'}} expected-note {{to match this '('}}
178*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
179*67e74705SXin Li   // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}}
180*67e74705SXin Li   #pragma omp simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
181*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
182*67e74705SXin Li   #pragma omp simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
183*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
184*67e74705SXin Li   // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}}
185*67e74705SXin Li   #pragma omp simd aligned (argc)
186*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
187*67e74705SXin Li   #pragma omp simd aligned (S1) // expected-error {{'S1' does not refer to a value}}
188*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
189*67e74705SXin Li   // expected-error@+2 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S1'}}
190*67e74705SXin Li   // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S2'}}
191*67e74705SXin Li   #pragma omp simd aligned (a, b)
192*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
193*67e74705SXin Li   #pragma omp simd aligned (argv[1]) // expected-error {{expected variable name}}
194*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
195*67e74705SXin Li   // expected-error@+1 {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}}
196*67e74705SXin Li   #pragma omp simd aligned(h)
197*67e74705SXin Li   for (int k = 0; k < argc; ++k) ++k;
198*67e74705SXin Li   int *pargc = &argc;
199*67e74705SXin Li   // expected-note@+1 {{in instantiation of function template specialization 'foomain<int *, char>' requested here}}
200*67e74705SXin Li   foomain<int*,char>(pargc,argv);
201*67e74705SXin Li   return 0;
202*67e74705SXin Li }
203*67e74705SXin Li 
204