From 2c1b1c26f49afcca779ec3d6d20e0cb4cbbad332 Mon Sep 17 00:00:00 2001 From: Shotaro Yamada Date: Sat, 15 Dec 2018 22:44:39 +0900 Subject: [PATCH] Factor out --- src/librustc_mir/build/matches/test.rs | 39 ++++++++++++++++---------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/librustc_mir/build/matches/test.rs b/src/librustc_mir/build/matches/test.rs index 77db74685cd..0abbfc540e6 100644 --- a/src/librustc_mir/build/matches/test.rs +++ b/src/librustc_mir/build/matches/test.rs @@ -138,13 +138,9 @@ pub fn add_cases_to_switch<'pat>(&mut self, panic!("you should have called add_variants_to_switch instead!"); } PatternKind::Range { ty, lo, hi, end } => { - indices - .keys() - .all(|value| { - !self - .const_range_contains(ty, lo, hi, end, value) - .unwrap_or(true) - }) + // Check that none of the switch values are in the range. + self.values_not_contained_in_range(ty, lo, hi, end, indices) + .unwrap_or(false) } PatternKind::Slice { .. } | PatternKind::Array { .. } | @@ -541,16 +537,12 @@ pub fn sort_candidate<'pat>(&mut self, (&TestKind::SwitchInt { switch_ty: _, ref options, ref indices }, &PatternKind::Range { ty, lo, hi, end }) => { - let not_contained = indices - .keys() - .all(|value| { - !self - .const_range_contains(ty, lo, hi, end, value) - .unwrap_or(true) - }); + let not_contained = self + .values_not_contained_in_range(ty, lo, hi, end, indices) + .unwrap_or(false); if not_contained { - // No values are contained in the pattern range, + // No switch values are contained in the pattern range, // so the pattern can be matched only if this test fails. let otherwise = options.len(); resulting_candidates[otherwise].push(candidate.clone()); @@ -835,6 +827,23 @@ fn const_range_contains( _ => Some(false), } } + + fn values_not_contained_in_range( + &self, + ty: Ty<'tcx>, + lo: &'tcx ty::Const<'tcx>, + hi: &'tcx ty::Const<'tcx>, + end: RangeEnd, + indices: &FxHashMap<&'tcx ty::Const<'tcx>, usize>, + ) -> Option { + for val in indices.keys() { + if self.const_range_contains(ty, lo, hi, end, val)? { + return Some(false); + } + } + + Some(true) + } } fn is_switch_ty<'tcx>(ty: Ty<'tcx>) -> bool {