//@ edition:2024 //@ compile-flags: -Zunstable-options //@ revisions: current next //@[next] compile-flags: -Znext-solver //@ check-pass // Makes sure that we support closure/coroutine goals where the signature of // the item references higher-ranked lifetimes from the *predicate* binder, // not its own internal signature binder. // // This was fixed in . #![feature(unboxed_closures, gen_blocks)] trait Dispatch { fn dispatch(self); } struct Fut(T); impl Fn<(&'a (),)>> Dispatch for Fut where for<'a> >::Output: Future, { fn dispatch(self) { (self.0)(&()); } } struct Gen(T); impl Fn<(&'a (),)>> Dispatch for Gen where for<'a> >::Output: Iterator, { fn dispatch(self) { (self.0)(&()); } } struct Closure(T); impl Fn<(&'a (),)>> Dispatch for Closure where for<'a> >::Output: Fn<(&'a (),)>, { fn dispatch(self) { (self.0)(&())(&()); } } fn main() { async fn foo(_: &()) {} Fut(foo).dispatch(); gen fn bar(_: &()) {} Gen(bar).dispatch(); fn uwu<'a>(x: &'a ()) -> impl Fn(&'a ()) { |_| {} } Closure(uwu).dispatch(); }