From: Ted Kremenek Date: Tue, 28 Aug 2007 18:30:10 +0000 (+0000) Subject: Added support for GCC-style statement expressions in source-level CFGs. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=15c27a84e529f1195286c122affe0b2991fcb5ff;p=clang Added support for GCC-style statement expressions in source-level CFGs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41549 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/CFG.cpp b/AST/CFG.cpp index 68471ac955..fb50462660 100644 --- a/AST/CFG.cpp +++ b/AST/CFG.cpp @@ -102,6 +102,7 @@ private: CFGBlock* WalkAST(Stmt* S, bool AlwaysAddStmt); CFGBlock* WalkAST_VisitChildren(Stmt* S); CFGBlock* WalkAST_VisitVarDecl(VarDecl* D); + CFGBlock* WalkAST_VisitStmtExpr(StmtExpr* S); void FinishBlock(CFGBlock* B); }; @@ -218,6 +219,9 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* S, bool AlwaysAddStmt = false) { return WalkAST_VisitVarDecl(V); } else return Block; + + case Stmt::StmtExprClass: + return WalkAST_VisitStmtExpr(cast(S)); case Stmt::BinaryOperatorClass: { BinaryOperator* B = cast(S); @@ -287,6 +291,13 @@ CFGBlock* CFGBuilder::WalkAST_VisitChildren(Stmt* S) { return B; } +/// WalkAST_VisitStmtExpr - Utility method to handle (nested) statement +/// expressions (a GCC extension). +CFGBlock* CFGBuilder::WalkAST_VisitStmtExpr(StmtExpr* S) { + Block->appendStmt(S); + return VisitCompoundStmt(S->getSubStmt()); +} + /// VisitStmt - Handle statements with no branching control flow. CFGBlock* CFGBuilder::VisitStmt(Stmt* Statement) { // We cannot assume that we are in the middle of a basic block, since