[cfe-commits] r143583 - in /cfe/trunk: lib/CodeGen/CGBlocks.cpp lib/CodeGen/CGExpr.cpp lib/Sema/SemaExpr.cpp test/CodeGenCXX/block-rvalue-reference-capture.cpp

Fariborz Jahanian fjahanian at apple.com
Wed Nov 2 15:53:44 PDT 2011


Author: fjahanian
Date: Wed Nov  2 17:53:43 2011
New Revision: 143583

URL: http://llvm.org/viewvc/llvm-project?rev=143583&view=rev
Log:
back out changes in r143399 and r143475.
rvale-references are captured by reference
in blocks. // rdar://9971124.

Removed:
    cfe/trunk/test/CodeGenCXX/block-rvalue-reference-capture.cpp
Modified:
    cfe/trunk/lib/CodeGen/CGBlocks.cpp
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/lib/Sema/SemaExpr.cpp

Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=143583&r1=143582&r2=143583&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Wed Nov  2 17:53:43 2011
@@ -380,12 +380,9 @@
       }
     }
 
-    bool IsRValReference = variable->getType()->isRValueReferenceType();
-    QualType VT = 
-      IsRValReference ? variable->getType()->getPointeeType() 
-                      : variable->getType();
+    QualType VT = variable->getType();
     CharUnits size = C.getTypeSizeInChars(VT);
-    CharUnits align = C.getDeclAlign(variable, IsRValReference);
+    CharUnits align = C.getDeclAlign(variable);
     
     maxFieldAlign = std::max(maxFieldAlign, align);
 
@@ -599,32 +596,30 @@
       EmitSynthesizedCXXCopyCtor(blockField, src, copyExpr);
 
     // If it's a reference variable, copy the reference into the block field.
-    } else if (type->isReferenceType() && !type->isRValueReferenceType()) {
+    } else if (type->isReferenceType()) {
       Builder.CreateStore(Builder.CreateLoad(src, "ref.val"), blockField);
 
     // Otherwise, fake up a POD copy into the block field.
     } else {
-      QualType VT = 
-        (!type->isRValueReferenceType()) ? type : type->getPointeeType();
       // Fake up a new variable so that EmitScalarInit doesn't think
       // we're referring to the variable in its own initializer.
       ImplicitParamDecl blockFieldPseudoVar(/*DC*/ 0, SourceLocation(),
-                                            /*name*/ 0, VT);
+                                            /*name*/ 0, type);
 
       // We use one of these or the other depending on whether the
       // reference is nested.
-      DeclRefExpr notNested(const_cast<VarDecl*>(variable), VT, VK_LValue,
+      DeclRefExpr notNested(const_cast<VarDecl*>(variable), type, VK_LValue,
                             SourceLocation());
-      BlockDeclRefExpr nested(const_cast<VarDecl*>(variable), VT,
+      BlockDeclRefExpr nested(const_cast<VarDecl*>(variable), type,
                               VK_LValue, SourceLocation(), /*byref*/ false);
 
       Expr *declRef = 
         (ci->isNested() ? static_cast<Expr*>(&nested) : &notNested);
 
-      ImplicitCastExpr l2r(ImplicitCastExpr::OnStack, VT, CK_LValueToRValue,
+      ImplicitCastExpr l2r(ImplicitCastExpr::OnStack, type, CK_LValueToRValue,
                            declRef, VK_RValue);
       EmitExprAsInit(&l2r, &blockFieldPseudoVar,
-                     MakeAddrLValue(blockField, VT,
+                     MakeAddrLValue(blockField, type,
                                     getContext().getDeclAlign(variable)
                                                 .getQuantity()),
                      /*captured by init*/ false);
@@ -796,8 +791,7 @@
                                    variable->getNameAsString());
   }
 
-  if (variable->getType()->isReferenceType() &&
-      !variable->getType()->isRValueReferenceType())
+  if (variable->getType()->isReferenceType())
     addr = Builder.CreateLoad(addr, "ref.tmp");
 
   return addr;

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=143583&r1=143582&r2=143583&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Wed Nov  2 17:53:43 2011
@@ -1409,10 +1409,8 @@
 }
 
 LValue CodeGenFunction::EmitBlockDeclRefLValue(const BlockDeclRefExpr *E) {
-  bool RefAsPointee = 
-    E->getDecl()->getType()->isRValueReferenceType() ? true : false;
   unsigned Alignment =
-    getContext().getDeclAlign(E->getDecl(), RefAsPointee).getQuantity();
+    getContext().getDeclAlign(E->getDecl()).getQuantity();
   return MakeAddrLValue(GetAddrOfBlockDecl(E), E->getType(), Alignment);
 }
 

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=143583&r1=143582&r2=143583&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Nov  2 17:53:43 2011
@@ -1305,9 +1305,6 @@
   // Actually try to capture it.
   QualType type = var->getType();
   
-  if (type->isRValueReferenceType())
-    type = type->getPointeeType();
-  
   // Prohibit variably-modified types.
   if (type->isVariablyModifiedType()) {
     S.Diag(loc, diag::err_ref_vm_type);

Removed: cfe/trunk/test/CodeGenCXX/block-rvalue-reference-capture.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/block-rvalue-reference-capture.cpp?rev=143582&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/block-rvalue-reference-capture.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/block-rvalue-reference-capture.cpp (removed)
@@ -1,31 +0,0 @@
-// RUN: %clang_cc1 %s -std=c++11 -fblocks -triple x86_64-apple-darwin -emit-llvm -o - | FileCheck %s
-// rdar://9971124
-
-int foo(int && i)
-{ 
-     return ^{ return i; }();
-}
-
-int main() {
-  return foo(100);
-}
-
-// CHECK: [[B:%.*]] = bitcast i8* [[BD:%.*]] to <{ {{.*}} i32 }>*
-// CHECK: [[C:%.*]] = getelementptr inbounds <{ {{.*}} i32 }>* [[B]]
-// CHECK: [[R:%.*]] = load i32* [[C]], align 4
-// CHECK: ret i32 [[R]]
-
-class S {
-public:
-  S (const S &);
-  S(int);
-  int field;
-};
-
-int func(S && rv)
-{ 
-     return ^{ return rv.field; }();
-}
-
-// CHECK: define i32 @_Z4funcO1S
-// CHECK: call void @_ZN1SC1ERKS_





More information about the cfe-commits mailing list