Skip to content

Commit

Permalink
Rollup merge of #94211 - est31:let_else_destructuring_error, r=matthe…
Browse files Browse the repository at this point in the history
…wjasper

Better error if the user tries to do assignment ... else

If the user tries to do assignment ... else, we now issue a more comprehensible error in the parser.

closes #93995
  • Loading branch information
matthiaskrgr authored Feb 21, 2022
2 parents f3a1a8c + 76ea566 commit d3649f8
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 d3649f8

Please sign in to comment.