From: Ted Kremenek Date: Tue, 28 Apr 2009 03:09:44 +0000 (+0000) Subject: CFG: 'WhileStmts' needs an extra block to indicate the "loop back" path. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f6e8541dd884029b85483a319ce7d32f3e476dcc;p=clang 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 --- 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 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;