about summary refs log tree commit diff
path: root/src/librustc_mir
diff options
context:
space:
mode:
authorNadrieril <nadrieril+git@gmail.com>2019-11-03 23:11:04 +0000
committerNadrieril <nadrieril+git@gmail.com>2019-11-05 17:59:01 +0000
commit65bc67e8d9922c450ee81971cd1bab030fcf0a14 (patch)
tree9e6177cb39d02b12a0c47879eb57022232b23204 /src/librustc_mir
parentb66973043e555f3a24a50a227db76b0a069ea037 (diff)
downloadrust-65bc67e8d9922c450ee81971cd1bab030fcf0a14.tar.gz
rust-65bc67e8d9922c450ee81971cd1bab030fcf0a14.zip
Make exhaustiveness error message more consistent for slice patterns
This improves error messages by indicating when slices above a certain
lengths have not been matched. Previously, we would only report examples
of such lengths, but of course never all of them.
Diffstat (limited to 'src/librustc_mir')
-rw-r--r--src/librustc_mir/hair/pattern/_match.rs14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/librustc_mir/hair/pattern/_match.rs b/src/librustc_mir/hair/pattern/_match.rs
index 902d9b610ce..c70a7ea1f37 100644
--- a/src/librustc_mir/hair/pattern/_match.rs
+++ b/src/librustc_mir/hair/pattern/_match.rs
@@ -841,9 +841,17 @@ impl<'tcx> Constructor<'tcx> {
 
             ty::Ref(..) => PatKind::Deref { subpattern: subpatterns.nth(0).unwrap() },
 
-            ty::Slice(_) | ty::Array(..) => {
-                PatKind::Slice { prefix: subpatterns.collect(), slice: None, suffix: vec![] }
-            }
+            ty::Slice(_) | ty::Array(..) => match self {
+                FixedLenSlice(_) => {
+                    PatKind::Slice { prefix: subpatterns.collect(), slice: None, suffix: vec![] }
+                }
+                VarLenSlice(_) => {
+                    let prefix = subpatterns.collect();
+                    let wild = Pat { ty, span: DUMMY_SP, kind: Box::new(PatKind::Wild) };
+                    PatKind::Slice { prefix, slice: Some(wild), suffix: vec![] }
+                }
+                _ => bug!("bad slice pattern {:?} {:?}", self, ty),
+            },
 
             _ => match *self {
                 ConstantValue(value, _) => PatKind::Constant { value },