about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTom Martin <tom.martin1239@gmail.com>2023-03-26 15:59:45 +0100
committerTom Martin <tom.martin1239@gmail.com>2023-03-26 16:01:25 +0100
commit42f2be8a8c655695ecf2b56eebf023faf7d62463 (patch)
tree494c2329fd7deff61ad2587f81456e604e0c66d9
parent89c2e3d3d75486e52473de3ae38f0ca6efeffef2 (diff)
downloadrust-42f2be8a8c655695ecf2b56eebf023faf7d62463.tar.gz
rust-42f2be8a8c655695ecf2b56eebf023faf7d62463.zip
Add suggestion to remove derive() if invoked macro is non-derive
-rw-r--r--compiler/rustc_resolve/src/macros.rs22
-rw-r--r--tests/ui/macros/macro-path-prelude-fail-4.stderr6
-rw-r--r--tests/ui/proc-macro/macro-namespace-reserved-2.stderr12
-rw-r--r--tests/ui/tool-attributes/tool-attributes-misplaced-2.stderr6
4 files changed, 41 insertions, 5 deletions
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 @@ 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 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