diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_span/hygiene.rs | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/librustc_span/hygiene.rs b/src/librustc_span/hygiene.rs index a03ac4e1fdb..87c2c1e6bd0 100644 --- a/src/librustc_span/hygiene.rs +++ b/src/librustc_span/hygiene.rs @@ -1170,13 +1170,27 @@ pub fn raw_encode_expn_id<E: Encoder>( mode: ExpnDataEncodeMode, e: &mut E, ) -> Result<(), E::Error> { - if !context.serialized_expns.lock().contains(&expn) { - context.latest_expns.lock().insert(expn); - } + // Record the fact that we need to serialize the corresponding + // `ExpnData` + let needs_data = || { + if !context.serialized_expns.lock().contains(&expn) { + context.latest_expns.lock().insert(expn); + } + }; + match mode { - ExpnDataEncodeMode::IncrComp => expn.0.encode(e), + ExpnDataEncodeMode::IncrComp => { + // Always serialize the `ExpnData` in incr comp mode + needs_data(); + expn.0.encode(e) + } ExpnDataEncodeMode::Metadata => { let data = expn.expn_data(); + // We only need to serialize the ExpnData + // if it comes from this crate. + if data.krate == LOCAL_CRATE { + needs_data(); + } data.orig_id.expect("Missing orig_id").encode(e)?; data.krate.encode(e) } |
