https://github.com/AmrDeveloper updated https://github.com/llvm/llvm-project/pull/126793
>From cfa6bfb6ae5834f251d8e0c2c0f447aa82c97ef2 Mon Sep 17 00:00:00 2001 From: AmrDeveloper <am...@programmer.net> Date: Tue, 11 Feb 2025 21:30:18 +0100 Subject: [PATCH 1/3] [Clang][ASTMatcher] Improve matching isDerivedFrom base in case of multi alias exists --- clang/lib/ASTMatchers/ASTMatchFinder.cpp | 21 +++++++++++++++++++ .../ASTMatchers/ASTMatchersNarrowingTest.cpp | 17 +++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp index 3d01a70395a9b..e9ec7eff1e0ab 100644 --- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp @@ -1287,6 +1287,27 @@ class MatchASTVisitor : public RecursiveASTVisitor<MatchASTVisitor>, auto Aliases = TypeAliases.find(CanonicalType); if (Aliases == TypeAliases.end()) return false; + + if (const auto *ElaboratedTypeNode = + llvm::dyn_cast<ElaboratedType>(TypeNode)) { + if (ElaboratedTypeNode->isSugared() && Aliases->second.size() > 1) { + const auto &DesugaredTypeName = + ElaboratedTypeNode->desugar().getAsString(); + + for (const TypedefNameDecl *Alias : Aliases->second) { + if (Alias->getName() != DesugaredTypeName) { + continue; + } + + BoundNodesTreeBuilder Result(*Builder); + if (Matcher.matches(*Alias, this, &Result)) { + *Builder = std::move(Result); + return true; + } + } + } + } + for (const TypedefNameDecl *Alias : Aliases->second) { BoundNodesTreeBuilder Result(*Builder); if (Matcher.matches(*Alias, this, &Result)) { diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp index 5e1c12ba26d87..4e6baedae2be5 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -1167,6 +1167,23 @@ TEST_P(ASTMatchersTest, IsDerivedFrom_EmptyName) { EXPECT_TRUE(notMatches(Code, cxxRecordDecl(isSameOrDerivedFrom("")))); } +TEST_P(ASTMatchersTest, IsDerivedFrom_ElaboratedType) { + if (!GetParam().isCXX()) { + return; + } + + DeclarationMatcher IsDerivenFromBase = + cxxRecordDecl(isDerivedFrom(decl().bind("typedef"))); + + EXPECT_TRUE(matchAndVerifyResultTrue( + "struct AnInterface {};" + "typedef AnInterface UnusedTypedef;" + "typedef AnInterface Base;" + "class AClass : public Base {};", + IsDerivenFromBase, + std::make_unique<VerifyIdIsBoundTo<TypedefDecl>>("typedef", "Base"))); +} + TEST_P(ASTMatchersTest, IsDerivedFrom_ObjC) { DeclarationMatcher IsDerivedFromX = objcInterfaceDecl(isDerivedFrom("X")); EXPECT_TRUE( >From 08d0a789519a751012ba9ee22e5e3e68954ea1ec Mon Sep 17 00:00:00 2001 From: AmrDeveloper <am...@programmer.net> Date: Wed, 5 Mar 2025 18:22:12 +0100 Subject: [PATCH 2/3] Add a releasenote --- clang/docs/ReleaseNotes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 35efa2ca4aa93..9f0af6cbbdac4 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -361,6 +361,8 @@ Fixed Point Support in Clang AST Matchers ------------ +- Ensure ``isDerivedFrom`` is matching the correct base in case of more than one aliases exists. + clang-format ------------ >From 3fe08df0eef62bb6c184331036c4e5e056461f49 Mon Sep 17 00:00:00 2001 From: AmrDeveloper <am...@programmer.net> Date: Wed, 5 Mar 2025 20:16:59 +0100 Subject: [PATCH 3/3] Update releasenote --- clang/docs/ReleaseNotes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 9f0af6cbbdac4..32db3fe5740ed 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -361,7 +361,7 @@ Fixed Point Support in Clang AST Matchers ------------ -- Ensure ``isDerivedFrom`` is matching the correct base in case of more than one aliases exists. +- Ensure ``isDerivedFrom`` matches the correct base in case more than one alias exists. clang-format ------------ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits