Do not re-hash foreign spans.

This commit is contained in:
Camille GILLOT 2021-10-02 21:14:52 +02:00
parent ce21756ed3
commit daf8903e8e
2 changed files with 27 additions and 11 deletions

View File

@ -664,7 +664,21 @@ fn decode(decoder: &mut CacheDecoder<'a, 'tcx>) -> Result<Self, String> {
let data: ExpnData = decoder let data: ExpnData = decoder
.with_position(pos.to_usize(), |decoder| decode_tagged(decoder, TAG_EXPN_DATA))?; .with_position(pos.to_usize(), |decoder| decode_tagged(decoder, TAG_EXPN_DATA))?;
rustc_span::hygiene::register_local_expn_id(data, hash) let expn_id = rustc_span::hygiene::register_local_expn_id(data, hash);
#[cfg(debug_assertions)]
{
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
let mut hcx = decoder.tcx.create_stable_hashing_context();
let mut hasher = StableHasher::new();
hcx.while_hashing_spans(true, |hcx| {
expn_id.expn_data().hash_stable(hcx, &mut hasher)
});
let local_hash: u64 = hasher.finish();
debug_assert_eq!(hash.local_hash(), local_hash);
}
expn_id
} else { } else {
let index_guess = decoder.foreign_expn_data[&hash]; let index_guess = decoder.foreign_expn_data[&hash];
decoder.tcx.cstore_untracked().expn_hash_to_expn_id( decoder.tcx.cstore_untracked().expn_hash_to_expn_id(
@ -675,16 +689,7 @@ fn decode(decoder: &mut CacheDecoder<'a, 'tcx>) -> Result<Self, String> {
) )
}; };
#[cfg(debug_assertions)] debug_assert_eq!(expn_id.krate, krate);
{
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
let mut hcx = decoder.tcx.create_stable_hashing_context();
let mut hasher = StableHasher::new();
hcx.while_hashing_spans(true, |hcx| expn_id.expn_data().hash_stable(hcx, &mut hasher));
let local_hash: u64 = hasher.finish();
debug_assert_eq!(hash.local_hash(), local_hash);
}
Ok(expn_id) Ok(expn_id)
} }
} }

View File

@ -0,0 +1,11 @@
// MIR optimizations can create expansions after the TyCtxt has been created.
// This test verifies that those expansions can be decoded correctly.
// revisions:rpass1 rpass2
// compile-flags: -Z query-dep-graph -Z mir-opt-level=3
fn main() {
if std::env::var("a").is_ok() {
println!("b");
}
}