r250831 - [AST] Put TypeLocs and NestedNameSpecifierLocs into the ParentMap.

Daniel Jasper via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 21 03:21:26 PDT 2015


Thanks.

On Wed, Oct 21, 2015 at 12:14 PM, Benjamin Kramer <benny.kra at gmail.com>
wrote:

> Reverted for now in r250889.
>
> On Wed, Oct 21, 2015 at 12:07 PM, Daniel Jasper <djasper at google.com>
> wrote:
> > I think we'll need to come up with a different solution. The problem is
> that
> > DynTypedNode is 5 times larger than the bare pointer and we are storing
> many
> > more elements in the ParentMap. This means, this change is effectively
> > increasing the parent map by 10x and it was already large to begin with.
> >
> > Please revert and lets come up with a different solution.
> >
> > On Tue, Oct 20, 2015 at 5:08 PM, Benjamin Kramer via cfe-commits
> > <cfe-commits at lists.llvm.org> wrote:
> >>
> >> Author: d0k
> >> Date: Tue Oct 20 10:08:46 2015
> >> New Revision: 250831
> >>
> >> URL: http://llvm.org/viewvc/llvm-project?rev=250831&view=rev
> >> Log:
> >> [AST] Put TypeLocs and NestedNameSpecifierLocs into the ParentMap.
> >>
> >> Firstly this changes the type of parent map to be keyed on DynTypedNode
> to
> >> simplify the following changes. This comes with a DenseMapInfo for
> >> DynTypedNode, which is a bit incomplete still and will probably only
> work
> >> for parentmap right now.
> >>
> >> Then the RecursiveASTVisitor in ASTContext is updated and finally
> >> ASTMatchers hasParent and hasAncestor learn about the new functionality.
> >>
> >> Now ParentMap is only missing TemplateArgumentLocs and
> >> CXXCtorInitializers.
> >>
> >> Differential Revision: http://reviews.llvm.org/D13897
> >>
> >> Modified:
> >>     cfe/trunk/include/clang/AST/ASTContext.h
> >>     cfe/trunk/include/clang/AST/ASTTypeTraits.h
> >>     cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
> >>     cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
> >>     cfe/trunk/lib/AST/ASTContext.cpp
> >>     cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp
> >>     cfe/trunk/unittests/AST/ASTContextParentMapTest.cpp
> >>     cfe/trunk/unittests/ASTMatchers/Dynamic/ParserTest.cpp
> >>     cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp
> >>
> >> Modified: cfe/trunk/include/clang/AST/ASTContext.h
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=250831&r1=250830&r2=250831&view=diff
> >>
> >>
> ==============================================================================
> >> --- cfe/trunk/include/clang/AST/ASTContext.h (original)
> >> +++ cfe/trunk/include/clang/AST/ASTContext.h Tue Oct 20 10:08:46 2015
> >> @@ -452,7 +452,7 @@ public:
> >>    typedef llvm::SmallVector<ast_type_traits::DynTypedNode, 2>
> >> ParentVector;
> >>
> >>    /// \brief Maps from a node to its parents.
> >> -  typedef llvm::DenseMap<const void *,
> >> +  typedef llvm::DenseMap<ast_type_traits::DynTypedNode,
> >>
>  llvm::PointerUnion<ast_type_traits::DynTypedNode
> >> *,
> >>                                              ParentVector *>> ParentMap;
> >>
> >>
> >> Modified: cfe/trunk/include/clang/AST/ASTTypeTraits.h
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTTypeTraits.h?rev=250831&r1=250830&r2=250831&view=diff
> >>
> >>
> ==============================================================================
> >> --- cfe/trunk/include/clang/AST/ASTTypeTraits.h (original)
> >> +++ cfe/trunk/include/clang/AST/ASTTypeTraits.h Tue Oct 20 10:08:46 2015
> >> @@ -253,10 +253,30 @@ public:
> >>    /// @{
> >>    /// \brief Imposes an order on \c DynTypedNode.
> >>    ///
> >> -  /// Supports comparison of nodes that support memoization.
> >> -  /// FIXME: Implement comparsion for other node types (currently
> >> -  /// only Stmt, Decl, Type and NestedNameSpecifier return memoization
> >> data).
> >> +  /// FIXME: Implement comparsion for other node types.
> >>    bool operator<(const DynTypedNode &Other) const {
> >> +    if (!NodeKind.isSame(Other.NodeKind))
> >> +      return NodeKind < Other.NodeKind;
> >> +
> >> +    if (ASTNodeKind::getFromNodeKind<TypeLoc>().isSame(NodeKind)) {
> >> +      auto TLA = getUnchecked<TypeLoc>();
> >> +      auto TLB = Other.getUnchecked<TypeLoc>();
> >> +      return std::make_pair(TLA.getType().getAsOpaquePtr(),
> >> +                            TLA.getOpaqueData()) <
> >> +             std::make_pair(TLB.getType().getAsOpaquePtr(),
> >> +                            TLB.getOpaqueData());
> >> +    }
> >> +
> >> +    if (ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>().isSame(
> >> +            NodeKind)) {
> >> +      auto NNSLA = getUnchecked<NestedNameSpecifierLoc>();
> >> +      auto NNSLB = Other.getUnchecked<NestedNameSpecifierLoc>();
> >> +      return std::make_pair(NNSLA.getNestedNameSpecifier(),
> >> +                            NNSLA.getOpaqueData()) <
> >> +             std::make_pair(NNSLB.getNestedNameSpecifier(),
> >> +                            NNSLB.getOpaqueData());
> >> +    }
> >> +
> >>      assert(getMemoizationData() && Other.getMemoizationData());
> >>      return getMemoizationData() < Other.getMemoizationData();
> >>    }
> >> @@ -270,6 +290,13 @@ public:
> >>      if (ASTNodeKind::getFromNodeKind<QualType>().isSame(NodeKind))
> >>        return getUnchecked<QualType>() ==
> Other.getUnchecked<QualType>();
> >>
> >> +    if (ASTNodeKind::getFromNodeKind<TypeLoc>().isSame(NodeKind))
> >> +      return getUnchecked<TypeLoc>() == Other.getUnchecked<TypeLoc>();
> >> +
> >> +    if
> >>
> (ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>().isSame(NodeKind))
> >> +      return getUnchecked<NestedNameSpecifierLoc>() ==
> >> +             Other.getUnchecked<NestedNameSpecifierLoc>();
> >> +
> >>      assert(getMemoizationData() && Other.getMemoizationData());
> >>      return getMemoizationData() == Other.getMemoizationData();
> >>    }
> >> @@ -278,6 +305,47 @@ public:
> >>    }
> >>    /// @}
> >>
> >> +  /// \brief Hooks for using DynTypedNode as a key in a DenseMap.
> >> +  struct DenseMapInfo {
> >> +    static inline DynTypedNode getEmptyKey() {
> >> +      DynTypedNode Node;
> >> +      Node.NodeKind = ASTNodeKind::DenseMapInfo::getEmptyKey();
> >> +      return Node;
> >> +    }
> >> +    static inline DynTypedNode getTombstoneKey() {
> >> +      DynTypedNode Node;
> >> +      Node.NodeKind = ASTNodeKind::DenseMapInfo::getTombstoneKey();
> >> +      return Node;
> >> +    }
> >> +    static unsigned getHashValue(const DynTypedNode &Val) {
> >> +      // FIXME: Add hashing support for the remaining types.
> >> +      if
> (ASTNodeKind::getFromNodeKind<TypeLoc>().isSame(Val.NodeKind)) {
> >> +        auto TL = Val.getUnchecked<TypeLoc>();
> >> +        return llvm::hash_combine(TL.getType().getAsOpaquePtr(),
> >> +                                  TL.getOpaqueData());
> >> +      }
> >> +
> >> +      if
> (ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>().isSame(
> >> +              Val.NodeKind)) {
> >> +        auto NNSL = Val.getUnchecked<NestedNameSpecifierLoc>();
> >> +        return llvm::hash_combine(NNSL.getNestedNameSpecifier(),
> >> +                                  NNSL.getOpaqueData());
> >> +      }
> >> +
> >> +      assert(Val.getMemoizationData());
> >> +      return llvm::hash_value(Val.getMemoizationData());
> >> +    }
> >> +    static bool isEqual(const DynTypedNode &LHS, const DynTypedNode
> &RHS)
> >> {
> >> +      auto Empty = ASTNodeKind::DenseMapInfo::getEmptyKey();
> >> +      auto TombStone = ASTNodeKind::DenseMapInfo::getTombstoneKey();
> >> +      return (ASTNodeKind::DenseMapInfo::isEqual(LHS.NodeKind, Empty)
> &&
> >> +              ASTNodeKind::DenseMapInfo::isEqual(RHS.NodeKind, Empty))
> ||
> >> +             (ASTNodeKind::DenseMapInfo::isEqual(LHS.NodeKind,
> TombStone)
> >> &&
> >> +              ASTNodeKind::DenseMapInfo::isEqual(RHS.NodeKind,
> >> TombStone)) ||
> >> +             LHS == RHS;
> >> +    }
> >> +  };
> >> +
> >>  private:
> >>    /// \brief Takes care of converting from and to \c T.
> >>    template <typename T, typename EnablerT = void> struct BaseConverter;
> >> @@ -420,6 +488,10 @@ template <>
> >>  struct DenseMapInfo<clang::ast_type_traits::ASTNodeKind>
> >>      : clang::ast_type_traits::ASTNodeKind::DenseMapInfo {};
> >>
> >> +template <>
> >> +struct DenseMapInfo<clang::ast_type_traits::DynTypedNode>
> >> +    : clang::ast_type_traits::DynTypedNode::DenseMapInfo {};
> >> +
> >>  }  // end namespace llvm
> >>
> >>  #endif
> >>
> >> Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=250831&r1=250830&r2=250831&view=diff
> >>
> >>
> ==============================================================================
> >> --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original)
> >> +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Tue Oct 20
> 10:08:46
> >> 2015
> >> @@ -2068,8 +2068,10 @@ internal::Matcher<T> findAll(const inter
> >>  ///
> >>  /// Usable as: Any Matcher
> >>  const internal::ArgumentAdaptingMatcherFunc<
> >> -    internal::HasParentMatcher, internal::TypeList<Decl, Stmt>,
> >> -    internal::TypeList<Decl, Stmt> > LLVM_ATTRIBUTE_UNUSED hasParent =
> >> {};
> >> +    internal::HasParentMatcher,
> >> +    internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
> >> +    internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
> >> +    LLVM_ATTRIBUTE_UNUSED hasParent = {};
> >>
> >>  /// \brief Matches AST nodes that have an ancestor that matches the
> >> provided
> >>  /// matcher.
> >> @@ -2083,8 +2085,10 @@ const internal::ArgumentAdaptingMatcherF
> >>  ///
> >>  /// Usable as: Any Matcher
> >>  const internal::ArgumentAdaptingMatcherFunc<
> >> -    internal::HasAncestorMatcher, internal::TypeList<Decl, Stmt>,
> >> -    internal::TypeList<Decl, Stmt> > LLVM_ATTRIBUTE_UNUSED hasAncestor
> =
> >> {};
> >> +    internal::HasAncestorMatcher,
> >> +    internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>,
> >> +    internal::TypeList<Decl, NestedNameSpecifierLoc, Stmt, TypeLoc>>
> >> +    LLVM_ATTRIBUTE_UNUSED hasAncestor = {};
> >>
> >>  /// \brief Matches if the provided matcher does not match.
> >>  ///
> >>
> >> Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h?rev=250831&r1=250830&r2=250831&view=diff
> >>
> >>
> ==============================================================================
> >> --- cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h (original)
> >> +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h Tue Oct 20
> >> 10:08:46 2015
> >> @@ -848,8 +848,10 @@ public:
> >>                           BoundNodesTreeBuilder *Builder,
> >>                           AncestorMatchMode MatchMode) {
> >>      static_assert(std::is_base_of<Decl, T>::value ||
> >> -                  std::is_base_of<Stmt, T>::value,
> >> -                  "only Decl or Stmt allowed for recursive matching");
> >> +                      std::is_base_of<NestedNameSpecifierLoc, T>::value
> >> ||
> >> +                      std::is_base_of<Stmt, T>::value ||
> >> +                      std::is_base_of<TypeLoc, T>::value,
> >> +                  "type not allowed for recursive matching");
> >>      return
> matchesAncestorOf(ast_type_traits::DynTypedNode::create(Node),
> >>                               Matcher, Builder, MatchMode);
> >>    }
> >>
> >> Modified: cfe/trunk/lib/AST/ASTContext.cpp
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=250831&r1=250830&r2=250831&view=diff
> >>
> >>
> ==============================================================================
> >> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> >> +++ cfe/trunk/lib/AST/ASTContext.cpp Tue Oct 20 10:08:46 2015
> >> @@ -8678,6 +8678,23 @@ bool ASTContext::AtomicUsesUnsupportedLi
> >>
> >>  namespace {
> >>
> >> +/// Template specializations to abstract away from pointers and
> TypeLocs.
> >> +/// @{
> >> +template <typename T>
> >> +ast_type_traits::DynTypedNode createDynTypedNode(const T &Node) {
> >> +  return ast_type_traits::DynTypedNode::create(*Node);
> >> +}
> >> +template <>
> >> +ast_type_traits::DynTypedNode createDynTypedNode(const TypeLoc &Node) {
> >> +  return ast_type_traits::DynTypedNode::create(Node);
> >> +}
> >> +template <>
> >> +ast_type_traits::DynTypedNode
> >> +createDynTypedNode(const NestedNameSpecifierLoc &Node) {
> >> +  return ast_type_traits::DynTypedNode::create(Node);
> >> +}
> >> +/// @}
> >> +
> >>    /// \brief A \c RecursiveASTVisitor that builds a map from nodes to
> >> their
> >>    /// parents as defined by the \c RecursiveASTVisitor.
> >>    ///
> >> @@ -8685,7 +8702,8 @@ namespace {
> >>    /// traversal - there are other relationships (for example
> declaration
> >> context)
> >>    /// in the AST that are better modeled by special matchers.
> >>    ///
> >> -  /// FIXME: Currently only builds up the map using \c Stmt and \c Decl
> >> nodes.
> >> +/// FIXME: Currently only builds up the map using \c Stmt, \c Decl,
> >> +/// \c NestedNameSpecifierLoc and \c TypeLoc nodes.
> >>    class ParentMapASTVisitor : public
> >> RecursiveASTVisitor<ParentMapASTVisitor> {
> >>
> >>    public:
> >> @@ -8717,21 +8735,11 @@ namespace {
> >>      }
> >>
> >>      template <typename T>
> >> -    bool TraverseNode(T *Node, bool(VisitorBase:: *traverse) (T *)) {
> >> +    bool TraverseNode(T Node, bool (VisitorBase::*traverse)(T)) {
> >>        if (!Node)
> >>          return true;
> >>        if (ParentStack.size() > 0) {
> >> -        // FIXME: Currently we add the same parent multiple times, but
> >> only
> >> -        // when no memoization data is available for the type.
> >> -        // For example when we visit all subexpressions of template
> >> -        // instantiations; this is suboptimal, but benign: the only way
> >> to
> >> -        // visit those is with hasAncestor / hasParent, and those do
> not
> >> create
> >> -        // new matches.
> >> -        // The plan is to enable DynTypedNode to be storable in a map
> or
> >> hash
> >> -        // map. The main problem there is to implement hash functions /
> >> -        // comparison operators for all types that DynTypedNode
> supports
> >> that
> >> -        // do not have pointer identity.
> >> -        auto &NodeOrVector = (*Parents)[Node];
> >> +        auto &NodeOrVector = (*Parents)[createDynTypedNode(Node)];
> >>          if (NodeOrVector.isNull()) {
> >>            NodeOrVector = new
> >> ast_type_traits::DynTypedNode(ParentStack.back());
> >>          } else {
> >> @@ -8757,7 +8765,7 @@ namespace {
> >>              Vector->push_back(ParentStack.back());
> >>          }
> >>        }
> >> -
> >> ParentStack.push_back(ast_type_traits::DynTypedNode::create(*Node));
> >> +      ParentStack.push_back(createDynTypedNode(Node));
> >>        bool Result = (this ->* traverse) (Node);
> >>        ParentStack.pop_back();
> >>        return Result;
> >> @@ -8771,6 +8779,15 @@ namespace {
> >>        return TraverseNode(StmtNode, &VisitorBase::TraverseStmt);
> >>      }
> >>
> >> +    bool TraverseTypeLoc(TypeLoc TypeLocNode) {
> >> +      return TraverseNode(TypeLocNode, &VisitorBase::TraverseTypeLoc);
> >> +    }
> >> +
> >> +    bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc
> >> NNSLocNode) {
> >> +      return TraverseNode(NNSLocNode,
> >> +
> &VisitorBase::TraverseNestedNameSpecifierLoc);
> >> +    }
> >> +
> >>      ASTContext::ParentMap *Parents;
> >>      llvm::SmallVector<ast_type_traits::DynTypedNode, 16> ParentStack;
> >>
> >> @@ -8781,16 +8798,13 @@ namespace {
> >>
> >>  ArrayRef<ast_type_traits::DynTypedNode>
> >>  ASTContext::getParents(const ast_type_traits::DynTypedNode &Node) {
> >> -  assert(Node.getMemoizationData() &&
> >> -         "Invariant broken: only nodes that support memoization may be
> "
> >> -         "used in the parent map.");
> >>    if (!AllParents) {
> >>      // We always need to run over the whole translation unit, as
> >>      // hasAncestor can escape any subtree.
> >>      AllParents.reset(
> >>          ParentMapASTVisitor::buildMap(*getTranslationUnitDecl()));
> >>    }
> >> -  ParentMap::const_iterator I =
> >> AllParents->find(Node.getMemoizationData());
> >> +  ParentMap::const_iterator I = AllParents->find(Node);
> >>    if (I == AllParents->end()) {
> >>      return None;
> >>    }
> >>
> >> Modified: cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp?rev=250831&r1=250830&r2=250831&view=diff
> >>
> >>
> ==============================================================================
> >> --- cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp (original)
> >> +++ cfe/trunk/lib/ASTMatchers/ASTMatchFinder.cpp Tue Oct 20 10:08:46
> 2015
> >> @@ -621,9 +621,6 @@ private:
> >>      if (Node.get<TranslationUnitDecl>() ==
> >>          ActiveASTContext->getTranslationUnitDecl())
> >>        return false;
> >> -    assert(Node.getMemoizationData() &&
> >> -           "Invariant broken: only nodes that support memoization may
> be
> >> "
> >> -           "used in the parent map.");
> >>
> >>      MatchKey Key;
> >>      Key.MatcherID = Matcher.getID();
> >> @@ -867,7 +864,11 @@ bool MatchASTVisitor::TraverseNestedName
> >>
> >>  bool MatchASTVisitor::TraverseNestedNameSpecifierLoc(
> >>      NestedNameSpecifierLoc NNS) {
> >> +  if (!NNS)
> >> +    return true;
> >> +
> >>    match(NNS);
> >> +
> >>    // We only match the nested name specifier here (as opposed to
> >> traversing it)
> >>    // because the traversal is already done in the parallel
> >> "Loc"-hierarchy.
> >>    if (NNS.hasQualifier())
> >>
> >> Modified: cfe/trunk/unittests/AST/ASTContextParentMapTest.cpp
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/ASTContextParentMapTest.cpp?rev=250831&r1=250830&r2=250831&view=diff
> >>
> >>
> ==============================================================================
> >> --- cfe/trunk/unittests/AST/ASTContextParentMapTest.cpp (original)
> >> +++ cfe/trunk/unittests/AST/ASTContextParentMapTest.cpp Tue Oct 20
> >> 10:08:46 2015
> >> @@ -38,6 +38,19 @@ TEST(GetParents, ReturnsParentForStmt) {
> >>                               ifStmt(hasParent(compoundStmt()))));
> >>  }
> >>
> >> +TEST(GetParents, ReturnsParentForTypeLoc) {
> >> +  MatchVerifier<TypeLoc> Verifier;
> >> +  EXPECT_TRUE(
> >> +      Verifier.match("namespace a { class b {}; } void f(a::b) {}",
> >> +
> >> typeLoc(hasParent(typeLoc(hasParent(functionDecl()))))));
> >> +}
> >> +
> >> +TEST(GetParents, ReturnsParentForNestedNameSpecifierLoc) {
> >> +  MatchVerifier<NestedNameSpecifierLoc> Verifier;
> >> +  EXPECT_TRUE(Verifier.match("namespace a { class b {}; } void f(a::b)
> >> {}",
> >> +
> >> nestedNameSpecifierLoc(hasParent(typeLoc()))));
> >> +}
> >> +
> >>  TEST(GetParents, ReturnsParentInsideTemplateInstantiations) {
> >>    MatchVerifier<Decl> DeclVerifier;
> >>    EXPECT_TRUE(DeclVerifier.match(
> >>
> >> Modified: cfe/trunk/unittests/ASTMatchers/Dynamic/ParserTest.cpp
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/Dynamic/ParserTest.cpp?rev=250831&r1=250830&r2=250831&view=diff
> >>
> >>
> ==============================================================================
> >> --- cfe/trunk/unittests/ASTMatchers/Dynamic/ParserTest.cpp (original)
> >> +++ cfe/trunk/unittests/ASTMatchers/Dynamic/ParserTest.cpp Tue Oct 20
> >> 10:08:46 2015
> >> @@ -318,7 +318,8 @@ TEST(ParserTest, CompletionNamedValues)
> >>        Comps[1].MatcherDecl);
> >>
> >>    EXPECT_EQ("arent(", Comps[2].TypedText);
> >> -  EXPECT_EQ("Matcher<Decl> hasParent(Matcher<Decl|Stmt>)",
> >> +  EXPECT_EQ("Matcher<Decl> "
> >> +
> >> "hasParent(Matcher<NestedNameSpecifierLoc|TypeLoc|Decl|...>)",
> >>              Comps[2].MatcherDecl);
> >>  }
> >>
> >>
> >> Modified: cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp
> >> URL:
> >>
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp?rev=250831&r1=250830&r2=250831&view=diff
> >>
> >>
> ==============================================================================
> >> --- cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp (original)
> >> +++ cfe/trunk/unittests/ASTMatchers/Dynamic/RegistryTest.cpp Tue Oct 20
> >> 10:08:46 2015
> >> @@ -447,8 +447,10 @@ TEST_F(RegistryTest, Errors) {
> >>  TEST_F(RegistryTest, Completion) {
> >>    CompVector Comps = getCompletions();
> >>    // Overloaded
> >> -  EXPECT_TRUE(hasCompletion(
> >> -      Comps, "hasParent(", "Matcher<Decl|Stmt>
> >> hasParent(Matcher<Decl|Stmt>)"));
> >> +  EXPECT_TRUE(hasCompletion(Comps, "hasParent(",
> >> +
> >> "Matcher<NestedNameSpecifierLoc|TypeLoc|Decl|...> "
> >> +
> >> "hasParent(Matcher<NestedNameSpecifierLoc|TypeLoc|"
> >> +                            "Decl|...>)"));
> >>    // Variadic.
> >>    EXPECT_TRUE(hasCompletion(Comps, "whileStmt(",
> >>                              "Matcher<Stmt>
> >> whileStmt(Matcher<WhileStmt>...)"));
> >> @@ -463,8 +465,10 @@ TEST_F(RegistryTest, Completion) {
> >>
> >>    EXPECT_TRUE(hasCompletion(WhileComps, "hasBody(",
> >>                              "Matcher<WhileStmt>
> >> hasBody(Matcher<Stmt>)"));
> >> -  EXPECT_TRUE(hasCompletion(WhileComps, "hasParent(",
> >> -                            "Matcher<Stmt>
> >> hasParent(Matcher<Decl|Stmt>)"));
> >> +  EXPECT_TRUE(hasCompletion(WhileComps, "hasParent(", "Matcher<Stmt> "
> >> +
> >> "hasParent(Matcher<"
> >> +
> >> "NestedNameSpecifierLoc|"
> >> +
> >> "TypeLoc|Decl|...>)"));
> >>    EXPECT_TRUE(
> >>        hasCompletion(WhileComps, "allOf(", "Matcher<T>
> >> allOf(Matcher<T>...)"));
> >>
> >>
> >>
> >> _______________________________________________
> >> cfe-commits mailing list
> >> cfe-commits at lists.llvm.org
> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151021/c7c754c1/attachment-0001.html>


More information about the cfe-commits mailing list