about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-12-31 06:16:12 +0000
committerbors <bors@rust-lang.org>2015-12-31 06:16:12 +0000
commitf73c0a82ecd28feab1c7328d8659f6d75bd60679 (patch)
treeec20fc47818a0de1bb5ad72683b2d2a4ff976dc8
parent19a351c776500dc7ed59e343c47e125f96a7d1f4 (diff)
parent40a9481f8776446bf4bce3f89d81330791b179cf (diff)
downloadrust-f73c0a82ecd28feab1c7328d8659f6d75bd60679.tar.gz
rust-f73c0a82ecd28feab1c7328d8659f6d75bd60679.zip
Auto merge of #30598 - est31:macro_export_help_note, r=Manishearth
The current help message is too much about "normal" macros to be used
as general message. Keep it for normal macros, and add custom help and
error messages for macro definitions.
-rw-r--r--src/libsyntax/parse/parser.rs22
-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.rs27
-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