Author: djasper Date: Wed Jun 13 02:12:33 2012 New Revision: 158395 URL: http://llvm.org/viewvc/llvm-project?rev=158395&view=rev Log: Rename shouldVisitImplicitDeclarations to shouldVisitImplicitCode. Fix RecursiveASTVisitor to visit CXXForRangeStmts accordingly to visit implicit or explicit code.
The key bug that inspired this was the Visitor not visiting the range initializer of such a loop, which is explicit code. Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h cfe/trunk/unittests/Tooling/RecursiveASTVisitorTest.cpp Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=158395&r1=158394&r2=158395&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original) +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Wed Jun 13 02:12:33 2012 @@ -149,8 +149,8 @@ bool shouldWalkTypesOfTypeLocs() const { return true; } /// \brief Return whether this visitor should recurse into implicit - /// declarations, e.g., implicit constructors and destructors. - bool shouldVisitImplicitDeclarations() const { return false; } + /// code, e.g., implicit constructors and destructors. + bool shouldVisitImplicitCode() const { return false; } /// \brief Return whether \param S should be traversed using data recursion /// to avoid a stack overflow with extreme cases. @@ -607,7 +607,7 @@ // As a syntax visitor, by default we want to ignore declarations for // implicit declarations (ones not typed explicitly by the user). - if (!getDerived().shouldVisitImplicitDeclarations() && D->isImplicit()) + if (!getDerived().shouldVisitImplicitCode() && D->isImplicit()) return true; switch (D->getKind()) { @@ -1755,7 +1755,8 @@ bool RecursiveASTVisitor<Derived>::TraverseVarHelper(VarDecl *D) { TRY_TO(TraverseDeclaratorHelper(D)); // Default params are taken care of when we traverse the ParmVarDecl. - if (!isa<ParmVarDecl>(D)) + if (!isa<ParmVarDecl>(D) && + (!D->isCXXForRangeDecl() || shouldVisitImplicitCode())) TRY_TO(TraverseStmt(D->getInit())); return true; } @@ -1873,7 +1874,14 @@ DEF_TRAVERSE_STMT(ObjCAtTryStmt, { }) DEF_TRAVERSE_STMT(ObjCForCollectionStmt, { }) DEF_TRAVERSE_STMT(ObjCAutoreleasePoolStmt, { }) -DEF_TRAVERSE_STMT(CXXForRangeStmt, { }) +DEF_TRAVERSE_STMT(CXXForRangeStmt, { + if (!shouldVisitImplicitCode()) { + TRY_TO(TraverseStmt(S->getLoopVarStmt())); + TRY_TO(TraverseStmt(S->getRangeInit())); + // Visit everything else only if shouldVisitImplicitCode(). + return true; + } +}) DEF_TRAVERSE_STMT(MSDependentExistsStmt, { TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc())); TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo())); Modified: cfe/trunk/unittests/Tooling/RecursiveASTVisitorTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Tooling/RecursiveASTVisitorTest.cpp?rev=158395&r1=158394&r2=158395&view=diff ============================================================================== --- cfe/trunk/unittests/Tooling/RecursiveASTVisitorTest.cpp (original) +++ cfe/trunk/unittests/Tooling/RecursiveASTVisitorTest.cpp Wed Jun 13 02:12:33 2012 @@ -142,6 +142,14 @@ } }; +class VarDeclVisitor : public ExpectedLocationVisitor<VarDeclVisitor> { +public: + bool VisitVarDecl(VarDecl *Variable) { + Match(Variable->getNameAsString(), Variable->getLocStart()); + return true; + } +}; + class CXXMemberCallVisitor : public ExpectedLocationVisitor<CXXMemberCallVisitor> { public: @@ -250,6 +258,22 @@ "void x(); template <void (*T)()> class X {};\nX<x> y;")); } +TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtRange) { + DeclRefExprVisitor Visitor; + Visitor.ExpectMatch("x", 2, 25); + EXPECT_TRUE(Visitor.runOver( + "int x[5];\n" + "void f() { for (int i : x) {} }")); +} + +TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtLoopVariable) { + VarDeclVisitor Visitor; + Visitor.ExpectMatch("i", 2, 17); + EXPECT_TRUE(Visitor.runOver( + "int x[5];\n" + "void f() { for (int i : x) {} }")); +} + TEST(RecursiveASTVisitor, VisitsCallExpr) { DeclRefExprVisitor Visitor; Visitor.ExpectMatch("x", 1, 22); @@ -452,7 +476,7 @@ class ImplicitCtorVisitor : public ExpectedLocationVisitor<ImplicitCtorVisitor> { public: - bool shouldVisitImplicitDeclarations() const { return true; } + bool shouldVisitImplicitCode() const { return true; } bool VisitCXXConstructorDecl(CXXConstructorDecl* Ctor) { if (Ctor->isImplicit()) { // Was not written in source code _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits