master
1const expect = @import("std").testing.expect;
2const expectEqualSlices = @import("std").testing.expectEqualSlices;
3
4test "basic slices" {
5 var array = [_]i32{ 1, 2, 3, 4 };
6 var known_at_runtime_zero: usize = 0;
7 _ = &known_at_runtime_zero;
8 const slice = array[known_at_runtime_zero..array.len];
9
10 // alternative initialization using result location
11 const alt_slice: []const i32 = &.{ 1, 2, 3, 4 };
12
13 try expectEqualSlices(i32, slice, alt_slice);
14
15 try expect(@TypeOf(slice) == []i32);
16 try expect(&slice[0] == &array[0]);
17 try expect(slice.len == array.len);
18
19 // If you slice with comptime-known start and end positions, the result is
20 // a pointer to an array, rather than a slice.
21 const array_ptr = array[0..array.len];
22 try expect(@TypeOf(array_ptr) == *[array.len]i32);
23
24 // You can perform a slice-by-length by slicing twice. This allows the compiler
25 // to perform some optimisations like recognising a comptime-known length when
26 // the start position is only known at runtime.
27 var runtime_start: usize = 1;
28 _ = &runtime_start;
29 const length = 2;
30 const array_ptr_len = array[runtime_start..][0..length];
31 try expect(@TypeOf(array_ptr_len) == *[length]i32);
32
33 // Using the address-of operator on a slice gives a single-item pointer.
34 try expect(@TypeOf(&slice[0]) == *i32);
35 // Using the `ptr` field gives a many-item pointer.
36 try expect(@TypeOf(slice.ptr) == [*]i32);
37 try expect(@intFromPtr(slice.ptr) == @intFromPtr(&slice[0]));
38
39 // Slices have array bounds checking. If you try to access something out
40 // of bounds, you'll get a safety check failure:
41 slice[10] += 1;
42
43 // Note that `slice.ptr` does not invoke safety checking, while `&slice[0]`
44 // asserts that the slice has len > 0.
45
46 // Empty slices can be created like this:
47 const empty1 = &[0]u8{};
48 // If the type is known you can use this short hand:
49 const empty2: []u8 = &.{};
50 try expect(empty1.len == 0);
51 try expect(empty2.len == 0);
52
53 // A zero-length initialization can always be used to create an empty slice, even if the slice is mutable.
54 // This is because the pointed-to data is zero bits long, so its immutability is irrelevant.
55}
56
57// test_safety=index out of bounds