Add test for hygiene caching issue

This commit is contained in:
Aaron Hill 2020-07-23 17:45:30 -04:00
parent dc21612383
commit 7e0d3fdd88
No known key found for this signature in database
GPG Key ID: B4087E510E98B164
2 changed files with 85 additions and 0 deletions

View File

@ -0,0 +1,37 @@
// revisions:rpass1 rpass2
// compile-flags: -Z query-dep-graph
// We use #[inline(always)] to ensure that the downstream crate
// will always load the MIR for these functions
#![feature(rustc_attrs)]
#[allow(unused)]
macro_rules! first_macro {
() => {
println!("New call!");
}
}
#[rustc_dirty(label="typeck", cfg="rpass2")]
#[inline(always)]
pub fn changed_fn() {
// This will cause additional hygiene to be generate,
// which will cause the SyntaxContext/ExpnId raw ids to be
// different when we write out `my_fn` to the crate metadata.
#[cfg(rpass2)]
first_macro!();
}
macro_rules! print_loc {
() => {
println!("Caller loc: {}", std::panic::Location::caller());
}
}
#[rustc_clean(cfg="rpass2")]
#[inline(always)]
pub fn unchanged_fn() {
print_loc!();
}

View File

@ -0,0 +1,48 @@
// revisions:rpass1 rpass2
// compile-flags: -Z query-dep-graph
// aux-build:cached_hygiene.rs
// This tests the folllowing scenario
// 1. A foreign crate is compiled with incremental compilation.
// This causes hygiene information to be saved to the incr cache.
// 2. One function is the foreign crate is modified. This causes the
// optimized mir for an unmodified function to be loaded from the
// incremental cache and written out to the crate metadata.
// 3. In the process of loading and writing out this function's MIR,
// we load hygiene information from the incremental cache and
// write it to our metadata.
// 4. This hygiene information is loaded by another crate (this file)
// Previously, this situation would cause hygiene identifiers
// (SyntaxContexts and ExpnIds) to get corrupted when we tried to
// serialize the hygiene information loaded from the incr cache into
// the metadata. Specifically, we were not resetting `orig_id`
// for an `EpxnData` generate in the current crate, which would cause
// us to serialize the `ExpnId` pointing to a garbage location in
// the metadata.
#![feature(rustc_attrs)]
#![rustc_partition_reused(module="load_cached_hygiene-call_unchanged_function", cfg="rpass2")]
#![rustc_partition_codegened(module="load_cached_hygiene-call_changed_function", cfg="rpass2")]
extern crate cached_hygiene;
pub mod call_unchanged_function {
pub fn unchanged() {
cached_hygiene::unchanged_fn();
}
}
pub mod call_changed_function {
pub fn changed() {
cached_hygiene::changed_fn();
}
}
pub fn main() {
call_unchanged_function::unchanged();
call_changed_function::changed();
}