Rollup merge of #69959 - alexcrichton:fix-panic-in-print, r=Mark-Simulacrum

std: Don't abort process when printing panics in tests

This commit fixes an issue when using `set_print` and friends, notably
used by libtest, to avoid aborting the process if printing panics. This
previously panicked due to borrowing a mutable `RefCell` twice, and this
is worked around by borrowing these cells for less time, instead
taking out and removing contents temporarily.

Closes #69558
This commit is contained in:
Mazdak Farrokhzad 2020-03-19 06:57:36 +01:00 committed by GitHub
commit 73c3a496cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 4 deletions

View file

@ -0,0 +1,24 @@
// run-pass
// ignore-emscripten no subprocess support
#![feature(set_stdio)]
use std::fmt;
use std::fmt::{Display, Formatter};
use std::io::set_panic;
pub struct A;
impl Display for A {
fn fmt(&self, _f: &mut Formatter<'_>) -> fmt::Result {
panic!();
}
}
fn main() {
set_panic(Some(Box::new(Vec::new())));
assert!(std::panic::catch_unwind(|| {
eprintln!("{}", A);
})
.is_err());
}

View file

@ -0,0 +1,24 @@
// compile-flags:--test
// run-pass
// ignore-emscripten no subprocess support
use std::fmt;
use std::fmt::{Display, Formatter};
pub struct A(Vec<u32>);
impl Display for A {
fn fmt(&self, _f: &mut Formatter<'_>) -> fmt::Result {
self.0[0];
Ok(())
}
}
#[test]
fn main() {
let result = std::panic::catch_unwind(|| {
let a = A(vec![]);
eprintln!("{}", a);
});
assert!(result.is_err());
}