From 42f2be8a8c655695ecf2b56eebf023faf7d62463 Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Sun, 26 Mar 2023 15:59:45 +0100 Subject: [PATCH 1/9] Add suggestion to remove derive() if invoked macro is non-derive --- compiler/rustc_resolve/src/macros.rs | 22 ++++++++++++++----- .../macros/macro-path-prelude-fail-4.stderr | 6 +++++ .../macro-namespace-reserved-2.stderr | 12 ++++++++++ .../tool-attributes-misplaced-2.stderr | 6 +++++ 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index 48707d37a101c..38e8cf8cd2f12 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -544,11 +544,23 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { if let Some((article, expected)) = unexpected_res { let path_str = pprust::path_to_string(path); let msg = format!("expected {}, found {} `{}`", expected, res.descr(), path_str); - self.tcx - .sess - .struct_span_err(path.span, &msg) - .span_label(path.span, format!("not {} {}", article, expected)) - .emit(); + let mut err = self.tcx.sess.struct_span_err(path.span, &msg); + + err.span_label(path.span, format!("not {} {}", article, expected)); + + if kind == MacroKind::Derive && ext.macro_kind() != MacroKind::Derive { + // Suggest removing the derive() as the macro isn't Derive + let opening_span = + path.span.shrink_to_lo().with_lo(path.span.lo() - rustc_span::BytePos(7)); + let closing_span = + path.span.shrink_to_hi().with_hi(path.span.hi() + rustc_span::BytePos(1)); + err.span_help( + vec![opening_span, closing_span], + "remove the surrounding \"derive()\":", + ); + } + + err.emit(); return Ok((self.dummy_ext(kind), Res::Err)); } diff --git a/tests/ui/macros/macro-path-prelude-fail-4.stderr b/tests/ui/macros/macro-path-prelude-fail-4.stderr index dfd6818b6785a..fb4e19d856512 100644 --- a/tests/ui/macros/macro-path-prelude-fail-4.stderr +++ b/tests/ui/macros/macro-path-prelude-fail-4.stderr @@ -3,6 +3,12 @@ error: expected derive macro, found built-in attribute `inline` | LL | #[derive(inline)] | ^^^^^^ not a derive macro + | +help: remove the surrounding "derive()": + --> $DIR/macro-path-prelude-fail-4.rs:1:3 + | +LL | #[derive(inline)] + | ^^^^^^^ ^ error: aborting due to previous error diff --git a/tests/ui/proc-macro/macro-namespace-reserved-2.stderr b/tests/ui/proc-macro/macro-namespace-reserved-2.stderr index 633a6c6a0d3cb..6e7adc2e3b12a 100644 --- a/tests/ui/proc-macro/macro-namespace-reserved-2.stderr +++ b/tests/ui/proc-macro/macro-namespace-reserved-2.stderr @@ -57,6 +57,12 @@ error: expected derive macro, found attribute macro `my_macro_attr` | LL | #[derive(my_macro_attr)] | ^^^^^^^^^^^^^ not a derive macro + | +help: remove the surrounding "derive()": + --> $DIR/macro-namespace-reserved-2.rs:53:3 + | +LL | #[derive(my_macro_attr)] + | ^^^^^^^ ^ error: can't use a procedural macro from the same crate that defines it --> $DIR/macro-namespace-reserved-2.rs:56:10 @@ -87,6 +93,12 @@ error: expected derive macro, found macro `crate::my_macro` | LL | #[derive(crate::my_macro)] | ^^^^^^^^^^^^^^^ not a derive macro + | +help: remove the surrounding "derive()": + --> $DIR/macro-namespace-reserved-2.rs:50:3 + | +LL | #[derive(crate::my_macro)] + | ^^^^^^^ ^ error: cannot find macro `my_macro_attr` in this scope --> $DIR/macro-namespace-reserved-2.rs:28:5 diff --git a/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr b/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr index 6d0f826e621c5..6befa99f58355 100644 --- a/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr +++ b/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr @@ -3,6 +3,12 @@ error: expected derive macro, found tool attribute `rustfmt::skip` | LL | #[derive(rustfmt::skip)] | ^^^^^^^^^^^^^ not a derive macro + | +help: remove the surrounding "derive()": + --> $DIR/tool-attributes-misplaced-2.rs:1:3 + | +LL | #[derive(rustfmt::skip)] + | ^^^^^^^ ^ error: expected macro, found tool attribute `rustfmt::skip` --> $DIR/tool-attributes-misplaced-2.rs:5:5 From 10c36445ff13625186d924250b3ba9c4b90b23f9 Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Thu, 30 Mar 2023 21:43:32 +0100 Subject: [PATCH 2/9] Update non-derive macro error message to match suggestion It's now split between two errors, one to remove the invalid derive macro and one suggesting adding a new non-derive macro --- compiler/rustc_resolve/src/macros.rs | 12 +++------- .../macros/macro-path-prelude-fail-4.stderr | 12 +++++----- .../macro-namespace-reserved-2.stderr | 24 +++++++++---------- .../tool-attributes-misplaced-2.stderr | 12 +++++----- 4 files changed, 27 insertions(+), 33 deletions(-) diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index 38e8cf8cd2f12..082c051e21e54 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -549,15 +549,9 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { err.span_label(path.span, format!("not {} {}", article, expected)); if kind == MacroKind::Derive && ext.macro_kind() != MacroKind::Derive { - // Suggest removing the derive() as the macro isn't Derive - let opening_span = - path.span.shrink_to_lo().with_lo(path.span.lo() - rustc_span::BytePos(7)); - let closing_span = - path.span.shrink_to_hi().with_hi(path.span.hi() + rustc_span::BytePos(1)); - err.span_help( - vec![opening_span, closing_span], - "remove the surrounding \"derive()\":", - ); + // Suggest moving the macro our of the derive() as the macro isn't Derive + err.span_help(path.span, "Remove from the surrounding `derive()`"); + err.help(format!("Add as non-Derive macro\n`#[{}]`", path_str)); } err.emit(); diff --git a/tests/ui/macros/macro-path-prelude-fail-4.stderr b/tests/ui/macros/macro-path-prelude-fail-4.stderr index fb4e19d856512..cefe655b0f784 100644 --- a/tests/ui/macros/macro-path-prelude-fail-4.stderr +++ b/tests/ui/macros/macro-path-prelude-fail-4.stderr @@ -2,13 +2,13 @@ error: expected derive macro, found built-in attribute `inline` --> $DIR/macro-path-prelude-fail-4.rs:1:10 | LL | #[derive(inline)] - | ^^^^^^ not a derive macro + | ^^^^^^ + | | + | not a derive macro + | help: Remove from the surrounding `derive()` | -help: remove the surrounding "derive()": - --> $DIR/macro-path-prelude-fail-4.rs:1:3 - | -LL | #[derive(inline)] - | ^^^^^^^ ^ + = help: Add as non-Derive macro + `#[inline]` error: aborting due to previous error diff --git a/tests/ui/proc-macro/macro-namespace-reserved-2.stderr b/tests/ui/proc-macro/macro-namespace-reserved-2.stderr index 6e7adc2e3b12a..01814a3023742 100644 --- a/tests/ui/proc-macro/macro-namespace-reserved-2.stderr +++ b/tests/ui/proc-macro/macro-namespace-reserved-2.stderr @@ -56,13 +56,13 @@ error: expected derive macro, found attribute macro `my_macro_attr` --> $DIR/macro-namespace-reserved-2.rs:53:10 | LL | #[derive(my_macro_attr)] - | ^^^^^^^^^^^^^ not a derive macro - | -help: remove the surrounding "derive()": - --> $DIR/macro-namespace-reserved-2.rs:53:3 + | ^^^^^^^^^^^^^ + | | + | not a derive macro + | help: Remove from the surrounding `derive()` | -LL | #[derive(my_macro_attr)] - | ^^^^^^^ ^ + = help: Add as non-Derive macro + `#[my_macro_attr]` error: can't use a procedural macro from the same crate that defines it --> $DIR/macro-namespace-reserved-2.rs:56:10 @@ -92,13 +92,13 @@ error: expected derive macro, found macro `crate::my_macro` --> $DIR/macro-namespace-reserved-2.rs:50:10 | LL | #[derive(crate::my_macro)] - | ^^^^^^^^^^^^^^^ not a derive macro - | -help: remove the surrounding "derive()": - --> $DIR/macro-namespace-reserved-2.rs:50:3 + | ^^^^^^^^^^^^^^^ + | | + | not a derive macro + | help: Remove from the surrounding `derive()` | -LL | #[derive(crate::my_macro)] - | ^^^^^^^ ^ + = help: Add as non-Derive macro + `#[crate::my_macro]` error: cannot find macro `my_macro_attr` in this scope --> $DIR/macro-namespace-reserved-2.rs:28:5 diff --git a/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr b/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr index 6befa99f58355..c1ed2618b2af5 100644 --- a/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr +++ b/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr @@ -2,13 +2,13 @@ error: expected derive macro, found tool attribute `rustfmt::skip` --> $DIR/tool-attributes-misplaced-2.rs:1:10 | LL | #[derive(rustfmt::skip)] - | ^^^^^^^^^^^^^ not a derive macro + | ^^^^^^^^^^^^^ + | | + | not a derive macro + | help: Remove from the surrounding `derive()` | -help: remove the surrounding "derive()": - --> $DIR/tool-attributes-misplaced-2.rs:1:3 - | -LL | #[derive(rustfmt::skip)] - | ^^^^^^^ ^ + = help: Add as non-Derive macro + `#[rustfmt::skip]` error: expected macro, found tool attribute `rustfmt::skip` --> $DIR/tool-attributes-misplaced-2.rs:5:5 From ed84d1d9052912d4d948313be72a6dd50c2baa26 Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Thu, 30 Mar 2023 21:53:56 +0100 Subject: [PATCH 3/9] Fix typo --- compiler/rustc_resolve/src/macros.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index 082c051e21e54..39e30767da278 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -549,7 +549,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { err.span_label(path.span, format!("not {} {}", article, expected)); if kind == MacroKind::Derive && ext.macro_kind() != MacroKind::Derive { - // Suggest moving the macro our of the derive() as the macro isn't Derive + // Suggest moving the macro out of the derive() as the macro isn't Derive err.span_help(path.span, "Remove from the surrounding `derive()`"); err.help(format!("Add as non-Derive macro\n`#[{}]`", path_str)); } From 86230dcde6f68e049c0eb67e805d410fe0872422 Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Sat, 1 Apr 2023 03:52:58 +0100 Subject: [PATCH 4/9] Bless --- .../macros/macro-path-prelude-fail-4.stderr | 10 ++++++---- .../macro-namespace-reserved-2.stderr | 20 +++++++++++-------- .../tool-attributes-misplaced-2.stderr | 10 ++++++---- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/tests/ui/macros/macro-path-prelude-fail-4.stderr b/tests/ui/macros/macro-path-prelude-fail-4.stderr index cefe655b0f784..0dd67e6726c8f 100644 --- a/tests/ui/macros/macro-path-prelude-fail-4.stderr +++ b/tests/ui/macros/macro-path-prelude-fail-4.stderr @@ -2,11 +2,13 @@ error: expected derive macro, found built-in attribute `inline` --> $DIR/macro-path-prelude-fail-4.rs:1:10 | LL | #[derive(inline)] - | ^^^^^^ - | | - | not a derive macro - | help: Remove from the surrounding `derive()` + | ^^^^^^ not a derive macro + | +help: Remove from the surrounding `derive()` + --> $DIR/macro-path-prelude-fail-4.rs:1:10 | +LL | #[derive(inline)] + | ^^^^^^ = help: Add as non-Derive macro `#[inline]` diff --git a/tests/ui/proc-macro/macro-namespace-reserved-2.stderr b/tests/ui/proc-macro/macro-namespace-reserved-2.stderr index 01814a3023742..d0f829b50918f 100644 --- a/tests/ui/proc-macro/macro-namespace-reserved-2.stderr +++ b/tests/ui/proc-macro/macro-namespace-reserved-2.stderr @@ -56,11 +56,13 @@ error: expected derive macro, found attribute macro `my_macro_attr` --> $DIR/macro-namespace-reserved-2.rs:53:10 | LL | #[derive(my_macro_attr)] - | ^^^^^^^^^^^^^ - | | - | not a derive macro - | help: Remove from the surrounding `derive()` + | ^^^^^^^^^^^^^ not a derive macro + | +help: Remove from the surrounding `derive()` + --> $DIR/macro-namespace-reserved-2.rs:53:10 | +LL | #[derive(my_macro_attr)] + | ^^^^^^^^^^^^^ = help: Add as non-Derive macro `#[my_macro_attr]` @@ -92,11 +94,13 @@ error: expected derive macro, found macro `crate::my_macro` --> $DIR/macro-namespace-reserved-2.rs:50:10 | LL | #[derive(crate::my_macro)] - | ^^^^^^^^^^^^^^^ - | | - | not a derive macro - | help: Remove from the surrounding `derive()` + | ^^^^^^^^^^^^^^^ not a derive macro + | +help: Remove from the surrounding `derive()` + --> $DIR/macro-namespace-reserved-2.rs:50:10 | +LL | #[derive(crate::my_macro)] + | ^^^^^^^^^^^^^^^ = help: Add as non-Derive macro `#[crate::my_macro]` diff --git a/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr b/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr index c1ed2618b2af5..b1ecd52893885 100644 --- a/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr +++ b/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr @@ -2,11 +2,13 @@ error: expected derive macro, found tool attribute `rustfmt::skip` --> $DIR/tool-attributes-misplaced-2.rs:1:10 | LL | #[derive(rustfmt::skip)] - | ^^^^^^^^^^^^^ - | | - | not a derive macro - | help: Remove from the surrounding `derive()` + | ^^^^^^^^^^^^^ not a derive macro + | +help: Remove from the surrounding `derive()` + --> $DIR/tool-attributes-misplaced-2.rs:1:10 | +LL | #[derive(rustfmt::skip)] + | ^^^^^^^^^^^^^ = help: Add as non-Derive macro `#[rustfmt::skip]` From 56207b8fafac6f6697751084f0914e1dbc0381ce Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Sun, 2 Apr 2023 19:01:52 +0100 Subject: [PATCH 5/9] Skip help messages if macro span is from macro --- compiler/rustc_resolve/src/macros.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index 39e30767da278..b595dc068018b 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -548,10 +548,12 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { err.span_label(path.span, format!("not {} {}", article, expected)); - if kind == MacroKind::Derive && ext.macro_kind() != MacroKind::Derive { + if !path.span.from_expansion() { // Suggest moving the macro out of the derive() as the macro isn't Derive - err.span_help(path.span, "Remove from the surrounding `derive()`"); - err.help(format!("Add as non-Derive macro\n`#[{}]`", path_str)); + if kind == MacroKind::Derive && ext.macro_kind() != MacroKind::Derive { + err.span_help(path.span, "Remove from the surrounding `derive()`"); + err.help(format!("Add as non-Derive macro\n`#[{}]`", path_str)); + } } err.emit(); From be4416923d2f88a845eb5ea49b1daac9517935b8 Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Thu, 6 Apr 2023 18:02:52 +0100 Subject: [PATCH 6/9] Collapse if statements, change message to lowercase --- compiler/rustc_resolve/src/macros.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index b595dc068018b..ed479d289d78e 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -548,12 +548,13 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { err.span_label(path.span, format!("not {} {}", article, expected)); - if !path.span.from_expansion() { - // Suggest moving the macro out of the derive() as the macro isn't Derive - if kind == MacroKind::Derive && ext.macro_kind() != MacroKind::Derive { - err.span_help(path.span, "Remove from the surrounding `derive()`"); - err.help(format!("Add as non-Derive macro\n`#[{}]`", path_str)); - } + // Suggest moving the macro out of the derive() as the macro isn't Derive + if !path.span.from_expansion() + && kind == MacroKind::Derive + && ext.macro_kind() != MacroKind::Derive + { + err.span_help(path.span, "remove from the surrounding `derive()`"); + err.help(format!("add as non-Derive macro\n`#[{}]`", path_str)); } err.emit(); From 5c5c3c95276811d4ea72f6c4b45e7406ee8c6165 Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Fri, 7 Apr 2023 04:22:43 +0100 Subject: [PATCH 7/9] Add more complex test cases for new suggestion --- tests/ui/macros/macro-path-prelude-fail-5.rs | 10 +++++++ .../macros/macro-path-prelude-fail-5.stderr | 30 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 tests/ui/macros/macro-path-prelude-fail-5.rs create mode 100644 tests/ui/macros/macro-path-prelude-fail-5.stderr diff --git a/tests/ui/macros/macro-path-prelude-fail-5.rs b/tests/ui/macros/macro-path-prelude-fail-5.rs new file mode 100644 index 0000000000000..b82b6bc787859 --- /dev/null +++ b/tests/ui/macros/macro-path-prelude-fail-5.rs @@ -0,0 +1,10 @@ +#[derive(Clone, Debug)] // OK +struct S; + +#[derive(Debug, inline)] //~ ERROR expected derive macro, found built-in attribute `inline` +struct T; + +#[derive(inline, Debug)] //~ ERROR expected derive macro, found built-in attribute `inline` +struct U; + +fn main() {} diff --git a/tests/ui/macros/macro-path-prelude-fail-5.stderr b/tests/ui/macros/macro-path-prelude-fail-5.stderr new file mode 100644 index 0000000000000..105c59db67425 --- /dev/null +++ b/tests/ui/macros/macro-path-prelude-fail-5.stderr @@ -0,0 +1,30 @@ +error: expected derive macro, found built-in attribute `inline` + --> $DIR/macro-path-prelude-fail-5.rs:4:17 + | +LL | #[derive(Debug, inline)] + | ^^^^^^ not a derive macro + | +help: remove from the surrounding `derive()` + --> $DIR/macro-path-prelude-fail-5.rs:4:17 + | +LL | #[derive(Debug, inline)] + | ^^^^^^ + = help: add as non-Derive macro + `#[inline]` + +error: expected derive macro, found built-in attribute `inline` + --> $DIR/macro-path-prelude-fail-5.rs:7:10 + | +LL | #[derive(inline, Debug)] + | ^^^^^^ not a derive macro + | +help: remove from the surrounding `derive()` + --> $DIR/macro-path-prelude-fail-5.rs:7:10 + | +LL | #[derive(inline, Debug)] + | ^^^^^^ + = help: add as non-Derive macro + `#[inline]` + +error: aborting due to 2 previous errors + From 18388c9f7372d00fa958a421b3eec639a5b7b5a2 Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Fri, 7 Apr 2023 08:14:48 +0100 Subject: [PATCH 8/9] Rewrite added diagnostics as translatable Start messages with lowercase --- compiler/rustc_resolve/messages.ftl | 10 +++++++ compiler/rustc_resolve/src/errors.rs | 27 +++++++++++++++++++ compiler/rustc_resolve/src/macros.rs | 22 ++++++++++----- .../macros/macro-path-prelude-fail-4.stderr | 4 +-- .../macro-namespace-reserved-2.stderr | 8 +++--- .../tool-attributes-misplaced-2.stderr | 4 +-- 6 files changed, 61 insertions(+), 14 deletions(-) diff --git a/compiler/rustc_resolve/messages.ftl b/compiler/rustc_resolve/messages.ftl index 817bb83ed786a..07865044f0534 100644 --- a/compiler/rustc_resolve/messages.ftl +++ b/compiler/rustc_resolve/messages.ftl @@ -209,3 +209,13 @@ resolve_indeterminate = resolve_module_only = visibility must resolve to a module + +resolve_macro_expected_found = + expected {$expected}, found {$found} `{$macro_path}` + +resolve_remove_surrounding_derive = + remove from the surrounding `derive()` + +resolve_add_as_non_derive = + add as non-Derive macro + `#[{$macro_path}]` diff --git a/compiler/rustc_resolve/src/errors.rs b/compiler/rustc_resolve/src/errors.rs index 867363f4246af..ff44ccb265a9e 100644 --- a/compiler/rustc_resolve/src/errors.rs +++ b/compiler/rustc_resolve/src/errors.rs @@ -472,3 +472,30 @@ pub(crate) struct Indeterminate(#[primary_span] pub(crate) Span); #[derive(Diagnostic)] #[diag(resolve_module_only)] pub(crate) struct ModuleOnly(#[primary_span] pub(crate) Span); + +#[derive(Diagnostic, Default)] +#[diag(resolve_macro_expected_found)] +pub(crate) struct MacroExpectedFound<'a> { + #[primary_span] + pub(crate) span: Span, + pub(crate) found: &'a str, + pub(crate) expected: &'a str, + pub(crate) macro_path: &'a str, + #[subdiagnostic] + pub(crate) remove_surrounding_derive: Option, + #[subdiagnostic] + pub(crate) remove_surrounding_derive_help: Option>, +} + +#[derive(Subdiagnostic)] +#[help(resolve_remove_surrounding_derive)] +pub(crate) struct RemoveSurroundingDerive { + #[primary_span] + pub(crate) span: Span, +} + +#[derive(Subdiagnostic)] +#[help(resolve_add_as_non_derive)] +pub(crate) struct RemoveAddAsNonDerive<'a> { + pub(crate) macro_path: &'a str, +} diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index ed479d289d78e..b2e23721295d6 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -1,6 +1,7 @@ //! A bunch of methods and structures more or less related to resolving macros and //! interface provided by `Resolver` to macro expander. +use crate::errors::{MacroExpectedFound, RemoveAddAsNonDerive, RemoveSurroundingDerive}; use crate::Namespace::*; use crate::{BuiltinMacroState, Determinacy}; use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet}; @@ -543,21 +544,30 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { }; if let Some((article, expected)) = unexpected_res { let path_str = pprust::path_to_string(path); - let msg = format!("expected {}, found {} `{}`", expected, res.descr(), path_str); - let mut err = self.tcx.sess.struct_span_err(path.span, &msg); - err.span_label(path.span, format!("not {} {}", article, expected)); + let mut err = MacroExpectedFound { + span: path.span, + expected, + found: res.descr(), + macro_path: &path_str, + ..Default::default() // Subdiagnostics default to None + }; - // Suggest moving the macro out of the derive() as the macro isn't Derive + // Suggest moving the macro out of the derive() if the macro isn't Derive if !path.span.from_expansion() && kind == MacroKind::Derive && ext.macro_kind() != MacroKind::Derive { - err.span_help(path.span, "remove from the surrounding `derive()`"); - err.help(format!("add as non-Derive macro\n`#[{}]`", path_str)); + err.remove_surrounding_derive = Some(RemoveSurroundingDerive { span: path.span }); + err.remove_surrounding_derive_help = + Some(RemoveAddAsNonDerive { macro_path: &path_str }); } + let mut err = self.tcx.sess.create_err(err); + err.span_label(path.span, format!("not {} {}", article, expected)); + err.emit(); + return Ok((self.dummy_ext(kind), Res::Err)); } diff --git a/tests/ui/macros/macro-path-prelude-fail-4.stderr b/tests/ui/macros/macro-path-prelude-fail-4.stderr index 0dd67e6726c8f..81c6722b56a82 100644 --- a/tests/ui/macros/macro-path-prelude-fail-4.stderr +++ b/tests/ui/macros/macro-path-prelude-fail-4.stderr @@ -4,12 +4,12 @@ error: expected derive macro, found built-in attribute `inline` LL | #[derive(inline)] | ^^^^^^ not a derive macro | -help: Remove from the surrounding `derive()` +help: remove from the surrounding `derive()` --> $DIR/macro-path-prelude-fail-4.rs:1:10 | LL | #[derive(inline)] | ^^^^^^ - = help: Add as non-Derive macro + = help: add as non-Derive macro `#[inline]` error: aborting due to previous error diff --git a/tests/ui/proc-macro/macro-namespace-reserved-2.stderr b/tests/ui/proc-macro/macro-namespace-reserved-2.stderr index d0f829b50918f..b9effe7cf21f3 100644 --- a/tests/ui/proc-macro/macro-namespace-reserved-2.stderr +++ b/tests/ui/proc-macro/macro-namespace-reserved-2.stderr @@ -58,12 +58,12 @@ error: expected derive macro, found attribute macro `my_macro_attr` LL | #[derive(my_macro_attr)] | ^^^^^^^^^^^^^ not a derive macro | -help: Remove from the surrounding `derive()` +help: remove from the surrounding `derive()` --> $DIR/macro-namespace-reserved-2.rs:53:10 | LL | #[derive(my_macro_attr)] | ^^^^^^^^^^^^^ - = help: Add as non-Derive macro + = help: add as non-Derive macro `#[my_macro_attr]` error: can't use a procedural macro from the same crate that defines it @@ -96,12 +96,12 @@ error: expected derive macro, found macro `crate::my_macro` LL | #[derive(crate::my_macro)] | ^^^^^^^^^^^^^^^ not a derive macro | -help: Remove from the surrounding `derive()` +help: remove from the surrounding `derive()` --> $DIR/macro-namespace-reserved-2.rs:50:10 | LL | #[derive(crate::my_macro)] | ^^^^^^^^^^^^^^^ - = help: Add as non-Derive macro + = help: add as non-Derive macro `#[crate::my_macro]` error: cannot find macro `my_macro_attr` in this scope diff --git a/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr b/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr index b1ecd52893885..06696b548d484 100644 --- a/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr +++ b/tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr @@ -4,12 +4,12 @@ error: expected derive macro, found tool attribute `rustfmt::skip` LL | #[derive(rustfmt::skip)] | ^^^^^^^^^^^^^ not a derive macro | -help: Remove from the surrounding `derive()` +help: remove from the surrounding `derive()` --> $DIR/tool-attributes-misplaced-2.rs:1:10 | LL | #[derive(rustfmt::skip)] | ^^^^^^^^^^^^^ - = help: Add as non-Derive macro + = help: add as non-Derive macro `#[rustfmt::skip]` error: expected macro, found tool attribute `rustfmt::skip` From 668a62984ac51a09987c5b1a7c1589814f7a95d4 Mon Sep 17 00:00:00 2001 From: Tom Martin Date: Fri, 7 Apr 2023 08:44:19 +0100 Subject: [PATCH 9/9] Change type and field name to be clearer --- compiler/rustc_resolve/src/errors.rs | 4 ++-- compiler/rustc_resolve/src/macros.rs | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_resolve/src/errors.rs b/compiler/rustc_resolve/src/errors.rs index ff44ccb265a9e..660614d34216f 100644 --- a/compiler/rustc_resolve/src/errors.rs +++ b/compiler/rustc_resolve/src/errors.rs @@ -484,7 +484,7 @@ pub(crate) struct MacroExpectedFound<'a> { #[subdiagnostic] pub(crate) remove_surrounding_derive: Option, #[subdiagnostic] - pub(crate) remove_surrounding_derive_help: Option>, + pub(crate) add_as_non_derive: Option>, } #[derive(Subdiagnostic)] @@ -496,6 +496,6 @@ pub(crate) struct RemoveSurroundingDerive { #[derive(Subdiagnostic)] #[help(resolve_add_as_non_derive)] -pub(crate) struct RemoveAddAsNonDerive<'a> { +pub(crate) struct AddAsNonDerive<'a> { pub(crate) macro_path: &'a str, } diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index b2e23721295d6..22b014c0651c2 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -1,7 +1,7 @@ //! A bunch of methods and structures more or less related to resolving macros and //! interface provided by `Resolver` to macro expander. -use crate::errors::{MacroExpectedFound, RemoveAddAsNonDerive, RemoveSurroundingDerive}; +use crate::errors::{AddAsNonDerive, MacroExpectedFound, RemoveSurroundingDerive}; use crate::Namespace::*; use crate::{BuiltinMacroState, Determinacy}; use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet}; @@ -559,8 +559,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { && ext.macro_kind() != MacroKind::Derive { err.remove_surrounding_derive = Some(RemoveSurroundingDerive { span: path.span }); - err.remove_surrounding_derive_help = - Some(RemoveAddAsNonDerive { macro_path: &path_str }); + err.add_as_non_derive = Some(AddAsNonDerive { macro_path: &path_str }); } let mut err = self.tcx.sess.create_err(err);