about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-03-08 15:12:51 -0800
committerEsteban Küber <esteban@kuber.com.ar>2019-03-16 17:47:57 -0700
commitb2b9555f95851cd24bcda6801a41ad9a1dfa4ae7 (patch)
treec24316ea8b3e92e8848dde80db0c659bd57dbccd /src/libsyntax/parse
parent532dd4475b553212a65a52df6ff511e4822b149a (diff)
downloadrust-b2b9555f95851cd24bcda6801a41ad9a1dfa4ae7.tar.gz
rust-b2b9555f95851cd24bcda6801a41ad9a1dfa4ae7.zip
Recover from incorrect `pub` kw in "reasonable" places
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 8ce29c9f298..ce643545e71 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1524,7 +1524,7 @@ impl<'a> Parser<'a> {
                          at_end: &mut bool,
                          mut attrs: Vec<Attribute>) -> PResult<'a, TraitItem> {
         let lo = self.span;
-
+        self.eat_bad_pub();
         let (name, node, generics) = if self.eat_keyword(keywords::Type) {
             self.parse_trait_item_assoc_ty()?
         } else if self.is_const_item() {
@@ -7680,6 +7680,7 @@ impl<'a> Parser<'a> {
 
             let struct_def;
             let mut disr_expr = None;
+            self.eat_bad_pub();
             let ident = self.parse_ident()?;
             if self.check(&token::OpenDelim(token::Brace)) {
                 // Parse a struct variant.
@@ -8618,6 +8619,17 @@ impl<'a> Parser<'a> {
             Applicability::MaybeIncorrect,
         ).emit();
     }
+
+    /// Recover from `pub` keyword in places where it seems _reasonable_ but isn't valid.
+    fn eat_bad_pub(&mut self) {
+        if self.token.is_keyword(keywords::Pub) {
+            self.bump();
+            let mut err = self.diagnostic()
+                .struct_span_err(self.prev_span, "unnecessary visibility qualifier");
+            err.span_label(self.prev_span, "`pub` not permitted here");
+            err.emit();
+        }
+    }
 }
 
 pub fn emit_unclosed_delims(unclosed_delims: &mut Vec<UnmatchedBrace>, handler: &errors::Handler) {