diff --git a/sway-core/src/decl_engine/id.rs b/sway-core/src/decl_engine/id.rs index cdbd0fccffd..915cb0f33bd 100644 --- a/sway-core/src/decl_engine/id.rs +++ b/sway-core/src/decl_engine/id.rs @@ -148,7 +148,7 @@ impl SubstTypes for DeclId { let decl_engine = ctx.engines.de(); let mut decl = (*decl_engine.get(self)).clone(); if decl.subst(ctx).has_changes() { - decl_engine.replace(*self, decl); + *self = *decl_engine.insert_modified(decl, *self).id(); HasChanges::Yes } else { HasChanges::No @@ -160,7 +160,7 @@ impl SubstTypes for DeclId { let decl_engine = ctx.engines.de(); let mut decl = (*decl_engine.get(self)).clone(); if decl.subst(ctx).has_changes() { - decl_engine.replace(*self, decl); + *self = *decl_engine.insert_modified(decl, *self).id(); HasChanges::Yes } else { HasChanges::No @@ -172,7 +172,7 @@ impl SubstTypes for DeclId { let decl_engine = ctx.engines.de(); let mut decl = (*decl_engine.get(self)).clone(); if decl.subst(ctx).has_changes() { - decl_engine.replace(*self, decl); + *self = *decl_engine.insert_modified(decl, *self).id(); HasChanges::Yes } else { HasChanges::No @@ -184,7 +184,7 @@ impl SubstTypes for DeclId { let decl_engine = ctx.engines.de(); let mut decl = (*decl_engine.get(self)).clone(); if decl.subst(ctx).has_changes() { - decl_engine.replace(*self, decl); + *self = *decl_engine.insert_modified(decl, *self).id(); HasChanges::Yes } else { HasChanges::No @@ -196,7 +196,7 @@ impl SubstTypes for DeclId { let decl_engine = ctx.engines.de(); let mut decl = (*decl_engine.get(self)).clone(); if decl.subst(ctx).has_changes() { - decl_engine.replace(*self, decl); + *self = *decl_engine.insert_modified(decl, *self).id(); HasChanges::Yes } else { HasChanges::No @@ -208,7 +208,7 @@ impl SubstTypes for DeclId { let decl_engine = ctx.engines.de(); let mut decl = (*decl_engine.get(self)).clone(); if decl.subst(ctx).has_changes() { - decl_engine.replace(*self, decl); + *self = *decl_engine.insert_modified(decl, *self).id(); HasChanges::Yes } else { HasChanges::No @@ -220,7 +220,7 @@ impl SubstTypes for DeclId { let decl_engine = ctx.engines.de(); let mut decl = (*decl_engine.get(self)).clone(); if decl.subst(ctx).has_changes() { - decl_engine.replace(*self, decl); + *self = *decl_engine.insert_modified(decl, *self).id(); HasChanges::Yes } else { HasChanges::No @@ -233,7 +233,7 @@ impl SubstTypes for DeclId { let decl_engine = ctx.engines.de(); let mut decl = (*decl_engine.get(self)).clone(); if decl.subst(ctx).has_changes() { - decl_engine.replace(*self, decl); + *self = *decl_engine.insert_modified(decl, *self).id(); HasChanges::Yes } else { HasChanges::No @@ -241,15 +241,6 @@ impl SubstTypes for DeclId { } } -// This implementation deviates from all other DeclId<...> implementations. -// For more, see https://github.com/FuelLabs/sway/pull/7440#discussion_r2428833840. -// A better solution will be implemented in the future. -// -// TL;DR: -// When a constant is declared inside a function, its value is shared by every -// “version” of that function—that is, by all monomorphizations. If we “replace” the -// constant, as other implementations do, we would change its value in *every* version, -// which is incorrect. impl SubstTypes for DeclId { fn subst_inner(&mut self, ctx: &SubstTypesContext) -> HasChanges { let decl_engine = ctx.engines.de(); diff --git a/sway-core/src/decl_engine/ref.rs b/sway-core/src/decl_engine/ref.rs index 4832fe3b3ab..fb32dcdd6da 100644 --- a/sway-core/src/decl_engine/ref.rs +++ b/sway-core/src/decl_engine/ref.rs @@ -260,13 +260,14 @@ impl Spanned for DeclRef { impl SubstTypes for DeclRef> where DeclEngine: DeclEngineIndex, - T: Named + Spanned + SubstTypes + Clone, + DeclEngine: DeclEngineInsert, + T: Named + Spanned + SubstTypes + Clone + TyDeclParsedType, { fn subst_inner(&mut self, ctx: &SubstTypesContext) -> HasChanges { let decl_engine = ctx.engines.de(); let mut decl = (*decl_engine.get(&self.id)).clone(); if decl.subst(ctx).has_changes() { - decl_engine.replace(self.id, decl); + *self = decl_engine.insert_modified(decl, self.id); HasChanges::Yes } else { HasChanges::No diff --git a/sway-core/src/language/ty/expression/expression_variant.rs b/sway-core/src/language/ty/expression/expression_variant.rs index 8931c9101b5..b684086a17f 100644 --- a/sway-core/src/language/ty/expression/expression_variant.rs +++ b/sway-core/src/language/ty/expression/expression_variant.rs @@ -936,7 +936,7 @@ impl ReplaceDecls for TyExpressionVariant { .replace_decls(&inner_decl_mapping, handler, ctx)? .has_changes() { - decl_engine.replace(*fn_ref.id(), method); + *fn_ref = decl_engine.insert_modified(method, *fn_ref.id()); has_changes = HasChanges::Yes; }