unreachable
In Debug
and ReleaseSafe
mode, and when using zig test
, unreachable
emits a call to panic
with the message reached unreachable code
.
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
.
Basics
test.zig
// unreachable is used to assert that control flow will never happen upon a
// particular location:
test "basic math" {
const x = 1;
const y = 2;
if (x + y != 3) {
unreachable;
}
}
$ zig test test.zig
1/1 test "basic math"...OK
All 1 tests passed.
In fact, this is how assert is implemented:
test.zig
fn assert(ok: bool) void {
if (!ok) unreachable; // assertion failure
}
// This test will fail because we hit unreachable.
test "this will fail" {
assert(false);
}
$ zig test test.zig
1/1 test "this will fail"...reached unreachable code
/deps/zig/docgen_tmp/test.zig:2:14: 0x2052cb in assert (test)
if (!ok) unreachable; // assertion failure
^
/deps/zig/docgen_tmp/test.zig:7:11: 0x204b8e in test "this will fail" (test)
assert(false);
^
/deps/zig/lib/std/special/test_runner.zig:47:28: 0x22bade in std.special.main (test)
} else test_fn.func();
^
/deps/zig/lib/std/start.zig:253:37: 0x20560d in std.start.posixCallMainAndExit (test)
const result = root.main() catch |err| {
^
/deps/zig/lib/std/start.zig:123:5: 0x20534f in std.start._start (test)
@call(.{ .modifier = .never_inline }, posixCallMainAndExit, .{});
^
Tests failed. Use the following command to reproduce the failure:
/deps/zig/docgen_tmp/test
At Compile-Time
test.zig
const assert = @import("std").debug.assert;
test "type of unreachable" {
comptime {
// The type of unreachable is noreturn.
// However this assertion will still fail because
// evaluating unreachable at compile-time is a compile error.
assert(@TypeOf(unreachable) == noreturn);
}
}
$ zig test test.zig
./docgen_tmp/test.zig:10:16: error: unreachable code
assert(@TypeOf(unreachable) == noreturn);
^
./docgen_tmp/test.zig:3:28: note: referenced here
test "type of unreachable" {
^
See also: