diff --git a/src/librustc_typeck/check/coercion.rs b/src/librustc_typeck/check/coercion.rs index 1e08d6378a9..57415021976 100644 --- a/src/librustc_typeck/check/coercion.rs +++ b/src/librustc_typeck/check/coercion.rs @@ -1104,7 +1104,7 @@ impl<'gcx, 'tcx, 'exprs, E> CoerceMany<'gcx, 'tcx, 'exprs, E> // Another example is `break` with no argument expression. assert!(expression_ty.is_nil()); assert!(expression_ty.is_nil(), "if let hack without unit type"); - fcx.eq_types(true, cause, expression_ty, self.merged_ty()) + fcx.eq_types(label_expression_as_expected, cause, expression_ty, self.merged_ty()) .map(|infer_ok| { fcx.register_infer_ok_obligations(infer_ok); expression_ty @@ -1128,6 +1128,10 @@ impl<'gcx, 'tcx, 'exprs, E> CoerceMany<'gcx, 'tcx, 'exprs, E> } Err(err) => { let (expected, found) = if label_expression_as_expected { + // In the case where this is a "forced unit", like + // `break`, we want to call the `()` "expected" + // since it is implied by the syntax. + // (Note: not all force-units work this way.)" (expression_ty, self.final_ty.unwrap_or(self.expected_ty)) } else { // Otherwise, the "expected" type for error diff --git a/src/test/ui/coercion-missing-tail-expected-type.stderr b/src/test/ui/coercion-missing-tail-expected-type.stderr index 43222e36ec5..8f08ff34637 100644 --- a/src/test/ui/coercion-missing-tail-expected-type.stderr +++ b/src/test/ui/coercion-missing-tail-expected-type.stderr @@ -5,7 +5,7 @@ error[E0308]: mismatched types | ____________________________^ 14 | | x + 1; 15 | | } - | |_^ expected (), found i32 + | |_^ expected i32, found () | = note: expected type `i32` found type `()`