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