From b2b9555f95851cd24bcda6801a41ad9a1dfa4ae7 Mon Sep 17 00:00:00 2001 From: Esteban Küber Date: Fri, 8 Mar 2019 15:12:51 -0800 Subject: Recover from incorrect `pub` kw in "reasonable" places --- src/libsyntax/parse/parser.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'src/libsyntax/parse') 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) -> 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, handler: &errors::Handler) { -- cgit 1.4.1-3-g733a5