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 <[email protected]> Date: Sat, 6 Dec 2025 22:09:40 -0800 Subject: [PATCH 1/2] [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 <[email protected]> Date: Sun, 7 Dec 2025 00:05:28 -0800 Subject: [PATCH 2/2] 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) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
