@@ -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
+ }
0 commit comments