Skip to content

Commit 48387c8

Browse files
committed
refactor the pat_is_catchall logic
1 parent 732f227 commit 48387c8

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

src/librustc_const_eval/check_match.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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
343341
fn 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

Comments
 (0)