]> granicus.if.org Git - clang/commitdiff
Switch the destructor for a temporary arising from a reference binding over to
authorJohn McCall <rjmccall@apple.com>
Wed, 21 Jul 2010 06:29:51 +0000 (06:29 +0000)
committerJohn McCall <rjmccall@apple.com>
Wed, 21 Jul 2010 06:29:51 +0000 (06:29 +0000)
using a lazy cleanup.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108994 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGClass.cpp
lib/CodeGen/CGExpr.cpp
lib/CodeGen/CodeGenFunction.h

index 5fe471e57c83f27703c1807b812526b39c357cd2..f6357ec1d9799baf8bfaae107be4731e01dadd70 100644 (file)
@@ -1178,14 +1178,18 @@ namespace {
   };
 }
 
+void CodeGenFunction::PushDestructorCleanup(const CXXDestructorDecl *D,
+                                            llvm::Value *Addr) {
+  EHStack.pushLazyCleanup<CallLocalDtor>(NormalAndEHCleanup, D, Addr);
+}
+
 void CodeGenFunction::PushDestructorCleanup(QualType T, llvm::Value *Addr) {
   CXXRecordDecl *ClassDecl = T->getAsCXXRecordDecl();
   if (!ClassDecl) return;
   if (ClassDecl->hasTrivialDestructor()) return;
 
   const CXXDestructorDecl *D = ClassDecl->getDestructor();
-
-  EHStack.pushLazyCleanup<CallLocalDtor>(NormalAndEHCleanup, D, Addr);
+  PushDestructorCleanup(D, Addr);
 }
 
 llvm::Value *
index b4ec0cadb78e40947e8ea5b88aa84574e0b24068..173aadc91a06d4d6dd8c87c1fa6b3c198a379ce5 100644 (file)
@@ -362,16 +362,8 @@ CodeGenFunction::EmitReferenceBindingToExpr(const Expr* E,
       return RValue::get(Value);
     }
   }
-  
-  CleanupBlock Cleanup(*this, NormalCleanup);
-  EmitCXXDestructorCall(ReferenceTemporaryDtor, Dtor_Complete, 
-                        /*ForVirtualBase=*/false, ReferenceTemporary);
-            
-  if (Exceptions) {
-    Cleanup.beginEHCleanup();
-    EmitCXXDestructorCall(ReferenceTemporaryDtor, Dtor_Complete, 
-                          /*ForVirtualBase=*/false, ReferenceTemporary);
-  }
+
+  PushDestructorCleanup(ReferenceTemporaryDtor, ReferenceTemporary);
 
   return RValue::get(Value);
 }
index 60fd3a34bde528d8d7ad9e8d610d244f21260edc..3823ff31d05c1d522f5fa4e3e17f6ae271959c81 100644 (file)
@@ -466,6 +466,12 @@ public:
   /// non-trivial destructor.
   void PushDestructorCleanup(QualType T, llvm::Value *Addr);
 
+  /// PushDestructorCleanup - Push a cleanup to call the
+  /// complete-object variant of the given destructor on the object at
+  /// the given address.
+  void PushDestructorCleanup(const CXXDestructorDecl *Dtor,
+                             llvm::Value *Addr);
+
   /// PopCleanupBlock - Will pop the cleanup entry on the stack and
   /// process all branch fixups.
   void PopCleanupBlock();