From 768f97748f81c4cb7f63cfb74c16cb2f80dc0ce4 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 6 Aug 2025 17:08:43 +0200 Subject: [PATCH 1/2] Fix rustdoc scrape-examples feature crash --- src/librustdoc/config.rs | 3 +-- src/librustdoc/scrape_examples.rs | 7 +++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs index fed4296fa2221..c52c7236883af 100644 --- a/src/librustdoc/config.rs +++ b/src/librustdoc/config.rs @@ -804,8 +804,7 @@ impl Options { let scrape_examples_options = ScrapeExamplesOptions::new(matches, dcx); let with_examples = matches.opt_strs("with-examples"); - let call_locations = - crate::scrape_examples::load_call_locations(with_examples, dcx, &mut loaded_paths); + let call_locations = crate::scrape_examples::load_call_locations(with_examples, dcx); let doctest_build_args = matches.opt_strs("doctest-build-arg"); let unstable_features = diff --git a/src/librustdoc/scrape_examples.rs b/src/librustdoc/scrape_examples.rs index 4d29c74e1eb53..9f71d6ae78992 100644 --- a/src/librustdoc/scrape_examples.rs +++ b/src/librustdoc/scrape_examples.rs @@ -333,11 +333,14 @@ pub(crate) fn run( pub(crate) fn load_call_locations( with_examples: Vec, dcx: DiagCtxtHandle<'_>, - loaded_paths: &mut Vec, ) -> AllCallLocations { let mut all_calls: AllCallLocations = FxIndexMap::default(); for path in with_examples { - loaded_paths.push(path.clone().into()); + // FIXME: Figure out why this line is causing this feature to crash in specific contexts. + // Full issue backlog is available here: . + // + // Can be checked with `tests/run-make/rustdoc-scrape-examples-paths`. + // loaded_paths.push(path.clone().into()); let bytes = match fs::read(&path) { Ok(bytes) => bytes, Err(e) => dcx.fatal(format!("failed to load examples: {e}")), From a2b1714fb2500afd59835a9f01c90e8463957418 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 6 Aug 2025 17:09:21 +0200 Subject: [PATCH 2/2] Add regression test for rustdoc scrape-examples feature crash (#144752) --- .../rustdoc-scrape-examples-paths/foo/Cargo.toml | 8 ++++++++ .../foo/examples/complex.rs | 3 +++ .../foo/examples/tester.rs | 1 + .../rustdoc-scrape-examples-paths/foo/src/lib.rs | 7 +++++++ .../rustdoc-scrape-examples-paths/rmake.rs | 16 ++++++++++++++++ 5 files changed, 35 insertions(+) create mode 100644 tests/run-make/rustdoc-scrape-examples-paths/foo/Cargo.toml create mode 100644 tests/run-make/rustdoc-scrape-examples-paths/foo/examples/complex.rs create mode 100644 tests/run-make/rustdoc-scrape-examples-paths/foo/examples/tester.rs create mode 100644 tests/run-make/rustdoc-scrape-examples-paths/foo/src/lib.rs create mode 100644 tests/run-make/rustdoc-scrape-examples-paths/rmake.rs diff --git a/tests/run-make/rustdoc-scrape-examples-paths/foo/Cargo.toml b/tests/run-make/rustdoc-scrape-examples-paths/foo/Cargo.toml new file mode 100644 index 0000000000000..6962028375bb7 --- /dev/null +++ b/tests/run-make/rustdoc-scrape-examples-paths/foo/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "foo" +version = "0.0.1" +edition = "2024" + +[[example]] +name = "complex" +doc-scrape-examples = true diff --git a/tests/run-make/rustdoc-scrape-examples-paths/foo/examples/complex.rs b/tests/run-make/rustdoc-scrape-examples-paths/foo/examples/complex.rs new file mode 100644 index 0000000000000..1cda7e098f455 --- /dev/null +++ b/tests/run-make/rustdoc-scrape-examples-paths/foo/examples/complex.rs @@ -0,0 +1,3 @@ +fn main() { + let mut x = foo::X::new(); +} diff --git a/tests/run-make/rustdoc-scrape-examples-paths/foo/examples/tester.rs b/tests/run-make/rustdoc-scrape-examples-paths/foo/examples/tester.rs new file mode 100644 index 0000000000000..fbd1906ec0997 --- /dev/null +++ b/tests/run-make/rustdoc-scrape-examples-paths/foo/examples/tester.rs @@ -0,0 +1 @@ +// This file MUST exist to trigger the original bug. diff --git a/tests/run-make/rustdoc-scrape-examples-paths/foo/src/lib.rs b/tests/run-make/rustdoc-scrape-examples-paths/foo/src/lib.rs new file mode 100644 index 0000000000000..a9bb0272c7870 --- /dev/null +++ b/tests/run-make/rustdoc-scrape-examples-paths/foo/src/lib.rs @@ -0,0 +1,7 @@ +pub struct X; + +impl X { + pub fn new() -> Self { + X + } +} diff --git a/tests/run-make/rustdoc-scrape-examples-paths/rmake.rs b/tests/run-make/rustdoc-scrape-examples-paths/rmake.rs new file mode 100644 index 0000000000000..03888f69eab13 --- /dev/null +++ b/tests/run-make/rustdoc-scrape-examples-paths/rmake.rs @@ -0,0 +1,16 @@ +//! Test to ensure that the rustdoc `scrape-examples` feature is not panicking. +//! Regression test for . + +use run_make_support::{cargo, path, rfs}; + +fn main() { + // We copy the crate to be documented "outside" to prevent documenting + // the whole compiler. + let tmp = std::env::temp_dir(); + let test_crate = tmp.join("foo"); + rfs::copy_dir_all(path("foo"), &test_crate); + + // The `scrape-examples` feature is also implemented in `cargo` so instead of reproducing + // what `cargo` does, better to just let `cargo` do it. + cargo().current_dir(&test_crate).args(["doc", "-p", "foo", "-Zrustdoc-scrape-examples"]).run(); +}