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

Reply via email to