Skip to content

Commit

Permalink
Suggest fix for ; within let-chains
Browse files Browse the repository at this point in the history
  • Loading branch information
sjwang05 committed Nov 9, 2023
1 parent d8dbf7c commit 5693a34
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 4 deletions.
24 changes: 20 additions & 4 deletions compiler/rustc_parse/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2441,10 +2441,26 @@ impl<'a> Parser<'a> {
self.error_on_extra_if(&cond)?;
// Parse block, which will always fail, but we can add a nice note to the error
self.parse_block().map_err(|mut err| {
err.span_note(
cond_span,
"the `if` expression is missing a block after this condition",
);
if self.prev_token == token::Semi
&& self.token == token::AndAnd
&& let maybe_let = self.look_ahead(1, |t| t.clone())
&& maybe_let.is_keyword(kw::Let)
{
err.span_suggestion(
self.prev_token.span,
"consider removing this semicolon to parse the `let` as part of the same chain",
"",
Applicability::MachineApplicable,
).span_note(
self.token.span.to(maybe_let.span),
"you likely meant to continue parsing the let-chain starting here",
);
} else {
err.span_note(
cond_span,
"the `if` expression is missing a block after this condition",
);
}
err
})?
}
Expand Down
27 changes: 27 additions & 0 deletions tests/ui/parser/semi-in-let-chain.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Issue #117720

#![feature(let_chains)]

fn main() {
if let () = ()
&& let () = (); //~ERROR
&& let () = ()
{
}
}

fn foo() {
if let () = ()
&& () == (); //~ERROR
&& 1 < 0
{
}
}

fn bar() {
if let () = ()
&& () == (); //~ERROR
&& let () = ()
{
}
}
50 changes: 50 additions & 0 deletions tests/ui/parser/semi-in-let-chain.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
error: expected `{`, found `;`
--> $DIR/semi-in-let-chain.rs:7:23
|
LL | && let () = ();
| ^ expected `{`
|
note: you likely meant to continue parsing the let-chain starting here
--> $DIR/semi-in-let-chain.rs:8:9
|
LL | && let () = ()
| ^^^^^^
help: consider removing this semicolon to parse the `let` as part of the same chain
|
LL - && let () = ();
LL + && let () = ()
|

error: expected `{`, found `;`
--> $DIR/semi-in-let-chain.rs:15:20
|
LL | && () == ();
| ^ expected `{`
|
note: the `if` expression is missing a block after this condition
--> $DIR/semi-in-let-chain.rs:14:8
|
LL | if let () = ()
| ________^
LL | | && () == ();
| |___________________^

error: expected `{`, found `;`
--> $DIR/semi-in-let-chain.rs:23:20
|
LL | && () == ();
| ^ expected `{`
|
note: you likely meant to continue parsing the let-chain starting here
--> $DIR/semi-in-let-chain.rs:24:9
|
LL | && let () = ()
| ^^^^^^
help: consider removing this semicolon to parse the `let` as part of the same chain
|
LL - && () == ();
LL + && () == ()
|

error: aborting due to 3 previous errors

0 comments on commit 5693a34

Please sign in to comment.