From 20f6ab828a18d21091060966b42bbb4b2908a312 Mon Sep 17 00:00:00 2001 From: John McCall Date: Wed, 12 Jan 2011 03:41:02 +0000 Subject: Fix a latent bug where, after emitting an expression statement, we would delete the block we began emitting into if it had no predecessors. We never want to do this, because there are several valid cases during statement emission where an existing block has no known predecessors but will acquire some later. The case in my test case doesn't inherently fall into this category, because we could safely emit the case-range code before the statement body, but there are examples with labels that can't be fallen into that would also demonstrate this bug. rdar://problem/8837067 llvm-svn: 123303 --- clang/lib/CodeGen/CGException.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'clang/lib/CodeGen/CGException.cpp') diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp index 11e5e645280..252e547b5d1 100644 --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -577,8 +577,10 @@ void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) { Builder.CreateUnreachable(); } - // Clear the insertion point to indicate we are in unreachable code. - Builder.ClearInsertionPoint(); + // throw is an expression, and the expression emitters expect us + // to leave ourselves at a valid insertion point. + EmitBlock(createBasicBlock("throw.cont")); + return; } @@ -627,12 +629,9 @@ void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E) { Builder.CreateUnreachable(); } - // Clear the insertion point to indicate we are in unreachable code. - Builder.ClearInsertionPoint(); - - // FIXME: For now, emit a dummy basic block because expr emitters in generally - // are not ready to handle emitting expressions at unreachable points. - EnsureInsertPoint(); + // throw is an expression, and the expression emitters expect us + // to leave ourselves at a valid insertion point. + EmitBlock(createBasicBlock("throw.cont")); } void CodeGenFunction::EmitStartEHSpec(const Decl *D) { -- cgit v1.2.3