Skip to content

0-sized enum in switch loop trips assertion in x86_64 codegen #24128

Open
@tauoverpi

Description

@tauoverpi

Zig Version

0.15.0 (cffa98e)

Steps to Reproduce and Observed Behavior

pub fn next(t: *Tokenizer) Structure.Token {}

test next {
    loop: switch (enum { start }.start) {
        .start => {
            continue :loop .start;
        },
    }
}

const Tokenizer = @This();

Results in:

thread 15643 panic: reached unreachable code
/home/tau/tmp/zig/lib/std/debug.zig:558:14: 0x17dbebe in assert (std.zig)
    if (!ok) unreachable; // assertion failure
             ^
/home/tau/tmp/zig/lib/std/math.zig:1099:11: 0x19a61a1 in isPowerOfTwo__anon_40390 (std.zig)
    assert(int > 0);
          ^
/home/tau/tmp/zig/src/arch/x86_64/CodeGen.zig:163918:34: 0x480b809 in allocRegOrMemAdvanced (main.zig)
        if (std.math.isPowerOfTwo(abi_size) and abi_size <= @as(u32, max_abi_size: switch (ty.zigTypeTag(zcu)) {
                                 ^
/home/tau/tmp/zig/src/arch/x86_64/CodeGen.zig:163903:38: 0x480c068 in allocRegOrMem (main.zig)
    return self.allocRegOrMemAdvanced(self.typeOfIndex(inst), inst, reg_ok);
                                     ^
/home/tau/tmp/zig/src/arch/x86_64/CodeGen.zig:175352:48: 0x6127393 in airLoopSwitchBr (main.zig)
        const mat_cond = try self.allocRegOrMem(inst, true);
                                               ^
/home/tau/tmp/zig/src/arch/x86_64/CodeGen.zig:85190:54: 0x61dd4d3 in genBody (main.zig)
            .loop_switch_br => try cg.airLoopSwitchBr(inst),
                                                     ^
/home/tau/tmp/zig/src/arch/x86_64/CodeGen.zig:2344:25: 0x5bed0d0 in gen (main.zig)
        try self.genBody(self.air.getMainBody());
                        ^
/home/tau/tmp/zig/src/arch/x86_64/CodeGen.zig:1086:17: 0x5762da5 in generate (main.zig)
    function.gen() catch |err| switch (err) {
                ^
/home/tau/tmp/zig/src/codegen.zig:111:51: 0x5130ab9 in generateFunction (main.zig)
            return importBackend(backend).generate(lf, pt, src_loc, func_index, air, liveness, code, debug_output);
                                                  ^
/home/tau/tmp/zig/src/link/Elf/ZigObject.zig:1441:33: 0x4ba2b8c in updateFunc (main.zig)
    try codegen.generateFunction(
                                ^
/home/tau/tmp/zig/src/link/Elf.zig:2403:44: 0x4458acc in updateFunc (main.zig)
    return self.zigObjectPtr().?.updateFunc(self, pt, func_index, air, liveness);
                                           ^
/home/tau/tmp/zig/src/link.zig:745:82: 0x3b5ca25 in updateFunc (main.zig)
                return @as(*tag.Type(), @fieldParentPtr("base", base)).updateFunc(pt, func_index, air, liveness);
                                                                                 ^
/home/tau/tmp/zig/src/Zcu/PerThread.zig:1788:22: 0x31ff83d in linkerUpdateFunc (main.zig)
        lf.updateFunc(pt, func_index, air.*, liveness) catch |err| switch (err) {
                     ^
/home/tau/tmp/zig/src/link.zig:1605:36: 0x2bc0e56 in doTask (main.zig)
                pt.linkerUpdateFunc(func.func, &air) catch |err| switch (err) {
                                   ^
/home/tau/tmp/zig/src/link.zig:1402:34: 0x2554f32 in flushTaskQueue (main.zig)
        for (tasks) |task| doTask(comp, tid, task);
                                 ^
/home/tau/tmp/zig/lib/std/Thread/Pool.zig:180:50: 0x25556fe in runFn (std.zig)
            @call(.auto, func, .{id.?} ++ closure.arguments);
                                                 ^
/home/tau/tmp/zig/lib/std/Thread/Pool.zig:293:27: 0x24ce111 in worker (std.zig)
            runnable.runFn(runnable, id);
                          ^
/home/tau/tmp/zig/lib/std/Thread.zig:510:13: 0x202b51f in callFn__anon_189890 (std.zig)
            @call(.auto, f, args);
            ^
/home/tau/tmp/zig/lib/std/Thread.zig:1403:30: 0x1d9a773 in entryFn (std.zig)
                return callFn(f, self.fn_args);
                             ^
/home/tau/tmp/zig/lib/std/os/linux/x86_64.zig:126:5: 0x202b620 in clone (std.zig)
    asm volatile (
    ^
???:?:?: 0x0 in ??? (???)

Expected Behavior

The test should compile and never terminate.

Metadata

Metadata

Assignees

No one assigned

    Labels

    arch-x86_6464-bit x86backend-self-hostedbugObserved behavior contradicts documented or intended behavior

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions