@@ -553,39 +553,46 @@ impl<'a> Parser<'a> {
553553 match stmt. kind {
554554 // Expression without semicolon.
555555 StmtKind :: Expr ( ref mut expr)
556- if self . token != token:: Eof && classify:: expr_requires_semi_to_be_stmt ( expr) =>
557- {
556+ if self . token != token:: Eof && classify:: expr_requires_semi_to_be_stmt ( expr) => {
558557 // Just check for errors and recover; do not eat semicolon yet.
559- if let Err ( mut e) =
560- self . expect_one_of ( & [ ] , & [ token:: Semi , token:: CloseDelim ( Delimiter :: Brace ) ] )
561- {
562- if let TokenKind :: DocComment ( ..) = self . token . kind {
563- if let Ok ( snippet) = self . span_to_snippet ( self . token . span ) {
564- let sp = self . token . span ;
565- let marker = & snippet[ ..3 ] ;
566- let ( comment_marker, doc_comment_marker) = marker. split_at ( 2 ) ;
567-
568- e. span_suggestion (
569- sp. with_hi ( sp. lo ( ) + BytePos ( marker. len ( ) as u32 ) ) ,
570- & format ! (
571- "add a space before `{}` to use a regular comment" ,
572- doc_comment_marker,
573- ) ,
574- format ! ( "{} {}" , comment_marker, doc_comment_marker) ,
575- Applicability :: MaybeIncorrect ,
576- ) ;
558+ // `expect_one_of` returns PResult<'a, bool /* recovered */>
559+ let replace_with_err =
560+ match self . expect_one_of ( & [ ] , & [ token:: Semi , token:: CloseDelim ( Delimiter :: Brace ) ] ) {
561+ // Recover from parser, skip type error to avoid extra errors.
562+ Ok ( true ) => true ,
563+ Err ( mut e) => {
564+ if let TokenKind :: DocComment ( ..) = self . token . kind &&
565+ let Ok ( snippet) = self . span_to_snippet ( self . token . span ) {
566+ let sp = self . token . span ;
567+ let marker = & snippet[ ..3 ] ;
568+ let ( comment_marker, doc_comment_marker) = marker. split_at ( 2 ) ;
569+
570+ e. span_suggestion (
571+ sp. with_hi ( sp. lo ( ) + BytePos ( marker. len ( ) as u32 ) ) ,
572+ & format ! (
573+ "add a space before `{}` to use a regular comment" ,
574+ doc_comment_marker,
575+ ) ,
576+ format ! ( "{} {}" , comment_marker, doc_comment_marker) ,
577+ Applicability :: MaybeIncorrect ,
578+ ) ;
577579 }
578- }
579- if let Err ( mut e) =
580- self . check_mistyped_turbofish_with_multiple_type_params ( e, expr)
581- {
582- if recover. no ( ) {
583- return Err ( e) ;
580+
581+ if let Err ( mut e) =
582+ self . check_mistyped_turbofish_with_multiple_type_params ( e, expr)
583+ {
584+ if recover. no ( ) {
585+ return Err ( e) ;
586+ }
587+ e. emit ( ) ;
588+ self . recover_stmt ( ) ;
584589 }
585- e. emit ( ) ;
586- self . recover_stmt ( ) ;
590+ true
587591 }
588- // Don't complain about type errors in body tail after parse error (#57383).
592+ _ => false
593+ } ;
594+ if replace_with_err {
595+ // We already emitted an error, so don't emit another type error
589596 let sp = expr. span . to ( self . prev_token . span ) ;
590597 * expr = self . mk_expr_err ( sp) ;
591598 }
0 commit comments