diff options
| author | Nadrieril <nadrieril+git@gmail.com> | 2019-11-06 16:52:37 +0000 |
|---|---|---|
| committer | Nadrieril <nadrieril+git@gmail.com> | 2019-11-16 13:33:46 +0000 |
| commit | 143fb4357f484c1c55811b97bace92482ba0ec5a (patch) | |
| tree | 0da2b8cbbe46462616fb0907469319742473c8a5 | |
| parent | 9b0214d9c560c49e2836c8491aa21d3dbf9f5554 (diff) | |
| download | rust-143fb4357f484c1c55811b97bace92482ba0ec5a.tar.gz rust-143fb4357f484c1c55811b97bace92482ba0ec5a.zip | |
Tweak VarLenSlice subtraction
| -rw-r--r-- | src/librustc_mir/hair/pattern/_match.rs | 67 |
1 files changed, 34 insertions, 33 deletions
diff --git a/src/librustc_mir/hair/pattern/_match.rs b/src/librustc_mir/hair/pattern/_match.rs index e30d6819d04..555772f8b58 100644 --- a/src/librustc_mir/hair/pattern/_match.rs +++ b/src/librustc_mir/hair/pattern/_match.rs @@ -655,44 +655,45 @@ impl<'tcx> Constructor<'tcx> { .into_iter() .flat_map(|pos_ctor| -> SmallVec<[Constructor<'tcx>; 1]> { // Compute `pos_ctor \ neg_ctor`. - match (&pos_ctor, neg_ctor) { - (&FixedLenSlice(pos_len), &VarLenSlice(neg_prefix, neg_suffix)) => { - let neg_len = neg_prefix + neg_suffix; - if neg_len <= pos_len { + match pos_ctor { + FixedLenSlice(pos_len) => match *neg_ctor { + FixedLenSlice(neg_len) if neg_len == pos_len => smallvec![], + VarLenSlice(neg_prefix, neg_suffix) + if neg_prefix + neg_suffix <= pos_len => + { smallvec![] - } else { - smallvec![pos_ctor] } - } - ( - &VarLenSlice(pos_prefix, pos_suffix), - &VarLenSlice(neg_prefix, neg_suffix), - ) => { - let neg_len = neg_prefix + neg_suffix; - let pos_len = pos_prefix + pos_suffix; - if neg_len <= pos_len { - smallvec![] - } else { - (pos_len..neg_len).map(FixedLenSlice).collect() - } - } - (&VarLenSlice(pos_prefix, pos_suffix), &FixedLenSlice(neg_len)) => { + _ => smallvec![pos_ctor], + }, + VarLenSlice(pos_prefix, pos_suffix) => { let pos_len = pos_prefix + pos_suffix; - if neg_len < pos_len { - smallvec![pos_ctor] - } else { - (pos_len..neg_len) - .map(FixedLenSlice) - // We know that `neg_len + 1 >= pos_len >= pos_suffix`. - .chain(Some(VarLenSlice( - neg_len + 1 - pos_suffix, - pos_suffix, - ))) - .collect() + match *neg_ctor { + FixedLenSlice(neg_len) if neg_len >= pos_len => { + (pos_len..neg_len) + .map(FixedLenSlice) + // We know that `neg_len + 1 >= pos_len >= + // pos_suffix`. + .chain(Some(VarLenSlice( + neg_len + 1 - pos_suffix, + pos_suffix, + ))) + .collect() + } + VarLenSlice(neg_prefix, neg_suffix) => { + let neg_len = neg_prefix + neg_suffix; + if neg_len <= pos_len { + smallvec![] + } else { + (pos_len..neg_len).map(FixedLenSlice).collect() + } + } + _ => smallvec![pos_ctor], } } - _ if pos_ctor == *neg_ctor => smallvec![], - _ => smallvec![pos_ctor], + _ => bug!( + "unexpected ctor while subtracting from VarLenSlice: {:?}", + pos_ctor + ), } }) .collect(); |
