1 //==- CFGRecStmtVisitor - Recursive visitor of CFG statements ---*- C++ --*-==// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the template class CFGRecStmtVisitor, which extends 11 // CFGStmtVisitor by implementing a default recursive visit of all statements. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_ANALYSIS_CFG_REC_STMT_VISITOR_H 16 #define LLVM_CLANG_ANALYSIS_CFG_REC_STMT_VISITOR_H 17 18 #include "clang/Analysis/Visitors/CFGStmtVisitor.h" 19 20 namespace clang { 21 template <typename ImplClass> 22 class CFGRecStmtVisitor : public CFGStmtVisitor<ImplClass,void> { 23 public: 24 VisitStmt(Stmt * S)25 void VisitStmt(Stmt* S) { 26 static_cast< ImplClass* >(this)->VisitChildren(S); 27 } 28 VisitCompoundStmt(CompoundStmt * S)29 void VisitCompoundStmt(CompoundStmt *S) { 30 // Do nothing. Everything in a CompoundStmt is inlined 31 // into the CFG. 32 } 33 VisitConditionVariableInit(Stmt * S)34 void VisitConditionVariableInit(Stmt *S) { 35 assert(S == this->getCurrentBlkStmt()); 36 VarDecl *CondVar = 0; 37 switch (S->getStmtClass()) { 38 #define CONDVAR_CASE(CLASS) \ 39 case Stmt::CLASS ## Class:\ 40 CondVar = cast<CLASS>(S)->getConditionVariable();\ 41 break; 42 CONDVAR_CASE(IfStmt) 43 CONDVAR_CASE(ForStmt) 44 CONDVAR_CASE(SwitchStmt) 45 CONDVAR_CASE(WhileStmt) 46 #undef CONDVAR_CASE 47 default: 48 assert(false && "Infeasible"); 49 } 50 static_cast<ImplClass*>(this)->Visit(CondVar->getInit()); 51 } 52 53 // Defining operator() allows the visitor to be used as a C++ style functor. operator()54 void operator()(Stmt* S) { static_cast<ImplClass*>(this)->BlockStmt_Visit(S);} 55 }; 56 57 } // end namespace clang 58 59 #endif 60