authorgravatar for spexguy070@gmail.comMartin Wickham <spexguy070@gmail.com> 2021-09-30 21:41:24-05:00
committergravatar for spexguy070@gmail.comMartin Wickham <spexguy070@gmail.com> 2021-10-02 15:21:48-05:00
log7ef59384500afa5b20bee474d570af55565dfa7f
treee3f8e828829ccd0136f21183985efc94502eeb26
parentb1e5081826ba383ebdb298117e5712b8c73fb22a

Fix decl removal from namespace when destroyed


2 files changed, 18 insertions(+), 16 deletions(-)

src/Module.zig+9-7
......@@ -1695,7 +1695,7 @@ pub const Scope = struct {
16951695 .ty = ty,
16961696 .val = val,
16971697 });
1698 errdefer wad.block.sema.mod.deleteAnonDecl(&wad.block.base, new_decl);
1698 errdefer wad.block.sema.mod.abortAnonDecl(new_decl);
16991699 try new_decl.finalizeNewArena(&wad.new_decl_arena);
17001700 wad.finished = true;
17011701 return new_decl;
......@@ -4013,9 +4013,10 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {
40134013 },
40144014 }
40154015
4016 const dependants = decl.dependants.keys();
4017 assert(dependants[0].namespace.anon_decls.swapRemove(decl));
4016 const owner_namespace = if (decl.namespace.getDecl() == decl and decl.namespace.parent != null) decl.namespace.parent.? else decl.namespace;
4017 assert(owner_namespace.anon_decls.swapRemove(decl));
40184018
4019 const dependants = decl.dependants.keys();
40194020 for (dependants) |dep| {
40204021 dep.removeDependency(decl);
40214022 }
......@@ -4026,10 +4027,11 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {
40264027 decl.destroy(mod);
40274028}
40284029
4029pub fn deleteAnonDecl(mod: *Module, scope: *Scope, decl: *Decl) void {
4030 log.debug("deleteAnonDecl {*} ({s})", .{ decl, decl.name });
4031 const scope_decl = scope.srcDecl().?;
4032 assert(scope_decl.namespace.anon_decls.swapRemove(decl));
4030pub fn abortAnonDecl(mod: *Module, decl: *Decl) void {
4031 log.debug("abortAnonDecl {*} ({s})", .{ decl, decl.name });
4032 assert(decl.namespace.anon_decls.swapRemove(decl));
4033 assert(decl.dependants.count() == 0);
4034 assert(decl.dependencies.count() == 0);
40334035 decl.destroy(mod);
40344036}
40354037
src/Sema.zig+9-9
......@@ -1074,7 +1074,7 @@ fn zirStructDecl(
10741074 .val = struct_val,
10751075 }, type_name);
10761076 new_decl.owns_tv = true;
1077 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);
1077 errdefer sema.mod.abortAnonDecl(new_decl);
10781078 struct_obj.* = .{
10791079 .owner_decl = new_decl,
10801080 .fields = .{},
......@@ -1185,7 +1185,7 @@ fn zirEnumDecl(
11851185 .val = enum_val,
11861186 }, type_name);
11871187 new_decl.owns_tv = true;
1188 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);
1188 errdefer sema.mod.abortAnonDecl(new_decl);
11891189
11901190 enum_obj.* = .{
11911191 .owner_decl = new_decl,
......@@ -1373,7 +1373,7 @@ fn zirUnionDecl(
13731373 .val = union_val,
13741374 }, type_name);
13751375 new_decl.owns_tv = true;
1376 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);
1376 errdefer sema.mod.abortAnonDecl(new_decl);
13771377 union_obj.* = .{
13781378 .owner_decl = new_decl,
13791379 .tag_ty = Type.initTag(.@"null"),
......@@ -1443,7 +1443,7 @@ fn zirErrorSetDecl(
14431443 .val = error_set_val,
14441444 }, type_name);
14451445 new_decl.owns_tv = true;
1446 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);
1446 errdefer sema.mod.abortAnonDecl(new_decl);
14471447 const names = try new_decl_arena.allocator.alloc([]const u8, fields.len);
14481448 for (fields) |str_index, i| {
14491449 names[i] = try new_decl_arena.allocator.dupe(u8, sema.code.nullTerminatedString(str_index));
......@@ -2101,7 +2101,7 @@ fn zirStr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!A
21012101 .ty = decl_ty,
21022102 .val = decl_val,
21032103 });
2104 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);
2104 errdefer sema.mod.abortAnonDecl(new_decl);
21052105 try new_decl.finalizeNewArena(&new_decl_arena);
21062106 return sema.analyzeDeclRef(new_decl);
21072107}
......@@ -11804,7 +11804,7 @@ pub fn resolveDeclFields(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty:
1180411804 switch (ty.tag()) {
1180511805 .@"struct" => {
1180611806 const struct_obj = ty.castTag(.@"struct").?.data;
11807 if (struct_obj.owner_decl.namespace.parent != sema.owner_decl.namespace) return;
11807 if (struct_obj.owner_decl.namespace.parent != block.src_decl.namespace) return;
1180811808 switch (struct_obj.status) {
1180911809 .none => {},
1181011810 .field_types_wip => {
......@@ -11822,7 +11822,7 @@ pub fn resolveDeclFields(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty:
1182211822 },
1182311823 .@"union", .union_tagged => {
1182411824 const union_obj = ty.cast(Type.Payload.Union).?.data;
11825 if (union_obj.owner_decl.namespace.parent != sema.owner_decl.namespace) return;
11825 if (union_obj.owner_decl.namespace.parent != block.src_decl.namespace) return;
1182611826 switch (union_obj.status) {
1182711827 .none => {},
1182811828 .field_types_wip => {
......@@ -12210,7 +12210,7 @@ fn generateUnionTagTypeNumbered(
1221012210 .val = enum_val,
1221112211 });
1221212212 new_decl.owns_tv = true;
12213 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);
12213 errdefer sema.mod.abortAnonDecl(new_decl);
1221412214
1221512215 enum_obj.* = .{
1221612216 .owner_decl = new_decl,
......@@ -12246,7 +12246,7 @@ fn generateUnionTagTypeSimple(sema: *Sema, block: *Scope.Block, fields_len: u32)
1224612246 .val = enum_val,
1224712247 });
1224812248 new_decl.owns_tv = true;
12249 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);
12249 errdefer sema.mod.abortAnonDecl(new_decl);
1225012250
1225112251 enum_obj.* = .{
1225212252 .owner_decl = new_decl,