diff options
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 22 | ||||
| -rw-r--r-- | src/test/parse-fail/pub-item-macro.rs (renamed from src/test/compile-fail/pub-item-macro.rs) | 0 | ||||
| -rw-r--r-- | src/test/parse-fail/pub-macro-rules.rs | 27 | ||||
| -rw-r--r-- | src/test/parse-fail/pub-method-macro.rs (renamed from src/test/compile-fail/pub-method-macro.rs) | 0 |
4 files changed, 44 insertions, 5 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index a65a6b4a9da..db746af998d 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -67,7 +67,7 @@ use parse::classify; use parse::common::{SeqSep, seq_sep_none, seq_sep_trailing_allowed}; use parse::lexer::{Reader, TokenAndSpan}; use parse::obsolete::{ParserObsoleteMethods, ObsoleteSyntax}; -use parse::token::{self, MatchNt, SubstNt, SpecialVarNt, InternedString}; +use parse::token::{self, intern, MatchNt, SubstNt, SpecialVarNt, InternedString}; use parse::token::{keywords, special_idents, SpecialMacroVar}; use parse::{new_sub_parser_from_file, ParseSess}; use util::parser::{AssocOp, Fixity}; @@ -4622,10 +4622,22 @@ impl<'a> Parser<'a> { fn complain_if_pub_macro(&mut self, visa: Visibility, span: Span) { match visa { Public => { - self.diagnostic().struct_span_err(span, "can't qualify macro invocation with `pub`") - .fileline_help(span, "try adjusting the macro to put `pub` inside \ - the invocation") - .emit(); + let is_macro_rules: bool = match self.token { + token::Ident(sid, _) => sid.name == intern("macro_rules"), + _ => false, + }; + if is_macro_rules { + self.diagnostic().struct_span_err(span, "can't qualify macro_rules \ + invocation with `pub`") + .fileline_help(span, "did you mean #[macro_export]?") + .emit(); + } else { + self.diagnostic().struct_span_err(span, "can't qualify macro \ + invocation with `pub`") + .fileline_help(span, "try adjusting the macro to put `pub` \ + inside the invocation") + .emit(); + } } Inherited => (), } diff --git a/src/test/compile-fail/pub-item-macro.rs b/src/test/parse-fail/pub-item-macro.rs index 8809e9a257d..8809e9a257d 100644 --- a/src/test/compile-fail/pub-item-macro.rs +++ b/src/test/parse-fail/pub-item-macro.rs diff --git a/src/test/parse-fail/pub-macro-rules.rs b/src/test/parse-fail/pub-macro-rules.rs new file mode 100644 index 00000000000..93b992f2f8a --- /dev/null +++ b/src/test/parse-fail/pub-macro-rules.rs @@ -0,0 +1,27 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[macro_use] mod bleh { + pub macro_rules! foo { //~ ERROR can't qualify macro_rules invocation with `pub` + //~^ HELP did you mean #[macro_export]? + ($n:ident) => ( + fn $n () -> i32 { + 1 + } + ) + } + +} + +foo!(meh); + +fn main() { + println!("{}", meh()); +} diff --git a/src/test/compile-fail/pub-method-macro.rs b/src/test/parse-fail/pub-method-macro.rs index 198fa5b9aca..198fa5b9aca 100644 --- a/src/test/compile-fail/pub-method-macro.rs +++ b/src/test/parse-fail/pub-method-macro.rs |
