about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-04-30 02:21:37 -0700
committerbors <bors@rust-lang.org>2013-04-30 02:21:37 -0700
commitc081ffbd1e845687202a975ea2e698b623e5722f (patch)
treef493148208f92f81bbf63560e676e75b26c1a79a /src
parent84e22f2b8eacf30a5142a07d5e5667705c6a10d3 (diff)
parent10f290ef68870e54e6b5bcc75e953210a26b46e9 (diff)
auto merge of #6121 : luqmana/rust/newtype-cc, r=graydon
#6086
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/check_match.rs2
-rw-r--r--src/librustc/middle/mem_categorization.rs1
-rw-r--r--src/librustc/middle/resolve.rs1
-rw-r--r--src/librustc/middle/trans/_match.rs4
-rw-r--r--src/test/run-pass/cross-crate-newtype-struct-pat.rs21
5 files changed, 29 insertions, 0 deletions
diff --git a/src/librustc/middle/check_match.rs b/src/librustc/middle/check_match.rs
index 9ba1d2523c6..852eb1b50a4 100644
--- a/src/librustc/middle/check_match.rs
+++ b/src/librustc/middle/check_match.rs
@@ -551,6 +551,8 @@ pub fn specialize(cx: @MatchCheckCtxt,
                         Some(vec::append(args, vec::from_slice(r.tail())))
                     }
                     def_variant(_, _) => None,
+
+                    def_fn(*) |
                     def_struct(*) => {
                         // FIXME #4731: Is this right? --pcw
                         let new_args;
diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs
index 31cb39bc231..7fa198be1d4 100644
--- a/src/librustc/middle/mem_categorization.rs
+++ b/src/librustc/middle/mem_categorization.rs
@@ -912,6 +912,7 @@ pub impl mem_categorization_ctxt {
                         self.cat_pattern(subcmt, *subpat, op);
                     }
                 }
+                Some(&ast::def_fn(*)) |
                 Some(&ast::def_struct(*)) => {
                     for subpats.each |subpat| {
                         let cmt_field = self.cat_anon_struct_field(*subpat,
diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs
index 681c3863327..294a21fac2c 100644
--- a/src/librustc/middle/resolve.rs
+++ b/src/librustc/middle/resolve.rs
@@ -4277,6 +4277,7 @@ pub impl Resolver {
                 pat_enum(path, _) => {
                     // This must be an enum variant, struct or const.
                     match self.resolve_path(path, ValueNS, false, visitor) {
+                        Some(def @ def_fn(*))      |
                         Some(def @ def_variant(*)) |
                         Some(def @ def_struct(*))  |
                         Some(def @ def_const(*)) => {
diff --git a/src/librustc/middle/trans/_match.rs b/src/librustc/middle/trans/_match.rs
index e31ad63953e..3755cca8c35 100644
--- a/src/librustc/middle/trans/_match.rs
+++ b/src/librustc/middle/trans/_match.rs
@@ -291,6 +291,7 @@ pub fn variant_opt(bcx: block, pat_id: ast::node_id)
             }
             ::core::util::unreachable();
         }
+        ast::def_fn(*) |
         ast::def_struct(_) => {
             return lit(UnitLikeStructLit(pat_id));
         }
@@ -818,6 +819,7 @@ pub fn get_options(bcx: block, m: &[@Match], col: uint) -> ~[Opt] {
                 // This could be one of: a tuple-like enum variant, a
                 // struct-like enum variant, or a struct.
                 match ccx.tcx.def_map.find(&cur.id) {
+                    Some(&ast::def_fn(*)) |
                     Some(&ast::def_variant(*)) => {
                         add_to_set(ccx.tcx, &mut found,
                                    variant_opt(bcx, cur.id));
@@ -1011,6 +1013,7 @@ pub fn any_tuple_struct_pat(bcx: block, m: &[@Match], col: uint) -> bool {
         match pat.node {
             ast::pat_enum(_, Some(_)) => {
                 match bcx.tcx().def_map.find(&pat.id) {
+                    Some(&ast::def_fn(*)) |
                     Some(&ast::def_struct(*)) => true,
                     _ => false
                 }
@@ -1780,6 +1783,7 @@ pub fn bind_irrefutable_pat(bcx: block,
                         }
                     }
                 }
+                Some(&ast::def_fn(*)) |
                 Some(&ast::def_struct(*)) => {
                     match *sub_pats {
                         None => {
diff --git a/src/test/run-pass/cross-crate-newtype-struct-pat.rs b/src/test/run-pass/cross-crate-newtype-struct-pat.rs
new file mode 100644
index 00000000000..37d5c5c700b
--- /dev/null
+++ b/src/test/run-pass/cross-crate-newtype-struct-pat.rs
@@ -0,0 +1,21 @@
+// Copyright 2013 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.
+
+// xfail-fast
+// aux-build:newtype_struct_xc.rs
+
+extern mod newtype_struct_xc;
+
+fn main() {
+    let x = newtype_struct_xc::Au(21);
+    match x {
+        newtype_struct_xc::Au(n) => assert_eq!(n, 21)
+    }
+}