diff --git a/src/Sema.zig b/src/Sema.zig index 3bd2a31bc79d3877d1374171bed8225273bb4ff1..a960980eec00ed4a5af9d8b6ce2e35c42c0f5dee 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -29385,7 +29385,18 @@ pub fn coerceInMemoryAllowed( if (dest_ty.structFieldCount(zcu) != src_ty.structFieldCount(zcu)) break :tuple; const field_count = dest_ty.structFieldCount(zcu); for (0..field_count) |field_idx| { - if (dest_ty.structFieldIsComptime(field_idx, zcu) != src_ty.structFieldIsComptime(field_idx, zcu)) break :tuple; + const dest_is_comptime = dest_ty.structFieldIsComptime(field_idx, zcu); + const src_is_comptime = src_ty.structFieldIsComptime(field_idx, zcu); + if (dest_is_comptime != src_is_comptime) { + break :tuple; + } + if (dest_is_comptime) { + const dest_comptime_field_val = dest_ty.structFieldDefaultValue(field_idx, zcu).?; + const src_comptime_field_val = src_ty.structFieldDefaultValue(field_idx, zcu).?; + if (dest_comptime_field_val.ip_index != src_comptime_field_val.ip_index) { + break :tuple; + } + } const dest_field_ty = dest_ty.fieldType(field_idx, zcu); const src_field_ty = src_ty.fieldType(field_idx, zcu); const field = try sema.coerceInMemoryAllowed(block, dest_field_ty, src_field_ty, dest_is_mut, target, dest_src, src_src, null); diff --git a/test/cases/compile_errors/coerce_tuple_incompatible_defaults.zig b/test/cases/compile_errors/coerce_tuple_incompatible_defaults.zig new file mode 100644 index 0000000000000000000000000000000000000000..c46714405a33bdf838179a7167053d68de819e8c --- /dev/null +++ b/test/cases/compile_errors/coerce_tuple_incompatible_defaults.zig @@ -0,0 +1,10 @@ +comptime { + const one = .{@as(u32, 1)}; + const two = .{@as(u32, 2)}; + const coerced: @TypeOf(one) = two; + _ = coerced; +} + +// error +// +// :4:35: error: value stored in comptime field does not match the default value of the field