From 9195b36a6c55c2f2084d8a2edfd9a98c2e077e8c Mon Sep 17 00:00:00 2001 From: Kendall Condon Date: Tue, 19 May 2026 19:18:43 -0400 Subject: [PATCH] AstGen: move error capture asserts outside loop --- lib/std/zig/AstGen.zig | 8 ++-- .../error_set_cannot_capture_by_reference.zig | 13 ------- .../switch_capture_error_by_ref.zig | 25 ------------- .../switch_on_error_bad_captures_astgen.zig | 37 +++++++++++++++++++ .../switch_on_error_bad_captures_sema.zig | 21 +++++++++++ ...tch_on_error_with_capture_by_reference.zig | 22 ----------- 6 files changed, 62 insertions(+), 64 deletions(-) delete mode 100644 test/cases/compile_errors/error_set_cannot_capture_by_reference.zig delete mode 100644 test/cases/compile_errors/switch_capture_error_by_ref.zig create mode 100644 test/cases/compile_errors/switch_on_error_bad_captures_astgen.zig create mode 100644 test/cases/compile_errors/switch_on_error_bad_captures_sema.zig delete mode 100644 test/cases/compile_errors/switch_on_error_with_capture_by_reference.zig diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index 6a6bd0ed217906f84cebe87c1d063fbf4f2d2db8..d0e5a6b8a2325f48e00cb2ecc7da74cd0df5b401 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -7735,10 +7735,6 @@ fn switchExpr( }; if (capture != .none) assert(any_has_payload_capture); - if (is_err_switch) { - assert(!any_payload_is_ref); // should have failed by now - assert(!any_has_tag_capture); // should have failed by now - } prong_body: { scratch_scope.instructions_top = parent_gz.instructions.items.len; @@ -7845,6 +7841,10 @@ fn switchExpr( } } } + if (is_err_switch) { + assert(!any_payload_is_ref); // should have failed by now + assert(!any_has_tag_capture); // should have failed by now + } assert(scalar_case_index + multi_case_index + @intFromBool(has_else) == case_nodes.len); assert(multi_items_infos_start + multi_item_offset == bodies_start); diff --git a/test/cases/compile_errors/error_set_cannot_capture_by_reference.zig b/test/cases/compile_errors/error_set_cannot_capture_by_reference.zig deleted file mode 100644 index d13f85d066983081dd6c2b02f48f1164c2162bde..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/error_set_cannot_capture_by_reference.zig +++ /dev/null @@ -1,13 +0,0 @@ -export fn entry() void { - const err: error{Foo} = error.Foo; - - switch (err) { - error.Foo => |*foo| { - foo catch {}; - }, - } -} - -// error -// -// :5:23: error: error set cannot be captured by reference diff --git a/test/cases/compile_errors/switch_capture_error_by_ref.zig b/test/cases/compile_errors/switch_capture_error_by_ref.zig deleted file mode 100644 index e432159d2c7fbf9f919c0539c6ee75fdd7f08cb5..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/switch_capture_error_by_ref.zig +++ /dev/null @@ -1,25 +0,0 @@ -export fn entry1() void { - switch (@as(anyerror, error.MyError)) { - error.MyError, error.MyOtherError => |*err| _ = err, - else => {}, - } -} - -export fn entry2() void { - switch (@as(anyerror, error.MyError)) { - inline error.MyError, error.MyOtherError => |*err| _ = err, - else => {}, - } -} - -export fn entry3() void { - switch (@as(anyerror, error.MyError)) { - else => |*err| _ = err, - } -} - -// error -// -// :3:47: error: error set cannot be captured by reference -// :10:54: error: error set cannot be captured by reference -// :17:18: error: error set cannot be captured by reference diff --git a/test/cases/compile_errors/switch_on_error_bad_captures_astgen.zig b/test/cases/compile_errors/switch_on_error_bad_captures_astgen.zig new file mode 100644 index 0000000000000000000000000000000000000000..97abfcd55fec648f62ccce83c932a461c78c97eb --- /dev/null +++ b/test/cases/compile_errors/switch_on_error_bad_captures_astgen.zig @@ -0,0 +1,37 @@ +const Error = error {OutOfMemory, ReadFailed}; +const result: Error!u64 = error.OutOfMemory; + +test { + _ = result catch |err| switch (err) { + error.ReadFailed => 2, + error.OutOfMemory => |*val| 1, + }; +} + +test { + _ = result catch |err| switch (err) { + error.ReadFailed => 2, + error.OutOfMemory => |_, tag| 1, + }; +} + +test { + _ = if (result) |n| n else |err| switch (err) { + error.ReadFailed => 2, + error.OutOfMemory => |*val| 1, + }; +} + +test { + _ = if (result) |n| n else |err| switch (err) { + error.ReadFailed => 2, + error.OutOfMemory => |_, tag| 1, + }; +} + +// error +// +// :7:32: error: error set cannot be captured by reference +// :14:34: error: cannot capture tag of error union +// :21:32: error: error set cannot be captured by reference +// :28:34: error: cannot capture tag of error union diff --git a/test/cases/compile_errors/switch_on_error_bad_captures_sema.zig b/test/cases/compile_errors/switch_on_error_bad_captures_sema.zig new file mode 100644 index 0000000000000000000000000000000000000000..6a5ff43818a2905d4ed50ac1b0e2eefdc4c8248d --- /dev/null +++ b/test/cases/compile_errors/switch_on_error_bad_captures_sema.zig @@ -0,0 +1,21 @@ +const Error = error{ OutOfMemory, ReadFailed }; +const err: Error = error.OutOfMemory; + +export fn a() void { + _ = switch (err) { + error.ReadFailed => 2, + error.OutOfMemory => |*val| @intFromError(val.*), + }; +} + +export fn b() void { + _ = switch (err) { + error.ReadFailed => 2, + error.OutOfMemory => |_, tag| @intFromEnum(tag), + }; +} + +// error +// +// :7:31: error: error set cannot be captured by reference +// :14:34: error: cannot capture tag of non-union type 'error{OutOfMemory,ReadFailed}' diff --git a/test/cases/compile_errors/switch_on_error_with_capture_by_reference.zig b/test/cases/compile_errors/switch_on_error_with_capture_by_reference.zig deleted file mode 100644 index d3206d02fe12f024513fcd5d19261251ae32c4f2..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/switch_on_error_with_capture_by_reference.zig +++ /dev/null @@ -1,22 +0,0 @@ -comptime { - const e: error{Foo}!u32 = error.Foo; - e catch |err| switch (err) { - error.Foo => |*foo| { - foo catch {}; - }, - }; -} - -comptime { - const e: error{Foo}!u32 = error.Foo; - if (e) {} else |err| switch (err) { - error.Foo => |*foo| { - foo catch {}; - }, - } -} - -// error -// -// :4:24: error: error set cannot be captured by reference -// :13:24: error: error set cannot be captured by reference -- 2.54.0