diff --git a/src/rustc/metadata/creader.rs b/src/rustc/metadata/creader.rs index 0721342767d0..ae3efa665ab8 100644 --- a/src/rustc/metadata/creader.rs +++ b/src/rustc/metadata/creader.rs @@ -314,16 +314,21 @@ fn load_library_crate(sess: session::session, ident: ast::ident, span: span, } } -fn metas_with_ident(ident: ast::ident, +fn metas_with(ident: ast::ident, key: str, metas: [@ast::meta_item]) -> [@ast::meta_item] { - let name_items = attr::find_meta_items_by_name(metas, "name"); + let name_items = attr::find_meta_items_by_name(metas, key); if name_items.is_empty() { - metas + [attr::mk_name_value_item_str("name", ident)] + metas + [attr::mk_name_value_item_str(key, ident)] } else { metas } } +fn metas_with_ident(ident: ast::ident, + metas: [@ast::meta_item]) -> [@ast::meta_item] { + metas_with(ident, "name", metas) +} + fn existing_match(e: env, metas: [@ast::meta_item]) -> option { let maybe_entry = e.crate_cache.find {|c| metadata_matches(*c.metas, metas) @@ -381,11 +386,12 @@ fn resolve_crate_deps(e: env, cdata: @[u8]) -> cstore::cnum_map { let cnum_map = int_hash::(); for decoder::get_crate_deps(cdata).each {|dep| let extrn_cnum = dep.cnum; - let cname = dep.ident; + let cname = dep.name; + let cvers = dep.vers; // FIXME: We really need to know the linkage metas of our transitive // dependencies in order to resolve them correctly. - let cmetas = []; - #debug("resolving dep %s", cname); + let cmetas = metas_with(cvers, "vers", []); + #debug("resolving dep %s ver: %s", cname, dep.vers); alt existing_match(e, metas_with_ident(cname, cmetas)) { some(local_cnum) { #debug("already have it"); diff --git a/src/test/auxiliary/crateresolve4a-1.rs b/src/test/auxiliary/crateresolve4a-1.rs new file mode 100644 index 000000000000..3c41daa1e8b3 --- /dev/null +++ b/src/test/auxiliary/crateresolve4a-1.rs @@ -0,0 +1,4 @@ +#[link(name = "crateresolve4a", vers = "0.1")]; +#[crate_type = "lib"]; + +fn f() -> int { 10 } diff --git a/src/test/auxiliary/crateresolve4a-2.rs b/src/test/auxiliary/crateresolve4a-2.rs new file mode 100644 index 000000000000..cba82fd55b9b --- /dev/null +++ b/src/test/auxiliary/crateresolve4a-2.rs @@ -0,0 +1,4 @@ +#[link(name = "crateresolve4a", vers= "0.2")]; +#[crate_type = "lib"]; + +fn g() -> int { 20 } diff --git a/src/test/auxiliary/crateresolve4b-1.rs b/src/test/auxiliary/crateresolve4b-1.rs new file mode 100644 index 000000000000..b5cda2a814e0 --- /dev/null +++ b/src/test/auxiliary/crateresolve4b-1.rs @@ -0,0 +1,8 @@ +// aux-build:crateresolve4a-1.rs +// aux-build:crateresolve4a-2.rs +#[link(name = "crateresolve4b", vers = "0.1")]; +#[crate_type = "lib"]; + +use crateresolve4a(vers="0.2"); + +fn f() -> int { crateresolve4a::g() } diff --git a/src/test/auxiliary/crateresolve4b-2.rs b/src/test/auxiliary/crateresolve4b-2.rs new file mode 100644 index 000000000000..1129b98542c7 --- /dev/null +++ b/src/test/auxiliary/crateresolve4b-2.rs @@ -0,0 +1,8 @@ +// aux-build:crateresolve4a-1.rs +// aux-build:crateresolve4a-2.rs +#[link(name = "crateresolve4b", vers = "0.2")]; +#[crate_type = "lib"]; + +use crateresolve4a(vers="0.1"); + +fn g() -> int { crateresolve4a::f() } diff --git a/src/test/run-pass/crateresolve4.rs b/src/test/run-pass/crateresolve4.rs new file mode 100644 index 000000000000..1fe8393ab7aa --- /dev/null +++ b/src/test/run-pass/crateresolve4.rs @@ -0,0 +1,20 @@ +// xfail-fast +// aux-build:crateresolve4a-1.rs +// aux-build:crateresolve4a-2.rs +// aux-build:crateresolve4b-1.rs +// aux-build:crateresolve4b-2.rs + +mod a { + use crateresolve4b(vers = "0.1"); + fn f() { assert crateresolve4b::f() == 20; } +} + +mod b { + use crateresolve4b(vers = "0.2"); + fn f() { assert crateresolve4b::g() == 10; } +} + +fn main() { + a::f(); + b::f(); +}