diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2010-07-26 17:52:21 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2010-07-26 17:52:21 +0000 |
commit | 66d0acd5f1010625df9987a89b8cc4df3d378d5e (patch) | |
tree | 2c8a79fe8b93973ae2a7f1f927357456631bd515 /lib/Sema/SemaInit.cpp | |
parent | 5606220447c7901ba8d80147ddab893bb7949dd5 (diff) |
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
Diffstat (limited to 'lib/Sema/SemaInit.cpp')
-rw-r--r-- | lib/Sema/SemaInit.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
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<RValueReferenceType>()) 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; } |