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 @@ fn resolve_crate(&mut self, 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 @@ fn resolve_crate(&mut self, 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 @@ fn read_extension_crate(&mut self, span: Span, info: &ExternCrateInfo) -> Extens 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, pub rejected_via_kind: Vec, pub rejected_via_version: Vec, + pub rejected_via_filename: Vec, pub should_match_name: bool, pub is_proc_macro: Option, } @@ -417,6 +418,18 @@ pub fn report_errs(&mut self) -> ! { 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 @@ fn find_commandline_library<'b, LOCS>(&mut self, locs: LOCS) -> Option 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 });