From b51c7f3fe619de753146ffd167f1c6b1df8bf443 Mon Sep 17 00:00:00 2001 From: Andrew Trick Date: Tue, 1 May 2012 23:47:36 +0000 Subject: [PATCH] Revert "Fix RecursiveASTVisitor's data recursion to call the Traverse* functions if they" FAIL: Clang :: Index/index-many-call-ops.cpp git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155962 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/RecursiveASTVisitor.h | 25 +++++-------- unittests/Tooling/RecursiveASTVisitorTest.cpp | 35 ------------------- 2 files changed, 9 insertions(+), 51 deletions(-) diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index e326439334..93363b1715 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -405,14 +405,18 @@ private: bool TraverseFunctionHelper(FunctionDecl *D); bool TraverseVarHelper(VarDecl *D); + bool Walk(Stmt *S); + struct EnqueueJob { Stmt *S; Stmt::child_iterator StmtIt; - EnqueueJob(Stmt *S) : S(S), StmtIt() {} + EnqueueJob(Stmt *S) : S(S), StmtIt() { + if (Expr *E = dyn_cast_or_null(S)) + S = E->IgnoreParens(); + } }; bool dataTraverse(Stmt *S); - bool dataTraverseNode(Stmt *S, bool &EnqueueChildren); }; template @@ -431,12 +435,7 @@ bool RecursiveASTVisitor::dataTraverse(Stmt *S) { if (getDerived().shouldUseDataRecursionFor(CurrS)) { if (job.StmtIt == Stmt::child_iterator()) { - bool EnqueueChildren = true; - if (!dataTraverseNode(CurrS, EnqueueChildren)) return false; - if (!EnqueueChildren) { - Queue.pop_back(); - continue; - } + if (!Walk(CurrS)) return false; job.StmtIt = CurrS->child_begin(); } else { ++job.StmtIt; @@ -457,16 +456,10 @@ bool RecursiveASTVisitor::dataTraverse(Stmt *S) { } template -bool RecursiveASTVisitor::dataTraverseNode(Stmt *S, - bool &EnqueueChildren) { +bool RecursiveASTVisitor::Walk(Stmt *S) { - // Dispatch to the corresponding WalkUpFrom* function only if the derived - // class didn't override Traverse* (and thus the traversal is trivial). #define DISPATCH_WALK(NAME, CLASS, VAR) \ - if (&RecursiveASTVisitor::Traverse##NAME == &Derived::Traverse##NAME) \ - return getDerived().WalkUpFrom##NAME(static_cast(VAR)); \ - EnqueueChildren = false; \ - return getDerived().Traverse##NAME(static_cast(VAR)); + return getDerived().WalkUpFrom##NAME(static_cast(VAR)); if (BinaryOperator *BinOp = dyn_cast(S)) { switch (BinOp->getOpcode()) { diff --git a/unittests/Tooling/RecursiveASTVisitorTest.cpp b/unittests/Tooling/RecursiveASTVisitorTest.cpp index 39803c35bc..d4fda73ccb 100644 --- a/unittests/Tooling/RecursiveASTVisitorTest.cpp +++ b/unittests/Tooling/RecursiveASTVisitorTest.cpp @@ -165,25 +165,6 @@ public: } }; -class CXXOperatorCallExprTraverser - : public ExpectedLocationVisitor { -public: - // Use Traverse, not Visit, to check that data recursion optimization isn't - // bypassing the call of this function. - bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *CE) { - Match(getOperatorSpelling(CE->getOperator()), CE->getExprLoc()); - return ExpectedLocationVisitor::TraverseCXXOperatorCallExpr(CE); - } -}; - -class ParenExprVisitor : public ExpectedLocationVisitor { -public: - bool VisitParenExpr(ParenExpr *Parens) { - Match("", Parens->getExprLoc()); - return true; - } -}; - TEST(RecursiveASTVisitor, VisitsBaseClassDeclarations) { TypeLocVisitor Visitor; Visitor.ExpectMatch("class X", 1, 30); @@ -364,20 +345,4 @@ TEST(RecursiveASTVisitor, NoRecursionInSelfFriend) { "vector_iterator it_int;\n")); } -TEST(RecursiveASTVisitor, TraversesOverloadedOperator) { - CXXOperatorCallExprTraverser Visitor; - Visitor.ExpectMatch("()", 4, 9); - EXPECT_TRUE(Visitor.runOver( - "struct A {\n" - " int operator()();\n" - "} a;\n" - "int k = a();\n")); -} - -TEST(RecursiveASTVisitor, VisitsParensDuringDataRecursion) { - ParenExprVisitor Visitor; - Visitor.ExpectMatch("", 1, 9); - EXPECT_TRUE(Visitor.runOver("int k = (4) + 9;\n")); -} - } // end namespace clang -- 2.40.0