//@ run-pass //@ needs-unwind //@ needs-subprocess //@ ignore-backends: gcc use std::env; use std::process::Command; struct Bomb; impl Drop for Bomb { fn drop(&mut self) { std::panic::panic_any(Bomb); } } fn main() { let args = env::args().collect::>(); let output = match &args[..] { [me] => Command::new(&me).arg("plant the").output(), [..] => std::panic::panic_any(Bomb), }.expect("running the command should have succeeded"); println!("{:#?}", output); let stderr = std::str::from_utf8(&output.stderr); assert!(stderr .map(|v| { // When running inside QEMU user-mode emulation, there will be an extra message printed // by QEMU in the stderr whenever a core dump happens. Remove it before the check. v.strip_suffix("qemu: uncaught target signal 6 (Aborted) - core dumped\n").unwrap_or(v) }) .map(|v| v.ends_with("fatal runtime error: drop of the panic payload panicked, aborting\n")) .unwrap_or(false)); }