diff --git a/clang/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h b/clang/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h index e46ee11ff4259dec6822254a356fb7c4ffba34fc..e8f74c0a7b270c6fbaea31a429f120f5720d6de1 100644 --- a/clang/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h +++ b/clang/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h @@ -27,7 +27,7 @@ break; #define DEFAULT_DISPATCH(CLASS) void Visit##CLASS(CLASS* D) {} #define DEFAULT_DISPATCH_VARDECL(CLASS) void Visit##CLASS(CLASS* D)\ - { static_cast(this)->Visit##VarDecl(D); } + { static_cast(this)->VisitVarDecl(D); } namespace clang { @@ -36,18 +36,20 @@ class CFGRecStmtDeclVisitor : public CFGRecStmtVisitor { public: void VisitDeclRefExpr(DeclRefExpr* DR) { - static_cast(this)->VisitDeclChain(DR->getDecl()); + for (ScopedDecl* D = DR->getDecl(); D != NULL; D = D->getNextDeclarator()) + static_cast(this)->VisitScopedDecl(D); } - void VisitDeclStmt(DeclStmt* DS) { - static_cast(this)->VisitDeclChain(DS->getDecl()); - } - - void VisitDeclChain(ScopedDecl* D) { - for (; D != NULL; D = D->getNextDeclarator()) - static_cast(this)->VisitScopedDecl(D); + void VisitDeclStmt(DeclStmt* DS) { + for (ScopedDecl* D = DS->getDecl(); D != NULL; D = D->getNextDeclarator()) { + static_cast(this)->VisitScopedDecl(D); + // Visit the initializer. + if (VarDecl* VD = dyn_cast(D)) + if (Expr* I = VD->getInit()) + static_cast(this)->Visit(I); + } } - + void VisitScopedDecl(ScopedDecl* D) { switch (D->getKind()) { DISPATCH_CASE(Function,FunctionDecl)