Unfortunately, the bot still seems to be unhappy: http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/12246/steps/build%20fresh%20clang/logs/stdio
On Tue, Nov 24, 2015 at 6:45 PM, Richard Smith <rich...@metafoo.co.uk> wrote: > Hah, looks like a rejects-valid, but it found a real bug, so *shrug*. =) > Hopefully fixed in r254053. > > > On Tue, Nov 24, 2015 at 5:14 PM, Alexey Samsonov <vonos...@gmail.com> > wrote: > >> Hm, looks like we can't compile Clang itself after this change (with GCC): >> >> >> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/12237 >> >> On Tue, Nov 24, 2015 at 3:50 PM, Richard Smith via cfe-commits < >> cfe-commits@lists.llvm.org> wrote: >> >>> Author: rsmith >>> Date: Tue Nov 24 17:50:47 2015 >>> New Revision: 254041 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=254041&view=rev >>> Log: >>> Teach RAV to pass its DataRecursionQueue to derived classes if they ask >>> for it, >>> to allow them to explicitly opt into data recursion despite having >>> overridden >>> Traverse*Stmt or Traverse*Expr. Use this to reintroduce data recursion >>> to the >>> one place that lost it when DataRecursiveASTVisitor was removed. >>> >>> Modified: >>> cfe/trunk/include/clang/AST/RecursiveASTVisitor.h >>> cfe/trunk/tools/libclang/IndexBody.cpp >>> >>> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=254041&r1=254040&r2=254041&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original) >>> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Tue Nov 24 >>> 17:50:47 2015 >>> @@ -14,6 +14,8 @@ >>> #ifndef LLVM_CLANG_AST_RECURSIVEASTVISITOR_H >>> #define LLVM_CLANG_AST_RECURSIVEASTVISITOR_H >>> >>> +#include <type_traits> >>> + >>> #include "clang/AST/Attr.h" >>> #include "clang/AST/Decl.h" >>> #include "clang/AST/DeclCXX.h" >>> @@ -132,13 +134,13 @@ namespace clang { >>> /// instantiations will be visited at the same time as the pattern >>> /// from which they were produced. >>> template <typename Derived> class RecursiveASTVisitor { >>> +public: >>> /// A queue used for performing data recursion over statements. >>> /// Parameters involving this type are used to implement data >>> /// recursion over Stmts and Exprs within this class, and should >>> - /// not be explicitly specified by derived classes. >>> + /// typically not be explicitly specified by derived classes. >>> typedef SmallVectorImpl<Stmt *> DataRecursionQueue; >>> >>> -public: >>> /// \brief Return a reference to the derived class. >>> Derived &getDerived() { return *static_cast<Derived *>(this); } >>> >>> @@ -274,24 +276,32 @@ public: >>> // ---- Methods on Stmts ---- >>> >>> private: >>> - template<typename T, T X, typename U, U Y> >>> - struct is_same_member_pointer : std::false_type {}; >>> - template<typename T, T X> >>> - struct is_same_member_pointer<T, X, T, X> : std::true_type {}; >>> - >>> - // Traverse the given statement. If the traverse function was not >>> overridden, >>> - // pass on the data recursion queue information. >>> + // Determine if the specified derived-class member M can be passed a >>> + // DataRecursionQueue* argument. >>> + template<typename P> >>> + std::false_type callableWithQueue(...); >>> + template<typename P, typename M> >>> + std::true_type callableWithQueue(M m, Derived *d = nullptr, P *p = >>> nullptr, >>> + DataRecursionQueue *q = nullptr, >>> + decltype((d->*m)(p, q)) = false); >>> + >>> + // Traverse the given statement. If the most-derived traverse >>> function takes a >>> + // data recursion queue, pass it on; otherwise, discard it. Note that >>> the >>> + // first branch of this conditional must compile whether or not the >>> derived >>> + // class can take a queue, so if we're taking the second arm, make >>> the first >>> + // arm call our function rather than the derived class version. >>> #define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE) >>> \ >>> - (is_same_member_pointer<decltype(&Derived::Traverse##NAME), >>> \ >>> - &Derived::Traverse##NAME, >>> \ >>> - >>> decltype(&RecursiveASTVisitor::Traverse##NAME), \ >>> - &RecursiveASTVisitor::Traverse##NAME>::value >>> \ >>> - ? this->Traverse##NAME(static_cast<CLASS *>(VAR), QUEUE) >>> \ >>> + (decltype(callableWithQueue<CLASS >>> *>(&Derived::Traverse##NAME))::value \ >>> + ? static_cast<typename std::conditional< >>> \ >>> + decltype( >>> \ >>> + callableWithQueue<CLASS >>> *>(&Derived::Traverse##NAME))::value, \ >>> + Derived &, RecursiveASTVisitor &>::type>(*this) >>> \ >>> + .Traverse##NAME(static_cast<CLASS *>(VAR), QUEUE) >>> \ >>> : getDerived().Traverse##NAME(static_cast<CLASS *>(VAR))) >>> >>> - // Try to traverse the given statement, or enqueue it if we're >>> performing data >>> - // recursion in the middle of traversing another statement. Can only >>> be called >>> - // from within a DEF_TRAVERSE_STMT body or similar context. >>> +// Try to traverse the given statement, or enqueue it if we're >>> performing data >>> +// recursion in the middle of traversing another statement. Can only be >>> called >>> +// from within a DEF_TRAVERSE_STMT body or similar context. >>> #define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S) >>> \ >>> do { >>> \ >>> if (!TRAVERSE_STMT_BASE(Stmt, Stmt, S, Queue)) >>> \ >>> @@ -535,14 +545,6 @@ bool RecursiveASTVisitor<Derived>::Trave >>> if (!S) >>> return true; >>> >>> - // If TraverseStmt was overridden (and called the base class >>> version), don't >>> - // do any data recursion; it would be observable. >>> - if (!is_same_member_pointer<decltype(&Derived::TraverseStmt), >>> - &Derived::TraverseStmt, >>> - >>> decltype(&RecursiveASTVisitor::TraverseStmt), >>> - >>> &RecursiveASTVisitor::TraverseStmt>::value) >>> - return dataTraverseNode(S, nullptr); >>> - >>> if (Queue) { >>> Queue->push_back(S); >>> return true; >>> >>> Modified: cfe/trunk/tools/libclang/IndexBody.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/IndexBody.cpp?rev=254041&r1=254040&r2=254041&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/tools/libclang/IndexBody.cpp (original) >>> +++ cfe/trunk/tools/libclang/IndexBody.cpp Tue Nov 24 17:50:47 2015 >>> @@ -125,10 +125,11 @@ public: >>> return true; >>> } >>> >>> - bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *E) { >>> + bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *E, >>> + DataRecursionQueue *Q = nullptr) { >>> if (E->getOperatorLoc().isInvalid()) >>> return true; // implicit. >>> - return base::TraverseCXXOperatorCallExpr(E); >>> + return base::TraverseCXXOperatorCallExpr(E, Q); >>> } >>> >>> bool VisitDeclStmt(DeclStmt *S) { >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> >> >> >> >> -- >> Alexey Samsonov >> vonos...@gmail.com >> > > -- Alexey Samsonov vonos...@gmail.com
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits