authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-12-12 18:00:33-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-12-14 16:41:17-05:00
log09a8fa2120824606011ba63b3fea40cc4e4ac83b
tree4dfcc08c2e29a44af052e713a6ba80033c3820df
parentcc82620b2a0c0ca1e3aa1aa35657b626acd468a4

ensure `InstMap` capacity before remapping error code


2 files changed, 10 insertions(+), 0 deletions(-)

src/Sema.zig+1
...@@ -1813,6 +1813,7 @@ fn analyzeBodyInner(...@@ -1813,6 +1813,7 @@ fn analyzeBodyInner(
1813 const extra = sema.code.extraData(Zir.Inst.DeferErrCode, inst_data.payload_index).data;1813 const extra = sema.code.extraData(Zir.Inst.DeferErrCode, inst_data.payload_index).data;
1814 const defer_body = sema.code.bodySlice(extra.index, extra.len);1814 const defer_body = sema.code.bodySlice(extra.index, extra.len);
1815 const err_code = try sema.resolveInst(inst_data.err_code);1815 const err_code = try sema.resolveInst(inst_data.err_code);
1816 try map.ensureSpaceForInstructions(sema.gpa, defer_body);
1816 map.putAssumeCapacity(extra.remapped_err_code, err_code);1817 map.putAssumeCapacity(extra.remapped_err_code, err_code);
1817 if (sema.analyzeBodyInner(block, defer_body)) |_| {1818 if (sema.analyzeBodyInner(block, defer_body)) |_| {
1818 // The defer terminated noreturn - no more analysis needed.1819 // The defer terminated noreturn - no more analysis needed.
test/behavior/defer.zig+9
...@@ -234,3 +234,12 @@ test "errdefer capture" {...@@ -234,3 +234,12 @@ test "errdefer capture" {
234 s.bar2() catch {};234 s.bar2() catch {};
235 if (s.fail) return error.TestExpectedError;235 if (s.fail) return error.TestExpectedError;
236}236}
237
238test "errdefer in test block" {
239 errdefer |err| {
240 _ = &err;
241 }
242 var x: bool = false;
243 _ = &x;
244 if (x) return error.Something;
245}