Suggest while let x = y when encountering while x = y

Extends #75931 to also detect where the `let` might be missing from `while let` expressions.
This commit is contained in:
ametisf 2021-12-29 13:23:19 +01:00
parent b70cc6422c
commit 874cd08e23
3 changed files with 56 additions and 0 deletions

View File

@ -2376,7 +2376,9 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
ExprKind::While(ref cond, ref block, label) => {
self.with_resolved_label(label, expr.id, |this| {
this.with_rib(ValueNS, NormalRibKind, |this| {
let old = this.diagnostic_metadata.in_if_condition.replace(cond);
this.visit_expr(cond);
this.diagnostic_metadata.in_if_condition = old;
this.visit_block(block);
})
});

View File

@ -0,0 +1,9 @@
fn main() {
let foo = Some(0);
let bar = None;
while Some(x) = foo {} //~ ERROR cannot find value `x` in this scope
while Some(foo) = bar {}
while 3 = foo {} //~ ERROR mismatched types
while Some(3) = foo {} //~ ERROR invalid left-hand side of assignment
while x = 5 {} //~ ERROR cannot find value `x` in this scope
}

View File

@ -0,0 +1,45 @@
error[E0425]: cannot find value `x` in this scope
--> $DIR/while-let-typo.rs:4:16
|
LL | while Some(x) = foo {}
| ^ not found in this scope
|
help: you might have meant to use pattern matching
|
LL | while let Some(x) = foo {}
| +++
error[E0425]: cannot find value `x` in this scope
--> $DIR/while-let-typo.rs:8:11
|
LL | while x = 5 {}
| ^ not found in this scope
|
help: you might have meant to use pattern matching
|
LL | while let x = 5 {}
| +++
error[E0308]: mismatched types
--> $DIR/while-let-typo.rs:6:11
|
LL | while 3 = foo {}
| ^^^^^^^ expected `bool`, found `()`
error[E0070]: invalid left-hand side of assignment
--> $DIR/while-let-typo.rs:7:19
|
LL | while Some(3) = foo {}
| - ^
| |
| cannot assign to this expression
|
help: you might have meant to use pattern destructuring
|
LL | while let Some(3) = foo {}
| +++
error: aborting due to 4 previous errors
Some errors have detailed explanations: E0070, E0308, E0425.
For more information about an error, try `rustc --explain E0070`.