Commit 29ac68b253

Justus Klausecker <justus@klausecker.de>
2025-07-13 16:53:39
Sema: Fix invalid AIR generation for switch loop with comptime discarded tag Add an additional check before emitting `.loop_switch_br` instead of `.switch_br` in a tagged switch statement for whether any of the continues referencing its tag are actually runtime reachable. This fixes triggering an assertion in Liveness caused by the invalid assumption that every tagged switch must be a loop if its tag is referenced in any way even if this reference is not runtime reachable.
1 parent f43f89a
Changed files (2)
src/Sema.zig
@@ -13041,8 +13041,10 @@ fn analyzeSwitchRuntimeBlock(
     sema.air_extra.appendSliceAssumeCapacity(@ptrCast(cases_extra.items));
     sema.air_extra.appendSliceAssumeCapacity(@ptrCast(else_body));
 
+    const has_any_continues = spa.operand == .loop and child_block.label.?.merges.extra_insts.items.len > 0;
+
     return try child_block.addInst(.{
-        .tag = if (spa.operand == .loop) .loop_switch_br else .switch_br,
+        .tag = if (has_any_continues) .loop_switch_br else .switch_br,
         .data = .{ .pl_op = .{
             .operand = operand,
             .payload = payload_index,
test/cases/discard_labeled_switch_tag.zig
@@ -0,0 +1,12 @@
+// https://github.com/ziglang/zig/issues/24323
+
+export fn f() void {
+    const x: u32 = 0;
+    sw: switch (x) {
+        else => if (false) continue :sw undefined,
+    }
+}
+
+// compile
+// backend=stage2,llvm
+// target=native