Skip to content

Commit

Permalink
Check version when resolving transitive dependent crates
Browse files Browse the repository at this point in the history
Issue #2138
  • Loading branch information
lht committed Apr 7, 2012
1 parent 5aa5220 commit 7aaa120
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 6 deletions.
18 changes: 12 additions & 6 deletions src/rustc/metadata/creader.rs
Expand Up @@ -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<int> {
let maybe_entry = e.crate_cache.find {|c|
metadata_matches(*c.metas, metas)
Expand Down Expand Up @@ -381,11 +386,12 @@ fn resolve_crate_deps(e: env, cdata: @[u8]) -> cstore::cnum_map {
let cnum_map = int_hash::<ast::crate_num>();
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");
Expand Down
4 changes: 4 additions & 0 deletions src/test/auxiliary/crateresolve4a-1.rs
@@ -0,0 +1,4 @@
#[link(name = "crateresolve4a", vers = "0.1")];
#[crate_type = "lib"];

fn f() -> int { 10 }
4 changes: 4 additions & 0 deletions src/test/auxiliary/crateresolve4a-2.rs
@@ -0,0 +1,4 @@
#[link(name = "crateresolve4a", vers= "0.2")];
#[crate_type = "lib"];

fn g() -> int { 20 }
8 changes: 8 additions & 0 deletions 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() }
8 changes: 8 additions & 0 deletions 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() }
20 changes: 20 additions & 0 deletions 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();
}

1 comment on commit 7aaa120

@brson
Copy link
Contributor

@brson brson commented on 7aaa120 Apr 7, 2012

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

\o/

Please sign in to comment.