From ecd79a125b333e2e38fa1e0f6156438659c283db Mon Sep 17 00:00:00 2001
From: est31 <MTest31@outlook.com>
Date: Fri, 4 Nov 2016 22:37:51 +0100
Subject: [PATCH] Add error when proc_macro_derive is used not on functions

Fixes #37590
---
 src/libsyntax_ext/proc_macro_registrar.rs             | 11 +++++++++++
 ...crate-type.rs => illegal-proc-macro-derive-use.rs} |  6 ++++++
 2 files changed, 17 insertions(+)
 rename src/test/compile-fail-fulldeps/proc-macro/{require-rustc-macro-crate-type.rs => illegal-proc-macro-derive-use.rs} (82%)

diff --git a/src/libsyntax_ext/proc_macro_registrar.rs b/src/libsyntax_ext/proc_macro_registrar.rs
index f49a5f0e070..a8accd63dcf 100644
--- a/src/libsyntax_ext/proc_macro_registrar.rs
+++ b/src/libsyntax_ext/proc_macro_registrar.rs
@@ -105,6 +105,17 @@ impl<'a> Visitor for CollectCustomDerives<'a> {
         match item.node {
             ast::ItemKind::Fn(..) => {}
             _ => {
+                // Check for invalid use of proc_macro_derive
+                let attr = item.attrs.iter()
+                    .filter(|a| a.check_name("proc_macro_derive"))
+                    .next();
+                if let Some(attr) = attr {
+                    self.handler.span_err(attr.span(),
+                                          "the `#[proc_macro_derive]` \
+                                          attribute may only be used \
+                                          on bare functions");
+                    return;
+                }
                 self.check_not_pub_in_root(&item.vis, item.span);
                 return visit::walk_item(self, item)
             }
diff --git a/src/test/compile-fail-fulldeps/proc-macro/require-rustc-macro-crate-type.rs b/src/test/compile-fail-fulldeps/proc-macro/illegal-proc-macro-derive-use.rs
similarity index 82%
rename from src/test/compile-fail-fulldeps/proc-macro/require-rustc-macro-crate-type.rs
rename to src/test/compile-fail-fulldeps/proc-macro/illegal-proc-macro-derive-use.rs
index 44397cdde0c..405994b36e2 100644
--- a/src/test/compile-fail-fulldeps/proc-macro/require-rustc-macro-crate-type.rs
+++ b/src/test/compile-fail-fulldeps/proc-macro/illegal-proc-macro-derive-use.rs
@@ -18,4 +18,10 @@ pub fn foo(a: proc_macro::TokenStream) -> proc_macro::TokenStream {
     a
 }
 
+// Issue #37590
+#[proc_macro_derive(Foo)]
+//~^ ERROR: the `#[proc_macro_derive]` attribute may only be used on bare functions
+pub struct Foo {
+}
+
 fn main() {}