diff options
author | Anders Carlsson <andersca@mac.com> | 2009-08-27 17:24:15 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-08-27 17:24:15 +0000 |
commit | ef4c72135f8ec1ba93beeb0e7d4a6dbcc8ce1fb5 (patch) | |
tree | dfcb89ed6a83e80d4db69c4709084ce958f9eb74 /clang/lib/Sema | |
parent | f871945c3965d89df3447cf4dd35eee366142b31 (diff) | |
download | bcm5719-llvm-ef4c72135f8ec1ba93beeb0e7d4a6dbcc8ce1fb5.tar.gz bcm5719-llvm-ef4c72135f8ec1ba93beeb0e7d4a6dbcc8ce1fb5.zip |
Remove default arguments from TryImplicitConversion and fix a bug found in the process.
llvm-svn: 80258
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/Sema.h | 6 | ||||
-rw-r--r-- | clang/lib/Sema/SemaCXXCast.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 39 | ||||
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 10 |
5 files changed, 52 insertions, 16 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 2ed90d01646..b19368816b5 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/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/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp index 17fe940136f..3643b8808eb 100644 --- a/clang/lib/Sema/SemaCXXCast.cpp +++ b/clang/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<CXXConversionDecl>(ICS.UserDefined.ConversionFunction)) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index c5eda94b6a6..eb4299f79cf 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/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/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 870041dc87e..98b3d29e531 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/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/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 52010ab5145..b1364a9faab 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/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 |