levels: -- none: no lax vector conversions [new GCC default] -- integer: only conversions between integer vectors [old GCC default] -- all: all conversions between same-size vectors [Clang default] For now, Clang still defaults to "all" mode, but per my proposal on cfe-dev (2019-04-10) the default will be changed to "integer" as soon as that doesn't break lots of testcases. (Eventually I'd like to change the default to "none" to match GCC and general sanity.) Following GCC's behavior, the driver flag -flax-vector-conversions is translated to -flax-vector-conversions=integer. This reinstates r371805, reverted in r371813, with an additional fix for lldb. llvm-svn: 371817
84 lines
1.7 KiB
C++
84 lines
1.7 KiB
C++
// RUN: %clang_cc1 -target-feature +altivec -flax-vector-conversions=none -triple powerpc-unknown-unknown -fcxx-exceptions -verify %s
|
|
|
|
typedef int V4i __attribute__((vector_size(16)));
|
|
|
|
void test_vec_step(vector short arg1) {
|
|
vector bool char vbc;
|
|
vector signed char vsc;
|
|
vector unsigned char vuc;
|
|
vector bool short vbs;
|
|
vector short vs;
|
|
vector unsigned short vus;
|
|
vector pixel vp;
|
|
vector bool int vbi;
|
|
vector int vi;
|
|
vector unsigned int vui;
|
|
vector float vf;
|
|
|
|
vector int *pvi;
|
|
|
|
int res1[vec_step(arg1) == 8 ? 1 : -1];
|
|
int res2[vec_step(vbc) == 16 ? 1 : -1];
|
|
int res3[vec_step(vsc) == 16 ? 1 : -1];
|
|
int res4[vec_step(vuc) == 16 ? 1 : -1];
|
|
int res5[vec_step(vbs) == 8 ? 1 : -1];
|
|
int res6[vec_step(vs) == 8 ? 1 : -1];
|
|
int res7[vec_step(vus) == 8 ? 1 : -1];
|
|
int res8[vec_step(vp) == 8 ? 1 : -1];
|
|
int res9[vec_step(vbi) == 4 ? 1 : -1];
|
|
int res10[vec_step(vi) == 4 ? 1 : -1];
|
|
int res11[vec_step(vui) == 4 ? 1 : -1];
|
|
int res12[vec_step(vf) == 4 ? 1 : -1];
|
|
int res13[vec_step(*pvi) == 4 ? 1 : -1];
|
|
}
|
|
|
|
void f(V4i a)
|
|
{
|
|
}
|
|
|
|
void test1()
|
|
{
|
|
V4i vGCC;
|
|
vector int vAltiVec;
|
|
|
|
f(vAltiVec);
|
|
vGCC = vAltiVec;
|
|
bool res = vGCC > vAltiVec;
|
|
vAltiVec = 0 ? vGCC : vGCC;
|
|
}
|
|
|
|
template<typename T>
|
|
void template_f(T param) {
|
|
param++;
|
|
}
|
|
|
|
void test2()
|
|
{
|
|
vector int vi;
|
|
++vi;
|
|
vi++;
|
|
--vi;
|
|
vi--;
|
|
vector float vf;
|
|
vf++;
|
|
|
|
++vi=vi; // expected-warning {{unsequenced}}
|
|
(++vi)[1]=1;
|
|
template_f(vi);
|
|
}
|
|
|
|
namespace LValueToRValueConversions {
|
|
struct Struct {
|
|
float f();
|
|
int n();
|
|
};
|
|
|
|
vector float initFloat = (vector float)(Struct().f); // expected-error {{did you mean to call it}}
|
|
vector int initInt = (vector int)(Struct().n); // expected-error {{did you mean to call it}}
|
|
}
|
|
|
|
void f() {
|
|
try {}
|
|
catch (vector pixel px) {}
|
|
};
|