]> granicus.if.org Git - clang/commitdiff
Make sure that implicit qualification and derived-to-base conversions of xvalues...
authorSebastian Redl <sebastian.redl@getdesigned.at>
Mon, 26 Jul 2010 17:52:21 +0000 (17:52 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Mon, 26 Jul 2010 17:52:21 +0000 (17:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109406 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp

index 7a5c1459d6d0203bd7f109a5b2ee8f97f08a1751..5aa649bdc92e731e6d47811b3b75a0d99df5accd 100644 (file)
@@ -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;
     }