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