1 // revisions:rpass1 rpass2 2 // compile-flags: -Z query-dep-graph 3 // aux-build:cached_hygiene.rs 4 5 // This tests the folllowing scenario 6 // 1. A foreign crate is compiled with incremental compilation. 7 // This causes hygiene information to be saved to the incr cache. 8 // 2. One function is the foreign crate is modified. This causes the 9 // optimized mir for an unmodified function to be loaded from the 10 // incremental cache and written out to the crate metadata. 11 // 3. In the process of loading and writing out this function's MIR, 12 // we load hygiene information from the incremental cache and 13 // write it to our metadata. 14 // 4. This hygiene information is loaded by another crate (this file) 15 16 // Previously, this situation would cause hygiene identifiers 17 // (SyntaxContexts and ExpnIds) to get corrupted when we tried to 18 // serialize the hygiene information loaded from the incr cache into 19 // the metadata. Specifically, we were not resetting `orig_id` 20 // for an `EpxnData` generate in the current crate, which would cause 21 // us to serialize the `ExpnId` pointing to a garbage location in 22 // the metadata. 23 24 #![feature(rustc_attrs)] 25 26 #![rustc_partition_reused(module="load_cached_hygiene-call_unchanged_function", cfg="rpass2")] 27 #![rustc_partition_codegened(module="load_cached_hygiene-call_changed_function", cfg="rpass2")] 28 29 30 extern crate cached_hygiene; 31 32 pub mod call_unchanged_function { 33 unchanged()34 pub fn unchanged() { 35 cached_hygiene::unchanged_fn(); 36 } 37 } 38 39 pub mod call_changed_function { changed()40 pub fn changed() { 41 cached_hygiene::changed_fn(); 42 } 43 } 44 main()45pub fn main() { 46 call_unchanged_function::unchanged(); 47 call_changed_function::changed(); 48 } 49