diff --git a/src/librustc_mir/borrow_check/nll/type_check/input_output.rs b/src/librustc_mir/borrow_check/nll/type_check/input_output.rs index d74dd0fc0f5f1..35fb677c053cb 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/input_output.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/input_output.rs @@ -134,15 +134,27 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { }; // If the user explicitly annotated the output types, enforce those. + // Note that this only happens for closures. if let Some(user_provided_sig) = user_provided_sig { let user_provided_output_ty = user_provided_sig.output(); let user_provided_output_ty = self.normalize(user_provided_output_ty, Locations::All(output_span)); - self.equate_normalized_input_or_output( - user_provided_output_ty, + if let Err(err) = self.eq_opaque_type_and_type( mir_output_ty, - output_span, - ); + user_provided_output_ty, + self.mir_def_id, + Locations::All(output_span), + ConstraintCategory::BoringNoLocation + ) { + span_mirbug!( + self, + Location::START, + "equate_inputs_and_outputs: `{:?}=={:?}` failed with `{:?}`", + mir_output_ty, + user_provided_output_ty, + err + ); + } } } diff --git a/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.rs b/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.rs new file mode 100644 index 0000000000000..7414611a74893 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.rs @@ -0,0 +1,13 @@ +// Regression test for issue #63263. +// Tests that we properly handle closures with an explicit return type +// that return an opaque type. + +// check-pass + +#![feature(type_alias_impl_trait)] + +pub type Closure = impl FnOnce(); + +fn main() { + || -> Closure { || () }; +}