2023-03-10 05:50:02 -06:00
|
|
|
//@ run-pass
|
|
|
|
//@ check-run-results
|
|
|
|
//@ ignore-windows
|
2024-03-06 14:44:54 -06:00
|
|
|
//@ ignore-wasm32
|
2023-03-10 05:50:02 -06:00
|
|
|
//@ ignore-fuchsia
|
|
|
|
//@ ignore-horizon
|
|
|
|
//@ ignore-android
|
2024-06-21 00:15:36 -05:00
|
|
|
//@ normalize-stderr-test: ".rs:\d+:\d+" -> ".rs:LL:CC"
|
2024-04-28 11:02:21 -05:00
|
|
|
//@ compile-flags: -Zon-broken-pipe=error
|
2023-03-10 05:50:02 -06:00
|
|
|
|
|
|
|
// Test what the error message looks like when `println!()` panics because of
|
|
|
|
// `std::io::ErrorKind::BrokenPipe`
|
|
|
|
|
|
|
|
use std::env;
|
|
|
|
use std::process::{Command, Stdio};
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let mut args = env::args();
|
|
|
|
let me = args.next().unwrap();
|
|
|
|
|
|
|
|
if let Some(arg) = args.next() {
|
|
|
|
// More than enough iterations to fill any pipe buffer. Normally this
|
|
|
|
// loop will end with a panic more or less immediately.
|
|
|
|
for _ in 0..65536 * 64 {
|
|
|
|
println!("{arg}");
|
|
|
|
}
|
|
|
|
unreachable!("should have panicked because of BrokenPipe");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set up a pipeline with a short-lived consumer and wait for it to finish.
|
|
|
|
// This will produce the `println!()` panic message on stderr.
|
|
|
|
let mut producer = Command::new(&me)
|
|
|
|
.arg("this line shall appear exactly once on stdout")
|
|
|
|
.env("RUST_BACKTRACE", "0")
|
|
|
|
.stdout(Stdio::piped())
|
|
|
|
.spawn()
|
|
|
|
.unwrap();
|
|
|
|
let mut consumer =
|
|
|
|
Command::new("head").arg("-n1").stdin(producer.stdout.take().unwrap()).spawn().unwrap();
|
|
|
|
consumer.wait().unwrap();
|
|
|
|
producer.wait().unwrap();
|
|
|
|
}
|