From b696f488917b1a39f0bab4c566e7627b49196e71 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Fri, 8 Nov 2019 08:58:32 -0500 Subject: [PATCH 1/2] Use `eq_opaque_type_and_type` when type-checking closure signatures This handles the case where a user explicitly annotations a closure signature with a opaque return type. Fixes #63263 --- .../nll/type_check/input_output.rs | 20 +++++++++++++++---- .../issue-63263-closure-return.rs | 13 ++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 src/test/ui/type-alias-impl-trait/issue-63263-closure-return.rs 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..a3a9334120538 --- /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. + +// run-pass + +#![feature(type_alias_impl_trait)] + +pub type Closure = impl FnOnce(); + +fn main() { + || -> Closure { || () }; +} From e8d55d0a43640cd4bdff98b59e962fba006fb819 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Fri, 8 Nov 2019 13:28:34 -0500 Subject: [PATCH 2/2] Change test type to `check-pass` Co-Authored-By: Mazdak Farrokhzad --- src/test/ui/type-alias-impl-trait/issue-63263-closure-return.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index a3a9334120538..7414611a74893 100644 --- 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 @@ -2,7 +2,7 @@ // Tests that we properly handle closures with an explicit return type // that return an opaque type. -// run-pass +// check-pass #![feature(type_alias_impl_trait)]