| ... | ... | @@ -725,7 +725,7 @@ test "simple else prong allowed even when all errors handled" { |
| 725 | 725 | try expect(value == 255); |
| 726 | 726 | } |
| 727 | 727 | |
| 728 | | test { |
| 728 | test "pointer to error union payload" { |
| 729 | 729 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 730 | 730 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 731 | 731 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| ... | ... | @@ -736,3 +736,63 @@ test { |
| 736 | 736 | const payload_ptr = &(err_union catch unreachable); |
| 737 | 737 | try expect(payload_ptr.* == 15); |
| 738 | 738 | } |
| 739 | |
| 740 | const NoReturn = struct { |
| 741 | var a: u32 = undefined; |
| 742 | fn someData() bool { |
| 743 | a -= 1; |
| 744 | return a == 0; |
| 745 | } |
| 746 | fn loop() !noreturn { |
| 747 | while (true) { |
| 748 | if (someData()) |
| 749 | return error.GenericFailure; |
| 750 | } |
| 751 | } |
| 752 | fn testTry() anyerror { |
| 753 | try loop(); |
| 754 | } |
| 755 | fn testCatch() anyerror { |
| 756 | loop() catch return error.OtherFailure; |
| 757 | @compileError("bad"); |
| 758 | } |
| 759 | }; |
| 760 | |
| 761 | test "error union of noreturn used with if" { |
| 762 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; |
| 763 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 764 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 765 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 766 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 767 | |
| 768 | NoReturn.a = 64; |
| 769 | if (NoReturn.loop()) { |
| 770 | @compileError("bad"); |
| 771 | } else |err| { |
| 772 | try expect(err == error.GenericFailure); |
| 773 | } |
| 774 | } |
| 775 | |
| 776 | test "error union of noreturn used with try" { |
| 777 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; |
| 778 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 779 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 780 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 781 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 782 | |
| 783 | NoReturn.a = 64; |
| 784 | const err = NoReturn.testTry(); |
| 785 | try expect(err == error.GenericFailure); |
| 786 | } |
| 787 | |
| 788 | test "error union of noreturn used with catch" { |
| 789 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; |
| 790 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 791 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 792 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 793 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 794 | |
| 795 | NoReturn.a = 64; |
| 796 | const err = NoReturn.testCatch(); |
| 797 | try expect(err == error.OtherFailure); |
| 798 | } |