Skip to content

Commit

Permalink
Rollup merge of rust-lang#101457 - ChayimFriedman2:struct-field-semi,…
Browse files Browse the repository at this point in the history
… r=fee1-dead

Recover from using `;` as separator between fields

Partially fixes rust-lang#101440 (only for record structs).

Doing that for tuple structs is harder as their parsing passes through a bunch of helper functions. I don't know how to do that. But [their error message is better anyway](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=cc6ee8bb2593596c0cea89d49e79bcb4) and suggests using a comma, even if it doesn't suggest replacing the semicolon with it.
  • Loading branch information
GuillaumeGomez authored Sep 6, 2022
2 parents 7c7548c + fbf11cf commit 78968e5
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 3 deletions.
11 changes: 11 additions & 0 deletions compiler/rustc_parse/src/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1526,6 +1526,17 @@ impl<'a> Parser<'a> {
if self.token == token::Comma {
seen_comma = true;
}
if self.eat(&token::Semi) {
let sp = self.prev_token.span;
let mut err = self.struct_span_err(sp, format!("{adt_ty} fields are separated by `,`"));
err.span_suggestion_short(
sp,
"replace `;` with `,`",
",",
Applicability::MachineApplicable,
);
return Err(err);
}
match self.token.kind {
token::Comma => {
self.bump();
Expand Down
16 changes: 16 additions & 0 deletions src/test/ui/parser/recover-field-semi.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
struct Foo {
foo: i32;
//~^ ERROR struct fields are separated by `,`
}

union Bar { //~ ERROR
foo: i32;
//~^ ERROR union fields are separated by `,`
}

enum Baz {
Qux { foo: i32; }
//~^ ERROR struct fields are separated by `,`
}

fn main() {}
29 changes: 29 additions & 0 deletions src/test/ui/parser/recover-field-semi.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
error: struct fields are separated by `,`
--> $DIR/recover-field-semi.rs:2:13
|
LL | foo: i32;
| ^ help: replace `;` with `,`

error: union fields are separated by `,`
--> $DIR/recover-field-semi.rs:7:13
|
LL | foo: i32;
| ^ help: replace `;` with `,`

error: struct fields are separated by `,`
--> $DIR/recover-field-semi.rs:12:19
|
LL | Qux { foo: i32; }
| ^ help: replace `;` with `,`

error: unions cannot have zero fields
--> $DIR/recover-field-semi.rs:6:1
|
LL | / union Bar {
LL | | foo: i32;
LL | |
LL | | }
| |_^

error: aborting due to 4 previous errors

2 changes: 1 addition & 1 deletion src/test/ui/parser/removed-syntax-field-semicolon.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
struct S {
bar: ();
//~^ ERROR expected `,`, or `}`, found `;`
//~^ ERROR struct fields are separated by `,`
}

fn main() {}
4 changes: 2 additions & 2 deletions src/test/ui/parser/removed-syntax-field-semicolon.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error: expected `,`, or `}`, found `;`
error: struct fields are separated by `,`
--> $DIR/removed-syntax-field-semicolon.rs:2:12
|
LL | bar: ();
| ^
| ^ help: replace `;` with `,`

error: aborting due to previous error

0 comments on commit 78968e5

Please sign in to comment.