Skip to content

Commit 742741f

Browse files
authored
Rollup merge of #103444 - chenyukang:yukang/fix-103425-extra-diag, r=davidtwco
Remove extra type error after missing semicolon error Fixes #103425
2 parents c9a04cd + f54c336 commit 742741f

File tree

3 files changed

+80
-29
lines changed

3 files changed

+80
-29
lines changed

compiler/rustc_parse/src/parser/stmt.rs

+36-29
Original file line numberDiff line numberDiff line change
@@ -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
}

src/test/ui/parser/issue-103425.rs

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
fn f() -> f32 {
2+
3
3+
//~^ ERROR expected `;`
4+
5.0
5+
}
6+
7+
fn k() -> f32 {
8+
2_u32
9+
//~^ ERROR expected `;`
10+
3_i8
11+
//~^ ERROR expected `;`
12+
5.0
13+
}
14+
15+
fn main() {}
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
error: expected `;`, found `5.0`
2+
--> $DIR/issue-103425.rs:2:6
3+
|
4+
LL | 3
5+
| ^ help: add `;` here
6+
LL |
7+
LL | 5.0
8+
| --- unexpected token
9+
10+
error: expected `;`, found `3_i8`
11+
--> $DIR/issue-103425.rs:8:10
12+
|
13+
LL | 2_u32
14+
| ^ help: add `;` here
15+
LL |
16+
LL | 3_i8
17+
| ---- unexpected token
18+
19+
error: expected `;`, found `5.0`
20+
--> $DIR/issue-103425.rs:10:9
21+
|
22+
LL | 3_i8
23+
| ^ help: add `;` here
24+
LL |
25+
LL | 5.0
26+
| --- unexpected token
27+
28+
error: aborting due to 3 previous errors
29+

0 commit comments

Comments
 (0)