zig
zig copied to clipboard
[Sema] assertion failed when passing fn taking anytype param as comptime param
Zig Version
0.10.0-dev.3978+4fd4c733d
Steps to Reproduce
fn f(comptime _: fn (anytype) void) void {}
fn g(_: anytype) void {}
test {
f(g);
}
Expected Behavior
All 1 tests passed.
Actual Behavior
thread 523 panic: reached unreachable code
Analyzing repro.zig: repro.zig:f__anon_970
> %7 = param_comptime("", {
%2 = block_inline({
%3 = param_anytype("") token_offset:1:22 to :1:29
%4 = func([email protected]_type, body={}) node_offset:1:18 to :1:35
%5 = break_inline(%2, %4)
}) node_offset:1:18 to :1:35
%6 = break_inline(%7, %2)
}) token_offset:1:15 to :1:16
%9 = func([email protected]_type, body={
%8 = ret_tok(@Zir.Inst.Ref.void_value) token_offset:1:43 to :1:44
}) (lbrace=1:42,rbrace=1:43) node_offset:1:1 to :1:44
%10 = break_inline(%1, %9)
For full context, use the command
zig ast-check -t repro.zig
in repro.zig: repro.zig:test_0
> %21 = call(nodiscard .auto, %19, [
{%22, %23},
]) node_offset:4:5 to :4:9
/home/jacob/Source/zig/lib/std/debug.zig:281:14: 0x7e9293 in assert (zig)
if (!ok) unreachable; // assertion failure
^
/home/jacob/Source/zig/lib/std/hash_map.zig:995:41: 0x15ec047 in putNoClobberContext (zig)
^
/home/jacob/Source/zig/lib/std/hash_map.zig:992:44: 0x141abf8 in putNoClobber (zig)
};
^
/home/jacob/Source/zig/src/Sema.zig:8192:47: 0x117d06c in zirParam (zig)
try sema.inst_map.putNoClobber(sema.gpa, inst, .generic_poison);
^
/home/jacob/Source/zig/src/Sema.zig:1129:34: 0xf158d6 in analyzeBodyInner (zig)
try sema.zirParam(block, inst, true);
^
/home/jacob/Source/zig/src/Sema.zig:626:45: 0xd701c8 in analyzeBodyBreak (zig)
const break_inst = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
^
/home/jacob/Source/zig/src/Sema.zig:591:50: 0x13847b5 in resolveBody (zig)
const break_data = (try sema.analyzeBodyBreak(block, body)) orelse
^
/home/jacob/Source/zig/src/Sema.zig:6608:53: 0x159e568 in instantiateGenericCall (zig)
const new_func_inst = child_sema.resolveBody(&child_block, fn_info.param_body, fn_info.param_body_inst) catch |err| {
^
/home/jacob/Source/zig/src/Sema.zig:5803:40: 0x138912c in analyzeCall (zig)
if (sema.instantiateGenericCall(
^
/home/jacob/Source/zig/src/Sema.zig:5595:28: 0x10d1c02 in zirCall (zig)
return sema.analyzeCall(block, func, func_src, call_src, modifier, ensure_result_used, resolved_args, bound_arg_src);
^
/home/jacob/Source/zig/src/Sema.zig:725:62: 0xf07e89 in analyzeBodyInner (zig)
.call => try sema.zirCall(block, inst),
^
/home/jacob/Source/zig/src/Sema.zig:609:30: 0xf063f8 in analyzeBody (zig)
_ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
^
/home/jacob/Source/zig/src/Module.zig:5570:21: 0xd59093 in analyzeFnBody (zig)
sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
^
/home/jacob/Source/zig/src/Module.zig:4271:40: 0xb545b4 in ensureFuncBodyAnalyzed (zig)
var air = mod.analyzeFnBody(func, sema_arena) catch |err| switch (err) {
^
/home/jacob/Source/zig/src/Compilation.zig:2982:42: 0xb52b12 in processOneJob (zig)
module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
^
/home/jacob/Source/zig/src/Compilation.zig:2920:30: 0xa4695e in performAllTheWork (zig)
try processOneJob(comp, work_item);
^
/home/jacob/Source/zig/src/Compilation.zig:2260:31: 0xa43255 in update (zig)
try comp.performAllTheWork(main_progress_node);
^
/home/jacob/Source/zig/src/main.zig:3360:20: 0xa6d2f6 in updateModule (zig)
try comp.update();
^
/home/jacob/Source/zig/src/main.zig:3034:17: 0x80c081 in buildOutputType (zig)
updateModule(gpa, comp, hook) catch |err| switch (err) {
^
/home/jacob/Source/zig/src/main.zig:236:31: 0x7e6d3b in mainArgs (zig)
return buildOutputType(gpa, arena, args, .zig_test);
^
/home/jacob/Source/zig/src/main.zig:174:20: 0x7e6180 in main (zig)
return mainArgs(gpa, arena, args);
^
/home/jacob/Source/zig/lib/std/start.zig:578:37: 0x7e86a9 in main (zig)
const result = root.main() catch |err| {
^
Aborted
Workaround
try sema.inst_map.put(sema.gpa, inst, .generic_poison);
But, I don't know if this is just hiding a deeper issue.