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);
|
self.add_impl_trait_explanation(&mut err, cause, fcx, expected, sp, fn_output);
|
||||||
}
|
}
|
||||||
|
|
||||||
err
|
err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
self.note_type_is_not_clone(err, expected, expr_ty, expr);
|
self.note_type_is_not_clone(err, expected, expr_ty, expr);
|
||||||
self.note_need_for_fn_pointer(err, expected, expr_ty);
|
self.note_need_for_fn_pointer(err, expected, expr_ty);
|
||||||
self.note_internal_mutation_in_method(err, expr, 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
|
// Requires that the two types unify, and prints an error message if
|
||||||
@ -1418,25 +1417,4 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
_ => false,
|
_ => 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
|
| 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
|
note: tuple struct defined here
|
||||||
--> $DIR/issue-84128.rs:5:8
|
--> $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