Skip to content

Commit

Permalink
Suggest while let x = y when encountering while x = y
Browse files Browse the repository at this point in the history
Extends #75931 to also detect where the `let` might be missing from `while let` expressions.
  • Loading branch information
ametisf committed Dec 29, 2021
1 parent b70cc64 commit 874cd08
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 0 deletions.
2 changes: 2 additions & 0 deletions compiler/rustc_resolve/src/late.rs
Expand Up @@ -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);
})
});
Expand Down
9 changes: 9 additions & 0 deletions src/test/ui/suggestions/while-let-typo.rs
@@ -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
}
45 changes: 45 additions & 0 deletions src/test/ui/suggestions/while-let-typo.stderr
@@ -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`.

0 comments on commit 874cd08

Please sign in to comment.