Commit 8ddf9d84ff

Andrew Kelley <andrew@ziglang.org>
2020-03-19 16:17:46
add behavior tests for slicing with comptime indexes
1 parent f824658
Changed files (1)
test
stage1
behavior
test/stage1/behavior/slice.zig
@@ -145,15 +145,21 @@ test "@ptrCast slice to pointer" {
     comptime S.doTheTest();
 }
 
-test "slicing producing an array" {
+test "slice syntax resulting in pointer-to-array" {
     const S = struct {
         fn doTheTest() void {
             testArray();
             testArrayZ();
+            testArray0();
+            testArrayAlign();
             testPointer();
             testPointerZ();
+            testPointer0();
+            testPointerAlign();
             testSlice();
             testSliceZ();
+            testSlice0();
+            testSliceAlign();
         }
 
         fn testArray() void {
@@ -172,6 +178,28 @@ test "slicing producing an array" {
             comptime expect(@TypeOf(array[1..3 :4]) == *[2:4]u8);
         }
 
+        fn testArray0() void {
+            {
+                var array = [0]u8{};
+                var slice = array[0..0];
+                comptime expect(@TypeOf(slice) == *[0]u8);
+            }
+            {
+                var array = [0:0]u8{};
+                var slice = array[0..0];
+                comptime expect(@TypeOf(slice) == *[0:0]u8);
+                expect(slice[0] == 0);
+            }
+        }
+
+        fn testArrayAlign() void {
+            var array align(4) = [5]u8{ 1, 2, 3, 4, 5 };
+            var slice = array[4..5];
+            comptime expect(@TypeOf(slice) == *align(4) [1]u8);
+            expect(slice[0] == 5);
+            comptime expect(@TypeOf(array[0..2]) == *align(4) [2]u8);
+        }
+
         fn testPointer() void {
             var array = [5]u8{ 1, 2, 3, 4, 5 };
             var pointer: [*]u8 = &array;
@@ -188,6 +216,22 @@ test "slicing producing an array" {
             comptime expect(@TypeOf(pointer[1..3 :4]) == *[2:4]u8);
         }
 
+        fn testPointer0() void {
+            var pointer: [*]u0 = &[1]u0{0};
+            var slice = pointer[0..1];
+            comptime expect(@TypeOf(slice) == *[1]u0);
+            expect(slice[0] == 0);
+        }
+
+        fn testPointerAlign() void {
+            var array align(4) = [5]u8{ 1, 2, 3, 4, 5 };
+            var pointer: [*]align(4) u8 = &array;
+            var slice = pointer[4..5];
+            comptime expect(@TypeOf(slice) == *align(4) [1]u8);
+            expect(slice[0] == 5);
+            comptime expect(@TypeOf(pointer[0..2]) == *align(4) [2]u8);
+        }
+
         fn testSlice() void {
             var array = [5]u8{ 1, 2, 3, 4, 5 };
             var src_slice: []u8 = &array;
@@ -204,6 +248,30 @@ test "slicing producing an array" {
             comptime expect(@TypeOf(slice[1..]) == [:0]u8);
             comptime expect(@TypeOf(slice[1..3 :4]) == *[2:4]u8);
         }
+
+        fn testSlice0() void {
+            {
+                var array = [0]u8{};
+                var src_slice: []u8 = &array;
+                var slice = src_slice[0..0];
+                comptime expect(@TypeOf(slice) == *[0]u8);
+            }
+            {
+                var array = [0:0]u8{};
+                var src_slice: [:0]u8 = &array;
+                var slice = src_slice[0..0];
+                comptime 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;
+            var slice = src_slice[4..5];
+            comptime expect(@TypeOf(slice) == *align(4) [1]u8);
+            expect(slice[0] == 5);
+            comptime expect(@TypeOf(src_slice[0..2]) == *align(4) [2]u8);
+        }
     };
 
     S.doTheTest();