master
 1const std = @import("std");
 2const expect = std.testing.expect;
 3
 4// You can assign constant pointers to arrays to a slice with
 5// const modifier on the element type. Useful in particular for
 6// String literals.
 7test "*const [N]T to []const T" {
 8    const x1: []const u8 = "hello";
 9    const x2: []const u8 = &[5]u8{ 'h', 'e', 'l', 'l', 111 };
10    try expect(std.mem.eql(u8, x1, x2));
11
12    const y: []const f32 = &[2]f32{ 1.2, 3.4 };
13    try expect(y[0] == 1.2);
14}
15
16// Likewise, it works when the destination type is an error union.
17test "*const [N]T to E![]const T" {
18    const x1: anyerror![]const u8 = "hello";
19    const x2: anyerror![]const u8 = &[5]u8{ 'h', 'e', 'l', 'l', 111 };
20    try expect(std.mem.eql(u8, try x1, try x2));
21
22    const y: anyerror![]const f32 = &[2]f32{ 1.2, 3.4 };
23    try expect((try y)[0] == 1.2);
24}
25
26// Likewise, it works when the destination type is an optional.
27test "*const [N]T to ?[]const T" {
28    const x1: ?[]const u8 = "hello";
29    const x2: ?[]const u8 = &[5]u8{ 'h', 'e', 'l', 'l', 111 };
30    try expect(std.mem.eql(u8, x1.?, x2.?));
31
32    const y: ?[]const f32 = &[2]f32{ 1.2, 3.4 };
33    try expect(y.?[0] == 1.2);
34}
35
36// In this cast, the array length becomes the slice length.
37test "*[N]T to []T" {
38    var buf: [5]u8 = "hello".*;
39    const x: []u8 = &buf;
40    try expect(std.mem.eql(u8, x, "hello"));
41
42    const buf2 = [2]f32{ 1.2, 3.4 };
43    const x2: []const f32 = &buf2;
44    try expect(std.mem.eql(f32, x2, &[2]f32{ 1.2, 3.4 }));
45}
46
47// Single-item pointers to arrays can be coerced to many-item pointers.
48test "*[N]T to [*]T" {
49    var buf: [5]u8 = "hello".*;
50    const x: [*]u8 = &buf;
51    try expect(x[4] == 'o');
52    // x[5] would be an uncaught out of bounds pointer dereference!
53}
54
55// Likewise, it works when the destination type is an optional.
56test "*[N]T to ?[*]T" {
57    var buf: [5]u8 = "hello".*;
58    const x: ?[*]u8 = &buf;
59    try expect(x.?[4] == 'o');
60}
61
62// Single-item pointers can be cast to len-1 single-item arrays.
63test "*T to *[1]T" {
64    var x: i32 = 1234;
65    const y: *[1]i32 = &x;
66    const z: [*]i32 = y;
67    try expect(z[0] == 1234);
68}
69
70// Sentinel-terminated slices can be coerced into sentinel-terminated pointers
71test "[:x]T to [*:x]T" {
72    const buf: [:0]const u8 = "hello";
73    const buf2: [*:0]const u8 = buf;
74    try expect(buf2[4] == 'o');
75}
76
77// test