From: Ted Kremenek Date: Fri, 17 Jul 2009 18:20:32 +0000 (+0000) Subject: Move WalkAST logic for 'ChooseExpr' to 'VisitChooseExpr'. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3fc8ef574cdc09c613c329ee511852d219263c15;p=clang Move WalkAST logic for 'ChooseExpr' to 'VisitChooseExpr'. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76205 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 1698048bb7..620a691752 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -99,14 +99,15 @@ public: // Visitors to walk an AST and construct the CFG. Called by buildCFG. Do not // call directly! - CFGBlock* VisitBreakStmt(BreakStmt* B); - CFGBlock* VisitCaseStmt(CaseStmt* Terminator); - CFGBlock* VisitCompoundStmt(CompoundStmt* C); - CFGBlock* VisitConditionalOperator(ConditionalOperator *C); - CFGBlock* VisitContinueStmt(ContinueStmt* C); - CFGBlock* VisitDefaultStmt(DefaultStmt* D); - CFGBlock* VisitDoStmt(DoStmt* D); - CFGBlock* VisitForStmt(ForStmt* F); + CFGBlock *VisitBreakStmt(BreakStmt* B); + CFGBlock *VisitCaseStmt(CaseStmt* Terminator); + CFGBlock *VisitChooseExpr(ChooseExpr *C); + CFGBlock *VisitCompoundStmt(CompoundStmt *C); + CFGBlock *VisitConditionalOperator(ConditionalOperator *C); + CFGBlock *VisitContinueStmt(ContinueStmt *C); + CFGBlock *VisitDefaultStmt(DefaultStmt *D); + CFGBlock *VisitDoStmt(DoStmt *D); + CFGBlock *VisitForStmt(ForStmt *F); CFGBlock* VisitGotoStmt(GotoStmt* G); CFGBlock* VisitIfStmt(IfStmt* I); CFGBlock* VisitIndirectGotoStmt(IndirectGotoStmt* I); @@ -284,32 +285,8 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* Terminator, bool AlwaysAddStmt) { case Stmt::ConditionalOperatorClass: return VisitConditionalOperator(cast(Terminator)); - case Stmt::ChooseExprClass: { - ChooseExpr* C = cast(Terminator); - - CFGBlock* ConfluenceBlock = Block ? Block : createBlock(); - ConfluenceBlock->appendStmt(C); - if (!FinishBlock(ConfluenceBlock)) - return 0; - - Succ = ConfluenceBlock; - Block = NULL; - CFGBlock* LHSBlock = Visit(C->getLHS()); - if (!FinishBlock(LHSBlock)) - return 0; - - Succ = ConfluenceBlock; - Block = NULL; - CFGBlock* RHSBlock = Visit(C->getRHS()); - if (!FinishBlock(RHSBlock)) - return 0; - - Block = createBlock(false); - Block->addSuccessor(LHSBlock); - Block->addSuccessor(RHSBlock); - Block->setTerminator(C); - return addStmt(C->getCond()); - } + case Stmt::ChooseExprClass: + return VisitChooseExpr(cast(Terminator)); case Stmt::DeclStmtClass: { DeclStmt *DS = cast(Terminator); @@ -518,6 +495,30 @@ CFGBlock* CFGBuilder::VisitNullStmt(NullStmt* Statement) { return Block; } +CFGBlock *CFGBuilder::VisitChooseExpr(ChooseExpr *C) { + CFGBlock* ConfluenceBlock = Block ? Block : createBlock(); + ConfluenceBlock->appendStmt(C); + if (!FinishBlock(ConfluenceBlock)) + return 0; + + Succ = ConfluenceBlock; + Block = NULL; + CFGBlock* LHSBlock = Visit(C->getLHS()); + if (!FinishBlock(LHSBlock)) + return 0; + + Succ = ConfluenceBlock; + Block = NULL; + CFGBlock* RHSBlock = Visit(C->getRHS()); + if (!FinishBlock(RHSBlock)) + return 0; + + Block = createBlock(false); + Block->addSuccessor(LHSBlock); + Block->addSuccessor(RHSBlock); + Block->setTerminator(C); + return addStmt(C->getCond()); +} CFGBlock *CFGBuilder::VisitConditionalOperator(ConditionalOperator *C) { // Create the confluence block that will "merge" the results of the ternary