aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rubin <daviru007@icloud.com>2024-12-12 18:00:33 -0800
committerAndrew Kelley <andrew@ziglang.org>2024-12-14 16:41:17 -0500
commit09a8fa2120824606011ba63b3fea40cc4e4ac83b (patch)
tree4dfcc08c2e29a44af052e713a6ba80033c3820df
parentcc82620b2a0c0ca1e3aa1aa35657b626acd468a4 (diff)
downloadzig-09a8fa2120824606011ba63b3fea40cc4e4ac83b.tar.gz
zig-09a8fa2120824606011ba63b3fea40cc4e4ac83b.zip
ensure `InstMap` capacity before remapping error code
-rw-r--r--src/Sema.zig1
-rw-r--r--test/behavior/defer.zig9
2 files changed, 10 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 1a33c76ad6..f31e71047f 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -1813,6 +1813,7 @@ fn analyzeBodyInner(
const extra = sema.code.extraData(Zir.Inst.DeferErrCode, inst_data.payload_index).data;
const defer_body = sema.code.bodySlice(extra.index, extra.len);
const err_code = try sema.resolveInst(inst_data.err_code);
+ try map.ensureSpaceForInstructions(sema.gpa, defer_body);
map.putAssumeCapacity(extra.remapped_err_code, err_code);
if (sema.analyzeBodyInner(block, defer_body)) |_| {
// The defer terminated noreturn - no more analysis needed.
diff --git a/test/behavior/defer.zig b/test/behavior/defer.zig
index 07519f16b5..b8e9b1a2b9 100644
--- a/test/behavior/defer.zig
+++ b/test/behavior/defer.zig
@@ -234,3 +234,12 @@ test "errdefer capture" {
s.bar2() catch {};
if (s.fail) return error.TestExpectedError;
}
+
+test "errdefer in test block" {
+ errdefer |err| {
+ _ = &err;
+ }
+ var x: bool = false;
+ _ = &x;
+ if (x) return error.Something;
+}