summaryrefslogtreecommitdiffstats
path: root/clang/AST/CFG.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/AST/CFG.cpp')
-rw-r--r--clang/AST/CFG.cpp27
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
OpenPOWER on IntegriCloud