noreturn

noreturn is the type of:

  • break
  • continue
  • return
  • unreachable
  • while (true) {}

When resolving types together, such as if clauses or switch prongs, the noreturn type is compatible with every other type. Consider:

test.zig

  1. fn foo(condition:bool, b: u32)void{
  2. const a =if(condition) b elsereturn;
  3. @panic("do something with a");
  4. }
  5. test "noreturn"{
  6. foo(false,1);
  7. }
  1. $ zig test test.zig
  2. 1/1 test "noreturn"...OK
  3. All1 tests passed.

Another use case for noreturn is the exit function:

test.zig

  1. pub extern"kernel32" fn ExitProcess(exit_code: c_uint) callconv(.Stdcall) noreturn;
  2. test "foo"{
  3. const value = bar()catchExitProcess(1);
  4. assert(value ==1234);
  5. }
  6. fn bar() anyerror!u32 {
  7. return1234;
  8. }
  9. constassert=@import("std").debug.assert;
  1. $ zig test test.zig -target x86_64-windows
  2. Created/deps/zig/zig-cache/o/_I6hZMbZvC3tMTV1FwcUPpThS8tQ8yAAJ2aGq_TjkmaXTVCTeUUEG_vmnEaqFNAL/test.exe but skipping execution because it is non-native.