rust/tests/ui/higher-ranked/builtin-closure-like-bounds.rs
2024-04-01 22:48:23 -04:00

59 lines
1.3 KiB
Rust

//@ 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 <https://github.com/rust-lang/rust/pull/122267>.
#![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();
}