diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 2ed90d0164..b19368816b 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -725,9 +725,9 @@ public: OverloadedFunctionDecl::function_iterator &MatchedDecl); ImplicitConversionSequence TryImplicitConversion(Expr* From, QualType ToType, - bool SuppressUserConversions = false, - bool AllowExplicit = false, - bool ForceRValue = false); + bool SuppressUserConversions, + bool AllowExplicit, + bool ForceRValue); bool IsStandardConversion(Expr *From, QualType ToType, StandardConversionSequence& SCS); bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType); diff --git a/lib/Sema/SemaCXXCast.cpp b/lib/Sema/SemaCXXCast.cpp index 17fe940136..3643b8808e 100644 --- a/lib/Sema/SemaCXXCast.cpp +++ b/lib/Sema/SemaCXXCast.cpp @@ -788,8 +788,12 @@ TryStaticImplicitCast(Sema &Self, Expr *SrcExpr, QualType DestType, // reimplement more of this. // FIXME: This does not actually perform the conversion, and thus does not // check for ambiguity or access. - ImplicitConversionSequence ICS = Self.TryImplicitConversion( - SrcExpr, DestType); + ImplicitConversionSequence ICS = + Self.TryImplicitConversion(SrcExpr, DestType, + /*SuppressUserConversions=*/false, + /*AllowExplicit=*/false, + /*ForceRValue=*/false); + if (ICS.ConversionKind == ImplicitConversionSequence::UserDefinedConversion) if (CXXConversionDecl *CV = dyn_cast(ICS.UserDefined.ConversionFunction)) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index c5eda94b6a..eb4299f79c 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -3144,7 +3144,10 @@ Sema::CheckReferenceInit(Expr *&Init, QualType DeclType, // the argument expression. Any difference in top-level // cv-qualification is subsumed by the initialization itself // and does not constitute a conversion. - *ICS = TryImplicitConversion(Init, T1, SuppressUserConversions); + *ICS = TryImplicitConversion(Init, T1, SuppressUserConversions, + /*AllowExplicit=*/false, + /*ForceRValue=*/false); + // Of course, that's still a reference binding. if (ICS->ConversionKind == ImplicitConversionSequence::StandardConversion) { ICS->Standard.ReferenceBinding = true; diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 870041dc87..98b3d29e53 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -884,11 +884,16 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType, ImplicitConversionSequence ICS; ICS.ConversionKind = ImplicitConversionSequence::BadConversion; if (Elidable && getLangOptions().CPlusPlus0x) { - ICS = TryImplicitConversion(From, ToType, /*SuppressUserConversions*/false, - AllowExplicit, /*ForceRValue*/true); + ICS = TryImplicitConversion(From, ToType, + /*SuppressUserConversions=*/false, + AllowExplicit, + /*ForceRValue=*/true); } if (ICS.ConversionKind == ImplicitConversionSequence::BadConversion) { - ICS = TryImplicitConversion(From, ToType, false, AllowExplicit); + ICS = TryImplicitConversion(From, ToType, + /*SuppressUserConversions=*/false, + AllowExplicit, + /*ForceRValue=*/false); } return PerformImplicitConversion(From, ToType, ICS, Flavor); } @@ -1244,7 +1249,10 @@ static bool TryClassUnification(Sema &Self, Expr *From, Expr *To, // Now try the implicit conversion. // FIXME: This doesn't detect ambiguities. - ICS = Self.TryImplicitConversion(From, TTy); + ICS = Self.TryImplicitConversion(From, TTy, + /*SuppressUserConversions=*/false, + /*AllowExplicit=*/false, + /*ForceRValue=*/false); } return false; } @@ -1627,15 +1635,30 @@ QualType Sema::FindCompositePointerType(Expr *&E1, Expr *&E2) { } } - ImplicitConversionSequence E1ToC1 = TryImplicitConversion(E1, Composite1); - ImplicitConversionSequence E2ToC1 = TryImplicitConversion(E2, Composite1); + ImplicitConversionSequence E1ToC1 = + TryImplicitConversion(E1, Composite1, + /*SuppressUserConversions=*/false, + /*AllowExplicit=*/false, + /*ForceRValue=*/false); + ImplicitConversionSequence E2ToC1 = + TryImplicitConversion(E2, Composite1, + /*SuppressUserConversions=*/false, + /*AllowExplicit=*/false, + /*ForceRValue=*/false); + ImplicitConversionSequence E1ToC2, E2ToC2; E1ToC2.ConversionKind = ImplicitConversionSequence::BadConversion; E2ToC2.ConversionKind = ImplicitConversionSequence::BadConversion; if (Context.getCanonicalType(Composite1) != Context.getCanonicalType(Composite2)) { - E1ToC2 = TryImplicitConversion(E1, Composite2); - E2ToC2 = TryImplicitConversion(E2, Composite2); + E1ToC2 = TryImplicitConversion(E1, Composite2, + /*SuppressUserConversions=*/false, + /*AllowExplicit=*/false, + /*ForceRValue=*/false); + E2ToC2 = TryImplicitConversion(E2, Composite2, + /*SuppressUserConversions=*/false, + /*AllowExplicit=*/false, + /*ForceRValue=*/false); } bool ToC1Viable = E1ToC1.ConversionKind != diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 52010ab514..b1364a9faa 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -1929,7 +1929,9 @@ Sema::TryCopyInitialization(Expr *From, QualType ToType, /*AllowExplicit=*/false, ForceRValue); return ICS; } else { - return TryImplicitConversion(From, ToType, SuppressUserConversions, + return TryImplicitConversion(From, ToType, + SuppressUserConversions, + /*AllowExplicit=*/false, ForceRValue); } } @@ -2064,7 +2066,11 @@ Sema::PerformObjectArgumentInitialization(Expr *&From, CXXMethodDecl *Method) { /// TryContextuallyConvertToBool - Attempt to contextually convert the /// expression From to bool (C++0x [conv]p3). ImplicitConversionSequence Sema::TryContextuallyConvertToBool(Expr *From) { - return TryImplicitConversion(From, Context.BoolTy, false, true); + return TryImplicitConversion(From, Context.BoolTy, + // FIXME: Are these flags correct? + /*SuppressUserConversions=*/false, + /*AllowExplicit=*/true, + /*ForceRValue=*/false); } /// PerformContextuallyConvertToBool - Perform a contextual conversion