aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/SemaCXXCast.cpp4
-rw-r--r--lib/Sema/SemaExprCXX.cpp38
-rw-r--r--lib/Sema/SemaInit.cpp5
3 files changed, 23 insertions, 24 deletions
diff --git a/lib/Sema/SemaCXXCast.cpp b/lib/Sema/SemaCXXCast.cpp
index d3fe6aee5c..285ee4945d 100644
--- a/lib/Sema/SemaCXXCast.cpp
+++ b/lib/Sema/SemaCXXCast.cpp
@@ -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;
}
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index 366089f2ab..3cba68694b 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -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;
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index f86ae51c28..aa685d172d 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -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));