Use a more precise span in placeholder_type_error_diag
Closes: https://github.com/rust-lang/rust/issues/123861
This commit is contained in:
parent
3da8bfb87f
commit
af530c4927
4 changed files with 64 additions and 8 deletions
|
@ -201,12 +201,13 @@ pub(crate) fn placeholder_type_error_diag<'cx, 'tcx>(
|
||||||
placeholder_types.iter().map(|sp| (*sp, (*type_name).to_string())).collect();
|
placeholder_types.iter().map(|sp| (*sp, (*type_name).to_string())).collect();
|
||||||
|
|
||||||
if let Some(generics) = generics {
|
if let Some(generics) = generics {
|
||||||
if let Some(arg) = params.iter().find(|arg| {
|
if let Some(span) = params.iter().find_map(|arg| match arg.name {
|
||||||
matches!(arg.name, hir::ParamName::Plain(Ident { name: kw::Underscore, .. }))
|
hir::ParamName::Plain(Ident { name: kw::Underscore, span }) => Some(span),
|
||||||
|
_ => None,
|
||||||
}) {
|
}) {
|
||||||
// Account for `_` already present in cases like `struct S<_>(_);` and suggest
|
// Account for `_` already present in cases like `struct S<_>(_);` and suggest
|
||||||
// `struct S<T>(T);` instead of `struct S<_, T>(T);`.
|
// `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() {
|
} 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)`.
|
// Account for bounds, we want `fn foo<T: E, K>(_: K)` not `fn foo<T, K: E>(_: K)`.
|
||||||
sugg.push((span, format!(", {type_name}")));
|
sugg.push((span, format!(", {type_name}")));
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
//@ known-bug: #123861
|
|
||||||
//@ needs-rustc-debug-assertions
|
|
||||||
|
|
||||||
struct _;
|
|
||||||
fn mainIterator<_ = _> {}
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
fn mainIterator<_ = _> {}
|
||||||
|
//~^ ERROR expected identifier, found reserved identifier `_`
|
||||||
|
//~| ERROR missing parameters for function definition
|
||||||
|
//~| ERROR defaults for type parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions [invalid_type_param_default]
|
||||||
|
//~| WARNING this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
//~| ERROR the placeholder `_` is not allowed within types on item signatures for functions [E0121]
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,52 @@
|
||||||
|
error: expected identifier, found reserved identifier `_`
|
||||||
|
--> $DIR/overlapping-errors-span-issue-123861.rs:1:17
|
||||||
|
|
|
||||||
|
LL | fn mainIterator<_ = _> {}
|
||||||
|
| ^ expected identifier, found reserved identifier
|
||||||
|
|
||||||
|
error: missing parameters for function definition
|
||||||
|
--> $DIR/overlapping-errors-span-issue-123861.rs:1:23
|
||||||
|
|
|
||||||
|
LL | fn mainIterator<_ = _> {}
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
help: add a parameter list
|
||||||
|
|
|
||||||
|
LL | fn mainIterator<_ = _>() {}
|
||||||
|
| ++
|
||||||
|
|
||||||
|
error: defaults for type parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions
|
||||||
|
--> $DIR/overlapping-errors-span-issue-123861.rs:1:17
|
||||||
|
|
|
||||||
|
LL | fn mainIterator<_ = _> {}
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
= note: for more information, see issue #36887 <https://github.com/rust-lang/rust/issues/36887>
|
||||||
|
= note: `#[deny(invalid_type_param_default)]` on by default
|
||||||
|
|
||||||
|
error[E0121]: the placeholder `_` is not allowed within types on item signatures for functions
|
||||||
|
--> $DIR/overlapping-errors-span-issue-123861.rs:1:21
|
||||||
|
|
|
||||||
|
LL | fn mainIterator<_ = _> {}
|
||||||
|
| ^ not allowed in type signatures
|
||||||
|
|
|
||||||
|
help: use type parameters instead
|
||||||
|
|
|
||||||
|
LL | fn mainIterator<T = T> {}
|
||||||
|
| ~ ~
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0121`.
|
||||||
|
Future incompatibility report: Future breakage diagnostic:
|
||||||
|
error: defaults for type parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions
|
||||||
|
--> $DIR/overlapping-errors-span-issue-123861.rs:1:17
|
||||||
|
|
|
||||||
|
LL | fn mainIterator<_ = _> {}
|
||||||
|
| ^^^^^
|
||||||
|
|
|
||||||
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
= note: for more information, see issue #36887 <https://github.com/rust-lang/rust/issues/36887>
|
||||||
|
= note: `#[deny(invalid_type_param_default)]` on by default
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue