authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-10-28 01:04:00-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-10-28 01:04:00-04:00
logc389f8800b8707fc163efab330d2d1838f553620
tree11bb2e8388b37d64709e999a3822eb36d2ef5756
parent23878aec4ab2120b74a18a110eb1d3d497e125af
parentb12a5cea7559c4cd4666f142b3e05265b07fe323
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #13290 from Vexu/generic-deletion-mitigation

Mitigate generic deletion bug

2 files changed, 12 insertions(+), 32 deletions(-)

src/Module.zig+12-2
...@@ -3367,6 +3367,8 @@ pub fn deinit(mod: *Module) void {...@@ -3367,6 +3367,8 @@ pub fn deinit(mod: *Module) void {
3367 for (mod.import_table.keys()) |key| {3367 for (mod.import_table.keys()) |key| {
3368 gpa.free(key);3368 gpa.free(key);
3369 }3369 }
3370 var failed_decls = mod.failed_decls;
3371 mod.failed_decls = .{};
3370 for (mod.import_table.values()) |value| {3372 for (mod.import_table.values()) |value| {
3371 value.destroy(mod);3373 value.destroy(mod);
3372 }3374 }
...@@ -3406,10 +3408,10 @@ pub fn deinit(mod: *Module) void {...@@ -3406,10 +3408,10 @@ pub fn deinit(mod: *Module) void {
3406 mod.local_zir_cache.handle.close();3408 mod.local_zir_cache.handle.close();
3407 mod.global_zir_cache.handle.close();3409 mod.global_zir_cache.handle.close();
34083410
3409 for (mod.failed_decls.values()) |value| {3411 for (failed_decls.values()) |value| {
3410 value.destroy(gpa);3412 value.destroy(gpa);
3411 }3413 }
3412 mod.failed_decls.deinit(gpa);3414 failed_decls.deinit(gpa);
34133415
3414 if (mod.emit_h) |emit_h| {3416 if (mod.emit_h) |emit_h| {
3415 for (emit_h.failed_decls.values()) |value| {3417 for (emit_h.failed_decls.values()) |value| {
...@@ -3482,6 +3484,14 @@ pub fn deinit(mod: *Module) void {...@@ -3482,6 +3484,14 @@ pub fn deinit(mod: *Module) void {
3482pub fn destroyDecl(mod: *Module, decl_index: Decl.Index) void {3484pub fn destroyDecl(mod: *Module, decl_index: Decl.Index) void {
3483 const gpa = mod.gpa;3485 const gpa = mod.gpa;
3484 {3486 {
3487 if (mod.failed_decls.contains(decl_index)) {
3488 blk: {
3489 const errs = mod.comp.getAllErrorsAlloc() catch break :blk;
3490 for (errs.list) |err| Compilation.AllErrors.Message.renderToStdErr(err, .no_color);
3491 }
3492 // TODO restore test case triggering this panic
3493 @panic("Zig compiler bug: attempted to destroy declaration with an attached error");
3494 }
3485 const decl = mod.declPtr(decl_index);3495 const decl = mod.declPtr(decl_index);
3486 log.debug("destroy {*} ({s})", .{ decl, decl.name });3496 log.debug("destroy {*} ({s})", .{ decl, decl.name });
3487 _ = mod.test_functions.swapRemove(decl_index);3497 _ = mod.test_functions.swapRemove(decl_index);
test/cases/compile_errors/generic_funciton_instantiation_inherits_parent_branch_quota.zig deleted-30
...@@ -1,30 +0,0 @@
1pub export fn entry1() void {
2 @setEvalBranchQuota(1001);
3 // Return type evaluation should inherit both the
4 // parent's branch quota and count meaning
5 // at least 2002 backwards branches are required.
6 comptime var i = 0;
7 inline while (i < 1000) : (i += 1) {}
8 _ = simple(10);
9}
10pub export fn entry2() void {
11 @setEvalBranchQuota(2001);
12 comptime var i = 0;
13 inline while (i < 1000) : (i += 1) {}
14 _ = simple(10);
15}
16fn simple(comptime n: usize) Type(n) {
17 return n;
18}
19fn Type(comptime n: usize) type {
20 if (n <= 1) return usize;
21 return Type(n - 1);
22}
23
24// error
25// backend=stage2
26// target=native
27//
28// :21:16: error: evaluation exceeded 1001 backwards branches
29// :21:16: note: use @setEvalBranchQuota() to raise the branch limit from 1001
30// :16:34: note: called from here