43 lines
1.0 KiB
Rust
43 lines
1.0 KiB
Rust
|
//! This test checks that we can resolve the `boxed` method call to `FutureExt`,
|
||
|
//! because we know that the anonymous future does not implement `StreamExt`.
|
||
|
|
||
|
//@ edition: 2021
|
||
|
//@ check-pass
|
||
|
|
||
|
use std::future::Future;
|
||
|
use std::pin::Pin;
|
||
|
|
||
|
trait FutureExt: Future + Sized + Send + 'static {
|
||
|
fn boxed(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'static>> {
|
||
|
Box::pin(self)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
trait StreamExt: Future + Sized + Send + 'static {
|
||
|
fn boxed(self) -> Pin<Box<dyn Future<Output = Self::Output> + Send + 'static>> {
|
||
|
Box::pin(self)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl<T: Future + Sized + Send + 'static> FutureExt for T {}
|
||
|
|
||
|
fn go(i: usize) -> impl Future<Output = ()> + Send + 'static {
|
||
|
async move {
|
||
|
if i != 0 {
|
||
|
spawn(async move {
|
||
|
let fut = go(i - 1).boxed();
|
||
|
fut.await;
|
||
|
})
|
||
|
.await;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub fn spawn<T: Send>(
|
||
|
_: impl Future<Output = T> + Send + 'static,
|
||
|
) -> impl Future<Output = ()> + Send + 'static {
|
||
|
async move { todo!() }
|
||
|
}
|
||
|
|
||
|
fn main() {}
|