зеркало из https://github.com/microsoft/clang-1.git
Remove default arguments from TryImplicitConversion and fix a bug found in the process.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80258 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
cbdebdd113
Коммит
da7a18be8f
|
@ -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);
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 !=
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче