r254041 - Teach RAV to pass its DataRecursionQueue to derived classes if they ask for it,
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 25 15:18:32 PST 2015
Looks like the bots are all happy now.
On Tue, Nov 24, 2015 at 11:45 PM, Alexey Samsonov <vonosmas at gmail.com>
wrote:
> 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 <richard at 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 <vonosmas at 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 at 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 at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>
>>>
>>>
>>> --
>>> Alexey Samsonov
>>> vonosmas at gmail.com
>>>
>>
>>
>
>
> --
> Alexey Samsonov
> vonosmas at gmail.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151125/1df47740/attachment-0001.html>
More information about the cfe-commits
mailing list