authorgravatar for techatrix@mailbox.orgTechatrix <techatrix@mailbox.org> 2024-01-16 05:46:31+01:00
committergravatar for techatrix@mailbox.orgTechatrix <techatrix@mailbox.org> 2024-01-16 05:55:26+01:00
log8b9425c248a36afc9cd4f76707b61553b577ce14
tree5b2303610b1e05f71986eb03bc196ebe21f6cc93
parent32e88251e48d9f4a412b08acbd04d5694ec91e19

AstGen: add error message for capture error by ref in switch on error


4 files changed, 43 insertions(+), 4 deletions(-)

src/AstGen.zig+3-1
...@@ -7219,7 +7219,9 @@ fn switchExprErrUnion(...@@ -7219,7 +7219,9 @@ fn switchExprErrUnion(
7219 };7219 };
72207220
7221 const capture_token = case.payload_token orelse break :blk &err_scope.base;7221 const capture_token = case.payload_token orelse break :blk &err_scope.base;
7222 assert(token_tags[capture_token] == .identifier);7222 if (token_tags[capture_token] != .identifier) {
7223 return astgen.failTok(capture_token + 1, "error set cannot be captured by reference", .{});
7224 }
72237225
7224 const capture_slice = tree.tokenSlice(capture_token);7226 const capture_slice = tree.tokenSlice(capture_token);
7225 if (mem.eql(u8, capture_slice, "_")) {7227 if (mem.eql(u8, capture_slice, "_")) {
test/cases/compile_errors/error_set_cannot_capture_by_reference.zig created+15
...@@ -0,0 +1,15 @@
1export fn entry() void {
2 const err: error{Foo} = error.Foo;
3
4 switch (err) {
5 error.Foo => |*foo| {
6 foo catch {};
7 },
8 }
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :5:23: error: error set cannot be captured by reference
test/cases/compile_errors/switch_on_error_union_discard.zig+1-3
...@@ -1,10 +1,8 @@...@@ -1,10 +1,8 @@
1export fn entry() void {1export fn entry() void {
2 const x: error{}!u32 = 0;2 const x: error{}!u32 = 0;
3 if (x) |v| v else |_| switch (_) {3 if (x) |v| v else |_| switch (_) {}
4 }
5}4}
65
7
8// error6// error
9// backend=stage27// backend=stage2
10// target=native8// target=native
test/cases/compile_errors/switch_on_error_with_capture_by_reference.zig created+24
...@@ -0,0 +1,24 @@
1comptime {
2 const e: error{Foo}!u32 = error.Foo;
3 e catch |err| switch (err) {
4 error.Foo => |*foo| {
5 foo catch {};
6 },
7 };
8}
9
10comptime {
11 const e: error{Foo}!u32 = error.Foo;
12 if (e) {} else |err| switch (err) {
13 error.Foo => |*foo| {
14 foo catch {};
15 },
16 }
17}
18
19// error
20// backend=stage2
21// target=native
22//
23// :4:24: error: error set cannot be captured by reference
24// :13:24: error: error set cannot be captured by reference