From d17a378b16b852e3c4d72eebad85c702fe5b6d58 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Mon, 9 Jul 2018 10:32:49 -0500 Subject: [PATCH 1/8] rustdoc: set panic output before starting compiler thread pool --- src/librustdoc/test.rs | 52 ++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index b7040ed37d732..c1beb453acce5 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -232,31 +232,35 @@ fn run_test(test: &str, cratename: &str, filename: &FileName, line: usize, ..config::basic_options().clone() }; - let (libdir, outdir) = driver::spawn_thread_pool(sessopts, |sessopts| { - // Shuffle around a few input and output handles here. We're going to pass - // an explicit handle into rustc to collect output messages, but we also - // want to catch the error message that rustc prints when it fails. - // - // We take our thread-local stderr (likely set by the test runner) and replace - // it with a sink that is also passed to rustc itself. When this function - // returns the output of the sink is copied onto the output of our own thread. - // - // The basic idea is to not use a default Handler for rustc, and then also - // not print things by default to the actual stderr. - struct Sink(Arc>>); - impl Write for Sink { - fn write(&mut self, data: &[u8]) -> io::Result { - Write::write(&mut *self.0.lock().unwrap(), data) - } - fn flush(&mut self) -> io::Result<()> { Ok(()) } + // Shuffle around a few input and output handles here. We're going to pass + // an explicit handle into rustc to collect output messages, but we also + // want to catch the error message that rustc prints when it fails. + // + // We take our thread-local stderr (likely set by the test runner) and replace + // it with a sink that is also passed to rustc itself. When this function + // returns the output of the sink is copied onto the output of our own thread. + // + // The basic idea is to not use a default Handler for rustc, and then also + // not print things by default to the actual stderr. + struct Sink(Arc>>); + impl Write for Sink { + fn write(&mut self, data: &[u8]) -> io::Result { + Write::write(&mut *self.0.lock().unwrap(), data) } - struct Bomb(Arc>>, Box); - impl Drop for Bomb { - fn drop(&mut self) { - let _ = self.1.write_all(&self.0.lock().unwrap()); - } + fn flush(&mut self) -> io::Result<()> { Ok(()) } + } + struct Bomb(Arc>>, Box); + impl Drop for Bomb { + fn drop(&mut self) { + let _ = self.1.write_all(&self.0.lock().unwrap()); } - let data = Arc::new(Mutex::new(Vec::new())); + } + let data = Arc::new(Mutex::new(Vec::new())); + + let old = io::set_panic(Some(box Sink(data.clone()))); + let _bomb = Bomb(data.clone(), old.unwrap_or(box io::stdout())); + + let (libdir, outdir) = driver::spawn_thread_pool(sessopts, |sessopts| { let codemap = Lrc::new(CodeMap::new_doctest( sessopts.file_path_mapping(), filename.clone(), line as isize - line_offset as isize )); @@ -264,8 +268,6 @@ fn run_test(test: &str, cratename: &str, filename: &FileName, line: usize, Some(codemap.clone()), false, false); - let old = io::set_panic(Some(box Sink(data.clone()))); - let _bomb = Bomb(data.clone(), old.unwrap_or(box io::stdout())); // Compile the code let diagnostic_handler = errors::Handler::with_emitter(true, false, box emitter); From 33654195a101ae78c9601355bc310e45a87f5e03 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Mon, 9 Jul 2018 14:26:22 -0500 Subject: [PATCH 2/8] add ui test for failing doctest --- src/test/rustdoc-ui/failed-doctest-output.rs | 19 +++++++++++++++++ .../rustdoc-ui/failed-doctest-output.stdout | 21 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/test/rustdoc-ui/failed-doctest-output.rs create mode 100644 src/test/rustdoc-ui/failed-doctest-output.stdout diff --git a/src/test/rustdoc-ui/failed-doctest-output.rs b/src/test/rustdoc-ui/failed-doctest-output.rs new file mode 100644 index 0000000000000..587a5def2ddb9 --- /dev/null +++ b/src/test/rustdoc-ui/failed-doctest-output.rs @@ -0,0 +1,19 @@ +// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Issue #51162: A failed doctest was not printing its stdout/stderr + +// compile-flags:--test +// disable-ui-testing-normalization + +/// ``` +/// panic!("oh no"); +/// ``` +pub struct SomeStruct; diff --git a/src/test/rustdoc-ui/failed-doctest-output.stdout b/src/test/rustdoc-ui/failed-doctest-output.stdout new file mode 100644 index 0000000000000..78cc0370d3141 --- /dev/null +++ b/src/test/rustdoc-ui/failed-doctest-output.stdout @@ -0,0 +1,21 @@ + +running 1 test +test src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16) ... FAILED + +failures: + +---- src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16) stdout ---- +thread 'src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16)' panicked at 'test executable failed: + +thread 'main' panicked at 'oh no', src/test/rustdoc-ui/failed-doctest-output.rs:3:1 +note: Run with `RUST_BACKTRACE=1` for a backtrace. + +', librustdoc/test.rs:367:17 +note: Run with `RUST_BACKTRACE=1` for a backtrace. + + +failures: + src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16) + +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out + From 41e7ac16c48381321ab7af2a7a89ef0914c98470 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Mon, 9 Jul 2018 19:11:06 -0500 Subject: [PATCH 3/8] report doctest compile failures correctly --- src/librustdoc/test.rs | 38 +++++++++---------- src/test/rustdoc-ui/failed-doctest-output.rs | 5 +++ .../rustdoc-ui/failed-doctest-output.stdout | 17 +++++++-- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index c1beb453acce5..c7d2e52e620d7 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -260,7 +260,7 @@ fn run_test(test: &str, cratename: &str, filename: &FileName, line: usize, let old = io::set_panic(Some(box Sink(data.clone()))); let _bomb = Bomb(data.clone(), old.unwrap_or(box io::stdout())); - let (libdir, outdir) = driver::spawn_thread_pool(sessopts, |sessopts| { + let (libdir, outdir, compile_result) = driver::spawn_thread_pool(sessopts, |sessopts| { let codemap = Lrc::new(CodeMap::new_doctest( sessopts.file_path_mapping(), filename.clone(), line as isize - line_offset as isize )); @@ -314,28 +314,28 @@ fn run_test(test: &str, cratename: &str, filename: &FileName, line: usize, Err(_) | Ok(Err(CompileIncomplete::Errored(_))) => Err(()) }; - match (compile_result, compile_fail) { - (Ok(()), true) => { - panic!("test compiled while it wasn't supposed to") - } - (Ok(()), false) => {} - (Err(()), true) => { - if error_codes.len() > 0 { - let out = String::from_utf8(data.lock().unwrap().to_vec()).unwrap(); - error_codes.retain(|err| !out.contains(err)); - } - } - (Err(()), false) => { - panic!("couldn't compile the test") + (libdir, outdir, compile_result) + }); + + match (compile_result, compile_fail) { + (Ok(()), true) => { + panic!("test compiled while it wasn't supposed to") + } + (Ok(()), false) => {} + (Err(()), true) => { + if error_codes.len() > 0 { + let out = String::from_utf8(data.lock().unwrap().to_vec()).unwrap(); + error_codes.retain(|err| !out.contains(err)); } } - - if error_codes.len() > 0 { - panic!("Some expected error codes were not found: {:?}", error_codes); + (Err(()), false) => { + panic!("couldn't compile the test") } + } - (libdir, outdir) - }); + if error_codes.len() > 0 { + panic!("Some expected error codes were not found: {:?}", error_codes); + } if no_run { return } diff --git a/src/test/rustdoc-ui/failed-doctest-output.rs b/src/test/rustdoc-ui/failed-doctest-output.rs index 587a5def2ddb9..21d3d94714abb 100644 --- a/src/test/rustdoc-ui/failed-doctest-output.rs +++ b/src/test/rustdoc-ui/failed-doctest-output.rs @@ -17,3 +17,8 @@ /// panic!("oh no"); /// ``` pub struct SomeStruct; + +/// ``` +/// no +/// ``` +pub struct OtherStruct; diff --git a/src/test/rustdoc-ui/failed-doctest-output.stdout b/src/test/rustdoc-ui/failed-doctest-output.stdout index 78cc0370d3141..08522d80225d1 100644 --- a/src/test/rustdoc-ui/failed-doctest-output.stdout +++ b/src/test/rustdoc-ui/failed-doctest-output.stdout @@ -1,9 +1,20 @@ -running 1 test +running 2 tests +test src/test/rustdoc-ui/failed-doctest-output.rs - OtherStruct (line 21) ... FAILED test src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16) ... FAILED failures: +---- src/test/rustdoc-ui/failed-doctest-output.rs - OtherStruct (line 21) stdout ---- +error[E0425]: cannot find value `no` in this scope + --> src/test/rustdoc-ui/failed-doctest-output.rs:22:1 + | +3 | no + | ^^ not found in this scope + +thread 'src/test/rustdoc-ui/failed-doctest-output.rs - OtherStruct (line 21)' panicked at 'couldn't compile the test', librustdoc/test.rs:332:13 +note: Run with `RUST_BACKTRACE=1` for a backtrace. + ---- src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16) stdout ---- thread 'src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16)' panicked at 'test executable failed: @@ -11,11 +22,11 @@ thread 'main' panicked at 'oh no', src/test/rustdoc-ui/failed-doctest-output.rs: note: Run with `RUST_BACKTRACE=1` for a backtrace. ', librustdoc/test.rs:367:17 -note: Run with `RUST_BACKTRACE=1` for a backtrace. failures: + src/test/rustdoc-ui/failed-doctest-output.rs - OtherStruct (line 21) src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16) -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out From ffbd2b931e97e3831ea5089a3309829639a5d45b Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Mon, 9 Jul 2018 19:14:31 -0500 Subject: [PATCH 4/8] update stdout file with test path normalization --- .../rustdoc-ui/failed-doctest-output.stdout | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/rustdoc-ui/failed-doctest-output.stdout b/src/test/rustdoc-ui/failed-doctest-output.stdout index 08522d80225d1..e860079eb8162 100644 --- a/src/test/rustdoc-ui/failed-doctest-output.stdout +++ b/src/test/rustdoc-ui/failed-doctest-output.stdout @@ -1,32 +1,32 @@ running 2 tests -test src/test/rustdoc-ui/failed-doctest-output.rs - OtherStruct (line 21) ... FAILED -test src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16) ... FAILED +test $DIR/failed-doctest-output.rs - OtherStruct (line 21) ... FAILED +test $DIR/failed-doctest-output.rs - SomeStruct (line 16) ... FAILED failures: ----- src/test/rustdoc-ui/failed-doctest-output.rs - OtherStruct (line 21) stdout ---- +---- $DIR/failed-doctest-output.rs - OtherStruct (line 21) stdout ---- error[E0425]: cannot find value `no` in this scope - --> src/test/rustdoc-ui/failed-doctest-output.rs:22:1 + --> $DIR/failed-doctest-output.rs:22:1 | 3 | no | ^^ not found in this scope -thread 'src/test/rustdoc-ui/failed-doctest-output.rs - OtherStruct (line 21)' panicked at 'couldn't compile the test', librustdoc/test.rs:332:13 +thread '$DIR/failed-doctest-output.rs - OtherStruct (line 21)' panicked at 'couldn't compile the test', librustdoc/test.rs:332:13 note: Run with `RUST_BACKTRACE=1` for a backtrace. ----- src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16) stdout ---- -thread 'src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16)' panicked at 'test executable failed: +---- $DIR/failed-doctest-output.rs - SomeStruct (line 16) stdout ---- +thread '$DIR/failed-doctest-output.rs - SomeStruct (line 16)' panicked at 'test executable failed: -thread 'main' panicked at 'oh no', src/test/rustdoc-ui/failed-doctest-output.rs:3:1 +thread 'main' panicked at 'oh no', $DIR/failed-doctest-output.rs:3:1 note: Run with `RUST_BACKTRACE=1` for a backtrace. ', librustdoc/test.rs:367:17 failures: - src/test/rustdoc-ui/failed-doctest-output.rs - OtherStruct (line 21) - src/test/rustdoc-ui/failed-doctest-output.rs - SomeStruct (line 16) + $DIR/failed-doctest-output.rs - OtherStruct (line 21) + $DIR/failed-doctest-output.rs - SomeStruct (line 16) test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out From d965371d8654836183fe323ca461b1100e970baf Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Mon, 16 Jul 2018 16:25:34 -0500 Subject: [PATCH 5/8] normalize test output so it can be run from repo root --- src/test/rustdoc-ui/failed-doctest-output.rs | 6 +++++- .../rustdoc-ui/failed-doctest-output.stdout | 18 +++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/test/rustdoc-ui/failed-doctest-output.rs b/src/test/rustdoc-ui/failed-doctest-output.rs index 21d3d94714abb..62cda9cb86bcb 100644 --- a/src/test/rustdoc-ui/failed-doctest-output.rs +++ b/src/test/rustdoc-ui/failed-doctest-output.rs @@ -9,15 +9,19 @@ // except according to those terms. // Issue #51162: A failed doctest was not printing its stdout/stderr +// FIXME: if/when the output of the test harness can be tested on its own, this test should be +// adapted to use that, and that normalize line can go away // compile-flags:--test -// disable-ui-testing-normalization +// normalize-stdout-test: "src/test/rustdoc-ui" -> "$$DIR" +// doctest fails at runtime /// ``` /// panic!("oh no"); /// ``` pub struct SomeStruct; +// doctest fails at compile time /// ``` /// no /// ``` diff --git a/src/test/rustdoc-ui/failed-doctest-output.stdout b/src/test/rustdoc-ui/failed-doctest-output.stdout index e860079eb8162..2ae633de12ebd 100644 --- a/src/test/rustdoc-ui/failed-doctest-output.stdout +++ b/src/test/rustdoc-ui/failed-doctest-output.stdout @@ -1,22 +1,22 @@ running 2 tests -test $DIR/failed-doctest-output.rs - OtherStruct (line 21) ... FAILED -test $DIR/failed-doctest-output.rs - SomeStruct (line 16) ... FAILED +test $DIR/failed-doctest-output.rs - OtherStruct (line 25) ... FAILED +test $DIR/failed-doctest-output.rs - SomeStruct (line 19) ... FAILED failures: ----- $DIR/failed-doctest-output.rs - OtherStruct (line 21) stdout ---- +---- $DIR/failed-doctest-output.rs - OtherStruct (line 25) stdout ---- error[E0425]: cannot find value `no` in this scope - --> $DIR/failed-doctest-output.rs:22:1 + --> $DIR/failed-doctest-output.rs:26:1 | 3 | no | ^^ not found in this scope -thread '$DIR/failed-doctest-output.rs - OtherStruct (line 21)' panicked at 'couldn't compile the test', librustdoc/test.rs:332:13 +thread '$DIR/failed-doctest-output.rs - OtherStruct (line 25)' panicked at 'couldn't compile the test', librustdoc/test.rs:332:13 note: Run with `RUST_BACKTRACE=1` for a backtrace. ----- $DIR/failed-doctest-output.rs - SomeStruct (line 16) stdout ---- -thread '$DIR/failed-doctest-output.rs - SomeStruct (line 16)' panicked at 'test executable failed: +---- $DIR/failed-doctest-output.rs - SomeStruct (line 19) stdout ---- +thread '$DIR/failed-doctest-output.rs - SomeStruct (line 19)' panicked at 'test executable failed: thread 'main' panicked at 'oh no', $DIR/failed-doctest-output.rs:3:1 note: Run with `RUST_BACKTRACE=1` for a backtrace. @@ -25,8 +25,8 @@ note: Run with `RUST_BACKTRACE=1` for a backtrace. failures: - $DIR/failed-doctest-output.rs - OtherStruct (line 21) - $DIR/failed-doctest-output.rs - SomeStruct (line 16) + $DIR/failed-doctest-output.rs - OtherStruct (line 25) + $DIR/failed-doctest-output.rs - SomeStruct (line 19) test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out From d3569d2da87f4079d93b6c797a22130973af7338 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Thu, 19 Jul 2018 20:57:15 -0500 Subject: [PATCH 6/8] add failure-status to rustdoc doctest ui test --- src/test/rustdoc-ui/failed-doctest-output.rs | 1 + .../rustdoc-ui/failed-doctest-output.stdout | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/test/rustdoc-ui/failed-doctest-output.rs b/src/test/rustdoc-ui/failed-doctest-output.rs index 62cda9cb86bcb..62e495288cb9b 100644 --- a/src/test/rustdoc-ui/failed-doctest-output.rs +++ b/src/test/rustdoc-ui/failed-doctest-output.rs @@ -14,6 +14,7 @@ // compile-flags:--test // normalize-stdout-test: "src/test/rustdoc-ui" -> "$$DIR" +// failure-status: 101 // doctest fails at runtime /// ``` diff --git a/src/test/rustdoc-ui/failed-doctest-output.stdout b/src/test/rustdoc-ui/failed-doctest-output.stdout index 2ae633de12ebd..cf417f8d412ee 100644 --- a/src/test/rustdoc-ui/failed-doctest-output.stdout +++ b/src/test/rustdoc-ui/failed-doctest-output.stdout @@ -1,22 +1,22 @@ running 2 tests -test $DIR/failed-doctest-output.rs - OtherStruct (line 25) ... FAILED -test $DIR/failed-doctest-output.rs - SomeStruct (line 19) ... FAILED +test $DIR/failed-doctest-output.rs - OtherStruct (line 26) ... FAILED +test $DIR/failed-doctest-output.rs - SomeStruct (line 20) ... FAILED failures: ----- $DIR/failed-doctest-output.rs - OtherStruct (line 25) stdout ---- +---- $DIR/failed-doctest-output.rs - OtherStruct (line 26) stdout ---- error[E0425]: cannot find value `no` in this scope - --> $DIR/failed-doctest-output.rs:26:1 + --> $DIR/failed-doctest-output.rs:27:1 | 3 | no | ^^ not found in this scope -thread '$DIR/failed-doctest-output.rs - OtherStruct (line 25)' panicked at 'couldn't compile the test', librustdoc/test.rs:332:13 +thread '$DIR/failed-doctest-output.rs - OtherStruct (line 26)' panicked at 'couldn't compile the test', librustdoc/test.rs:332:13 note: Run with `RUST_BACKTRACE=1` for a backtrace. ----- $DIR/failed-doctest-output.rs - SomeStruct (line 19) stdout ---- -thread '$DIR/failed-doctest-output.rs - SomeStruct (line 19)' panicked at 'test executable failed: +---- $DIR/failed-doctest-output.rs - SomeStruct (line 20) stdout ---- +thread '$DIR/failed-doctest-output.rs - SomeStruct (line 20)' panicked at 'test executable failed: thread 'main' panicked at 'oh no', $DIR/failed-doctest-output.rs:3:1 note: Run with `RUST_BACKTRACE=1` for a backtrace. @@ -25,8 +25,8 @@ note: Run with `RUST_BACKTRACE=1` for a backtrace. failures: - $DIR/failed-doctest-output.rs - OtherStruct (line 25) - $DIR/failed-doctest-output.rs - SomeStruct (line 19) + $DIR/failed-doctest-output.rs - OtherStruct (line 26) + $DIR/failed-doctest-output.rs - SomeStruct (line 20) test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out From e3bc713e2ef6eef80a0cfd778cbcf887eca8fdcb Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Fri, 20 Jul 2018 13:25:44 -0500 Subject: [PATCH 7/8] compiletest: don't overwrite failure-status if it was previously set --- src/tools/compiletest/src/header.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index edab2a5ec034c..eeb280e1de36c 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -392,11 +392,6 @@ impl TestProps { if let Some(code) = config.parse_failure_status(ln) { self.failure_status = code; - } else { - self.failure_status = match config.mode { - Mode::RunFail => 101, - _ => 1, - }; } if !self.run_rustfix { @@ -404,6 +399,13 @@ impl TestProps { } }); + if self.failure_status == -1 { + self.failure_status = match config.mode { + Mode::RunFail => 101, + _ => 1, + }; + } + for key in &["RUST_TEST_NOCAPTURE", "RUST_TEST_THREADS"] { if let Ok(val) = env::var(key) { if self.exec_env.iter().find(|&&(ref x, _)| x == key).is_none() { From 76e33b4eb4f116b02d3754efd67e4fba0c9b3f93 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Tue, 24 Jul 2018 10:35:55 -0500 Subject: [PATCH 8/8] force the doctest rustc thread to share the name of the test --- src/librustc_driver/lib.rs | 22 +++++++++++++++++----- src/librustdoc/test.rs | 4 ++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index f60954ea02166..2100ceea22849 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -1497,10 +1497,12 @@ fn parse_crate_attrs<'a>(sess: &'a Session, input: &Input) -> PResult<'a, Vec(f: F) -> Result> +/// Runs `f` in a suitable thread for running `rustc`; returns a `Result` with either the return +/// value of `f` or -- if a panic occurs -- the panic value. +/// +/// This version applies the given name to the thread. This is used by rustdoc to ensure consistent +/// doctest output across platforms and executions. +pub fn in_named_rustc_thread(name: String, f: F) -> Result> where F: FnOnce() -> R + Send + 'static, R: Send + 'static, { @@ -1564,7 +1566,7 @@ pub fn in_rustc_thread(f: F) -> Result> // The or condition is added from backward compatibility. if spawn_thread || env::var_os("RUST_MIN_STACK").is_some() { - let mut cfg = thread::Builder::new().name("rustc".to_string()); + let mut cfg = thread::Builder::new().name(name); // FIXME: Hacks on hacks. If the env is trying to override the stack size // then *don't* set it explicitly. @@ -1580,6 +1582,16 @@ pub fn in_rustc_thread(f: F) -> Result> } } +/// Runs `f` in a suitable thread for running `rustc`; returns a +/// `Result` with either the return value of `f` or -- if a panic +/// occurs -- the panic value. +pub fn in_rustc_thread(f: F) -> Result> + where F: FnOnce() -> R + Send + 'static, + R: Send + 'static, +{ + in_named_rustc_thread("rustc".to_string(), f) +} + /// Get a list of extra command-line flags provided by the user, as strings. /// /// This function is used during ICEs to show more information useful for diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index c7d2e52e620d7..eb980a7369bf2 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -550,7 +550,7 @@ impl Collector { debug!("Creating test {}: {}", name, test); self.tests.push(testing::TestDescAndFn { desc: testing::TestDesc { - name: testing::DynTestName(name), + name: testing::DynTestName(name.clone()), ignore: should_ignore, // compiler failures are test failures should_panic: testing::ShouldPanic::No, @@ -560,7 +560,7 @@ impl Collector { let panic = io::set_panic(None); let print = io::set_print(None); match { - rustc_driver::in_rustc_thread(move || with_globals(move || { + rustc_driver::in_named_rustc_thread(name, move || with_globals(move || { io::set_panic(panic); io::set_print(print); hygiene::set_default_edition(edition);