diff options
| author | varkor <github@varkor.com> | 2018-06-23 14:41:01 +0100 |
|---|---|---|
| committer | varkor <github@varkor.com> | 2018-06-23 14:41:01 +0100 |
| commit | e14e48bfaa36bda05a467dca0743dab5b10de097 (patch) | |
| tree | c2d1250052357aad5bcb6fc184ee3c8ffbedf2f1 | |
| parent | 56e8f29dbe89f2109cacc8eb5e92ea3de32eefb9 (diff) | |
| download | rust-e14e48bfaa36bda05a467dca0743dab5b10de097.tar.gz rust-e14e48bfaa36bda05a467dca0743dab5b10de097.zip | |
Fix an ICE when matching over const slices
| -rw-r--r-- | src/librustc_mir/hair/pattern/_match.rs | 13 | ||||
| -rw-r--r-- | src/test/run-pass/issue-51655.rs | 23 |
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() {} |
