From: Ted Kremenek Date: Sat, 18 Jul 2009 00:47:21 +0000 (+0000) Subject: Fix some fallout from CFGBuilder restructuring: all expressions that we explicitly... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=13fc08a323b29dd97a46def1e3a15bf082476efa;p=clang Fix some fallout from CFGBuilder restructuring: all expressions that we explicitly handle have the possibility to be block-level expressions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76277 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index fb3165ed39..5a9e611432 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -100,8 +100,8 @@ private: // Visitors to walk an AST and construct the CFG. CFGBlock *VisitAddrLabelExpr(AddrLabelExpr *A, bool alwaysAdd); CFGBlock *VisitBinaryOperator(BinaryOperator *B, bool alwaysAdd); - CFGBlock *VisitBlockExpr(BlockExpr* E); - CFGBlock *VisitBlockDeclRefExpr(BlockDeclRefExpr* E); + CFGBlock *VisitBlockExpr(BlockExpr* E, bool alwaysAdd); + CFGBlock *VisitBlockDeclRefExpr(BlockDeclRefExpr* E, bool alwaysAdd); CFGBlock *VisitBreakStmt(BreakStmt *B); CFGBlock *VisitCallExpr(CallExpr *C, bool alwaysAdd); CFGBlock *VisitCaseStmt(CaseStmt *C); @@ -124,8 +124,8 @@ private: CFGBlock *VisitObjCAtTryStmt(ObjCAtTryStmt *S); CFGBlock *VisitObjCForCollectionStmt(ObjCForCollectionStmt *S); CFGBlock *VisitReturnStmt(ReturnStmt* R); - CFGBlock *VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); - CFGBlock *VisitStmtExpr(StmtExpr *S); + CFGBlock *VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E, bool alwaysAdd); + CFGBlock *VisitStmtExpr(StmtExpr *S, bool alwaysAdd); CFGBlock *VisitSwitchStmt(SwitchStmt *S); CFGBlock *VisitWhileStmt(WhileStmt *W); @@ -275,10 +275,10 @@ tryAgain: return VisitBinaryOperator(cast(S), alwaysAdd); case Stmt::BlockExprClass: - return VisitBlockExpr(cast(S)); + return VisitBlockExpr(cast(S), alwaysAdd); case Stmt::BlockDeclRefExprClass: - return VisitBlockDeclRefExpr(cast(S)); + return VisitBlockDeclRefExpr(cast(S), alwaysAdd); case Stmt::BreakStmtClass: return VisitBreakStmt(cast(S)); @@ -351,10 +351,10 @@ tryAgain: return VisitReturnStmt(cast(S)); case Stmt::SizeOfAlignOfExprClass: - return VisitSizeOfAlignOfExpr(cast(S)); + return VisitSizeOfAlignOfExpr(cast(S), alwaysAdd); case Stmt::StmtExprClass: - return VisitStmtExpr(cast(S)); + return VisitStmtExpr(cast(S), alwaysAdd); case Stmt::SwitchStmtClass: return VisitSwitchStmt(cast(S)); @@ -438,12 +438,13 @@ CFGBlock *CFGBuilder::VisitBinaryOperator(BinaryOperator *B, bool alwaysAdd) { return VisitStmt(B, alwaysAdd); } -CFGBlock *CFGBuilder::VisitBlockExpr(BlockExpr* E) { +CFGBlock *CFGBuilder::VisitBlockExpr(BlockExpr* E, bool alwaysAdd) { // FIXME return NYS(); } -CFGBlock *CFGBuilder::VisitBlockDeclRefExpr(BlockDeclRefExpr* E) { +CFGBlock *CFGBuilder::VisitBlockDeclRefExpr(BlockDeclRefExpr* E, + bool alwaysAdd) { // FIXME return NYS(); } @@ -1254,28 +1255,31 @@ CFGBlock* CFGBuilder::VisitContinueStmt(ContinueStmt* C) { return Block; } -CFGBlock *CFGBuilder::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { +CFGBlock *CFGBuilder::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E, + bool alwaysAdd) { + + if (alwaysAdd) { + autoCreateBlock(); + Block->appendStmt(E); + } + // VLA types have expressions that must be evaluated. if (E->isArgumentType()) { for (VariableArrayType* VA = FindVA(E->getArgumentType().getTypePtr()); VA != 0; VA = FindVA(VA->getElementType().getTypePtr())) addStmt(VA->getSizeExpr()); } - // Expressions in sizeof/alignof are not evaluated and thus have no - // control flow. - else { - autoCreateBlock(); - Block->appendStmt(E); - } return Block; } /// VisitStmtExpr - Utility method to handle (nested) statement /// expressions (a GCC extension). -CFGBlock* CFGBuilder::VisitStmtExpr(StmtExpr *SE) { - autoCreateBlock(); - Block->appendStmt(SE); +CFGBlock* CFGBuilder::VisitStmtExpr(StmtExpr *SE, bool alwaysAdd) { + if (alwaysAdd) { + autoCreateBlock(); + Block->appendStmt(SE); + } return VisitCompoundStmt(SE->getSubStmt()); }