about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-09-14 00:51:05 +0000
committerbors <bors@rust-lang.org>2014-09-14 00:51:05 +0000
commit931b11549f3aab00aaaaff39cce33c0f7219b3b6 (patch)
treedb06daabf58611692de3b7d914dc8a40b168b9ed /src
parent79a5448f41dcc6ab52663105a6b02fc5af4c503e (diff)
parent3da255d35a7f9d53e4c31d5712f88ff14eaaf45e (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.rs4
-rw-r--r--src/test/run-make/extern-diff-internal-name/Makefile6
-rw-r--r--src/test/run-make/extern-diff-internal-name/lib.rs12
-rw-r--r--src/test/run-make/extern-diff-internal-name/test.rs17
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() {
+}