diff options
Diffstat (limited to 'tests/ui/nll/issue-112604-closure-output-normalize.rs')
-rw-r--r-- | tests/ui/nll/issue-112604-closure-output-normalize.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/tests/ui/nll/issue-112604-closure-output-normalize.rs b/tests/ui/nll/issue-112604-closure-output-normalize.rs new file mode 100644 index 000000000..e4c954eeb --- /dev/null +++ b/tests/ui/nll/issue-112604-closure-output-normalize.rs @@ -0,0 +1,49 @@ +//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()) }; +} |