Skip to content

Commit 143fb43

Browse files
committed
Tweak VarLenSlice subtraction
1 parent 9b0214d commit 143fb43

File tree

1 file changed

+34
-33
lines changed

1 file changed

+34
-33
lines changed

src/librustc_mir/hair/pattern/_match.rs

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -655,44 +655,45 @@ impl<'tcx> Constructor<'tcx> {
655655
.into_iter()
656656
.flat_map(|pos_ctor| -> SmallVec<[Constructor<'tcx>; 1]> {
657657
// Compute `pos_ctor \ neg_ctor`.
658-
match (&pos_ctor, neg_ctor) {
659-
(&FixedLenSlice(pos_len), &VarLenSlice(neg_prefix, neg_suffix)) => {
660-
let neg_len = neg_prefix + neg_suffix;
661-
if neg_len <= pos_len {
658+
match pos_ctor {
659+
FixedLenSlice(pos_len) => match *neg_ctor {
660+
FixedLenSlice(neg_len) if neg_len == pos_len => smallvec![],
661+
VarLenSlice(neg_prefix, neg_suffix)
662+
if neg_prefix + neg_suffix <= pos_len =>
663+
{
662664
smallvec![]
663-
} else {
664-
smallvec![pos_ctor]
665665
}
666-
}
667-
(
668-
&VarLenSlice(pos_prefix, pos_suffix),
669-
&VarLenSlice(neg_prefix, neg_suffix),
670-
) => {
671-
let neg_len = neg_prefix + neg_suffix;
672-
let pos_len = pos_prefix + pos_suffix;
673-
if neg_len <= pos_len {
674-
smallvec![]
675-
} else {
676-
(pos_len..neg_len).map(FixedLenSlice).collect()
677-
}
678-
}
679-
(&VarLenSlice(pos_prefix, pos_suffix), &FixedLenSlice(neg_len)) => {
666+
_ => smallvec![pos_ctor],
667+
},
668+
VarLenSlice(pos_prefix, pos_suffix) => {
680669
let pos_len = pos_prefix + pos_suffix;
681-
if neg_len < pos_len {
682-
smallvec![pos_ctor]
683-
} else {
684-
(pos_len..neg_len)
685-
.map(FixedLenSlice)
686-
// We know that `neg_len + 1 >= pos_len >= pos_suffix`.
687-
.chain(Some(VarLenSlice(
688-
neg_len + 1 - pos_suffix,
689-
pos_suffix,
690-
)))
691-
.collect()
670+
match *neg_ctor {
671+
FixedLenSlice(neg_len) if neg_len >= pos_len => {
672+
(pos_len..neg_len)
673+
.map(FixedLenSlice)
674+
// We know that `neg_len + 1 >= pos_len >=
675+
// pos_suffix`.
676+
.chain(Some(VarLenSlice(
677+
neg_len + 1 - pos_suffix,
678+
pos_suffix,
679+
)))
680+
.collect()
681+
}
682+
VarLenSlice(neg_prefix, neg_suffix) => {
683+
let neg_len = neg_prefix + neg_suffix;
684+
if neg_len <= pos_len {
685+
smallvec![]
686+
} else {
687+
(pos_len..neg_len).map(FixedLenSlice).collect()
688+
}
689+
}
690+
_ => smallvec![pos_ctor],
692691
}
693692
}
694-
_ if pos_ctor == *neg_ctor => smallvec![],
695-
_ => smallvec![pos_ctor],
693+
_ => bug!(
694+
"unexpected ctor while subtracting from VarLenSlice: {:?}",
695+
pos_ctor
696+
),
696697
}
697698
})
698699
.collect();

0 commit comments

Comments
 (0)