diff options
| author | Martin Wickham <spexguy070@gmail.com> | 2021-09-30 21:41:24 -0500 |
|---|---|---|
| committer | Martin Wickham <spexguy070@gmail.com> | 2021-10-02 15:21:48 -0500 |
| commit | 7ef59384500afa5b20bee474d570af55565dfa7f (patch) | |
| tree | e3f8e828829ccd0136f21183985efc94502eeb26 /src/Module.zig | |
| parent | b1e5081826ba383ebdb298117e5712b8c73fb22a (diff) | |
| download | zig-7ef59384500afa5b20bee474d570af55565dfa7f.tar.gz zig-7ef59384500afa5b20bee474d570af55565dfa7f.zip | |
Fix decl removal from namespace when destroyed
Diffstat (limited to 'src/Module.zig')
| -rw-r--r-- | src/Module.zig | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/Module.zig b/src/Module.zig index 026052be84..0557a6dcb0 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -1695,7 +1695,7 @@ pub const Scope = struct { .ty = ty, .val = val, }); - errdefer wad.block.sema.mod.deleteAnonDecl(&wad.block.base, new_decl); + errdefer wad.block.sema.mod.abortAnonDecl(new_decl); try new_decl.finalizeNewArena(&wad.new_decl_arena); wad.finished = true; return new_decl; @@ -4013,9 +4013,10 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void { }, } - const dependants = decl.dependants.keys(); - assert(dependants[0].namespace.anon_decls.swapRemove(decl)); + const owner_namespace = if (decl.namespace.getDecl() == decl and decl.namespace.parent != null) decl.namespace.parent.? else decl.namespace; + assert(owner_namespace.anon_decls.swapRemove(decl)); + const dependants = decl.dependants.keys(); for (dependants) |dep| { dep.removeDependency(decl); } @@ -4026,10 +4027,11 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void { decl.destroy(mod); } -pub fn deleteAnonDecl(mod: *Module, scope: *Scope, decl: *Decl) void { - log.debug("deleteAnonDecl {*} ({s})", .{ decl, decl.name }); - const scope_decl = scope.srcDecl().?; - assert(scope_decl.namespace.anon_decls.swapRemove(decl)); +pub fn abortAnonDecl(mod: *Module, decl: *Decl) void { + log.debug("abortAnonDecl {*} ({s})", .{ decl, decl.name }); + assert(decl.namespace.anon_decls.swapRemove(decl)); + assert(decl.dependants.count() == 0); + assert(decl.dependencies.count() == 0); decl.destroy(mod); } |
