Propagate restrictions against struct literals to the RHS of assignments
This prevents confusing errors when accidentally using an assignment
in an `if` expression. For example:
```rust
fn main() {
let x = 1u;
if x = x {
println!("{}", x);
}
}
```
Previously, this yielded:
```
test.rs:4:16: 4:17 error: expected `:`, found `!`
test.rs:4 println!("{}", x);
^
```
With this change, it now yields:
```
test.rs:3:8: 3:13 error: mismatched types: expected `bool`, found `()` (expected bool, found ())
test.rs:3 if x = x {
^~~~~
```
Closes issue #17283
This commit is contained in:
@@ -2692,15 +2692,16 @@ impl<'a> Parser<'a> {
|
||||
pub fn parse_assign_expr(&mut self) -> P<Expr> {
|
||||
let lo = self.span.lo;
|
||||
let lhs = self.parse_binops();
|
||||
let restrictions = self.restrictions & RestrictionNoStructLiteral;
|
||||
match self.token {
|
||||
token::EQ => {
|
||||
self.bump();
|
||||
let rhs = self.parse_expr();
|
||||
let rhs = self.parse_expr_res(restrictions);
|
||||
self.mk_expr(lo, rhs.span.hi, ExprAssign(lhs, rhs))
|
||||
}
|
||||
token::BINOPEQ(op) => {
|
||||
self.bump();
|
||||
let rhs = self.parse_expr();
|
||||
let rhs = self.parse_expr_res(restrictions);
|
||||
let aop = match op {
|
||||
token::PLUS => BiAdd,
|
||||
token::MINUS => BiSub,
|
||||
|
||||
Reference in New Issue
Block a user