Block Code Gen. API. Call destructor on descriptior
entry previously constructed via copy constructor.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105641 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp
index b2d7f2e..f07b7bb 100644
--- a/lib/CodeGen/CGBlocks.cpp
+++ b/lib/CodeGen/CGBlocks.cpp
@@ -361,8 +361,36 @@
           Builder.CreateStore(Loc, Addr);
           continue;
         } else {
-            if (BDRE->getCopyConstructorExpr())
-              E = BDRE->getCopyConstructorExpr();
+          if (BDRE->getCopyConstructorExpr()) {
+            E = BDRE->getCopyConstructorExpr();
+            // Code to destruct copy-constructed descriptor element for
+            // copied-in class object.
+            // TODO: Refactor this into common code with mostly similar
+            // CodeGenFunction::EmitLocalBlockVarDecl
+            QualType DtorTy = E->getType();
+            if (const RecordType *RT = DtorTy->getAs<RecordType>())
+              if (CXXRecordDecl *ClassDecl = 
+                    dyn_cast<CXXRecordDecl>(RT->getDecl())) {
+                if (!ClassDecl->hasTrivialDestructor()) {
+                  const CXXDestructorDecl *D = 
+                    ClassDecl->getDestructor(getContext());
+                  assert(D && "BuildBlockLiteralTmp - destructor is nul");
+                  {
+                    // Normal destruction. 
+                    DelayedCleanupBlock Scope(*this);
+                    EmitCXXDestructorCall(D, Dtor_Complete, 
+                                          /*ForVirtualBase=*/false, Addr);
+                    // Make sure to jump to the exit block.
+                    EmitBranch(Scope.getCleanupExitBlock());
+                  }
+                  if (Exceptions) {
+                    EHCleanupBlock Cleanup(*this);
+                    EmitCXXDestructorCall(D, Dtor_Complete, 
+                                          /*ForVirtualBase=*/false, Addr);
+                  }
+                }
+              }
+          }
             else {
               E = new (getContext()) DeclRefExpr(const_cast<ValueDecl*>(VD),
                                             VD->getType().getNonReferenceType(),