diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index 48707d37a10..38e8cf8cd2f 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -544,11 +544,23 @@ fn smart_resolve_macro_path( 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 dfd6818b678..fb4e19d8565 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 633a6c6a0d3..6e7adc2e3b1 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 6d0f826e621..6befa99f583 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