Skip to content

Commit

Permalink
Rollup merge of #102143 - Rageking8:fix-101540, r=TaKO8Ki
Browse files Browse the repository at this point in the history
Recover from struct nested in struct

Fixes #101540

r? `@TaKO8Ki`

Not sure If I have done it right.
  • Loading branch information
fee1-dead authored Sep 26, 2022
2 parents 3288d3a + c66c2e8 commit 0adf293
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
17 changes: 17 additions & 0 deletions compiler/rustc_parse/src/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1715,6 +1715,7 @@ impl<'a> Parser<'a> {
fn parse_field_ident(&mut self, adt_ty: &str, lo: Span) -> PResult<'a, Ident> {
let (ident, is_raw) = self.ident_or_err()?;
if !is_raw && ident.is_reserved() {
let snapshot = self.create_snapshot_for_diagnostic();
let err = if self.check_fn_front_matter(false) {
let inherited_vis = Visibility {
span: rustc_span::DUMMY_SP,
Expand All @@ -1735,6 +1736,22 @@ impl<'a> Parser<'a> {
err.help("unlike in C++, Java, and C#, functions are declared in `impl` blocks");
err.help("see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information");
err
} else if self.eat_keyword(kw::Struct) {
match self.parse_item_struct() {
Ok((ident, _)) => {
let mut err = self.struct_span_err(
lo.with_hi(ident.span.hi()),
&format!("structs are not allowed in {adt_ty} definitions"),
);
err.help("consider creating a new `struct` definition instead of nesting");
err
}
Err(err) => {
err.cancel();
self.restore_snapshot(snapshot);
self.expected_ident_found()
}
}
} else {
self.expected_ident_found()
};
Expand Down
7 changes: 7 additions & 0 deletions src/test/ui/parser/issues/issue-101540.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
struct S1 {
struct S2 {
//~^ ERROR structs are not allowed in struct definitions
}
}

fn main() {}
10 changes: 10 additions & 0 deletions src/test/ui/parser/issues/issue-101540.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
error: structs are not allowed in struct definitions
--> $DIR/issue-101540.rs:2:5
|
LL | struct S2 {
| ^^^^^^^^^
|
= help: consider creating a new `struct` definition instead of nesting

error: aborting due to previous error

0 comments on commit 0adf293

Please sign in to comment.