Skip to content

Commit

Permalink
Better error if the user tries to do assignment ... else
Browse files Browse the repository at this point in the history
  • Loading branch information
est31 committed Feb 21, 2022
1 parent c1aa854 commit 76ea566
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 0 deletions.
10 changes: 10 additions & 0 deletions compiler/rustc_parse/src/parser/stmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,16 @@ impl<'a> Parser<'a> {
} else {
self.parse_expr_res(Restrictions::STMT_EXPR, Some(attrs))
}?;
if matches!(e.kind, ExprKind::Assign(..)) && self.eat_keyword(kw::Else) {
let bl = self.parse_block()?;
// Destructuring assignment ... else.
// This is not allowed, but point it out in a nice way.
let mut err = self.struct_span_err(
e.span.to(bl.span),
"<assignment> ... else { ... } is not allowed",
);
err.emit();
}
self.mk_stmt(lo.to(e.span), StmtKind::Expr(e))
} else {
self.error_outer_attrs(&attrs.take_for_recovery());
Expand Down
18 changes: 18 additions & 0 deletions src/test/ui/let-else/let-else-destructuring.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#![feature(let_else)]
#[derive(Debug)]
enum Foo {
Done,
Nested(Option<&'static Foo>),
}

fn walk(mut value: &Foo) {
loop {
println!("{:?}", value);
&Foo::Nested(Some(value)) = value else { break }; //~ ERROR invalid left-hand side of assignment
//~^ERROR <assignment> ... else { ... } is not allowed
}
}

fn main() {
walk(&Foo::Done);
}
17 changes: 17 additions & 0 deletions src/test/ui/let-else/let-else-destructuring.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
error: <assignment> ... else { ... } is not allowed
--> $DIR/let-else-destructuring.rs:11:9
|
LL | &Foo::Nested(Some(value)) = value else { break };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0070]: invalid left-hand side of assignment
--> $DIR/let-else-destructuring.rs:11:35
|
LL | &Foo::Nested(Some(value)) = value else { break };
| ------------------------- ^
| |
| cannot assign to this expression

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0070`.

0 comments on commit 76ea566

Please sign in to comment.