zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit d7d2ccb7af7349617fa76eef3bdead7c259654a5 (tree)
parent adfcc8851b6bb47b085cfe2526f0797b1f414996
Author: John Schmidt <john.schmidt.h@gmail.com>
Date:   Thu, 17 Mar 2022 22:29:39 +0100

Avoid index out of bounds for one-valued types in zirValidateArrayInit

Previously, the code assumed that `ptr_elem_ptr` was always followed by
a `store`, but this is not true for types with one value (such as `u0`).

Diffstat:
Msrc/Sema.zig | 14++++++--------
Mtest/behavior/byteswap.zig | 3---
2 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -3205,14 +3205,11 @@ fn zirValidateArrayInit( // instruction after it within the same block. // Possible performance enhancement: save the `block_index` between iterations // of the for loop. - const next_air_inst = inst: { - var block_index = block.instructions.items.len - 1; - while (block.instructions.items[block_index] != elem_ptr_air_inst) { - block_index -= 1; - } - first_block_index = @minimum(first_block_index, block_index); - break :inst block.instructions.items[block_index + 1]; - }; + var block_index = block.instructions.items.len - 1; + while (block.instructions.items[block_index] != elem_ptr_air_inst) { + block_index -= 1; + } + first_block_index = @minimum(first_block_index, block_index); // Array has one possible value, so value is always comptime-known if (opt_opv) |opv| { @@ -3222,6 +3219,7 @@ fn zirValidateArrayInit( // If the next instructon is a store with a comptime operand, this element // is comptime. + const next_air_inst = block.instructions.items[block_index + 1]; switch (air_tags[next_air_inst]) { .store => { const bin_op = air_datas[next_air_inst].bin_op; diff --git a/test/behavior/byteswap.zig b/test/behavior/byteswap.zig @@ -114,9 +114,6 @@ fn vector0() !void { } test "@byteSwap vectors u0" { - // TODO: vector initialization for @Vector(x, u0) currently fails. - if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;