diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index efd351a632da1..939b3f0fc58bd 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}; @@ -4612,10 +4612,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 similarity index 100% rename from src/test/compile-fail/pub-item-macro.rs rename to 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 0000000000000..93b992f2f8af2 --- /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 or the MIT license +// , 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 similarity index 100% rename from src/test/compile-fail/pub-method-macro.rs rename to src/test/parse-fail/pub-method-macro.rs