From: Ted Kremenek Date: Wed, 19 Sep 2007 18:00:03 +0000 (+0000) Subject: More refactoring: decl and expr regisitration now uses CFGRecStmtDeclVisitor. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b2977544b4372fd54a8c24e12920d7c7c50cd7ef;p=clang More refactoring: decl and expr regisitration now uses CFGRecStmtDeclVisitor. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42145 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Analysis/UninitializedValues.cpp b/Analysis/UninitializedValues.cpp index afd77e31d6..ec209cd670 100644 --- a/Analysis/UninitializedValues.cpp +++ b/Analysis/UninitializedValues.cpp @@ -12,7 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/UninitializedValues.h" -#include "clang/Analysis/CFGStmtVisitor.h" +#include "clang/Analysis/CFGRecStmtDeclVisitor.h" #include "clang/Analysis/LocalCheckers.h" #include "clang/Basic/Diagnostic.h" #include "clang/AST/ASTContext.h" @@ -28,39 +28,24 @@ using namespace clang; namespace { -class RegisterDeclsAndExprs : public CFGStmtVisitor { +class RegisterDeclsExprs : public CFGRecStmtDeclVisitor { UninitializedValues::AnalysisDataTy& AD; public: - RegisterDeclsAndExprs(UninitializedValues::AnalysisDataTy& ad) : AD(ad) {} + RegisterDeclsExprs(UninitializedValues::AnalysisDataTy& ad) : AD(ad) {} void VisitBlockVarDecl(BlockVarDecl* VD) { - if (AD.VMap.find(VD) == AD.VMap.end()) - AD.VMap[VD] = AD.NumDecls++; - } - - void VisitDeclChain(ScopedDecl* D) { - for (; D != NULL; D = D->getNextDeclarator()) - if (BlockVarDecl* VD = dyn_cast(D)) - VisitBlockVarDecl(VD); + if (!AD.isTracked(VD)) AD[VD] = AD.NumDecls++; } - void BlockStmt_VisitExpr(Expr* E) { - if (AD.EMap.find(E) == AD.EMap.end()) - AD.EMap[E] = AD.NumBlockExprs++; - - Visit(E); + void BlockStmt_VisitExpr(Expr* E) { + if (!AD.isTracked(E)) AD[E] = AD.NumBlockExprs++; } - - void VisitDeclRefExpr(DeclRefExpr* DR) { VisitDeclChain(DR->getDecl()); } - void VisitDeclStmt(DeclStmt* S) { VisitDeclChain(S->getDecl()); } - void VisitStmt(Stmt* S) { VisitChildren(S); } - void operator()(Stmt* S) { BlockStmt_Visit(S); } }; } // end anonymous namespace void UninitializedValues::InitializeValues(const CFG& cfg) { - RegisterDeclsAndExprs R(this->getAnalysisData()); + RegisterDeclsExprs R(this->getAnalysisData()); cfg.VisitBlockStmts(R); } diff --git a/include/clang/Analysis/UninitializedValues.h b/include/clang/Analysis/UninitializedValues.h index 21e1ebd447..8cfa29efc0 100644 --- a/include/clang/Analysis/UninitializedValues.h +++ b/include/clang/Analysis/UninitializedValues.h @@ -54,6 +54,9 @@ public: bool isTracked(const Expr* E) { return EMap.find(E) != EMap.end(); } + + unsigned& operator[](const BlockVarDecl *VD) { return VMap[VD]; } + unsigned& operator[](const Expr* E) { return EMap[E]; } }; //===--------------------------------------------------------------------===//