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:
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