From: Anders Carlsson Date: Fri, 30 Nov 2007 04:21:22 +0000 (+0000) Subject: Support lax vector conversions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=695dbb697d78d4c507e12b0acc6129b9650d4c3e;p=clang Support lax vector conversions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44449 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/clang.cpp b/Driver/clang.cpp index f85ab52cc7..ac3a04ab2e 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -282,6 +282,12 @@ PascalStrings("fpascal-strings", static llvm::cl::opt WritableStrings("fwritable-strings", llvm::cl::desc("Store string literals as writable data.")); + +static llvm::cl::opt +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; } //===----------------------------------------------------------------------===// diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp index 336dca716e..f53980ca90 100644 --- a/Sema/SemaExpr.cpp +++ b/Sema/SemaExpr.cpp @@ -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()) diff --git a/include/clang/Basic/LangOptions.h b/include/clang/Basic/LangOptions.h index d88dc4b9f9..77ae369693 100644 --- a/include/clang/Basic/LangOptions.h +++ b/include/clang/Basic/LangOptions.h @@ -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; diff --git a/test/Sema/vector-assign.c b/test/Sema/vector-assign.c new file mode 100644 index 0000000000..ff644229d2 --- /dev/null +++ b/test/Sema/vector-assign.c @@ -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'}} +}