@@ -74,21 +74,6 @@ impl<'a, 'tcx> Pattern<'a, 'tcx> {
7474 return pat;
7575 }
7676
77-
78- /// Checks for common cases of "catchall" patterns that may not be intended as such.
79- fn is_catchall ( self , dm : & DefMap ) -> bool {
80- fn is_catchall ( dm : & DefMap , pat : & Pat ) -> bool {
81- match pat. node {
82- PatKind :: Binding ( .., None ) => true ,
83- PatKind :: Binding ( .., Some ( ref s) ) => is_catchall ( dm, s) ,
84- PatKind :: Ref ( ref s, _) => is_catchall ( dm, s) ,
85- PatKind :: Tuple ( ref v, _) => v. iter ( ) . all ( |p|is_catchall ( dm, & p) ) ,
86- _ => false
87- }
88- }
89- is_catchall ( dm, self . pat )
90- }
91-
9277 fn span ( self ) -> Span {
9378 self . pat . span
9479 }
@@ -339,11 +324,25 @@ fn check_for_static_nan(cx: &MatchCheckCtxt, pat: &Pat) {
339324 } ) ;
340325}
341326
327+ /// Checks for common cases of "catchall" patterns that may not be intended as such.
328+ fn pat_is_catchall ( dm : & DefMap , pat : & Pat ) -> bool {
329+ match pat. node {
330+ PatKind :: Binding ( .., None ) => true ,
331+ PatKind :: Binding ( .., Some ( ref s) ) => pat_is_catchall ( dm, s) ,
332+ PatKind :: Ref ( ref s, _) => pat_is_catchall ( dm, s) ,
333+ PatKind :: Tuple ( ref v, _) => v. iter ( ) . all ( |p| {
334+ pat_is_catchall ( dm, & p)
335+ } ) ,
336+ _ => false
337+ }
338+ }
339+
342340// Check for unreachable patterns
343341fn check_arms ( cx : & MatchCheckCtxt ,
344342 arms : & [ ( Vec < P < Pat > > , Option < & hir:: Expr > ) ] ,
345343 source : hir:: MatchSource ) {
346344 let mut seen = Matrix ( vec ! [ ] ) ;
345+ let mut catchall = None ;
347346 let mut printed_if_let_err = false ;
348347 for & ( ref pats, guard) in arms {
349348 for pat in pats {
@@ -393,11 +392,8 @@ fn check_arms(cx: &MatchCheckCtxt,
393392 "unreachable pattern" ) ;
394393 err. span_label ( pat. span , & format ! ( "this is an unreachable pattern" ) ) ;
395394 // if we had a catchall pattern, hint at that
396- for row in & seen. 0 {
397- if row[ 0 ] . is_catchall ( & cx. tcx . def_map . borrow ( ) ) {
398- span_note ! ( err, row[ 0 ] . span( ) ,
399- "this pattern matches any value" ) ;
400- }
395+ if let Some ( catchall) = catchall {
396+ err. span_note ( catchall, "this pattern matches any value" ) ;
401397 }
402398 err. emit ( ) ;
403399 } ,
@@ -414,6 +410,10 @@ fn check_arms(cx: &MatchCheckCtxt,
414410 let Matrix ( mut rows) = seen;
415411 rows. push ( v) ;
416412 seen = Matrix ( rows) ;
413+ if catchall. is_none ( ) && pat_is_catchall ( & cx. tcx . def_map . borrow ( ) , pat) {
414+ catchall = Some ( pat. span ) ;
415+ }
416+
417417 }
418418 }
419419 }
0 commit comments