From 526c1afb5cf2da2f5c4cf94a3cf18c18705fc259 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Thu, 26 Feb 2026 16:05:31 +0100 Subject: [PATCH 1/3] Correctly handle `#[doc(alias = "...")]` attribute on inlined reexports --- src/librustdoc/clean/mod.rs | 3 ++- tests/rustdoc-js/auxiliary/reexport-alias.rs | 2 ++ tests/rustdoc-js/reexport-alias.js | 12 ++++++++++++ tests/rustdoc-js/reexport-alias.rs | 8 ++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 tests/rustdoc-js/auxiliary/reexport-alias.rs create mode 100644 tests/rustdoc-js/reexport-alias.js create mode 100644 tests/rustdoc-js/reexport-alias.rs diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 880d2f7f37ccd..d109dd31bb855 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -2701,7 +2701,7 @@ fn add_without_unwanted_attributes<'hir>( } hir::Attribute::Parsed(AttributeKind::Doc(box d)) => { // Remove attributes from `normal` that should not be inherited by `use` re-export. - let DocAttribute { hidden, inline, cfg, .. } = d; + let DocAttribute { hidden, inline, cfg, aliases, .. } = d; let mut attr = DocAttribute::default(); if is_inline { attr.cfg = cfg.clone(); @@ -2709,6 +2709,7 @@ fn add_without_unwanted_attributes<'hir>( attr.inline = inline.clone(); attr.hidden = hidden.clone(); } + attr.aliases = aliases.clone(); attrs.push(( Cow::Owned(hir::Attribute::Parsed(AttributeKind::Doc(Box::new(attr)))), import_parent, diff --git a/tests/rustdoc-js/auxiliary/reexport-alias.rs b/tests/rustdoc-js/auxiliary/reexport-alias.rs new file mode 100644 index 0000000000000..ba935f6edbdb9 --- /dev/null +++ b/tests/rustdoc-js/auxiliary/reexport-alias.rs @@ -0,0 +1,2 @@ +#[doc(alias = "answer")] +pub fn number() {} diff --git a/tests/rustdoc-js/reexport-alias.js b/tests/rustdoc-js/reexport-alias.js new file mode 100644 index 0000000000000..0df4a614eed56 --- /dev/null +++ b/tests/rustdoc-js/reexport-alias.js @@ -0,0 +1,12 @@ +// exact-check + +// This test ensures that inlined reexport items keep the `#[doc(alias = "...")]` +// information. +// This is a regression test for . + +const EXPECTED = { + 'query': 'answer', + 'others': [ + { 'path': 'foo', 'name': 'number', 'is_alias': true }, + ], +}; diff --git a/tests/rustdoc-js/reexport-alias.rs b/tests/rustdoc-js/reexport-alias.rs new file mode 100644 index 0000000000000..e716fe9c7b9df --- /dev/null +++ b/tests/rustdoc-js/reexport-alias.rs @@ -0,0 +1,8 @@ +//@ aux-crate:priv:reexport_alias=reexport-alias.rs +//@ compile-flags: -Zunstable-options --extern equivalent + +#![crate_name = "foo"] + +extern crate reexport_alias; + +pub use reexport_alias::number; From f6e527ed28621751552ddf55822807277887a4d5 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 27 Feb 2026 19:22:20 +0100 Subject: [PATCH 2/3] Improve code by ensuring that if new doc attributes are added, we will be forced to take them into account when inlining --- src/librustdoc/clean/mod.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index d109dd31bb855..a01473c632f4b 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -2701,7 +2701,29 @@ fn add_without_unwanted_attributes<'hir>( } hir::Attribute::Parsed(AttributeKind::Doc(box d)) => { // Remove attributes from `normal` that should not be inherited by `use` re-export. - let DocAttribute { hidden, inline, cfg, aliases, .. } = d; + let DocAttribute { + aliases, + hidden, + inline, + cfg, + auto_cfg: _, + auto_cfg_change: _, + fake_variadic: _, + keyword: _, + attribute: _, + masked: _, + notable_trait: _, + search_unbox: _, + html_favicon_url: _, + html_logo_url: _, + html_playground_url: _, + html_root_url: _, + html_no_source: _, + issue_tracker_base_url: _, + rust_logo: _, + test_attrs: _, + no_crate_inject: _, + } = d; let mut attr = DocAttribute::default(); if is_inline { attr.cfg = cfg.clone(); From ab9e1da0a1a4f3bc5d54c6d0521428d80ce1c4d4 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 27 Feb 2026 19:22:38 +0100 Subject: [PATCH 3/3] Add regression test for `search_unbox` inlined reexport --- .../auxiliary/reexport-search_unbox.rs | 20 +++++++++++++++++++ tests/rustdoc-js/reexport-search_unbox.js | 12 +++++++++++ tests/rustdoc-js/reexport-search_unbox.rs | 12 +++++++++++ 3 files changed, 44 insertions(+) create mode 100644 tests/rustdoc-js/auxiliary/reexport-search_unbox.rs create mode 100644 tests/rustdoc-js/reexport-search_unbox.js create mode 100644 tests/rustdoc-js/reexport-search_unbox.rs diff --git a/tests/rustdoc-js/auxiliary/reexport-search_unbox.rs b/tests/rustdoc-js/auxiliary/reexport-search_unbox.rs new file mode 100644 index 0000000000000..ee9b6acfedd5c --- /dev/null +++ b/tests/rustdoc-js/auxiliary/reexport-search_unbox.rs @@ -0,0 +1,20 @@ +#![feature(rustdoc_internals)] + +#[doc(search_unbox)] +pub struct Inside(T); + +#[doc(search_unbox)] +pub struct Out { + a: A, + b: B, +} + +#[doc(search_unbox)] +pub struct Out1 { + a: [A; N], +} + +#[doc(search_unbox)] +pub struct Out2 { + a: [A; N], +} diff --git a/tests/rustdoc-js/reexport-search_unbox.js b/tests/rustdoc-js/reexport-search_unbox.js new file mode 100644 index 0000000000000..87c8f63354a61 --- /dev/null +++ b/tests/rustdoc-js/reexport-search_unbox.js @@ -0,0 +1,12 @@ +// exact-check + +// This test ensures that `search_unbox` works even on inlined reexports. + +const EXPECTED = [ + { + 'query': 'Inside -> Out1', + 'others': [ + { 'path': 'foo', 'name': 'alpha' }, + ], + }, +] diff --git a/tests/rustdoc-js/reexport-search_unbox.rs b/tests/rustdoc-js/reexport-search_unbox.rs new file mode 100644 index 0000000000000..2103ac9c9a052 --- /dev/null +++ b/tests/rustdoc-js/reexport-search_unbox.rs @@ -0,0 +1,12 @@ +//@ aux-crate:priv:reexport_search_unbox=reexport-search_unbox.rs +//@ compile-flags: -Zunstable-options --extern equivalent + +#![crate_name = "foo"] + +extern crate reexport_search_unbox; + +pub use reexport_search_unbox::{Inside, Out, Out1, Out2}; + +pub fn alpha(_: Inside) -> Out, Out2> { + loop {} +}