@@ -553,39 +553,46 @@ impl<'a> Parser<'a> {
553
553
match stmt. kind {
554
554
// Expression without semicolon.
555
555
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) => {
558
557
// 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
+ ) ;
577
579
}
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 ( ) ;
584
589
}
585
- e. emit ( ) ;
586
- self . recover_stmt ( ) ;
590
+ true
587
591
}
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
589
596
let sp = expr. span . to ( self . prev_token . span ) ;
590
597
* expr = self . mk_expr_err ( sp) ;
591
598
}
0 commit comments