diff options
| author | kennytm <kennytm@gmail.com> | 2018-02-28 19:15:38 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-02-28 19:15:38 +0800 |
| commit | d3fee346a56dfad2ef6956d5679c883e9807cda5 (patch) | |
| tree | 45f09be834ca8b6ae00299cc6ea8816b6188c6c2 /src | |
| parent | a3fecfb8e95e6a822c94e55f8729edb040dd1467 (diff) | |
| parent | e20f7b2ea73fbe0077a565c692a3a6f2e20ff4e3 (diff) | |
| download | rust-d3fee346a56dfad2ef6956d5679c883e9807cda5.tar.gz rust-d3fee346a56dfad2ef6956d5679c883e9807cda5.zip | |
Rollup merge of #48497 - scottmcm:more-restricted-termination, r=nikomatsakis
Restrict the Termination impls to simplify stabilization Make a minimal commitment in preparation for stabilization. More impls, or broader ones, are likely in future, but are not necessary at this time and are more controversial. cc https://github.com/rust-lang/rust/issues/48453#issuecomment-368155082 r? @nikomatsakis
Diffstat (limited to 'src')
| -rw-r--r-- | src/libstd/process.rs | 24 | ||||
| -rw-r--r-- | src/test/run-pass/rfc-1937-termination-trait/termination-trait-for-exitcode.rs (renamed from src/test/run-pass/rfc-1937-termination-trait/termination-trait-for-i32.rs) | 7 |
2 files changed, 23 insertions, 8 deletions
diff --git a/src/libstd/process.rs b/src/libstd/process.rs index e25599b8bd8..e5fc33e241c 100644 --- a/src/libstd/process.rs +++ b/src/libstd/process.rs @@ -1080,6 +1080,15 @@ impl fmt::Display for ExitStatus { } } +/// This is ridiculously unstable, as it's a completely-punted-upon part +/// of the `?`-in-`main` RFC. It's here only to allow experimenting with +/// returning a code directly from main. It will definitely change +/// drastically before being stabilized, if it doesn't just get deleted. +#[doc(hidden)] +#[derive(Clone, Copy, Debug)] +#[unstable(feature = "process_exitcode_placeholder", issue = "43301")] +pub struct ExitCode(pub i32); + impl Child { /// Forces the child to exit. This is equivalent to sending a /// SIGKILL on unix platforms. @@ -1428,7 +1437,7 @@ impl Termination for () { } #[unstable(feature = "termination_trait_lib", issue = "43301")] -impl<T: Termination, E: fmt::Debug> Termination for Result<T, E> { +impl<E: fmt::Debug> Termination for Result<(), E> { fn report(self) -> i32 { match self { Ok(val) => val.report(), @@ -1442,20 +1451,23 @@ impl<T: Termination, E: fmt::Debug> Termination for Result<T, E> { #[unstable(feature = "termination_trait_lib", issue = "43301")] impl Termination for ! { - fn report(self) -> i32 { unreachable!(); } + fn report(self) -> i32 { self } } #[unstable(feature = "termination_trait_lib", issue = "43301")] -impl Termination for bool { +impl<E: fmt::Debug> Termination for Result<!, E> { fn report(self) -> i32 { - if self { exit::SUCCESS } else { exit::FAILURE } + let Err(err) = self; + eprintln!("Error: {:?}", err); + exit::FAILURE } } #[unstable(feature = "termination_trait_lib", issue = "43301")] -impl Termination for i32 { +impl Termination for ExitCode { fn report(self) -> i32 { - self + let ExitCode(code) = self; + code } } diff --git a/src/test/run-pass/rfc-1937-termination-trait/termination-trait-for-i32.rs b/src/test/run-pass/rfc-1937-termination-trait/termination-trait-for-exitcode.rs index fa7cb023b44..30ecc4e8937 100644 --- a/src/test/run-pass/rfc-1937-termination-trait/termination-trait-for-i32.rs +++ b/src/test/run-pass/rfc-1937-termination-trait/termination-trait-for-exitcode.rs @@ -9,7 +9,10 @@ // except according to those terms. #![feature(termination_trait)] +#![feature(process_exitcode_placeholder)] -fn main() -> i32 { - 0 +use std::process::ExitCode; + +fn main() -> ExitCode { + ExitCode(0) } |
