about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-03-03 19:04:58 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-03-16 23:13:15 +0300
commit5cb5083909f19c107aec186a72b8b9104f8ca30d (patch)
tree2043de231487b0b5275dc39af3732ec6f471ef8d
parent8371caf5ee13e775d2b2dc64c9b08e37dab49eda (diff)
downloadrust-5cb5083909f19c107aec186a72b8b9104f8ca30d.tar.gz
rust-5cb5083909f19c107aec186a72b8b9104f8ca30d.zip
syntax_ext: Validate `#[proc_macro_derive]` input better
Tweak some error wording
-rw-r--r--src/libsyntax/ext/expand.rs4
-rw-r--r--src/libsyntax_ext/proc_macro_decls.rs18
-rw-r--r--src/test/ui/proc-macro/attribute.rs6
-rw-r--r--src/test/ui/proc-macro/attribute.stderr16
4 files changed, 33 insertions, 11 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index b805213bb1a..46342e162cf 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -601,7 +601,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
                 res
             }
             ProcMacroDerive(..) | BuiltinDerive(..) => {
-                self.cx.span_err(attr.span, &format!("`{}` is a derive mode", attr.path));
+                self.cx.span_err(attr.span, &format!("`{}` is a derive macro", attr.path));
                 self.cx.trace_macros_diag();
                 invoc.fragment_kind.dummy(attr.span)
             }
@@ -822,7 +822,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
             }
 
             ProcMacroDerive(..) | BuiltinDerive(..) => {
-                self.cx.span_err(path.span, &format!("`{}` is a derive mode", path));
+                self.cx.span_err(path.span, &format!("`{}` is a derive macro", path));
                 self.cx.trace_macros_diag();
                 kind.dummy(span)
             }
diff --git a/src/libsyntax_ext/proc_macro_decls.rs b/src/libsyntax_ext/proc_macro_decls.rs
index 4cd42d6d755..efa6ce56648 100644
--- a/src/libsyntax_ext/proc_macro_decls.rs
+++ b/src/libsyntax_ext/proc_macro_decls.rs
@@ -128,9 +128,13 @@ impl<'a> CollectProcMacros<'a> {
             }
         };
 
+        if trait_ident.is_path_segment_keyword() {
+            self.handler.span_err(trait_attr.span(),
+                                  &format!("`{}` cannot be a name of derive macro", trait_ident));
+        }
         if deriving::is_builtin_trait(trait_ident.name) {
             self.handler.span_err(trait_attr.span,
-                                  "cannot override a built-in #[derive] mode");
+                                  "cannot override a built-in derive macro");
         }
 
         let attributes_attr = list.get(1);
@@ -140,8 +144,7 @@ impl<'a> CollectProcMacros<'a> {
             }
             attr.meta_item_list().unwrap_or_else(|| {
                 self.handler.span_err(attr.span(),
-                                      "attribute must be of form: \
-                                       `attributes(foo, bar)`");
+                                      "attribute must be of form: `attributes(foo, bar)`");
                 &[]
             }).into_iter().filter_map(|attr| {
                 let attr = match attr.meta_item() {
@@ -149,7 +152,7 @@ impl<'a> CollectProcMacros<'a> {
                     _ => {
                         self.handler.span_err(attr.span(), "not a meta item");
                         return None;
-                    },
+                    }
                 };
 
                 let ident = match attr.ident() {
@@ -159,6 +162,13 @@ impl<'a> CollectProcMacros<'a> {
                         return None;
                     }
                 };
+                if ident.is_path_segment_keyword() {
+                    self.handler.span_err(
+                        attr.span(),
+                        &format!("`{}` cannot be a name of derive helper attribute", ident),
+                    );
+                }
+
                 Some(ident.name)
             }).collect()
         } else {
diff --git a/src/test/ui/proc-macro/attribute.rs b/src/test/ui/proc-macro/attribute.rs
index 750f63f9b6b..ac7d0b4c2b6 100644
--- a/src/test/ui/proc-macro/attribute.rs
+++ b/src/test/ui/proc-macro/attribute.rs
@@ -39,11 +39,11 @@ pub fn foo7(input: TokenStream) -> TokenStream { input }
 pub fn foo8(input: TokenStream) -> TokenStream { input }
 
 #[proc_macro_derive(self)]
-//FIXME ERROR: `self` cannot be a name of derive macro
+//~^ ERROR: `self` cannot be a name of derive macro
 pub fn foo9(input: TokenStream) -> TokenStream { input }
 
 #[proc_macro_derive(PartialEq)]
-//~^ ERROR: cannot override a built-in #[derive] mode
+//~^ ERROR: cannot override a built-in derive macro
 pub fn foo10(input: TokenStream) -> TokenStream { input }
 
 #[proc_macro_derive(d11, a)]
@@ -72,5 +72,5 @@ pub fn foo15(input: TokenStream) -> TokenStream { input }
 pub fn foo16(input: TokenStream) -> TokenStream { input }
 
 #[proc_macro_derive(d17, attributes(self))]
-//FIXME ERROR: `self` cannot be a name of derive helper attribute
+//~^ ERROR: `self` cannot be a name of derive helper attribute
 pub fn foo17(input: TokenStream) -> TokenStream { input }
diff --git a/src/test/ui/proc-macro/attribute.stderr b/src/test/ui/proc-macro/attribute.stderr
index a1b3a4aaf29..cc17d383569 100644
--- a/src/test/ui/proc-macro/attribute.stderr
+++ b/src/test/ui/proc-macro/attribute.stderr
@@ -34,7 +34,13 @@ error: must only be one word
 LL | #[proc_macro_derive(d8(a))]
    |                     ^^^^^
 
-error: cannot override a built-in #[derive] mode
+error: `self` cannot be a name of derive macro
+  --> $DIR/attribute.rs:41:21
+   |
+LL | #[proc_macro_derive(self)]
+   |                     ^^^^
+
+error: cannot override a built-in derive macro
   --> $DIR/attribute.rs:45:21
    |
 LL | #[proc_macro_derive(PartialEq)]
@@ -82,6 +88,12 @@ error: must only be one word
 LL | #[proc_macro_derive(d16, attributes(a(b)))]
    |                                     ^^^^
 
+error: `self` cannot be a name of derive helper attribute
+  --> $DIR/attribute.rs:74:37
+   |
+LL | #[proc_macro_derive(d17, attributes(self))]
+   |                                     ^^^^
+
 error: attribute must be of the form `#[proc_macro_derive(TraitName, /*opt*/ attributes(name1, name2, ...))]`
   --> $DIR/attribute.rs:9:1
    |
@@ -94,5 +106,5 @@ error: attribute must be of the form `#[proc_macro_derive(TraitName, /*opt*/ att
 LL | #[proc_macro_derive = ""]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 16 previous errors
+error: aborting due to 18 previous errors