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
