]> git.lizzy.rs Git - rust.git/commitdiff
Fix an ICE when using struct patterns with traits
authorJakub Bukaj <jakub@jakub.cc>
Sun, 16 Nov 2014 19:55:17 +0000 (20:55 +0100)
committerJakub Bukaj <jakub@jakub.cc>
Mon, 17 Nov 2014 20:49:41 +0000 (21:49 +0100)
Fixes #18986.

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

index 1792599783b2cacfcab0bce2ef2ecea112c9e584..b5dafdb18076680efdd3e313b32e957555f59cb4 100644 (file)
     E0164,
     E0165,
     E0166,
-    E0167
+    E0167,
+    E0168
 )
index 90c3d8c4f3f1d6c1a5e681f856eb2d77a230ccfe..a79edf28b3617583204be72b0aab22993f1fcdb1 100644 (file)
@@ -297,22 +297,38 @@ pub fn check_pat_struct(pcx: &pat_ctxt, pat: &ast::Pat,
     let tcx = pcx.fcx.ccx.tcx;
 
     let def = tcx.def_map.borrow()[pat.id].clone();
-    let def_type = ty::lookup_item_type(tcx, def.def_id());
-    let (enum_def_id, variant_def_id) = match ty::get(def_type.ty).sty {
-        ty::ty_struct(struct_def_id, _) =>
-            (struct_def_id, struct_def_id),
-        ty::ty_enum(enum_def_id, _) if def == def::DefVariant(enum_def_id, def.def_id(), true) =>
-            (enum_def_id, def.def_id()),
-        _ => {
+    let (enum_def_id, variant_def_id) = match def {
+        def::DefTrait(_) => {
             let name = pprust::path_to_string(path);
-            span_err!(tcx.sess, pat.span, E0163,
-                "`{}` does not name a struct or a struct variant", name);
+            span_err!(tcx.sess, pat.span, E0168,
+                "use of trait `{}` in a struct pattern", name);
             fcx.write_error(pat.id);
 
             for field in fields.iter() {
                 check_pat(pcx, &*field.node.pat, ty::mk_err());
             }
             return;
+        },
+        _ => {
+            let def_type = ty::lookup_item_type(tcx, def.def_id());
+            match ty::get(def_type.ty).sty {
+                ty::ty_struct(struct_def_id, _) =>
+                    (struct_def_id, struct_def_id),
+                ty::ty_enum(enum_def_id, _)
+                    if def == def::DefVariant(enum_def_id, def.def_id(), true) =>
+                    (enum_def_id, def.def_id()),
+                _ => {
+                    let name = pprust::path_to_string(path);
+                    span_err!(tcx.sess, pat.span, E0163,
+                        "`{}` does not name a struct or a struct variant", name);
+                    fcx.write_error(pat.id);
+
+                    for field in fields.iter() {
+                        check_pat(pcx, &*field.node.pat, ty::mk_err());
+                    }
+                    return;
+                }
+            }
         }
     };
 
diff --git a/src/test/compile-fail-fulldeps/issue-18986.rs b/src/test/compile-fail-fulldeps/issue-18986.rs
new file mode 100644 (file)
index 0000000..25d78c2
--- /dev/null
@@ -0,0 +1,20 @@
+// 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.
+
+// aux-build:use_from_trait_xc.rs
+
+extern crate use_from_trait_xc;
+pub use use_from_trait_xc::Trait;
+
+fn main() {
+    match () {
+        Trait { x: 42u } => () //~ ERROR use of trait `Trait` in a struct pattern
+    }
+}