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
