about summary refs log tree commit diff
path: root/tests/ui/async-await/send-bound-async-closure.rs
diff options
context:
space:
mode:
authorCamille GILLOT <gillot.camille@gmail.com>2023-01-26 03:51:26 +0000
committerCamille GILLOT <gillot.camille@gmail.com>2023-01-27 20:10:17 +0000
commit0e52a671d41a787fe236cfa158d004ee28836b11 (patch)
treef70cd2a6db757cd8459734b765b45977bfdd5b66 /tests/ui/async-await/send-bound-async-closure.rs
parent60e04d1e8c3afd392551db103651e0ac55b4bd7e (diff)
downloadrust-0e52a671d41a787fe236cfa158d004ee28836b11.tar.gz
rust-0e52a671d41a787fe236cfa158d004ee28836b11.zip
Bless tests.
Diffstat (limited to 'tests/ui/async-await/send-bound-async-closure.rs')
-rw-r--r--tests/ui/async-await/send-bound-async-closure.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/ui/async-await/send-bound-async-closure.rs b/tests/ui/async-await/send-bound-async-closure.rs
new file mode 100644
index 00000000000..4e9e7309be0
--- /dev/null
+++ b/tests/ui/async-await/send-bound-async-closure.rs
@@ -0,0 +1,37 @@
+// edition: 2021
+// check-pass
+
+// This test verifies that we do not create a query cycle when typechecking has several inference
+// variables that point to the same generator interior type.
+
+use std::future::Future;
+use std::pin::Pin;
+use std::task::{Context, Poll};
+
+type ChannelTask = Pin<Box<dyn Future<Output = ()> + Send>>;
+
+pub fn register_message_type() -> ChannelTask {
+    Box::pin(async move {
+        let f = |__cx: &mut Context<'_>| Poll::<()>::Pending;
+        PollFn { f }.await
+    })
+}
+
+struct PollFn<F> {
+    f: F,
+}
+
+impl<F> Unpin for PollFn<F> {}
+
+impl<T, F> Future for PollFn<F>
+where
+    F: FnMut(&mut Context<'_>) -> Poll<T>,
+{
+    type Output = T;
+
+    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<T> {
+        (&mut self.f)(cx)
+    }
+}
+
+fn main() {}