@@ -273,7 +273,7 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>,
273
273
let mut seen = Matrix :: empty ( ) ;
274
274
let mut catchall = None ;
275
275
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 ( ) {
277
277
for & ( pat, hir_pat) in pats {
278
278
let v = vec ! [ pat] ;
279
279
@@ -302,10 +302,27 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>,
302
302
let & ( ref first_arm_pats, _) = & arms[ 0 ] ;
303
303
let first_pat = & first_arm_pats[ 0 ] ;
304
304
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
+ }
309
326
} ,
310
327
311
328
hir:: MatchSource :: ForLoopDesugar |
0 commit comments