Rollup merge of #121706 - Nadrieril:simplify-sort-candidate, r=matthewjasper
match lowering: Remove hacky branch in sort_candidate Reusing `self.test()` there wasn't actually pulling a lot of weight. In particular the `TestKind::Len` cases were all already correctly handled. r? `@matthewjasper`
This commit is contained in:
commit
1fbc53af48
1 changed files with 17 additions and 34 deletions
|
@ -583,10 +583,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
fully_matched = true;
|
||||
Some(variant_index.as_usize())
|
||||
}
|
||||
(&TestKind::Switch { .. }, _) => {
|
||||
fully_matched = false;
|
||||
None
|
||||
}
|
||||
|
||||
// If we are performing a switch over integers, then this informs integer
|
||||
// equality, but nothing else.
|
||||
|
@ -611,10 +607,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
options.len()
|
||||
})
|
||||
}
|
||||
(&TestKind::SwitchInt { .. }, _) => {
|
||||
fully_matched = false;
|
||||
None
|
||||
}
|
||||
|
||||
(
|
||||
&TestKind::Len { len: test_len, op: BinOp::Eq },
|
||||
|
@ -703,35 +695,26 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
None
|
||||
}
|
||||
}
|
||||
(&TestKind::Range { .. }, _) => {
|
||||
fully_matched = false;
|
||||
None
|
||||
}
|
||||
|
||||
(&TestKind::Eq { .. } | &TestKind::Len { .. }, _) => {
|
||||
// The call to `self.test(&match_pair)` below is not actually used to generate any
|
||||
// MIR. Instead, we just want to compare with `test` (the parameter of the method)
|
||||
// to see if it is the same.
|
||||
//
|
||||
// However, at this point we can still encounter or-patterns that were extracted
|
||||
// from previous calls to `sort_candidate`, so we need to manually address that
|
||||
// case to avoid panicking in `self.test()`.
|
||||
if let TestCase::Or { .. } = &match_pair.test_case {
|
||||
return None;
|
||||
}
|
||||
|
||||
// These are all binary tests.
|
||||
//
|
||||
// FIXME(#29623) we can be more clever here
|
||||
let pattern_test = self.test(match_pair);
|
||||
if pattern_test.kind == test.kind {
|
||||
// FIXME(#29623): return `Some(1)` when the values are different.
|
||||
(TestKind::Eq { value: test_val, .. }, TestCase::Constant { value: case_val })
|
||||
if test_val == case_val =>
|
||||
{
|
||||
fully_matched = true;
|
||||
Some(0)
|
||||
} else {
|
||||
}
|
||||
|
||||
(
|
||||
TestKind::Switch { .. }
|
||||
| TestKind::SwitchInt { .. }
|
||||
| TestKind::Len { .. }
|
||||
| TestKind::Range { .. }
|
||||
| TestKind::Eq { .. },
|
||||
_,
|
||||
) => {
|
||||
fully_matched = false;
|
||||
None
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if fully_matched {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue