Support lax vector conversions.

llvm-svn: 44449
This commit is contained in:
Anders Carlsson 2007-11-30 04:21:22 +00:00
parent cc45c338d1
commit e1af1d20ef
4 changed files with 63 additions and 3 deletions

View File

@ -282,6 +282,12 @@ PascalStrings("fpascal-strings",
static llvm::cl::opt<bool>
WritableStrings("fwritable-strings",
llvm::cl::desc("Store string literals as writable data."));
static llvm::cl::opt<bool>
LaxVectorConversions("flax-vector-conversions",
llvm::cl::desc("Allow implicit conversions between vectors"
" with a different number of elements or "
"different element types."));
// FIXME: add:
// -ansi
// -trigraphs
@ -340,6 +346,7 @@ static void InitializeLanguageStandard(LangOptions &Options) {
Options.DollarIdents = 1; // FIXME: Really a target property.
Options.PascalStrings = PascalStrings;
Options.WritableStrings = WritableStrings;
Options.LaxVectorConversions = LaxVectorConversions;
}
//===----------------------------------------------------------------------===//

View File

@ -1100,9 +1100,22 @@ Sema::CheckAssignmentConstraints(QualType lhsType, QualType rhsType) {
return Compatible;
} else if (lhsType->isArithmeticType() && rhsType->isArithmeticType()) {
if (lhsType->isVectorType() || rhsType->isVectorType()) {
if (lhsType.getCanonicalType() != rhsType.getCanonicalType())
if (!getLangOptions().LaxVectorConversions) {
if (lhsType.getCanonicalType() != rhsType.getCanonicalType())
return Incompatible;
} else {
if (lhsType->isVectorType() && rhsType->isVectorType()) {
if ((lhsType->isIntegerType() && rhsType->isIntegerType()) ||
(lhsType->isRealFloatingType() &&
rhsType->isRealFloatingType())) {
if (Context.getTypeSize(lhsType, SourceLocation()) ==
Context.getTypeSize(rhsType, SourceLocation()))
return Compatible;
}
}
return Incompatible;
}
}
}
return Compatible;
} else if (lhsType->isPointerType()) {
if (rhsType->isIntegerType())

View File

@ -37,7 +37,8 @@ struct LangOptions {
unsigned PascalStrings : 1; // Allow Pascal strings
unsigned Boolean : 1; // Allow bool/true/false
unsigned WritableStrings : 1; // Allow writable strings
unsigned LaxVectorConversions : 1;
LangOptions() {
Trigraphs = BCPLComment = DollarIdents = Digraphs = HexFloats = 0;
ObjC1 = ObjC2 = 0;

View File

@ -0,0 +1,39 @@
// RUN: clang %s -verify -fsyntax-only -flax-vector-conversions
typedef unsigned int v2u __attribute__ ((vector_size (8)));
typedef signed int v2s __attribute__ ((vector_size (8)));
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() {
v2s v1;
v2u v2;
v1s v3;
v2f v4;
v4ss v5;
v1 = v2;
v1 = v3; // expected-error {{incompatible types assigning 'v1s' to 'v2s'}}
v1 = v4; // expected-error {{incompatible types assigning 'v2f' to 'v2s'}}
v1 = v5;
v2 = v1;
v2 = v3; // expected-error {{incompatible types assigning 'v1s' to 'v2u'}}
v2 = v4; // expected-error {{incompatible types assigning 'v2f' to 'v2u'}}
v2 = v5;
v3 = v1; // expected-error {{incompatible types assigning 'v2s' to 'v1s'}}
v3 = v2; // expected-error {{incompatible types assigning 'v2u' to 'v1s'}}
v3 = v4; // expected-error {{incompatible types assigning 'v2f' to 'v1s'}}
v3 = v5; // expected-error {{incompatible types assigning 'v4ss' to 'v1s'}}
v4 = v1; // expected-error {{incompatible types assigning 'v2s' to 'v2f'}}
v4 = v2; // expected-error {{incompatible types assigning 'v2u' to 'v2f'}}
v4 = v3; // expected-error {{incompatible types assigning 'v1s' to 'v2f'}}
v4 = v5; // expected-error {{incompatible types assigning 'v4ss' to 'v2f'}}
v5 = v1;
v5 = v2;
v5 = v3; // expected-error {{incompatible types assigning 'v1s' to 'v4ss'}}
v5 = v4; // expected-error {{incompatible types assigning 'v2f' to 'v4ss'}}
}