blob: 4707d958f8c97fcff0f7ac4a0fe4ba747d513957 [file] [edit]
// Regression test for <https://github.com/rust-lang/rust/issues/154694>.
// The goal is to ensure that declarative macros re-exported by name
// inherit the `#[doc(inline)]` attribute from intermediate re-exports,
// matching the behavior of glob re-exports.
#![crate_name = "foo"]
#[macro_use]
mod macros {
#[macro_export]
#[doc(hidden)]
macro_rules! explicit_macro {
() => {};
}
#[macro_export]
#[doc(hidden)]
macro_rules! wild_macro {
() => {};
}
#[macro_export]
#[doc(hidden)]
macro_rules! actually_hidden_macro {
() => {};
}
#[macro_export]
#[doc(hidden)]
macro_rules! actually_hidden_wild_macro {
() => {};
}
#[macro_export]
#[doc(hidden)]
macro_rules! actually_hidden_indirect_macro {
() => {};
}
}
// Standard items (like structs) are provided as control cases to ensure
// macro inlining behavior maintains parity.
#[doc(hidden)]
pub struct HiddenStruct;
#[doc(hidden)]
pub struct IndirectlyHiddenStruct;
pub mod bar {
mod hidden_explicit {
#[doc(inline)]
pub use crate::explicit_macro;
}
mod hidden_wild {
#[doc(inline)]
pub use crate::wild_macro;
}
mod actually_hidden {
// BUG: as demonstrated by the `actually_hidden_struct` module, when both
// `doc(hidden)` and `doc(inline)` are specified, `doc(hidden)`
// should take priority.
#[doc(hidden)]
#[doc(inline)]
pub use crate::actually_hidden_macro;
}
mod actually_hidden_indirect_inner {
#[doc(inline)]
pub use crate::actually_hidden_indirect_macro;
}
mod actually_hidden_indirect {
// BUG: when there is a chain of imports, we should stop looking as soon as soon as we hit
// something with `doc(hidden)`.
#[doc(hidden)]
pub use super::actually_hidden_indirect_inner::actually_hidden_indirect_macro;
}
mod actually_hidden_indirect_struct_inner {
#[doc(inline)]
pub use crate::IndirectlyHiddenStruct;
}
mod actually_hidden_indirect_struct {
#[doc(hidden)]
pub use super::actually_hidden_indirect_struct_inner::IndirectlyHiddenStruct;
}
mod actually_hidden_wild {
#[doc(hidden)]
#[doc(inline)]
pub use crate::actually_hidden_wild_macro;
}
mod actually_hidden_struct {
#[doc(inline)]
#[doc(hidden)]
pub use crate::HiddenStruct;
}
// First, we check that the explicitly named macro inherits the inline attribute
// from `hidden_explicit` and is successfully rendered.
//@ has 'foo/bar/macro.explicit_macro.html'
//@ has 'foo/bar/index.html' '//a[@href="macro.explicit_macro.html"]' 'explicit_macro'
pub use self::hidden_explicit::explicit_macro;
// Next, we ensure that the glob-imported macro continues to render correctly
// as a control case.
//@ has 'foo/bar/macro.wild_macro.html'
//@ has 'foo/bar/index.html' '//a[@href="macro.wild_macro.html"]' 'wild_macro'
pub use self::hidden_wild::*;
//@ !has 'foo/bar/macro.actually_hidden_macro.html'
pub use self::actually_hidden::actually_hidden_macro;
//@ !has 'foo/bar/macro.actually_hidden_wild_macro.html'
pub use self::actually_hidden_wild::*;
//@ !has 'foo/bar/struct.HiddenStruct.html'
pub use self::actually_hidden_struct::HiddenStruct;
//@ !has 'foo/bar/macro.actually_hidden_indirect_macro.html'
pub use self::actually_hidden_indirect::actually_hidden_indirect_macro;
//@ !has 'foo/bar/struct.IndirectlyHiddenStruct.html'
pub use self::actually_hidden_indirect_struct::IndirectlyHiddenStruct;
}