Auto merge of #37245 - goffrie:recovery, r=nrc
Recover out of an enum or struct's braced block. If we encounter a syntax error inside of a braced block, then we should fail by consuming the rest of the block if possible. This implements such recovery for enums and structs. Fixes #37113.
This commit is contained in:
commit
07436946b6
@ -5145,7 +5145,11 @@ pub fn parse_record_struct_body(&mut self) -> PResult<'a, Vec<StructField>> {
|
||||
let mut fields = Vec::new();
|
||||
if self.eat(&token::OpenDelim(token::Brace)) {
|
||||
while self.token != token::CloseDelim(token::Brace) {
|
||||
fields.push(self.parse_struct_decl_field()?);
|
||||
fields.push(self.parse_struct_decl_field().map_err(|e| {
|
||||
self.recover_stmt();
|
||||
self.eat(&token::CloseDelim(token::Brace));
|
||||
e
|
||||
})?);
|
||||
}
|
||||
|
||||
self.bump();
|
||||
@ -5673,7 +5677,11 @@ fn parse_item_enum(&mut self) -> PResult<'a, ItemInfo> {
|
||||
generics.where_clause = self.parse_where_clause()?;
|
||||
self.expect(&token::OpenDelim(token::Brace))?;
|
||||
|
||||
let enum_definition = self.parse_enum_def(&generics)?;
|
||||
let enum_definition = self.parse_enum_def(&generics).map_err(|e| {
|
||||
self.recover_stmt();
|
||||
self.eat(&token::CloseDelim(token::Brace));
|
||||
e
|
||||
})?;
|
||||
Ok((id, ItemKind::Enum(enum_definition, generics), None))
|
||||
}
|
||||
|
||||
|
21
src/test/parse-fail/issue-37113.rs
Normal file
21
src/test/parse-fail/issue-37113.rs
Normal file
@ -0,0 +1,21 @@
|
||||
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
macro_rules! test_macro {
|
||||
( $( $t:ty ),* $(),*) => {
|
||||
enum SomeEnum {
|
||||
$( $t, )* //~ ERROR expected identifier, found `String`
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {
|
||||
test_macro!(String,);
|
||||
}
|
19
src/test/parse-fail/recover-enum.rs
Normal file
19
src/test/parse-fail/recover-enum.rs
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// compile-flags: -Z parse-only -Z continue-parse-after-error
|
||||
|
||||
fn main() {
|
||||
enum Test {
|
||||
Very
|
||||
Bad //~ ERROR found `Bad`
|
||||
Stuff
|
||||
}
|
||||
}
|
43
src/test/parse-fail/recover-enum2.rs
Normal file
43
src/test/parse-fail/recover-enum2.rs
Normal file
@ -0,0 +1,43 @@
|
||||
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// compile-flags: -Z parse-only -Z continue-parse-after-error
|
||||
|
||||
fn main() {
|
||||
enum Test {
|
||||
Var1,
|
||||
Var2(String),
|
||||
Var3 {
|
||||
abc: {}, //~ ERROR: expected type, found `{`
|
||||
},
|
||||
}
|
||||
|
||||
// recover...
|
||||
let a = 1;
|
||||
enum Test2 {
|
||||
Fine,
|
||||
}
|
||||
|
||||
enum Test3 {
|
||||
StillFine {
|
||||
def: i32,
|
||||
},
|
||||
}
|
||||
|
||||
{
|
||||
// fail again
|
||||
enum Test4 {
|
||||
Nope(i32 {}) //~ ERROR: found `{`
|
||||
//~^ ERROR: found `{`
|
||||
}
|
||||
}
|
||||
// still recover later
|
||||
let bad_syntax = _; //~ ERROR: found `_`
|
||||
}
|
19
src/test/parse-fail/recover-struct.rs
Normal file
19
src/test/parse-fail/recover-struct.rs
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// compile-flags: -Z parse-only -Z continue-parse-after-error
|
||||
|
||||
fn main() {
|
||||
struct Test {
|
||||
Very
|
||||
Bad //~ ERROR found `Bad`
|
||||
Stuff
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user