diff options
| -rw-r--r-- | clang/AST/CFG.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/clang/AST/CFG.cpp b/clang/AST/CFG.cpp index b93d77e3fa0..43e6870511e 100644 --- a/clang/AST/CFG.cpp +++ b/clang/AST/CFG.cpp @@ -225,8 +225,7 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* S, bool AlwaysAddStmt = false) { // of the ternary expression. CFGBlock* ConfluenceBlock = (Block) ? Block : createBlock(); ConfluenceBlock->appendStmt(C); - FinishBlock(ConfluenceBlock); - + FinishBlock(ConfluenceBlock); // Create a block for the LHS expression if there is an LHS expression. // A GCC extension allows LHS to be NULL, causing the condition to @@ -317,6 +316,20 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* S, bool AlwaysAddStmt = false) { case Stmt::StmtExprClass: return WalkAST_VisitStmtExpr(cast<StmtExpr>(S)); + case Stmt::UnaryOperatorClass: { + UnaryOperator* U = cast<UnaryOperator>(S); + + // sizeof(expressions). For such expressions, + // the subexpression is not really evaluated, so + // we don't care about control-flow within the sizeof. + if (U->getOpcode() == UnaryOperator::SizeOf) { + Block->appendStmt(S); + return Block; + } + + break; + } + case Stmt::BinaryOperatorClass: { BinaryOperator* B = cast<BinaryOperator>(S); @@ -345,14 +358,16 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* S, bool AlwaysAddStmt = false) { addStmt(B->getRHS()); return addStmt(B->getLHS()); } - - // Fall through to the default case. + + break; } default: - if (AlwaysAddStmt) Block->appendStmt(S); - return WalkAST_VisitChildren(S); + break; }; + + if (AlwaysAddStmt) Block->appendStmt(S); + return WalkAST_VisitChildren(S); } /// WalkAST_VisitDeclSubExprs - Utility method to handle Decls contained in |

