llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Nathan James (njames93) <details> <summary>Changes</summary> Fix handling of nodes which can be skipped in the fast path for the hasName matcher #<!-- -->100973 --- Full diff: https://github.com/llvm/llvm-project/pull/100975.diff 2 Files Affected: - (modified) clang/lib/ASTMatchers/ASTMatchersInternal.cpp (+14-7) - (modified) clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp (+4) ``````````diff diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp index bf87b1aa0992a..0556ae7ffae2f 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -537,14 +537,21 @@ class PatternSet { /// that didn't match. /// Return true if there are still any patterns left. bool consumeNameSuffix(StringRef NodeName, bool CanSkip) { - for (size_t I = 0; I < Patterns.size();) { - if (::clang::ast_matchers::internal::consumeNameSuffix(Patterns[I].P, - NodeName) || - CanSkip) { - ++I; - } else { - Patterns.erase(Patterns.begin() + I); + if (CanSkip) { + // If we can skip the node, then we need to handle the case where a + // skipped node has the same name as its parent. + // namespace a { inline namespace a { class A; } } + // cxxRecordDecl(hasName("::a::A")) + // To do this, any patterns that match should be duplicated in our set, one of them with the tail removed. + for (size_t I = 0, E = Patterns.size(); I != E; ++I) { + StringRef Pattern = Patterns[I].P; + if (ast_matchers::internal::consumeNameSuffix(Patterns[I].P, NodeName)) + Patterns.push_back({Pattern, Patterns[I].IsFullyQualified}); } + } else { + llvm::erase_if(Patterns, [&NodeName](auto &Pattern) { + return !::clang::ast_matchers::internal::consumeNameSuffix(Pattern.P, NodeName); + }); } return !Patterns.empty(); } diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp index f26140675fd46..611e1f9ba5327 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -2552,6 +2552,10 @@ TEST_P(ASTMatchersTest, HasName_MatchesNamespaces) { recordDecl(hasName("a+b::C")))); EXPECT_TRUE(notMatches("namespace a { namespace b { class AC; } }", recordDecl(hasName("C")))); + EXPECT_TRUE(matches("namespace a { inline namespace a { class C; } }", + recordDecl(hasName("::a::C")))); + EXPECT_TRUE(matches("namespace a { inline namespace a { class C; } }", + recordDecl(hasName("::a::a::C")))); } TEST_P(ASTMatchersTest, HasName_MatchesOuterClasses) { `````````` </details> https://github.com/llvm/llvm-project/pull/100975 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits