diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-10-24 22:42:01 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-10-27 01:31:05 +0300 |
| commit | db799ae628cc3a131c34f8ae4b7422d7e9520cff (patch) | |
| tree | cd3667595bb51cd0ab8a3cc87b8dbe6048ebae24 /src/Module.zig | |
| parent | 9db293492bbbc5b8d70638bd9c59dea19d13596c (diff) | |
| download | zig-db799ae628cc3a131c34f8ae4b7422d7e9520cff.tar.gz zig-db799ae628cc3a131c34f8ae4b7422d7e9520cff.zip | |
Module: mitigate generic deletion bug
Diffstat (limited to 'src/Module.zig')
| -rw-r--r-- | src/Module.zig | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/Module.zig b/src/Module.zig index 4f150b0148..9a395d72c4 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -3367,6 +3367,8 @@ pub fn deinit(mod: *Module) void { for (mod.import_table.keys()) |key| { gpa.free(key); } + var failed_decls = mod.failed_decls; + mod.failed_decls = .{}; for (mod.import_table.values()) |value| { value.destroy(mod); } @@ -3406,10 +3408,10 @@ pub fn deinit(mod: *Module) void { mod.local_zir_cache.handle.close(); mod.global_zir_cache.handle.close(); - for (mod.failed_decls.values()) |value| { + for (failed_decls.values()) |value| { value.destroy(gpa); } - mod.failed_decls.deinit(gpa); + failed_decls.deinit(gpa); if (mod.emit_h) |emit_h| { for (emit_h.failed_decls.values()) |value| { @@ -3482,6 +3484,13 @@ pub fn deinit(mod: *Module) void { pub fn destroyDecl(mod: *Module, decl_index: Decl.Index) void { const gpa = mod.gpa; { + if (mod.failed_decls.contains(decl_index)) { + blk: { + const errs = mod.comp.getAllErrorsAlloc() catch break :blk; + for (errs.list) |err| Compilation.AllErrors.Message.renderToStdErr(err, .no_color); + } + @panic("Zig compiler bug: attempted to destroy declaration with an attached error"); + } const decl = mod.declPtr(decl_index); log.debug("destroy {*} ({s})", .{ decl, decl.name }); _ = mod.test_functions.swapRemove(decl_index); |
