authorgravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2026-10-20 01:48:32-07:00
committergravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2026-10-20 11:56:52-07:00
log3c0e8b34d76d7c081a5d8b1f2d060fe6735e8d12
treedaab42aee6e389a8c7e3d74b8dfeb85653f1eab9
parent30b1ec85dd5d11a7dd767275ae3e65f17035d2f3

Sema: include sentinel in allocated result of array-like coercion to array


2 files changed, 24 insertions(+), 2 deletions(-)

src/Sema.zig+9-2
...@@ -30628,11 +30628,18 @@ fn coerceArrayLike(...@@ -30628,11 +30628,18 @@ fn coerceArrayLike(
30628 return block.addTyOp(.array_to_vector, dest_ty, inst);30628 return block.addTyOp(.array_to_vector, dest_ty, inst);
30629 }30629 }
3063030630
30631 const element_vals = try sema.arena.alloc(InternPool.Index, dest_len);30631 const dest_len_including_sent = try sema.usizeCast(block, dest_ty_src, dest_ty.arrayLenIncludingSentinel(zcu));
30632 const element_refs = try sema.arena.alloc(Air.Inst.Ref, dest_len);30632 const element_vals = try sema.arena.alloc(InternPool.Index, dest_len_including_sent);
30633 const element_refs = try sema.arena.alloc(Air.Inst.Ref, dest_len_including_sent);
30633 var runtime_src: ?LazySrcLoc = null;30634 var runtime_src: ?LazySrcLoc = null;
3063430635
30635 for (element_vals, element_refs, 0..) |*val, *ref, i| {30636 for (element_vals, element_refs, 0..) |*val, *ref, i| {
30637 if (i == dest_len) {
30638 const sentinel_val = dest_ty.sentinel(zcu).?;
30639 val.* = sentinel_val.toIntern();
30640 ref.* = Air.internedToRef(sentinel_val.toIntern());
30641 break;
30642 }
30636 const index_ref = Air.internedToRef((try pt.intValue(.usize, i)).toIntern());30643 const index_ref = Air.internedToRef((try pt.intValue(.usize, i)).toIntern());
30637 const src = inst_src; // TODO better source location30644 const src = inst_src; // TODO better source location
30638 const elem_src = inst_src; // TODO better source location30645 const elem_src = inst_src; // TODO better source location
test/behavior/array.zig+15
...@@ -596,6 +596,21 @@ test "tuple to array handles sentinel" {...@@ -596,6 +596,21 @@ test "tuple to array handles sentinel" {
596 try expect(S.b[3] == 0);596 try expect(S.b[3] == 0);
597}597}
598598
599test "array-like to array handles sentinel" {
600 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
601 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
602 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
603
604 const S = struct {
605 const a: @Vector(3, u8) = .{ 1, 2, 3 };
606 var b: [3:0]u8 = a;
607 };
608 try expect(S.b[0] == 1);
609 try expect(S.b[1] == 2);
610 try expect(S.b[2] == 3);
611 try expect(S.b[3] == 0);
612}
613
599test "array init of container level array variable" {614test "array init of container level array variable" {
600 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;615 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
601 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO616 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO