@@ -273,7 +273,7 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>,
273273 let mut seen = Matrix :: empty ( ) ;
274274 let mut catchall = None ;
275275 let mut printed_if_let_err = false ;
276- for & ( ref pats, guard) in arms {
276+ for ( arm_index , & ( ref pats, guard) ) in arms. iter ( ) . enumerate ( ) {
277277 for & ( pat, hir_pat) in pats {
278278 let v = vec ! [ pat] ;
279279
@@ -302,10 +302,27 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>,
302302 let & ( ref first_arm_pats, _) = & arms[ 0 ] ;
303303 let first_pat = & first_arm_pats[ 0 ] ;
304304 let span = first_pat. 0 . span ;
305- struct_span_err ! ( cx. tcx. sess, span, E0165 ,
306- "irrefutable while-let pattern" )
307- . span_label ( span, & format ! ( "irrefutable pattern" ) )
308- . emit ( ) ;
305+
306+ // check which arm we're on.
307+ match arm_index {
308+ // The arm with the user-specified pattern.
309+ 0 => {
310+ let mut diagnostic = Diagnostic :: new ( Level :: Warning ,
311+ "unreachable pattern" ) ;
312+ diagnostic. set_span ( pat. span ) ;
313+ cx. tcx . sess . add_lint_diagnostic (
314+ lint:: builtin:: UNREACHABLE_PATTERNS ,
315+ hir_pat. id , diagnostic) ;
316+ } ,
317+ // The arm with the wildcard pattern.
318+ 1 => {
319+ struct_span_err ! ( cx. tcx. sess, span, E0165 ,
320+ "irrefutable while-let pattern" )
321+ . span_label ( span, & format ! ( "irrefutable pattern" ) )
322+ . emit ( ) ;
323+ } ,
324+ _ => bug ! ( ) ,
325+ }
309326 } ,
310327
311328 hir:: MatchSource :: ForLoopDesugar |
0 commit comments