Commit 7f91be9c80

Andrew Kelley <andrew@ziglang.org>
2022-03-25 06:45:10
AstGen: emit break_inline from inline while loop
1 parent bcf2eb1
Changed files (2)
src
test
behavior
src/AstGen.zig
@@ -1878,8 +1878,8 @@ fn continueExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index)
                     continue;
                 }
 
-                // TODO emit a break_inline if the loop being continued is inline
-                _ = try parent_gz.addBreak(.@"break", continue_block, .void_value);
+                const break_tag: Zir.Inst.Tag = if (gen_zir.is_inline) .break_inline else .@"break";
+                _ = try parent_gz.addBreak(break_tag, continue_block, .void_value);
                 return Zir.Inst.Ref.unreachable_value;
             },
             .local_val => scope = scope.cast(Scope.LocalVal).?.parent,
test/behavior/while.zig
@@ -1,6 +1,7 @@
 const std = @import("std");
 const builtin = @import("builtin");
 const expect = std.testing.expect;
+const assert = std.debug.assert;
 
 test "while loop" {
     if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
@@ -326,3 +327,12 @@ test "while error 2 break statements and an else" {
     try S.entry(true, false);
     comptime try S.entry(true, false);
 }
+
+test "continue inline while loop" {
+    comptime var i = 0;
+    inline while (i < 10) : (i += 1) {
+        if (i < 5) continue;
+        break;
+    }
+    comptime assert(i == 5);
+}