diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-03-03 19:04:58 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-03-16 23:13:15 +0300 |
| commit | 5cb5083909f19c107aec186a72b8b9104f8ca30d (patch) | |
| tree | 2043de231487b0b5275dc39af3732ec6f471ef8d | |
| parent | 8371caf5ee13e775d2b2dc64c9b08e37dab49eda (diff) | |
| download | rust-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.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax_ext/proc_macro_decls.rs | 18 | ||||
| -rw-r--r-- | src/test/ui/proc-macro/attribute.rs | 6 | ||||
| -rw-r--r-- | src/test/ui/proc-macro/attribute.stderr | 16 |
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 |
