@@ -341,7 +341,15 @@ fn check_arms(cx: &MatchCheckCtxt,
341341 } ,
342342
343343 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 ( ) ;
345353 } ,
346354
347355 hir:: MatchSource :: TryDesugar => {
@@ -361,7 +369,18 @@ fn check_arms(cx: &MatchCheckCtxt,
361369 }
362370}
363371
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 {
365384 match p. node {
366385 PatKind :: Ident ( _, _, Some ( ref s) ) => raw_pat ( & s) ,
367386 _ => p
0 commit comments