Skip to content

Commit 7607597

Browse files
authored
Rollup merge of #117743 - sjwang05:issue-117720, r=estebank
Suggest removing `;` for `;` within let-chains Fixes #117720
2 parents 7fd7719 + 5693a34 commit 7607597

File tree

3 files changed

+97
-4
lines changed

3 files changed

+97
-4
lines changed

compiler/rustc_parse/src/parser/expr.rs

+20-4
Original file line numberDiff line numberDiff line change
@@ -2441,10 +2441,26 @@ impl<'a> Parser<'a> {
24412441
self.error_on_extra_if(&cond)?;
24422442
// Parse block, which will always fail, but we can add a nice note to the error
24432443
self.parse_block().map_err(|mut err| {
2444-
err.span_note(
2445-
cond_span,
2446-
"the `if` expression is missing a block after this condition",
2447-
);
2444+
if self.prev_token == token::Semi
2445+
&& self.token == token::AndAnd
2446+
&& let maybe_let = self.look_ahead(1, |t| t.clone())
2447+
&& maybe_let.is_keyword(kw::Let)
2448+
{
2449+
err.span_suggestion(
2450+
self.prev_token.span,
2451+
"consider removing this semicolon to parse the `let` as part of the same chain",
2452+
"",
2453+
Applicability::MachineApplicable,
2454+
).span_note(
2455+
self.token.span.to(maybe_let.span),
2456+
"you likely meant to continue parsing the let-chain starting here",
2457+
);
2458+
} else {
2459+
err.span_note(
2460+
cond_span,
2461+
"the `if` expression is missing a block after this condition",
2462+
);
2463+
}
24482464
err
24492465
})?
24502466
}

tests/ui/parser/semi-in-let-chain.rs

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Issue #117720
2+
3+
#![feature(let_chains)]
4+
5+
fn main() {
6+
if let () = ()
7+
&& let () = (); //~ERROR
8+
&& let () = ()
9+
{
10+
}
11+
}
12+
13+
fn foo() {
14+
if let () = ()
15+
&& () == (); //~ERROR
16+
&& 1 < 0
17+
{
18+
}
19+
}
20+
21+
fn bar() {
22+
if let () = ()
23+
&& () == (); //~ERROR
24+
&& let () = ()
25+
{
26+
}
27+
}
+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
error: expected `{`, found `;`
2+
--> $DIR/semi-in-let-chain.rs:7:23
3+
|
4+
LL | && let () = ();
5+
| ^ expected `{`
6+
|
7+
note: you likely meant to continue parsing the let-chain starting here
8+
--> $DIR/semi-in-let-chain.rs:8:9
9+
|
10+
LL | && let () = ()
11+
| ^^^^^^
12+
help: consider removing this semicolon to parse the `let` as part of the same chain
13+
|
14+
LL - && let () = ();
15+
LL + && let () = ()
16+
|
17+
18+
error: expected `{`, found `;`
19+
--> $DIR/semi-in-let-chain.rs:15:20
20+
|
21+
LL | && () == ();
22+
| ^ expected `{`
23+
|
24+
note: the `if` expression is missing a block after this condition
25+
--> $DIR/semi-in-let-chain.rs:14:8
26+
|
27+
LL | if let () = ()
28+
| ________^
29+
LL | | && () == ();
30+
| |___________________^
31+
32+
error: expected `{`, found `;`
33+
--> $DIR/semi-in-let-chain.rs:23:20
34+
|
35+
LL | && () == ();
36+
| ^ expected `{`
37+
|
38+
note: you likely meant to continue parsing the let-chain starting here
39+
--> $DIR/semi-in-let-chain.rs:24:9
40+
|
41+
LL | && let () = ()
42+
| ^^^^^^
43+
help: consider removing this semicolon to parse the `let` as part of the same chain
44+
|
45+
LL - && () == ();
46+
LL + && () == ()
47+
|
48+
49+
error: aborting due to 3 previous errors
50+

0 commit comments

Comments
 (0)