aboutsummaryrefslogtreecommitdiff
path: root/test/behavior/error.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-08-17 13:21:07 +0300
committerVeikka Tuominen <git@vexu.eu>2022-08-17 20:10:18 +0300
commitb0a55e1b3be3a274546f9c18016e9609d546bdb0 (patch)
tree7517ed5fbbb06db79a9bac053eb60d098fd32c4d /test/behavior/error.zig
parentdb0f372da8b25f4a911cd8e0b7f8e5cdfc64f940 (diff)
downloadzig-b0a55e1b3be3a274546f9c18016e9609d546bdb0.tar.gz
zig-b0a55e1b3be3a274546f9c18016e9609d546bdb0.zip
Sema: make noreturn error union behave correctly
Diffstat (limited to 'test/behavior/error.zig')
-rw-r--r--test/behavior/error.zig62
1 files changed, 61 insertions, 1 deletions
diff --git a/test/behavior/error.zig b/test/behavior/error.zig
index 306dad5d9e..84b18a2738 100644
--- a/test/behavior/error.zig
+++ b/test/behavior/error.zig
@@ -725,7 +725,7 @@ test "simple else prong allowed even when all errors handled" {
try expect(value == 255);
}
-test {
+test "pointer to error union payload" {
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
@@ -736,3 +736,63 @@ test {
const payload_ptr = &(err_union catch unreachable);
try expect(payload_ptr.* == 15);
}
+
+const NoReturn = struct {
+ var a: u32 = undefined;
+ fn someData() bool {
+ a -= 1;
+ return a == 0;
+ }
+ fn loop() !noreturn {
+ while (true) {
+ if (someData())
+ return error.GenericFailure;
+ }
+ }
+ fn testTry() anyerror {
+ try loop();
+ }
+ fn testCatch() anyerror {
+ loop() catch return error.OtherFailure;
+ @compileError("bad");
+ }
+};
+
+test "error union of noreturn used with if" {
+ if (builtin.zig_backend == .stage1) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+
+ NoReturn.a = 64;
+ if (NoReturn.loop()) {
+ @compileError("bad");
+ } else |err| {
+ try expect(err == error.GenericFailure);
+ }
+}
+
+test "error union of noreturn used with try" {
+ if (builtin.zig_backend == .stage1) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+
+ NoReturn.a = 64;
+ const err = NoReturn.testTry();
+ try expect(err == error.GenericFailure);
+}
+
+test "error union of noreturn used with catch" {
+ if (builtin.zig_backend == .stage1) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+
+ NoReturn.a = 64;
+ const err = NoReturn.testCatch();
+ try expect(err == error.OtherFailure);
+}