Skip to content

Commit

Permalink
Remove Session.if_let_suggestions
Browse files Browse the repository at this point in the history
We can instead if either the LHS or RHS types contain
`TyKind::Error`. In addition to covering the case where
we would have previously updated `if_let_suggestions`, this might
also prevent redundant errors in other cases as well.
  • Loading branch information
Aaron1011 committed Aug 27, 2021
1 parent dfd8472 commit 672d370
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 9 deletions.
1 change: 0 additions & 1 deletion compiler/rustc_resolve/src/late/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,6 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
"let ".to_string(),
Applicability::MaybeIncorrect,
);
self.r.session.if_let_suggestions.borrow_mut().insert(*span);
}
_ => {}
}
Expand Down
4 changes: 0 additions & 4 deletions compiler/rustc_session/src/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,6 @@ pub struct Session {

/// Set of enabled features for the current target.
pub target_features: FxHashSet<Symbol>,

/// `Span`s for `if` conditions that we have suggested turning into `if let`.
pub if_let_suggestions: Lock<FxHashSet<Span>>,
}

pub struct PerfStats {
Expand Down Expand Up @@ -1328,7 +1325,6 @@ pub fn build_session(
miri_unleashed_features: Lock::new(Default::default()),
asm_arch,
target_features: FxHashSet::default(),
if_let_suggestions: Default::default(),
};

validate_commandline_args_with_session_available(&sess);
Expand Down
7 changes: 4 additions & 3 deletions compiler/rustc_typeck/src/check/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -919,9 +919,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
);
}

if self.sess().if_let_suggestions.borrow().get(&expr.span).is_some() {
// We already emitted an `if let` suggestion due to an identifier not found.
err.delay_as_bug();
// If the assignment expression itself is ill-formed, don't
// bother emitting another error
if lhs_ty.references_error() || rhs_ty.references_error() {
err.delay_as_bug()
} else {
err.emit();
}
Expand Down
1 change: 1 addition & 0 deletions src/test/ui/suggestions/if-let-typo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ fn main() {
if Some(3) = foo {} //~ ERROR mismatched types
//~^ ERROR destructuring assignments are unstable
//~^^ ERROR invalid left-hand side of assignment
if x = 5 {} //~ ERROR cannot find value `x` in this scope
}
13 changes: 12 additions & 1 deletion src/test/ui/suggestions/if-let-typo.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,17 @@ help: you might have meant to use pattern matching
LL | if let Some(x) = foo {}
| +++

error[E0425]: cannot find value `x` in this scope
--> $DIR/if-let-typo.rs:13:8
|
LL | if x = 5 {}
| ^ not found in this scope
|
help: you might have meant to use pattern matching
|
LL | if let x = 5 {}
| +++

error[E0658]: destructuring assignments are unstable
--> $DIR/if-let-typo.rs:4:16
|
Expand Down Expand Up @@ -79,7 +90,7 @@ error[E0308]: mismatched types
LL | if Some(3) = foo {}
| ^^^^^^^^^^^^^ expected `bool`, found `()`

error: aborting due to 9 previous errors
error: aborting due to 10 previous errors

Some errors have detailed explanations: E0070, E0308, E0425, E0658.
For more information about an error, try `rustc --explain E0070`.

0 comments on commit 672d370

Please sign in to comment.