diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2023-06-15 22:04:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-15 22:04:57 +0200 |
| commit | 6b9b55ac986fefba07d60b7ae89a5edc6c976cc3 (patch) | |
| tree | e7692edbfd489e3f874459554d1d11465940acb2 | |
| parent | af955a647e538c3bc724cce84fb913d03e1d6c81 (diff) | |
| parent | c75e6e0f6c55d11ef06767cb42f617ae5e5b3870 (diff) | |
| download | rust-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.rs | 16 | ||||
| -rw-r--r-- | tests/ui/nll/issue-112604-closure-output-normalize.rs | 49 |
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()) }; +} |
