Skip to content

Commit 4f44dee

Browse files
committed
add a label to struct/enum/union ident name
1 parent e123a61 commit 4f44dee

22 files changed

+91
-16
lines changed

Diff for: compiler/rustc_parse/src/parser/item.rs

+26-10
Original file line numberDiff line numberDiff line change
@@ -1318,7 +1318,8 @@ impl<'a> Parser<'a> {
13181318
(vec![], false)
13191319
} else {
13201320
self.parse_delim_comma_seq(Delimiter::Brace, |p| p.parse_enum_variant()).map_err(
1321-
|e| {
1321+
|mut e| {
1322+
e.span_label(id.span, "while parsing this enum");
13221323
self.recover_stmt();
13231324
e
13241325
},
@@ -1345,7 +1346,8 @@ impl<'a> Parser<'a> {
13451346

13461347
let struct_def = if this.check(&token::OpenDelim(Delimiter::Brace)) {
13471348
// Parse a struct variant.
1348-
let (fields, recovered) = this.parse_record_struct_body("struct", false)?;
1349+
let (fields, recovered) =
1350+
this.parse_record_struct_body("struct", ident.span, false)?;
13491351
VariantData::Struct(fields, recovered)
13501352
} else if this.check(&token::OpenDelim(Delimiter::Parenthesis)) {
13511353
VariantData::Tuple(this.parse_tuple_struct_body()?, DUMMY_NODE_ID)
@@ -1399,17 +1401,23 @@ impl<'a> Parser<'a> {
13991401
VariantData::Unit(DUMMY_NODE_ID)
14001402
} else {
14011403
// If we see: `struct Foo<T> where T: Copy { ... }`
1402-
let (fields, recovered) =
1403-
self.parse_record_struct_body("struct", generics.where_clause.has_where_token)?;
1404+
let (fields, recovered) = self.parse_record_struct_body(
1405+
"struct",
1406+
class_name.span,
1407+
generics.where_clause.has_where_token,
1408+
)?;
14041409
VariantData::Struct(fields, recovered)
14051410
}
14061411
// No `where` so: `struct Foo<T>;`
14071412
} else if self.eat(&token::Semi) {
14081413
VariantData::Unit(DUMMY_NODE_ID)
14091414
// Record-style struct definition
14101415
} else if self.token == token::OpenDelim(Delimiter::Brace) {
1411-
let (fields, recovered) =
1412-
self.parse_record_struct_body("struct", generics.where_clause.has_where_token)?;
1416+
let (fields, recovered) = self.parse_record_struct_body(
1417+
"struct",
1418+
class_name.span,
1419+
generics.where_clause.has_where_token,
1420+
)?;
14131421
VariantData::Struct(fields, recovered)
14141422
// Tuple-style struct definition with optional where-clause.
14151423
} else if self.token == token::OpenDelim(Delimiter::Parenthesis) {
@@ -1438,12 +1446,18 @@ impl<'a> Parser<'a> {
14381446

14391447
let vdata = if self.token.is_keyword(kw::Where) {
14401448
generics.where_clause = self.parse_where_clause()?;
1441-
let (fields, recovered) =
1442-
self.parse_record_struct_body("union", generics.where_clause.has_where_token)?;
1449+
let (fields, recovered) = self.parse_record_struct_body(
1450+
"union",
1451+
class_name.span,
1452+
generics.where_clause.has_where_token,
1453+
)?;
14431454
VariantData::Struct(fields, recovered)
14441455
} else if self.token == token::OpenDelim(Delimiter::Brace) {
1445-
let (fields, recovered) =
1446-
self.parse_record_struct_body("union", generics.where_clause.has_where_token)?;
1456+
let (fields, recovered) = self.parse_record_struct_body(
1457+
"union",
1458+
class_name.span,
1459+
generics.where_clause.has_where_token,
1460+
)?;
14471461
VariantData::Struct(fields, recovered)
14481462
} else {
14491463
let token_str = super::token_descr(&self.token);
@@ -1459,6 +1473,7 @@ impl<'a> Parser<'a> {
14591473
fn parse_record_struct_body(
14601474
&mut self,
14611475
adt_ty: &str,
1476+
ident_span: Span,
14621477
parsed_where: bool,
14631478
) -> PResult<'a, (Vec<FieldDef>, /* recovered */ bool)> {
14641479
let mut fields = Vec::new();
@@ -1473,6 +1488,7 @@ impl<'a> Parser<'a> {
14731488
match field {
14741489
Ok(field) => fields.push(field),
14751490
Err(mut err) => {
1491+
err.span_label(ident_span, format!("while parsing this {adt_ty}"));
14761492
err.emit();
14771493
break;
14781494
}

Diff for: src/test/ui/async-await/await-keyword/2018-edition-error-in-non-macro-position.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ error: expected identifier, found keyword `await`
4646
--> $DIR/2018-edition-error-in-non-macro-position.rs:13:14
4747
|
4848
LL | struct Foo { await: () }
49-
| ^^^^^ expected identifier, found keyword
49+
| --- ^^^^^ expected identifier, found keyword
50+
| |
51+
| while parsing this struct
5052
|
5153
help: escape `await` to use it as an identifier
5254
|

Diff for: src/test/ui/parser/doc-before-struct-rbrace-1.stderr

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
error[E0585]: found a documentation comment that doesn't document anything
22
--> $DIR/doc-before-struct-rbrace-1.rs:3:5
33
|
4+
LL | struct X {
5+
| - while parsing this struct
6+
LL | a: u8,
47
LL | /// document
58
| ^^^^^^^^^^^^
69
|

Diff for: src/test/ui/parser/fn-field-parse-error-ice.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ LL | inner : dyn fn ()
77
error: functions are not allowed in struct definitions
88
--> $DIR/fn-field-parse-error-ice.rs:4:17
99
|
10+
LL | struct Baz {
11+
| --- while parsing this struct
1012
LL | inner : dyn fn ()
1113
| ^^
1214
|

Diff for: src/test/ui/parser/issues/issue-48636.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error[E0585]: found a documentation comment that doesn't document anything
22
--> $DIR/issue-48636.rs:7:5
33
|
4+
LL | struct S {
5+
| - while parsing this struct
46
LL | x: u8
57
| - help: missing comma here: `,`
68
LL | /// The ID of the parent core

Diff for: src/test/ui/parser/issues/issue-68000-unicode-ident-after-missing-comma.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ LL | pub bar: Vec<i32>ö
77
error: expected `:`, found `}`
88
--> $DIR/issue-68000-unicode-ident-after-missing-comma.rs:4:1
99
|
10+
LL | pub struct Foo {
11+
| --- while parsing this struct
1012
LL | pub bar: Vec<i32>ö
1113
| - expected `:`
1214
LL |

Diff for: src/test/ui/parser/macro/issue-37113.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error: expected identifier, found `String`
22
--> $DIR/issue-37113.rs:4:16
33
|
4+
LL | enum SomeEnum {
5+
| -------- while parsing this enum
46
LL | $( $t, )*
57
| ^^ expected identifier
68
...

Diff for: src/test/ui/parser/mismatched-braces/missing-close-brace-in-struct.stderr

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ LL | fn main() {}
1010
error: expected identifier, found keyword `trait`
1111
--> $DIR/missing-close-brace-in-struct.rs:4:1
1212
|
13+
LL | pub(crate) struct Bar<T> {
14+
| --- while parsing this struct
15+
...
1316
LL | trait T {
1417
| ^^^^^ expected identifier, found keyword
1518

Diff for: src/test/ui/parser/missing-closing-angle-bracket-struct-field-ty.stderr

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
error: expected one of `>`, a const expression, lifetime, or type, found `}`
22
--> $DIR/missing-closing-angle-bracket-struct-field-ty.rs:9:1
33
|
4+
LL | pub struct Foo {
5+
| --- while parsing this struct
6+
...
47
LL | c: Arc<Mutex<usize>>,
58
| - expected one of `>`, a const expression, lifetime, or type
69
LL | }

Diff for: src/test/ui/parser/recover-enum2.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error: expected type, found `{`
22
--> $DIR/recover-enum2.rs:6:18
33
|
4+
LL | Var3 {
5+
| ---- while parsing this struct
46
LL | abc: {},
57
| ^ expected type
68

Diff for: src/test/ui/parser/recover-field-semi.stderr

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
error: struct fields are separated by `,`
22
--> $DIR/recover-field-semi.rs:2:13
33
|
4+
LL | struct Foo {
5+
| --- while parsing this struct
46
LL | foo: i32;
57
| ^ help: replace `;` with `,`
68

79
error: union fields are separated by `,`
810
--> $DIR/recover-field-semi.rs:7:13
911
|
12+
LL | union Bar {
13+
| --- while parsing this union
1014
LL | foo: i32;
1115
| ^ help: replace `;` with `,`
1216

1317
error: struct fields are separated by `,`
1418
--> $DIR/recover-field-semi.rs:12:19
1519
|
1620
LL | Qux { foo: i32; }
17-
| ^ help: replace `;` with `,`
21+
| --- ^ help: replace `;` with `,`
22+
| |
23+
| while parsing this struct
1824

1925
error: unions cannot have zero fields
2026
--> $DIR/recover-field-semi.rs:6:1

Diff for: src/test/ui/parser/recover-struct.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error: expected `:`, found `Bad`
22
--> $DIR/recover-struct.rs:4:9
33
|
4+
LL | struct Test {
5+
| ---- while parsing this struct
46
LL | Very
57
| - expected `:`
68
LL | Bad

Diff for: src/test/ui/parser/recovered-struct-variant.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ error: expected `:`, found `,`
22
--> $DIR/recovered-struct-variant.rs:2:10
33
|
44
LL | A { a, b: usize }
5-
| ^ expected `:`
5+
| - ^ expected `:`
6+
| |
7+
| while parsing this struct
68

79
error: aborting due to previous error
810

Diff for: src/test/ui/parser/removed-syntax-enum-newtype.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ error: expected one of `<`, `where`, or `{`, found `=`
22
--> $DIR/removed-syntax-enum-newtype.rs:1:8
33
|
44
LL | enum e = isize;
5-
| ^ expected one of `<`, `where`, or `{`
5+
| - ^ expected one of `<`, `where`, or `{`
6+
| |
7+
| while parsing this enum
68

79
error: aborting due to previous error
810

Diff for: src/test/ui/parser/removed-syntax-field-let.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error: expected identifier, found keyword `let`
22
--> $DIR/removed-syntax-field-let.rs:2:5
33
|
4+
LL | struct S {
5+
| - while parsing this struct
46
LL | let foo: (),
57
| ^^^ expected identifier, found keyword
68

Diff for: src/test/ui/parser/removed-syntax-field-semicolon.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error: struct fields are separated by `,`
22
--> $DIR/removed-syntax-field-semicolon.rs:2:12
33
|
4+
LL | struct S {
5+
| - while parsing this struct
46
LL | bar: ();
57
| ^ help: replace `;` with `,`
68

Diff for: src/test/ui/pattern/issue-66270-pat-struct-parser-recovery.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error: expected type, found `0`
22
--> $DIR/issue-66270-pat-struct-parser-recovery.rs:4:22
33
|
4+
LL | struct Bug {
5+
| --- while parsing this struct
46
LL | incorrect_field: 0,
57
| ^ expected type
68

Diff for: src/test/ui/proc-macro/derive-bad.stderr

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ error: expected `:`, found `}`
22
--> $DIR/derive-bad.rs:6:10
33
|
44
LL | #[derive(A)]
5-
| ^ expected `:`
5+
| ^
6+
| |
7+
| expected `:`
8+
| while parsing this struct
69
|
710
= note: this error originates in the derive macro `A` (in Nightly builds, run with -Z macro-backtrace for more info)
811

Diff for: src/test/ui/pub/pub-restricted-error.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error: expected identifier, found `(`
22
--> $DIR/pub-restricted-error.rs:4:16
33
|
4+
LL | struct Foo {
5+
| --- while parsing this struct
46
LL | pub(crate) () foo: usize,
57
| ^ expected identifier
68

Diff for: src/test/ui/structs/struct-fn-in-definition.stderr

+9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
error: functions are not allowed in struct definitions
22
--> $DIR/struct-fn-in-definition.rs:9:5
33
|
4+
LL | struct S {
5+
| - while parsing this struct
6+
...
47
LL | fn foo() {}
58
| ^^^^^^^^^^^
69
|
@@ -10,6 +13,9 @@ LL | fn foo() {}
1013
error: functions are not allowed in union definitions
1114
--> $DIR/struct-fn-in-definition.rs:18:5
1215
|
16+
LL | union U {
17+
| - while parsing this union
18+
...
1319
LL | fn foo() {}
1420
| ^^^^^^^^^^^
1521
|
@@ -19,6 +25,9 @@ LL | fn foo() {}
1925
error: functions are not allowed in enum definitions
2026
--> $DIR/struct-fn-in-definition.rs:27:5
2127
|
28+
LL | enum E {
29+
| - while parsing this enum
30+
...
2231
LL | fn foo() {}
2332
| ^^^^^^^^^^^
2433
|

Diff for: src/test/ui/suggestions/struct-field-type-including-single-colon.stderr

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ LL | a: foo::A,
1212
error: expected `,`, or `}`, found `:`
1313
--> $DIR/struct-field-type-including-single-colon.rs:9:11
1414
|
15+
LL | struct Foo {
16+
| --- while parsing this struct
1517
LL | a: foo:A,
1618
| ^
1719

@@ -29,6 +31,8 @@ LL | b: foo::bar::B,
2931
error: expected `,`, or `}`, found `:`
3032
--> $DIR/struct-field-type-including-single-colon.rs:15:16
3133
|
34+
LL | struct Bar {
35+
| --- while parsing this struct
3236
LL | b: foo::bar:B,
3337
| ^
3438

Diff for: src/test/ui/typeck/issue-69378-ice-on-invalid-type-node-after-recovery.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ error: expected identifier, found `0`
22
--> $DIR/issue-69378-ice-on-invalid-type-node-after-recovery.rs:3:14
33
|
44
LL | struct Foo { 0: u8 }
5-
| ^ expected identifier
5+
| --- ^ expected identifier
6+
| |
7+
| while parsing this struct
68

79
error: aborting due to previous error
810

0 commit comments

Comments
 (0)