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