teach getCorrespondingUnsignedType how to handle vectors of integers,

fixing PR4838.

llvm-svn: 84353
This commit is contained in:
Chris Lattner 2009-10-17 20:33:28 +00:00
parent 867f67301b
commit ec3a1565f6
3 changed files with 28 additions and 12 deletions

View File

@ -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:

View File

@ -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

View File

@ -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 *'}}
}