ziglang / zig

General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software.
https://ziglang.org
MIT License
34.63k stars 2.53k forks source link

comptime: Attempt to set field in a packed struct inside extern enum is causing compiler panic #21830

Closed vesim987 closed 2 hours ago

vesim987 commented 3 hours ago

Zig Version

0.14.0-dev.2052+6a364b4a5

Steps to Reproduce and Observed Behavior

const Body = extern union {
    free: packed struct { index: u15, free_: bool = false },
    data: [4]u8,
};

fn dummy(x: bool) void {
    _ = x;
}

comptime {
    var block: Body = undefined;
    // dummy(block.free.free_); // passing any of the packed struct fields to any function fixes the issue
    block.free.index = 0;
}
zig build-exe main.zig

Backtrace:

Analyzing /home/vesim/lib.zig
      %21 = decl_val("Body") token_offset:11:16 to :11:20
      %22 = alloc_comptime_mut(%21) node_offset:11:5 to :11:32
      %23 = store_node(%22, @undef) node_offset:11:23 to :11:32
      %24 = field_ptr(%22, "free") node_offset:13:5 to :13:15
      %25 = field_ptr(%24, "index") node_offset:13:5 to :13:21
    > %26 = store_node(%25, @zero) node_offset:13:5 to :13:25
      %27 = break_inline(%20, @void_value)
    For full context, use the command
      zig ast-check -t /home/vesim/lib.zig

/home/vesim/pro/zig/src/Sema/bitcast.zig:157:59: 0x353ec9c in bitCastSpliceInner (zig)
        .{ val_ty.abiSize(zcu) * 8 - host_bits, host_bits - val_ty.bitSize(zcu) }
                                                          ^
/home/vesim/pro/zig/src/Sema/bitcast.zig:54:30: 0x31c3a1c in bitCastSplice (zig)
    return bitCastSpliceInner(sema, val, splice_val, byte_offset, host_bits, bit_offset) catch |err| switch (err) {
                             ^
/home/vesim/pro/zig/src/Sema/comptime_ptr_access.zig:185:46: 0x31c26f0 in storeComptimePtr (zig)
    const new_val = try sema.bitCastSpliceVal(
                                             ^
/home/vesim/pro/zig/src/Sema.zig:31908:38: 0x31c3efb in storePtrVal (zig)
    switch (try sema.storeComptimePtr(block, src, coerced_ptr_val, coerced_operand_val)) {
                                     ^
/home/vesim/pro/zig/src/Sema.zig:31712:33: 0x2cf4360 in storePtr2 (zig)
            try sema.storePtrVal(block, src, ptr_val, operand_val, elem_ty);
                                ^
/home/vesim/pro/zig/src/Sema.zig:5698:26: 0x2e059f9 in zirStoreNode (zig)
    return sema.storePtr2(block, src, ptr, ptr_src, operand, operand_src, air_tag);
                         ^
/home/vesim/pro/zig/src/Sema.zig:1405:38: 0x292d29a in analyzeBodyInner (zig)
                try sema.zirStoreNode(block, inst);
                                     ^
/home/vesim/pro/zig/src/Sema.zig:954:30: 0x24bffc7 in analyzeInlineBody (zig)
    if (sema.analyzeBodyInner(block, body)) |_| {
                             ^
/home/vesim/pro/zig/src/Sema.zig:987:39: 0x208613e in resolveInlineBody (zig)
    return (try sema.analyzeInlineBody(block, body, break_target)) orelse .unreachable_value;
                                      ^
/home/vesim/pro/zig/src/Zcu/PerThread.zig:1227:50: 0x20833c6 in semaCau (zig)
    const result_ref = try sema.resolveInlineBody(&block, decl_bodies.value_body, inst_info.inst);
                                                 ^
/home/vesim/pro/zig/src/Zcu/PerThread.zig:692:22: 0x1dd510d in ensureCauAnalyzedInner (zig)
    return pt.semaCau(cau_index) catch |err| switch (err) {
                     ^
/home/vesim/pro/zig/src/Zcu/PerThread.zig:578:90: 0x1ba5103 in ensureCauAnalyzed (zig)
    const sema_result: SemaCauResult, const analysis_fail = if (pt.ensureCauAnalyzedInner(cau_index, cau_outdated)) |result|
                                                                                         ^
/home/vesim/pro/zig/src/Compilation.zig:3663:33: 0x1dc5743 in processOneJob (zig)
            pt.ensureCauAnalyzed(cau_index) catch |err| switch (err) {
                                ^
/home/vesim/pro/zig/src/Compilation.zig:3603:30: 0x1b9fd1c in performAllTheWorkInner (zig)
            try processOneJob(@intFromEnum(Zcu.PerThread.Id.main), comp, job, main_progress_node);
                             ^
/home/vesim/pro/zig/src/Compilation.zig:3463:36: 0x1a085a0 in performAllTheWork (zig)
    try comp.performAllTheWorkInner(main_progress_node);
                                   ^
/home/vesim/pro/zig/src/Compilation.zig:2232:31: 0x1a03bb4 in update (zig)
    try comp.performAllTheWork(main_progress_node);
                              ^
/home/vesim/pro/zig/src/main.zig:4414:20: 0x1a45e1d in updateModule (zig)
    try comp.update(prog_node);
                   ^
/home/vesim/pro/zig/src/main.zig:3606:21: 0x1ab0bd4 in buildOutputType (zig)
        updateModule(comp, color, root_prog_node) catch |err| switch (err) {
                    ^
/home/vesim/pro/zig/src/main.zig:259:31: 0x1910336 in mainArgs (zig)
        return buildOutputType(gpa, arena, args, .{ .build = .Exe });
                              ^
/home/vesim/pro/zig/src/main.zig:200:20: 0x190d395 in main (zig)
    return mainArgs(gpa, arena, args);
                   ^
/home/vesim/pro/zig/lib/std/start.zig:618:37: 0x190ce9e in main (zig)
            const result = root.main() catch |err| {
                                    ^
???:?:?: 0x7f67cf63314d in ??? (libc.so.6)
Unwind information for `libc.so.6:0x7f67cf63314d` was not available, trace may be incomplete

Aborted (core dumped)

Expected Behavior

The code compile without any issues.

Vexu commented 2 hours ago

Duplicate of #19730