about summary refs log tree commit diff
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2018-06-23 14:41:01 +0100
committervarkor <github@varkor.com>2018-06-23 14:41:01 +0100
commite14e48bfaa36bda05a467dca0743dab5b10de097 (patch)
treec2d1250052357aad5bcb6fc184ee3c8ffbedf2f1
parent56e8f29dbe89f2109cacc8eb5e92ea3de32eefb9 (diff)
downloadrust-e14e48bfaa36bda05a467dca0743dab5b10de097.tar.gz
rust-e14e48bfaa36bda05a467dca0743dab5b10de097.zip
Fix an ICE when matching over const slices
-rw-r--r--src/librustc_mir/hair/pattern/_match.rs13
-rw-r--r--src/test/run-pass/issue-51655.rs23
2 files changed, 32 insertions, 4 deletions
diff --git a/src/librustc_mir/hair/pattern/_match.rs b/src/librustc_mir/hair/pattern/_match.rs
index a7b2e205d00..41024e60202 100644
--- a/src/librustc_mir/hair/pattern/_match.rs
+++ b/src/librustc_mir/hair/pattern/_match.rs
@@ -25,6 +25,7 @@ use rustc::hir::RangeEnd;
 use rustc::ty::{self, Ty, TyCtxt, TypeFoldable};
 
 use rustc::mir::Field;
+use rustc::mir::interpret::ConstValue;
 use rustc::util::common::ErrorReported;
 
 use syntax_pos::{Span, DUMMY_SP};
@@ -932,16 +933,20 @@ fn slice_pat_covered_by_constructor<'tcx>(
     suffix: &[Pattern<'tcx>]
 ) -> Result<bool, ErrorReported> {
     let data: &[u8] = match *ctor {
-        ConstantValue(const_val @ &ty::Const { val: ConstVal::Value(..), .. }) => {
-            if let Some(ptr) = const_val.to_ptr() {
-                let is_array_ptr = const_val.ty
+        ConstantValue(&ty::Const { val: ConstVal::Value(const_val), ty }) => {
+            let val = match const_val {
+                ConstValue::ByRef(..) => bug!("unexpected ConstValue::ByRef"),
+                ConstValue::Scalar(val) | ConstValue::ScalarPair(val, _) => val,
+            };
+            if let Ok(ptr) = val.to_ptr() {
+                let is_array_ptr = ty
                     .builtin_deref(true)
                     .and_then(|t| t.ty.builtin_index())
                     .map_or(false, |t| t == tcx.types.u8);
                 assert!(is_array_ptr);
                 tcx.alloc_map.lock().unwrap_memory(ptr.alloc_id).bytes.as_ref()
             } else {
-                bug!()
+                bug!("unexpected non-ptr ConstantValue")
             }
         }
         _ => bug!()
diff --git a/src/test/run-pass/issue-51655.rs b/src/test/run-pass/issue-51655.rs
new file mode 100644
index 00000000000..b5b89ede91b
--- /dev/null
+++ b/src/test/run-pass/issue-51655.rs
@@ -0,0 +1,23 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(dead_code)]
+
+const PATH_DOT: &[u8] = &[b'.'];
+
+fn match_slice(element: &[u8]) {
+    match element {
+        &[] => {}
+        PATH_DOT => {}
+        _ => {}
+    }
+}
+
+fn main() {}