Closed
Description
Really not sure where the error here is coming from, as far as I can tell there should only be a single relevant lifetime, 'a
. The same function written as a free function generic over a Write
returning impl Future<...> + 'a
works fine (included in the playground). I'll try and come up with a reduced example in the next couple of days (playground)
error: non-defining existential type use in defining scope
--> src/lib.rs:19:5
|
19 | / {
20 | | poll_fn(move |cx| self.reborrow().poll_close(cx))
21 | | }
| |_____^ lifetime `` is part of concrete type but not used in parameter list of existential type
#![feature(arbitrary_self_types, existential_type, pin, futures_api)]
use std::future::Future;
use std::marker::Unpin;
use std::mem::PinMut;
use std::task::{self, Poll};
pub trait Write {
type Error;
fn poll_close(self: PinMut<Self>, cx: &mut task::Context) -> Poll<Result<(), Self::Error>>;
}
existential type Close<'a, W: Write>: Future<Output = Result<(), W::Error>> + 'a;
trait WriteExt: Write {
fn close<'a>(self: PinMut<'a, Self>) -> Close<'a, Self>
where
Self: Sized,
{
poll_fn(move |cx| self.reborrow().poll_close(cx))
}
}
// ------------
// from futures-util-preview 0.3
pub struct PollFn<F> {
f: F,
}
impl<F> Unpin for PollFn<F> {}
pub fn poll_fn<T, F>(f: F) -> PollFn<F>
where
F: FnMut(&mut task::Context) -> Poll<T>,
{
PollFn { f }
}
impl<T, F> Future for PollFn<F>
where
F: FnMut(&mut task::Context) -> Poll<T>,
{
type Output = T;
fn poll(mut self: PinMut<Self>, cx: &mut task::Context) -> Poll<T> {
(&mut self.f)(cx)
}
}
(CC @oli-obk in case you have any hints on where to look)