diff options
Diffstat (limited to 'test/behavior/pointers.zig')
| -rw-r--r-- | test/behavior/pointers.zig | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/test/behavior/pointers.zig b/test/behavior/pointers.zig index 74089611db..96200e73fc 100644 --- a/test/behavior/pointers.zig +++ b/test/behavior/pointers.zig @@ -437,3 +437,71 @@ test "indexing array with sentinel returns correct type" { var s: [:0]const u8 = "abc"; try testing.expectEqualSlices(u8, "*const u8", @typeName(@TypeOf(&s[0]))); } + +test "element pointer to slice" { + if (builtin.zig_backend == .stage2_c) 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 S = struct { + fn doTheTest() !void { + var cases: [2][2]i32 = [_][2]i32{ + [_]i32{ 0, 1 }, + [_]i32{ 2, 3 }, + }; + + const items: []i32 = &cases[0]; // *[2]i32 + try testing.expect(items.len == 2); + try testing.expect(items[1] == 1); + try testing.expect(items[0] == 0); + } + }; + + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "element pointer arithmetic to slice" { + if (builtin.zig_backend == .stage2_c) 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 S = struct { + fn doTheTest() !void { + var cases: [2][2]i32 = [_][2]i32{ + [_]i32{ 0, 1 }, + [_]i32{ 2, 3 }, + }; + + const elem_ptr = &cases[0]; // *[2]i32 + const many = @ptrCast([*][2]i32, elem_ptr); + const many_elem = @ptrCast(*[2]i32, &many[1]); + const items: []i32 = many_elem; + try testing.expect(items.len == 2); + try testing.expect(items[1] == 3); + try testing.expect(items[0] == 2); + } + }; + + try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "array slicing to slice" { + if (builtin.zig_backend == .stage2_c) 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 S = struct { + fn doTheTest() !void { + var str: [5]i32 = [_]i32{ 1, 2, 3, 4, 5 }; + var sub: *[2]i32 = str[1..3]; + var slice: []i32 = sub; // used to cause failures + try testing.expect(slice.len == 2); + try testing.expect(slice[0] == 2); + } + }; + + try S.doTheTest(); + comptime try S.doTheTest(); +} |
