diff options
| author | Mark Rousskov <mark.simulacrum@gmail.com> | 2018-07-26 09:18:40 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-26 09:18:40 -0600 |
| commit | 858adfe21dead8b0b2df16a5fc3ac4e8759a9c4e (patch) | |
| tree | 93aacde4d81dcd07f0c1644f1bfb435b03f740e6 /src/test/ui | |
| parent | 091a10e0eb5a86ace454b23c7ed2f1aaefb5b969 (diff) | |
| parent | bce8a91f34e63a4ed87a6d6351bf67a82306afbd (diff) | |
| download | rust-858adfe21dead8b0b2df16a5fc3ac4e8759a9c4e.tar.gz rust-858adfe21dead8b0b2df16a5fc3ac4e8759a9c4e.zip | |
Rollup merge of #52721 - cramertj:try-poll, r=aturon
std::ops::Try impl for std::task::Poll I originally left out the `Try` impl for `Poll` because I was curious if we needed it, and @MajorBreakfast and I had discussed the potential for it to introduce confusion about exactly what control-flow was happening at different points. However, after porting a pretty significant chunk of Fuchsia over to futures 0.3, I discovered that I was *constantly* having to do repetitive matching on `Poll<Result<...>>` or `Poll<Option<Result<...>>>` in order to propagate errors correctly. `try_poll` (propagate `Poll::Ready(Err(..))`s) helped in some places, but it was far more common to need some form of conversion between `Result`, `Poll<Result<...>>`, and `Poll<Option<Result<...>>>`. The `Try` trait conveniently provides all of these conversions in addition to a more concise syntax (`?`), so I'd like to experiment with using these instead. cc @seanmonstar r? @aturon Note: this change means that far more futures 0.1 code can work without significant changes since it papers over the fact that `Result` is no longer at the top-level when using `Stream` and `Future` (since it's now `Poll<Result<...>>` or `Poll<Option<Result<...>>>` instead of `Result<Poll<..>>` and `Result<Poll<Option<...>>>`).
Diffstat (limited to 'src/test/ui')
| -rw-r--r-- | src/test/ui/try-poll.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/test/ui/try-poll.rs b/src/test/ui/try-poll.rs new file mode 100644 index 00000000000..0cb058c2b0b --- /dev/null +++ b/src/test/ui/try-poll.rs @@ -0,0 +1,61 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-pass + +#![allow(dead_code, unused)] +#![feature(futures_api)] + +use std::task::Poll; + +struct K; +struct E; + +fn as_result() -> Result<(), E> { + // From Result + let K = Ok::<K, E>(K)?; + + // From Poll<Result> + let _: Poll<K> = Poll::Ready::<Result<K, E>>(Ok(K))?; + + // From Poll<Option<Result>> + let _: Poll<Option<K>> = Poll::Ready::<Option<Result<K, E>>>(None)?; + + Ok(()) +} + +fn as_poll_result() -> Poll<Result<(), E>> { + // From Result + let K = Ok::<K, E>(K)?; + + // From Poll<Result> + let _: Poll<K> = Poll::Ready::<Result<K, E>>(Ok(K))?; + + // From Poll<Option<Result>> + let _: Poll<Option<K>> = Poll::Ready::<Option<Result<K, E>>>(None)?; + + Poll::Ready(Ok(())) +} + +fn as_poll_option_result() -> Poll<Option<Result<(), E>>> { + // From Result + let K = Ok::<K, E>(K)?; + + // From Poll<Result> + let _: Poll<K> = Poll::Ready::<Result<K, E>>(Ok(K))?; + + // From Poll<Option<Result>> + let _: Poll<Option<K>> = Poll::Ready::<Option<Result<K, E>>>(None)?; + + Poll::Ready(Some(Ok(()))) +} + +fn main() { +} |
