@@ -1781,7 +1781,7 @@ impl<'a> Parser<'a> {
1781
1781
let mut recovered = Recovered :: No ;
1782
1782
if self . eat ( exp ! ( OpenBrace ) ) {
1783
1783
while self . token != token:: CloseBrace {
1784
- match self . parse_field_def ( adt_ty) {
1784
+ match self . parse_field_def ( adt_ty, ident_span ) {
1785
1785
Ok ( field) => {
1786
1786
fields. push ( field) ;
1787
1787
}
@@ -1894,15 +1894,15 @@ impl<'a> Parser<'a> {
1894
1894
}
1895
1895
1896
1896
/// Parses an element of a struct declaration.
1897
- fn parse_field_def ( & mut self , adt_ty : & str ) -> PResult < ' a , FieldDef > {
1897
+ fn parse_field_def ( & mut self , adt_ty : & str , ident_span : Span ) -> PResult < ' a , FieldDef > {
1898
1898
self . recover_vcs_conflict_marker ( ) ;
1899
1899
let attrs = self . parse_outer_attributes ( ) ?;
1900
1900
self . recover_vcs_conflict_marker ( ) ;
1901
1901
self . collect_tokens ( None , attrs, ForceCollect :: No , |this, attrs| {
1902
1902
let lo = this. token . span ;
1903
1903
let vis = this. parse_visibility ( FollowedByType :: No ) ?;
1904
1904
let safety = this. parse_unsafe_field ( ) ;
1905
- this. parse_single_struct_field ( adt_ty, lo, vis, safety, attrs)
1905
+ this. parse_single_struct_field ( adt_ty, lo, vis, safety, attrs, ident_span )
1906
1906
. map ( |field| ( field, Trailing :: No , UsePreAttrPos :: No ) )
1907
1907
} )
1908
1908
}
@@ -1915,28 +1915,27 @@ impl<'a> Parser<'a> {
1915
1915
vis : Visibility ,
1916
1916
safety : Safety ,
1917
1917
attrs : AttrVec ,
1918
+ ident_span : Span ,
1918
1919
) -> PResult < ' a , FieldDef > {
1919
- let mut seen_comma: bool = false ;
1920
1920
let a_var = self . parse_name_and_ty ( adt_ty, lo, vis, safety, attrs) ?;
1921
- if self . token == token:: Comma {
1922
- seen_comma = true ;
1923
- }
1924
- if self . eat ( exp ! ( Semi ) ) {
1925
- let sp = self . prev_token . span ;
1926
- let mut err =
1927
- self . dcx ( ) . struct_span_err ( sp, format ! ( "{adt_ty} fields are separated by `,`" ) ) ;
1928
- err. span_suggestion_short (
1929
- sp,
1930
- "replace `;` with `,`" ,
1931
- "," ,
1932
- Applicability :: MachineApplicable ,
1933
- ) ;
1934
- return Err ( err) ;
1935
- }
1936
1921
match self . token . kind {
1937
1922
token:: Comma => {
1938
1923
self . bump ( ) ;
1939
1924
}
1925
+ token:: Semi => {
1926
+ self . bump ( ) ;
1927
+ let sp = self . prev_token . span ;
1928
+ let mut err =
1929
+ self . dcx ( ) . struct_span_err ( sp, format ! ( "{adt_ty} fields are separated by `,`" ) ) ;
1930
+ err. span_suggestion_short (
1931
+ sp,
1932
+ "replace `;` with `,`" ,
1933
+ "," ,
1934
+ Applicability :: MachineApplicable ,
1935
+ ) ;
1936
+ err. span_label ( ident_span, format ! ( "while parsing this {adt_ty}" ) ) ;
1937
+ err. emit ( ) ;
1938
+ }
1940
1939
token:: CloseBrace => { }
1941
1940
token:: DocComment ( ..) => {
1942
1941
let previous_span = self . prev_token . span ;
@@ -1945,19 +1944,11 @@ impl<'a> Parser<'a> {
1945
1944
missing_comma : None ,
1946
1945
} ;
1947
1946
self . bump ( ) ; // consume the doc comment
1948
- let comma_after_doc_seen = self . eat ( exp ! ( Comma ) ) ;
1949
- // `seen_comma` is always false, because we are inside doc block
1950
- // condition is here to make code more readable
1951
- if !seen_comma && comma_after_doc_seen {
1952
- seen_comma = true ;
1953
- }
1954
- if comma_after_doc_seen || self . token == token:: CloseBrace {
1947
+ if self . eat ( exp ! ( Comma ) ) || self . token == token:: CloseBrace {
1955
1948
self . dcx ( ) . emit_err ( err) ;
1956
1949
} else {
1957
- if !seen_comma {
1958
- let sp = previous_span. shrink_to_hi ( ) ;
1959
- err. missing_comma = Some ( sp) ;
1960
- }
1950
+ let sp = previous_span. shrink_to_hi ( ) ;
1951
+ err. missing_comma = Some ( sp) ;
1961
1952
return Err ( self . dcx ( ) . create_err ( err) ) ;
1962
1953
}
1963
1954
}
0 commit comments