Author: chandlerc Date: Fri Jun 10 23:45:38 2016 New Revision: 272453 URL: http://llvm.org/viewvc/llvm-project?rev=272453&view=rev Log: Revert "[ASTMatchers] New forEachOverriden matcher."
This reverts commit r272386. It doesn't compile with MSVC and those bots have been red the entire day as a consequence. Modified: cfe/trunk/docs/LibASTMatchersReference.html cfe/trunk/include/clang/AST/ASTContext.h cfe/trunk/include/clang/AST/DeclCXX.h cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h cfe/trunk/lib/AST/ASTContext.cpp cfe/trunk/lib/AST/DeclCXX.cpp cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Modified: cfe/trunk/docs/LibASTMatchersReference.html URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=272453&r1=272452&r2=272453&view=diff ============================================================================== --- cfe/trunk/docs/LibASTMatchersReference.html (original) +++ cfe/trunk/docs/LibASTMatchersReference.html Fri Jun 10 23:45:38 2016 @@ -3968,30 +3968,6 @@ matcher, or is a pointer to a type that </pre></td></tr> -<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('forEachOverridden0')"><a name="forEachOverridden0Anchor">forEachOverridden</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>> InnerMatcher</td></tr> -<tr><td colspan="4" class="doc" id="forEachOverridden0"><pre>Matches each method overriden by the given method. This matcher may -produce multiple matches. - -Given - class A { virtual void f(); }; - class B : public A { void f(); }; - class C : public B { void f(); }; -cxxMethodDecl(ofClass(hasName("C")), - forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") - matches once, with "b" binding "A::f" and "d" binding "C::f" (Note - that B::f is not overridden by C::f). - -The check can produce multiple matches in case of multiple inheritance, e.g. - class A1 { virtual void f(); }; - class A2 { virtual void f(); }; - class C : public A1, public A2 { void f(); }; -cxxMethodDecl(ofClass(hasName("C")), - forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") - matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and - once with "b" binding "A2::f" and "d" binding "C::f". -</pre></td></tr> - - <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html">CXXMethodDecl</a>></td><td class="name" onclick="toggle('ofClass0')"><a name="ofClass0Anchor">ofClass</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class declaration that the given method declaration belongs to. Modified: cfe/trunk/include/clang/AST/ASTContext.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=272453&r1=272452&r2=272453&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/ASTContext.h (original) +++ cfe/trunk/include/clang/AST/ASTContext.h Fri Jun 10 23:45:38 2016 @@ -821,9 +821,6 @@ public: overridden_methods_end(const CXXMethodDecl *Method) const; unsigned overridden_methods_size(const CXXMethodDecl *Method) const; - typedef llvm::iterator_range<overridden_cxx_method_iterator> - overridden_method_range; - overridden_method_range overridden_methods(const CXXMethodDecl *Method) const; /// \brief Note that the given C++ \p Method overrides the given \p /// Overridden method. Modified: cfe/trunk/include/clang/AST/DeclCXX.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=272453&r1=272452&r2=272453&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/DeclCXX.h (original) +++ cfe/trunk/include/clang/AST/DeclCXX.h Fri Jun 10 23:45:38 2016 @@ -16,7 +16,6 @@ #ifndef LLVM_CLANG_AST_DECLCXX_H #define LLVM_CLANG_AST_DECLCXX_H -#include "clang/AST/ASTContext.h" #include "clang/AST/ASTUnresolvedSet.h" #include "clang/AST/Attr.h" #include "clang/AST/Decl.h" @@ -1829,8 +1828,6 @@ public: method_iterator begin_overridden_methods() const; method_iterator end_overridden_methods() const; unsigned size_overridden_methods() const; - typedef ASTContext::overridden_method_range overridden_method_range; - overridden_method_range overridden_methods() const; /// Returns the parent of this method declaration, which /// is the class in which this method is defined. Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=272453&r1=272452&r2=272453&view=diff ============================================================================== --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original) +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Fri Jun 10 23:45:38 2016 @@ -3770,47 +3770,6 @@ AST_MATCHER_P(CXXMethodDecl, ofClass, InnerMatcher.matches(*Parent, Finder, Builder)); } -/// \brief Matches each method overriden by the given method. This matcher may -/// produce multiple matches. -/// -/// Given -/// \code -/// class A { virtual void f(); }; -/// class B : public A { void f(); }; -/// class C : public B { void f(); }; -/// \endcode -/// cxxMethodDecl(ofClass(hasName("C")), -/// forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") -/// matches once, with "b" binding "A::f" and "d" binding "C::f" (Note -/// that B::f is not overridden by C::f). -/// -/// The check can produce multiple matches in case of multiple inheritance, e.g. -/// \code -/// class A1 { virtual void f(); }; -/// class A2 { virtual void f(); }; -/// class C : public A1, public A2 { void f(); }; -/// \endcode -/// cxxMethodDecl(ofClass(hasName("C")), -/// forEachOverridden(cxxMethodDecl().bind("b"))).bind("d") -/// matches twice, once with "b" binding "A1::f" and "d" binding "C::f", and -/// once with "b" binding "A2::f" and "d" binding "C::f". -AST_MATCHER_P(CXXMethodDecl, forEachOverridden, - internal::Matcher<CXXMethodDecl>, InnerMatcher) { - BoundNodesTreeBuilder Result; - bool Matched = false; - for (const auto *Overridden : Node.overridden_methods()) { - BoundNodesTreeBuilder OverriddenBuilder(*Builder); - const bool OverriddenMatched = - InnerMatcher.matches(*Overridden, Finder, &OverriddenBuilder); - if (OverriddenMatched) { - Matched = true; - Result.addMatch(OverriddenBuilder); - } - } - *Builder = std::move(Result); - return Matched; -} - /// \brief Matches if the given method declaration is virtual. /// /// Given Modified: cfe/trunk/lib/AST/ASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=272453&r1=272452&r2=272453&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTContext.cpp (original) +++ cfe/trunk/lib/AST/ASTContext.cpp Fri Jun 10 23:45:38 2016 @@ -1254,35 +1254,32 @@ void ASTContext::setInstantiatedFromUnna ASTContext::overridden_cxx_method_iterator ASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const { - llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos = - OverriddenMethods.find(Method->getCanonicalDecl()); + llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos + = OverriddenMethods.find(Method->getCanonicalDecl()); if (Pos == OverriddenMethods.end()) return nullptr; + return Pos->second.begin(); } ASTContext::overridden_cxx_method_iterator ASTContext::overridden_methods_end(const CXXMethodDecl *Method) const { - llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos = - OverriddenMethods.find(Method->getCanonicalDecl()); + llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos + = OverriddenMethods.find(Method->getCanonicalDecl()); if (Pos == OverriddenMethods.end()) return nullptr; + return Pos->second.end(); } unsigned ASTContext::overridden_methods_size(const CXXMethodDecl *Method) const { - llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos = - OverriddenMethods.find(Method->getCanonicalDecl()); + llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos + = OverriddenMethods.find(Method->getCanonicalDecl()); if (Pos == OverriddenMethods.end()) return 0; - return Pos->second.size(); -} -ASTContext::overridden_method_range -ASTContext::overridden_methods(const CXXMethodDecl *Method) const { - return overridden_method_range(overridden_methods_begin(Method), - overridden_methods_end(Method)); + return Pos->second.size(); } void ASTContext::addOverriddenMethod(const CXXMethodDecl *Method, Modified: cfe/trunk/lib/AST/DeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=272453&r1=272452&r2=272453&view=diff ============================================================================== --- cfe/trunk/lib/AST/DeclCXX.cpp (original) +++ cfe/trunk/lib/AST/DeclCXX.cpp Fri Jun 10 23:45:38 2016 @@ -1635,13 +1635,6 @@ unsigned CXXMethodDecl::size_overridden_ return getASTContext().overridden_methods_size(this); } -CXXMethodDecl::overridden_method_range -CXXMethodDecl::overridden_methods() const { - if (isa<CXXConstructorDecl>(this)) - return overridden_method_range(nullptr, nullptr); - return getASTContext().overridden_methods(this); -} - QualType CXXMethodDecl::getThisType(ASTContext &C) const { // C++ 9.3.2p1: The type of this in a member function of a class X is X*. // If the member function is declared const, the type of this is const X*, Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp?rev=272453&r1=272452&r2=272453&view=diff ============================================================================== --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp (original) +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Fri Jun 10 23:45:38 2016 @@ -1997,49 +1997,5 @@ TEST(StatementMatcher, ForFunction) { EXPECT_TRUE(notMatches(CppString2, returnStmt(forFunction(hasName("F"))))); } -TEST(Matcher, ForEachOverriden) { - const auto ForEachOverriddenInClass = [](const char *ClassName) { - return cxxMethodDecl(ofClass(hasName(ClassName)), isVirtual(), - forEachOverridden(cxxMethodDecl().bind("overridden"))) - .bind("override"); - }; - constexpr const char Code1[] = "class A { virtual void f(); };" - "class B : public A { void f(); };" - "class C : public B { void f(); };"; - // C::f overrides A::f. - EXPECT_TRUE(matchAndVerifyResultTrue( - Code1, ForEachOverriddenInClass("C"), - llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("override", "f", 1))); - EXPECT_TRUE(matchAndVerifyResultTrue( - Code1, ForEachOverriddenInClass("C"), - llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("overridden", "f", - 1))); - // B::f overrides A::f. - EXPECT_TRUE(matchAndVerifyResultTrue( - Code1, ForEachOverriddenInClass("B"), - llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("override", "f", 1))); - EXPECT_TRUE(matchAndVerifyResultTrue( - Code1, ForEachOverriddenInClass("B"), - llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("overridden", "f", - 1))); - // A::f overrides nothing. - EXPECT_TRUE(notMatches(Code1, ForEachOverriddenInClass("A"))); - - constexpr const char Code2[] = - "class A1 { virtual void f(); };" - "class A2 { virtual void f(); };" - "class B : public A1, public A2 { void f(); };"; - // B::f overrides A1::f and A2::f. This produces two matches. - EXPECT_TRUE(matchAndVerifyResultTrue( - Code2, ForEachOverriddenInClass("B"), - llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("override", "f", 2))); - EXPECT_TRUE(matchAndVerifyResultTrue( - Code2, ForEachOverriddenInClass("B"), - llvm::make_unique<VerifyIdIsBoundTo<CXXMethodDecl>>("overridden", "f", - 2))); - // A1::f overrides nothing. - EXPECT_TRUE(notMatches(Code2, ForEachOverriddenInClass("A1"))); -} - } // namespace ast_matchers } // namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits