diff options
| author | Mitchell Hashimoto <mitchell.hashimoto@gmail.com> | 2022-03-22 13:26:35 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-03-22 19:56:10 -0400 |
| commit | cb6364624fb28bf51adb2dc16c8e93a30c33c76b (patch) | |
| tree | 41d22ab3ee2d380186d3adfafae2a3c375748cf3 /test/behavior/slice.zig | |
| parent | b74f2924102fe06addb688dc5fd039dc2756f619 (diff) | |
| download | zig-cb6364624fb28bf51adb2dc16c8e93a30c33c76b.tar.gz zig-cb6364624fb28bf51adb2dc16c8e93a30c33c76b.zip | |
stage2: slice behavior test passes, just has diff behavior from stage1
This is from discussions from #11249. The stage2 behavior is correct and
is strictly more accurate, so we'd prefer to keep it. In that case, I
modified the behavior tests to have the conditional between
stage1/stage2 and get this test passing.
Diffstat (limited to 'test/behavior/slice.zig')
| -rw-r--r-- | test/behavior/slice.zig | 89 |
1 files changed, 71 insertions, 18 deletions
diff --git a/test/behavior/slice.zig b/test/behavior/slice.zig index 9177ba96ad..6b72e169fa 100644 --- a/test/behavior/slice.zig +++ b/test/behavior/slice.zig @@ -343,7 +343,10 @@ test "@ptrCast slice to pointer" { } test "slice syntax resulting in pointer-to-array" { - if (builtin.zig_backend != .stage1) 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 S = struct { fn doTheTest() !void { @@ -356,8 +359,6 @@ test "slice syntax resulting in pointer-to-array" { try testPointer0(); try testPointerAlign(); try testSlice(); - try testSliceZ(); - try testSlice0(); try testSliceOpt(); try testSliceAlign(); } @@ -460,21 +461,6 @@ test "slice syntax resulting in pointer-to-array" { comptime try expect(@TypeOf(slice.?[0..2]) == *[2]u8); } - fn testSlice0() !void { - { - var array = [0]u8{}; - var src_slice: []u8 = &array; - var slice = src_slice[0..0]; - comptime try expect(@TypeOf(slice) == *[0]u8); - } - { - var array = [0:0]u8{}; - var src_slice: [:0]u8 = &array; - var slice = src_slice[0..0]; - comptime try expect(@TypeOf(slice) == *[0]u8); - } - } - fn testSliceAlign() !void { var array align(4) = [5]u8{ 1, 2, 3, 4, 5 }; var src_slice: []align(4) u8 = &array; @@ -494,6 +480,73 @@ test "slice syntax resulting in pointer-to-array" { comptime try S.doTheTest(); } +test "slice pointer-to-array null terminated" { + 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 + + comptime { + var array = [5:0]u8{ 1, 2, 3, 4, 5 }; + var slice: [:0]u8 = &array; + try expect(@TypeOf(slice[1..3]) == *[2]u8); + try expect(@TypeOf(slice[1..3 :4]) == *[2:4]u8); + + if (builtin.zig_backend == .stage1) { + try expect(@TypeOf(slice[1..]) == [:0]u8); + } else { + // stage2 gives a more accurate, correct answer + try expect(@TypeOf(slice[1..]) == *[4:0]u8); + } + } + + var array = [5:0]u8{ 1, 2, 3, 4, 5 }; + var slice: [:0]u8 = &array; + comptime try expect(@TypeOf(slice[1..3]) == *[2]u8); + comptime try expect(@TypeOf(slice[1..3 :4]) == *[2:4]u8); + comptime try expect(@TypeOf(slice[1..]) == [:0]u8); +} + +test "slice pointer-to-array zero length" { + 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 + + comptime { + { + var array = [0]u8{}; + var src_slice: []u8 = &array; + var slice = src_slice[0..0]; + try expect(@TypeOf(slice) == *[0]u8); + } + { + var array = [0:0]u8{}; + var src_slice: [:0]u8 = &array; + var slice = src_slice[0..0]; + if (builtin.zig_backend == .stage1) { + try expect(@TypeOf(slice) == *[0]u8); + } else { + // stage2 gives a more accurate, correct answer + try expect(@TypeOf(slice) == *[0:0]u8); + } + } + } + + { + var array = [0]u8{}; + var src_slice: []u8 = &array; + var slice = src_slice[0..0]; + comptime try expect(@TypeOf(slice) == *[0]u8); + } + { + var array = [0:0]u8{}; + var src_slice: [:0]u8 = &array; + var slice = src_slice[0..0]; + comptime try expect(@TypeOf(slice) == *[0]u8); + } +} + test "type coercion of pointer to anon struct literal to pointer to slice" { if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
