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 vector
float _Complex v_cf
; // expected-error {{cannot use '_Complex' with '__vector'}}
115 vector
double _Complex v_cd
; // expected-error {{cannot use '_Complex' with '__vector'}}
116 vector
long double _Complex v_cld
; // expected-error {{cannot use '_Complex' with '__vector'}}
117 __vector
float _Complex v_cf2
; // expected-error {{cannot use '_Complex' with '__vector'}}
118 __vector
double _Complex v_cd2
; // expected-error {{cannot use '_Complex' with '__vector'}}
119 __vector
long double _Complex v_cld2
;// expected-error {{cannot use '_Complex' with '__vector'}}
120 // FIXME: why is this diagnostic different from the others?
121 vector
bool v_b
; // expected-error {{a type specifier is required for all declarations}}
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'}}
128 vector __bool
float v___bf
; // expected-error {{cannot use 'float' with '__vector bool'}}
129 vector __bool
double v___bd
; // expected-error {{cannot use 'double' with '__vector bool'}}
130 vector __bool pixel v___bp
; // expected-error {{cannot use '__pixel' with '__vector bool'}}
131 vector __bool
signed char v___bsc
; // expected-error {{cannot use 'signed' with '__vector bool'}}
132 vector __bool
unsigned int v___bsc2
; // expected-error {{cannot use 'unsigned' with '__vector bool'}}
133 vector __bool
long v___bl
; // expected-error {{cannot use 'long' with '__vector bool'}}
136 // vector long is deprecated, but vector long long is not.
137 vector
long long v_ll
;
138 vector
signed long long v_sll
;
139 vector
unsigned long long v_ull
;
141 // vector long long is not supported without vsx.
142 vector
long long v_ll
; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}
143 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}}
144 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}}
148 __vector
unsigned int v
= {0,0,0,0};
149 __vector
int v__cast
= (__vector
int)v
;
150 __vector
int v_cast
= (vector
int)v
;
151 __vector
char vb_cast
= (vector
char)v
;
153 // Check some casting between gcc and altivec vectors.
154 #define gccvector __attribute__((vector_size(16)))
155 gccvector
unsigned int gccv
= {0,0,0,0};
156 gccvector
unsigned int gccv1
= gccv
;
157 gccvector
int gccv2
= (gccvector
int)gccv
;
158 gccvector
unsigned int gccv3
= v
;
159 __vector
unsigned int av
= gccv
;
160 __vector
int avi
= (__vector
int)gccv
;
161 gccvector
unsigned int gv
= v
;
162 gccvector
int gvi
= (gccvector
int)v
;
163 __attribute__((vector_size(8))) unsigned int gv8
;
164 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)}}
165 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)}}
168 __vector
unsigned int tv
= gccv
;
170 gccvector
unsigned int tgv
= v
;
173 // Now for the C++ version:
178 void f__a(__vector
int a
);
179 void f__a2(int b
, __vector
int a
);
185 void f__a(vector
int a
);
186 void f__a2(int b
, vector
int a
);
190 // bug 6895 - Vectorl literal casting confusion.
191 vector
char v1
= (vector
char)((vector
int)(1, 2, 3, 4));
192 vector
char v2
= (vector
char)((vector
float)(1.0f
, 2.0f
, 3.0f
, 4.0f
));
193 vector
char v3
= (vector
char)((vector
int)('a', 'b', 'c', 'd'));
194 vector
int v4
= (vector
int)(1, 2, 3, 4);
195 vector
float v5
= (vector
float)(1.0f
, 2.0f
, 3.0f
, 4.0f
);
196 vector
char v6
= (vector
char)((vector
int)(1+2, -2, (int)(2.0 * 3), -(5-3)));
198 // bug 7553 - Problem with '==' and vectors
201 res_b
= (vv_sc
== vv_sc
);
202 res_b
= (vv_uc
!= vv_uc
);
203 res_b
= (vv_s
> vv_s
);
204 res_b
= (vv_us
>= vv_us
);
205 res_b
= (vv_i
< vv_i
);
206 res_b
= (vv_ui
<= vv_ui
);
207 res_b
= (vv_f
<= vv_f
);
210 // vecreturn attribute test
214 } __attribute__((vecreturn
));
216 Vector
Add(Vector lhs
, Vector rhs
)
219 result
.xyzw
= vec_add(lhs
.xyzw
, rhs
.xyzw
);
220 return result
; // This will (eventually) be returned in a register
223 // vecreturn attribute test - should error because of virtual function.
224 class VectorClassNonPod
228 VectorClassNonPod() {}
229 virtual ~VectorClassNonPod() {}
230 } __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)}}
232 // vecreturn attribute test - should error because of virtual function.
233 class VectorClassMultipleMembers
238 } __attribute__((vecreturn
)); // expected-error {{the vecreturn attribute can only be used on a class or structure with one member, which must be a vector}}
240 template<typename
... Args
> void PR16874() {
241 (void) (Args::foo()...); // expected-error {{expression contains unexpanded parameter pack 'Args'}} expected-error {{expected ')'}} expected-note {{to match this '('}}