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:
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