Suggest fix for ; within let-chains

This commit is contained in:
sjwang05 2023-11-09 00:31:42 -08:00
parent d8dbf7ca0e
commit 5693a34db2
No known key found for this signature in database
GPG key ID: AB262FD6FFBFCFFE
3 changed files with 97 additions and 4 deletions

View file

@ -2441,10 +2441,26 @@ fn parse_if_after_cond(&mut self, lo: Span, mut cond: P<Expr>) -> PResult<'a, P<
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
})?
}

View file

@ -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 () = ()
{
}
}

View file

@ -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