about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2023-06-15 22:04:57 +0200
committerGitHub <noreply@github.com>2023-06-15 22:04:57 +0200
commit6b9b55ac986fefba07d60b7ae89a5edc6c976cc3 (patch)
treee7692edbfd489e3f874459554d1d11465940acb2
parentaf955a647e538c3bc724cce84fb913d03e1d6c81 (diff)
parentc75e6e0f6c55d11ef06767cb42f617ae5e5b3870 (diff)
downloadrust-6b9b55ac986fefba07d60b7ae89a5edc6c976cc3.tar.gz
rust-6b9b55ac986fefba07d60b7ae89a5edc6c976cc3.zip
Rollup merge of #112654 - aliemjay:closure-output-normalize, r=compiler-errors
normalize closure output in equate_inputs_and_outputs

Fixes #112604
-rw-r--r--compiler/rustc_borrowck/src/type_check/input_output.rs16
-rw-r--r--tests/ui/nll/issue-112604-closure-output-normalize.rs49
2 files changed, 50 insertions, 15 deletions
diff --git a/compiler/rustc_borrowck/src/type_check/input_output.rs b/compiler/rustc_borrowck/src/type_check/input_output.rs
index a06d4bcc6c7..eec886b7be4 100644
--- a/compiler/rustc_borrowck/src/type_check/input_output.rs
+++ b/compiler/rustc_borrowck/src/type_check/input_output.rs
@@ -124,21 +124,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
         // Return types are a bit more complex. They may contain opaque `impl Trait` types.
         let mir_output_ty = body.local_decls[RETURN_PLACE].ty;
         let output_span = body.local_decls[RETURN_PLACE].source_info.span;
-        if let Err(terr) = self.eq_types(
-            normalized_output_ty,
-            mir_output_ty,
-            Locations::All(output_span),
-            ConstraintCategory::BoringNoLocation,
-        ) {
-            span_mirbug!(
-                self,
-                Location::START,
-                "equate_inputs_and_outputs: `{:?}=={:?}` failed with `{:?}`",
-                normalized_output_ty,
-                mir_output_ty,
-                terr
-            );
-        };
+        self.equate_normalized_input_or_output(normalized_output_ty, mir_output_ty, output_span);
     }
 
     #[instrument(skip(self), level = "debug")]
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 00000000000..e4c954eeb33
--- /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()) };
+}