[clang] [Clang][ASTMatcher] Improve matching isDerivedFrom base in case of multi aliases exists (PR #126793)
Amr Hesham via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 5 11:17:20 PST 2025
https://github.com/AmrDeveloper updated https://github.com/llvm/llvm-project/pull/126793
>From cfa6bfb6ae5834f251d8e0c2c0f447aa82c97ef2 Mon Sep 17 00:00:00 2001
From: AmrDeveloper <amr96 at 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 <amr96 at 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 <amr96 at 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
------------
More information about the cfe-commits
mailing list