From 693e9579bc796e5a8f38f58563e20d3cc1c21ce3 Mon Sep 17 00:00:00 2001 From: mibac138 <5672750+mibac138@users.noreply.github.com> Date: Wed, 5 May 2021 18:59:37 +0200 Subject: [PATCH] Suggest adding a type parameter for impls --- .../rustc_resolve/src/late/diagnostics.rs | 10 +++++---- src/test/ui/const-generics/diagnostics.stderr | 22 +++++++++++++++++-- src/test/ui/traits/issue-75627.stderr | 4 +++- src/test/ui/traits/issue-78372.stderr | 11 +++++++++- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index 7561b3df3af7..a4bf19aab95f 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -1600,8 +1600,8 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { if !self.diagnostic_metadata.currently_processing_generics && !single_uppercase_char { return None; } - match (self.diagnostic_metadata.current_item, single_uppercase_char) { - (Some(Item { kind: ItemKind::Fn(..), ident, .. }), _) if ident.name == sym::main => { + match (self.diagnostic_metadata.current_item, single_uppercase_char, self.diagnostic_metadata.currently_processing_generics) { + (Some(Item { kind: ItemKind::Fn(..), ident, .. }), _, _) if ident.name == sym::main => { // Ignore `fn main()` as we don't want to suggest `fn main()` } ( @@ -1613,9 +1613,11 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { | kind @ ItemKind::Union(..), .. }), - true, + true, _ ) - | (Some(Item { kind, .. }), false) => { + // Without the 2nd `true`, we'd suggest `impl ` for `impl T` when a type `T` isn't found + | (Some(Item { kind: kind @ ItemKind::Impl(..), .. }), true, true) + | (Some(Item { kind, .. }), false, _) => { // Likely missing type parameter. if let Some(generics) = kind.generics() { if span.overlaps(generics.span) { diff --git a/src/test/ui/const-generics/diagnostics.stderr b/src/test/ui/const-generics/diagnostics.stderr index c8ee6ad61ec7..983cb52f3ff5 100644 --- a/src/test/ui/const-generics/diagnostics.stderr +++ b/src/test/ui/const-generics/diagnostics.stderr @@ -5,7 +5,16 @@ LL | struct A; | ---------------------- similarly named struct `A` defined here LL | trait Foo {} LL | impl Foo for A {} - | ^ help: a struct with a similar name exists: `A` + | ^ + | +help: a struct with a similar name exists + | +LL | impl Foo for A {} + | ^ +help: you might be missing a type parameter + | +LL | impl Foo for A {} + | ^^^ error[E0412]: cannot find type `T` in this scope --> $DIR/diagnostics.rs:16:32 @@ -14,7 +23,16 @@ LL | struct A; | ---------------------- similarly named struct `A` defined here ... LL | impl Foo for C {} - | ^ help: a struct with a similar name exists: `A` + | ^ + | +help: a struct with a similar name exists + | +LL | impl Foo for C {} + | ^ +help: you might be missing a type parameter + | +LL | impl Foo for C {} + | ^^^ error[E0747]: unresolved item provided when a constant was expected --> $DIR/diagnostics.rs:7:16 diff --git a/src/test/ui/traits/issue-75627.stderr b/src/test/ui/traits/issue-75627.stderr index 92d9ac0f84c9..432ddf2dcdbd 100644 --- a/src/test/ui/traits/issue-75627.stderr +++ b/src/test/ui/traits/issue-75627.stderr @@ -2,7 +2,9 @@ error[E0412]: cannot find type `T` in this scope --> $DIR/issue-75627.rs:3:26 | LL | unsafe impl Send for Foo {} - | ^ not found in this scope + | - ^ not found in this scope + | | + | help: you might be missing a type parameter: `` error: aborting due to previous error diff --git a/src/test/ui/traits/issue-78372.stderr b/src/test/ui/traits/issue-78372.stderr index 9267e838ceae..e63740c4ea92 100644 --- a/src/test/ui/traits/issue-78372.stderr +++ b/src/test/ui/traits/issue-78372.stderr @@ -13,9 +13,18 @@ error[E0412]: cannot find type `U` in this scope --> $DIR/issue-78372.rs:3:31 | LL | impl DispatchFromDyn> for T {} - | - ^ help: a type parameter with a similar name exists: `T` + | - ^ | | | similarly named type parameter `T` defined here + | +help: a type parameter with a similar name exists + | +LL | impl DispatchFromDyn> for T {} + | ^ +help: you might be missing a type parameter + | +LL | impl DispatchFromDyn> for T {} + | ^^^ error[E0412]: cannot find type `MISC` in this scope --> $DIR/issue-78372.rs:3:34