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 {...@@ -1695,7 +1695,7 @@ pub const Scope = struct {
1695 .ty = ty,1695 .ty = ty,
1696 .val = val,1696 .val = val,
1697 });1697 });
1698 errdefer wad.block.sema.mod.deleteAnonDecl(&wad.block.base, new_decl);1698 errdefer wad.block.sema.mod.abortAnonDecl(new_decl);
1699 try new_decl.finalizeNewArena(&wad.new_decl_arena);1699 try new_decl.finalizeNewArena(&wad.new_decl_arena);
1700 wad.finished = true;1700 wad.finished = true;
1701 return new_decl;1701 return new_decl;
...@@ -4013,9 +4013,10 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {...@@ -4013,9 +4013,10 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {
4013 },4013 },
4014 }4014 }
40154015
4016 const dependants = decl.dependants.keys();4016 const owner_namespace = if (decl.namespace.getDecl() == decl and decl.namespace.parent != null) decl.namespace.parent.? else decl.namespace;
4017 assert(dependants[0].namespace.anon_decls.swapRemove(decl));4017 assert(owner_namespace.anon_decls.swapRemove(decl));
40184018
4019 const dependants = decl.dependants.keys();
4019 for (dependants) |dep| {4020 for (dependants) |dep| {
4020 dep.removeDependency(decl);4021 dep.removeDependency(decl);
4021 }4022 }
...@@ -4026,10 +4027,11 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {...@@ -4026,10 +4027,11 @@ pub fn deleteUnusedDecl(mod: *Module, decl: *Decl) void {
4026 decl.destroy(mod);4027 decl.destroy(mod);
4027}4028}
40284029
4029pub fn deleteAnonDecl(mod: *Module, scope: *Scope, decl: *Decl) void {4030pub fn abortAnonDecl(mod: *Module, decl: *Decl) void {
4030 log.debug("deleteAnonDecl {*} ({s})", .{ decl, decl.name });4031 log.debug("abortAnonDecl {*} ({s})", .{ decl, decl.name });
4031 const scope_decl = scope.srcDecl().?;4032 assert(decl.namespace.anon_decls.swapRemove(decl));
4032 assert(scope_decl.namespace.anon_decls.swapRemove(decl));4033 assert(decl.dependants.count() == 0);
4034 assert(decl.dependencies.count() == 0);
4033 decl.destroy(mod);4035 decl.destroy(mod);
4034}4036}
40354037
src/Sema.zig+9-9
...@@ -1074,7 +1074,7 @@ fn zirStructDecl(...@@ -1074,7 +1074,7 @@ fn zirStructDecl(
1074 .val = struct_val,1074 .val = struct_val,
1075 }, type_name);1075 }, type_name);
1076 new_decl.owns_tv = true;1076 new_decl.owns_tv = true;
1077 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);1077 errdefer sema.mod.abortAnonDecl(new_decl);
1078 struct_obj.* = .{1078 struct_obj.* = .{
1079 .owner_decl = new_decl,1079 .owner_decl = new_decl,
1080 .fields = .{},1080 .fields = .{},
...@@ -1185,7 +1185,7 @@ fn zirEnumDecl(...@@ -1185,7 +1185,7 @@ fn zirEnumDecl(
1185 .val = enum_val,1185 .val = enum_val,
1186 }, type_name);1186 }, type_name);
1187 new_decl.owns_tv = true;1187 new_decl.owns_tv = true;
1188 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);1188 errdefer sema.mod.abortAnonDecl(new_decl);
11891189
1190 enum_obj.* = .{1190 enum_obj.* = .{
1191 .owner_decl = new_decl,1191 .owner_decl = new_decl,
...@@ -1373,7 +1373,7 @@ fn zirUnionDecl(...@@ -1373,7 +1373,7 @@ fn zirUnionDecl(
1373 .val = union_val,1373 .val = union_val,
1374 }, type_name);1374 }, type_name);
1375 new_decl.owns_tv = true;1375 new_decl.owns_tv = true;
1376 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);1376 errdefer sema.mod.abortAnonDecl(new_decl);
1377 union_obj.* = .{1377 union_obj.* = .{
1378 .owner_decl = new_decl,1378 .owner_decl = new_decl,
1379 .tag_ty = Type.initTag(.@"null"),1379 .tag_ty = Type.initTag(.@"null"),
...@@ -1443,7 +1443,7 @@ fn zirErrorSetDecl(...@@ -1443,7 +1443,7 @@ fn zirErrorSetDecl(
1443 .val = error_set_val,1443 .val = error_set_val,
1444 }, type_name);1444 }, type_name);
1445 new_decl.owns_tv = true;1445 new_decl.owns_tv = true;
1446 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);1446 errdefer sema.mod.abortAnonDecl(new_decl);
1447 const names = try new_decl_arena.allocator.alloc([]const u8, fields.len);1447 const names = try new_decl_arena.allocator.alloc([]const u8, fields.len);
1448 for (fields) |str_index, i| {1448 for (fields) |str_index, i| {
1449 names[i] = try new_decl_arena.allocator.dupe(u8, sema.code.nullTerminatedString(str_index));1449 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...@@ -2101,7 +2101,7 @@ fn zirStr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!A
2101 .ty = decl_ty,2101 .ty = decl_ty,
2102 .val = decl_val,2102 .val = decl_val,
2103 });2103 });
2104 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);2104 errdefer sema.mod.abortAnonDecl(new_decl);
2105 try new_decl.finalizeNewArena(&new_decl_arena);2105 try new_decl.finalizeNewArena(&new_decl_arena);
2106 return sema.analyzeDeclRef(new_decl);2106 return sema.analyzeDeclRef(new_decl);
2107}2107}
...@@ -11804,7 +11804,7 @@ pub fn resolveDeclFields(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty:...@@ -11804,7 +11804,7 @@ pub fn resolveDeclFields(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty:
11804 switch (ty.tag()) {11804 switch (ty.tag()) {
11805 .@"struct" => {11805 .@"struct" => {
11806 const struct_obj = ty.castTag(.@"struct").?.data;11806 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;
11808 switch (struct_obj.status) {11808 switch (struct_obj.status) {
11809 .none => {},11809 .none => {},
11810 .field_types_wip => {11810 .field_types_wip => {
...@@ -11822,7 +11822,7 @@ pub fn resolveDeclFields(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty:...@@ -11822,7 +11822,7 @@ pub fn resolveDeclFields(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, ty:
11822 },11822 },
11823 .@"union", .union_tagged => {11823 .@"union", .union_tagged => {
11824 const union_obj = ty.cast(Type.Payload.Union).?.data;11824 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;
11826 switch (union_obj.status) {11826 switch (union_obj.status) {
11827 .none => {},11827 .none => {},
11828 .field_types_wip => {11828 .field_types_wip => {
...@@ -12210,7 +12210,7 @@ fn generateUnionTagTypeNumbered(...@@ -12210,7 +12210,7 @@ fn generateUnionTagTypeNumbered(
12210 .val = enum_val,12210 .val = enum_val,
12211 });12211 });
12212 new_decl.owns_tv = true;12212 new_decl.owns_tv = true;
12213 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);12213 errdefer sema.mod.abortAnonDecl(new_decl);
1221412214
12215 enum_obj.* = .{12215 enum_obj.* = .{
12216 .owner_decl = new_decl,12216 .owner_decl = new_decl,
...@@ -12246,7 +12246,7 @@ fn generateUnionTagTypeSimple(sema: *Sema, block: *Scope.Block, fields_len: u32)...@@ -12246,7 +12246,7 @@ fn generateUnionTagTypeSimple(sema: *Sema, block: *Scope.Block, fields_len: u32)
12246 .val = enum_val,12246 .val = enum_val,
12247 });12247 });
12248 new_decl.owns_tv = true;12248 new_decl.owns_tv = true;
12249 errdefer sema.mod.deleteAnonDecl(&block.base, new_decl);12249 errdefer sema.mod.abortAnonDecl(new_decl);
1225012250
12251 enum_obj.* = .{12251 enum_obj.* = .{
12252 .owner_decl = new_decl,12252 .owner_decl = new_decl,