about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEdward Wang <edward.yu.wang@gmail.com>2014-07-25 00:44:35 +0800
committerEdward Wang <edward.yu.wang@gmail.com>2014-07-25 00:44:35 +0800
commitc3f4c6d492da220f55433029a406adc4c7161f1a (patch)
tree3bce79e6621500305ff62c4ef9fcc54eee7a93f7
parent482c776d5a705d62a8093f2a441919278eb2b1d0 (diff)
downloadrust-c3f4c6d492da220f55433029a406adc4c7161f1a.tar.gz
rust-c3f4c6d492da220f55433029a406adc4c7161f1a.zip
Fix #15896
Fix ICE when there's an incorrect enum variant constructor in match arm.

Closes #15896.
-rw-r--r--src/librustc/middle/typeck/check/_match.rs4
-rw-r--r--src/test/compile-fail/issue-15896.rs24
2 files changed, 27 insertions, 1 deletions
diff --git a/src/librustc/middle/typeck/check/_match.rs b/src/librustc/middle/typeck/check/_match.rs
index be01643e22a..a7e1979669b 100644
--- a/src/librustc/middle/typeck/check/_match.rs
+++ b/src/librustc/middle/typeck/check/_match.rs
@@ -390,7 +390,9 @@ pub fn check_struct_like_enum_variant_pat(pcx: &pat_ctxt,
             check_struct_pat_fields(pcx, span, fields, class_fields,
                                     variant_id, substitutions, etc);
         }
-        Some(&def::DefStruct(..)) | Some(&def::DefVariant(..)) => {
+        Some(&def::DefStruct(..)) |
+        Some(&def::DefVariant(..)) |
+        Some(&def::DefTy(..)) => {
             let name = pprust::path_to_string(path);
             span_err!(tcx.sess, span, E0028,
                 "mismatched types: expected `{}` but found `{}`",
diff --git a/src/test/compile-fail/issue-15896.rs b/src/test/compile-fail/issue-15896.rs
new file mode 100644
index 00000000000..a873c1e3b3f
--- /dev/null
+++ b/src/test/compile-fail/issue-15896.rs
@@ -0,0 +1,24 @@
+// Copyright 2012-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.
+
+// Regression test for #15896. It used to ICE rustc.
+
+fn main() {
+    enum R { REB(()) }
+    struct Tau { t: uint }
+    enum E { B(R, Tau) }
+
+    let e = B(REB(()), Tau { t: 3 });
+    let u = match e {
+        B(
+          Tau{t: x},    //~ ERROR mismatched types
+          _) => x,
+    };
+}