diff options
| author | Lukas Wirth <lukastw97@gmail.com> | 2024-01-01 12:54:30 +0100 |
|---|---|---|
| committer | Lukas Wirth <lukastw97@gmail.com> | 2024-01-01 12:54:30 +0100 |
| commit | 0c3fbba3b9d5a452b66ac9d47a2e0171f79c1f8d (patch) | |
| tree | d34c2f1ec8f868cd1d6f660366ea009fac5d94ec | |
| parent | cf52c4b2b3367ae7355ef23393e2eae1d37de723 (diff) | |
| download | rust-0c3fbba3b9d5a452b66ac9d47a2e0171f79c1f8d.tar.gz rust-0c3fbba3b9d5a452b66ac9d47a2e0171f79c1f8d.zip | |
fix: Fix SyntaxContextID using incorrect self IDs
| -rw-r--r-- | crates/hir-expand/src/hygiene.rs | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/crates/hir-expand/src/hygiene.rs b/crates/hir-expand/src/hygiene.rs index 6f3b19c5686..57921543c4b 100644 --- a/crates/hir-expand/src/hygiene.rs +++ b/crates/hir-expand/src/hygiene.rs @@ -149,15 +149,16 @@ fn apply_mark_internal( transparency: Transparency, ) -> SyntaxContextId { let syntax_context_data = db.lookup_intern_syntax_context(ctxt); - let mut opaque = syntax_context_data.opaque; - let mut opaque_and_semitransparent = syntax_context_data.opaque_and_semitransparent; + let mut opaque = handle_self_ref(ctxt, syntax_context_data.opaque); + let mut opaque_and_semitransparent = + handle_self_ref(ctxt, syntax_context_data.opaque_and_semitransparent); if transparency >= Transparency::Opaque { - let parent = handle_self_ref(ctxt, opaque); + let parent = opaque; + // Unlike rustc, with salsa we can't prefetch the to be allocated ID to create cycles with + // salsa when interning, so we use a sentinel value that effectively means the current + // syntax context. let new_opaque = SyntaxContextId::SELF_REF; - // But we can't just grab the to be allocated ID either as that would not deduplicate - // things! - // So we need a new salsa store type here ... opaque = db.intern_syntax_context(SyntaxContextData { outer_expn: call_id, outer_transparency: transparency, @@ -168,7 +169,10 @@ fn apply_mark_internal( } if transparency >= Transparency::SemiTransparent { - let parent = handle_self_ref(ctxt, opaque_and_semitransparent); + let parent = opaque_and_semitransparent; + // Unlike rustc, with salsa we can't prefetch the to be allocated ID to create cycles with + // salsa when interning, so we use a sentinel value that effectively means the current + // syntax context. let new_opaque_and_semitransparent = SyntaxContextId::SELF_REF; opaque_and_semitransparent = db.intern_syntax_context(SyntaxContextData { outer_expn: call_id, |
