1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
//@ check-pass
//@ edition:2018
// This is a regression test for https://github.com/rust-lang/rust/issues/105501.
// It was minified from the published `msf-ice:0.2.1` crate which failed in a crater run.
// A faulty compiler was triggering a `higher-ranked lifetime error`:
//
// > could not prove `[async block@...]: Send`
use mini_futures::Stream;
fn is_send(_: impl Send) {}
pub fn main() {
let fut = async {
let mut stream = mini_futures::iter([()])
.then(|_| async {})
.map(|_| async { None })
.buffered()
.filter_map(std::future::ready);
stream.next().await
};
is_send(async move {
let _: Option<()> = fut.await;
});
}
// this is a simplified subset of `futures::StreamExt` and related types
mod mini_futures {
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
pub fn iter<I>(_: I) -> Iter<I::IntoIter>
where
I: IntoIterator,
{
todo!()
}
pub trait Stream {
type Item;
fn then<Fut, F>(self, _: F) -> Then<Self, Fut, F>
where
F: FnMut(Self::Item) -> Fut,
Fut: Future,
Self: Sized,
{
todo!()
}
fn map<T, F>(self, _: F) -> Map<Self, F>
where
F: FnMut(Self::Item) -> T,
Self: Sized,
{
todo!()
}
fn buffered(self) -> Buffered<Self>
where
Self::Item: Future,
Self: Sized,
{
todo!()
}
fn filter_map<Fut, T, F>(self, _: F) -> FilterMap<Self, Fut, F>
where
F: FnMut(Self::Item) -> Fut,
Fut: Future<Output = Option<T>>,
Self: Sized,
{
todo!()
}
fn next(&mut self) -> Next<'_, Self> {
todo!()
}
}
pub struct Iter<I> {
__: I,
}
impl<I> Stream for Iter<I>
where
I: Iterator,
{
type Item = I::Item;
}
pub struct Then<St, Fut, F> {
__: (St, Fut, F),
}
impl<St, Fut, F> Stream for Then<St, Fut, F>
where
St: Stream,
F: FnMut(St::Item) -> Fut,
Fut: Future,
{
type Item = Fut::Output;
}
pub struct Map<St, F> {
__: (St, F),
}
impl<St, F> Stream for Map<St, F>
where
St: Stream,
F: FnMut1<St::Item>,
{
type Item = F::Output;
}
pub trait FnMut1<A> {
type Output;
}
impl<T, A, R> FnMut1<A> for T
where
T: FnMut(A) -> R,
{
type Output = R;
}
pub struct Buffered<St>
where
St: Stream,
St::Item: Future,
{
__: (St, St::Item),
}
impl<St> Stream for Buffered<St>
where
St: Stream,
St::Item: Future,
{
type Item = <St::Item as Future>::Output;
}
pub struct FilterMap<St, Fut, F> {
__: (St, Fut, F),
}
impl<St, Fut, F, T> Stream for FilterMap<St, Fut, F>
where
St: Stream,
F: FnMut1<St::Item, Output = Fut>,
Fut: Future<Output = Option<T>>,
{
type Item = T;
}
pub struct Next<'a, St: ?Sized> {
__: &'a mut St,
}
impl<St: ?Sized + Stream> Future for Next<'_, St> {
type Output = Option<St::Item>;
fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> {
todo!()
}
}
}
|