Better error if the user tries to do assignment ... else · rust-lang/rust@76ea566 (original) (raw)
File tree
3 files changed
lines changed
- compiler/rustc_parse/src/parser
3 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -103,6 +103,16 @@ impl<'a> Parser<'a> { | ||
103 | 103 | } else { |
104 | 104 | self.parse_expr_res(Restrictions::STMT_EXPR, Some(attrs)) |
105 | 105 | }?; |
106 | +if matches!(e.kind, ExprKind::Assign(..)) && self.eat_keyword(kw::Else) { | |
107 | +let bl = self.parse_block()?; | |
108 | +// Destructuring assignment ... else. | |
109 | +// This is not allowed, but point it out in a nice way. | |
110 | +let mut err = self.struct_span_err( | |
111 | + e.span.to(bl.span), | |
112 | +" ... else { ... } is not allowed", | |
113 | +); | |
114 | + err.emit(); | |
115 | +} | |
106 | 116 | self.mk_stmt(lo.to(e.span), StmtKind::Expr(e)) |
107 | 117 | } else { |
108 | 118 | self.error_outer_attrs(&attrs.take_for_recovery()); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
1 | +#![feature(let_else)] | |
2 | +#[derive(Debug)] | |
3 | +enum Foo { | |
4 | +Done, | |
5 | +Nested(Option<&'static Foo>), | |
6 | +} | |
7 | + | |
8 | +fn walk(mut value: &Foo) { | |
9 | +loop { | |
10 | +println!("{:?}", value); | |
11 | +&Foo::Nested(Some(value)) = value else { break }; //~ ERROR invalid left-hand side of assignment | |
12 | +//~^ERROR ... else { ... } is not allowed | |
13 | +} | |
14 | +} | |
15 | + | |
16 | +fn main() { | |
17 | +walk(&Foo::Done); | |
18 | +} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
1 | +error: ... else { ... } is not allowed | |
2 | + --> $DIR/let-else-destructuring.rs:11:9 | |
3 | + | | |
4 | +LL | &Foo::Nested(Some(value)) = value else { break }; | |
5 | + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
6 | + | |
7 | +error[E0070]: invalid left-hand side of assignment | |
8 | + --> $DIR/let-else-destructuring.rs:11:35 | |
9 | + | | |
10 | +LL | &Foo::Nested(Some(value)) = value else { break }; | |
11 | + | ------------------------- ^ | |
12 | + | | |
13 | + | cannot assign to this expression | |
14 | + | |
15 | +error: aborting due to 2 previous errors | |
16 | + | |
17 | +For more information about this error, try `rustc --explain E0070`. |