Change:
<ins> // aux-build:macro_pub_in_module.rs // edition:2018 // build-aux-docs //! See issue #74355 #![feature(decl_macro, no_core, rustc_attrs)] #![crate_name = "krate"] #![no_core] // @has external_crate/some_module/macro.external_macro.html // @!has external_crate/macro.external_macro.html extern crate external_crate; pub mod inner { // @has krate/inner/macro.raw_const.html // @!has krate/macro.raw_const.html pub macro raw_const() {} // @has krate/inner/macro.test.html // @!has krate/macro.test.html #[rustc_builtin_macro] pub macro test($item:item) {} // @has krate/inner/macro.Clone.html // @!has krate/macro.Clone.html #[rustc_builtin_macro] pub macro Clone($item:item) {} // Make sure the logic is not affected by re-exports. mod unrenamed { // @!has krate/macro.unrenamed.html #[rustc_macro_transparency = "semitransparent"] pub macro unrenamed() {} } // @has krate/inner/macro.unrenamed.html pub use unrenamed::unrenamed; mod private { // @!has krate/macro.m.html pub macro m() {} } // @has krate/inner/macro.renamed.html // @!has krate/macro.renamed.html pub use private::m as renamed; mod private2 { // @!has krate/macro.m2.html pub macro m2() {} } use private2 as renamed_mod; // @has krate/inner/macro.m2.html pub use renamed_mod::m2; // @has krate/inner/macro.external_macro.html // @!has krate/macro.external_macro.html pub use ::external_crate::some_module::external_macro; } // Namespaces: Make sure the logic does not mix up a function name with a module name… fn both_fn_and_mod() { // @!has krate/macro.in_both_fn_and_mod.html pub macro in_both_fn_and_mod() {} } pub mod both_fn_and_mod { // @!has krate/both_fn_and_mod/macro.in_both_fn_and_mod.html } const __: () = { // @!has krate/macro.in_both_const_and_mod.html pub macro in_both_const_and_mod() {} }; pub mod __ { // @!has krate/__/macro.in_both_const_and_mod.html } enum Enum { Crazy = { // @!has krate/macro.this_is_getting_weird.html; pub macro this_is_getting_weird() {} 42 }, } </ins>

Discussion:
rustdoc is showing the macro at the wrong path in libcore: says but really it is (and the same goes for ). Looks like is not handled correctly? Cc
cc
When a macro is marked as reexported, you can use it directly from the "top", so in this regard, isn't it the expected behavior?
AFAIK that is not true for macros, just for macros.
Note that there is no here. This macro is exported via , like normal items (functions, structs, ...).
Code example: So I think there is definitely a rustdoc bug here. The path it shows does not work.
Oh I see. Indeed, it's a bug.
Not sure if helpful, but the way we got public exports to work in rustdoc in was by creating a separate crate (), and then re-exporting from from the main crate. This enabled us to render  in rustdoc. This issue will also affect the upcoming  PR.
how hard is it to fix this problem, and what does the rustdoc team's prioritization for this look like? We'd like to stabilize , and I am not sure if we want to stabilize this while its docs are rendered incorrectly.
Sorry but no idea. I don't have much time lately so maybe someone else from the will give it a try? Otherwise I'll try to fix it as soon as I have time.
Yeah so the problem here is that we have TypeKind::Macro which forces all macros to live at the root. Given a Def or a Res, how do I tell if a macro is MBE or a newstyle macro? (There's a possibility that our current code actually handles this correctly already and we need to remove the special case for TypeKind::Macro)
Okay so here are the two offending bits of code: The latter is more about linking to these items rather than rendering them. So the problem is that by the time stuff gets to rustdoc, we're looking at the HIR and the two kinds of macros are squashed together on . The newstyle macros are not a variant of at all, they disappear from the HIR tree at that point and only exist as an array on the crate. It would be nice if MBEs stayed on and newstyle macros were actually Items or at least stored separately on the module.

We could handle these as we see their containing module, but that seems prone to issues when there are reexports and private modules in the mix. I think having newstyle macros live on rather than is a mistake.
An option to do this purely in rustdoc would be to check the and insert it in the appropriate modules after the fact, however this is kinda icky and i don't think this will be the last tooling problem encountered by newstyle macros living at the crate root in HIR.
will probably know best how to interpret this information; somehow macro name resolution also has to work with this, after all.
I don't think name resolution actually operates on the hir that way. But yeah, worth letting him answer.
I think you can recover the module they came from using the on it.
You can tell whether it's a macro or a by looking at .