Open charlesbjohnson opened 6 months ago
0.12.0-dev.3498+aff71c613
Tangential, but I reduced the above 2 examples from an Advent of Code exercise that originally looked a bit like: Reductions no longer reproduce, original example still does:
const std = @import("std"); pub fn main() !void { const allocator = std.heap.page_allocator; var tmp = std.ArrayList(struct { struct { u8, u8 }, struct { u8, u8 } }).init(allocator); defer tmp.deinit(); try tmp.append(.{ .{ 0, 1 }, .{ 3, 4 } }); repro(try tmp.toOwnedSlice()); } fn repro(tmp: []struct { struct { u8, u8 }, struct { u8, u8 } }) void { std.debug.print("{d}\n", .{tmp.len}); }
https://godbolt.org/z/rzf786dEY
It works in 0.11.0, but broke when I upgraded to 0.12.0-dev. It appears that 0.11.0 is the only version where it works.
Zig Version
0.12.0-dev.3498+aff71c613
Steps to Reproduce and Observed Behavior
Tangential, but I reduced the above 2 examples from an Advent of Code exercise that originally looked a bit like:Reductions no longer reproduce, original example still does:It works in 0.11.0, but broke when I upgraded to 0.12.0-dev. It appears that 0.11.0 is the only version where it works.
Output on 0.12.0-dev Debug build
``` PS C:\Users\Charlie\Projects\Self\x\zig> C:\Users\Charlie\zig\zig\build\stage3\bin\zig.exe run main.zig thread 13296 panic: reached unreachable code Analyzing main.zig: main.zig:main %5 = ret_type() node_offset:3:1 to :3:7 %6 = dbg_stmt(2, 5) %7 = decl_val("std") token_offset:4:23 to :4:26 %8 = dbg_stmt(2, 26) %9 = field_val(%7, "heap") node_offset:4:23 to :4:31 %10 = dbg_stmt(2, 31) %11 = field_val(%9, "page_allocator") node_offset:4:23 to :4:46 %12 = dbg_var_val(%11, "allocator") %13 = save_err_ret_index(%11) %14 = dbg_stmt(4, 5) %15 = alloc_inferred_mut() node_offset:6:5 to :6:93 %16 = decl_ref("std") token_offset:6:15 to :6:18 %17 = dbg_stmt(4, 28) %18 = field_call(.auto, %16, "ArrayList", [ { %19 = extended(struct_decl(hash(10d37ff1d6daba374210a7c7df0a998e) tuple, anon, {}, auto, {}, { @"0": {%20, %21}, @"1": {%22, %23}, }) node_offset:6:29 to :6:76 %24 = break_inline(%18, %19) }, ]) node_offset:6:15 to :6:77 %25 = ref(%18) token_offset:6:15 to :6:18 %26 = dbg_stmt(4, 82) %27 = field_call(.auto, %25, "init", [ { %28 = break_inline(%27, %11) }, ]) node_offset:6:15 to :6:93 %29 = store_to_inferred_ptr(%15, %27) node_offset:6:15 to :6:93 %30 = resolve_inferred_alloc(%15) node_offset:6:5 to :6:93 %31 = dbg_var_ptr(%15, "tmp") %35 = dbg_stmt(7, 19) %36 = field_call(.auto, %15, "append", [ { %37 = validate_array_init_result_ty(%36, 2) node_offset:9:20 to :9:45 %38 = array_init_elem_type(%36, 0) %39 = validate_array_init_result_ty(%38, 2) node_offset:9:23 to :9:32 %40 = array_init_elem_type(%38, 0) %41 = array_init_elem_type(%38, 1) %42 = array_init(%38{@zero, @one}) node_offset:9:23 to :9:32 %43 = array_init_elem_type(%36, 1) %44 = validate_array_init_result_ty(%43, 2) node_offset:9:34 to :9:43 %45 = array_init_elem_type(%43, 0) %46 = int(3) %47 = array_init_elem_type(%43, 1) %48 = int(4) %49 = array_init(%43{%46, %48}) node_offset:9:34 to :9:43 %50 = array_init(%36{%42, %49}) node_offset:9:20 to :9:45 %51 = break_inline(%36, %50) }, ]) node_offset:9:9 to :9:46 %52 = try(%36, { %53 = err_union_code(%36) node_offset:9:5 to :9:46 %54 = defer({ %32 = dbg_stmt(5, 21) %33 = field_call(nodiscard .auto, %15, "deinit", []) node_offset:7:11 to :7:23 %34 = break_inline(%0, @void_value) }) %55 = dbg_stmt(7, 5) %56 = ret_node(%53) node_offset:9:5 to :9:46 }) node_offset:9:5 to :9:46 %57 = ensure_result_used(%52) node_offset:9:5 to :9:46 %58 = dbg_stmt(9, 5) %59 = decl_val("repro") token_offset:11:5 to :11:10 %60 = dbg_stmt(9, 10) > %61 = call(nodiscard .auto, %59, [ { %62 = dbg_stmt(9, 31) %63 = field_call(.auto, %15, "toOwnedSlice", []) node_offset:11:15 to :11:33 %64 = try(%63, { %65 = err_union_code(%63) node_offset:11:11 to :11:33 %66 = defer({ %32 = dbg_stmt(5, 21) %33 = field_call(nodiscard .auto, %15, "deinit", []) node_offset:7:11 to :7:23 %34 = break_inline(%0, @void_value) }) %67 = dbg_stmt(9, 11) %68 = ret_node(%65) node_offset:11:11 to :11:33 }) node_offset:11:11 to :11:33 %69 = break_inline(%61, %64) }, ]) node_offset:11:5 to :11:34 %70 = defer({ %32 = dbg_stmt(5, 21) %33 = field_call(nodiscard .auto, %15, "deinit", []) node_offset:7:11 to :7:23 %34 = break_inline(%0, @void_value) }) %71 = restore_err_ret_index_unconditional(.none) node_offset:3:1 to :3:7 %72 = ret_implicit(@void_value) token_offset:12:1 to :12:1 For full context, use the command zig ast-check -t main.zig in C:\Users\Charlie\zig\zig\build\stage3\lib\zig\std\start.zig: start.zig:callMain > %1824 = is_non_err(%1823) in C:\Users\Charlie\zig\zig\build\stage3\lib\zig\std\start.zig: start.zig:callMain > %1826 = block({%1821..%1825}) in C:\Users\Charlie\zig\zig\build\stage3\lib\zig\std\start.zig: start.zig:callMain > %1772 = switch_block(%1770, else => {%1915, %1918}, %1773 => {%1774..%1778}, %1779 => {%1780..%1788}, by_val %1789 => {%1790..%1818}, %1819 => {%1820..%1914}) in C:\Users\Charlie\zig\zig\build\stage3\lib\zig\std\start.zig: start.zig:WinStartup > %1023 = call(.auto, %1021, []) in C:\Users\Charlie\zig\zig\build\stage3\lib\zig\std\start.zig: start.zig:WinStartup > %1020 = field_call(nodiscard .auto, %1018, "RtlExitUserProcess", [ {%1021..%1024}, ]) C:\Users\Charlie\zig\zig\src\type.zig:1043:35: 0x100c8b3 in abiAlignmentAdvanced (zig.exe.obj) .eager => unreachable, // struct alignment not resolved ^ C:\Users\Charlie\zig\zig\src\type.zig:858:40: 0x100db19 in abiAlignment (zig.exe.obj) return (ty.abiAlignmentAdvanced(mod, .eager) catch unreachable).scalar; ^ C:\Users\Charlie\zig\zig\src\Module.zig:6228:45: 0x10a2889 in structFieldAlignment (zig.exe.obj) return field_ty.abiAlignment(mod); ^ C:\Users\Charlie\zig\zig\src\type.zig:3070:48: 0x1642129 in structFieldAlign (zig.exe.obj) return mod.structFieldAlignment(explicit_align, field_ty, struct_type.layout); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:30068:41: 0x16bf5a3 in coerceInMemoryAllowed (zig.exe.obj) if (dest_ty.structFieldAlign(field_idx, mod) != src_ty.structFieldAlign(field_idx, mod)) break :tuple; ^ C:\Users\Charlie\zig\zig\src\Sema.zig:30323:49: 0x1bdefb9 in coerceInMemoryAllowedPtrs (zig.exe.obj) const child = try sema.coerceInMemoryAllowed(block, Type.fromInterned(dest_info.child), Type.fromInterned(src_info.child), !dest_info.flags.is_const, target, dest_src, src_src); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:29905:50: 0x16bd253 in coerceInMemoryAllowed (zig.exe.obj) return try sema.coerceInMemoryAllowedPtrs(block, dest_ty, src_ty, dest_ty, src_ty, dest_is_mut, target, dest_src, src_src); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:28825:58: 0x12d01a4 in coerceExtra (zig.exe.obj) var in_memory_result = try sema.coerceInMemoryAllowed(block, dest_ty, inst_ty, false, target, dest_ty_src, inst_src); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:7350:44: 0x215d497 in analyzeArg (zig.exe.obj) else => return sema.coerceExtra( ^ C:\Users\Charlie\zig\zig\src\Sema.zig:7894:49: 0x1bebec9 in analyzeCall (zig.exe.obj) arg_out.* = try args_info.analyzeArg(sema, block, arg_idx, param_ty, func_ty_info, func); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:7043:43: 0x1a88853 in zirCall__anon_92561 (zig.exe.obj) const call_inst = try sema.analyzeCall(block, func, func_ty, callee_src, call_src, modifier, ensure_result_used, args_info, call_dbg_node, .call); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:1015:62: 0x159c62d in analyzeBodyInner (zig.exe.obj) .call => try sema.zirCall(block, inst, .direct), ^ C:\Users\Charlie\zig\zig\src\Sema.zig:893:26: 0x159b093 in analyzeFnBody (zig.exe.obj) sema.analyzeBodyInner(block, body) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\Module.zig:4609:23: 0x12894d5 in analyzeFnBody (zig.exe.obj) sema.analyzeFnBody(&inner_block, fn_info.body) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\Module.zig:3144:32: 0xffa78a in ensureFuncBodyAnalyzed (zig.exe.obj) var air = zcu.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\Sema.zig:32490:31: 0x1bf8a4a in ensureFuncBodyAnalyzed (zig.exe.obj) mod.ensureFuncBodyAnalyzed(func) catch |err| { ^ C:\Users\Charlie\zig\zig\src\Sema.zig:36481:40: 0x16b41e0 in resolveInferredErrorSet (zig.exe.obj) try sema.ensureFuncBodyAnalyzed(func_index); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:32850:69: 0x1b40b73 in analyzeIsNonErrComptimeOnly (zig.exe.obj) const resolved_ty = try sema.resolveInferredErrorSet(block, src, set_ty); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:32879:56: 0x1f45f8a in analyzeIsNonErr (zig.exe.obj) const result = try sema.analyzeIsNonErrComptimeOnly(block, src, operand); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:19076:32: 0x1a9716a in zirIsNonErr (zig.exe.obj) return sema.analyzeIsNonErr(block, src, operand); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:1057:66: 0x159e2c7 in analyzeBodyInner (zig.exe.obj) .is_non_err => try sema.zirIsNonErr(block, inst), ^ C:\Users\Charlie\zig\zig\src\Sema.zig:6099:34: 0x1f6f538 in resolveBlockBody (zig.exe.obj) if (sema.analyzeBodyInner(child_block, body)) |_| { ^ C:\Users\Charlie\zig\zig\src\Sema.zig:6076:33: 0x1b43717 in zirBlock (zig.exe.obj) return sema.resolveBlockBody(parent_block, src, &child_block, body, inst, &label.merges); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:1560:49: 0x15abc97 in analyzeBodyInner (zig.exe.obj) break :blk try sema.zirBlock(block, inst, tags[@intFromEnum(inst)] == .block_comptime); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:6099:34: 0x1f6f538 in resolveBlockBody (zig.exe.obj) if (sema.analyzeBodyInner(child_block, body)) |_| { ^ C:\Users\Charlie\zig\zig\src\Sema.zig:10910:45: 0x1f65fe9 in resolveProngComptime (zig.exe.obj) return sema.resolveBlockBody(spa.parent_block, src, child_block, prong_body, spa.switch_block_inst, merges); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:13060:48: 0x1f647ed in resolveSwitchComptime (zig.exe.obj) return spa.resolveProngComptime( ^ C:\Users\Charlie\zig\zig\src\Sema.zig:12299:37: 0x1aa6cd6 in zirSwitchBlock (zig.exe.obj) return resolveSwitchComptime( ^ C:\Users\Charlie\zig\zig\src\Sema.zig:1080:69: 0x159f251 in analyzeBodyInner (zig.exe.obj) .switch_block => try sema.zirSwitchBlock(block, inst, false), ^ C:\Users\Charlie\zig\zig\src\Sema.zig:893:26: 0x159b093 in analyzeFnBody (zig.exe.obj) sema.analyzeBodyInner(block, body) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\Sema.zig:7839:35: 0x1beb0a9 in analyzeCall (zig.exe.obj) sema.analyzeFnBody(&child_block, fn_info.body) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\Sema.zig:7043:43: 0x1a88853 in zirCall__anon_92561 (zig.exe.obj) const call_inst = try sema.analyzeCall(block, func, func_ty, callee_src, call_src, modifier, ensure_result_used, args_info, call_dbg_node, .call); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:1015:62: 0x159c62d in analyzeBodyInner (zig.exe.obj) .call => try sema.zirCall(block, inst, .direct), ^ C:\Users\Charlie\zig\zig\src\Sema.zig:911:30: 0x12caf82 in analyzeInlineBody (zig.exe.obj) if (sema.analyzeBodyInner(block, body)) |_| { ^ C:\Users\Charlie\zig\zig\src\Sema.zig:937:39: 0x1021fb0 in resolveInlineBody (zig.exe.obj) return (try sema.analyzeInlineBody(block, body, break_target)) orelse .unreachable_value; ^ C:\Users\Charlie\zig\zig\src\Sema.zig:7332:65: 0x215cebf in analyzeArg (zig.exe.obj) const uncoerced_arg = try sema.resolveInlineBody(block, arg_body, zir_call.call_inst); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:7894:49: 0x1bebec9 in analyzeCall (zig.exe.obj) arg_out.* = try args_info.analyzeArg(sema, block, arg_idx, param_ty, func_ty_info, func); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:7043:43: 0x1a89b16 in zirCall__anon_92562 (zig.exe.obj) const call_inst = try sema.analyzeCall(block, func, func_ty, callee_src, call_src, modifier, ensure_result_used, args_info, call_dbg_node, .call); ^ C:\Users\Charlie\zig\zig\src\Sema.zig:1016:62: 0x159c6d8 in analyzeBodyInner (zig.exe.obj) .field_call => try sema.zirCall(block, inst, .field), ^ C:\Users\Charlie\zig\zig\src\Sema.zig:893:26: 0x159b093 in analyzeFnBody (zig.exe.obj) sema.analyzeBodyInner(block, body) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\Module.zig:4609:23: 0x12894d5 in analyzeFnBody (zig.exe.obj) sema.analyzeFnBody(&inner_block, fn_info.body) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\Module.zig:3144:32: 0xffa78a in ensureFuncBodyAnalyzed (zig.exe.obj) var air = zcu.analyzeFnBody(func_index, sema_arena) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\Compilation.zig:3419:42: 0xff862b in processOneJob (zig.exe.obj) module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\Compilation.zig:3359:30: 0xe251d1 in performAllTheWork (zig.exe.obj) try processOneJob(comp, work_item, main_progress_node); ^ C:\Users\Charlie\zig\zig\src\Compilation.zig:2132:31: 0xe20589 in update (zig.exe.obj) try comp.performAllTheWork(main_progress_node); ^ C:\Users\Charlie\zig\zig\src\main.zig:4507:24: 0xe51ca2 in updateModule (zig.exe.obj) try comp.update(main_progress_node); ^ C:\Users\Charlie\zig\zig\src\main.zig:3414:17: 0xebcbcd in buildOutputType (zig.exe.obj) updateModule(comp, color) catch |err| switch (err) { ^ C:\Users\Charlie\zig\zig\src\main.zig:268:31: 0xcf416b in mainArgs (zig.exe.obj) return buildOutputType(gpa, arena, args, .run); ^ C:\Users\Charlie\zig\zig\src\main.zig:206:20: 0xcf151e in main (zig.exe.obj) return mainArgs(gpa, arena, args); ^ C:\Users\Charlie\zig\zig\lib\std\start.zig:484:5: 0xcf124a in main (zig.exe.obj) return callMainWithArgs(@as(usize, @intCast(c_argc)), @as([*][*:0]u8, @ptrCast(c_argv)), envp); ^ C:\Users\Charlie\zig\zig\lib\libc\mingw\crt\crtexe.c:267:0: 0x34aa715 in __tmainCRTStartup (crt2.obj) mainret = _tmain (argc, argv, envp); C:\Users\Charlie\zig\zig\lib\libc\mingw\crt\crtexe.c:188:0: 0x34aa76b in mainCRTStartup (crt2.obj) ret = __tmainCRTStartup (); ???:?:?: 0x7ffb2a477343 in ??? (KERNEL32.DLL) ???:?:?: 0x7ffb2c0626b0 in ??? (ntdll.dll) ```Expected Behavior