llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tools-extra Author: None (flovent) <details> <summary>Changes</summary> Ignore `templateSpecializationType` based on user-define classes too. Fixes #<!-- -->183752 --- Full diff: https://github.com/llvm/llvm-project/pull/183984.diff 3 Files Affected: - (modified) clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp (+5-4) - (modified) clang-tools-extra/docs/ReleaseNotes.rst (+5) - (modified) clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification.cpp (+10) ``````````diff 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 `````````` </details> https://github.com/llvm/llvm-project/pull/183984 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
