diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2019-03-08 15:12:51 -0800 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2019-03-16 17:47:57 -0700 |
| commit | b2b9555f95851cd24bcda6801a41ad9a1dfa4ae7 (patch) | |
| tree | c24316ea8b3e92e8848dde80db0c659bd57dbccd | |
| parent | 532dd4475b553212a65a52df6ff511e4822b149a (diff) | |
Recover from incorrect `pub` kw in "reasonable" places
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 14 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-28433.rs | 4 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-28433.stderr | 24 | ||||
| -rw-r--r-- | src/test/ui/parser/trait-pub-assoc-const.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/parser/trait-pub-assoc-const.stderr | 6 | ||||
| -rw-r--r-- | src/test/ui/parser/trait-pub-assoc-ty.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/parser/trait-pub-assoc-ty.stderr | 6 | ||||
| -rw-r--r-- | src/test/ui/parser/trait-pub-method.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/parser/trait-pub-method.stderr | 6 |
9 files changed, 26 insertions, 40 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) { diff --git a/src/test/ui/issues/issue-28433.rs b/src/test/ui/issues/issue-28433.rs index be48ade5131..229b334a596 100644 --- a/src/test/ui/issues/issue-28433.rs +++ b/src/test/ui/issues/issue-28433.rs @@ -2,9 +2,7 @@ enum Bird { pub Duck, - //~^ ERROR expected identifier, found keyword `pub` - //~| ERROR missing comma - //~| WARN variant `pub` should have an upper camel case name + //~^ ERROR unnecessary visibility qualifier Goose } diff --git a/src/test/ui/issues/issue-28433.stderr b/src/test/ui/issues/issue-28433.stderr index 2463969476d..51be15a3e31 100644 --- a/src/test/ui/issues/issue-28433.stderr +++ b/src/test/ui/issues/issue-28433.stderr @@ -1,26 +1,8 @@ -error: expected identifier, found keyword `pub` +error: unnecessary visibility qualifier --> $DIR/issue-28433.rs:4:5 | LL | pub Duck, - | ^^^ expected identifier, found keyword -help: you can escape reserved keywords to use them as identifiers - | -LL | r#pub Duck, - | ^^^^^ - -error: missing comma - --> $DIR/issue-28433.rs:4:8 - | -LL | pub Duck, - | ^ help: missing comma - -warning: variant `pub` should have an upper camel case name - --> $DIR/issue-28433.rs:4:5 - | -LL | pub Duck, - | ^^^ help: convert the identifier to upper camel case: `Pub` - | - = note: #[warn(non_camel_case_types)] on by default + | ^^^ `pub` not permitted here -error: aborting due to 2 previous errors +error: aborting due to previous error diff --git a/src/test/ui/parser/trait-pub-assoc-const.rs b/src/test/ui/parser/trait-pub-assoc-const.rs index 3ee2dc1ae18..219ffa309c2 100644 --- a/src/test/ui/parser/trait-pub-assoc-const.rs +++ b/src/test/ui/parser/trait-pub-assoc-const.rs @@ -1,6 +1,6 @@ trait Foo { pub const Foo: u32; - //~^ ERROR expected one of `async`, `const`, `extern`, `fn`, `type`, `unsafe`, or `}`, found + //~^ ERROR unnecessary visibility qualifier } fn main() {} diff --git a/src/test/ui/parser/trait-pub-assoc-const.stderr b/src/test/ui/parser/trait-pub-assoc-const.stderr index 8fc9ae4cf28..817692cc82c 100644 --- a/src/test/ui/parser/trait-pub-assoc-const.stderr +++ b/src/test/ui/parser/trait-pub-assoc-const.stderr @@ -1,10 +1,8 @@ -error: expected one of `async`, `const`, `extern`, `fn`, `type`, `unsafe`, or `}`, found `pub` +error: unnecessary visibility qualifier --> $DIR/trait-pub-assoc-const.rs:2:5 | -LL | trait Foo { - | - expected one of 7 possible tokens here LL | pub const Foo: u32; - | ^^^ unexpected token + | ^^^ `pub` not permitted here error: aborting due to previous error diff --git a/src/test/ui/parser/trait-pub-assoc-ty.rs b/src/test/ui/parser/trait-pub-assoc-ty.rs index 042addfd1a4..a78dfbdcdda 100644 --- a/src/test/ui/parser/trait-pub-assoc-ty.rs +++ b/src/test/ui/parser/trait-pub-assoc-ty.rs @@ -1,6 +1,6 @@ trait Foo { pub type Foo; - //~^ ERROR expected one of `async`, `const`, `extern`, `fn`, `type`, `unsafe`, or `}`, found + //~^ ERROR unnecessary visibility qualifier } fn main() {} diff --git a/src/test/ui/parser/trait-pub-assoc-ty.stderr b/src/test/ui/parser/trait-pub-assoc-ty.stderr index b8eab4e87bf..400be6af22a 100644 --- a/src/test/ui/parser/trait-pub-assoc-ty.stderr +++ b/src/test/ui/parser/trait-pub-assoc-ty.stderr @@ -1,10 +1,8 @@ -error: expected one of `async`, `const`, `extern`, `fn`, `type`, `unsafe`, or `}`, found `pub` +error: unnecessary visibility qualifier --> $DIR/trait-pub-assoc-ty.rs:2:5 | -LL | trait Foo { - | - expected one of 7 possible tokens here LL | pub type Foo; - | ^^^ unexpected token + | ^^^ `pub` not permitted here error: aborting due to previous error diff --git a/src/test/ui/parser/trait-pub-method.rs b/src/test/ui/parser/trait-pub-method.rs index 9675182c156..1f6ee028a17 100644 --- a/src/test/ui/parser/trait-pub-method.rs +++ b/src/test/ui/parser/trait-pub-method.rs @@ -1,6 +1,6 @@ trait Foo { pub fn foo(); - //~^ ERROR expected one of `async`, `const`, `extern`, `fn`, `type`, `unsafe`, or `}`, found + //~^ ERROR unnecessary visibility qualifier } fn main() {} diff --git a/src/test/ui/parser/trait-pub-method.stderr b/src/test/ui/parser/trait-pub-method.stderr index d4db961c3fa..b3617a4aa9b 100644 --- a/src/test/ui/parser/trait-pub-method.stderr +++ b/src/test/ui/parser/trait-pub-method.stderr @@ -1,10 +1,8 @@ -error: expected one of `async`, `const`, `extern`, `fn`, `type`, `unsafe`, or `}`, found `pub` +error: unnecessary visibility qualifier --> $DIR/trait-pub-method.rs:2:5 | -LL | trait Foo { - | - expected one of 7 possible tokens here LL | pub fn foo(); - | ^^^ unexpected token + | ^^^ `pub` not permitted here error: aborting due to previous error |
