rust/tests/ui/nll/issue-112604-closure-output-normalize.rs
2023-06-15 12:49:49 +00:00

50 lines
941 B
Rust

//check-pass
use higher_kinded_types::*;
mod higher_kinded_types {
pub(crate) trait HKT {
type Of<'lt>;
}
pub(crate) trait WithLifetime<'lt> {
type T;
}
impl<T: ?Sized + for<'any> WithLifetime<'any>> HKT for T {
type Of<'lt> = <T as WithLifetime<'lt>>::T;
}
}
trait Trait {
type Gat<'lt>;
}
impl Trait for () {
type Gat<'lt> = ();
}
/// Same as `Trait`, but using HKTs rather than GATs
trait HTrait {
type Hat: ?Sized + HKT;
}
impl<T: Trait> HTrait for T {
type Hat = dyn for<'lt> WithLifetime<'lt, T = T::Gat<'lt>>;
}
impl<Hat: ?Sized + HKT> Trait for Box<dyn '_ + HTrait<Hat = Hat>> {
type Gat<'lt> = Hat::Of<'lt>;
}
fn existential() -> impl for<'a> Trait<Gat<'a> = ()> {}
fn dyn_hoops<T: Trait>(
_: T,
) -> Box<dyn HTrait<Hat = dyn for<'a> WithLifetime<'a, T = T::Gat<'a>>>> {
loop {}
}
fn main() {
let _ = || -> _ { dyn_hoops(existential()) };
}