about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNadrieril <nadrieril+git@gmail.com>2019-11-06 16:52:37 +0000
committerNadrieril <nadrieril+git@gmail.com>2019-11-16 13:33:46 +0000
commit143fb4357f484c1c55811b97bace92482ba0ec5a (patch)
tree0da2b8cbbe46462616fb0907469319742473c8a5
parent9b0214d9c560c49e2836c8491aa21d3dbf9f5554 (diff)
downloadrust-143fb4357f484c1c55811b97bace92482ba0ec5a.tar.gz
rust-143fb4357f484c1c55811b97bace92482ba0ec5a.zip
Tweak VarLenSlice subtraction
-rw-r--r--src/librustc_mir/hair/pattern/_match.rs67
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();