From: Sebastian Redl Date: Mon, 26 Jul 2010 17:52:21 +0000 (+0000) Subject: Make sure that implicit qualification and derived-to-base conversions of xvalues... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=66d0acd5f1010625df9987a89b8cc4df3d378d5e;p=clang Make sure that implicit qualification and derived-to-base conversions of xvalues preserve xvalue-ness. Unfortunately I have no idea how to test this property; there doesn't seem to be a syntactical construct that triggers such a conversion and still allows the distinction between prvalues and xvalues to be made. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109406 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 7a5c1459d6..5aa649bdc9 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -2397,7 +2397,7 @@ static OverloadingResult TryRefInitWithConversionFunction(Sema &S, Category = ImplicitCastExpr::LValue; else if (const RValueReferenceType *RRef = T2->getAs()) Category = RRef->getPointeeType()->isFunctionType() ? - ImplicitCastExpr::LValue : ImplicitCastExpr::RValue; + ImplicitCastExpr::LValue : ImplicitCastExpr::XValue; bool NewDerivedToBase = false; Sema::ReferenceCompareResult NewRefRelationship @@ -2555,6 +2555,7 @@ static void TryReferenceInitialization(Sema &S, // - [If T1 is not a function type], if T2 is a class type and if (!T1Function && T2->isRecordType()) { + bool isXValue = InitCategory.isXValue(); // - the initializer expression is an rvalue and "cv1 T1" is // reference-compatible with "cv2 T2", or if (InitCategory.isRValue() && @@ -2574,10 +2575,13 @@ static void TryReferenceInitialization(Sema &S, if (DerivedToBase) Sequence.AddDerivedToBaseCastStep( S.Context.getQualifiedType(T1, T2Quals), - ImplicitCastExpr::RValue); + isXValue ? ImplicitCastExpr::XValue + : ImplicitCastExpr::RValue); if (T1Quals != T2Quals) - Sequence.AddQualificationConversionStep(cv1T1,ImplicitCastExpr::RValue); - Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/true); + Sequence.AddQualificationConversionStep(cv1T1, + isXValue ? ImplicitCastExpr::XValue + : ImplicitCastExpr::RValue); + Sequence.AddReferenceBindingStep(cv1T1, /*bindingTemporary=*/!isXValue); return; }