about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2022-05-28 01:11:50 +0200
committerGitHub <noreply@github.com>2022-05-28 01:11:50 +0200
commit0804ef656399d4a31e9aa07c34a64d7628320880 (patch)
treed63660b6603ccf15e7d42d8f7f01a7f026d5c4db
parent29ac9b13d48205d1c5caec1d0b40cf8bc7f9fa41 (diff)
parentf2a1b7b7724fef2876094f9b4a6c356345d7dd67 (diff)
downloadrust-0804ef656399d4a31e9aa07c34a64d7628320880.tar.gz
rust-0804ef656399d4a31e9aa07c34a64d7628320880.zip
Rollup merge of #97458 - estebank:use-self-in-derive-macro, r=compiler-errors
Modify `derive(Debug)` to use `Self` in struct literal to avoid redundant error

Reduce verbosity in #97343.
-rw-r--r--compiler/rustc_builtin_macros/src/deriving/generic/mod.rs4
-rw-r--r--src/test/ui/derives/issue-97343.rs8
-rw-r--r--src/test/ui/derives/issue-97343.stderr13
3 files changed, 24 insertions, 1 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
new file mode 100644
index 00000000000..adec6c7a5c5
--- /dev/null
+++ b/src/test/ui/derives/issue-97343.rs
@@ -0,0 +1,8 @@
+use std::fmt::Debug;
+
+#[derive(Debug)]
+pub struct Irrelevant<Irrelevant> { //~ ERROR type arguments are not allowed for this type
+    irrelevant: Irrelevant,
+}
+
+fn main() {}
diff --git a/src/test/ui/derives/issue-97343.stderr b/src/test/ui/derives/issue-97343.stderr
new file mode 100644
index 00000000000..eedd54f1e9f
--- /dev/null
+++ b/src/test/ui/derives/issue-97343.stderr
@@ -0,0 +1,13 @@
+error[E0109]: type arguments are not allowed for this type
+  --> $DIR/issue-97343.rs:4:23
+   |
+LL | #[derive(Debug)]
+   |          ----- in this derive macro expansion
+LL | pub struct Irrelevant<Irrelevant> {
+   |                       ^^^^^^^^^^ type argument not allowed
+   |
+   = note: this error originates in the derive macro `Debug` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0109`.