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
This commit is contained in:
John McCall
2011-01-12 03:41:02 +00:00
parent dd5f60b7a7
commit 20f6ab828a
4 changed files with 69 additions and 27 deletions

View File

@@ -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) {