From 3630afb57f5c98c83210adde07a92f6ebdce7fc7 Mon Sep 17 00:00:00 2001
From: ThibsG <thibsg@pm.me>
Date: Thu, 14 Oct 2021 12:16:35 +0200
Subject: [PATCH] Do not lint if any parent has hidden attribute

---
 clippy_lints/src/doc.rs | 12 ++++++++++++
 tests/ui/doc_unsafe.rs  | 10 ++++++++++
 2 files changed, 22 insertions(+)

diff --git a/clippy_lints/src/doc.rs b/clippy_lints/src/doc.rs
index 9840affbf6f..5511c3ea9b6 100644
--- a/clippy_lints/src/doc.rs
+++ b/clippy_lints/src/doc.rs
@@ -1,3 +1,4 @@
+use clippy_utils::attrs::is_doc_hidden;
 use clippy_utils::diagnostics::{span_lint, span_lint_and_help, span_lint_and_note};
 use clippy_utils::source::first_line_of_span;
 use clippy_utils::ty::{implements_trait, is_type_diagnostic_item};
@@ -297,6 +298,17 @@ fn lint_for_missing_headers<'tcx>(
     if !cx.access_levels.is_exported(def_id) {
         return; // Private functions do not require doc comments
     }
+
+    // do not lint if any parent has `#[doc(hidden)]` attribute (#7347)
+    if cx
+        .tcx
+        .hir()
+        .parent_iter(cx.tcx.hir().local_def_id_to_hir_id(def_id))
+        .any(|(id, _node)| is_doc_hidden(cx.tcx.hir().attrs(id)))
+    {
+        return;
+    }
+
     if !headers.safety && sig.header.unsafety == hir::Unsafety::Unsafe {
         span_lint(
             cx,
diff --git a/tests/ui/doc_unsafe.rs b/tests/ui/doc_unsafe.rs
index 8f823f1672b..03bb30f9083 100644
--- a/tests/ui/doc_unsafe.rs
+++ b/tests/ui/doc_unsafe.rs
@@ -115,3 +115,13 @@ fn main() {
         drive();
     }
 }
+
+// do not lint if any parent has `#[doc(hidden)]` attribute
+// see #7347
+#[doc(hidden)]
+pub mod __macro {
+    pub struct T;
+    impl T {
+        pub unsafe fn f() {}
+    }
+}