We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
0.14.0 with runtime safety
Running zig build-obj on the following program causes the crash
zig build-obj
pub inline fn cast() @typeInfo(@typeInfo(@TypeOf(foo)).@"fn".return_type.?).error_union.error_set!void { //return @errorCast(foo()); return @errorCast(baz()); } pub fn foo() !void { try baz(); } pub fn baz() anyerror!void { return error.OutOfMemory; } export fn bar() void { cast() catch {}; }
In the cast() function, the commenting of the lines can be swapped and they reach unreachable in different places in the compiler.
cast()
unreachable
This was observed in something similar to the following real world code I wrote,
const std = @import("std"); fn write(ctx: void, bytes: []const u8) !usize { _ = ctx; try something(); return bytes.len; } fn something() anyerror!void { return error.OutOfMemory; } const Writer = std.io.Writer( void, @typeInfo(@typeInfo(@TypeOf(write)).@"fn".return_type.?).error_union.error_set, write, ); export fn foo() void { const writer: Writer = .{ .context = {} }; writer.writeAll("Something important!\n") catch {}; }
For 0.14.0, the error traces are as follows
In the case of baz() being called
baz()
thread 38612 panic: reached unreachable code Unwind error at address `:0x4d5271f` (error.AddressOutOfRange), trace may be incomplete /home/dev/git/ziglang/zig/src/Type.zig:3172:31: 0x79ae634 in errorSetNames (main.zig) .anyerror_type => unreachable, ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:10419:49: 0x70d29b6 in airErrorSetHasValue (main.zig) const operand = try self.resolveInst(ty_op.operand); ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:5217:69: 0x711600b in genBody (main.zig) .error_set_has_value => try self.airErrorSetHasValue(inst), ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:5417:25: 0x799f098 in genBodyDebugScope (main.zig) try self.genBody(body, coverage_point); ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:6132:35: 0x7100d61 in lowerBlock (main.zig) try self.genBodyDebugScope(maybe_inline_func, body, .none); ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:7306:31: 0x7102953 in airDbgInlineBlock (main.zig) return self.lowerBlock(inst, extra.data.func, @ptrCast(self.air.extra[extra.end..][0..extra.data.body_len])); ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:5303:59: 0x7118c8a in genBody (main.zig) const res = try self.airDbgInlineBlock(inst); ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:5417:25: 0x799f098 in genBodyDebugScope (main.zig) try self.genBody(body, coverage_point); ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:6132:35: 0x7100d61 in lowerBlock (main.zig) try self.genBodyDebugScope(maybe_inline_func, body, .none); ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:6101:31: 0x71024ce in airBlock (main.zig) return self.lowerBlock(inst, null, @ptrCast(self.air.extra[extra.end..][0..extra.data.body_len])); ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:5298:50: 0x7118b80 in genBody (main.zig) const res = try self.airBlock(inst); ^ /home/dev/git/ziglang/zig/src/codegen/llvm.zig:1774:19: 0x67e3e10 in updateFunc (main.zig) fg.genBody(air.getMainBody(), .poi) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/link/Elf.zig:2379:70: 0x7979555 in updateFunc (main.zig) if (self.llvm_object) |llvm_object| return llvm_object.updateFunc(pt, func_index, air, liveness); ^ /home/dev/git/ziglang/zig/src/link.zig:752:82: 0x7063a12 in updateFunc (main.zig) return @as(*tag.Type(), @fieldParentPtr("base", base)).updateFunc(pt, func_index, air, liveness); ^ /home/dev/git/ziglang/zig/src/Zcu/PerThread.zig:1705:22: 0x67e9911 in linkerUpdateFunc (main.zig) lf.updateFunc(pt, func_index, air, liveness) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/link.zig:1599:36: 0x614455e in doTask (main.zig) pt.linkerUpdateFunc(func.func, func.air) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/Compilation.zig:4143:20: 0x5ac2581 in dispatchCodegenTask (main.zig) link.doTask(comp, tid, link_task); ^ /home/dev/git/ziglang/zig/src/Compilation.zig:4038:37: 0x559dfe4 in processOneJob (main.zig) comp.dispatchCodegenTask(tid, .{ .codegen_func = func }); ^ /home/dev/git/ziglang/zig/src/Compilation.zig:3988:30: 0x52b5786 in performAllTheWorkInner (main.zig) try processOneJob(@intFromEnum(Zcu.PerThread.Id.main), comp, job); ^ /home/dev/git/ziglang/zig/src/Compilation.zig:3728:36: 0x50970f0 in performAllTheWork (main.zig) try comp.performAllTheWorkInner(main_progress_node); ^ /home/dev/git/ziglang/zig/src/Compilation.zig:2333:31: 0x4ecb9b4 in update (main.zig) try comp.performAllTheWork(main_progress_node); ^ /home/dev/git/ziglang/zig/src/main.zig:4518:20: 0x4f137ba in updateModule (main.zig) try comp.update(prog_node); ^ /home/dev/git/ziglang/zig/src/main.zig:3708:21: 0x4f866fb in buildOutputType (main.zig) updateModule(comp, color, root_prog_node) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/main.zig:277:31: 0x4fe9a76 in mainArgs (main.zig) return buildOutputType(gpa, arena, args, .{ .build = .Obj }); ^ /home/dev/git/ziglang/zig/src/main.zig:212:20: 0x4e429e4 in main (main.zig) return mainArgs(gpa, arena, args); ^ /home/dev/git/ziglang/zig/lib/std/start.zig:656:37: 0x4e40442 in main (std.zig) const result = root.main() catch |err| { ^ ???:?:?: 0x7d56f6b52487 in ??? (libc.so.6) ???:?:?: 0x7d56f6b5254b in ??? (libc.so.6) ???:?:?: 0xa08c464 in ??? (???)
In the case of foo() being called
foo()
thread 38689 panic: reached unreachable code Analyzing errorCastToAnyerror.zig %16 = ret_type() node_offset:1:1 to :1:14 %17 = dbg_stmt(2, 12) %18 = decl_val("foo") token_offset:2:23 to :2:26 %19 = dbg_stmt(2, 26) %20 = call(.auto, %18, []) node_offset:2:23 to :2:28 > %21 = extended(error_cast(%16, %20)) node_offset:2:12 to :2:29 %22 = dbg_stmt(2, 5) %23 = restore_err_ret_index_fn_entry(%21) node_offset:2:5 to :2:29 %24 = ret_node(%21) node_offset:2:5 to :2:29 For full context, use the command zig ast-check -t errorCastToAnyerror.zig in errorCastToAnyerror.zig > %54 = call(.auto, %52, []) node_offset:15:5 to :15:11 in errorCastToAnyerror.zig > %57 = block({%52..%56}) node_offset:15:5 to :15:20 Unwind error at address `:0x4d5271f` (error.AddressOutOfRange), trace may be incomplete /home/dev/git/ziglang/zig/src/Type.zig:3171:22: 0x79ae61a in errorSetNames (main.zig) .none => unreachable, // unresolved inferred error set ^ /home/dev/git/ziglang/zig/src/Sema.zig:23270:57: 0x7398c20 in zirErrorCast (main.zig) const dest_err_names = dest_err_ty.errorSetNames(zcu); ^ /home/dev/git/ziglang/zig/src/Sema.zig:1374:65: 0x694895b in analyzeBodyInner (main.zig) .error_cast => try sema.zirErrorCast( block, extended), ^ /home/dev/git/ziglang/zig/src/Sema.zig:1006:26: 0x685fb46 in analyzeFnBody (main.zig) sema.analyzeBodyInner(block, body) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/Sema.zig:8260:27: 0x741d7d2 in analyzeCall (main.zig) sema.analyzeFnBody(&child_block, fn_zir_info.body) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/Sema.zig:7236:43: 0x7270075 in zirCall__anon_478463 (main.zig) const call_inst = try sema.analyzeCall(block, func, func_ty, callee_src, call_src, modifier, ensure_result_used, args_info, call_dbg_node, .call); ^ /home/dev/git/ziglang/zig/src/Sema.zig:1144:62: 0x693c84c in analyzeBodyInner (main.zig) .call => try sema.zirCall(block, inst, .direct), ^ /home/dev/git/ziglang/zig/src/Sema.zig:6250:34: 0x7b4c1b7 in resolveBlockBody (main.zig) if (sema.analyzeBodyInner(child_block, body)) |_| { ^ /home/dev/git/ziglang/zig/src/Sema.zig:6227:33: 0x73e0db5 in zirBlock (main.zig) return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges); ^ /home/dev/git/ziglang/zig/src/Sema.zig:1682:37: 0x694e17b in analyzeBodyInner (main.zig) } else try sema.zirBlock(block, inst), ^ /home/dev/git/ziglang/zig/src/Sema.zig:1006:26: 0x685fb46 in analyzeFnBody (main.zig) sema.analyzeBodyInner(block, body) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/Zcu/PerThread.zig:2705:23: 0x6864e3b in analyzeFnBodyInner (main.zig) sema.analyzeFnBody(&inner_block, fn_info.body) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/Zcu/PerThread.zig:1622:40: 0x6177824 in analyzeFuncBody (main.zig) var air = try pt.analyzeFnBodyInner(func_index); ^ /home/dev/git/ziglang/zig/src/Zcu/PerThread.zig:1542:66: 0x5ac2ddd in ensureFuncBodyUpToDate (main.zig) const ies_outdated, const new_failed = if (pt.analyzeFuncBody(func_index)) |result| ^ /home/dev/git/ziglang/zig/src/Compilation.zig:4053:38: 0x559e240 in processOneJob (main.zig) pt.ensureFuncBodyUpToDate(func) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/Compilation.zig:3988:30: 0x52b5786 in performAllTheWorkInner (main.zig) try processOneJob(@intFromEnum(Zcu.PerThread.Id.main), comp, job); ^ /home/dev/git/ziglang/zig/src/Compilation.zig:3728:36: 0x50970f0 in performAllTheWork (main.zig) try comp.performAllTheWorkInner(main_progress_node); ^ /home/dev/git/ziglang/zig/src/Compilation.zig:2333:31: 0x4ecb9b4 in update (main.zig) try comp.performAllTheWork(main_progress_node); ^ /home/dev/git/ziglang/zig/src/main.zig:4518:20: 0x4f137ba in updateModule (main.zig) try comp.update(prog_node); ^ /home/dev/git/ziglang/zig/src/main.zig:3708:21: 0x4f866fb in buildOutputType (main.zig) updateModule(comp, color, root_prog_node) catch |err| switch (err) { ^ /home/dev/git/ziglang/zig/src/main.zig:277:31: 0x4fe9a76 in mainArgs (main.zig) return buildOutputType(gpa, arena, args, .{ .build = .Obj }); ^ /home/dev/git/ziglang/zig/src/main.zig:212:20: 0x4e429e4 in main (main.zig) return mainArgs(gpa, arena, args); ^ /home/dev/git/ziglang/zig/lib/std/start.zig:656:37: 0x4e40442 in main (std.zig) const result = root.main() catch |err| { ^ ???:?:?: 0x7bb1fc767487 in ??? (libc.so.6) ???:?:?: 0x7bb1fc76754b in ??? (libc.so.6) ???:?:?: 0xa08c464 in ??? (???)
I expect the program to compile successfully.
The text was updated successfully, but these errors were encountered:
Related #21222 - Second case's error trace is the same, but does not reproduce without inline in provided example.
Sorry, something went wrong.
No branches or pull requests
Zig Version
0.14.0 with runtime safety
Steps to Reproduce and Observed Behavior
Running
zig build-obj
on the following program causes the crashIn the
cast()
function, the commenting of the lines can be swapped and they reachunreachable
in different places in the compiler.This was observed in something similar to the following real world code I wrote,
For 0.14.0, the error traces are as follows
In the case of
baz()
being calledIn the case of
foo()
being calledExpected Behavior
I expect the program to compile successfully.
The text was updated successfully, but these errors were encountered: