about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2024-01-01 12:54:30 +0100
committerLukas Wirth <lukastw97@gmail.com>2024-01-01 12:54:30 +0100
commit0c3fbba3b9d5a452b66ac9d47a2e0171f79c1f8d (patch)
treed34c2f1ec8f868cd1d6f660366ea009fac5d94ec
parentcf52c4b2b3367ae7355ef23393e2eae1d37de723 (diff)
downloadrust-0c3fbba3b9d5a452b66ac9d47a2e0171f79c1f8d.tar.gz
rust-0c3fbba3b9d5a452b66ac9d47a2e0171f79c1f8d.zip
fix: Fix SyntaxContextID using incorrect self IDs
-rw-r--r--crates/hir-expand/src/hygiene.rs18
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,