about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorSimonas Kazlauskas <git@kazlauskas.me>2015-06-06 01:13:19 +0300
committerSimonas Kazlauskas <git@kazlauskas.me>2015-06-07 20:34:12 +0300
commitab86face01786a67da3f6d15db0c3295d75dcdd6 (patch)
tree24ab801e391dbd7ae9a5db187a5c79e8a9f4526e /src
parentc78c0994b1df5e365058f301330d06fa035c3734 (diff)
downloadrust-ab86face01786a67da3f6d15db0c3295d75dcdd6.tar.gz
rust-ab86face01786a67da3f6d15db0c3295d75dcdd6.zip
Don’t ICE if fs::canonicalise fails in meta-load
This might fail when --extern library is a symlink to an invalid location. Instead just pretend it
doesn’t exist at all.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/metadata/loader.rs15
-rw-r--r--src/test/run-make/issue-26006/Makefile16
-rw-r--r--src/test/run-make/issue-26006/in/libc/lib.rs12
-rw-r--r--src/test/run-make/issue-26006/in/time/lib.rs13
4 files changed, 49 insertions, 7 deletions
diff --git a/src/librustc/metadata/loader.rs b/src/librustc/metadata/loader.rs
index f96094d3d09..5f1e30ae63a 100644
--- a/src/librustc/metadata/loader.rs
+++ b/src/librustc/metadata/loader.rs
@@ -429,13 +429,14 @@ impl<'a> Context<'a> {
             let slot = candidates.entry(hash_str)
                                  .or_insert_with(|| (HashMap::new(), HashMap::new()));
             let (ref mut rlibs, ref mut dylibs) = *slot;
-            if rlib {
-                rlibs.insert(fs::canonicalize(path).unwrap(), kind);
-            } else {
-                dylibs.insert(fs::canonicalize(path).unwrap(), kind);
-            }
-
-            FileMatches
+            fs::canonicalize(path).map(|p| {
+                if rlib {
+                    rlibs.insert(p, kind);
+                } else {
+                    dylibs.insert(p, kind);
+                }
+                FileMatches
+            }).unwrap_or(FileDoesntMatch)
         });
         self.rejected_via_kind.extend(staticlibs.into_iter());
 
diff --git a/src/test/run-make/issue-26006/Makefile b/src/test/run-make/issue-26006/Makefile
new file mode 100644
index 00000000000..10c789d20c0
--- /dev/null
+++ b/src/test/run-make/issue-26006/Makefile
@@ -0,0 +1,16 @@
+-include ../tools.mk
+
+ifndef IS_WINDOWS
+all: time
+
+time: libc
+	mkdir -p out/time out/time/deps
+	ln -sf out/libc/liblibc.rlib out/time/deps/
+	$(RUSTC) in/time/lib.rs -Ldependency=out/time/deps/
+
+libc:
+	mkdir -p out/libc
+	$(RUSTC) in/libc/lib.rs --crate-name=libc -o out/libc/liblibc.rlib
+else
+all:
+endif
diff --git a/src/test/run-make/issue-26006/in/libc/lib.rs b/src/test/run-make/issue-26006/in/libc/lib.rs
new file mode 100644
index 00000000000..177ffdce062
--- /dev/null
+++ b/src/test/run-make/issue-26006/in/libc/lib.rs
@@ -0,0 +1,12 @@
+// Copyright 2015 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_type="rlib"]
+
+pub fn something(){}
diff --git a/src/test/run-make/issue-26006/in/time/lib.rs b/src/test/run-make/issue-26006/in/time/lib.rs
new file mode 100644
index 00000000000..b1d07d57337
--- /dev/null
+++ b/src/test/run-make/issue-26006/in/time/lib.rs
@@ -0,0 +1,13 @@
+// Copyright 2015 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(libc)]
+extern crate libc;
+
+fn main(){}