1 // RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu -target-feature +altivec -target-feature +vsx -fsyntax-only -verify=expected,nonaix -std=c++11 %s
2 // RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -target-feature +altivec -fsyntax-only -verify=expected,novsx -std=c++11 %s
3 // RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu -target-feature +vsx -target-cpu pwr7 -fsyntax-only -verify=expected,nonaix -std=c++11 %s
4 // RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -target-feature -vsx -target-cpu pwr7 -fsyntax-only -verify=expected,novsx -std=c++11 %s
5 // RUN: %clang_cc1 -triple=powerpc-ibm-aix -target-feature +altivec -fsyntax-only -verify=expected,aix -std=c++11 %s
6 // RUN: %clang_cc1 -triple=powerpc64-ibm-aix -target-feature +altivec -fsyntax-only -verify=expected,aix -std=c++11 %s
10 __vector
signed char vv_sc
;
11 __vector
unsigned char vv_uc
;
13 __vector
signed short vv_ss
;
14 __vector
unsigned short vv_us
;
15 __vector
short int vv_si
;
16 __vector
signed short int vv_ssi
;
17 __vector
unsigned short int vv_usi
;
19 __vector
signed int vv_sint
;
20 __vector
unsigned int vv_ui
;
22 __vector
bool char vv_bc
;
23 __vector
bool short vv_bs
;
24 __vector
bool int vv_bi
;
25 __vector __bool
char vv___bc
;
26 __vector __bool
short vv___bs
;
27 __vector __bool
int vv___bi
;
28 __vector __pixel vv_p
;
31 void vf__a(__vector
int a
);
32 void vf__a2(int b
, __vector
int a
);
35 vector
signed char v_sc
;
36 vector
unsigned char v_uc
;
38 vector
signed short v_ss
;
39 vector
unsigned short v_us
;
40 vector
short int v_si
;
41 vector
signed short int v_ssi
;
42 vector
unsigned short int v_usi
;
44 vector
signed int v_sint
;
45 vector
unsigned int v_ui
;
47 vector
bool char v_bc
;
48 vector
bool short v_bs
;
50 vector __bool
char v___bc
;
51 vector __bool
short v___bs
;
52 vector __bool
int v___bi
;
56 void f_a(vector
int a
);
57 void f_a2(int b
, vector
int a
);
59 vector
int v
= (vector
int)(-1);
61 // These should have errors on AIX and warnings otherwise.
62 __vector
long vv_l
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
63 // aix-error@-1 {{cannot use 'long' with '__vector'}}
64 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
65 __vector
signed long vv_sl
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
66 // aix-error@-1 {{cannot use 'long' with '__vector'}}
67 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
68 __vector
unsigned long vv_ul
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
69 // aix-error@-1 {{cannot use 'long' with '__vector'}}
70 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
71 __vector
long int vv_li
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
72 // aix-error@-1 {{cannot use 'long' with '__vector'}}
73 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
74 __vector
signed long int vv_sli
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
75 // aix-error@-1 {{cannot use 'long' with '__vector'}}
76 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
77 __vector
unsigned long int vv_uli
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
78 // aix-error@-1 {{cannot use 'long' with '__vector'}}
79 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
80 vector
long v_l
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
81 // aix-error@-1 {{cannot use 'long' with '__vector'}}
82 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
83 vector
signed long v_sl
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
84 // aix-error@-1 {{cannot use 'long' with '__vector'}}
85 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
86 vector
unsigned long v_ul
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
87 // aix-error@-1 {{cannot use 'long' with '__vector'}}
88 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
89 vector
long int v_li
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
90 // aix-error@-1 {{cannot use 'long' with '__vector'}}
91 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
92 vector
signed long int v_sli
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
93 // aix-error@-1 {{cannot use 'long' with '__vector'}}
94 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
95 vector
unsigned long int v_uli
; // nonaix-warning {{Use of 'long' with '__vector' is deprecated}}
96 // aix-error@-1 {{cannot use 'long' with '__vector'}}
97 // novsx-error@-2 {{cannot use 'long' with '__vector'}}
99 // These should have warnings.
100 __vector
long double vv_ld
; // expected-error {{cannot use 'long double' with '__vector'}}
101 vector
long double v_ld
; // expected-error {{cannot use 'long double' with '__vector'}}
104 // These should have errors for non pwr7 vsx builds.
105 __vector
double vv_d1
; // expected-error {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}
106 vector
double v_d2
; // expected-error {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}
107 __vector
bool long long v_bll1
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
108 __vector __bool
long long v_bll2
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
109 vector
bool long long v_bll3
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
110 vector __bool
long long v_bll4
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
112 __vector
long double vv_ld3
; // expected-error {{cannot use 'long double' with '__vector'}}
113 vector
long double v_ld4
; // expected-error {{cannot use 'long double' with '__vector'}}
114 // FIXME: why is this diagnostic different from the others?
115 vector
bool v_b
; // expected-error {{a type specifier is required for all declarations}}
116 vector
bool float v_bf
; // expected-error {{cannot use 'float' with '__vector bool'}}
117 vector
bool double v_bd
; // expected-error {{cannot use 'double' with '__vector bool'}}
118 vector
bool pixel v_bp
; // expected-error {{cannot use '__pixel' with '__vector bool'}}
119 vector
bool signed char v_bsc
; // expected-error {{cannot use 'signed' with '__vector bool'}}
120 vector
bool unsigned int v_bsc2
; // expected-error {{cannot use 'unsigned' with '__vector bool'}}
121 vector
bool long v_bl
; // expected-error {{cannot use 'long' with '__vector bool'}}
122 vector __bool
float v___bf
; // expected-error {{cannot use 'float' with '__vector bool'}}
123 vector __bool
double v___bd
; // expected-error {{cannot use 'double' with '__vector bool'}}
124 vector __bool pixel v___bp
; // expected-error {{cannot use '__pixel' with '__vector bool'}}
125 vector __bool
signed char v___bsc
; // expected-error {{cannot use 'signed' with '__vector bool'}}
126 vector __bool
unsigned int v___bsc2
; // expected-error {{cannot use 'unsigned' with '__vector bool'}}
127 vector __bool
long v___bl
; // expected-error {{cannot use 'long' with '__vector bool'}}
130 // vector long is deprecated, but vector long long is not.
131 vector
long long v_ll
;
132 vector
signed long long v_sll
;
133 vector
unsigned long long v_ull
;
135 // vector long long is not supported without vsx.
136 vector
long long v_ll
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
137 vector
signed long long v_sll
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
138 vector
unsigned long long v_ull
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
142 __vector
unsigned int v
= {0,0,0,0};
143 __vector
int v__cast
= (__vector
int)v
;
144 __vector
int v_cast
= (vector
int)v
;
145 __vector
char vb_cast
= (vector
char)v
;
147 // Check some casting between gcc and altivec vectors.
148 #define gccvector __attribute__((vector_size(16)))
149 gccvector
unsigned int gccv
= {0,0,0,0};
150 gccvector
unsigned int gccv1
= gccv
;
151 gccvector
int gccv2
= (gccvector
int)gccv
;
152 gccvector
unsigned int gccv3
= v
;
153 __vector
unsigned int av
= gccv
;
154 __vector
int avi
= (__vector
int)gccv
;
155 gccvector
unsigned int gv
= v
;
156 gccvector
int gvi
= (gccvector
int)v
;
157 __attribute__((vector_size(8))) unsigned int gv8
;
158 gv8
= gccv
; // expected-error {{assigning to '__attribute__((__vector_size__(2 * sizeof(unsigned int)))) unsigned int' (vector of 2 'unsigned int' values) from incompatible type '__attribute__((__vector_size__(4 * sizeof(unsigned int)))) unsigned int' (vector of 4 'unsigned int' values)}}
159 av
= gv8
; // expected-error {{assigning to '__vector unsigned int' (vector of 4 'unsigned int' values) from incompatible type '__attribute__((__vector_size__(2 * sizeof(unsigned int)))) unsigned int' (vector of 2 'unsigned int' values)}}
162 __vector
unsigned int tv
= gccv
;
164 gccvector
unsigned int tgv
= v
;
167 // Now for the C++ version:
172 void f__a(__vector
int a
);
173 void f__a2(int b
, __vector
int a
);
179 void f__a(vector
int a
);
180 void f__a2(int b
, vector
int a
);
184 // bug 6895 - Vectorl literal casting confusion.
185 vector
char v1
= (vector
char)((vector
int)(1, 2, 3, 4));
186 vector
char v2
= (vector
char)((vector
float)(1.0f
, 2.0f
, 3.0f
, 4.0f
));
187 vector
char v3
= (vector
char)((vector
int)('a', 'b', 'c', 'd'));
188 vector
int v4
= (vector
int)(1, 2, 3, 4);
189 vector
float v5
= (vector
float)(1.0f
, 2.0f
, 3.0f
, 4.0f
);
190 vector
char v6
= (vector
char)((vector
int)(1+2, -2, (int)(2.0 * 3), -(5-3)));
192 // bug 7553 - Problem with '==' and vectors
195 res_b
= (vv_sc
== vv_sc
);
196 res_b
= (vv_uc
!= vv_uc
);
197 res_b
= (vv_s
> vv_s
);
198 res_b
= (vv_us
>= vv_us
);
199 res_b
= (vv_i
< vv_i
);
200 res_b
= (vv_ui
<= vv_ui
);
201 res_b
= (vv_f
<= vv_f
);
204 // vecreturn attribute test
208 } __attribute__((vecreturn
));
210 Vector
Add(Vector lhs
, Vector rhs
)
213 result
.xyzw
= vec_add(lhs
.xyzw
, rhs
.xyzw
);
214 return result
; // This will (eventually) be returned in a register
217 // vecreturn attribute test - should error because of virtual function.
218 class VectorClassNonPod
222 VectorClassNonPod() {}
223 virtual ~VectorClassNonPod() {}
224 } __attribute__((vecreturn
)); // expected-error {{the vecreturn attribute can only be used on a POD (plain old data) class or structure (i.e. no virtual functions)}}
226 // vecreturn attribute test - should error because of virtual function.
227 class VectorClassMultipleMembers
232 } __attribute__((vecreturn
)); // expected-error {{the vecreturn attribute can only be used on a class or structure with one member, which must be a vector}}
234 template<typename
... Args
> void PR16874() {
235 (void) (Args::foo()...); // expected-error {{expression contains unexpanded parameter pack 'Args'}} expected-error {{expected ')'}} expected-note {{to match this '('}}