@@ -341,7 +341,15 @@ fn check_arms(cx: &MatchCheckCtxt,
341
341
} ,
342
342
343
343
hir:: MatchSource :: Normal => {
344
- span_err ! ( cx. tcx. sess, pat. span, E0001 , "unreachable pattern" )
344
+ let mut err = struct_span_err ! ( cx. tcx. sess, pat. span, E0001 ,
345
+ "unreachable pattern" ) ;
346
+ // if we had a catchall pattern, hint at that
347
+ for row in & seen. 0 {
348
+ if pat_is_catchall ( & cx. tcx . def_map . borrow ( ) , row[ 0 ] ) {
349
+ span_note ! ( err, row[ 0 ] . span, "this pattern matches any value" ) ;
350
+ }
351
+ }
352
+ err. emit ( ) ;
345
353
} ,
346
354
347
355
hir:: MatchSource :: TryDesugar => {
@@ -361,7 +369,18 @@ fn check_arms(cx: &MatchCheckCtxt,
361
369
}
362
370
}
363
371
364
- fn raw_pat < ' a > ( p : & ' a Pat ) -> & ' a Pat {
372
+ /// Checks for common cases of "catchall" patterns that may not be intended as such.
373
+ fn pat_is_catchall ( dm : & DefMap , p : & Pat ) -> bool {
374
+ match p. node {
375
+ PatKind :: Ident ( _, _, None ) => pat_is_binding ( dm, p) ,
376
+ PatKind :: Ident ( _, _, Some ( ref s) ) => pat_is_catchall ( dm, & s) ,
377
+ PatKind :: Ref ( ref s, _) => pat_is_catchall ( dm, & s) ,
378
+ PatKind :: Tup ( ref v) => v. iter ( ) . all ( |p| pat_is_catchall ( dm, & p) ) ,
379
+ _ => false
380
+ }
381
+ }
382
+
383
+ fn raw_pat ( p : & Pat ) -> & Pat {
365
384
match p. node {
366
385
PatKind :: Ident ( _, _, Some ( ref s) ) => raw_pat ( & s) ,
367
386
_ => p
0 commit comments