diff --git a/src/Sema.zig b/src/Sema.zig index a83f9ec67af8088d413abdce43e246b2ccb0deff..bb009852de44273bfa5ca94605bcacfb1dfd5a8f 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -30628,11 +30628,18 @@ fn coerceArrayLike( return block.addTyOp(.array_to_vector, dest_ty, inst); } - const element_vals = try sema.arena.alloc(InternPool.Index, dest_len); - const element_refs = try sema.arena.alloc(Air.Inst.Ref, dest_len); + const dest_len_including_sent = try sema.usizeCast(block, dest_ty_src, dest_ty.arrayLenIncludingSentinel(zcu)); + const element_vals = try sema.arena.alloc(InternPool.Index, dest_len_including_sent); + const element_refs = try sema.arena.alloc(Air.Inst.Ref, dest_len_including_sent); var runtime_src: ?LazySrcLoc = null; for (element_vals, element_refs, 0..) |*val, *ref, i| { + if (i == dest_len) { + const sentinel_val = dest_ty.sentinel(zcu).?; + val.* = sentinel_val.toIntern(); + ref.* = Air.internedToRef(sentinel_val.toIntern()); + break; + } const index_ref = Air.internedToRef((try pt.intValue(.usize, i)).toIntern()); const src = inst_src; // TODO better source location const elem_src = inst_src; // TODO better source location diff --git a/test/behavior/array.zig b/test/behavior/array.zig index 574d0f2a007134d1bccc5bce2a300da0abd43fc7..97c595d474b3e06978e372dc47dca9c78d4eb31c 100644 --- a/test/behavior/array.zig +++ b/test/behavior/array.zig @@ -596,6 +596,21 @@ test "tuple to array handles sentinel" { try expect(S.b[3] == 0); } +test "array-like to array handles sentinel" { + if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + const a: @Vector(3, u8) = .{ 1, 2, 3 }; + var b: [3:0]u8 = a; + }; + try expect(S.b[0] == 1); + try expect(S.b[1] == 2); + try expect(S.b[2] == 3); + try expect(S.b[3] == 0); +} + test "array init of container level array variable" { if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO