]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/clang/include/clang/Analysis/Visitors/CFGRecStmtVisitor.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / clang / include / clang / Analysis / Visitors / CFGRecStmtVisitor.h
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
25   void VisitStmt(Stmt *S) {
26     static_cast< ImplClass* >(this)->VisitChildren(S);
27   }
28   
29   void VisitCompoundStmt(CompoundStmt *S) {
30     // Do nothing.  Everything in a CompoundStmt is inlined
31     // into the CFG.
32   }
33   
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         llvm_unreachable("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.
54   void operator()(Stmt *S) { static_cast<ImplClass*>(this)->BlockStmt_Visit(S);}
55 };
56
57 } // end namespace clang
58
59 #endif