unreachable
In ReleaseFast
mode, the optimizer uses the assumption that unreachable
code will never be hit to perform optimizations. However, zig test even in ReleaseFast
mode still emits unreachable
as calls to panic
.
test_unreachable.zig
$ zig test test_unreachable.zig
1/1 test "basic math"... OK
All 1 tests passed.
In fact, this is how std.debug.assert
is implemented:
test.zig
$ zig test test.zig
/home/andy/Downloads/zig/docgen_tmp/test.zig:3:14: 0x207f3b in assert (test)
if (!ok) unreachable; // assertion failure
^
/home/andy/Downloads/zig/docgen_tmp/test.zig:8:11: 0x2079ce in test "this will fail" (test)
assert(false);
/home/andy/Downloads/zig/lib/std/special/test_runner.zig:80:28: 0x22f423 in std.special.main (test)
} else test_fn.func();
^
/home/andy/Downloads/zig/lib/std/start.zig:543:22: 0x227e1c in std.start.callMain (test)
root.main();
^
/home/andy/Downloads/zig/lib/std/start.zig:495:12: 0x20923e in std.start.callMainWithArgs (test)
return @call(.{ .modifier = .always_inline }, callMain, .{});
/home/andy/Downloads/zig/lib/std/start.zig:409:17: 0x2082d6 in std.start.posixCallMainAndExit (test)
std.os.exit(@call(.{ .modifier = .always_inline }, callMainWithArgs, .{ argc, argv, envp }));
^
@call(.{ .modifier = .never_inline }, posixCallMainAndExit, .{});
^
error: the following test command crashed:
docgen_tmp/zig-cache/o/8e4964e05ddaf866e77360a551b3c05b/test /home/andy/Downloads/zig/build-release/zig
At Compile-Time
test.zig
Shell
$ zig test test.zig
docgen_tmp/test.zig:10:16: error: unreachable code
assert(@TypeOf(unreachable) == noreturn);
^
docgen_tmp/test.zig:10:24: note: control flow is diverted here
assert(@TypeOf(unreachable) == noreturn);