[clang-tools-extra] 1eeb2ec - [clang-tidy] Handle specialization of user-defined type in `bugprone-std-namespace-modification` (#183984)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 3 05:29:25 PST 2026
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
More information about the cfe-commits
mailing list