aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2010-01-20 01:30:58 +0000
committerMike Stump <mrs@apple.com>2010-01-20 01:30:58 +0000
commitf00cca5e05bb9ea51a3a21c8014ff9f3508d46e9 (patch)
tree95ee68eea3fffab07e57478b3f118cb72557400b
parenta1f93631a84621d77aeb627691da85a8991af188 (diff)
Wire up the EH context for the catch clauses to the outer EH context. WIP.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93963 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/CFG.cpp18
1 files changed, 9 insertions, 9 deletions
diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp
index 33c3f551dd..97bf675180 100644
--- a/lib/Analysis/CFG.cpp
+++ b/lib/Analysis/CFG.cpp
@@ -1598,14 +1598,12 @@ CFGBlock *CFGBuilder::VisitCXXTryStmt(CXXTryStmt *Terminator) {
TrySuccessor = Block;
} else TrySuccessor = Succ;
- // Save the current "try" context.
CFGBlock *PrevTryTerminatedBlock = TryTerminatedBlock;
- SaveAndRestore<CFGBlock*> save_try(TryTerminatedBlock);
// Create a new block that will contain the try statement.
- TryTerminatedBlock = createBlock(false);
+ CFGBlock *NewTryTerminatedBlock = createBlock(false);
// Add the terminator in the try block.
- TryTerminatedBlock->setTerminator(Terminator);
+ NewTryTerminatedBlock->setTerminator(Terminator);
bool HasCatchAll = false;
for (unsigned h = 0; h <Terminator->getNumHandlers(); ++h) {
@@ -1621,20 +1619,22 @@ CFGBlock *CFGBuilder::VisitCXXTryStmt(CXXTryStmt *Terminator) {
return 0;
// Add this block to the list of successors for the block with the try
// statement.
- AddSuccessor(TryTerminatedBlock, CatchBlock);
+ AddSuccessor(NewTryTerminatedBlock, CatchBlock);
}
if (!HasCatchAll) {
if (PrevTryTerminatedBlock)
- AddSuccessor(TryTerminatedBlock, PrevTryTerminatedBlock);
+ AddSuccessor(NewTryTerminatedBlock, PrevTryTerminatedBlock);
else
- AddSuccessor(TryTerminatedBlock, &cfg->getExit());
+ AddSuccessor(NewTryTerminatedBlock, &cfg->getExit());
}
// The code after the try is the implicit successor.
Succ = TrySuccessor;
- // When visiting the body, the case statements should automatically get linked
- // up to the try.
+ // Save the current "try" context.
+ SaveAndRestore<CFGBlock*> save_try(TryTerminatedBlock);
+ TryTerminatedBlock = NewTryTerminatedBlock;
+
assert(Terminator->getTryBlock() && "try must contain a non-NULL body");
Block = NULL;
Block = addStmt(Terminator->getTryBlock());