@@ -1305,7 +1305,8 @@ impl<'a> Parser<'a> {
13051305
13061306 let ( variants, _) = self
13071307 . parse_delim_comma_seq ( Delimiter :: Brace , |p| p. parse_enum_variant ( ) )
1308- . map_err ( |e| {
1308+ . map_err ( |mut e| {
1309+ e. span_label ( id. span , "while parsing this enum" ) ;
13091310 self . recover_stmt ( ) ;
13101311 e
13111312 } ) ?;
@@ -1330,7 +1331,8 @@ impl<'a> Parser<'a> {
13301331
13311332 let struct_def = if this. check ( & token:: OpenDelim ( Delimiter :: Brace ) ) {
13321333 // Parse a struct variant.
1333- let ( fields, recovered) = this. parse_record_struct_body ( "struct" , false ) ?;
1334+ let ( fields, recovered) =
1335+ this. parse_record_struct_body ( "struct" , ident. span , false ) ?;
13341336 VariantData :: Struct ( fields, recovered)
13351337 } else if this. check ( & token:: OpenDelim ( Delimiter :: Parenthesis ) ) {
13361338 VariantData :: Tuple ( this. parse_tuple_struct_body ( ) ?, DUMMY_NODE_ID )
@@ -1384,17 +1386,23 @@ impl<'a> Parser<'a> {
13841386 VariantData :: Unit ( DUMMY_NODE_ID )
13851387 } else {
13861388 // If we see: `struct Foo<T> where T: Copy { ... }`
1387- let ( fields, recovered) =
1388- self . parse_record_struct_body ( "struct" , generics. where_clause . has_where_token ) ?;
1389+ let ( fields, recovered) = self . parse_record_struct_body (
1390+ "struct" ,
1391+ class_name. span ,
1392+ generics. where_clause . has_where_token ,
1393+ ) ?;
13891394 VariantData :: Struct ( fields, recovered)
13901395 }
13911396 // No `where` so: `struct Foo<T>;`
13921397 } else if self . eat ( & token:: Semi ) {
13931398 VariantData :: Unit ( DUMMY_NODE_ID )
13941399 // Record-style struct definition
13951400 } else if self . token == token:: OpenDelim ( Delimiter :: Brace ) {
1396- let ( fields, recovered) =
1397- self . parse_record_struct_body ( "struct" , generics. where_clause . has_where_token ) ?;
1401+ let ( fields, recovered) = self . parse_record_struct_body (
1402+ "struct" ,
1403+ class_name. span ,
1404+ generics. where_clause . has_where_token ,
1405+ ) ?;
13981406 VariantData :: Struct ( fields, recovered)
13991407 // Tuple-style struct definition with optional where-clause.
14001408 } else if self . token == token:: OpenDelim ( Delimiter :: Parenthesis ) {
@@ -1423,12 +1431,18 @@ impl<'a> Parser<'a> {
14231431
14241432 let vdata = if self . token . is_keyword ( kw:: Where ) {
14251433 generics. where_clause = self . parse_where_clause ( ) ?;
1426- let ( fields, recovered) =
1427- self . parse_record_struct_body ( "union" , generics. where_clause . has_where_token ) ?;
1434+ let ( fields, recovered) = self . parse_record_struct_body (
1435+ "union" ,
1436+ class_name. span ,
1437+ generics. where_clause . has_where_token ,
1438+ ) ?;
14281439 VariantData :: Struct ( fields, recovered)
14291440 } else if self . token == token:: OpenDelim ( Delimiter :: Brace ) {
1430- let ( fields, recovered) =
1431- self . parse_record_struct_body ( "union" , generics. where_clause . has_where_token ) ?;
1441+ let ( fields, recovered) = self . parse_record_struct_body (
1442+ "union" ,
1443+ class_name. span ,
1444+ generics. where_clause . has_where_token ,
1445+ ) ?;
14321446 VariantData :: Struct ( fields, recovered)
14331447 } else {
14341448 let token_str = super :: token_descr ( & self . token ) ;
@@ -1444,6 +1458,7 @@ impl<'a> Parser<'a> {
14441458 fn parse_record_struct_body (
14451459 & mut self ,
14461460 adt_ty : & str ,
1461+ ident_span : Span ,
14471462 parsed_where : bool ,
14481463 ) -> PResult < ' a , ( Vec < FieldDef > , /* recovered */ bool ) > {
14491464 let mut fields = Vec :: new ( ) ;
@@ -1458,6 +1473,7 @@ impl<'a> Parser<'a> {
14581473 match field {
14591474 Ok ( field) => fields. push ( field) ,
14601475 Err ( mut err) => {
1476+ err. span_label ( ident_span, format ! ( "while parsing this {adt_ty}" ) ) ;
14611477 err. emit ( ) ;
14621478 break ;
14631479 }
0 commit comments