mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 07:14:28 +00:00
Reuse CrateNum for proc-macro crates even when cross-compiling
Proc-macros are always compiled for the host, so this should be the same in every way as recompiling the crate. I am not sure why the previous code special-cased the target, since the compiler properly gives an error when trying to load a crate for a different host: ``` error[E0461]: couldn't find crate `dependency` with expected target triple x86_64-unknown-linux-gnu --> /home/joshua/rustc4/src/test/ui/cfg-dependent.rs:8:2 | LL | dependency::is_64(); | ^^^^^^^^^^ | = note: the following crate versions were found: crate `dependency`, target triple i686-unknown-linux-gnu: /home/joshua/rustc4/build/x86_64-unknown-linux-gnu/test/ui/cfg-dependent/auxiliary/libdependency.so ``` I think another possible fix is to remove the check altogether. But I'm not sure, and this fix works, so I'm not making the larger change here.
This commit is contained in:
parent
96859dbaf6
commit
68b959827b
@ -598,7 +598,11 @@ impl<'a> CrateLoader<'a> {
|
||||
// don't want to match a host crate against an equivalent target one
|
||||
// already loaded.
|
||||
let root = library.metadata.get_root();
|
||||
Ok(Some(if locator.triple == self.sess.opts.target_triple {
|
||||
// FIXME: why is this condition necessary? It was adding in #33625 but I
|
||||
// don't know why and the original author doesn't remember ...
|
||||
let can_reuse_cratenum =
|
||||
locator.triple == self.sess.opts.target_triple || locator.is_proc_macro == Some(true);
|
||||
Ok(Some(if can_reuse_cratenum {
|
||||
let mut result = LoadResult::Loaded(library);
|
||||
self.cstore.iter_crate_data(|cnum, data| {
|
||||
if data.name() == root.name() && root.hash() == data.hash() {
|
||||
|
12
src/test/ui/crate-loading/auxiliary/proc-macro.rs
Normal file
12
src/test/ui/crate-loading/auxiliary/proc-macro.rs
Normal file
@ -0,0 +1,12 @@
|
||||
// force-host
|
||||
// no-prefer-dynamic
|
||||
#![crate_name = "reproduction"]
|
||||
#![crate_type = "proc-macro"]
|
||||
|
||||
extern crate proc_macro;
|
||||
use proc_macro::TokenStream;
|
||||
|
||||
#[proc_macro]
|
||||
pub fn mac(input: TokenStream) -> TokenStream {
|
||||
input
|
||||
}
|
8
src/test/ui/crate-loading/cross-compiled-proc-macro.rs
Normal file
8
src/test/ui/crate-loading/cross-compiled-proc-macro.rs
Normal file
@ -0,0 +1,8 @@
|
||||
// edition:2018
|
||||
// compile-flags:--extern reproduction
|
||||
// aux-build:proc-macro.rs
|
||||
// check-pass
|
||||
|
||||
reproduction::mac!();
|
||||
|
||||
fn main() {}
|
Loading…
Reference in New Issue
Block a user