@@ -675,14 +675,44 @@ impl<'a> Parser<'a> {
675675 }
676676 match parse_item ( self ) {
677677 Ok ( None ) => {
678+ let is_unnecessary_semicolon = !items. is_empty ( )
679+ // When the close delim is `)` in a case like the following, `token.kind` is expected to be `token::CloseDelim(Delimiter::Parenthesis)`,
680+ // but the actual `token.kind` is `token::CloseDelim(Delimiter::Bracket)`.
681+ // This is because the `token.kind` of the close delim is treated as the same as
682+ // that of the open delim in `TokenTreesReader::parse_token_tree`, even if the delimiters of them are different.
683+ // Therefore, `token.kind` should not be compared here.
684+ //
685+ // issue-60075.rs
686+ // ```
687+ // trait T {
688+ // fn qux() -> Option<usize> {
689+ // let _ = if true {
690+ // });
691+ // ^ this close delim
692+ // Some(4)
693+ // }
694+ // ```
695+ && self
696+ . span_to_snippet ( self . prev_token . span )
697+ . map_or ( false , |snippet| snippet == "}" )
698+ && self . token . kind == token:: Semi ;
699+ let semicolon_span = self . token . span ;
678700 // We have to bail or we'll potentially never make progress.
679701 let non_item_span = self . token . span ;
680702 self . consume_block ( Delimiter :: Brace , ConsumeClosingDelim :: Yes ) ;
681- self . struct_span_err ( non_item_span, "non-item in item list" )
682- . span_label ( open_brace_span, "item list starts here" )
703+ let mut err = self . struct_span_err ( non_item_span, "non-item in item list" ) ;
704+ err . span_label ( open_brace_span, "item list starts here" )
683705 . span_label ( non_item_span, "non-item starts here" )
684- . span_label ( self . prev_token . span , "item list ends here" )
685- . emit ( ) ;
706+ . span_label ( self . prev_token . span , "item list ends here" ) ;
707+ if is_unnecessary_semicolon {
708+ err. span_suggestion (
709+ semicolon_span,
710+ "consider removing this semicolon" ,
711+ "" ,
712+ Applicability :: MaybeIncorrect ,
713+ ) ;
714+ }
715+ err. emit ( ) ;
686716 break ;
687717 }
688718 Ok ( Some ( item) ) => items. extend ( item) ,
0 commit comments