| author | |
| committer | |
| log | 8b9425c248a36afc9cd4f76707b61553b577ce14 |
| tree | 5b2303610b1e05f71986eb03bc196ebe21f6cc93 |
| parent | 32e88251e48d9f4a412b08acbd04d5694ec91e19 |
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 | }; |
| 7220 | 7220 | ||
| 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 | } | ||
| 7223 | 7225 | ||
| 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 @@ | ||
| 1 | export 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 @@ |
| 1 | export fn entry() void { | 1 | export 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 | } |
| 6 | 5 | ||
| 7 | |||
| 8 | // error | 6 | // error |
| 9 | // backend=stage2 | 7 | // backend=stage2 |
| 10 | // target=native | 8 | // target=native |
test/cases/compile_errors/switch_on_error_with_capture_by_reference.zig created+24| ... | @@ -0,0 +1,24 @@ | ||
| 1 | comptime { | ||
| 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 | |||
| 10 | comptime { | ||
| 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 | ||