about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2020-02-28 17:17:31 +0100
committerGitHub <noreply@github.com>2020-02-28 17:17:31 +0100
commit87cc521b02dfba7adc77e7c72c830d5c98d5438f (patch)
treeee3cffb9a4ea0e51137e9a2f881d25472ed88e4e
parent07d9ed2c09b6eb4f114fff774570e6e11108f992 (diff)
parent13d42f4784c2454a1890e48f50a8f672f4c0494c (diff)
downloadrust-87cc521b02dfba7adc77e7c72c830d5c98d5438f.tar.gz
rust-87cc521b02dfba7adc77e7c72c830d5c98d5438f.zip
Rollup merge of #69522 - Centril:fix-69341, r=petrochenkov
error_derive_forbidden_on_non_adt: be more graceful

Fixes #69341 which was injected by #67052.

r? @petrochenkov
-rw-r--r--src/librustc_expand/expand.rs7
-rw-r--r--src/test/ui/malformed/issue-69341-malformed-derive-inert.rs10
-rw-r--r--src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr26
3 files changed, 39 insertions, 4 deletions
diff --git a/src/librustc_expand/expand.rs b/src/librustc_expand/expand.rs
index 8ed7bbf6e12..84fe609ef9a 100644
--- a/src/librustc_expand/expand.rs
+++ b/src/librustc_expand/expand.rs
@@ -503,13 +503,12 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
     }
 
     fn error_derive_forbidden_on_non_adt(&self, derives: &[Path], item: &Annotatable) {
-        let attr =
-            attr::find_by_name(item.attrs(), sym::derive).expect("`derive` attribute should exist");
-        let span = attr.span;
+        let attr = attr::find_by_name(item.attrs(), sym::derive);
+        let span = attr.map_or(item.span(), |attr| attr.span);
         let mut err = self
             .cx
             .struct_span_err(span, "`derive` may only be applied to structs, enums and unions");
-        if let ast::AttrStyle::Inner = attr.style {
+        if let Some(ast::Attribute { style: ast::AttrStyle::Inner, .. }) = attr {
             let trait_list = derives.iter().map(|t| pprust::path_to_string(t)).collect::<Vec<_>>();
             let suggestion = format!("#[derive({})]", trait_list.join(", "));
             err.span_suggestion(
diff --git a/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs b/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs
new file mode 100644
index 00000000000..24692f7cf52
--- /dev/null
+++ b/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs
@@ -0,0 +1,10 @@
+fn main() {}
+
+struct CLI {
+    #[derive(parse())]
+    //~^ ERROR traits in `#[derive(...)]` don't accept arguments
+    //~| ERROR cannot find derive macro `parse` in this scope
+    //~| ERROR cannot find derive macro `parse` in this scope
+    path: (),
+    //~^ ERROR `derive` may only be applied to structs, enums and unions
+}
diff --git a/src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr b/src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr
new file mode 100644
index 00000000000..e8f96178d10
--- /dev/null
+++ b/src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr
@@ -0,0 +1,26 @@
+error: traits in `#[derive(...)]` don't accept arguments
+  --> $DIR/issue-69341-malformed-derive-inert.rs:4:19
+   |
+LL |     #[derive(parse())]
+   |                   ^^ help: remove the arguments
+
+error: `derive` may only be applied to structs, enums and unions
+  --> $DIR/issue-69341-malformed-derive-inert.rs:8:5
+   |
+LL |     path: (),
+   |     ^^^^^^^^
+
+error: cannot find derive macro `parse` in this scope
+  --> $DIR/issue-69341-malformed-derive-inert.rs:4:14
+   |
+LL |     #[derive(parse())]
+   |              ^^^^^
+
+error: cannot find derive macro `parse` in this scope
+  --> $DIR/issue-69341-malformed-derive-inert.rs:4:14
+   |
+LL |     #[derive(parse())]
+   |              ^^^^^
+
+error: aborting due to 4 previous errors
+