summaryrefslogtreecommitdiffstats
path: root/tests/ui/nll/issue-112604-closure-output-normalize.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/nll/issue-112604-closure-output-normalize.rs')
-rw-r--r--tests/ui/nll/issue-112604-closure-output-normalize.rs49
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()) };
+}