Change:
<!-- Thank you for filing a regression report! A regression is something that changed between versions of Rust but was not supposed to. Please provide a short summary of the regression, along with any information you feel is relevant to replicate it. --I tried this code: I expected to see this happen: ! Instead, this happened: ! <!-- Provide the most recent version this worked on, for example: It most recently worked on: Rust 1.47 --It most recently worked on: Rust 1.67.1, Rust nightly-2023-02-03 <!-- Provide the version you are using that has the regression. --Rust nightly-2023-02-04 : modify labels: +regression-from-stable-to-nightly -regression-untriaged
Very likely regressed in (CC label T-rustdoc
So macros should be excluded from the inheritance as well. Sending a fix.

Discussion:
/// In case `i` is a non-hidden impl block, then we special-case it by changing the value /// of `is_in_hidden_item` to `true` because the impl children inherit its visibility. <del> fn recurse_in_impl(&mut self, i: Item) -> Item { </del> <ins> fn recurse_in_impl_or_exported_macro(&mut self, i: Item) -> Item { </ins> let prev = mem::replace(&mut self.is_in_hidden_item, false); let ret = self.fold_item_recur(i); self.is_in_hidden_item = prev;

impl<'a, 'tcx> DocFolder for Stripper<'a, 'tcx> { fn fold_item(&mut self, i: Item) -> Option<Item> { let has_doc_hidden = i.attrs.lists(sym::doc).has_word(sym::hidden); <del> let is_impl = matches!(*i.kind, clean::ImplItem(..)); </del> <ins> let is_impl_or_exported_macro = match *i.kind { clean::ImplItem(..) => true, // If the macro has the `#[macro_export]` attribute, it means it's accessible at the // crate level so it should be handled differently. clean::MacroItem(..) => { i.attrs.other_attrs.iter().any(|attr| attr.has_name(sym::macro_export)) } _ => false, }; </ins> let mut is_hidden = has_doc_hidden; <del> if !is_impl { </del> <ins> if !is_impl_or_exported_macro { </ins> is_hidden = self.is_in_hidden_item || has_doc_hidden; if !is_hidden && i.inline_stmt_id.is_none() { // We don't need to check if it's coming from a reexport since the reexport itself was

if self.update_retained { self.retained.insert(i.item_id); } <del> return Some(if is_impl { self.recurse_in_impl(i) </del> <ins> return Some(if is_impl_or_exported_macro { self.recurse_in_impl_or_exported_macro(i) </ins> } else { self.set_is_in_hidden_item_and_fold(false, i) });

<ins> // Regression test for <https://github.com/rust-lang/rust/issues/108231>. // Macros with `#[macro_export]` attribute should be visible at the top level // even if they are inside a doc hidden item. #![crate_name = "foo"] // @has 'foo/index.html' // @count - '//*[@id="main-content"]//a[@class="macro"]' 1 // @has - '//*[@id="main-content"]//a[@class="macro"]' 'foo' #[doc(hidden)] pub mod __internal { /// This one should be visible. #[macro_export] macro_rules! foo { () => {}; } /// This one should be hidden. macro_rules! bar { () => {}; } } </ins>

<ins> // Ensure that inlined reexport of hidden macros is working as expected. // Part of <https://github.com/rust-lang/rust/issues/59368>. #![crate_name = "foo"] // @has 'foo/index.html' // @has - '//*[@id="main-content"]//a[@href="macro.Macro2.html"]' 'Macro2' // @has 'foo/macro.Macro2.html' // @has - '//*[@class="docblock"]' 'Displayed' #[macro_export] #[doc(hidden)] macro_rules! foo { () => {}; } /// not displayed pub use crate::foo as Macro; /// Displayed #[doc(inline)] pub use crate::foo as Macro2; </ins>