| //@ run-pass |
| //@ needs-unwind |
| //@ ignore-emscripten no processes |
| //@ ignore-sgx no processes |
| |
| 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::<Vec<_>>(); |
| 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\n") }) |
| .unwrap_or(false)); |
| } |