| ... | @@ -725,7 +725,7 @@ test "simple else prong allowed even when all errors handled" { | ... | @@ -725,7 +725,7 @@ test "simple else prong allowed even when all errors handled" { |
| 725 | try expect(value == 255); | 725 | try expect(value == 255); |
| 726 | } | 726 | } |
| 727 | | 727 | |
| 728 | test { | 728 | test "pointer to error union payload" { |
| 729 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 729 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 730 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 730 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 731 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 731 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| ... | @@ -736,3 +736,63 @@ test { | ... | @@ -736,3 +736,63 @@ test { |
| 736 | const payload_ptr = &(err_union catch unreachable); | 736 | const payload_ptr = &(err_union catch unreachable); |
| 737 | try expect(payload_ptr.* == 15); | 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 | } |