aboutsummaryrefslogtreecommitdiff
path: root/test/behavior
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2023-08-27 17:03:42 +0100
committerAndrew Kelley <andrew@ziglang.org>2023-08-28 12:32:02 -0700
commit8d036d1d78bd6db5fd39b30c6182196c1e49a3db (patch)
treeae65a34daabcc80a7b1faf04918fd8fb9ead2565 /test/behavior
parentc6024691cfc3fa329cf1b7ac9fcb0855b7211aa0 (diff)
downloadzig-8d036d1d78bd6db5fd39b30c6182196c1e49a3db.tar.gz
zig-8d036d1d78bd6db5fd39b30c6182196c1e49a3db.zip
Sema: allow cast builtins on vectors
The following cast builtins did not previously work on vectors, and have been made to: * `@floatCast` * `@ptrFromInt` * `@intFromPtr` * `@floatFromInt` * `@intFromFloat` * `@intFromBool` Resolves: #16267
Diffstat (limited to 'test/behavior')
-rw-r--r--test/behavior/cast.zig130
1 files changed, 129 insertions, 1 deletions
diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig
index 742f6b5af5..85d1b28a5a 100644
--- a/test/behavior/cast.zig
+++ b/test/behavior/cast.zig
@@ -609,7 +609,7 @@ test "cast *[1][*]const u8 to [*]const ?[*]const u8" {
try expect(mem.eql(u8, std.mem.sliceTo(@as([*:0]const u8, @ptrCast(x[0].?)), 0), "window name"));
}
-test "vector casts" {
+test "@intCast on vector" {
if (builtin.zig_backend == .stage2_wasm) 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
@@ -2366,3 +2366,131 @@ test "cast builtins can wrap result in error union and optional" {
try S.doTheTest();
try comptime S.doTheTest();
}
+
+test "@floatCast on vector" {
+ if (builtin.zig_backend == .stage2_wasm) 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
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
+
+ const S = struct {
+ fn doTheTest() !void {
+ var a: @Vector(3, f64) = .{ 1.5, 2.5, 3.5 };
+ const b: @Vector(3, f32) = @floatCast(a);
+ try expectEqual(@Vector(3, f32){ 1.5, 2.5, 3.5 }, b);
+ }
+ };
+
+ try S.doTheTest();
+ try comptime S.doTheTest();
+}
+
+test "@ptrFromInt on vector" {
+ if (builtin.zig_backend == .stage2_wasm) 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
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
+
+ const S = struct {
+ fn doTheTest() !void {
+ var a: @Vector(3, usize) = .{ 0x1000, 0x2000, 0x3000 };
+ const b: @Vector(3, *anyopaque) = @ptrFromInt(a);
+ try expectEqual(@Vector(3, *anyopaque){
+ @ptrFromInt(0x1000),
+ @ptrFromInt(0x2000),
+ @ptrFromInt(0x3000),
+ }, b);
+ }
+ };
+
+ try S.doTheTest();
+ try comptime S.doTheTest();
+}
+
+test "@intFromPtr on vector" {
+ if (builtin.zig_backend == .stage2_wasm) 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
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
+
+ const S = struct {
+ fn doTheTest() !void {
+ var a: @Vector(3, *anyopaque) = .{
+ @ptrFromInt(0x1000),
+ @ptrFromInt(0x2000),
+ @ptrFromInt(0x3000),
+ };
+ const b: @Vector(3, usize) = @intFromPtr(a);
+ try expectEqual(@Vector(3, usize){ 0x1000, 0x2000, 0x3000 }, b);
+ }
+ };
+
+ try S.doTheTest();
+ try comptime S.doTheTest();
+}
+
+test "@floatFromInt on vector" {
+ if (builtin.zig_backend == .stage2_wasm) 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
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
+
+ const S = struct {
+ fn doTheTest() !void {
+ var a: @Vector(3, u32) = .{ 10, 20, 30 };
+ const b: @Vector(3, f32) = @floatFromInt(a);
+ try expectEqual(@Vector(3, f32){ 10.0, 20.0, 30.0 }, b);
+ }
+ };
+
+ try S.doTheTest();
+ try comptime S.doTheTest();
+}
+
+test "@intFromFloat on vector" {
+ if (builtin.zig_backend == .stage2_wasm) 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
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
+
+ const S = struct {
+ fn doTheTest() !void {
+ var a: @Vector(3, f32) = .{ 10.3, 20.5, 30.7 };
+ const b: @Vector(3, u32) = @intFromFloat(a);
+ try expectEqual(@Vector(3, u32){ 10, 20, 30 }, b);
+ }
+ };
+
+ try S.doTheTest();
+ try comptime S.doTheTest();
+}
+
+test "@intFromBool on vector" {
+ if (builtin.zig_backend == .stage2_wasm) 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
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
+
+ const S = struct {
+ fn doTheTest() !void {
+ var a: @Vector(3, bool) = .{ false, true, false };
+ const b: @Vector(3, u1) = @intFromBool(a);
+ try expectEqual(@Vector(3, u1){ 0, 1, 0 }, b);
+ }
+ };
+
+ try S.doTheTest();
+ try comptime S.doTheTest();
+}