Don't point out return span on every E0308
This commit is contained in:
parent
1b57946a40
commit
c62a8ea9df
@ -1648,9 +1648,30 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
|
||||
);
|
||||
}
|
||||
|
||||
if let (Some(sp), Some(fn_output)) = (fcx.ret_coercion_span.get(), fn_output) {
|
||||
let ret_coercion_span = fcx.ret_coercion_span.get();
|
||||
|
||||
if let Some(sp) = ret_coercion_span
|
||||
// If the closure has an explicit return type annotation, or if
|
||||
// the closure's return type has been inferred from outside
|
||||
// requirements (such as an Fn* trait bound), then a type error
|
||||
// may occur at the first return expression we see in the closure
|
||||
// (if it conflicts with the declared return type). Skip adding a
|
||||
// note in this case, since it would be incorrect.
|
||||
&& !fcx.return_type_pre_known
|
||||
{
|
||||
err.span_note(
|
||||
sp,
|
||||
&format!(
|
||||
"return type inferred to be `{}` here",
|
||||
fcx.resolve_vars_if_possible(expected)
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if let (Some(sp), Some(fn_output)) = (ret_coercion_span, fn_output) {
|
||||
self.add_impl_trait_explanation(&mut err, cause, fcx, expected, sp, fn_output);
|
||||
}
|
||||
|
||||
err
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
self.note_type_is_not_clone(err, expected, expr_ty, expr);
|
||||
self.note_need_for_fn_pointer(err, expected, expr_ty);
|
||||
self.note_internal_mutation_in_method(err, expr, expected, expr_ty);
|
||||
self.report_closure_inferred_return_type(err, expected);
|
||||
}
|
||||
|
||||
// Requires that the two types unify, and prints an error message if
|
||||
@ -1418,25 +1417,4 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
// Report the type inferred by the return statement.
|
||||
fn report_closure_inferred_return_type(&self, err: &mut Diagnostic, expected: Ty<'tcx>) {
|
||||
if let Some(sp) = self.ret_coercion_span.get()
|
||||
// If the closure has an explicit return type annotation, or if
|
||||
// the closure's return type has been inferred from outside
|
||||
// requirements (such as an Fn* trait bound), then a type error
|
||||
// may occur at the first return expression we see in the closure
|
||||
// (if it conflicts with the declared return type). Skip adding a
|
||||
// note in this case, since it would be incorrect.
|
||||
&& !self.return_type_pre_known
|
||||
{
|
||||
err.span_note(
|
||||
sp,
|
||||
&format!(
|
||||
"return type inferred to be `{}` here",
|
||||
self.resolve_vars_if_possible(expected)
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,11 +6,6 @@ LL | Foo(())
|
||||
| |
|
||||
| arguments to this struct are incorrect
|
||||
|
|
||||
note: return type inferred to be `{integer}` here
|
||||
--> $DIR/issue-84128.rs:10:20
|
||||
|
|
||||
LL | return Foo(0);
|
||||
| ^^^^^^
|
||||
note: tuple struct defined here
|
||||
--> $DIR/issue-84128.rs:5:8
|
||||
|
|
||||
|
18
src/test/ui/mismatched_types/dont-point-return-on-E0308.rs
Normal file
18
src/test/ui/mismatched_types/dont-point-return-on-E0308.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// edition:2021
|
||||
|
||||
async fn f(_: &()) {}
|
||||
//~^ NOTE function defined here
|
||||
//~| NOTE
|
||||
// Second note is the span of the underlined argument, I think...
|
||||
|
||||
fn main() {
|
||||
(|| async {
|
||||
Err::<(), ()>(())?;
|
||||
f(());
|
||||
//~^ ERROR mismatched types
|
||||
//~| NOTE arguments to this function are incorrect
|
||||
//~| NOTE expected `&()`, found `()`
|
||||
//~| HELP consider borrowing here
|
||||
Ok::<(), ()>(())
|
||||
})();
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/dont-point-return-on-E0308.rs:10:11
|
||||
|
|
||||
LL | f(());
|
||||
| - ^^
|
||||
| | |
|
||||
| | expected `&()`, found `()`
|
||||
| | help: consider borrowing here: `&()`
|
||||
| arguments to this function are incorrect
|
||||
|
|
||||
note: function defined here
|
||||
--> $DIR/dont-point-return-on-E0308.rs:3:10
|
||||
|
|
||||
LL | async fn f(_: &()) {}
|
||||
| ^ ------
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
Loading…
x
Reference in New Issue
Block a user