@@ -707,9 +707,9 @@ impl<'a> Parser<'a> {
707
707
}
708
708
match parse_item ( self ) {
709
709
Ok ( None ) => {
710
- let is_unnecessary_semicolon = !items. is_empty ( )
710
+ let mut is_unnecessary_semicolon = !items. is_empty ( )
711
711
// When the close delim is `)` in a case like the following, `token.kind` is expected to be `token::CloseDelim(Delimiter::Parenthesis)`,
712
- // but the actual `token.kind` is `token::CloseDelim(Delimiter::Bracket )`.
712
+ // but the actual `token.kind` is `token::CloseDelim(Delimiter::Brace )`.
713
713
// This is because the `token.kind` of the close delim is treated as the same as
714
714
// that of the open delim in `TokenTreesReader::parse_token_tree`, even if the delimiters of them are different.
715
715
// Therefore, `token.kind` should not be compared here.
@@ -728,7 +728,13 @@ impl<'a> Parser<'a> {
728
728
. span_to_snippet ( self . prev_token . span )
729
729
. map_or ( false , |snippet| snippet == "}" )
730
730
&& self . token . kind == token:: Semi ;
731
- let semicolon_span = self . token . span ;
731
+ let mut semicolon_span = self . token . span ;
732
+ if !is_unnecessary_semicolon {
733
+ // #105369, Detect spurious `;` before assoc fn body
734
+ is_unnecessary_semicolon = self . token == token:: OpenDelim ( Delimiter :: Brace )
735
+ && self . prev_token . kind == token:: Semi ;
736
+ semicolon_span = self . prev_token . span ;
737
+ }
732
738
// We have to bail or we'll potentially never make progress.
733
739
let non_item_span = self . token . span ;
734
740
let is_let = self . token . is_keyword ( kw:: Let ) ;
0 commit comments