diff options
author | John McCall <rjmccall@apple.com> | 2014-02-04 23:58:19 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2014-02-04 23:58:19 +0000 |
commit | 9b595db16d6144762f1c2ddce02d908936bdc379 (patch) | |
tree | b49fdb5af2b6bdd1b262d06ae4e60f2c602b6787 /clang/lib/Sema/SemaOverload.cpp | |
parent | 4a25d42a3cc27ec98886df838322b31cdaaf7f5f (diff) | |
download | bcm5719-llvm-9b595db16d6144762f1c2ddce02d908936bdc379.tar.gz bcm5719-llvm-9b595db16d6144762f1c2ddce02d908936bdc379.zip |
Tighten lax vector-conversion rules and enforce them consistently.
When a lax conversion featured a vector and a non-vector, we were
only requiring the non-vector to be a scalar type, but really it
needs to be a real type (i.e. integral or real floating); it is
not reasonable to allow a pointer, member pointer, or complex
type here.
r198474 required lax conversions to match in "data size", i.e.
element size * element count, forbidding matches that happen
only because a vector is rounded up to the nearest power of two
in size. Unfortunately, the erroneous logic was repeated in
several different places; unify them to use the new condition,
so that it triggers for arbitrary conversions and not just
those performed as part of binary operator checking.
rdar://15931426
llvm-svn: 200810
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 8e52e620a77..b95e2893189 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -1372,7 +1372,7 @@ bool Sema::IsNoReturnConversion(QualType FromType, QualType ToType, /// /// \param ICK Will be set to the vector conversion kind, if this is a vector /// conversion. -static bool IsVectorConversion(ASTContext &Context, QualType FromType, +static bool IsVectorConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK) { // We need at least one of these types to be a vector type to have a vector // conversion. @@ -1380,7 +1380,7 @@ static bool IsVectorConversion(ASTContext &Context, QualType FromType, return false; // Identical types require no conversions. - if (Context.hasSameUnqualifiedType(FromType, ToType)) + if (S.Context.hasSameUnqualifiedType(FromType, ToType)) return false; // There are no conversions between extended vector types, only identity. @@ -1402,9 +1402,8 @@ static bool IsVectorConversion(ASTContext &Context, QualType FromType, // 2)lax vector conversions are permitted and the vector types are of the // same size if (ToType->isVectorType() && FromType->isVectorType()) { - if (Context.areCompatibleVectorTypes(FromType, ToType) || - (Context.getLangOpts().LaxVectorConversions && - (Context.getTypeSize(FromType) == Context.getTypeSize(ToType)))) { + if (S.Context.areCompatibleVectorTypes(FromType, ToType) || + S.isLaxVectorConversion(FromType, ToType)) { ICK = ICK_Vector_Conversion; return true; } @@ -1633,7 +1632,7 @@ static bool IsStandardConversion(Sema &S, Expr* From, QualType ToType, InOverloadResolution, FromType)) { // Pointer to member conversions (4.11). SCS.Second = ICK_Pointer_Member; - } else if (IsVectorConversion(S.Context, FromType, ToType, SecondICK)) { + } else if (IsVectorConversion(S, FromType, ToType, SecondICK)) { SCS.Second = SecondICK; FromType = ToType.getUnqualifiedType(); } else if (!S.getLangOpts().CPlusPlus && |