rust/tests/ui/process/println-with-broken-pipe.rs
Martin Nordholts cde0cde151 Change SIGPIPE ui from #[unix_sigpipe = "..."] to -Zon-broken-pipe=...
In the stabilization attempt of `#[unix_sigpipe = "sig_dfl"]`, a concern
was raised related to using a language attribute for the feature: Long
term, we want `fn lang_start()` to be definable by any crate, not just
libstd. Having a special language attribute in that case becomes
awkward.

So as a first step towards towards the next stabilization attempt, this
PR changes the `#[unix_sigpipe = "..."]` attribute to a compiler flag
`-Zon-broken-pipe=...` to remove that concern, since now the language
is not "contaminated" by this feature.

Another point was also raised, namely that the ui should not leak
**how** it does things, but rather what the **end effect** is. The new
flag uses the proposed naming. This is of course something that can be
iterated on further before stabilization.
2024-05-02 19:48:29 +02:00

43 lines
1.3 KiB
Rust

//@ run-pass
//@ check-run-results
//@ ignore-windows
//@ ignore-wasm32
//@ ignore-fuchsia
//@ ignore-horizon
//@ ignore-android
//@ normalize-stderr-test ".rs:\d+:\d+" -> ".rs:LL:CC"
//@ compile-flags: -Zon-broken-pipe=error
// 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();
}