about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPaul Lietar <paul@lietar.net>2016-11-24 22:12:36 +0000
committerPaul Lietar <paul@lietar.net>2016-11-24 22:26:35 +0000
commit2cdde5aef494b303b6d4e634f0d5bcce02d0acdc (patch)
treea26b2e943114943d3e15ca56ca2967c289cbebcb /src
parent217f57c0b58aeaf6a4a885ab49148095124d9f46 (diff)
downloadrust-2cdde5aef494b303b6d4e634f0d5bcce02d0acdc.tar.gz
rust-2cdde5aef494b303b6d4e634f0d5bcce02d0acdc.zip
Delay error reporting of filename mismatch.
When cross compiling with procedural macros, the crate loader starts by
looking for a target crate, before trying with a host crate.

Rather than emitting an error immediately if the host and target
extension differ, the compiler should delay it until both attempts have
failed.

Fixes #37899

r? @jseyfried
Diffstat (limited to 'src')
-rw-r--r--src/librustc_metadata/creader.rs3
-rw-r--r--src/librustc_metadata/locator.rs26
2 files changed, 22 insertions, 7 deletions
diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs
index 27c00481bfd..372152d2b0a 100644
--- a/src/librustc_metadata/creader.rs
+++ b/src/librustc_metadata/creader.rs
@@ -344,6 +344,7 @@ impl<'a> CrateLoader<'a> {
                 rejected_via_triple: vec![],
                 rejected_via_kind: vec![],
                 rejected_via_version: vec![],
+                rejected_via_filename: vec![],
                 should_match_name: true,
                 is_proc_macro: Some(false),
             };
@@ -359,6 +360,7 @@ impl<'a> CrateLoader<'a> {
                     rejected_via_triple: vec![],
                     rejected_via_kind: vec![],
                     rejected_via_version: vec![],
+                    rejected_via_filename: vec![],
                     is_proc_macro: Some(true),
                     ..locate_ctxt
                 };
@@ -502,6 +504,7 @@ impl<'a> CrateLoader<'a> {
             rejected_via_triple: vec![],
             rejected_via_kind: vec![],
             rejected_via_version: vec![],
+            rejected_via_filename: vec![],
             should_match_name: true,
             is_proc_macro: None,
         };
diff --git a/src/librustc_metadata/locator.rs b/src/librustc_metadata/locator.rs
index 868bc363791..de465ea92f6 100644
--- a/src/librustc_metadata/locator.rs
+++ b/src/librustc_metadata/locator.rs
@@ -269,6 +269,7 @@ pub struct Context<'a> {
     pub rejected_via_triple: Vec<CrateMismatch>,
     pub rejected_via_kind: Vec<CrateMismatch>,
     pub rejected_via_version: Vec<CrateMismatch>,
+    pub rejected_via_filename: Vec<CrateMismatch>,
     pub should_match_name: bool,
     pub is_proc_macro: Option<bool>,
 }
@@ -417,6 +418,18 @@ impl<'a> Context<'a> {
                                   got));
             }
         }
+        if !self.rejected_via_filename.is_empty() {
+            let dylibname = self.dylibname();
+            let mismatches = self.rejected_via_filename.iter();
+            for &CrateMismatch { ref path, .. } in mismatches {
+                err.note(&format!("extern location for {} is of an unknown type: {}",
+                                  self.crate_name,
+                                  path.display()))
+                   .help(&format!("file name should be lib*.rlib or {}*.{}",
+                                  dylibname.0,
+                                  dylibname.1));
+            }
+        }
 
         err.emit();
         self.sess.abort_if_errors();
@@ -743,13 +756,12 @@ impl<'a> Context<'a> {
                         return true;
                     }
                 }
-                sess.struct_err(&format!("extern location for {} is of an unknown type: {}",
-                                         self.crate_name,
-                                         loc.display()))
-                    .help(&format!("file name should be lib*.rlib or {}*.{}",
-                                   dylibname.0,
-                                   dylibname.1))
-                    .emit();
+
+                self.rejected_via_filename.push(CrateMismatch {
+                    path: loc.clone(),
+                    got: String::new(),
+                });
+
                 false
             });