]> git.lizzy.rs Git - rust.git/commitdiff
Fix #15896
authorEdward Wang <edward.yu.wang@gmail.com>
Thu, 24 Jul 2014 16:44:35 +0000 (00:44 +0800)
committerEdward Wang <edward.yu.wang@gmail.com>
Thu, 24 Jul 2014 16:44:35 +0000 (00:44 +0800)
Fix ICE when there's an incorrect enum variant constructor in match arm.

Closes #15896.

src/librustc/middle/typeck/check/_match.rs
src/test/compile-fail/issue-15896.rs [new file with mode: 0644]

index be01643e22a583e6a547a267d6e0451077f3a033..a7e1979669bce79034d44241b981744ba82bb6c0 100644 (file)
@@ -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 (file)
index 0000000..a873c1e
--- /dev/null
@@ -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,
+    };
+}