diff options
| author | mlugg <mlugg@mlugg.co.uk> | 2023-06-07 10:20:34 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-06-14 22:07:25 -0700 |
| commit | ce88c43a4ee94d82a64e7580885dc6693cc6120c (patch) | |
| tree | 2ec2dd9966ff2f96186d13872031c074a81e50bc /test/behavior | |
| parent | 610b02c432072c85f079f3ddf315cb864aa5dbf5 (diff) | |
| download | zig-ce88c43a4ee94d82a64e7580885dc6693cc6120c.tar.gz zig-ce88c43a4ee94d82a64e7580885dc6693cc6120c.zip | |
Sema: allow indexing tuple and vector pointers
Resolves: #13852
Resolves: #14705
Diffstat (limited to 'test/behavior')
| -rw-r--r-- | test/behavior/for.zig | 16 | ||||
| -rw-r--r-- | test/behavior/tuple.zig | 25 | ||||
| -rw-r--r-- | test/behavior/vector.zig | 27 |
3 files changed, 68 insertions, 0 deletions
diff --git a/test/behavior/for.zig b/test/behavior/for.zig index 773f08f9ce..12b82c44a4 100644 --- a/test/behavior/for.zig +++ b/test/behavior/for.zig @@ -463,3 +463,19 @@ test "inline for with counter as the comptime-known" { try expect(S.ok == 2); } + +test "inline for on tuple pointer" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO + + const S = struct { u32, u32, u32 }; + var s: S = .{ 100, 200, 300 }; + + inline for (&s, 0..) |*x, i| { + x.* = i; + } + + try expectEqual(S{ 0, 1, 2 }, s); +} diff --git a/test/behavior/tuple.zig b/test/behavior/tuple.zig index 190ac3c7df..ee414365c3 100644 --- a/test/behavior/tuple.zig +++ b/test/behavior/tuple.zig @@ -1,6 +1,7 @@ const builtin = @import("builtin"); const std = @import("std"); const testing = std.testing; +const assert = std.debug.assert; const expect = testing.expect; const expectEqualStrings = std.testing.expectEqualStrings; const expectEqual = std.testing.expectEqual; @@ -428,3 +429,27 @@ test "sentinel slice in tuple" { _ = S; } + +test "tuple pointer is indexable" { + 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; // TODO + + const S = struct { u32, bool }; + + const x: S = .{ 123, true }; + comptime assert(@TypeOf(&(&x)[0]) == *const u32); // validate constness + try expectEqual(@as(u32, 123), (&x)[0]); + try expectEqual(true, (&x)[1]); + + var y: S = .{ 123, true }; + comptime assert(@TypeOf(&(&y)[0]) == *u32); // validate constness + try expectEqual(@as(u32, 123), (&y)[0]); + try expectEqual(true, (&y)[1]); + + (&y)[0] = 100; + (&y)[1] = false; + try expectEqual(@as(u32, 100), (&y)[0]); + try expectEqual(false, (&y)[1]); +} diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig index 195500c178..367a21fc0a 100644 --- a/test/behavior/vector.zig +++ b/test/behavior/vector.zig @@ -2,6 +2,7 @@ const std = @import("std"); const builtin = @import("builtin"); const mem = std.mem; const math = std.math; +const assert = std.debug.assert; const expect = std.testing.expect; const expectEqual = std.testing.expectEqual; @@ -1343,3 +1344,29 @@ test "compare vectors with different element types" { var b: @Vector(2, u9) = .{ 3, 0 }; try expectEqual(@Vector(2, bool){ true, false }, a < b); } + +test "vector pointer is indexable" { + 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_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO + + const V = @Vector(2, u32); + + const x: V = .{ 123, 456 }; + comptime assert(@TypeOf(&(&x)[0]) == *const u32); // validate constness + try expectEqual(@as(u32, 123), (&x)[0]); + try expectEqual(@as(u32, 456), (&x)[1]); + + var y: V = .{ 123, 456 }; + comptime assert(@TypeOf(&(&y)[0]) == *u32); // validate constness + try expectEqual(@as(u32, 123), (&y)[0]); + try expectEqual(@as(u32, 456), (&y)[1]); + + (&y)[0] = 100; + (&y)[1] = 200; + try expectEqual(@as(u32, 100), (&y)[0]); + try expectEqual(@as(u32, 200), (&y)[1]); +} |
