about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_builtin_macros/src/deriving/generic/mod.rs4
-rw-r--r--src/test/ui/derives/issue-97343.rs2
-rw-r--r--src/test/ui/derives/issue-97343.stderr13
3 files changed, 6 insertions, 13 deletions
diff --git a/compiler/rustc_builtin_macros/src/deriving/generic/mod.rs b/compiler/rustc_builtin_macros/src/deriving/generic/mod.rs
index 0832fdad8b8..53369afae27 100644
--- a/compiler/rustc_builtin_macros/src/deriving/generic/mod.rs
+++ b/compiler/rustc_builtin_macros/src/deriving/generic/mod.rs
@@ -1039,7 +1039,9 @@ impl<'a> MethodDef<'a> {
         let span = trait_.span;
         let mut patterns = Vec::new();
         for i in 0..self_args.len() {
-            let struct_path = cx.path(span, vec![type_ident]);
+            // We could use `type_ident` instead of `Self`, but in the case of a type parameter
+            // shadowing the struct name, that causes a second, unnecessary E0578 error. #97343
+            let struct_path = cx.path(span, vec![Ident::new(kw::SelfUpper, type_ident.span)]);
             let (pat, ident_expr) = trait_.create_struct_pattern(
                 cx,
                 struct_path,
diff --git a/src/test/ui/derives/issue-97343.rs b/src/test/ui/derives/issue-97343.rs
index 6c5626f4796..adec6c7a5c5 100644
--- a/src/test/ui/derives/issue-97343.rs
+++ b/src/test/ui/derives/issue-97343.rs
@@ -1,6 +1,6 @@
 use std::fmt::Debug;
 
-#[derive(Debug)] //~ ERROR expected struct, variant or union type, found type parameter `Irrelevant`
+#[derive(Debug)]
 pub struct Irrelevant<Irrelevant> { //~ ERROR type arguments are not allowed for this type
     irrelevant: Irrelevant,
 }
diff --git a/src/test/ui/derives/issue-97343.stderr b/src/test/ui/derives/issue-97343.stderr
index 418178b01b9..eedd54f1e9f 100644
--- a/src/test/ui/derives/issue-97343.stderr
+++ b/src/test/ui/derives/issue-97343.stderr
@@ -1,11 +1,3 @@
-error[E0574]: expected struct, variant or union type, found type parameter `Irrelevant`
-  --> $DIR/issue-97343.rs:3:10
-   |
-LL | #[derive(Debug)]
-   |          ^^^^^ not a struct, variant or union type
-   |
-   = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
-
 error[E0109]: type arguments are not allowed for this type
   --> $DIR/issue-97343.rs:4:23
    |
@@ -16,7 +8,6 @@ LL | pub struct Irrelevant<Irrelevant> {
    |
    = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
 
-error: aborting due to 2 previous errors
+error: aborting due to previous error
 
-Some errors have detailed explanations: E0109, E0574.
-For more information about an error, try `rustc --explain E0109`.
+For more information about this error, try `rustc --explain E0109`.