From b441b801fa72dac0886b98dc68b02993dc07649e Mon Sep 17 00:00:00 2001 From: Iris Shi <0.0@owo.li> Date: Sun, 21 Sep 2025 11:43:36 +0800 Subject: [PATCH 1/4] fix a crash in rustdoc merge finalize without input file --- src/librustdoc/lib.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 9871066b9eb51..904972f52d018 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -835,8 +835,10 @@ fn main_args(early_dcx: &mut EarlyDiagCtxt, at_args: &[String]) { config::InputMode::NoInputMergeFinalize => { return wrap_return( dcx, - run_merge_finalize(render_options) - .map_err(|e| format!("could not write merged cross-crate info: {e}")), + rustc_span::create_session_globals_then(options.edition, &[], None, || { + run_merge_finalize(render_options) + .map_err(|e| format!("could not write merged cross-crate info: {e}")) + }), ); } }; From e37f0fed052701f38c9b61541f565b834106ad32 Mon Sep 17 00:00:00 2001 From: Iris Shi <0.0@owo.li> Date: Mon, 22 Sep 2025 17:32:50 +0800 Subject: [PATCH 2/4] Add regression test --- .../rustdoc-merge-no-input-finalize/rmake.rs | 22 +++++++++++++++++++ .../rustdoc-merge-no-input-finalize/sierra.rs | 1 + 2 files changed, 23 insertions(+) create mode 100644 tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs create mode 100644 tests/run-make/rustdoc-merge-no-input-finalize/sierra.rs diff --git a/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs b/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs new file mode 100644 index 0000000000000..6df9e95829d8d --- /dev/null +++ b/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs @@ -0,0 +1,22 @@ +// Running --merge=finalize without an input crate root should not trigger ICE. +// Issue: https://github.com/rust-lang/rust/issues/146646 + +//@ needs-target-std + +use run_make_support::rustdoc; + +fn main() { + rustdoc() + .input("sierra.rs") + .arg("-Zunstable-options") + .arg("--parts-out-dir=parts") + .arg("--merge=none") + .run(); + + rustdoc() + .arg("-Zunstable-options") + .arg("--include-parts-dir=parts") + .arg("--merge=finalize") + .out_dir("out") + .run(); +} diff --git a/tests/run-make/rustdoc-merge-no-input-finalize/sierra.rs b/tests/run-make/rustdoc-merge-no-input-finalize/sierra.rs new file mode 100644 index 0000000000000..f8fc48341ed6b --- /dev/null +++ b/tests/run-make/rustdoc-merge-no-input-finalize/sierra.rs @@ -0,0 +1 @@ +pub struct Sierra; From ba2537b6ffdbd9979874ca029e5bd86c6b925b37 Mon Sep 17 00:00:00 2001 From: Iris Shi <0.0@owo.li> Date: Mon, 22 Sep 2025 18:09:10 +0800 Subject: [PATCH 3/4] add exit code check --- .../rustdoc-merge-no-input-finalize/rmake.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs b/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs index 6df9e95829d8d..4ead8c2e56c56 100644 --- a/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs +++ b/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs @@ -3,20 +3,26 @@ //@ needs-target-std -use run_make_support::rustdoc; +use run_make_support::{path, rustdoc}; fn main() { + let out_dir = path("out"); + let merged_dir = path("merged"); + let parts_out_dir = path("parts"); rustdoc() .input("sierra.rs") + .out_dir(&out_dir) .arg("-Zunstable-options") - .arg("--parts-out-dir=parts") + .arg(format!("--parts-out-dir={}", parts_out_dir.display())) .arg("--merge=none") .run(); - rustdoc() + let output = rustdoc() .arg("-Zunstable-options") - .arg("--include-parts-dir=parts") + .out_dir(&out_dir) + .arg(format!("--include-parts-dir={}", parts_out_dir.display())) .arg("--merge=finalize") - .out_dir("out") .run(); + + output.assert_exit_code(0); } From 42ebba214b3c570761dc99f5fc1517ad092778ac Mon Sep 17 00:00:00 2001 From: Iris Shi <0.0@owo.li> Date: Mon, 22 Sep 2025 20:36:18 +0800 Subject: [PATCH 4/4] address review comments --- tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs b/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs index 4ead8c2e56c56..0b1e1948d5fcc 100644 --- a/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs +++ b/tests/run-make/rustdoc-merge-no-input-finalize/rmake.rs @@ -16,6 +16,7 @@ fn main() { .arg(format!("--parts-out-dir={}", parts_out_dir.display())) .arg("--merge=none") .run(); + assert!(parts_out_dir.join("crate-info").exists()); let output = rustdoc() .arg("-Zunstable-options") @@ -23,6 +24,5 @@ fn main() { .arg(format!("--include-parts-dir={}", parts_out_dir.display())) .arg("--merge=finalize") .run(); - - output.assert_exit_code(0); + output.assert_stderr_not_contains("error: the compiler unexpectedly panicked. this is a bug."); }