//@ edition:2021 //@ check-pass #![feature(type_alias_impl_trait)] #![feature(closure_lifetime_binder)] use std::future::Future; trait AsyncFn: FnMut(I) -> Self::Fut { type Fut: Future; } impl AsyncFn for F where Fut: Future, F: FnMut(I) -> Fut, { type Fut = Fut; } async fn call(mut ctx: C, mut f: F) -> Result where F: for<'a> AsyncFn<&'a mut C, Result>, { loop { match f(&mut ctx).await { Ok(val) => return Ok(val), Err(_) => continue, } } } trait Cap<'a> {} impl Cap<'_> for T {} fn works(ctx: &mut usize) { let mut inner = 0; type Ret<'a, 'b: 'a> = impl Future> + 'a + Cap<'b>; let callback = for<'a, 'b> |c: &'a mut &'b mut usize| -> Ret<'a, 'b> { inner += 1; async move { let _c = c; Ok(1usize) } }; call(ctx, callback); } fn doesnt_work_but_should(ctx: &mut usize) { let mut inner = 0; type Ret<'a, 'b: 'a> = impl Future> + 'a + Cap<'b>; call(ctx, for<'a, 'b> |c: &'a mut &'b mut usize| -> Ret<'a, 'b> { inner += 1; async move { let _c = c; Ok(1usize) } }); } fn main() {}