https://github.com/flovent updated 
https://github.com/llvm/llvm-project/pull/183984

>From 3f73c0262a01847d848b1443354a30688f725dcb Mon Sep 17 00:00:00 2001
From: flovent <[email protected]>
Date: Sun, 1 Mar 2026 15:02:34 +0800
Subject: [PATCH 1/2] [clang-tidy] Handle specialization of user-defined type
 in `bugprone-std-namespace-modification`

---
 .../bugprone/StdNamespaceModificationCheck.cpp         |  9 +++++----
 clang-tools-extra/docs/ReleaseNotes.rst                |  5 +++++
 .../checkers/bugprone/std-namespace-modification.cpp   | 10 ++++++++++
 3 files changed, 20 insertions(+), 4 deletions(-)

diff --git 
a/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp 
b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
index 5697f1059687c..4849bf7643ceb 100644
--- a/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
@@ -43,10 +43,11 @@ void 
StdNamespaceModificationCheck::registerMatchers(MatchFinder *Finder) {
       hasDeclContext(namespaceDecl(hasAnyName("std", "posix"),
                                    unless(hasParent(namespaceDecl())))
                          .bind("nmspc"));
-  auto UserDefinedType = qualType(
-      hasUnqualifiedDesugaredType(tagType(unless(hasDeclaration(tagDecl(
-          hasAncestor(namespaceDecl(hasAnyName("std", "posix"),
-                                    unless(hasParent(namespaceDecl()))))))))));
+  auto UserDefinedDecl = tagDecl(hasAncestor(namespaceDecl(
+      hasAnyName("std", "posix"), unless(hasParent(namespaceDecl())))));
+  auto UserDefinedType = qualType(hasUnqualifiedDesugaredType(anyOf(
+      tagType(unless(hasDeclaration(UserDefinedDecl))),
+      templateSpecializationType(unless(hasDeclaration(UserDefinedDecl))))));
   auto HasNoProgramDefinedTemplateArgument = unless(
       hasAnyTemplateArgumentIncludingPack(refersToType(UserDefinedType)));
   auto InsideStdClassOrClassTemplateSpecialization = hasDeclContext(
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 6bdc0ae7bdcc8..04e50ebcbfb05 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -181,6 +181,11 @@ Changes in existing checks
   <clang-tidy/checks/bugprone/macro-parentheses>` check by printing the macro
   definition in the warning message if the macro is defined on command line.
 
+- Improved :doc:`bugprone-std-namespace-modification
+  <clang-tidy/checks/bugprone/std-namespace-modification>` check by fixing
+  false positives when extending the standard library with a specialization of
+  user-defined type.
+
 - Improved :doc:`bugprone-string-constructor
   <clang-tidy/checks/bugprone/string-constructor>` check to detect suspicious
   string constructor calls when the string class constructor has a default
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp
index 32bcbcaa21c0d..6ddc09f2afd29 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp
@@ -281,3 +281,13 @@ template<typename> struct T {};
 
 T<B> b;
 }
+
+// gh183752 begin
+template <typename T>
+struct Bar
+{};
+
+template <typename T>
+struct std::hash<Bar<T>> // Should not warn as this specialization depends on 
a user-defined type.
+{};
+// gh183752 end

>From 88e2d4989042a27bba6fab6844b91bdc7badf60d Mon Sep 17 00:00:00 2001
From: flovent <[email protected]>
Date: Sun, 1 Mar 2026 17:11:22 +0800
Subject: [PATCH 2/2] consider classTemplateDecl

---
 .../clang-tidy/bugprone/StdNamespaceModificationCheck.cpp   | 6 ++++--
 .../checkers/Inputs/Headers/system-header-simulation.h      | 3 +++
 .../checkers/bugprone/std-namespace-modification.cpp        | 5 +++++
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git 
a/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp 
b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
index 4849bf7643ceb..8a79db184e87a 100644
--- a/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
@@ -43,8 +43,10 @@ void 
StdNamespaceModificationCheck::registerMatchers(MatchFinder *Finder) {
       hasDeclContext(namespaceDecl(hasAnyName("std", "posix"),
                                    unless(hasParent(namespaceDecl())))
                          .bind("nmspc"));
-  auto UserDefinedDecl = tagDecl(hasAncestor(namespaceDecl(
-      hasAnyName("std", "posix"), unless(hasParent(namespaceDecl())))));
+  auto UserDefinedDecl =
+      namedDecl(anyOf(classTemplateDecl(), tagDecl()),
+                hasAncestor(namespaceDecl(hasAnyName("std", "posix"),
+                                          
unless(hasParent(namespaceDecl())))));
   auto UserDefinedType = qualType(hasUnqualifiedDesugaredType(anyOf(
       tagType(unless(hasDeclaration(UserDefinedDecl))),
       templateSpecializationType(unless(hasDeclaration(UserDefinedDecl))))));
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h
 
b/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h
index 0870f60eaa39b..2d91e01f01f4b 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h
@@ -74,4 +74,7 @@ bool less<void>::operator()<short &&, short &&>(short &&, 
short &&) const {
 
 template <>
 struct less<void>::X<short> {};
+
+template <typename T>
+class vector;
 } // namespace std
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp
index 6ddc09f2afd29..f594e6948a9ad 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp
@@ -282,6 +282,11 @@ template<typename> struct T {};
 T<B> b;
 }
 
+template <typename T>
+struct std::hash<std::vector<T>>
+// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: modification of 'std' namespace 
can result in undefined behavior [bugprone-std-namespace-modification]
+{};
+
 // gh183752 begin
 template <typename T>
 struct Bar

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to