diff options
| author | Edward Wang <edward.yu.wang@gmail.com> | 2014-07-25 00:44:35 +0800 |
|---|---|---|
| committer | Edward Wang <edward.yu.wang@gmail.com> | 2014-07-25 00:44:35 +0800 |
| commit | c3f4c6d492da220f55433029a406adc4c7161f1a (patch) | |
| tree | 3bce79e6621500305ff62c4ef9fcc54eee7a93f7 | |
| parent | 482c776d5a705d62a8093f2a441919278eb2b1d0 (diff) | |
| download | rust-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.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-15896.rs | 24 |
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, + }; +} |
