authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-09-26 11:08:45+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2026-09-26 18:58:35+02:00
log1b7a78122ecf9d5f6d36b46c26bd5e3fb8211eea
tree310ff9fb21424efa3e6ebf71ee6aa64dc20208d9
parentd9c2b8859181cdf81732de50adf9fdc85fa47f3f

Sema: disallow in-memory coercion of tuples with incompatible comptime field values

Resolves: https://codeberg.org/ziglang/zig/issues/36612

2 files changed, 22 insertions(+), 1 deletions(-)

src/Sema.zig+12-1
......@@ -29385,7 +29385,18 @@ pub fn coerceInMemoryAllowed(
2938529385 if (dest_ty.structFieldCount(zcu) != src_ty.structFieldCount(zcu)) break :tuple;
2938629386 const field_count = dest_ty.structFieldCount(zcu);
2938729387 for (0..field_count) |field_idx| {
29388 if (dest_ty.structFieldIsComptime(field_idx, zcu) != src_ty.structFieldIsComptime(field_idx, zcu)) break :tuple;
29388 const dest_is_comptime = dest_ty.structFieldIsComptime(field_idx, zcu);
29389 const src_is_comptime = src_ty.structFieldIsComptime(field_idx, zcu);
29390 if (dest_is_comptime != src_is_comptime) {
29391 break :tuple;
29392 }
29393 if (dest_is_comptime) {
29394 const dest_comptime_field_val = dest_ty.structFieldDefaultValue(field_idx, zcu).?;
29395 const src_comptime_field_val = src_ty.structFieldDefaultValue(field_idx, zcu).?;
29396 if (dest_comptime_field_val.ip_index != src_comptime_field_val.ip_index) {
29397 break :tuple;
29398 }
29399 }
2938929400 const dest_field_ty = dest_ty.fieldType(field_idx, zcu);
2939029401 const src_field_ty = src_ty.fieldType(field_idx, zcu);
2939129402 const field = try sema.coerceInMemoryAllowed(block, dest_field_ty, src_field_ty, dest_is_mut, target, dest_src, src_src, null);
test/cases/compile_errors/coerce_tuple_incompatible_defaults.zig created+10
......@@ -0,0 +1,10 @@
1comptime {
2 const one = .{@as(u32, 1)};
3 const two = .{@as(u32, 2)};
4 const coerced: @TypeOf(one) = two;
5 _ = coerced;
6}
7
8// error
9//
10// :4:35: error: value stored in comptime field does not match the default value of the field