@@ -706,9 +706,9 @@ impl<'a> Parser<'a> {
706
706
}
707
707
match parse_item ( self ) {
708
708
Ok ( None ) => {
709
- let is_unnecessary_semicolon = !items. is_empty ( )
709
+ let mut is_unnecessary_semicolon = !items. is_empty ( )
710
710
// 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 )`.
712
712
// This is because the `token.kind` of the close delim is treated as the same as
713
713
// that of the open delim in `TokenTreesReader::parse_token_tree`, even if the delimiters of them are different.
714
714
// Therefore, `token.kind` should not be compared here.
@@ -727,7 +727,13 @@ impl<'a> Parser<'a> {
727
727
. span_to_snippet ( self . prev_token . span )
728
728
. map_or ( false , |snippet| snippet == "}" )
729
729
&& 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
+ }
731
737
// We have to bail or we'll potentially never make progress.
732
738
let non_item_span = self . token . span ;
733
739
let is_let = self . token . is_keyword ( kw:: Let ) ;
0 commit comments