diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-12-03 13:11:34 +0100 | 
|---|---|---|
| committer | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-12-20 22:41:29 +0100 | 
| commit | 4e01b709640d9760758a19ef0dc3732991c14d30 (patch) | |
| tree | 694280c46f0630be34afedc1960b8bc947df45f3 | |
| parent | 3ed5ba7fa867d84ca9e7bc9213a5b571fdb7c5ed (diff) | |
| download | rust-4e01b709640d9760758a19ef0dc3732991c14d30.tar.gz rust-4e01b709640d9760758a19ef0dc3732991c14d30.zip  | |
add recovery to parse_labeled_expr
| -rw-r--r-- | src/librustc_parse/parser/expr.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/parser/recover-labeled-non-block-expr.rs | 5 | ||||
| -rw-r--r-- | src/test/ui/parser/recover-labeled-non-block-expr.stderr | 17 | 
3 files changed, 27 insertions, 3 deletions
diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs index 923e5d378c5..bfb10dd0f3a 100644 --- a/src/librustc_parse/parser/expr.rs +++ b/src/librustc_parse/parser/expr.rs @@ -1096,9 +1096,11 @@ impl<'a> Parser<'a> { } let msg = "expected `while`, `for`, `loop` or `{` after a label"; - let mut err = self.fatal(msg); - err.span_label(self.token.span, msg); - return Err(err); + self.struct_span_err(self.token.span, msg) + .span_label(self.token.span, msg) + .emit(); + // Continue as an expression in an effort to recover on `'label: non_block_expr`. + self.parse_expr() } /// Returns a string literal if the next token is a string literal. diff --git a/src/test/ui/parser/recover-labeled-non-block-expr.rs b/src/test/ui/parser/recover-labeled-non-block-expr.rs new file mode 100644 index 00000000000..be92170acf0 --- /dev/null +++ b/src/test/ui/parser/recover-labeled-non-block-expr.rs @@ -0,0 +1,5 @@ +fn main() { + 'label: 1 + 1; //~ ERROR expected `while`, `for`, `loop` or `{` after a label + + let _recovery_witness: () = 0; //~ ERROR mismatched types +} diff --git a/src/test/ui/parser/recover-labeled-non-block-expr.stderr b/src/test/ui/parser/recover-labeled-non-block-expr.stderr new file mode 100644 index 00000000000..771a915288c --- /dev/null +++ b/src/test/ui/parser/recover-labeled-non-block-expr.stderr @@ -0,0 +1,17 @@ +error: expected `while`, `for`, `loop` or `{` after a label + --> $DIR/recover-labeled-non-block-expr.rs:2:13 + | +LL | 'label: 1 + 1; + | ^ expected `while`, `for`, `loop` or `{` after a label + +error[E0308]: mismatched types + --> $DIR/recover-labeled-non-block-expr.rs:4:33 + | +LL | let _recovery_witness: () = 0; + | -- ^ expected `()`, found integer + | | + | expected due to this + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0308`.  | 
