about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-03-09 15:14:22 -0800
committerEsteban Küber <esteban@kuber.com.ar>2019-03-16 17:47:57 -0700
commit1aa43af37018f285544b234d65b24efb465d18cb (patch)
tree4340918c78915f7baea36a750e4655c6506591fd
parentb2b9555f95851cd24bcda6801a41ad9a1dfa4ae7 (diff)
downloadrust-1aa43af37018f285544b234d65b24efb465d18cb.tar.gz
rust-1aa43af37018f285544b234d65b24efb465d18cb.zip
parse full visibility when recovering
-rw-r--r--src/libsyntax/parse/parser.rs14
-rw-r--r--src/test/ui/issues/issue-28433.rs4
-rw-r--r--src/test/ui/issues/issue-28433.stderr8
3 files changed, 19 insertions, 7 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index ce643545e71..0ec8cb51fa7 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -8623,11 +8623,15 @@ impl<'a> Parser<'a> {
     /// 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();
+            match self.parse_visibility(false) {
+                Ok(vis) => {
+                    let mut err = self.diagnostic()
+                        .struct_span_err(vis.span, "unnecessary visibility qualifier");
+                    err.span_label(vis.span, "`pub` not permitted here");
+                    err.emit();
+                }
+                Err(mut err) => err.emit(),
+            }
         }
     }
 }
diff --git a/src/test/ui/issues/issue-28433.rs b/src/test/ui/issues/issue-28433.rs
index 229b334a596..2bbb32bf2b3 100644
--- a/src/test/ui/issues/issue-28433.rs
+++ b/src/test/ui/issues/issue-28433.rs
@@ -3,7 +3,9 @@
 enum Bird {
     pub Duck,
     //~^ ERROR unnecessary visibility qualifier
-    Goose
+    Goose,
+    pub(crate) Dove
+    //~^ ERROR unnecessary visibility qualifier
 }
 
 
diff --git a/src/test/ui/issues/issue-28433.stderr b/src/test/ui/issues/issue-28433.stderr
index 51be15a3e31..cfdbf6c7287 100644
--- a/src/test/ui/issues/issue-28433.stderr
+++ b/src/test/ui/issues/issue-28433.stderr
@@ -4,5 +4,11 @@ error: unnecessary visibility qualifier
 LL |     pub Duck,
    |     ^^^ `pub` not permitted here
 
-error: aborting due to previous error
+error: unnecessary visibility qualifier
+  --> $DIR/issue-28433.rs:7:5
+   |
+LL |     pub(crate) Dove
+   |     ^^^^^^^^^^ `pub` not permitted here
+
+error: aborting due to 2 previous errors