@@ -74,21 +74,6 @@ impl<'a, 'tcx> Pattern<'a, 'tcx> {
74
74
return pat;
75
75
}
76
76
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
-
92
77
fn span ( self ) -> Span {
93
78
self . pat . span
94
79
}
@@ -339,11 +324,25 @@ fn check_for_static_nan(cx: &MatchCheckCtxt, pat: &Pat) {
339
324
} ) ;
340
325
}
341
326
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
+
342
340
// Check for unreachable patterns
343
341
fn check_arms ( cx : & MatchCheckCtxt ,
344
342
arms : & [ ( Vec < P < Pat > > , Option < & hir:: Expr > ) ] ,
345
343
source : hir:: MatchSource ) {
346
344
let mut seen = Matrix ( vec ! [ ] ) ;
345
+ let mut catchall = None ;
347
346
let mut printed_if_let_err = false ;
348
347
for & ( ref pats, guard) in arms {
349
348
for pat in pats {
@@ -393,11 +392,8 @@ fn check_arms(cx: &MatchCheckCtxt,
393
392
"unreachable pattern" ) ;
394
393
err. span_label ( pat. span , & format ! ( "this is an unreachable pattern" ) ) ;
395
394
// 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" ) ;
401
397
}
402
398
err. emit ( ) ;
403
399
} ,
@@ -414,6 +410,10 @@ fn check_arms(cx: &MatchCheckCtxt,
414
410
let Matrix ( mut rows) = seen;
415
411
rows. push ( v) ;
416
412
seen = Matrix ( rows) ;
413
+ if catchall. is_none ( ) && pat_is_catchall ( & cx. tcx . def_map . borrow ( ) , pat) {
414
+ catchall = Some ( pat. span ) ;
415
+ }
416
+
417
417
}
418
418
}
419
419
}
0 commit comments