]> git.lizzy.rs Git - rust.git/commitdiff
Make the parser TokenStream more resilient after mismatched delimiter recovery
authorEsteban Küber <esteban@kuber.com.ar>
Tue, 23 Jul 2019 01:29:49 +0000 (18:29 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Tue, 23 Jul 2019 01:29:49 +0000 (18:29 -0700)
src/libsyntax/parse/parser.rs
src/test/ui/issues/issue-62881.rs [new file with mode: 0644]
src/test/ui/issues/issue-62881.stderr [new file with mode: 0644]

index 1d4d02c7325826118bbefbf57101b84f77c19b9c..197a9078b18887e1d125d0259d04659dba441437 100644 (file)
@@ -7670,6 +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)
+            return Ok((ret?, TokenStream::new(vec![])));
         } else {
             &mut self.token_cursor.stack[prev].last_token
         };
diff --git a/src/test/ui/issues/issue-62881.rs b/src/test/ui/issues/issue-62881.rs
new file mode 100644 (file)
index 0000000..1782c2e
--- /dev/null
@@ -0,0 +1,6 @@
+fn main() {}
+
+fn f() -> isize { fn f() -> isize {} pub f<
+//~^ ERROR missing `fn` or `struct` for function or struct definition
+//~| ERROR mismatched types
+//~ ERROR this file contains an un-closed delimiter
diff --git a/src/test/ui/issues/issue-62881.stderr b/src/test/ui/issues/issue-62881.stderr
new file mode 100644 (file)
index 0000000..85c3575
--- /dev/null
@@ -0,0 +1,29 @@
+error: this file contains an un-closed delimiter
+  --> $DIR/issue-62881.rs:6:53
+   |
+LL | fn f() -> isize { fn f() -> isize {} pub f<
+   |                 - un-closed delimiter
+...
+LL |
+   |                                                     ^
+
+error: missing `fn` or `struct` for function or struct definition
+  --> $DIR/issue-62881.rs:3:41
+   |
+LL | fn f() -> isize { fn f() -> isize {} pub f<
+   |                                         ^
+
+error[E0308]: mismatched types
+  --> $DIR/issue-62881.rs:3:29
+   |
+LL | fn f() -> isize { fn f() -> isize {} pub f<
+   |                      -      ^^^^^ expected isize, found ()
+   |                      |
+   |                      this function's body doesn't return
+   |
+   = note: expected type `isize`
+              found type `()`
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0308`.