zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 8b9425c248a36afc9cd4f76707b61553b577ce14 (tree)
parent 32e88251e48d9f4a412b08acbd04d5694ec91e19
Author: Techatrix <19954306+Techatrix@users.noreply.github.com>
Date:   Tue, 16 Jan 2024 05:46:31 +0100

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

Diffstat:
Msrc/AstGen.zig | 4+++-
Atest/cases/compile_errors/error_set_cannot_capture_by_reference.zig | 15+++++++++++++++
Mtest/cases/compile_errors/switch_on_error_union_discard.zig | 4+---
Atest/cases/compile_errors/switch_on_error_with_capture_by_reference.zig | 24++++++++++++++++++++++++
4 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/src/AstGen.zig b/src/AstGen.zig @@ -7219,7 +7219,9 @@ fn switchExprErrUnion( }; const capture_token = case.payload_token orelse break :blk &err_scope.base; - assert(token_tags[capture_token] == .identifier); + if (token_tags[capture_token] != .identifier) { + return astgen.failTok(capture_token + 1, "error set cannot be captured by reference", .{}); + } const capture_slice = tree.tokenSlice(capture_token); if (mem.eql(u8, capture_slice, "_")) { 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 @@ -0,0 +1,15 @@ +export fn entry() void { + const err: error{Foo} = error.Foo; + + switch (err) { + error.Foo => |*foo| { + foo catch {}; + }, + } +} + +// error +// backend=stage2 +// target=native +// +// :5:23: error: error set cannot be captured by reference diff --git a/test/cases/compile_errors/switch_on_error_union_discard.zig b/test/cases/compile_errors/switch_on_error_union_discard.zig @@ -1,10 +1,8 @@ export fn entry() void { const x: error{}!u32 = 0; - if (x) |v| v else |_| switch (_) { - } + if (x) |v| v else |_| switch (_) {} } - // error // backend=stage2 // target=native 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 @@ -0,0 +1,24 @@ +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 +// backend=stage2 +// target=native +// +// :4:24: error: error set cannot be captured by reference +// :13:24: error: error set cannot be captured by reference