Add a cleanup scope for each catch clause.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90357 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp
index f4d235c..02bc05a 100644
--- a/lib/CodeGen/CGException.cpp
+++ b/lib/CodeGen/CGException.cpp
@@ -381,29 +381,33 @@
 
     llvm::Value *ExcObject = Builder.CreateCall(getBeginCatchFn(*this), Exc);
 
-    // Bind the catch parameter if it exists.
-    if (CatchParam) {
-      QualType CatchType = CatchParam->getType().getNonReferenceType();
-      setInvokeDest(TerminateHandler);
-      if (!CatchType.getTypePtr()->isPointerType())
-        CatchType = getContext().getPointerType(CatchType);
-      ExcObject =
-        Builder.CreateBitCast(ExcObject, ConvertType(CatchType));
+    {
+      CleanupScope CatchScope(*this);
+      // Bind the catch parameter if it exists.
+      if (CatchParam) {
+        QualType CatchType = CatchParam->getType().getNonReferenceType();
+        setInvokeDest(TerminateHandler);
+        if (!CatchType.getTypePtr()->isPointerType())
+          CatchType = getContext().getPointerType(CatchType);
+        ExcObject = Builder.CreateBitCast(ExcObject, ConvertType(CatchType));
         // CatchParam is a ParmVarDecl because of the grammar
         // construction used to handle this, but for codegen purposes
         // we treat this as a local decl.
-      EmitLocalBlockVarDecl(*CatchParam);
+        EmitLocalBlockVarDecl(*CatchParam);
 #if 0
-      // FIXME: objects with ctors, references
-      Builder.CreateStore(ExcObject, GetAddrOfLocalVar(CatchParam));
+        // FIXME: objects with ctors, references
+        Builder.CreateStore(ExcObject, GetAddrOfLocalVar(CatchParam));
 #else
-      CopyObject(*this, CatchParam->getType().getNonReferenceType(),
-                 ExcObject, GetAddrOfLocalVar(CatchParam));
+        // FIXME: we need to do this sooner so that the EH region for the cleanup doesn't start until after the ctor completes, use a decl init?
+        CopyObject(*this, CatchParam->getType().getNonReferenceType(),
+                   ExcObject, GetAddrOfLocalVar(CatchParam));
 #endif
-      setInvokeDest(MatchHandler);
+        setInvokeDest(MatchHandler);
+      }
+
+      EmitStmt(CatchBody);
     }
 
-    EmitStmt(CatchBody);
     EmitBranchThroughCleanup(FinallyEnd);
 
     EmitBlock(MatchHandler);