zig icon indicating copy to clipboard operation
zig copied to clipboard

stage2: Crash with labeled block expression in nested `inline for`

Open topolarity opened this issue 1 year ago • 1 comments

Zig Version

0.10.0-dev.4418+99c3578f6

Steps to Reproduce

test "continue nested inline for loop in named block expr" {
    var a: u8 = 0;
    loop: inline for ([_]u8{ 1, 2 }) |x| {
        a = b: {
            inline for ([_]u8{1}) |y| {
                if (x == y) {
                    continue :loop;
                }
            }
            break :b x;
        };
        try expect(x == 2);
    }
    try expect(a == 2);
}

Basically a more complicated version of #13038

Expected Behavior

Test should pass.

Actual Behavior

Semantic Analysis [2905] foo... thread 169164 panic: reached unreachable code
/home/topolarity/repos/zig/lib/std/debug.zig:281:14: 0x556633ec88d6 in std.debug.assert (zig2)
    if (!ok) unreachable; // assertion failure
             ^
/home/topolarity/repos/zig/src/Sema.zig:5065:11: 0x556634810441 in Sema.analyzeBlockBody (zig2)
    /// use to return from the body.
          ^
/home/topolarity/repos/zig/src/Sema.zig:5031:41: 0x556634a2fc55 in Sema.resolveBlockBody (zig2)
    var child_block: Block = .{
                                        ^
/home/topolarity/repos/zig/src/Sema.zig:5013:33: 0x55663480f4c7 in Sema.zirBlock (zig2)
    // Reserve space for a Block instruction so that generated Break instructions can
                                ^
/home/topolarity/repos/zig/src/Sema.zig:1270:69: 0x5566345cf7eb in Sema.analyzeBodyInner (zig2)
                        orig_captures = 0;
                                                                    ^
/home/topolarity/repos/zig/src/Sema.zig:646:45: 0x5566345bd5bc in Sema.analyzeBodyBreak (zig2)
            });
                                            ^
/home/topolarity/repos/zig/src/Sema.zig:1407:62: 0x5566345d0a8b in Sema.analyzeBodyInner (zig2)
                }
                                                             ^
/home/topolarity/repos/zig/src/Sema.zig:646:45: 0x5566345bd5bc in Sema.analyzeBodyBreak (zig2)
            });
                                            ^
/home/topolarity/repos/zig/src/Sema.zig:1323:65: 0x5566345cfbda in Sema.analyzeBodyInner (zig2)
                    break always_noreturn;
                                                                ^
/home/topolarity/repos/zig/src/Sema.zig:646:45: 0x5566345bd5bc in Sema.analyzeBodyBreak (zig2)
            });
                                            ^
/home/topolarity/repos/zig/src/Sema.zig:1323:65: 0x5566345cfbda in Sema.analyzeBodyInner (zig2)
                    break always_noreturn;
                                                                ^
/home/topolarity/repos/zig/src/Sema.zig:629:30: 0x5566345b643a in Sema.analyzeBody (zig2)
    // we find the corresponding block to this break.
                             ^
/home/topolarity/repos/zig/src/Module.zig:5607:21: 0x5566343b72ed in Module.analyzeFnBody (zig2)

                    ^
/home/topolarity/repos/zig/src/Module.zig:4300:40: 0x556634397aba in Module.ensureFuncBodyAnalyzed (zig2)
            var air = mod.analyzeFnBody(func, sema_arena) catch |err| switch (err) {
                                       ^
/home/topolarity/repos/zig/src/Compilation.zig:3047:42: 0x55663408393c in Compilation.processOneJob (zig2)
            module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                                         ^
/home/topolarity/repos/zig/src/Compilation.zig:2985:30: 0x55663407168f in Compilation.performAllTheWork (zig2)
            try processOneJob(comp, work_item);
                             ^
/home/topolarity/repos/zig/src/Compilation.zig:2325:31: 0x556634069d3d in Compilation.update (zig2)
    try comp.performAllTheWork(main_progress_node);
                              ^
/home/topolarity/repos/zig/src/main.zig:3318:20: 0x556633ff52bf in main.updateModule (zig2)
    try comp.update();
                   ^
/home/topolarity/repos/zig/src/main.zig:3003:17: 0x556633f3f105 in main.buildOutputType (zig2)
    updateModule(gpa, comp, hook) catch |err| switch (err) {
                ^
/home/topolarity/repos/zig/src/main.zig:236:31: 0x556633ed800e in main.mainArgs (zig2)
        return buildOutputType(gpa, arena, args, .zig_test);
                              ^
/home/topolarity/repos/zig/src/stage1.zig:56:24: 0x556633ed7755 in main (zig2)
        stage2.mainArgs(gpa, arena, args) catch unreachable;

topolarity avatar Oct 15 '22 21:10 topolarity

Here is another test case:

test "break from named while loop in an inline while loop sandwich" {
    var n: u32 = 0;
    comptime var b = false;

    inline while (true) : (b = true) {
        MID_LOOP: while (true) {
            comptime var a: u2 = 2;
            inline while (true) {
                if (!b and n == 0) break :MID_LOOP;
                a -= 1;
                if (a == 0) break;
                if (n == 0) break;
            }
        }
        if (b) break;
    }
}

Validark avatar Nov 03 '22 12:11 Validark