diff options
| author | bors <bors@rust-lang.org> | 2014-09-14 00:51:05 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-09-14 00:51:05 +0000 |
| commit | 931b11549f3aab00aaaaff39cce33c0f7219b3b6 (patch) | |
| tree | db06daabf58611692de3b7d914dc8a40b168b9ed /src | |
| parent | 79a5448f41dcc6ab52663105a6b02fc5af4c503e (diff) | |
| parent | 3da255d35a7f9d53e4c31d5712f88ff14eaaf45e (diff) | |
auto merge of #17189 : bkoropoff/rust/extern-existing-crate, r=alexcrichton
When checking for an existing crate, compare against the `crate_metadata::name` field, which is the crate name which was requested during resolution, rather than the result of the `crate_metadata::name()` method, which is the crate name within the crate metadata, as these may not match when using the --extern option to `rustc`. This fixes spurious "multiple crate version" warnings under the following scenario: - The crate `foo`, is referenced multiple times - `--extern foo=./path/to/libbar.rlib` is specified to rustc - The internal crate name of `libbar.rlib` is not `foo` The behavior surrounding `Context::should_match_name` and the comments in `loader.rs` both lead me to believe that this scenario is intended to work. Fixes #17186
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/metadata/creader.rs | 4 | ||||
| -rw-r--r-- | src/test/run-make/extern-diff-internal-name/Makefile | 6 | ||||
| -rw-r--r-- | src/test/run-make/extern-diff-internal-name/lib.rs | 12 | ||||
| -rw-r--r-- | src/test/run-make/extern-diff-internal-name/test.rs | 17 |
4 files changed, 37 insertions, 2 deletions
diff --git a/src/librustc/metadata/creader.rs b/src/librustc/metadata/creader.rs index 8c17c16afee..b82c9c93376 100644 --- a/src/librustc/metadata/creader.rs +++ b/src/librustc/metadata/creader.rs @@ -145,7 +145,7 @@ fn extract_crate_info(e: &Env, i: &ast::ViewItem) -> Option<CrateInfo> { match i.node { ast::ViewItemExternCrate(ident, ref path_opt, id) => { let ident = token::get_ident(ident); - debug!("resolving extern crate stmt. ident: {:?} path_opt: {:?}", + debug!("resolving extern crate stmt. ident: {} path_opt: {}", ident, path_opt); let name = match *path_opt { Some((ref path_str, _)) => { @@ -281,7 +281,7 @@ fn existing_match(e: &Env, name: &str, hash: Option<&Svh>) -> Option<ast::CrateNum> { let mut ret = None; e.sess.cstore.iter_crate_data(|cnum, data| { - if data.name().as_slice() != name { return } + if data.name.as_slice() != name { return } match hash { Some(hash) if *hash == data.hash() => { ret = Some(cnum); return } diff --git a/src/test/run-make/extern-diff-internal-name/Makefile b/src/test/run-make/extern-diff-internal-name/Makefile new file mode 100644 index 00000000000..3787b879c1f --- /dev/null +++ b/src/test/run-make/extern-diff-internal-name/Makefile @@ -0,0 +1,6 @@ +-include ../tools.mk + +all: + $(RUSTC) lib.rs + $(RUSTC) test.rs --extern foo=$(TMPDIR)/libbar.rlib 2>&1 | \ + { ! grep "using multiple versions of crate"; } diff --git a/src/test/run-make/extern-diff-internal-name/lib.rs b/src/test/run-make/extern-diff-internal-name/lib.rs new file mode 100644 index 00000000000..e8779bba13c --- /dev/null +++ b/src/test/run-make/extern-diff-internal-name/lib.rs @@ -0,0 +1,12 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![crate_name = "bar"] +#![crate_type = "rlib"] diff --git a/src/test/run-make/extern-diff-internal-name/test.rs b/src/test/run-make/extern-diff-internal-name/test.rs new file mode 100644 index 00000000000..ab1cf96999d --- /dev/null +++ b/src/test/run-make/extern-diff-internal-name/test.rs @@ -0,0 +1,17 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(phase)] + +#[phase(plugin, link)] +extern crate foo; + +fn main() { +} |
