1
Fork 0

Auto merge of #37987 - plietar:cross-proc-macro, r=jseyfried

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
This commit is contained in:
bors 2016-11-25 13:48:08 -06:00 committed by GitHub
commit dad5cdea2a
2 changed files with 22 additions and 7 deletions

View file

@ -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,
};

View file

@ -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
});