diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-08-17 13:21:07 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-08-17 20:10:18 +0300 |
| commit | b0a55e1b3be3a274546f9c18016e9609d546bdb0 (patch) | |
| tree | 7517ed5fbbb06db79a9bac053eb60d098fd32c4d /test/behavior/error.zig | |
| parent | db0f372da8b25f4a911cd8e0b7f8e5cdfc64f940 (diff) | |
| download | zig-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.zig | 62 |
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); +} |
