summary refs log tree commit diff
path: root/src/test/ui
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2018-07-26 09:18:40 -0600
committerGitHub <noreply@github.com>2018-07-26 09:18:40 -0600
commit858adfe21dead8b0b2df16a5fc3ac4e8759a9c4e (patch)
tree93aacde4d81dcd07f0c1644f1bfb435b03f740e6 /src/test/ui
parent091a10e0eb5a86ace454b23c7ed2f1aaefb5b969 (diff)
parentbce8a91f34e63a4ed87a6d6351bf67a82306afbd (diff)
downloadrust-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.rs61
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() {
+}