motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit 4d7f5a1917f569506682bbb6ee5af672ab1fd8e8 (tree)
parent 3c4e9b5983e49fa3179adec8e41e3198f3fd66ae
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Sun,  7 Aug 2022 22:48:34 -0700

stage2: fix crash with comptime vector reduce

Diffstat:
Msrc/value.zig | 10++++++++++
Mtest/behavior/vector.zig | 17+++++++++++++++++
2 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/src/value.zig b/src/value.zig @@ -1194,6 +1194,16 @@ pub const Value = extern union { return switch (self.tag()) { .bool_true, .one => true, .bool_false, .zero => false, + .int_u64 => switch (self.castTag(.int_u64).?.data) { + 0 => false, + 1 => true, + else => unreachable, + }, + .int_i64 => switch (self.castTag(.int_i64).?.data) { + 0 => false, + 1 => true, + else => unreachable, + }, else => unreachable, }; } diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig @@ -807,6 +807,23 @@ test "vector reduce operation" { comptime try S.doTheTest(); } +test "vector @reduce comptime" { + if (builtin.zig_backend == .stage1) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const value = @Vector(4, i32){ 1, -1, 1, -1 }; + const result = value > @splat(4, @as(i32, 0)); + // result is { true, false, true, false }; + comptime try expect(@TypeOf(result) == @Vector(4, bool)); + const is_all_true = @reduce(.And, result); + comptime try expect(@TypeOf(is_all_true) == bool); + try expect(is_all_true == false); +} + test "mask parameter of @shuffle is comptime scope" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO