diff --git a/src/Sema.zig b/src/Sema.zig index cd5cc98f0670c86b0cd38fe6d291b2eafc888cc9..f6e05f2c10c6bc4ad6849b04faf783d53c484666 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -13479,7 +13479,8 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai while (elem_i < lhs_len) : (elem_i += 1) { const lhs_elem_i = elem_i; const elem_default_val: ?Value = if (lhs_is_tuple) lhs_ty.structFieldDefaultValue(lhs_elem_i, zcu) else null; - const elem_val = elem_default_val orelse try lhs_sub_val.elemValue(pt, lhs_elem_i); + const elem_val = elem_default_val orelse + if (lhs_sub_val.isUndef(zcu)) try pt.undefValue(resolved_elem_ty) else try lhs_sub_val.elemValue(pt, lhs_elem_i); const operand_src = block.src(.{ .array_cat_lhs = .{ .array_cat_offset = inst_data.src_node, .elem_index = elem_i, @@ -13491,7 +13492,8 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai while (elem_i < result_len) : (elem_i += 1) { const rhs_elem_i = elem_i - lhs_len; const elem_default_val: ?Value = if (rhs_is_tuple) rhs_ty.structFieldDefaultValue(rhs_elem_i, zcu) else null; - const elem_val = elem_default_val orelse try rhs_sub_val.elemValue(pt, rhs_elem_i); + const elem_val = elem_default_val orelse + if (rhs_sub_val.isUndef(zcu)) try pt.undefValue(resolved_elem_ty) else try rhs_sub_val.elemValue(pt, rhs_elem_i); const operand_src = block.src(.{ .array_cat_rhs = .{ .array_cat_offset = inst_data.src_node, .elem_index = @intCast(rhs_elem_i), diff --git a/test/behavior/array.zig b/test/behavior/array.zig index 1ac512b628353f37b53a31816e5cc7913e42836c..ed6e58b8e8cfb7180aed8c63000e98090f1f41cd 100644 --- a/test/behavior/array.zig +++ b/test/behavior/array.zig @@ -98,6 +98,24 @@ test "array concat with tuple" { } } +test "array concat with undefined tuple" { + if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest; + + { + const array: [2]u64 = .{ 1, 2 }; + var seq = array ++ @as(struct { u32, u16 }, undefined); + seq[2] = 3; + seq[3] = 4; + try std.testing.expectEqualSlices(u64, &.{ 1, 2, 3, 4 }, &seq); + } + { + const array: [2]u64 = undefined; + var seq = @as(struct { u32, u16 }, undefined) ++ array; + for (&seq, 1..) |*s, i| s.* = i; + try std.testing.expectEqualSlices(u64, &.{ 1, 2, 3, 4 }, &seq); + } +} + test "array init with concat" { if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;