Skip to content

Commit

Permalink
Unrolled build for rust-lang#134256
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#134256 - krtab:suggestion_overlapping, r=petrochenkov

Use a more precise span in placeholder_type_error_diag

Closes: rust-lang#123861
  • Loading branch information
rust-timer authored Dec 14, 2024
2 parents 4a204be + af530c4 commit cba294f
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 8 deletions.
7 changes: 4 additions & 3 deletions compiler/rustc_hir_analysis/src/collect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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}")));
Expand Down
5 changes: 0 additions & 5 deletions tests/crashes/123861.rs

This file was deleted.

8 changes: 8 additions & 0 deletions tests/ui/generics/overlapping-errors-span-issue-123861.rs
Original file line number Diff line number Diff line change
@@ -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() {}
52 changes: 52 additions & 0 deletions tests/ui/generics/overlapping-errors-span-issue-123861.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit cba294f

Please sign in to comment.