diff options
| author | David Tolnay <dtolnay@gmail.com> | 2022-10-07 13:45:41 -0700 |
|---|---|---|
| committer | David Tolnay <dtolnay@gmail.com> | 2022-10-07 18:25:32 -0700 |
| commit | 293f662ca94d6f1eac749da55f5ff924c87fd1d5 (patch) | |
| tree | 54c2b56d9288e3fced51c443fa1d871de6d7dd1a /library/std/src/io/stdio.rs | |
| parent | 43c22af267fd9337bc05382b2771dde49d2e9f26 (diff) | |
| download | rust-293f662ca94d6f1eac749da55f5ff924c87fd1d5.tar.gz rust-293f662ca94d6f1eac749da55f5ff924c87fd1d5.zip | |
Make tests capture the error printed by a Result return
Diffstat (limited to 'library/std/src/io/stdio.rs')
| -rw-r--r-- | library/std/src/io/stdio.rs | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/library/std/src/io/stdio.rs b/library/std/src/io/stdio.rs index 2dc12a18a8a..4ccb2bf3231 100644 --- a/library/std/src/io/stdio.rs +++ b/library/std/src/io/stdio.rs @@ -999,7 +999,18 @@ fn print_to<T>(args: fmt::Arguments<'_>, global_s: fn() -> T, label: &str) where T: Write, { - if OUTPUT_CAPTURE_USED.load(Ordering::Relaxed) + if print_to_buffer_if_capture_used(args) { + // Successfully wrote to capture buffer. + return; + } + + if let Err(e) = global_s().write_fmt(args) { + panic!("failed printing to {label}: {e}"); + } +} + +fn print_to_buffer_if_capture_used(args: fmt::Arguments<'_>) -> bool { + OUTPUT_CAPTURE_USED.load(Ordering::Relaxed) && OUTPUT_CAPTURE.try_with(|s| { // Note that we completely remove a local sink to write to in case // our printing recursively panics/prints, so the recursive @@ -1009,14 +1020,19 @@ where s.set(Some(w)); }) }) == Ok(Some(())) - { - // Successfully wrote to capture buffer. +} + +/// Used by impl Termination for Result to print error after `main` or a test +/// has returned. Should avoid panicking, although we can't help it if one of +/// the Display impls inside args decides to. +pub(crate) fn attempt_print_to_stderr(args: fmt::Arguments<'_>) { + if print_to_buffer_if_capture_used(args) { return; } - if let Err(e) = global_s().write_fmt(args) { - panic!("failed printing to {label}: {e}"); - } + // Ignore error if the write fails, for example because stderr is already + // closed. There is not much point panicking at this point. + let _ = stderr().write_fmt(args); } #[unstable( |
