Rollup merge of #122195 - jieyouxu:impl-return-note, r=fmease
Note that the caller chooses a type for type param ``` error[E0308]: mismatched types --> $DIR/return-impl-trait.rs:23:5 | LL | fn other_bounds<T>() -> T | - - | | | | | expected `T` because of return type | | help: consider using an impl return type: `impl Trait` | expected this type parameter ... LL | () | ^^ expected type parameter `T`, found `()` | = note: expected type parameter `T` found unit type `()` = note: the caller chooses the type of T which can be different from () ``` Tried to see if "expected this type parameter" can be replaced, but that goes all the way to `rustc_infer` so seems not worth the effort and can affect other diagnostics. Revives #112088 and #104755.
This commit is contained in:
commit
aa184c558f
13 changed files with 98 additions and 2 deletions
|
@ -103,6 +103,8 @@ hir_typeck_no_associated_item = no {$item_kind} named `{$item_name}` found for {
|
|||
*[other] {" "}in the current scope
|
||||
}
|
||||
|
||||
hir_typeck_note_caller_chooses_ty_for_ty_param = the caller chooses a type for `{$ty_param_name}` which can be different from `{$found_ty}`
|
||||
|
||||
hir_typeck_note_edition_guide = for more on editions, read https://doc.rust-lang.org/edition-guide
|
||||
|
||||
hir_typeck_option_result_asref = use `{$def_path}::as_ref` to convert `{$expected_ty}` to `{$expr_ty}`
|
||||
|
|
|
@ -11,7 +11,7 @@ use rustc_middle::ty::Ty;
|
|||
use rustc_span::{
|
||||
edition::{Edition, LATEST_STABLE_EDITION},
|
||||
symbol::Ident,
|
||||
Span,
|
||||
Span, Symbol,
|
||||
};
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
|
@ -614,3 +614,10 @@ pub struct SuggestConvertViaMethod<'tcx> {
|
|||
pub expected: Ty<'tcx>,
|
||||
pub found: Ty<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[note(hir_typeck_note_caller_chooses_ty_for_ty_param)]
|
||||
pub struct NoteCallerChoosesTyForTyParam<'tcx> {
|
||||
pub ty_param_name: Symbol,
|
||||
pub found_ty: Ty<'tcx>,
|
||||
}
|
||||
|
|
|
@ -889,7 +889,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
self.dcx(),
|
||||
errors::ExpectedReturnTypeLabel::Other { span: hir_ty.span, expected },
|
||||
);
|
||||
self.try_suggest_return_impl_trait(err, expected, ty, fn_id);
|
||||
self.try_suggest_return_impl_trait(err, expected, found, fn_id);
|
||||
self.note_caller_chooses_ty_for_ty_param(err, expected, found);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -899,6 +900,23 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
false
|
||||
}
|
||||
|
||||
fn note_caller_chooses_ty_for_ty_param(
|
||||
&self,
|
||||
diag: &mut Diag<'_>,
|
||||
expected: Ty<'tcx>,
|
||||
found: Ty<'tcx>,
|
||||
) {
|
||||
if let ty::Param(expected_ty_as_param) = expected.kind() {
|
||||
diag.subdiagnostic(
|
||||
self.dcx(),
|
||||
errors::NoteCallerChoosesTyForTyParam {
|
||||
ty_param_name: expected_ty_as_param.name,
|
||||
found_ty: found,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// check whether the return type is a generic type with a trait bound
|
||||
/// only suggest this if the generic param is not present in the arguments
|
||||
/// if this is true, hint them towards changing the return type to `impl Trait`
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue