xref: /aosp_15_r20/external/clang/test/OpenMP/declare_simd_messages.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple=x86_64-pc-win32 -verify -fopenmp -x c++ -std=c++11 -fms-extensions %s
2*67e74705SXin Li 
3*67e74705SXin Li // expected-error@+1 {{expected an OpenMP directive}}
4*67e74705SXin Li #pragma omp declare
5*67e74705SXin Li 
6*67e74705SXin Li // expected-error@+2 {{'#pragma omp declare simd' can only be applied to functions}}
7*67e74705SXin Li #pragma omp declare simd
8*67e74705SXin Li int a;
9*67e74705SXin Li // expected-error@+2 {{'#pragma omp declare simd' can only be applied to functions}}
10*67e74705SXin Li #pragma omp declare simd
11*67e74705SXin Li #pragma omp threadprivate(a)
12*67e74705SXin Li int var;
13*67e74705SXin Li #pragma omp threadprivate(var)
14*67e74705SXin Li 
15*67e74705SXin Li // expected-error@+2 {{expected an OpenMP directive}} expected-error@+1 {{function declaration is expected after 'declare simd' directive}}
16*67e74705SXin Li #pragma omp declare simd
17*67e74705SXin Li #pragma omp declare
18*67e74705SXin Li 
19*67e74705SXin Li // expected-error@+3 {{function declaration is expected after 'declare simd' directive}}
20*67e74705SXin Li // expected-error@+1 {{function declaration is expected after 'declare simd' directive}}
21*67e74705SXin Li #pragma omp declare simd
22*67e74705SXin Li #pragma omp declare simd
23*67e74705SXin Li #pragma options align=packed
24*67e74705SXin Li int main();
25*67e74705SXin Li 
26*67e74705SXin Li // expected-error@+3 {{function declaration is expected after 'declare simd' directive}}
27*67e74705SXin Li // expected-error@+1 {{function declaration is expected after 'declare simd' directive}}
28*67e74705SXin Li #pragma omp declare simd
29*67e74705SXin Li #pragma omp declare simd
30*67e74705SXin Li #pragma init_seg(compiler)
31*67e74705SXin Li int main();
32*67e74705SXin Li 
33*67e74705SXin Li // expected-error@+1 {{single declaration is expected after 'declare simd' directive}}
34*67e74705SXin Li #pragma omp declare simd
35*67e74705SXin Li // expected-note@+1 {{declared here}}
36*67e74705SXin Li int b, c;
37*67e74705SXin Li 
38*67e74705SXin Li // expected-error@+1 {{'C' does not refer to a value}}
39*67e74705SXin Li #pragma omp declare simd simdlen(C)
40*67e74705SXin Li // expected-note@+1 {{declared here}}
41*67e74705SXin Li template <class C>
h(C * hp,C * hp2,C * hq,C * lin)42*67e74705SXin Li void h(C *hp, C *hp2, C *hq, C *lin) {
43*67e74705SXin Li   b = 0;
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li #pragma omp declare simd
47*67e74705SXin Li template <>
h(int * hp,int * hp2,int * hq,int * lin)48*67e74705SXin Li void h(int *hp, int *hp2, int *hq, int *lin) {
49*67e74705SXin Li   h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
50*67e74705SXin Li }
51*67e74705SXin Li 
52*67e74705SXin Li #pragma omp declare simd inbranch inbranch
53*67e74705SXin Li #pragma omp declare simd notinbranch notinbranch
54*67e74705SXin Li #pragma omp declare simd inbranch inbranch notinbranch // expected-error {{unexpected 'notinbranch' clause, 'inbranch' is specified already}}
55*67e74705SXin Li #pragma omp declare simd notinbranch notinbranch inbranch // expected-error {{unexpected 'inbranch' clause, 'notinbranch' is specified already}}
56*67e74705SXin Li // expected-note@+2 {{read of non-const variable 'b' is not allowed in a constant expression}}
57*67e74705SXin Li // expected-error@+1 {{expression is not an integral constant expression}}
58*67e74705SXin Li #pragma omp declare simd simdlen(b)
59*67e74705SXin Li // expected-error@+1 {{directive '#pragma omp declare simd' cannot contain more than one 'simdlen' clause}}
60*67e74705SXin Li #pragma omp declare simd simdlen(32) simdlen(c)
61*67e74705SXin Li // expected-error@+1 {{expected '(' after 'simdlen'}}
62*67e74705SXin Li #pragma omp declare simd simdlen
63*67e74705SXin Li // expected-note@+3 {{to match this '('}}
64*67e74705SXin Li // expected-error@+2 {{expected ')'}}
65*67e74705SXin Li // expected-error@+1 {{expected expression}}
66*67e74705SXin Li #pragma omp declare simd simdlen(
67*67e74705SXin Li // expected-error@+2 {{expected '(' after 'simdlen'}}
68*67e74705SXin Li // expected-error@+1 {{expected expression}}
69*67e74705SXin Li #pragma omp declare simd simdlen(), simdlen
70*67e74705SXin Li // expected-error@+1 2 {{expected expression}}
71*67e74705SXin Li #pragma omp declare simd simdlen(), simdlen()
72*67e74705SXin Li // expected-warning@+3 {{extra tokens at the end of '#pragma omp declare simd' are ignored}}
73*67e74705SXin Li // expected-error@+2 {{expected '(' after 'simdlen'}}
74*67e74705SXin Li // expected-error@+1 {{expected expression}}
75*67e74705SXin Li #pragma omp declare simd simdlen() simdlen)
76*67e74705SXin Li void foo();
77*67e74705SXin Li 
78*67e74705SXin Li // expected-error@+3 4 {{expected reference to one of the parameters of function 'foo'}}
79*67e74705SXin Li // expected-error@+2 {{invalid use of 'this' outside of a non-static member function}}
80*67e74705SXin Li // expected-error@+1 {{argument to 'simdlen' clause must be a strictly positive integer value}}
81*67e74705SXin Li #pragma omp declare simd simdlen(N) uniform(this, var) aligned(var)
82*67e74705SXin Li template<int N>
foo()83*67e74705SXin Li void foo() {}
84*67e74705SXin Li 
test()85*67e74705SXin Li void test() {
86*67e74705SXin Li   // expected-note@+1 {{in instantiation of function template specialization 'foo<-3>' requested here}}
87*67e74705SXin Li   foo<-3>();
88*67e74705SXin Li }
89*67e74705SXin Li 
90*67e74705SXin Li // expected-error@+1 {{expected '(' after 'uniform'}}
91*67e74705SXin Li #pragma omp declare simd uniform
92*67e74705SXin Li // expected-note@+3 {{to match this '('}}
93*67e74705SXin Li // expected-error@+2 {{expected ')'}}
94*67e74705SXin Li // expected-error@+1 {{expected expression}}
95*67e74705SXin Li #pragma omp declare simd uniform(
96*67e74705SXin Li // expected-error@+1 {{expected expression}}
97*67e74705SXin Li #pragma omp declare simd uniform()
98*67e74705SXin Li // expected-note@+3 {{to match this '('}}
99*67e74705SXin Li // expected-error@+2 {{expected ')'}}
100*67e74705SXin Li // expected-error@+1 {{invalid use of 'this' outside of a non-static member function}}
101*67e74705SXin Li #pragma omp declare simd uniform(this
102*67e74705SXin Li // expected-note@+3 {{to match this '('}}
103*67e74705SXin Li // expected-error@+2 {{expected ')'}}
104*67e74705SXin Li // expected-error@+1 {{invalid use of 'this' outside of a non-static member function}}
105*67e74705SXin Li #pragma omp declare simd uniform(this,a
106*67e74705SXin Li // expected-error@+1 {{expected expression}}
107*67e74705SXin Li #pragma omp declare simd uniform(,a)
108*67e74705SXin Li // expected-error@+1 {{expected '(' after 'aligned'}}
109*67e74705SXin Li #pragma omp declare simd aligned
110*67e74705SXin Li // expected-note@+3 {{to match this '('}}
111*67e74705SXin Li // expected-error@+2 {{expected ')'}}
112*67e74705SXin Li // expected-error@+1 {{expected expression}}
113*67e74705SXin Li #pragma omp declare simd aligned(
114*67e74705SXin Li // expected-error@+1 {{expected expression}}
115*67e74705SXin Li #pragma omp declare simd aligned()
116*67e74705SXin Li // expected-note@+3 {{to match this '('}}
117*67e74705SXin Li // expected-error@+2 {{expected ')'}}
118*67e74705SXin Li // expected-error@+1 {{expected expression}}
119*67e74705SXin Li #pragma omp declare simd aligned(a:
120*67e74705SXin Li // expected-error@+1 {{expected expression}}
121*67e74705SXin Li #pragma omp declare simd aligned(a:)
122*67e74705SXin Li // expected-warning@+2 {{extra tokens at the end of '#pragma omp declare simd' are ignored}}
123*67e74705SXin Li // expected-error@+1 {{expected '(' after 'aligned'}}
124*67e74705SXin Li #pragma omp declare simd aligned :)
125*67e74705SXin Li // expected-note@+3 {{to match this '('}}
126*67e74705SXin Li // expected-error@+2 {{expected ')'}}
127*67e74705SXin Li // expected-error@+1 {{invalid use of 'this' outside of a non-static member function}}
128*67e74705SXin Li #pragma omp declare simd aligned(this
129*67e74705SXin Li // expected-note@+3 {{to match this '('}}
130*67e74705SXin Li // expected-error@+2 {{expected ')'}}
131*67e74705SXin Li // expected-error@+1 {{invalid use of 'this' outside of a non-static member function}}
132*67e74705SXin Li #pragma omp declare simd aligned(this,b
133*67e74705SXin Li // expected-error@+1 {{expected expression}}
134*67e74705SXin Li #pragma omp declare simd aligned(, b)
135*67e74705SXin Li // expected-note@+4 {{defined as aligned}}
136*67e74705SXin Li // expected-error@+3 {{a parameter cannot appear in more than one aligned clause}}
137*67e74705SXin Li // expected-error@+2 {{expected expression}}
138*67e74705SXin Li // expected-error@+1 {{expected ',' or ')' in 'aligned' clause}}
139*67e74705SXin Li #pragma omp declare simd aligned(b) aligned(b ; 64)
140*67e74705SXin Li // expected-note@+2 {{defined as aligned}}
141*67e74705SXin Li // expected-error@+1 {{a parameter cannot appear in more than one aligned clause}}
142*67e74705SXin Li #pragma omp declare simd aligned(b) aligned(b: 64)
143*67e74705SXin Li // expected-error@+1 {{argument to 'aligned' clause must be a strictly positive integer value}}
144*67e74705SXin Li #pragma omp declare simd aligned(b: -1)
145*67e74705SXin Li // expected-warning@+1 {{aligned clause will be ignored because the requested alignment is not a power of 2}}
146*67e74705SXin Li #pragma omp declare simd aligned(b: 3)
147*67e74705SXin Li // expected-error@+1 {{expected '(' after 'linear'}}
148*67e74705SXin Li #pragma omp declare simd linear
149*67e74705SXin Li // expected-note@+3 {{to match this '('}}
150*67e74705SXin Li // expected-error@+2 {{expected ')'}}
151*67e74705SXin Li // expected-error@+1 {{expected expression}}
152*67e74705SXin Li #pragma omp declare simd linear(
153*67e74705SXin Li // expected-error@+1 {{expected expression}}
154*67e74705SXin Li #pragma omp declare simd linear()
155*67e74705SXin Li // expected-note@+3 {{to match this '('}}
156*67e74705SXin Li // expected-error@+2 {{expected ')'}}
157*67e74705SXin Li // expected-error@+1 {{expected expression}}
158*67e74705SXin Li #pragma omp declare simd linear(a:
159*67e74705SXin Li // expected-error@+1 {{expected expression}}
160*67e74705SXin Li #pragma omp declare simd linear(a:)
161*67e74705SXin Li // expected-warning@+2 {{extra tokens at the end of '#pragma omp declare simd' are ignored}}
162*67e74705SXin Li // expected-error@+1 {{expected '(' after 'linear'}}
163*67e74705SXin Li #pragma omp declare simd linear :)
164*67e74705SXin Li // expected-note@+3 {{to match this '('}}
165*67e74705SXin Li // expected-error@+2 {{expected ')'}}
166*67e74705SXin Li // expected-error@+1 {{invalid use of 'this' outside of a non-static member function}}
167*67e74705SXin Li #pragma omp declare simd linear(this
168*67e74705SXin Li // expected-note@+3 {{to match this '('}}
169*67e74705SXin Li // expected-error@+2 {{expected ')'}}
170*67e74705SXin Li // expected-error@+1 {{invalid use of 'this' outside of a non-static member function}}
171*67e74705SXin Li #pragma omp declare simd linear(this,b
172*67e74705SXin Li // expected-error@+1 {{expected expression}}
173*67e74705SXin Li #pragma omp declare simd linear(, b)
174*67e74705SXin Li // expected-note@+4 {{defined as linear}}
175*67e74705SXin Li // expected-error@+3 {{linear variable cannot be linear}}
176*67e74705SXin Li // expected-error@+2 {{expected expression}}
177*67e74705SXin Li // expected-error@+1 {{expected ',' or ')' in 'linear' clause}}
178*67e74705SXin Li #pragma omp declare simd linear(b) linear(b ; 64)
179*67e74705SXin Li // expected-note@+2 {{defined as linear}}
180*67e74705SXin Li // expected-error@+1 {{linear variable cannot be linear}}
181*67e74705SXin Li #pragma omp declare simd linear(b) linear(b: 64)
182*67e74705SXin Li #pragma omp declare simd linear(b: -1)
183*67e74705SXin Li #pragma omp declare simd linear(b: 3)
184*67e74705SXin Li // expected-error@+1 {{expected a reference to a parameter specified in a 'uniform' clause}}
185*67e74705SXin Li #pragma omp declare simd linear(b: a)
186*67e74705SXin Li // expected-note@+2 {{defined as uniform}}
187*67e74705SXin Li // expected-error@+1 {{linear variable cannot be uniform}}
188*67e74705SXin Li #pragma omp declare simd uniform(a), linear(a: 4)
189*67e74705SXin Li // expected-note@+2 {{defined as uniform}}
190*67e74705SXin Li // expected-error@+1 {{linear variable cannot be uniform}}
191*67e74705SXin Li #pragma omp declare simd linear(a: 4) uniform(a)
192*67e74705SXin Li // expected-error@+1 {{variable of non-reference type 'int *' can be used only with 'val' modifier, but used with 'uval'}}
193*67e74705SXin Li #pragma omp declare simd linear(uval(b))
194*67e74705SXin Li // expected-error@+1 {{variable of non-reference type 'int *' can be used only with 'val' modifier, but used with 'ref'}}
195*67e74705SXin Li #pragma omp declare simd linear(ref(b))
196*67e74705SXin Li // expected-error@+1 {{expected one of 'ref', val' or 'uval' modifiers}}
197*67e74705SXin Li #pragma omp declare simd linear(uref(b))
198*67e74705SXin Li void bar(int a, int *b);
199*67e74705SXin Li 
200*67e74705SXin Li template <class T>
201*67e74705SXin Li struct St {
202*67e74705SXin Li // expected-error@+2 {{function declaration is expected after 'declare simd' directive}}
203*67e74705SXin Li #pragma init_seg(compiler)
204*67e74705SXin Li #pragma omp declare simd
205*67e74705SXin Li #pragma init_seg(compiler)
206*67e74705SXin Li // expected-note@+7 {{defined as uniform}}
207*67e74705SXin Li // expected-error@+6 {{expected a reference to a parameter specified in a 'uniform' clause}}
208*67e74705SXin Li // expected-error@+5 {{linear variable cannot be uniform}}
209*67e74705SXin Li // expected-note@+4 {{defined as aligned}}
210*67e74705SXin Li // expected-error@+3 {{argument to 'aligned' clause must be a strictly positive integer value}}
211*67e74705SXin Li // expected-error@+2 {{'this' cannot appear in more than one aligned clause}}
212*67e74705SXin Li // expected-error@+1 {{use of undeclared identifier 't'}}
213*67e74705SXin Li #pragma omp declare simd uniform(this, t) aligned(this: 4) aligned(this: -4) linear(this: hp)
hSt214*67e74705SXin Li   void h(T *hp) {
215*67e74705SXin Li // expected-error@+1 {{unexpected OpenMP directive '#pragma omp declare simd'}}
216*67e74705SXin Li #pragma omp declare simd
217*67e74705SXin Li     *hp = *t;
218*67e74705SXin Li   }
219*67e74705SXin Li 
220*67e74705SXin Li private:
221*67e74705SXin Li   T t;
222*67e74705SXin Li };
223*67e74705SXin Li 
224*67e74705SXin Li namespace N {
225*67e74705SXin Li   // expected-error@+1 {{function declaration is expected after 'declare simd' directive}}
226*67e74705SXin Li   #pragma omp declare simd
227*67e74705SXin Li }
228*67e74705SXin Li // expected-error@+1 {{function declaration is expected after 'declare simd' directive}}
229*67e74705SXin Li #pragma omp declare simd
230*67e74705SXin Li // expected-error@+1 {{function declaration is expected after 'declare simd' directive}}
231*67e74705SXin Li #pragma omp declare simd
232