forked from OSchip/llvm-project
teach getCorrespondingUnsignedType how to handle vectors of integers,
fixing PR4838. llvm-svn: 84353
This commit is contained in:
parent
867f67301b
commit
ec3a1565f6
|
@ -3930,7 +3930,7 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) {
|
|||
unsigned ASTContext::getIntWidth(QualType T) {
|
||||
if (T == BoolTy)
|
||||
return 1;
|
||||
if (FixedWidthIntType* FWIT = dyn_cast<FixedWidthIntType>(T)) {
|
||||
if (FixedWidthIntType *FWIT = dyn_cast<FixedWidthIntType>(T)) {
|
||||
return FWIT->getWidth();
|
||||
}
|
||||
// For builtin types, just use the standard type sizing method
|
||||
|
@ -3939,10 +3939,18 @@ unsigned ASTContext::getIntWidth(QualType T) {
|
|||
|
||||
QualType ASTContext::getCorrespondingUnsignedType(QualType T) {
|
||||
assert(T->isSignedIntegerType() && "Unexpected type");
|
||||
if (const EnumType* ETy = T->getAs<EnumType>())
|
||||
|
||||
// Turn <4 x signed int> -> <4 x unsigned int>
|
||||
if (const VectorType *VTy = T->getAs<VectorType>())
|
||||
return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()),
|
||||
VTy->getNumElements());
|
||||
|
||||
// For enums, we return the unsigned version of the base type.
|
||||
if (const EnumType *ETy = T->getAs<EnumType>())
|
||||
T = ETy->getDecl()->getIntegerType();
|
||||
const BuiltinType* BTy = T->getAs<BuiltinType>();
|
||||
assert (BTy && "Unexpected signed integer type");
|
||||
|
||||
const BuiltinType *BTy = T->getAs<BuiltinType>();
|
||||
assert(BTy && "Unexpected signed integer type");
|
||||
switch (BTy->getKind()) {
|
||||
case BuiltinType::Char_S:
|
||||
case BuiltinType::SChar:
|
||||
|
|
|
@ -3753,16 +3753,16 @@ Sema::CheckPointerTypesForAssignment(QualType lhsType, QualType rhsType) {
|
|||
// Check if the pointee types are compatible ignoring the sign.
|
||||
// We explicitly check for char so that we catch "char" vs
|
||||
// "unsigned char" on systems where "char" is unsigned.
|
||||
if (lhptee->isCharType()) {
|
||||
if (lhptee->isCharType())
|
||||
lhptee = Context.UnsignedCharTy;
|
||||
} else if (lhptee->isSignedIntegerType()) {
|
||||
else if (lhptee->isSignedIntegerType())
|
||||
lhptee = Context.getCorrespondingUnsignedType(lhptee);
|
||||
}
|
||||
if (rhptee->isCharType()) {
|
||||
|
||||
if (rhptee->isCharType())
|
||||
rhptee = Context.UnsignedCharTy;
|
||||
} else if (rhptee->isSignedIntegerType()) {
|
||||
else if (rhptee->isSignedIntegerType())
|
||||
rhptee = Context.getCorrespondingUnsignedType(rhptee);
|
||||
}
|
||||
|
||||
if (lhptee == rhptee) {
|
||||
// Types are compatible ignoring the sign. Qualifier incompatibility
|
||||
// takes priority over sign incompatibility because the sign
|
||||
|
|
|
@ -5,7 +5,7 @@ typedef signed int v1s __attribute__ ((vector_size (4)));
|
|||
typedef float v2f __attribute__ ((vector_size(8)));
|
||||
typedef signed short v4ss __attribute__ ((vector_size (8)));
|
||||
|
||||
void f() {
|
||||
void test1() {
|
||||
v2s v1;
|
||||
v2u v2;
|
||||
v1s v3;
|
||||
|
@ -39,7 +39,15 @@ void f() {
|
|||
}
|
||||
|
||||
// PR2263
|
||||
float f2(__attribute__((vector_size(16))) float a, int b) {
|
||||
float test2(__attribute__((vector_size(16))) float a, int b) {
|
||||
return a[b];
|
||||
}
|
||||
|
||||
// PR4838
|
||||
typedef long long __attribute__((__vector_size__(2 * sizeof(long long))))
|
||||
longlongvec;
|
||||
|
||||
void test3a(longlongvec *);
|
||||
void test3(const unsigned *src) {
|
||||
test3a(src); // expected-warning {{incompatible pointer types passing 'unsigned int const *', expected 'longlongvec *'}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue