aboutsummaryrefslogtreecommitdiff
path: root/test/behavior/eval.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-09-09 16:56:59 +0300
committerVeikka Tuominen <git@vexu.eu>2022-09-15 00:48:47 +0300
commitbf4a3df9a961e18a258d94fa35b0c433424e4bbe (patch)
tree809407bceeb4b385204a13322b0430388801855e /test/behavior/eval.zig
parent002260c27481e50c74dbb3d8998cf8c3b1c472d8 (diff)
downloadzig-bf4a3df9a961e18a258d94fa35b0c433424e4bbe.tar.gz
zig-bf4a3df9a961e18a258d94fa35b0c433424e4bbe.zip
Sema: allow runtime break from inline loop
Closes #12787
Diffstat (limited to 'test/behavior/eval.zig')
-rw-r--r--test/behavior/eval.zig34
1 files changed, 34 insertions, 0 deletions
diff --git a/test/behavior/eval.zig b/test/behavior/eval.zig
index 47d2e4374e..dbbdbf2df3 100644
--- a/test/behavior/eval.zig
+++ b/test/behavior/eval.zig
@@ -1337,3 +1337,37 @@ test "lazy value is resolved as slice operand" {
try expect(@ptrToInt(ptr1) == @ptrToInt(ptr2));
try expect(ptr1.len == ptr2.len);
}
+
+test "break from inline loop depends on runtime condition" {
+ const S = struct {
+ fn foo(a: u8) bool {
+ return a == 4;
+ }
+ };
+ const arr = [_]u8{ 1, 2, 3, 4 };
+ {
+ const blk = blk: {
+ inline for (arr) |val| {
+ if (S.foo(val)) {
+ break :blk val;
+ }
+ }
+ return error.TestFailed;
+ };
+ try expect(blk == 4);
+ }
+
+ {
+ comptime var i = 0;
+ const blk = blk: {
+ inline while (i < arr.len) : (i += 1) {
+ const val = arr[i];
+ if (S.foo(val)) {
+ break :blk val;
+ }
+ }
+ return error.TestFailed;
+ };
+ try expect(blk == 4);
+ }
+}