@@ -53,25 +53,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
5353 // Otherwise, we have to union together the types that the arms produce and so forth.
5454 let scrut_diverges = self . diverges . replace ( Diverges :: Maybe ) ;
5555
56- // rust-lang/rust#55810: Typecheck patterns first (via eager
57- // collection into `Vec`), so we get types for all bindings.
58- let all_arm_pats_diverge: Vec < _ > = arms
59- . iter ( )
60- . map ( |arm| {
61- let mut all_pats_diverge = Diverges :: WarnedAlways ;
62- self . diverges . set ( Diverges :: Maybe ) ;
63- self . check_pat_top ( & arm. pat , scrut_ty, Some ( scrut. span ) , true ) ;
64- all_pats_diverge &= self . diverges . get ( ) ;
65-
66- // As discussed with @eddyb, this is for disabling unreachable_code
67- // warnings on patterns (they're now subsumed by unreachable_patterns
68- // warnings).
69- match all_pats_diverge {
70- Diverges :: Maybe => Diverges :: Maybe ,
71- Diverges :: Always { .. } | Diverges :: WarnedAlways => Diverges :: WarnedAlways ,
72- }
73- } )
74- . collect ( ) ;
56+ // #55810: Type check patterns first so we get types for all bindings.
57+ for arm in arms {
58+ self . check_pat_top ( & arm. pat , scrut_ty, Some ( scrut. span ) , true ) ;
59+ }
7560
7661 // Now typecheck the blocks.
7762 //
@@ -102,19 +87,19 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10287 CoerceMany :: with_coercion_sites ( coerce_first, arms)
10388 } ;
10489
105- let mut other_arms = vec ! [ ] ; // used only for diagnostics
90+ let mut other_arms = vec ! [ ] ; // Used only for diagnostics.
10691 let mut prior_arm_ty = None ;
107- for ( i, ( arm, pats_diverge ) ) in arms. iter ( ) . zip ( all_arm_pats_diverge ) . enumerate ( ) {
92+ for ( i, arm) in arms. iter ( ) . enumerate ( ) {
10893 if let Some ( g) = & arm. guard {
109- self . diverges . set ( pats_diverge ) ;
94+ self . diverges . set ( Diverges :: Maybe ) ;
11095 match g {
11196 hir:: Guard :: If ( e) => {
11297 self . check_expr_has_type_or_error ( e, tcx. types . bool , |_| { } )
11398 }
11499 } ;
115100 }
116101
117- self . diverges . set ( pats_diverge ) ;
102+ self . diverges . set ( Diverges :: Maybe ) ;
118103 let arm_ty = if source_if
119104 && if_no_else
120105 && i != 0
0 commit comments