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:
parent
99293b16e4
commit
3863b68df4
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user