typeck: remove redundant diverges code
diff --git a/src/librustc_typeck/check/_match.rs b/src/librustc_typeck/check/_match.rs
index a6f8a82..d339e3d 100644
--- a/src/librustc_typeck/check/_match.rs
+++ b/src/librustc_typeck/check/_match.rs
@@ -53,25 +53,10 @@
// Otherwise, we have to union together the types that the arms produce and so forth.
let scrut_diverges = self.diverges.replace(Diverges::Maybe);
- // rust-lang/rust#55810: Typecheck patterns first (via eager
- // collection into `Vec`), so we get types for all bindings.
- let all_arm_pats_diverge: Vec<_> = arms
- .iter()
- .map(|arm| {
- let mut all_pats_diverge = Diverges::WarnedAlways;
- self.diverges.set(Diverges::Maybe);
- self.check_pat_top(&arm.pat, scrut_ty, Some(scrut.span), true);
- all_pats_diverge &= self.diverges.get();
-
- // As discussed with @eddyb, this is for disabling unreachable_code
- // warnings on patterns (they're now subsumed by unreachable_patterns
- // warnings).
- match all_pats_diverge {
- Diverges::Maybe => Diverges::Maybe,
- Diverges::Always { .. } | Diverges::WarnedAlways => Diverges::WarnedAlways,
- }
- })
- .collect();
+ // #55810: Type check patterns first so we get types for all bindings.
+ for arm in arms {
+ self.check_pat_top(&arm.pat, scrut_ty, Some(scrut.span), true);
+ }
// Now typecheck the blocks.
//
@@ -102,11 +87,11 @@
CoerceMany::with_coercion_sites(coerce_first, arms)
};
- let mut other_arms = vec![]; // used only for diagnostics
+ let mut other_arms = vec![]; // Used only for diagnostics.
let mut prior_arm_ty = None;
- for (i, (arm, pats_diverge)) in arms.iter().zip(all_arm_pats_diverge).enumerate() {
+ for (i, arm) in arms.iter().enumerate() {
if let Some(g) = &arm.guard {
- self.diverges.set(pats_diverge);
+ self.diverges.set(Diverges::Maybe);
match g {
hir::Guard::If(e) => {
self.check_expr_has_type_or_error(e, tcx.types.bool, |_| {})
@@ -114,7 +99,7 @@
};
}
- self.diverges.set(pats_diverge);
+ self.diverges.set(Diverges::Maybe);
let arm_ty = if source_if
&& if_no_else
&& i != 0