AstGen: emit break_inline from inline while loop

This commit is contained in:
Andrew Kelley 2022-03-24 22:45:10 -07:00
parent bcf2eb1a00
commit 7f91be9c80
2 changed files with 12 additions and 2 deletions

View File

@ -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,

View File

@ -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);
}