Compiler crash involving `error{}!noreturn`
Zig Version
0.14.0-dev.2989+bf6ee7cb3
Steps to Reproduce and Observed Behavior
test {
_ = &x;
}
fn x() error{}!void {
try y();
}
fn y() error{}!noreturn {
unreachable;
}
$ zig test x.zig
Segmentation fault
Expected Behavior
Successful compilation.
I'm not sure that should type-check; shouldn't it be fn y() error{}!noreturn { unreachable; }?
(of course, the compiler shouldn't crash either way)
True, edited that.
On a slightly modified version of the zig compiler, but mostly zig master:
~/code/zig-bug-repros/22742> ~/code/zig/build/stage4/bin/zig version
0.14.0-dev.3066+06f5d555b
I get the following stack trace from a debug version of the compiler.
~/code/zig-bug-repros/22742> ~/code/zig/build/stage4/bin/zig test main.zig
thread 1964918 panic: reached unreachable code
/home/geemili/code/zig/src/codegen/llvm.zig:5319:9: 0x69960b0 in genBody (zig)
unreachable;
^
/home/geemili/code/zig/src/codegen/llvm.zig:1758:19: 0x69932e8 in updateFunc (zig)
fg.genBody(air.getMainBody(), .poi) catch |err| switch (err) {
^
/home/geemili/code/zig/src/link/Elf.zig:2373:70: 0x6dda545 in updateFunc (zig)
if (self.llvm_object) |llvm_object| return llvm_object.updateFunc(pt, func_index, air, liveness);
^
/home/geemili/code/zig/src/link.zig:736:82: 0x699ec0d in updateFunc (zig)
return @as(*tag.Type(), @fieldParentPtr("base", base)).updateFunc(pt, func_index, air, liveness);
^
/home/geemili/code/zig/src/Zcu/PerThread.zig:1702:22: 0x651d573 in linkerUpdateFunc (zig)
lf.updateFunc(pt, func_index, air, liveness) catch |err| switch (err) {
^
/home/geemili/code/zig/src/link.zig:1576:36: 0x614d82d in doTask (zig)
pt.linkerUpdateFunc(func.func, func.air) catch |err| switch (err) {
^
/home/geemili/code/zig/src/Compilation.zig:4049:20: 0x5da67a7 in dispatchCodegenTask (zig)
link.doTask(comp, tid, link_task);
^
/home/geemili/code/zig/src/Compilation.zig:3944:37: 0x5b62bb7 in processOneJob (zig)
comp.dispatchCodegenTask(tid, .{ .codegen_func = func });
^
/home/geemili/code/zig/src/Compilation.zig:3894:30: 0x59d8c41 in performAllTheWorkInner (zig)
try processOneJob(@intFromEnum(Zcu.PerThread.Id.main), comp, job);
^
/home/geemili/code/zig/src/Compilation.zig:3641:36: 0x586504c in performAllTheWork (zig)
try comp.performAllTheWorkInner(main_progress_node);
^
/home/geemili/code/zig/src/Compilation.zig:2256:31: 0x585be14 in update (zig)
try comp.performAllTheWork(main_progress_node);
^
/home/geemili/code/zig/src/main.zig:4511:20: 0x589b517 in updateModule (zig)
try comp.update(prog_node);
^
/home/geemili/code/zig/src/main.zig:3701:21: 0x5906465 in buildOutputType (zig)
updateModule(comp, color, root_prog_node) catch |err| switch (err) {
^
/home/geemili/code/zig/src/main.zig:282:31: 0x57bc94e in mainArgs (zig)
return buildOutputType(gpa, arena, args, .zig_test);
^
/home/geemili/code/zig/src/main.zig:214:20: 0x57b98fa in main (zig)
return mainArgs(gpa, arena, args);
^
/home/geemili/code/zig/lib/std/start.zig:656:37: 0x57b93f7 in main (zig)
const result = root.main() catch |err| {
^
???:?:?: 0x75067a056e07 in ??? (libc.so.6)
Unwind information for `libc.so.6:0x75067a056e07` was not available, trace may be incomplete
???:?:?: 0x75067a056ecb in ??? (libc.so.6)
???:?:?: 0x57b9064 in ??? (???)
Turning on --verbose-air:
~/code/zig-bug-repros/22742> ~/code/zig/build/stage4/bin/zig test main.zig --verbose-air
# Begin Function AIR: main.test_0:
# Total AIR+Liveness bytes: 159B
# AIR Instructions: 3 (27B)
# AIR Extra Data: 5 (20B)
# Liveness tomb_bits: 8B
# Liveness Extra Data: 0 (0B)
# Liveness special table: 0 (0B)
%0!= save_err_return_trace_index()
%1!= dbg_stmt(2:5)
%2!= ret_safe(<anyerror!void, {}>)
# End Function AIR: main.test_0
# Begin Function AIR: main.x:
# Total AIR+Liveness bytes: 176B
# AIR Instructions: 4 (36B)
# AIR Extra Data: 7 (28B)
# Liveness tomb_bits: 8B
# Liveness Extra Data: 0 (0B)
# Liveness special table: 0 (0B)
%0!= save_err_return_trace_index()
%1!= dbg_stmt(2:10)
%2!= call(<fn () error{}!noreturn, (function 'y')>, [])
%3!= unwrap_errunion_err(error{}, %2)
# End Function AIR: main.x
(I removed the duplicate stack trace)
The stack trace points to the unreachable at the end of this function:
https://github.com/ziglang/zig/blob/ff551374a03c3310bdcbf6f5efa62b670037c3b0/src/codegen/llvm.zig#L5022-L5320
Yup, seems to be an LLVM issue.
$ zig test x.zig -fno-llvm
All 1 tests passed.