Author: akirtzidis Date: Mon Feb 29 01:55:55 2016 New Revision: 262206 URL: http://llvm.org/viewvc/llvm-project?rev=262206&view=rev Log: [AST/RecursiveASTVisitor] Correction so that dataTraverseStmtPost will get called after the statement has been visited.
Fixes the indexing client of this. Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h cfe/trunk/test/Index/Core/index-source.m Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=262206&r1=262205&r2=262206&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original) +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Mon Feb 29 01:55:55 2016 @@ -139,7 +139,9 @@ public: /// Parameters involving this type are used to implement data /// recursion over Stmts and Exprs within this class, and should /// typically not be explicitly specified by derived classes. - typedef SmallVectorImpl<Stmt *> DataRecursionQueue; + /// The bool bit indicates whether the statement has been traversed or not. + typedef SmallVectorImpl<llvm::PointerIntPair<Stmt *, 1, bool>> + DataRecursionQueue; /// \brief Return a reference to the derived class. Derived &getDerived() { return *static_cast<Derived *>(this); } @@ -561,23 +563,32 @@ bool RecursiveASTVisitor<Derived>::Trave return true; if (Queue) { - Queue->push_back(S); + Queue->push_back({S, false}); return true; } - SmallVector<Stmt *, 8> LocalQueue; - LocalQueue.push_back(S); + SmallVector<llvm::PointerIntPair<Stmt *, 1, bool>, 8> LocalQueue; + LocalQueue.push_back({S, false}); while (!LocalQueue.empty()) { - Stmt *CurrS = LocalQueue.pop_back_val(); + auto &CurrSAndVisited = LocalQueue.back(); + Stmt *CurrS = CurrSAndVisited.getPointer(); + bool Visited = CurrSAndVisited.getInt(); + if (Visited) { + LocalQueue.pop_back(); + TRY_TO(dataTraverseStmtPost(CurrS)); + continue; + } - size_t N = LocalQueue.size(); if (getDerived().dataTraverseStmtPre(CurrS)) { + CurrSAndVisited.setInt(true); + size_t N = LocalQueue.size(); TRY_TO(dataTraverseNode(CurrS, &LocalQueue)); - TRY_TO(dataTraverseStmtPost(CurrS)); + // Process new children in the order they were added. + std::reverse(LocalQueue.begin() + N, LocalQueue.end()); + } else { + LocalQueue.pop_back(); } - // Process new children in the order they were added. - std::reverse(LocalQueue.begin() + N, LocalQueue.end()); } return true; Modified: cfe/trunk/test/Index/Core/index-source.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/index-source.m?rev=262206&r1=262205&r2=262206&view=diff ============================================================================== --- cfe/trunk/test/Index/Core/index-source.m (original) +++ cfe/trunk/test/Index/Core/index-source.m Mon Feb 29 01:55:55 2016 @@ -6,3 +6,13 @@ // CHECK: [[@LINE-1]]:1 | objc-instance-method/ObjC | meth | c:objc(cs)Base(im)meth | -[Base meth] | Decl,Dyn,RelChild | rel: 1 // CHECK-NEXT: RelChild | Base | c:objc(cs)Base @end + +void foo(); +// CHECK: [[@LINE+1]]:6 | function/C | goo | c:@F@goo | _goo | Def | rel: 0 +void goo(Base *b) { + // CHECK: [[@LINE+1]]:3 | function/C | foo | c:@F@foo | _foo | Ref,Call | rel: 0 + foo(); + // CHECK: [[@LINE+2]]:6 | objc-instance-method/ObjC | meth | c:objc(cs)Base(im)meth | -[Base meth] | Ref,Call,Dyn,RelRec | rel: 1 + // CHECK-NEXT: RelRec | Base | c:objc(cs)Base + [b meth]; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits