aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/CFG.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-04-28 03:09:44 +0000
committerTed Kremenek <kremenek@apple.com>2009-04-28 03:09:44 +0000
commitf6e8541dd884029b85483a319ce7d32f3e476dcc (patch)
treeb7dda2fde15d6d06ee9dd56baadfafb400bb8b20 /lib/AST/CFG.cpp
parentfc0fed3fc7159d17dc6a08e91a4eda413ace3642 (diff)
CFG: 'WhileStmts' needs an extra block to indicate the "loop back" path.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70280 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/CFG.cpp')
-rw-r--r--lib/AST/CFG.cpp15
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/AST/CFG.cpp b/lib/AST/CFG.cpp
index 00f5960e11..ea29259f9e 100644
--- a/lib/AST/CFG.cpp
+++ b/lib/AST/CFG.cpp
@@ -934,7 +934,7 @@ CFGBlock* CFGBuilder::VisitWhileStmt(WhileStmt* W) {
if (Stmt* C = W->getCond()) {
Block = ExitConditionBlock;
EntryConditionBlock = addStmt(C);
- assert (Block == EntryConditionBlock);
+ assert(Block == EntryConditionBlock);
if (Block) FinishBlock(EntryConditionBlock);
}
@@ -944,15 +944,20 @@ CFGBlock* CFGBuilder::VisitWhileStmt(WhileStmt* W) {
// Process the loop body.
{
- assert (W->getBody());
+ assert(W->getBody());
// Save the current values for Block, Succ, and continue and break targets
SaveAndRestore<CFGBlock*> save_Block(Block), save_Succ(Succ),
save_continue(ContinueTargetBlock),
save_break(BreakTargetBlock);
-
- // All continues within this loop should go to the condition block
- ContinueTargetBlock = EntryConditionBlock;
+
+ // Create an empty block to represent the transition block for looping
+ // back to the head of the loop.
+ Block = 0;
+ assert(Succ == EntryConditionBlock);
+ Succ = createBlock();
+ Succ->setLoopTarget(W);
+ ContinueTargetBlock = Succ;
// All breaks should go to the code following the loop.
BreakTargetBlock = LoopSuccessor;