about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-10-01 15:06:25 -0700
committerbors <bors@rust-lang.org>2013-10-01 15:06:25 -0700
commitfe4e7478c5b89994795292db2cea2f944c0f1013 (patch)
tree38c10a5e9826d0c5b8daf62539992b57797f1f72
parent08b510c351e990d835511f45a28f2f29c12ee545 (diff)
parent76d92c547288d5b9a39789868465bb83e0bcead2 (diff)
downloadrust-fe4e7478c5b89994795292db2cea2f944c0f1013.tar.gz
rust-fe4e7478c5b89994795292db2cea2f944c0f1013.zip
auto merge of #9560 : pcwalton/rust/xc-tuple-structs, r=pcwalton
r? @thestinger
-rw-r--r--src/librustc/metadata/encoder.rs9
-rw-r--r--src/librustc/middle/trans/inline.rs11
-rw-r--r--src/libsyntax/ast_map.rs4
-rw-r--r--src/libsyntax/ast_util.rs11
4 files changed, 30 insertions, 5 deletions
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs
index ff59376aa37..e88ee701051 100644
--- a/src/librustc/metadata/encoder.rs
+++ b/src/librustc/metadata/encoder.rs
@@ -747,7 +747,8 @@ fn encode_info_for_struct_ctor(ecx: &EncodeContext,
                                path: &[ast_map::path_elt],
                                name: ast::Ident,
                                ctor_id: NodeId,
-                               index: @mut ~[entry<i64>]) {
+                               index: @mut ~[entry<i64>],
+                               struct_id: NodeId) {
     index.push(entry { val: ctor_id as i64, pos: ebml_w.writer.tell() });
 
     ebml_w.start_tag(tag_items_data_item);
@@ -756,6 +757,7 @@ fn encode_info_for_struct_ctor(ecx: &EncodeContext,
     encode_name(ecx, ebml_w, name);
     encode_type(ecx, ebml_w, node_id_to_type(ecx.tcx, ctor_id));
     encode_path(ecx, ebml_w, path, ast_map::path_name(name));
+    encode_parent_item(ebml_w, local_def(struct_id));
 
     if ecx.item_symbols.contains_key(&ctor_id) {
         encode_symbol(ecx, ebml_w, ctor_id);
@@ -1032,6 +1034,8 @@ fn encode_info_for_item(ecx: &EncodeContext,
         needs to know*/
         encode_struct_fields(ecx, ebml_w, struct_def);
 
+        (ecx.encode_inlined_item)(ecx, ebml_w, path, ii_item(item));
+
         // Encode inherent implementations for this structure.
         encode_inherent_implementations(ecx, ebml_w, def_id);
 
@@ -1054,7 +1058,8 @@ fn encode_info_for_item(ecx: &EncodeContext,
                                         path,
                                         item.ident,
                                         ctor_id,
-                                        index);
+                                        index,
+                                        def_id.node);
         }
       }
       item_impl(_, ref opt_trait, ref ty, ref ast_methods) => {
diff --git a/src/librustc/middle/trans/inline.rs b/src/librustc/middle/trans/inline.rs
index de117a7c037..41a835fcab9 100644
--- a/src/librustc/middle/trans/inline.rs
+++ b/src/librustc/middle/trans/inline.rs
@@ -99,8 +99,17 @@ pub fn maybe_instantiate_inline(ccx: @mut CrateContext, fn_id: ast::DefId)
                   ccx.external.insert(there.id, Some(here.id.node));
               }
             }
+            ast::item_struct(ref struct_def, _) => {
+              match struct_def.ctor_id {
+                None => {}
+                Some(ctor_id) => {
+                    let _ = ccx.external.insert(fn_id, Some(ctor_id));
+                    my_id = ctor_id;
+                }
+              }
+            }
             _ => ccx.sess.bug("maybe_instantiate_inline: item has a \
-                               non-enum parent")
+                               non-enum, non-struct parent")
           }
           trans_item(ccx, item);
           local_def(my_id)
diff --git a/src/libsyntax/ast_map.rs b/src/libsyntax/ast_map.rs
index 105d222926e..b3d5e03331c 100644
--- a/src/libsyntax/ast_map.rs
+++ b/src/libsyntax/ast_map.rs
@@ -403,9 +403,9 @@ pub fn map_decoded_item(diag: @mut span_handler,
         diag: diag,
     };
 
-    // methods get added to the AST map when their impl is visited.  Since we
+    // Methods get added to the AST map when their impl is visited.  Since we
     // don't decode and instantiate the impl, but just the method, we have to
-    // add it to the table now:
+    // add it to the table now. Likewise with foreign items.
     match *ii {
         ii_item(*) => {} // fallthrough
         ii_foreign(i) => {
diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs
index 12ad7111f7f..d3a01401fdb 100644
--- a/src/libsyntax/ast_util.rs
+++ b/src/libsyntax/ast_util.rs
@@ -590,6 +590,17 @@ impl Visitor<()> for IdVisitor {
         self.operation.visit_id(struct_field.node.id);
         visit::walk_struct_field(self, struct_field, env)
     }
+
+    fn visit_struct_def(&mut self,
+                        struct_def: @struct_def,
+                        ident: ast::Ident,
+                        generics: &ast::Generics,
+                        id: NodeId,
+                        _: ()) {
+        self.operation.visit_id(id);
+        struct_def.ctor_id.map(|&ctor_id| self.operation.visit_id(ctor_id));
+        visit::walk_struct_def(self, struct_def, ident, generics, id, ());
+    }
 }
 
 pub fn visit_ids_for_inlined_item(item: &inlined_item,