Author: flovent
Date: 2026-03-03T21:29:21+08:00
New Revision: 1eeb2eccf8b2397c49aaeefde61257c5be6fc905

URL: 
https://github.com/llvm/llvm-project/commit/1eeb2eccf8b2397c49aaeefde61257c5be6fc905
DIFF: 
https://github.com/llvm/llvm-project/commit/1eeb2eccf8b2397c49aaeefde61257c5be6fc905.diff

LOG: [clang-tidy] Handle specialization of user-defined type in 
`bugprone-std-namespace-modification` (#183984)

Ignore `templateSpecializationType` based on user-define classes too.

Fixes #183752

Added: 
    

Modified: 
    clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
    clang-tools-extra/docs/ReleaseNotes.rst
    
clang-tools-extra/test/clang-tidy/checkers/Inputs/Headers/system-header-simulation.h
    
clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp

Removed: 
    


################################################################################
diff  --git 
a/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp 
b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
index 5697f1059687c..8a79db184e87a 100644
--- a/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp
@@ -43,10 +43,13 @@ 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 =
+      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))))));
   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 9aef286eedc30..cf74f6f6b34be 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -187,6 +187,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/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 32bcbcaa21c0d..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
@@ -281,3 +281,18 @@ 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
+{};
+
+template <typename T>
+struct std::hash<Bar<T>> // Should not warn as this specialization depends on 
a user-defined type.
+{};
+// gh183752 end


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

Reply via email to