aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-04-15 02:48:35 -0400
committerVeikka Tuominen <git@vexu.eu>2023-04-17 02:30:10 +0300
commit7e0c6d7edc538b1648792e73b0c8aab1a35d0bff (patch)
treec6d77d4627ec5485df971a97bf0af4faedcf28e6 /src
parent7fad555e5e16e6cb71554981394387a0622093b0 (diff)
downloadzig-7e0c6d7edc538b1648792e73b0c8aab1a35d0bff.tar.gz
zig-7e0c6d7edc538b1648792e73b0c8aab1a35d0bff.zip
Sema: fix empty infinite loops
Closes #15284
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 9cf342f75b..83441793a4 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -5225,17 +5225,17 @@ fn zirLoop(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileError
try sema.analyzeBody(&loop_block, body);
- if (sema.typeOf(Air.indexToRef(loop_block.instructions.items[loop_block.instructions.items.len - 1])).isNoReturn()) {
+ const loop_block_len = loop_block.instructions.items.len;
+ if (loop_block_len > 0 and sema.typeOf(Air.indexToRef(loop_block.instructions.items[loop_block_len - 1])).isNoReturn()) {
// If the loop ended with a noreturn terminator, then there is no way for it to loop,
// so we can just use the block instead.
try child_block.instructions.appendSlice(gpa, loop_block.instructions.items);
} else {
try child_block.instructions.append(gpa, loop_inst);
- try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Block).Struct.fields.len +
- loop_block.instructions.items.len);
+ try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Block).Struct.fields.len + loop_block_len);
sema.air_instructions.items(.data)[loop_inst].ty_pl.payload = sema.addExtraAssumeCapacity(
- Air.Block{ .body_len = @intCast(u32, loop_block.instructions.items.len) },
+ Air.Block{ .body_len = @intCast(u32, loop_block_len) },
);
sema.air_extra.appendSliceAssumeCapacity(loop_block.instructions.items);
}