]> git.lizzy.rs Git - rust.git/commitdiff
Fix another case
authorEsteban Küber <esteban@kuber.com.ar>
Tue, 23 Jul 2019 18:19:13 +0000 (11:19 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Tue, 23 Jul 2019 18:19:13 +0000 (11:19 -0700)
src/libsyntax/parse/parser.rs
src/test/ui/issues/issue-62895.rs [new file with mode: 0644]
src/test/ui/issues/issue-62895.stderr [new file with mode: 0644]

index 197a9078b18887e1d125d0259d04659dba441437..e494cb472a825c89be3008bf9965274e0e376836 100644 (file)
@@ -7670,8 +7670,9 @@ fn collect_tokens<F, R>(&mut self, f: F) -> PResult<'a, (R, TokenStream)>
         let ret = f(self);
         let last_token = if self.token_cursor.stack.len() == prev {
             &mut self.token_cursor.frame.last_token
-        } else if self.token_cursor.stack.is_empty() {//&& !self.unclosed_delims.is_empty() {
-            // This can happen with mismatched delimiters (#62881)
+        } else if self.token_cursor.stack.get(prev).is_none() {
+            // This can happen due to a bad interaction of two unrelated recovery mechanisms with
+            // mismatched delimiters *and* recovery lookahead on `pub ident(` likely typo (#62881)
             return Ok((ret?, TokenStream::new(vec![])));
         } else {
             &mut self.token_cursor.stack[prev].last_token
@@ -7680,7 +7681,15 @@ fn collect_tokens<F, R>(&mut self, f: F) -> PResult<'a, (R, TokenStream)>
         // Pull out the tokens that we've collected from the call to `f` above.
         let mut collected_tokens = match *last_token {
             LastToken::Collecting(ref mut v) => mem::take(v),
-            LastToken::Was(_) => panic!("our vector went away?"),
+            LastToken::Was(ref was) => {
+                let msg = format!("our vector went away? - found Was({:?})", was);
+                debug!("collect_tokens: {}", msg);
+                self.sess.span_diagnostic.delay_span_bug(self.token.span, &msg);
+                // This can happen due to a bad interaction of two unrelated recovery mechanisms
+                // with mismatched delimiters *and* recovery lookahead on `pub ident(` likely typo
+                // (#62895, different but similar to the case above)
+                return Ok((ret?, TokenStream::new(vec![])));
+            }
         };
 
         // If we're not at EOF our current token wasn't actually consumed by
diff --git a/src/test/ui/issues/issue-62895.rs b/src/test/ui/issues/issue-62895.rs
new file mode 100644 (file)
index 0000000..53f1740
--- /dev/null
@@ -0,0 +1,11 @@
+fn main() {}
+
+fn v() -> isize { //~ ERROR mismatched types
+mod _ { //~ ERROR expected identifier
+pub fn g() -> isizee { //~ ERROR cannot find type `isizee` in this scope
+mod _ { //~ ERROR expected identifier
+pub    g() -> is //~ ERROR missing `fn` for function definition
+(), w20);
+}
+(), w20); //~ ERROR expected item, found `;`
+}
diff --git a/src/test/ui/issues/issue-62895.stderr b/src/test/ui/issues/issue-62895.stderr
new file mode 100644 (file)
index 0000000..7def7b5
--- /dev/null
@@ -0,0 +1,49 @@
+error: expected identifier, found reserved identifier `_`
+  --> $DIR/issue-62895.rs:4:5
+   |
+LL | mod _ {
+   |     ^ expected identifier, found reserved identifier
+
+error: expected identifier, found reserved identifier `_`
+  --> $DIR/issue-62895.rs:6:5
+   |
+LL | mod _ {
+   |     ^ expected identifier, found reserved identifier
+
+error: missing `fn` for function definition
+  --> $DIR/issue-62895.rs:7:4
+   |
+LL | pub    g() -> is
+   |    ^^^^
+help: add `fn` here to parse `g` as a public function
+   |
+LL | pub fn g() -> is
+   |     ^^
+
+error: expected item, found `;`
+  --> $DIR/issue-62895.rs:10:9
+   |
+LL | (), w20);
+   |         ^ help: remove this semicolon
+
+error[E0412]: cannot find type `isizee` in this scope
+  --> $DIR/issue-62895.rs:5:15
+   |
+LL | pub fn g() -> isizee {
+   |               ^^^^^^ help: a builtin type with a similar name exists: `isize`
+
+error[E0308]: mismatched types
+  --> $DIR/issue-62895.rs:3:11
+   |
+LL | fn v() -> isize {
+   |    -      ^^^^^ expected isize, found ()
+   |    |
+   |    this function's body doesn't return
+   |
+   = note: expected type `isize`
+              found type `()`
+
+error: aborting due to 6 previous errors
+
+Some errors have detailed explanations: E0308, E0412.
+For more information about an error, try `rustc --explain E0308`.