about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-05-20 21:42:30 -0700
committerAlex Crichton <alex@alexcrichton.com>2014-05-20 21:42:30 -0700
commit0089215472db188f7d102fa3fa3e086880d2ee4f (patch)
treefa85e263b2f256707ed0c4b33e43266064bad3bd /src
parent40d3241a4a929dc095dd94862e25e5684ef1083d (diff)
downloadrust-0089215472db188f7d102fa3fa3e086880d2ee4f.tar.gz
rust-0089215472db188f7d102fa3fa3e086880d2ee4f.zip
rustc: Avoid an unwrap() in check_match
Closes #12369
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/check_match.rs6
-rw-r--r--src/test/compile-fail/issue-12369.rs19
2 files changed, 23 insertions, 2 deletions
diff --git a/src/librustc/middle/check_match.rs b/src/librustc/middle/check_match.rs
index 67bdb949327..7b91928ba41 100644
--- a/src/librustc/middle/check_match.rs
+++ b/src/librustc/middle/check_match.rs
@@ -342,8 +342,10 @@ fn is_useful_specialized(cx: &MatchCheckCtxt,
     let ms = m.iter().filter_map(|r| {
         specialize(cx, r.as_slice(), &ctor, arity, lty)
     }).collect::<matrix>();
-    let could_be_useful = is_useful(
-        cx, &ms, specialize(cx, v, &ctor, arity, lty).unwrap().as_slice());
+    let could_be_useful = match specialize(cx, v, &ctor, arity, lty) {
+        Some(v) => is_useful(cx, &ms, v.as_slice()),
+        None => return not_useful,
+    };
     match could_be_useful {
       useful_ => useful(lty, ctor),
       u => u,
diff --git a/src/test/compile-fail/issue-12369.rs b/src/test/compile-fail/issue-12369.rs
new file mode 100644
index 00000000000..7d800899e52
--- /dev/null
+++ b/src/test/compile-fail/issue-12369.rs
@@ -0,0 +1,19 @@
+// Copyright 2014 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.
+
+fn main() {
+    let sl = vec![1,2,3];
+    let v: int = match sl.as_slice() {
+        [] => 0,
+        [a,b,c] => 3,
+        [a, ..rest] => a,
+        [10,a, ..rest] => 10 //~ ERROR: unreachable pattern
+    };
+}