From ffe24fef675f6aa9618ff497b1297a2f12943305 Mon Sep 17 00:00:00 2001 From: LusterSourav <282348889+LusterSourav@users.noreply.github.com> Date: Tue, 4 Aug 2026 13:07:22 +0530 Subject: [PATCH 1/5] Fix duplicate fallback items in visible_parent_map BFS. Hidden items aren't added to the map, which causes each parent path to re-enqueue the entire subtree. This led to exponential rustdoc hangs, as noted in issue #160439. --- compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs b/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs index 97cc76d833e9e..929441125dd52 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use rustc_hir::attrs::Deprecation; use rustc_hir::def::{CtorKind, DefKind}; -use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LOCAL_CRATE}; +use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LOCAL_CRATE}; use rustc_hir::definitions::{DefKey, DefPath, DefPathHash}; use rustc_middle::arena::ArenaAllocatable; use rustc_middle::bug; @@ -473,6 +473,9 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) { // This is a rudimentary check that does not catch all cases, // just the easiest. let mut fallback_map: Vec<(DefId, DefId)> = Default::default(); + // hidden items never enter the map, so dedup here or every + // parent path re-enqueues the whole subtree (#160439) + let mut fallback_seen: DefIdSet = Default::default(); // Issue 46112: We want the map to prefer the shortest // paths when reporting the path to an item. Therefore we @@ -534,6 +537,10 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) { } Entry::Vacant(entry) => { if fallback { + // seen already, skip this parent + if !fallback_seen.insert(def_id) { + return; + } // We do all of the same steps to fallback entries as to // preferred entries, except for recording them in a separate map. // It is important to not return early in the fallback cases to From bac6246139272380a3932a0ae732c594c5179eef Mon Sep 17 00:00:00 2001 From: LusterSourav <282348889+LusterSourav@users.noreply.github.com> Date: Tue, 4 Aug 2026 13:07:27 +0530 Subject: [PATCH 2/5] Add a regression test for rustdoc hangs with nested hidden modules. The rmake.rs script now builds dep.rs and runs rustdoc with a 60-second kill watchdog, since compiletest doesn't have individual test timeouts. This allows regressions to fail quickly instead of causing CI to hang. --- .../rustdoc/visible-parent-map-hang/rmake.rs | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/run-make/rustdoc/visible-parent-map-hang/rmake.rs diff --git a/tests/run-make/rustdoc/visible-parent-map-hang/rmake.rs b/tests/run-make/rustdoc/visible-parent-map-hang/rmake.rs new file mode 100644 index 0000000000000..2d5eff700f3f1 --- /dev/null +++ b/tests/run-make/rustdoc/visible-parent-map-hang/rmake.rs @@ -0,0 +1,36 @@ +// Regression test for https://github.com/rust-lang/rust/issues/160439. +// Nested `#[doc(hidden)]` modules used to make the visible_parent_map BFS +// re-enqueue the same subtree for every parent path, which is exponential. + +use std::process::{Command, Stdio}; +use std::time::{Duration, Instant}; + +use run_make_support::{env_var, rust_lib_name, rustc}; + +fn main() { + rustc().input("dep.rs").edition("2021").crate_type("lib").run(); + + // The bug made rustdoc hang here, so kill it if it takes too long. + // compiletest has no per-test timeout, hence the manual watchdog. + let mut child = Command::new(env_var("RUSTDOC")) + .args(["--edition", "2021", "--crate-name", "main", "-o", "target"]) + .arg(format!("--extern=dep={}", rust_lib_name("dep"))) + .arg("main.rs") + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() + .unwrap(); + + let deadline = Instant::now() + Duration::from_secs(60); + let status = loop { + if let Some(status) = child.try_wait().unwrap() { + break status; + } + if Instant::now() > deadline { + child.kill().unwrap(); + panic!("rustdoc timed out: visible_parent_map regression?"); + } + std::thread::sleep(Duration::from_millis(100)); + }; + assert!(status.success()); +} From 0cf22dfd5bb19f9cb1e46bf128ff72f4f3bcfada Mon Sep 17 00:00:00 2001 From: LusterSourav <282348889+LusterSourav@users.noreply.github.com> Date: Tue, 4 Aug 2026 13:07:31 +0530 Subject: [PATCH 3/5] Add fixture crates for the visible_parent_map hang test. This includes a nested #[doc(hidden)] fan structure (B=8, D=12) in dep.rs, which is only reachable through hidden parents. The main.rs file implements dep::Tr to trigger the trait path rendering that caused the issue. --- .../rustdoc/visible-parent-map-hang/dep.rs | 143 ++++++++++++++++++ .../rustdoc/visible-parent-map-hang/main.rs | 13 ++ 2 files changed, 156 insertions(+) create mode 100644 tests/run-make/rustdoc/visible-parent-map-hang/dep.rs create mode 100644 tests/run-make/rustdoc/visible-parent-map-hang/main.rs diff --git a/tests/run-make/rustdoc/visible-parent-map-hang/dep.rs b/tests/run-make/rustdoc/visible-parent-map-hang/dep.rs new file mode 100644 index 0000000000000..8a95ecd783547 --- /dev/null +++ b/tests/run-make/rustdoc/visible-parent-map-hang/dep.rs @@ -0,0 +1,143 @@ +#![crate_type = "lib"] +#![allow(dead_code)] + +pub trait Tr { fn x(); } +pub trait Tr2 { fn x(); } + +#[doc(hidden)] +pub mod outer { + #[doc(hidden)] + pub mod l0 { + #[doc(hidden)] pub mod s0 { pub use super::l1; } + #[doc(hidden)] pub mod s1 { pub use super::l1; } + #[doc(hidden)] pub mod s2 { pub use super::l1; } + #[doc(hidden)] pub mod s3 { pub use super::l1; } + #[doc(hidden)] pub mod s4 { pub use super::l1; } + #[doc(hidden)] pub mod s5 { pub use super::l1; } + #[doc(hidden)] pub mod s6 { pub use super::l1; } + #[doc(hidden)] pub mod s7 { pub use super::l1; } + #[doc(hidden)] + pub mod l1 { + #[doc(hidden)] pub mod s0 { pub use super::l2; } + #[doc(hidden)] pub mod s1 { pub use super::l2; } + #[doc(hidden)] pub mod s2 { pub use super::l2; } + #[doc(hidden)] pub mod s3 { pub use super::l2; } + #[doc(hidden)] pub mod s4 { pub use super::l2; } + #[doc(hidden)] pub mod s5 { pub use super::l2; } + #[doc(hidden)] pub mod s6 { pub use super::l2; } + #[doc(hidden)] pub mod s7 { pub use super::l2; } + #[doc(hidden)] + pub mod l2 { + #[doc(hidden)] pub mod s0 { pub use super::l3; } + #[doc(hidden)] pub mod s1 { pub use super::l3; } + #[doc(hidden)] pub mod s2 { pub use super::l3; } + #[doc(hidden)] pub mod s3 { pub use super::l3; } + #[doc(hidden)] pub mod s4 { pub use super::l3; } + #[doc(hidden)] pub mod s5 { pub use super::l3; } + #[doc(hidden)] pub mod s6 { pub use super::l3; } + #[doc(hidden)] pub mod s7 { pub use super::l3; } + #[doc(hidden)] + pub mod l3 { + #[doc(hidden)] pub mod s0 { pub use super::l4; } + #[doc(hidden)] pub mod s1 { pub use super::l4; } + #[doc(hidden)] pub mod s2 { pub use super::l4; } + #[doc(hidden)] pub mod s3 { pub use super::l4; } + #[doc(hidden)] pub mod s4 { pub use super::l4; } + #[doc(hidden)] pub mod s5 { pub use super::l4; } + #[doc(hidden)] pub mod s6 { pub use super::l4; } + #[doc(hidden)] pub mod s7 { pub use super::l4; } + #[doc(hidden)] + pub mod l4 { + #[doc(hidden)] pub mod s0 { pub use super::l5; } + #[doc(hidden)] pub mod s1 { pub use super::l5; } + #[doc(hidden)] pub mod s2 { pub use super::l5; } + #[doc(hidden)] pub mod s3 { pub use super::l5; } + #[doc(hidden)] pub mod s4 { pub use super::l5; } + #[doc(hidden)] pub mod s5 { pub use super::l5; } + #[doc(hidden)] pub mod s6 { pub use super::l5; } + #[doc(hidden)] pub mod s7 { pub use super::l5; } + #[doc(hidden)] + pub mod l5 { + #[doc(hidden)] pub mod s0 { pub use super::l6; } + #[doc(hidden)] pub mod s1 { pub use super::l6; } + #[doc(hidden)] pub mod s2 { pub use super::l6; } + #[doc(hidden)] pub mod s3 { pub use super::l6; } + #[doc(hidden)] pub mod s4 { pub use super::l6; } + #[doc(hidden)] pub mod s5 { pub use super::l6; } + #[doc(hidden)] pub mod s6 { pub use super::l6; } + #[doc(hidden)] pub mod s7 { pub use super::l6; } + #[doc(hidden)] + pub mod l6 { + #[doc(hidden)] pub mod s0 { pub use super::l7; } + #[doc(hidden)] pub mod s1 { pub use super::l7; } + #[doc(hidden)] pub mod s2 { pub use super::l7; } + #[doc(hidden)] pub mod s3 { pub use super::l7; } + #[doc(hidden)] pub mod s4 { pub use super::l7; } + #[doc(hidden)] pub mod s5 { pub use super::l7; } + #[doc(hidden)] pub mod s6 { pub use super::l7; } + #[doc(hidden)] pub mod s7 { pub use super::l7; } + #[doc(hidden)] + pub mod l7 { + #[doc(hidden)] pub mod s0 { pub use super::l8; } + #[doc(hidden)] pub mod s1 { pub use super::l8; } + #[doc(hidden)] pub mod s2 { pub use super::l8; } + #[doc(hidden)] pub mod s3 { pub use super::l8; } + #[doc(hidden)] pub mod s4 { pub use super::l8; } + #[doc(hidden)] pub mod s5 { pub use super::l8; } + #[doc(hidden)] pub mod s6 { pub use super::l8; } + #[doc(hidden)] pub mod s7 { pub use super::l8; } + #[doc(hidden)] + pub mod l8 { + #[doc(hidden)] pub mod s0 { pub use super::l9; } + #[doc(hidden)] pub mod s1 { pub use super::l9; } + #[doc(hidden)] pub mod s2 { pub use super::l9; } + #[doc(hidden)] pub mod s3 { pub use super::l9; } + #[doc(hidden)] pub mod s4 { pub use super::l9; } + #[doc(hidden)] pub mod s5 { pub use super::l9; } + #[doc(hidden)] pub mod s6 { pub use super::l9; } + #[doc(hidden)] pub mod s7 { pub use super::l9; } + #[doc(hidden)] + pub mod l9 { + #[doc(hidden)] pub mod s0 { pub use super::l10; } + #[doc(hidden)] pub mod s1 { pub use super::l10; } + #[doc(hidden)] pub mod s2 { pub use super::l10; } + #[doc(hidden)] pub mod s3 { pub use super::l10; } + #[doc(hidden)] pub mod s4 { pub use super::l10; } + #[doc(hidden)] pub mod s5 { pub use super::l10; } + #[doc(hidden)] pub mod s6 { pub use super::l10; } + #[doc(hidden)] pub mod s7 { pub use super::l10; } + #[doc(hidden)] + pub mod l10 { + #[doc(hidden)] pub mod s0 { pub use super::l11; } + #[doc(hidden)] pub mod s1 { pub use super::l11; } + #[doc(hidden)] pub mod s2 { pub use super::l11; } + #[doc(hidden)] pub mod s3 { pub use super::l11; } + #[doc(hidden)] pub mod s4 { pub use super::l11; } + #[doc(hidden)] pub mod s5 { pub use super::l11; } + #[doc(hidden)] pub mod s6 { pub use super::l11; } + #[doc(hidden)] pub mod s7 { pub use super::l11; } + #[doc(hidden)] + pub mod l11 { + #[doc(hidden)] pub mod s0 { pub use super::leaf::S; } + #[doc(hidden)] pub mod s1 { pub use super::leaf::S; } + #[doc(hidden)] pub mod s2 { pub use super::leaf::S; } + #[doc(hidden)] pub mod s3 { pub use super::leaf::S; } + #[doc(hidden)] pub mod s4 { pub use super::leaf::S; } + #[doc(hidden)] pub mod s5 { pub use super::leaf::S; } + #[doc(hidden)] pub mod s6 { pub use super::leaf::S; } + #[doc(hidden)] pub mod s7 { pub use super::leaf::S; } + #[doc(hidden)] pub mod leaf { pub struct S; } + } + } + } + } + } + } + } + } + } + } + } + } +} + diff --git a/tests/run-make/rustdoc/visible-parent-map-hang/main.rs b/tests/run-make/rustdoc/visible-parent-map-hang/main.rs new file mode 100644 index 0000000000000..c4f4eee856bc4 --- /dev/null +++ b/tests/run-make/rustdoc/visible-parent-map-hang/main.rs @@ -0,0 +1,13 @@ +#![crate_type = "lib"] +extern crate dep; +pub use dep::Tr; +use std::fmt; + +pub struct Local; +impl dep::Tr for Local { fn x() {} } +impl dep::Tr2 for Local { fn x() {} } +impl fmt::Display for Local { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "x") } +} +impl Default for Local { fn default() -> Self { Local } } + From 9d2bdbd38c4fd15a435621fe3d5e8247b0195cf9 Mon Sep 17 00:00:00 2001 From: LusterSourav <282348889+LusterSourav@users.noreply.github.com> Date: Tue, 4 Aug 2026 13:31:12 +0530 Subject: [PATCH 4/5] Format visible_parent_map hang test fixtures with rustfmt --- .../rustdoc/visible-parent-map-hang/dep.rs | 546 ++++++++++++++---- .../rustdoc/visible-parent-map-hang/main.rs | 19 +- 2 files changed, 434 insertions(+), 131 deletions(-) diff --git a/tests/run-make/rustdoc/visible-parent-map-hang/dep.rs b/tests/run-make/rustdoc/visible-parent-map-hang/dep.rs index 8a95ecd783547..72dd66370c6fb 100644 --- a/tests/run-make/rustdoc/visible-parent-map-hang/dep.rs +++ b/tests/run-make/rustdoc/visible-parent-map-hang/dep.rs @@ -1,143 +1,437 @@ #![crate_type = "lib"] #![allow(dead_code)] -pub trait Tr { fn x(); } -pub trait Tr2 { fn x(); } +pub trait Tr { + fn x(); +} +pub trait Tr2 { + fn x(); +} #[doc(hidden)] pub mod outer { + #[doc(hidden)] + pub mod l0 { #[doc(hidden)] - pub mod l0 { - #[doc(hidden)] pub mod s0 { pub use super::l1; } - #[doc(hidden)] pub mod s1 { pub use super::l1; } - #[doc(hidden)] pub mod s2 { pub use super::l1; } - #[doc(hidden)] pub mod s3 { pub use super::l1; } - #[doc(hidden)] pub mod s4 { pub use super::l1; } - #[doc(hidden)] pub mod s5 { pub use super::l1; } - #[doc(hidden)] pub mod s6 { pub use super::l1; } - #[doc(hidden)] pub mod s7 { pub use super::l1; } - #[doc(hidden)] - pub mod l1 { - #[doc(hidden)] pub mod s0 { pub use super::l2; } - #[doc(hidden)] pub mod s1 { pub use super::l2; } - #[doc(hidden)] pub mod s2 { pub use super::l2; } - #[doc(hidden)] pub mod s3 { pub use super::l2; } - #[doc(hidden)] pub mod s4 { pub use super::l2; } - #[doc(hidden)] pub mod s5 { pub use super::l2; } - #[doc(hidden)] pub mod s6 { pub use super::l2; } - #[doc(hidden)] pub mod s7 { pub use super::l2; } - #[doc(hidden)] - pub mod l2 { - #[doc(hidden)] pub mod s0 { pub use super::l3; } - #[doc(hidden)] pub mod s1 { pub use super::l3; } - #[doc(hidden)] pub mod s2 { pub use super::l3; } - #[doc(hidden)] pub mod s3 { pub use super::l3; } - #[doc(hidden)] pub mod s4 { pub use super::l3; } - #[doc(hidden)] pub mod s5 { pub use super::l3; } - #[doc(hidden)] pub mod s6 { pub use super::l3; } - #[doc(hidden)] pub mod s7 { pub use super::l3; } - #[doc(hidden)] - pub mod l3 { - #[doc(hidden)] pub mod s0 { pub use super::l4; } - #[doc(hidden)] pub mod s1 { pub use super::l4; } - #[doc(hidden)] pub mod s2 { pub use super::l4; } - #[doc(hidden)] pub mod s3 { pub use super::l4; } - #[doc(hidden)] pub mod s4 { pub use super::l4; } - #[doc(hidden)] pub mod s5 { pub use super::l4; } - #[doc(hidden)] pub mod s6 { pub use super::l4; } - #[doc(hidden)] pub mod s7 { pub use super::l4; } - #[doc(hidden)] - pub mod l4 { - #[doc(hidden)] pub mod s0 { pub use super::l5; } - #[doc(hidden)] pub mod s1 { pub use super::l5; } - #[doc(hidden)] pub mod s2 { pub use super::l5; } - #[doc(hidden)] pub mod s3 { pub use super::l5; } - #[doc(hidden)] pub mod s4 { pub use super::l5; } - #[doc(hidden)] pub mod s5 { pub use super::l5; } - #[doc(hidden)] pub mod s6 { pub use super::l5; } - #[doc(hidden)] pub mod s7 { pub use super::l5; } - #[doc(hidden)] - pub mod l5 { - #[doc(hidden)] pub mod s0 { pub use super::l6; } - #[doc(hidden)] pub mod s1 { pub use super::l6; } - #[doc(hidden)] pub mod s2 { pub use super::l6; } - #[doc(hidden)] pub mod s3 { pub use super::l6; } - #[doc(hidden)] pub mod s4 { pub use super::l6; } - #[doc(hidden)] pub mod s5 { pub use super::l6; } - #[doc(hidden)] pub mod s6 { pub use super::l6; } - #[doc(hidden)] pub mod s7 { pub use super::l6; } - #[doc(hidden)] - pub mod l6 { - #[doc(hidden)] pub mod s0 { pub use super::l7; } - #[doc(hidden)] pub mod s1 { pub use super::l7; } - #[doc(hidden)] pub mod s2 { pub use super::l7; } - #[doc(hidden)] pub mod s3 { pub use super::l7; } - #[doc(hidden)] pub mod s4 { pub use super::l7; } - #[doc(hidden)] pub mod s5 { pub use super::l7; } - #[doc(hidden)] pub mod s6 { pub use super::l7; } - #[doc(hidden)] pub mod s7 { pub use super::l7; } - #[doc(hidden)] - pub mod l7 { - #[doc(hidden)] pub mod s0 { pub use super::l8; } - #[doc(hidden)] pub mod s1 { pub use super::l8; } - #[doc(hidden)] pub mod s2 { pub use super::l8; } - #[doc(hidden)] pub mod s3 { pub use super::l8; } - #[doc(hidden)] pub mod s4 { pub use super::l8; } - #[doc(hidden)] pub mod s5 { pub use super::l8; } - #[doc(hidden)] pub mod s6 { pub use super::l8; } - #[doc(hidden)] pub mod s7 { pub use super::l8; } - #[doc(hidden)] - pub mod l8 { - #[doc(hidden)] pub mod s0 { pub use super::l9; } - #[doc(hidden)] pub mod s1 { pub use super::l9; } - #[doc(hidden)] pub mod s2 { pub use super::l9; } - #[doc(hidden)] pub mod s3 { pub use super::l9; } - #[doc(hidden)] pub mod s4 { pub use super::l9; } - #[doc(hidden)] pub mod s5 { pub use super::l9; } - #[doc(hidden)] pub mod s6 { pub use super::l9; } - #[doc(hidden)] pub mod s7 { pub use super::l9; } - #[doc(hidden)] - pub mod l9 { - #[doc(hidden)] pub mod s0 { pub use super::l10; } - #[doc(hidden)] pub mod s1 { pub use super::l10; } - #[doc(hidden)] pub mod s2 { pub use super::l10; } - #[doc(hidden)] pub mod s3 { pub use super::l10; } - #[doc(hidden)] pub mod s4 { pub use super::l10; } - #[doc(hidden)] pub mod s5 { pub use super::l10; } - #[doc(hidden)] pub mod s6 { pub use super::l10; } - #[doc(hidden)] pub mod s7 { pub use super::l10; } - #[doc(hidden)] - pub mod l10 { - #[doc(hidden)] pub mod s0 { pub use super::l11; } - #[doc(hidden)] pub mod s1 { pub use super::l11; } - #[doc(hidden)] pub mod s2 { pub use super::l11; } - #[doc(hidden)] pub mod s3 { pub use super::l11; } - #[doc(hidden)] pub mod s4 { pub use super::l11; } - #[doc(hidden)] pub mod s5 { pub use super::l11; } - #[doc(hidden)] pub mod s6 { pub use super::l11; } - #[doc(hidden)] pub mod s7 { pub use super::l11; } - #[doc(hidden)] - pub mod l11 { - #[doc(hidden)] pub mod s0 { pub use super::leaf::S; } - #[doc(hidden)] pub mod s1 { pub use super::leaf::S; } - #[doc(hidden)] pub mod s2 { pub use super::leaf::S; } - #[doc(hidden)] pub mod s3 { pub use super::leaf::S; } - #[doc(hidden)] pub mod s4 { pub use super::leaf::S; } - #[doc(hidden)] pub mod s5 { pub use super::leaf::S; } - #[doc(hidden)] pub mod s6 { pub use super::leaf::S; } - #[doc(hidden)] pub mod s7 { pub use super::leaf::S; } - #[doc(hidden)] pub mod leaf { pub struct S; } - } - } - } + pub mod s0 { + pub use super::l1; } + #[doc(hidden)] + pub mod s1 { + pub use super::l1; } + #[doc(hidden)] + pub mod s2 { + pub use super::l1; } + #[doc(hidden)] + pub mod s3 { + pub use super::l1; } + #[doc(hidden)] + pub mod s4 { + pub use super::l1; } + #[doc(hidden)] + pub mod s5 { + pub use super::l1; } + #[doc(hidden)] + pub mod s6 { + pub use super::l1; } + #[doc(hidden)] + pub mod s7 { + pub use super::l1; } + #[doc(hidden)] + pub mod l1 { + #[doc(hidden)] + pub mod s0 { + pub use super::l2; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l2; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l2; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l2; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l2; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l2; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l2; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l2; + } + #[doc(hidden)] + pub mod l2 { + #[doc(hidden)] + pub mod s0 { + pub use super::l3; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l3; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l3; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l3; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l3; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l3; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l3; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l3; + } + #[doc(hidden)] + pub mod l3 { + #[doc(hidden)] + pub mod s0 { + pub use super::l4; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l4; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l4; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l4; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l4; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l4; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l4; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l4; + } + #[doc(hidden)] + pub mod l4 { + #[doc(hidden)] + pub mod s0 { + pub use super::l5; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l5; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l5; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l5; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l5; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l5; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l5; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l5; + } + #[doc(hidden)] + pub mod l5 { + #[doc(hidden)] + pub mod s0 { + pub use super::l6; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l6; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l6; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l6; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l6; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l6; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l6; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l6; + } + #[doc(hidden)] + pub mod l6 { + #[doc(hidden)] + pub mod s0 { + pub use super::l7; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l7; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l7; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l7; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l7; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l7; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l7; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l7; + } + #[doc(hidden)] + pub mod l7 { + #[doc(hidden)] + pub mod s0 { + pub use super::l8; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l8; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l8; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l8; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l8; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l8; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l8; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l8; + } + #[doc(hidden)] + pub mod l8 { + #[doc(hidden)] + pub mod s0 { + pub use super::l9; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l9; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l9; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l9; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l9; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l9; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l9; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l9; + } + #[doc(hidden)] + pub mod l9 { + #[doc(hidden)] + pub mod s0 { + pub use super::l10; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l10; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l10; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l10; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l10; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l10; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l10; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l10; + } + #[doc(hidden)] + pub mod l10 { + #[doc(hidden)] + pub mod s0 { + pub use super::l11; + } + #[doc(hidden)] + pub mod s1 { + pub use super::l11; + } + #[doc(hidden)] + pub mod s2 { + pub use super::l11; + } + #[doc(hidden)] + pub mod s3 { + pub use super::l11; + } + #[doc(hidden)] + pub mod s4 { + pub use super::l11; + } + #[doc(hidden)] + pub mod s5 { + pub use super::l11; + } + #[doc(hidden)] + pub mod s6 { + pub use super::l11; + } + #[doc(hidden)] + pub mod s7 { + pub use super::l11; + } + #[doc(hidden)] + pub mod l11 { + #[doc(hidden)] + pub mod s0 { + pub use super::leaf::S; + } + #[doc(hidden)] + pub mod s1 { + pub use super::leaf::S; + } + #[doc(hidden)] + pub mod s2 { + pub use super::leaf::S; + } + #[doc(hidden)] + pub mod s3 { + pub use super::leaf::S; + } + #[doc(hidden)] + pub mod s4 { + pub use super::leaf::S; + } + #[doc(hidden)] + pub mod s5 { + pub use super::leaf::S; + } + #[doc(hidden)] + pub mod s6 { + pub use super::leaf::S; + } + #[doc(hidden)] + pub mod s7 { + pub use super::leaf::S; + } + #[doc(hidden)] + pub mod leaf { + pub struct S; + } + } + } + } + } + } + } + } + } + } + } } + } } - diff --git a/tests/run-make/rustdoc/visible-parent-map-hang/main.rs b/tests/run-make/rustdoc/visible-parent-map-hang/main.rs index c4f4eee856bc4..a7b3f2c2324be 100644 --- a/tests/run-make/rustdoc/visible-parent-map-hang/main.rs +++ b/tests/run-make/rustdoc/visible-parent-map-hang/main.rs @@ -4,10 +4,19 @@ pub use dep::Tr; use std::fmt; pub struct Local; -impl dep::Tr for Local { fn x() {} } -impl dep::Tr2 for Local { fn x() {} } +impl dep::Tr for Local { + fn x() {} +} +impl dep::Tr2 for Local { + fn x() {} +} impl fmt::Display for Local { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "x") } + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "x") + } +} +impl Default for Local { + fn default() -> Self { + Local + } } -impl Default for Local { fn default() -> Self { Local } } - From 6de2b1bf371ec23349f04a2169d335f33915dea2 Mon Sep 17 00:00:00 2001 From: LusterSourav <282348889+LusterSourav@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:29:00 +0530 Subject: [PATCH 5/5] Format visible_parent_map hang test with the repo's rustfmt --- tests/run-make/rustdoc/visible-parent-map-hang/main.rs | 6 ++++-- tests/run-make/rustdoc/visible-parent-map-hang/rmake.rs | 9 +++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/run-make/rustdoc/visible-parent-map-hang/main.rs b/tests/run-make/rustdoc/visible-parent-map-hang/main.rs index a7b3f2c2324be..b866432f611e3 100644 --- a/tests/run-make/rustdoc/visible-parent-map-hang/main.rs +++ b/tests/run-make/rustdoc/visible-parent-map-hang/main.rs @@ -1,8 +1,10 @@ +// #160439: nested #[doc(hidden)] modules made rustdoc hang here. #![crate_type = "lib"] -extern crate dep; -pub use dep::Tr; + use std::fmt; +pub use dep::Tr; + pub struct Local; impl dep::Tr for Local { fn x() {} diff --git a/tests/run-make/rustdoc/visible-parent-map-hang/rmake.rs b/tests/run-make/rustdoc/visible-parent-map-hang/rmake.rs index 2d5eff700f3f1..944da900dbf0d 100644 --- a/tests/run-make/rustdoc/visible-parent-map-hang/rmake.rs +++ b/tests/run-make/rustdoc/visible-parent-map-hang/rmake.rs @@ -1,7 +1,5 @@ -// Regression test for https://github.com/rust-lang/rust/issues/160439. -// Nested `#[doc(hidden)]` modules used to make the visible_parent_map BFS -// re-enqueue the same subtree for every parent path, which is exponential. - +// #160439: nested #[doc(hidden)] modules made the visible_parent_map BFS +// exponential. compiletest has no per-test timeout, so time it here. use std::process::{Command, Stdio}; use std::time::{Duration, Instant}; @@ -10,8 +8,7 @@ use run_make_support::{env_var, rust_lib_name, rustc}; fn main() { rustc().input("dep.rs").edition("2021").crate_type("lib").run(); - // The bug made rustdoc hang here, so kill it if it takes too long. - // compiletest has no per-test timeout, hence the manual watchdog. + // the bug made rustdoc hang; kill it if it takes too long let mut child = Command::new(env_var("RUSTDOC")) .args(["--edition", "2021", "--crate-name", "main", "-o", "target"]) .arg(format!("--extern=dep={}", rust_lib_name("dep")))