aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-09-19 14:36:41 +0300
committerVeikka Tuominen <git@vexu.eu>2022-09-20 00:50:13 +0300
commit541b3e3a31946475f29d21e7a742bf80c5952791 (patch)
tree4516d103301ab7913786679f3f2e988bf7029eb5 /test
parentfb91483e48fe6cfa21edc613f266e27bd6bf9dbf (diff)
downloadzig-541b3e3a31946475f29d21e7a742bf80c5952791.tar.gz
zig-541b3e3a31946475f29d21e7a742bf80c5952791.zip
Sema: check pointer qualifiers before implicit cast
Closes #12881
Diffstat (limited to 'test')
-rw-r--r--test/behavior/bugs/4328.zig2
-rw-r--r--test/behavior/cast.zig4
-rw-r--r--test/behavior/slice.zig3
-rw-r--r--test/behavior/struct.zig2
-rw-r--r--test/behavior/type.zig4
-rw-r--r--test/behavior/type_info.zig6
-rw-r--r--test/cases/compile_errors/attempted_implicit_cast_from_const_T_to_sliceT.zig1
-rw-r--r--test/cases/compile_errors/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig47
-rw-r--r--test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig26
-rw-r--r--test/cases/compile_errors/implicitly_increasing_slice_alignment.zig (renamed from test/cases/compile_errors/stage1/obj/implicitly_increasing_slice_alignment.zig)7
-rw-r--r--test/cases/compile_errors/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig (renamed from test/cases/compile_errors/stage1/obj/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig)6
-rw-r--r--test/cases/compile_errors/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig2
-rw-r--r--test/cases/compile_errors/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig11
-rw-r--r--test/cases/compile_errors/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig24
-rw-r--r--test/cases/compile_errors/reading_past_end_of_pointer_casted_array.zig2
-rw-r--r--test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig2
-rw-r--r--test/cases/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig42
-rw-r--r--test/cases/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig12
-rw-r--r--test/cases/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig11
-rw-r--r--test/cases/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig24
20 files changed, 129 insertions, 109 deletions
diff --git a/test/behavior/bugs/4328.zig b/test/behavior/bugs/4328.zig
index 3158cb2c0d..5cacd29044 100644
--- a/test/behavior/bugs/4328.zig
+++ b/test/behavior/bugs/4328.zig
@@ -13,7 +13,7 @@ extern fn fopen([*c]const u8, [*c]const u8) [*c]FILE;
const S = extern struct {
state: c_short,
- extern fn s_do_thing([*c]S, b: c_int) c_short;
+ extern fn s_do_thing([*c]const S, b: c_int) c_short;
};
test "Extern function calls in @TypeOf" {
diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig
index dac3c12b0d..9a02e74853 100644
--- a/test/behavior/cast.zig
+++ b/test/behavior/cast.zig
@@ -1242,13 +1242,13 @@ test "implicit cast *[0]T to E![]const u8" {
var global_array: [4]u8 = undefined;
test "cast from array reference to fn: comptime fn ptr" {
- const f = @ptrCast(*const fn () callconv(.C) void, &global_array);
+ const f = @ptrCast(*align(1) const fn () callconv(.C) void, &global_array);
try expect(@ptrToInt(f) == @ptrToInt(&global_array));
}
test "cast from array reference to fn: runtime fn ptr" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
- var f = @ptrCast(*const fn () callconv(.C) void, &global_array);
+ var f = @ptrCast(*align(1) const fn () callconv(.C) void, &global_array);
try expect(@ptrToInt(f) == @ptrToInt(&global_array));
}
diff --git a/test/behavior/slice.zig b/test/behavior/slice.zig
index b9bae08878..e5cb8ea408 100644
--- a/test/behavior/slice.zig
+++ b/test/behavior/slice.zig
@@ -322,11 +322,12 @@ test "empty array to slice" {
test "@ptrCast slice to pointer" {
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
const S = struct {
fn doTheTest() !void {
var array align(@alignOf(u16)) = [5]u8{ 0xff, 0xff, 0xff, 0xff, 0xff };
- var slice: []u8 = &array;
+ var slice: []align(@alignOf(u16)) u8 = &array;
var ptr = @ptrCast(*u16, slice);
try expect(ptr.* == 65535);
}
diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig
index e0be677b3c..7a650e1a33 100644
--- a/test/behavior/struct.zig
+++ b/test/behavior/struct.zig
@@ -521,7 +521,7 @@ test "packed struct fields are ordered from LSB to MSB" {
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
var all: u64 = 0x7765443322221111;
- var bytes: [8]u8 = undefined;
+ var bytes: [8]u8 align(@alignOf(Bitfields)) = undefined;
@memcpy(&bytes, @ptrCast([*]u8, &all), 8);
var bitfields = @ptrCast(*Bitfields, &bytes).*;
diff --git a/test/behavior/type.zig b/test/behavior/type.zig
index f59ac7cb27..4b70f502c7 100644
--- a/test/behavior/type.zig
+++ b/test/behavior/type.zig
@@ -293,7 +293,7 @@ test "Type.Struct" {
try testing.expectEqual(@as(?*const anyopaque, null), infoB.fields[0].default_value);
try testing.expectEqualSlices(u8, "y", infoB.fields[1].name);
try testing.expectEqual(u32, infoB.fields[1].field_type);
- try testing.expectEqual(@as(u32, 5), @ptrCast(*const u32, infoB.fields[1].default_value.?).*);
+ try testing.expectEqual(@as(u32, 5), @ptrCast(*align(1) const u32, infoB.fields[1].default_value.?).*);
try testing.expectEqual(@as(usize, 0), infoB.decls.len);
try testing.expectEqual(@as(bool, false), infoB.is_tuple);
@@ -305,7 +305,7 @@ test "Type.Struct" {
try testing.expectEqual(@as(u8, 3), @ptrCast(*const u8, infoC.fields[0].default_value.?).*);
try testing.expectEqualSlices(u8, "y", infoC.fields[1].name);
try testing.expectEqual(u32, infoC.fields[1].field_type);
- try testing.expectEqual(@as(u32, 5), @ptrCast(*const u32, infoC.fields[1].default_value.?).*);
+ try testing.expectEqual(@as(u32, 5), @ptrCast(*align(1) const u32, infoC.fields[1].default_value.?).*);
try testing.expectEqual(@as(usize, 0), infoC.decls.len);
try testing.expectEqual(@as(bool, false), infoC.is_tuple);
diff --git a/test/behavior/type_info.zig b/test/behavior/type_info.zig
index 76d67c8aec..b85d39d7bb 100644
--- a/test/behavior/type_info.zig
+++ b/test/behavior/type_info.zig
@@ -295,8 +295,8 @@ fn testStruct() !void {
try expect(unpacked_struct_info.Struct.is_tuple == false);
try expect(unpacked_struct_info.Struct.backing_integer == null);
try expect(unpacked_struct_info.Struct.fields[0].alignment == @alignOf(u32));
- try expect(@ptrCast(*const u32, unpacked_struct_info.Struct.fields[0].default_value.?).* == 4);
- try expect(mem.eql(u8, "foobar", @ptrCast(*const *const [6:0]u8, unpacked_struct_info.Struct.fields[1].default_value.?).*));
+ try expect(@ptrCast(*align(1) const u32, unpacked_struct_info.Struct.fields[0].default_value.?).* == 4);
+ try expect(mem.eql(u8, "foobar", @ptrCast(*align(1) const *const [6:0]u8, unpacked_struct_info.Struct.fields[1].default_value.?).*));
}
const TestStruct = struct {
@@ -321,7 +321,7 @@ fn testPackedStruct() !void {
try expect(struct_info.Struct.fields[0].alignment == 0);
try expect(struct_info.Struct.fields[2].field_type == f32);
try expect(struct_info.Struct.fields[2].default_value == null);
- try expect(@ptrCast(*const u32, struct_info.Struct.fields[3].default_value.?).* == 4);
+ try expect(@ptrCast(*align(1) const u32, struct_info.Struct.fields[3].default_value.?).* == 4);
try expect(struct_info.Struct.fields[3].alignment == 0);
try expect(struct_info.Struct.decls.len == 2);
try expect(struct_info.Struct.decls[0].is_pub);
diff --git a/test/cases/compile_errors/attempted_implicit_cast_from_const_T_to_sliceT.zig b/test/cases/compile_errors/attempted_implicit_cast_from_const_T_to_sliceT.zig
index 0634b4696f..ad3b0a7254 100644
--- a/test/cases/compile_errors/attempted_implicit_cast_from_const_T_to_sliceT.zig
+++ b/test/cases/compile_errors/attempted_implicit_cast_from_const_T_to_sliceT.zig
@@ -9,3 +9,4 @@ export fn entry() void {
// target=native
//
// :3:22: error: expected type '[]u32', found '*const u32'
+// :3:22: note: cast discards const qualifier
diff --git a/test/cases/compile_errors/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig b/test/cases/compile_errors/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig
new file mode 100644
index 0000000000..78261f182f
--- /dev/null
+++ b/test/cases/compile_errors/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig
@@ -0,0 +1,47 @@
+export fn a() void {
+ var x: [*c]u8 = undefined;
+ var y: *align(4) u8 = x;
+ _ = y;
+}
+export fn b() void {
+ var x: [*c]const u8 = undefined;
+ var y: *u8 = x;
+ _ = y;
+}
+export fn c() void {
+ var x: [*c]u8 = undefined;
+ var y: *u32 = x;
+ _ = y;
+}
+export fn d() void {
+ var y: *align(1) u32 = undefined;
+ var x: [*c]u32 = y;
+ _ = x;
+}
+export fn e() void {
+ var y: *const u8 = undefined;
+ var x: [*c]u8 = y;
+ _ = x;
+}
+export fn f() void {
+ var y: *u8 = undefined;
+ var x: [*c]u32 = y;
+ _ = x;
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :3:27: error: expected type '*align(4) u8', found '[*c]u8'
+// :3:27: note: pointer alignment '1' cannot cast into pointer alignment '4'
+// :8:18: error: expected type '*u8', found '[*c]const u8'
+// :8:18: note: cast discards const qualifier
+// :13:19: error: expected type '*u32', found '[*c]u8'
+// :13:19: note: pointer type child 'u8' cannot cast into pointer type child 'u32'
+// :18:22: error: expected type '[*c]u32', found '*align(1) u32'
+// :18:22: note: pointer alignment '1' cannot cast into pointer alignment '4'
+// :23:21: error: expected type '[*c]u8', found '*const u8'
+// :23:21: note: cast discards const qualifier
+// :28:22: error: expected type '[*c]u32', found '*u8'
+// :28:22: note: pointer type child 'u8' cannot cast into pointer type child 'u32'
diff --git a/test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig b/test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig
new file mode 100644
index 0000000000..2a80b9ffbc
--- /dev/null
+++ b/test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig
@@ -0,0 +1,26 @@
+export fn entry() void {
+ const buffer: [1]u8 = [_]u8{8};
+ const sliceA: []u8 = &buffer;
+ _ = sliceA;
+}
+export fn entry1() void {
+ const str: *const [0:0]u8 = "";
+ const slice: [:0]u8 = str;
+ _ = slice;
+}
+export fn entry2() void {
+ const str: *const [0:0]u8 = "";
+ const many: [*]u8 = str;
+ _ = many;
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :3:26: error: expected type '[]u8', found '*const [1]u8'
+// :3:26: note: cast discards const qualifier
+// :8:27: error: expected type '[:0]u8', found '*const [0:0]u8'
+// :8:27: note: cast discards const qualifier
+// :13:25: error: expected type '[*]u8', found '*const [0:0]u8'
+// :13:25: note: cast discards const qualifier
diff --git a/test/cases/compile_errors/stage1/obj/implicitly_increasing_slice_alignment.zig b/test/cases/compile_errors/implicitly_increasing_slice_alignment.zig
index 2e5c201b5d..84ec6464f4 100644
--- a/test/cases/compile_errors/stage1/obj/implicitly_increasing_slice_alignment.zig
+++ b/test/cases/compile_errors/implicitly_increasing_slice_alignment.zig
@@ -14,9 +14,8 @@ fn bar(x: []u32) void {
}
// error
-// backend=stage1
+// backend=stage2
// target=native
//
-// tmp.zig:9:26: error: cast increases pointer alignment
-// tmp.zig:9:26: note: '*align(1) u32' has alignment 1
-// tmp.zig:9:26: note: '*[1]u32' has alignment 4
+// :9:22: error: expected type '*[1]u32', found '*align(1) u32'
+// :9:22: note: pointer alignment '1' cannot cast into pointer alignment '4'
diff --git a/test/cases/compile_errors/stage1/obj/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig b/test/cases/compile_errors/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig
index a622ceb44e..abcccb659e 100644
--- a/test/cases/compile_errors/stage1/obj/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig
+++ b/test/cases/compile_errors/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig
@@ -9,8 +9,8 @@ export fn foo() void {
}
// error
-// backend=stage1
+// backend=stage2
// target=native
//
-// :5:28: error: cannot cast pointer to array literal to slice type '[]u8'
-// :5:28: note: cast discards const qualifier
+// :4:22: error: expected type '[]u8', found '*const [3:0]u8'
+// :4:22: note: cast discards const qualifier
diff --git a/test/cases/compile_errors/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig b/test/cases/compile_errors/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig
index a86fbc0127..baeb3e8c82 100644
--- a/test/cases/compile_errors/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig
+++ b/test/cases/compile_errors/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig
@@ -1,5 +1,5 @@
export fn entry() void {
- const float: f32 = 5.99999999999994648725e-01;
+ const float: f32 align(@alignOf(i64)) = 5.99999999999994648725e-01;
const float_ptr = &float;
const int_ptr = @ptrCast(*const i64, float_ptr);
const int_val = int_ptr.*;
diff --git a/test/cases/compile_errors/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig b/test/cases/compile_errors/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig
new file mode 100644
index 0000000000..fd01927889
--- /dev/null
+++ b/test/cases/compile_errors/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig
@@ -0,0 +1,11 @@
+export fn func() void {
+ var strValue: [*c]u8 = undefined;
+ strValue = strValue orelse "";
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :3:32: error: expected type '[*c]u8', found '*const [0:0]u8'
+// :3:32: note: cast discards const qualifier
diff --git a/test/cases/compile_errors/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig b/test/cases/compile_errors/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig
new file mode 100644
index 0000000000..c0a0b06af0
--- /dev/null
+++ b/test/cases/compile_errors/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig
@@ -0,0 +1,24 @@
+comptime {
+ const c: [][]const u8 = &.{ "hello", "world" };
+ _ = c;
+}
+comptime {
+ const c: *[2][]const u8 = &.{ "hello", "world" };
+ _ = c;
+}
+const S = struct { a: u8 = 1, b: u32 = 2 };
+comptime {
+ const c: *S = &.{ .a = 2 };
+ _ = c;
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :2:29: error: expected type '[][]const u8', found '*const tuple{comptime *const [5:0]u8 = "hello", comptime *const [5:0]u8 = "world"}'
+// :2:29: note: cast discards const qualifier
+// :6:31: error: expected type '*[2][]const u8', found '*const tuple{comptime *const [5:0]u8 = "hello", comptime *const [5:0]u8 = "world"}'
+// :6:31: note: cast discards const qualifier
+// :11:19: error: expected type '*tmp.S', found '*const struct{comptime a: comptime_int = 2}'
+// :11:19: note: cast discards const qualifier
diff --git a/test/cases/compile_errors/reading_past_end_of_pointer_casted_array.zig b/test/cases/compile_errors/reading_past_end_of_pointer_casted_array.zig
index 906b292753..d3d9b03ff5 100644
--- a/test/cases/compile_errors/reading_past_end_of_pointer_casted_array.zig
+++ b/test/cases/compile_errors/reading_past_end_of_pointer_casted_array.zig
@@ -1,7 +1,7 @@
comptime {
const array: [4]u8 = "aoeu".*;
const sub_array = array[1..];
- const int_ptr = @ptrCast(*const u24, sub_array);
+ const int_ptr = @ptrCast(*const u24, @alignCast(@alignOf(u24), sub_array));
const deref = int_ptr.*;
_ = deref;
}
diff --git a/test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig b/test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig
index 2280345e15..5fab9c90a9 100644
--- a/test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig
+++ b/test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig
@@ -1,5 +1,5 @@
export fn foo() void {
- const bytes = [1]u8{ 0xfa } ** 16;
+ const bytes align(@alignOf([]const u8)) = [1]u8{0xfa} ** 16;
var value = @ptrCast(*const []const u8, &bytes).*;
_ = value;
}
diff --git a/test/cases/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig b/test/cases/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig
deleted file mode 100644
index 6ff155b591..0000000000
--- a/test/cases/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig
+++ /dev/null
@@ -1,42 +0,0 @@
-export fn a() void {
- var x: [*c]u8 = undefined;
- var y: *align(4) u8 = x;
- _ = y;
-}
-export fn b() void {
- var x: [*c]const u8 = undefined;
- var y: *u8 = x;
- _ = y;
-}
-export fn c() void {
- var x: [*c]u8 = undefined;
- var y: *u32 = x;
- _ = y;
-}
-export fn d() void {
- var y: *align(1) u32 = undefined;
- var x: [*c]u32 = y;
- _ = x;
-}
-export fn e() void {
- var y: *const u8 = undefined;
- var x: [*c]u8 = y;
- _ = x;
-}
-export fn f() void {
- var y: *u8 = undefined;
- var x: [*c]u32 = y;
- _ = x;
-}
-
-// error
-// backend=stage1
-// target=native
-//
-// tmp.zig:3:27: error: cast increases pointer alignment
-// tmp.zig:8:18: error: cast discards const qualifier
-// tmp.zig:13:19: error: expected type '*u32', found '[*c]u8'
-// tmp.zig:13:19: note: pointer type child 'u8' cannot cast into pointer type child 'u32'
-// tmp.zig:18:22: error: cast increases pointer alignment
-// tmp.zig:23:21: error: cast discards const qualifier
-// tmp.zig:28:22: error: expected type '[*c]u32', found '*u8'
diff --git a/test/cases/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig b/test/cases/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig
deleted file mode 100644
index 3f22cbed6b..0000000000
--- a/test/cases/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig
+++ /dev/null
@@ -1,12 +0,0 @@
-export fn entry() void {
- const buffer: [1]u8 = [_]u8{8};
- const sliceA: []u8 = &buffer;
- _ = sliceA;
-}
-
-// error
-// backend=stage1
-// target=native
-//
-// tmp.zig:3:27: error: cannot cast pointer to array literal to slice type '[]u8'
-// tmp.zig:3:27: note: cast discards const qualifier
diff --git a/test/cases/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig b/test/cases/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig
deleted file mode 100644
index 7d18e760c3..0000000000
--- a/test/cases/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig
+++ /dev/null
@@ -1,11 +0,0 @@
-export fn func() void {
- var strValue: [*c]u8 = undefined;
- strValue = strValue orelse "";
-}
-
-// error
-// backend=stage1
-// target=native
-//
-// tmp.zig:3:32: error: expected type '[*c]u8', found '*const [0:0]u8'
-// tmp.zig:3:32: note: cast discards const qualifier
diff --git a/test/cases/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig b/test/cases/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig
deleted file mode 100644
index 8456c8afcb..0000000000
--- a/test/cases/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig
+++ /dev/null
@@ -1,24 +0,0 @@
-comptime {
- const c: [][]const u8 = &.{"hello", "world" };
- _ = c;
-}
-comptime {
- const c: *[2][]const u8 = &.{"hello", "world" };
- _ = c;
-}
-const S = struct {a: u8 = 1, b: u32 = 2};
-comptime {
- const c: *S = &.{};
- _ = c;
-}
-
-// error
-// backend=stage1
-// target=native
-//
-// tmp.zig:2:31: error: cannot cast pointer to array literal to slice type '[][]const u8'
-// tmp.zig:2:31: note: cast discards const qualifier
-// tmp.zig:6:33: error: cannot cast pointer to array literal to '*[2][]const u8'
-// tmp.zig:6:33: note: cast discards const qualifier
-// tmp.zig:11:21: error: expected type '*S', found '*const struct:11:21'
-// tmp.zig:11:21: note: cast discards const qualifier