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-07-23 11:19:13 -0700
committerEsteban Küber <esteban@kuber.com.ar>2019-07-23 11:19:13 -0700
commitf56c8f6ea426ac24d221b982ff9ee43b77fc9400 (patch)
tree119bbfb8413b14f7da566c6e1433c60609907295 /src/libsyntax/parse
parent5b3b6b8d00df27c46d6254c737b40e79bebcced2 (diff)
downloadrust-f56c8f6ea426ac24d221b982ff9ee43b77fc9400.tar.gz
rust-f56c8f6ea426ac24d221b982ff9ee43b77fc9400.zip
Fix another case
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 197a9078b18..e494cb472a8 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -7670,8 +7670,9 @@ impl<'a> Parser<'a> {
         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 @@ impl<'a> Parser<'a> {
         // 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