File tree Expand file tree Collapse file tree 3 files changed +97
-4
lines changed
compiler/rustc_parse/src/parser Expand file tree Collapse file tree 3 files changed +97
-4
lines changed Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+
You can’t perform that action at this time.
0 commit comments