]> git.lizzy.rs Git - rust.git/commitdiff
Fix cross-crate tuple structs in statics
authorJakub Wieczorek <jakub@jakub.cc>
Wed, 1 Oct 2014 21:28:54 +0000 (23:28 +0200)
committerJakub Wieczorek <jakub@jakub.cc>
Thu, 2 Oct 2014 19:31:06 +0000 (21:31 +0200)
Fixes #17169.
Fixes #17649.

src/librustc/middle/check_const.rs
src/librustc/middle/check_match.rs
src/librustc/middle/mem_categorization.rs
src/librustc/middle/privacy.rs
src/librustc/middle/resolve.rs
src/librustc/middle/trans/_match.rs
src/test/auxiliary/xcrate_unit_struct.rs
src/test/run-pass/xcrate-unit-struct.rs

index cc3679ec31deb3059924acfb8b7faca264759739..d8753c0b12a79e0a97f1b662cda97646d8398e1d 100644 (file)
@@ -149,7 +149,7 @@ fn check_expr(v: &mut CheckCrateVisitor, e: &Expr) {
           }
           ExprCall(ref callee, _) => {
             match v.tcx.def_map.borrow().find(&callee.id) {
-                Some(&DefStruct(..)) => {}    // OK.
+                Some(&DefStruct(..)) |
                 Some(&DefVariant(..)) => {}    // OK.
                 _ => {
                     span_err!(v.tcx.sess, e.span, E0015,
index de9125ec44918419319650d7fac240e9a0c44f74..36aa61c5c54f86462e8bdda8329775f23366efcd 100644 (file)
@@ -757,7 +757,7 @@ pub fn specialize<'a>(cx: &MatchCheckCtxt, r: &[&'a Pat],
                 DefStatic(..) =>
                     cx.tcx.sess.span_bug(pat_span, "static pattern should've been rewritten"),
                 DefVariant(_, id, _) if *constructor != Variant(id) => None,
-                DefVariant(..) | DefFn(..) | DefStruct(..) => {
+                DefVariant(..) | DefStruct(..) => {
                     Some(match args {
                         &Some(ref args) => args.iter().map(|p| &**p).collect(),
                         &None => Vec::from_elem(arity, &DUMMY_WILD_PAT)
index bb44b1f55cb450344ae4efa635a7a0c0549e4c22..c829b6dab4456ca688097254850287ea468066e3 100644 (file)
@@ -1083,7 +1083,6 @@ pub fn cat_pattern(&self,
                         if_ok!(self.cat_pattern(subcmt, &**subpat, |x,y,z| op(x,y,z)));
                     }
                 }
-                Some(&def::DefFn(..)) |
                 Some(&def::DefStruct(..)) => {
                     for (i, subpat) in subpats.iter().enumerate() {
                         let subpat_ty = if_ok!(self.pat_ty(&**subpat)); // see (*2)
index 22ac390602dfee9e20e4ee008860d67f12f7e0e1..7e415d1f5c1a72dcac132f339b4733a7c74ad0e6 100644 (file)
@@ -931,15 +931,6 @@ struct type?!"),
                             maybe_did.unwrap_or(did)
                         })
                     }
-                    // Tuple struct constructors across crates are identified as
-                    // DefFn types, so we explicitly handle that case here.
-                    Some(&def::DefFn(did, _, _)) if !is_local(did) => {
-                        match csearch::get_tuple_struct_definition_if_ctor(
-                                    &self.tcx.sess.cstore, did) {
-                            Some(did) => guard(did),
-                            None => {}
-                        }
-                    }
                     _ => {}
                 }
             }
index 42a98be0fb84e1a93db2f5d78c88128b3bd42133..cb93ad1b5cf874df418f737e44b334d74494f077 100644 (file)
@@ -1824,6 +1824,11 @@ fn handle_external_def(&mut self,
                 child_name_bindings.define_value(def, DUMMY_SP, is_exported);
             }
           }
+          DefFn(ctor_id, _, true) => {
+            child_name_bindings.define_value(
+                csearch::get_tuple_struct_definition_if_ctor(&self.session.cstore, ctor_id)
+                    .map_or(def, |_| DefStruct(ctor_id)), DUMMY_SP, is_public);
+          }
           DefFn(..) | DefStaticMethod(..) | DefStatic(..) => {
             debug!("(building reduced graph for external \
                     crate) building value (fn/static) {}", final_ident);
index 68d0bb2d8b49805220a6e796172a7d989c31eed6..ca62f518619182c1d6033651532e51d836c80aae 100644 (file)
@@ -698,7 +698,6 @@ fn any_irrefutable_adt_pat(tcx: &ty::ctxt, m: &[Match], col: uint) -> bool {
             }
             ast::PatEnum(..) | ast::PatIdent(_, _, None) => {
                 match tcx.def_map.borrow().find(&pat.id) {
-                    Some(&def::DefFn(..)) |
                     Some(&def::DefStruct(..)) => true,
                     _ => false
                 }
@@ -1646,7 +1645,6 @@ fn bind_irrefutable_pat<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
                         }
                     }
                 }
-                Some(def::DefFn(..)) |
                 Some(def::DefStruct(..)) => {
                     match *sub_pats {
                         None => {
index 6487c704765b352b1454c480461e8e122a3bce80..d56d7a70edfc863b6ff4565209588ac1a9f7ca59 100644 (file)
@@ -19,6 +19,8 @@ pub enum Unit {
     Argument(Struct)
 }
 
+pub struct TupleStruct(pub uint, pub &'static str);
+
 // used by the cfail test
 
 pub struct StructWithFields {
index 9ba4b707268a07b756f98cd6d539616ed997b423..f66caa5fbfc6e0a4794740dd9d3b86a849fefc06 100644 (file)
 static s3: xcrate_unit_struct::Unit =
                 xcrate_unit_struct::Argument(xcrate_unit_struct::Struct);
 static s4: xcrate_unit_struct::Unit = xcrate_unit_struct::Argument(s1);
+static s5: xcrate_unit_struct::TupleStruct = xcrate_unit_struct::TupleStruct(20, "foo");
 
 fn f1(_: xcrate_unit_struct::Struct) {}
 fn f2(_: xcrate_unit_struct::Unit) {}
+fn f3(_: xcrate_unit_struct::TupleStruct) {}
 
 pub fn main() {
     f1(xcrate_unit_struct::Struct);
     f2(xcrate_unit_struct::UnitVariant);
     f2(xcrate_unit_struct::Argument(xcrate_unit_struct::Struct));
+    f3(xcrate_unit_struct::TupleStruct(10, "bar"));
 
     f1(s1);
     f2(s2);
     f2(s3);
     f2(s4);
+    f3(s5);
 }