zig icon indicating copy to clipboard operation
zig copied to clipboard

Compiler crash involving `error{}!noreturn`

Open wooster0 opened this issue 10 months ago • 4 comments

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.

wooster0 avatar Feb 04 '25 03:02 wooster0

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)

tau-dev avatar Feb 05 '25 11:02 tau-dev

True, edited that.

ghost avatar Feb 05 '25 20:02 ghost

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

leroycep avatar Feb 05 '25 23:02 leroycep

Yup, seems to be an LLVM issue.

$ zig test x.zig -fno-llvm
All 1 tests passed.

ghost avatar Feb 07 '25 01:02 ghost