Skip to content

Commit

Permalink
Rollup merge of #97803 - Gankra:term, r=dtolnay
Browse files Browse the repository at this point in the history
Impl Termination for Infallible and then make the Result impls of Termination more generic

This allows things like `Result<ExitCode, E>` to 'just work'
  • Loading branch information
JohnTitor authored Jun 18, 2022
2 parents c3b7d7b + 0894660 commit fc8027f
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 28 deletions.
37 changes: 15 additions & 22 deletions library/std/src/process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2140,16 +2140,6 @@ impl Termination for () {
}
}

#[stable(feature = "termination_trait_lib", since = "1.61.0")]
impl<E: fmt::Debug> Termination for Result<(), E> {
fn report(self) -> ExitCode {
match self {
Ok(()) => ().report(),
Err(err) => Err::<!, _>(err).report(),
}
}
}

#[stable(feature = "termination_trait_lib", since = "1.61.0")]
impl Termination for ! {
fn report(self) -> ExitCode {
Expand All @@ -2158,28 +2148,31 @@ impl Termination for ! {
}

#[stable(feature = "termination_trait_lib", since = "1.61.0")]
impl<E: fmt::Debug> Termination for Result<!, E> {
impl Termination for Infallible {
fn report(self) -> ExitCode {
let Err(err) = self;
// Ignore error if the write fails, for example because stderr is
// already closed. There is not much point panicking at this point.
let _ = writeln!(io::stderr(), "Error: {err:?}");
ExitCode::FAILURE
match self {}
}
}

#[stable(feature = "termination_trait_lib", since = "1.61.0")]
impl<E: fmt::Debug> Termination for Result<Infallible, E> {
impl Termination for ExitCode {
#[inline]
fn report(self) -> ExitCode {
let Err(err) = self;
Err::<!, _>(err).report()
self
}
}

#[stable(feature = "termination_trait_lib", since = "1.61.0")]
impl Termination for ExitCode {
#[inline]
impl<T: Termination, E: fmt::Debug> Termination for Result<T, E> {
fn report(self) -> ExitCode {
self
match self {
Ok(val) => val.report(),
Err(err) => {
// Ignore error if the write fails, for example because stderr is
// already closed. There is not much point panicking at this point.
let _ = writeln!(io::stderr(), "Error: {err:?}");
ExitCode::FAILURE
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error[E0277]: `main` has invalid return type `Result<f32, ParseFloatError>`
error[E0277]: `main` has invalid return type `f32`
--> $DIR/termination-trait-test-wrong-type.rs:6:1
|
LL | #[test]
Expand All @@ -8,11 +8,8 @@ LL | | "0".parse()
LL | | }
| |_^ `main` can only return types that implement `Termination`
|
= help: the trait `Termination` is not implemented for `Result<f32, ParseFloatError>`
= help: the following other types implement trait `Termination`:
Result<!, E>
Result<(), E>
Result<Infallible, E>
= help: the trait `Termination` is not implemented for `f32`
= note: required because of the requirements on the impl of `Termination` for `Result<f32, ParseFloatError>`
note: required by a bound in `assert_test_result`
--> $SRC_DIR/test/src/lib.rs:LL:COL
|
Expand Down

0 comments on commit fc8027f

Please sign in to comment.