[clang-tools-extra] [clang-tidy] Don't cache classes by name in `fuchsia-multiple-inheritance` (PR #171016)
Victor Chernyakin via cfe-commits
cfe-commits at lists.llvm.org
Sun Dec 7 00:35:42 PST 2025
https://github.com/localspook updated https://github.com/llvm/llvm-project/pull/171016
>From d3bebcb6b44af2c55a83f660c9dc9034bd737be1 Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Sat, 6 Dec 2025 22:09:40 -0800
Subject: [PATCH 1/3] [clang-tidy] Don't cache classes by name in
`fuchsia-multiple-inheritance`
---
.../fuchsia/MultipleInheritanceCheck.cpp | 11 ++---------
.../clang-tidy/fuchsia/MultipleInheritanceCheck.h | 2 +-
.../checkers/fuchsia/multiple-inheritance.cpp | 15 +++++++++++++++
3 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp b/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp
index 652dec9bcc2a9..029c482691c00 100644
--- a/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp
+++ b/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp
@@ -27,9 +27,7 @@ AST_MATCHER(CXXRecordDecl, hasBases) {
// previously.
void MultipleInheritanceCheck::addNodeToInterfaceMap(const CXXRecordDecl *Node,
bool IsInterface) {
- assert(Node->getIdentifier());
- const StringRef Name = Node->getIdentifier()->getName();
- InterfaceMap.insert(std::make_pair(Name, IsInterface));
+ InterfaceMap.try_emplace(Node, IsInterface);
}
// Returns "true" if the boolean "isInterface" has been set to the
@@ -37,9 +35,7 @@ void MultipleInheritanceCheck::addNodeToInterfaceMap(const CXXRecordDecl *Node,
// interface status for the current node is not yet known.
bool MultipleInheritanceCheck::getInterfaceStatus(const CXXRecordDecl *Node,
bool &IsInterface) const {
- assert(Node->getIdentifier());
- const StringRef Name = Node->getIdentifier()->getName();
- auto Pair = InterfaceMap.find(Name);
+ auto Pair = InterfaceMap.find(Node);
if (Pair == InterfaceMap.end())
return false;
IsInterface = Pair->second;
@@ -59,9 +55,6 @@ bool MultipleInheritanceCheck::isCurrentClassInterface(
}
bool MultipleInheritanceCheck::isInterface(const CXXRecordDecl *Node) {
- if (!Node->getIdentifier())
- return false;
-
// Short circuit the lookup if we have analyzed this record before.
bool PreviousIsInterfaceResult = false;
if (getInterfaceStatus(Node, PreviousIsInterfaceResult))
diff --git a/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.h b/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.h
index 2e268432c17cf..b9055eb58a300 100644
--- a/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.h
+++ b/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.h
@@ -38,7 +38,7 @@ class MultipleInheritanceCheck : public ClangTidyCheck {
// Contains the identity of each named CXXRecord as an interface. This is
// used to memoize lookup speeds and improve performance from O(N^2) to O(N),
// where N is the number of classes.
- llvm::StringMap<bool> InterfaceMap;
+ llvm::DenseMap<const CXXRecordDecl *, bool> InterfaceMap;
};
} // namespace clang::tidy::fuchsia
diff --git a/clang-tools-extra/test/clang-tidy/checkers/fuchsia/multiple-inheritance.cpp b/clang-tools-extra/test/clang-tidy/checkers/fuchsia/multiple-inheritance.cpp
index d53b3fde7736b..c60649f52cb94 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/fuchsia/multiple-inheritance.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/fuchsia/multiple-inheritance.cpp
@@ -148,3 +148,18 @@ void test_no_crash() {
auto foo = []() {};
WithTemplBase<decltype(foo)>();
}
+
+struct S1 {};
+struct S2 {};
+
+struct S3 : S1, S2 {};
+
+namespace N {
+
+struct S1 { int i; };
+struct S2 { int i; };
+
+// CHECK-MESSAGES: [[@LINE+1]]:1: warning: inheriting multiple classes that aren't pure virtual is discouraged [fuchsia-multiple-inheritance]
+struct S3 : S1, S2 {};
+
+} // namespace N
>From 11522aacfa117ff748907c21c74f16dec032abdb Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Sun, 7 Dec 2025 00:05:28 -0800
Subject: [PATCH 2/3] Update comment
---
.../clang-tidy/fuchsia/MultipleInheritanceCheck.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp b/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp
index 029c482691c00..df40d166bd404 100644
--- a/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp
+++ b/clang-tools-extra/clang-tidy/fuchsia/MultipleInheritanceCheck.cpp
@@ -23,7 +23,7 @@ AST_MATCHER(CXXRecordDecl, hasBases) {
}
} // namespace
-// Adds a node (by name) to the interface map, if it was not present in the map
+// Adds a node to the interface map, if it was not present in the map
// previously.
void MultipleInheritanceCheck::addNodeToInterfaceMap(const CXXRecordDecl *Node,
bool IsInterface) {
>From 362275a62cecdc151b6c49e29315e0225aec501e Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Sun, 7 Dec 2025 00:35:30 -0800
Subject: [PATCH 3/3] Release notes
---
clang-tools-extra/docs/ReleaseNotes.rst | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 42160fa9cb51c..7457ffb3f4d1e 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -441,6 +441,12 @@ Changes in existing checks
correctly ignore ``std::array`` and other array-like containers when
`IgnoreArrays` option is set to `true`.
+- Improved :doc:`fuchsia-multiple-inheritance
+ <clang-tidy/checks/fuchsia/multiple-inheritance>`
+ by fixing an issue where the check would only analyze the first class with a
+ given name in the program, even if there were multiple classes with that
+ name in different scopes.
+
- Improved :doc:`google-readability-casting
<clang-tidy/checks/google/readability-casting>` check by adding fix-it
notes for downcasts and casts to void pointer.
More information about the cfe-commits
mailing list