From e5a5fc20290e70752af73860b1a192b33588624f Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Wed, 13 Jun 2012 15:46:57 -0700 Subject: [PATCH] Allow impls to be re-exported It was a little hard for me to believe, but it seems that re-exporting an impl doesn't work at a, because encoder::encode_info_for_mod requires that all the impls in the current module's impl map be local (that is, bound to a value in the current crate's item map). Fixed it. Closes #2414. --- src/rustc/metadata/encoder.rs | 14 +++++++++----- src/test/auxiliary/issue-2414-a.rs | 5 +++++ src/test/auxiliary/issue-2414-b.rs | 9 +++++++++ src/test/run-pass/issue-2414-c.rs | 7 +++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 src/test/auxiliary/issue-2414-a.rs create mode 100644 src/test/auxiliary/issue-2414-b.rs create mode 100644 src/test/run-pass/issue-2414-c.rs diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs index e10554c79ed..9ad1ef1a4e1 100644 --- a/src/rustc/metadata/encoder.rs +++ b/src/rustc/metadata/encoder.rs @@ -396,17 +396,21 @@ fn encode_info_for_mod(ecx: @encode_ctxt, ebml_w: ebml::writer, md: _mod, let (ident, did) = i; if ast_util::is_exported(ident, md) { ebml_w.start_tag(tag_mod_impl); + alt ecx.tcx.items.find(did.node) { + some(ast_map::node_item(it@@{node: cl@item_class(*),_},_)) { /* If did stands for an iface ref, we need to map it to its parent class */ - alt ecx.tcx.items.get(did.node) { - ast_map::node_item(it@@{node: cl@item_class(*),_},_) { ebml_w.wr_str(def_to_str(local_def(it.id))); } - ast_map::node_item(@{node: item_impl(_,_, - some(ifce),_,_),_},_) { + some(ast_map::node_item(@{node: item_impl(_,_, + some(ifce),_,_),_},_)) { ebml_w.wr_str(def_to_str(did)); } - _ { + some(_) { + ebml_w.wr_str(def_to_str(did)); + } + none { + // Must be a re-export, then! ebml_w.wr_str(def_to_str(did)); } }; diff --git a/src/test/auxiliary/issue-2414-a.rs b/src/test/auxiliary/issue-2414-a.rs new file mode 100644 index 00000000000..0f4b51a8dad --- /dev/null +++ b/src/test/auxiliary/issue-2414-a.rs @@ -0,0 +1,5 @@ +#[link(name = "a", vers = "0.1")]; +#[crate_type = "lib"]; + +type t1 = uint; +impl t2 for str { } diff --git a/src/test/auxiliary/issue-2414-b.rs b/src/test/auxiliary/issue-2414-b.rs new file mode 100644 index 00000000000..b5a27c6fabc --- /dev/null +++ b/src/test/auxiliary/issue-2414-b.rs @@ -0,0 +1,9 @@ +// xfail-fast + +#[link(name = "b", vers = "0.1")]; +#[crate_type = "lib"]; + +use a; + +import a::t2; +export t2; diff --git a/src/test/run-pass/issue-2414-c.rs b/src/test/run-pass/issue-2414-c.rs new file mode 100644 index 00000000000..17defc82e22 --- /dev/null +++ b/src/test/run-pass/issue-2414-c.rs @@ -0,0 +1,7 @@ +// xfail-fast +// aux-build:issue-2414-a.rs +// aux-build:issue-2414-b.rs + +use b; + +fn main() {}