]> granicus.if.org Git - clang/commitdiff
Added support for GCC-style statement expressions in source-level CFGs.
authorTed Kremenek <kremenek@apple.com>
Tue, 28 Aug 2007 18:30:10 +0000 (18:30 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 28 Aug 2007 18:30:10 +0000 (18:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41549 91177308-0d34-0410-b5e6-96231b3b80d8

AST/CFG.cpp

index 68471ac955ae69e5c4d379e9c644040d631e6763..fb5046266032fd447839e67222cdf1cb5cb5936a 100644 (file)
@@ -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<StmtExpr>(S));
 
     case Stmt::BinaryOperatorClass: {
       BinaryOperator* B = cast<BinaryOperator>(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