2024-03-09 16:12:33 -06:00
|
|
|
//@ edition:2024
|
|
|
|
//@ compile-flags: -Zunstable-options
|
|
|
|
//@ revisions: current next
|
|
|
|
//@[next] compile-flags: -Znext-solver
|
2024-03-09 23:14:11 -06:00
|
|
|
//@ 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 <https://github.com/rust-lang/rust/pull/122267>.
|
2024-03-09 16:12:33 -06:00
|
|
|
|
|
|
|
#![feature(unboxed_closures, gen_blocks)]
|
|
|
|
|
|
|
|
trait Dispatch {
|
|
|
|
fn dispatch(self);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Fut<T>(T);
|
|
|
|
impl<T: for<'a> Fn<(&'a (),)>> Dispatch for Fut<T>
|
|
|
|
where
|
|
|
|
for<'a> <T as FnOnce<(&'a (),)>>::Output: Future,
|
|
|
|
{
|
|
|
|
fn dispatch(self) {
|
|
|
|
(self.0)(&());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Gen<T>(T);
|
|
|
|
impl<T: for<'a> Fn<(&'a (),)>> Dispatch for Gen<T>
|
|
|
|
where
|
|
|
|
for<'a> <T as FnOnce<(&'a (),)>>::Output: Iterator,
|
|
|
|
{
|
|
|
|
fn dispatch(self) {
|
|
|
|
(self.0)(&());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Closure<T>(T);
|
|
|
|
impl<T: for<'a> Fn<(&'a (),)>> Dispatch for Closure<T>
|
|
|
|
where
|
|
|
|
for<'a> <T as FnOnce<(&'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();
|
2024-03-09 23:14:11 -06:00
|
|
|
}
|