| author | |
| committer | |
| log | 3c0e8b34d76d7c081a5d8b1f2d060fe6735e8d12 |
| tree | daab42aee6e389a8c7e3d74b8dfeb85653f1eab9 |
| parent | 30b1ec85dd5d11a7dd767275ae3e65f17035d2f3 |
2 files changed, 24 insertions(+), 2 deletions(-)
src/Sema.zig+9-2| ... | ... | @@ -30628,11 +30628,18 @@ fn coerceArrayLike( |
| 30628 | 30628 | return block.addTyOp(.array_to_vector, dest_ty, inst); |
| 30629 | 30629 | } |
| 30630 | 30630 | |
| 30631 | const element_vals = try sema.arena.alloc(InternPool.Index, dest_len); | |
| 30632 | const element_refs = try sema.arena.alloc(Air.Inst.Ref, dest_len); | |
| 30631 | const dest_len_including_sent = try sema.usizeCast(block, dest_ty_src, dest_ty.arrayLenIncludingSentinel(zcu)); | |
| 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 | 30634 | var runtime_src: ?LazySrcLoc = null; |
| 30634 | 30635 | |
| 30635 | 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 | 30643 | const index_ref = Air.internedToRef((try pt.intValue(.usize, i)).toIntern()); |
| 30637 | 30644 | const src = inst_src; // TODO better source location |
| 30638 | 30645 | 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 | 596 | try expect(S.b[3] == 0); |
| 597 | 597 | } |
| 598 | 598 | |
| 599 | test "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 | ||
| 599 | 614 | test "array init of container level array variable" { |
| 600 | 615 | if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest; |
| 601 | 616 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |