1
Fork 0

Use a more precise span in placeholder_type_error_diag

Closes: https://github.com/rust-lang/rust/issues/123861
This commit is contained in:
Arthur Carcano 2024-12-13 12:32:35 +01:00
parent 3da8bfb87f
commit af530c4927
4 changed files with 64 additions and 8 deletions

View file

@ -201,12 +201,13 @@ pub(crate) fn placeholder_type_error_diag<'cx, 'tcx>(
placeholder_types.iter().map(|sp| (*sp, (*type_name).to_string())).collect();
if let Some(generics) = generics {
if let Some(arg) = params.iter().find(|arg| {
matches!(arg.name, hir::ParamName::Plain(Ident { name: kw::Underscore, .. }))
if let Some(span) = params.iter().find_map(|arg| match arg.name {
hir::ParamName::Plain(Ident { name: kw::Underscore, span }) => Some(span),
_ => None,
}) {
// Account for `_` already present in cases like `struct S<_>(_);` and suggest
// `struct S<T>(T);` instead of `struct S<_, T>(T);`.
sugg.push((arg.span, (*type_name).to_string()));
sugg.push((span, (*type_name).to_string()));
} else if let Some(span) = generics.span_for_param_suggestion() {
// Account for bounds, we want `fn foo<T: E, K>(_: K)` not `fn foo<T, K: E>(_: K)`.
sugg.push((span, format!(", {type_name}")));