diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-04-28 03:09:44 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-04-28 03:09:44 +0000 |
commit | f6e8541dd884029b85483a319ce7d32f3e476dcc (patch) | |
tree | b7dda2fde15d6d06ee9dd56baadfafb400bb8b20 /lib/AST/CFG.cpp | |
parent | fc0fed3fc7159d17dc6a08e91a4eda413ace3642 (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.cpp | 15 |
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; |