Rollup merge of #71976 - mibac138:let-recovery, r=estebank
Improve diagnostics for `let x += 1` Fixes(?) #66736 The code responsible for the `E0404` errors is [here](https://github.com/rust-lang/rust/blob/master/src/librustc_parse/parser/ty.rs#L399-L424) which I don't think can be easily modified to prevent emitting an error in one specific case. Because of this I couldn't get rid of `E0404` and instead added `E0067` along with a help message which will fix the problem. r? @estebank
This commit is contained in:
commit
39f8784eb6
3 changed files with 50 additions and 2 deletions
|
@ -216,8 +216,28 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses the RHS of a local variable declaration (e.g., '= 14;').
|
/// Parses the RHS of a local variable declaration (e.g., '= 14;').
|
||||||
fn parse_initializer(&mut self, skip_eq: bool) -> PResult<'a, Option<P<Expr>>> {
|
fn parse_initializer(&mut self, eq_optional: bool) -> PResult<'a, Option<P<Expr>>> {
|
||||||
if self.eat(&token::Eq) || skip_eq { Ok(Some(self.parse_expr()?)) } else { Ok(None) }
|
let eq_consumed = match self.token.kind {
|
||||||
|
token::BinOpEq(..) => {
|
||||||
|
// Recover `let x <op>= 1` as `let x = 1`
|
||||||
|
self.struct_span_err(
|
||||||
|
self.token.span,
|
||||||
|
"can't reassign to an uninitialized variable",
|
||||||
|
)
|
||||||
|
.span_suggestion_short(
|
||||||
|
self.token.span,
|
||||||
|
"initialize the variable",
|
||||||
|
"=".to_string(),
|
||||||
|
Applicability::MaybeIncorrect,
|
||||||
|
)
|
||||||
|
.emit();
|
||||||
|
self.bump();
|
||||||
|
true
|
||||||
|
}
|
||||||
|
_ => self.eat(&token::Eq),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(if eq_consumed || eq_optional { Some(self.parse_expr()?) } else { None })
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses a block. No inner attributes are allowed.
|
/// Parses a block. No inner attributes are allowed.
|
||||||
|
|
8
src/test/ui/parser/let-binop.rs
Normal file
8
src/test/ui/parser/let-binop.rs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
fn main() {
|
||||||
|
let a: i8 *= 1; //~ ERROR can't reassign to an uninitialized variable
|
||||||
|
let _ = a;
|
||||||
|
let b += 1; //~ ERROR can't reassign to an uninitialized variable
|
||||||
|
let _ = b;
|
||||||
|
let c *= 1; //~ ERROR can't reassign to an uninitialized variable
|
||||||
|
let _ = c;
|
||||||
|
}
|
20
src/test/ui/parser/let-binop.stderr
Normal file
20
src/test/ui/parser/let-binop.stderr
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
error: can't reassign to an uninitialized variable
|
||||||
|
--> $DIR/let-binop.rs:2:15
|
||||||
|
|
|
||||||
|
LL | let a: i8 *= 1;
|
||||||
|
| ^^ help: initialize the variable
|
||||||
|
|
||||||
|
error: can't reassign to an uninitialized variable
|
||||||
|
--> $DIR/let-binop.rs:4:11
|
||||||
|
|
|
||||||
|
LL | let b += 1;
|
||||||
|
| ^^ help: initialize the variable
|
||||||
|
|
||||||
|
error: can't reassign to an uninitialized variable
|
||||||
|
--> $DIR/let-binop.rs:6:11
|
||||||
|
|
|
||||||
|
LL | let c *= 1;
|
||||||
|
| ^^ help: initialize the variable
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue