Skip to content

Commit 7aaa120

Browse files
committed
Check version when resolving transitive dependent crates
Issue #2138
1 parent 5aa5220 commit 7aaa120

File tree

6 files changed

+56
-6
lines changed

6 files changed

+56
-6
lines changed

src/rustc/metadata/creader.rs

+12-6
Original file line numberDiff line numberDiff line change
@@ -314,16 +314,21 @@ fn load_library_crate(sess: session::session, ident: ast::ident, span: span,
314314
}
315315
}
316316

317-
fn metas_with_ident(ident: ast::ident,
317+
fn metas_with(ident: ast::ident, key: str,
318318
metas: [@ast::meta_item]) -> [@ast::meta_item] {
319-
let name_items = attr::find_meta_items_by_name(metas, "name");
319+
let name_items = attr::find_meta_items_by_name(metas, key);
320320
if name_items.is_empty() {
321-
metas + [attr::mk_name_value_item_str("name", ident)]
321+
metas + [attr::mk_name_value_item_str(key, ident)]
322322
} else {
323323
metas
324324
}
325325
}
326326

327+
fn metas_with_ident(ident: ast::ident,
328+
metas: [@ast::meta_item]) -> [@ast::meta_item] {
329+
metas_with(ident, "name", metas)
330+
}
331+
327332
fn existing_match(e: env, metas: [@ast::meta_item]) -> option<int> {
328333
let maybe_entry = e.crate_cache.find {|c|
329334
metadata_matches(*c.metas, metas)
@@ -381,11 +386,12 @@ fn resolve_crate_deps(e: env, cdata: @[u8]) -> cstore::cnum_map {
381386
let cnum_map = int_hash::<ast::crate_num>();
382387
for decoder::get_crate_deps(cdata).each {|dep|
383388
let extrn_cnum = dep.cnum;
384-
let cname = dep.ident;
389+
let cname = dep.name;
390+
let cvers = dep.vers;
385391
// FIXME: We really need to know the linkage metas of our transitive
386392
// dependencies in order to resolve them correctly.
387-
let cmetas = [];
388-
#debug("resolving dep %s", cname);
393+
let cmetas = metas_with(cvers, "vers", []);
394+
#debug("resolving dep %s ver: %s", cname, dep.vers);
389395
alt existing_match(e, metas_with_ident(cname, cmetas)) {
390396
some(local_cnum) {
391397
#debug("already have it");
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#[link(name = "crateresolve4a", vers = "0.1")];
2+
#[crate_type = "lib"];
3+
4+
fn f() -> int { 10 }
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#[link(name = "crateresolve4a", vers= "0.2")];
2+
#[crate_type = "lib"];
3+
4+
fn g() -> int { 20 }
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// aux-build:crateresolve4a-1.rs
2+
// aux-build:crateresolve4a-2.rs
3+
#[link(name = "crateresolve4b", vers = "0.1")];
4+
#[crate_type = "lib"];
5+
6+
use crateresolve4a(vers="0.2");
7+
8+
fn f() -> int { crateresolve4a::g() }
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// aux-build:crateresolve4a-1.rs
2+
// aux-build:crateresolve4a-2.rs
3+
#[link(name = "crateresolve4b", vers = "0.2")];
4+
#[crate_type = "lib"];
5+
6+
use crateresolve4a(vers="0.1");
7+
8+
fn g() -> int { crateresolve4a::f() }

src/test/run-pass/crateresolve4.rs

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// xfail-fast
2+
// aux-build:crateresolve4a-1.rs
3+
// aux-build:crateresolve4a-2.rs
4+
// aux-build:crateresolve4b-1.rs
5+
// aux-build:crateresolve4b-2.rs
6+
7+
mod a {
8+
use crateresolve4b(vers = "0.1");
9+
fn f() { assert crateresolve4b::f() == 20; }
10+
}
11+
12+
mod b {
13+
use crateresolve4b(vers = "0.2");
14+
fn f() { assert crateresolve4b::g() == 10; }
15+
}
16+
17+
fn main() {
18+
a::f();
19+
b::f();
20+
}

0 commit comments

Comments
 (0)