зеркало из https://github.com/microsoft/clang-1.git
Kill off two more uses of Sema::CheckReferenceInit in favor of the new
initialization code. Exposed a bug where we were not marking an implicit conversion as an lvalue when we were forming a call to a conversion function whose return type is a reference. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99459 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
c6e378e7d4
Коммит
f0e0b17d05
|
@ -621,8 +621,8 @@ TryLValueToRValueCast(Sema &Self, Expr *SrcExpr, QualType DestType,
|
|||
return TC_Failed;
|
||||
}
|
||||
|
||||
// FIXME: Similar to CheckReferenceInit, we actually need more AST annotation
|
||||
// than nothing.
|
||||
// FIXME: We should probably have an AST node for lvalue-to-rvalue
|
||||
// conversions.
|
||||
return TC_Success;
|
||||
}
|
||||
|
||||
|
|
|
@ -2048,28 +2048,26 @@ static bool FindConditionalOverload(Sema &Self, Expr *&LHS, Expr *&RHS,
|
|||
/// handles the reference binding specially.
|
||||
static bool ConvertForConditional(Sema &Self, Expr *&E,
|
||||
const ImplicitConversionSequence &ICS) {
|
||||
if (ICS.isStandard() && ICS.Standard.ReferenceBinding) {
|
||||
assert(ICS.Standard.DirectBinding &&
|
||||
if ((ICS.isStandard() && ICS.Standard.ReferenceBinding) ||
|
||||
(ICS.isUserDefined() && ICS.UserDefined.After.ReferenceBinding)) {
|
||||
assert(((ICS.isStandard() && ICS.Standard.DirectBinding) ||
|
||||
(ICS.isUserDefined() && ICS.UserDefined.After.DirectBinding)) &&
|
||||
"TryClassUnification should never generate indirect ref bindings");
|
||||
// FIXME: CheckReferenceInit should be able to reuse the ICS instead of
|
||||
// redoing all the work.
|
||||
return Self.CheckReferenceInit(E, Self.Context.getLValueReferenceType(
|
||||
TargetType(ICS)),
|
||||
/*FIXME:*/E->getLocStart(),
|
||||
/*SuppressUserConversions=*/false,
|
||||
/*AllowExplicit=*/false,
|
||||
/*ForceRValue=*/false);
|
||||
}
|
||||
if (ICS.isUserDefined() && ICS.UserDefined.After.ReferenceBinding) {
|
||||
assert(ICS.UserDefined.After.DirectBinding &&
|
||||
"TryClassUnification should never generate indirect ref bindings");
|
||||
return Self.CheckReferenceInit(E, Self.Context.getLValueReferenceType(
|
||||
TargetType(ICS)),
|
||||
/*FIXME:*/E->getLocStart(),
|
||||
/*SuppressUserConversions=*/false,
|
||||
/*AllowExplicit=*/false,
|
||||
/*ForceRValue=*/false);
|
||||
InitializedEntity Entity
|
||||
= InitializedEntity::InitializeTemporary(
|
||||
Self.Context.getLValueReferenceType(TargetType(ICS)));
|
||||
InitializationKind Kind = InitializationKind::CreateCopy(E->getLocStart(),
|
||||
SourceLocation());
|
||||
InitializationSequence InitSeq(Self, Entity, Kind, &E, 1);
|
||||
Sema::OwningExprResult Result = InitSeq.Perform(Self, Entity, Kind,
|
||||
Sema::MultiExprArg(Self, (void **)&E, 1));
|
||||
if (Result.isInvalid())
|
||||
return true;
|
||||
|
||||
E = Result.takeAs<Expr>();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Self.PerformImplicitConversion(E, TargetType(ICS), ICS, Sema::AA_Converting))
|
||||
return true;
|
||||
return false;
|
||||
|
|
|
@ -3382,6 +3382,7 @@ InitializationSequence::Perform(Sema &S,
|
|||
bool IsCopy = false;
|
||||
FunctionDecl *Fn = Step->Function.Function;
|
||||
DeclAccessPair FoundFn = Step->Function.FoundDecl;
|
||||
bool IsLvalue = false;
|
||||
if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Fn)) {
|
||||
// Build a call to the selected constructor.
|
||||
ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(S);
|
||||
|
@ -3414,7 +3415,7 @@ InitializationSequence::Perform(Sema &S,
|
|||
} else {
|
||||
// Build a call to the conversion function.
|
||||
CXXConversionDecl *Conversion = cast<CXXConversionDecl>(Fn);
|
||||
|
||||
IsLvalue = Conversion->getResultType()->isLValueReferenceType();
|
||||
S.CheckMemberOperatorAccess(Kind.getLocation(), CurInitExpr, 0,
|
||||
FoundFn);
|
||||
|
||||
|
@ -3444,7 +3445,7 @@ InitializationSequence::Perform(Sema &S,
|
|||
CurInit = S.Owned(new (S.Context) ImplicitCastExpr(CurInitExpr->getType(),
|
||||
CastKind,
|
||||
CurInitExpr,
|
||||
false));
|
||||
IsLvalue));
|
||||
|
||||
if (!IsCopy)
|
||||
CurInit = CopyIfRequiredForEntity(S, Entity, Kind, move(CurInit));
|
||||
|
|
Загрузка…
Ссылка в новой задаче