authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-06-03 16:10:18+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-06-03 20:21:20+03:00
log2b93546b39a85e9316c2bf12f336c357577114fa
tree9a7d6337843e025f460cc5572e92839730bee39d
parent4e1aa5d54377aa2b8d1395d666efb6eb935b7917

Sema: fix initialization of array with comptime only elem type


2 files changed, 20 insertions(+), 9 deletions(-)

src/Sema.zig+11-9
......@@ -3598,7 +3598,7 @@ fn zirValidateArrayInit(
35983598 // any ZIR instructions at comptime; we need to do that here.
35993599 if (array_ty.sentinel()) |sentinel_val| {
36003600 const array_len_ref = try sema.addIntUnsigned(Type.usize, array_len);
3601 const sentinel_ptr = try sema.elemPtrArray(block, init_src, array_ptr, init_src, array_len_ref);
3601 const sentinel_ptr = try sema.elemPtrArray(block, init_src, array_ptr, init_src, array_len_ref, true);
36023602 const sentinel = try sema.addConstant(array_ty.childType(), sentinel_val);
36033603 try sema.storePtr2(block, init_src, sentinel_ptr, init_src, sentinel, init_src, .store);
36043604 }
......@@ -7540,7 +7540,7 @@ fn zirElemPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
75407540 const bin_inst = sema.code.instructions.items(.data)[inst].bin;
75417541 const array_ptr = try sema.resolveInst(bin_inst.lhs);
75427542 const elem_index = try sema.resolveInst(bin_inst.rhs);
7543 return sema.elemPtr(block, sema.src, array_ptr, elem_index, sema.src);
7543 return sema.elemPtr(block, sema.src, array_ptr, elem_index, sema.src, false);
75447544}
75457545
75467546fn zirElemPtrNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -7553,7 +7553,7 @@ fn zirElemPtrNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
75537553 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
75547554 const array_ptr = try sema.resolveInst(extra.lhs);
75557555 const elem_index = try sema.resolveInst(extra.rhs);
7556 return sema.elemPtr(block, src, array_ptr, elem_index, elem_index_src);
7556 return sema.elemPtr(block, src, array_ptr, elem_index, elem_index_src, false);
75577557}
75587558
75597559fn zirElemPtrImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -7565,7 +7565,7 @@ fn zirElemPtrImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!
75657565 const extra = sema.code.extraData(Zir.Inst.ElemPtrImm, inst_data.payload_index).data;
75667566 const array_ptr = try sema.resolveInst(extra.ptr);
75677567 const elem_index = try sema.addIntUnsigned(Type.usize, extra.index);
7568 return sema.elemPtr(block, src, array_ptr, elem_index, src);
7568 return sema.elemPtr(block, src, array_ptr, elem_index, src, true);
75697569}
75707570
75717571fn zirSliceStart(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -18724,6 +18724,7 @@ fn elemPtr(
1872418724 indexable_ptr: Air.Inst.Ref,
1872518725 elem_index: Air.Inst.Ref,
1872618726 elem_index_src: LazySrcLoc,
18727 init: bool,
1872718728) CompileError!Air.Inst.Ref {
1872818729 const indexable_ptr_src = src; // TODO better source location
1872918730 const indexable_ptr_ty = sema.typeOf(indexable_ptr);
......@@ -18760,11 +18761,11 @@ fn elemPtr(
1876018761 },
1876118762 .One => {
1876218763 assert(indexable_ty.childType().zigTypeTag() == .Array); // Guaranteed by isIndexable
18763 return sema.elemPtrArray(block, indexable_ptr_src, indexable, elem_index_src, elem_index);
18764 return sema.elemPtrArray(block, indexable_ptr_src, indexable, elem_index_src, elem_index, init);
1876418765 },
1876518766 }
1876618767 },
18767 .Array, .Vector => return sema.elemPtrArray(block, indexable_ptr_src, indexable_ptr, elem_index_src, elem_index),
18768 .Array, .Vector => return sema.elemPtrArray(block, indexable_ptr_src, indexable_ptr, elem_index_src, elem_index, init),
1876818769 .Struct => {
1876918770 // Tuple field access.
1877018771 const index_val = try sema.resolveConstValue(block, elem_index_src, elem_index);
......@@ -18818,7 +18819,7 @@ fn elemVal(
1881818819 },
1881918820 .One => {
1882018821 assert(indexable_ty.childType().zigTypeTag() == .Array); // Guaranteed by isIndexable
18821 const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src);
18822 const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false);
1882218823 return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src);
1882318824 },
1882418825 },
......@@ -18999,6 +19000,7 @@ fn elemPtrArray(
1899919000 array_ptr: Air.Inst.Ref,
1900019001 elem_index_src: LazySrcLoc,
1900119002 elem_index: Air.Inst.Ref,
19003 init: bool,
1900219004) CompileError!Air.Inst.Ref {
1900319005 const target = sema.mod.getTarget();
1900419006 const array_ptr_ty = sema.typeOf(array_ptr);
......@@ -19035,7 +19037,7 @@ fn elemPtrArray(
1903519037 }
1903619038
1903719039 const valid_rt = try sema.validateRunTimeType(block, elem_index_src, array_ty.elemType2(), false);
19038 if (!valid_rt) {
19040 if (!valid_rt and !init) {
1903919041 const msg = msg: {
1904019042 const msg = try sema.errMsg(
1904119043 block,
......@@ -20138,7 +20140,7 @@ fn storePtr2(
2013820140 const elem_src = operand_src; // TODO better source location
2013920141 const elem = try tupleField(sema, block, operand_src, uncasted_operand, elem_src, i);
2014020142 const elem_index = try sema.addIntUnsigned(Type.usize, i);
20141 const elem_ptr = try sema.elemPtr(block, ptr_src, ptr, elem_index, elem_src);
20143 const elem_ptr = try sema.elemPtr(block, ptr_src, ptr, elem_index, elem_src, false);
2014220144 try sema.storePtr2(block, src, elem_ptr, elem_src, elem, elem_src, .store);
2014320145 }
2014420146 return;
test/behavior/array.zig+9
......@@ -573,3 +573,12 @@ test "type coercion of pointer to anon struct literal to pointer to array" {
573573 try S.doTheTest();
574574 comptime try S.doTheTest();
575575}
576
577test "array with comptime only element type" {
578 const a = [_]type{
579 u32,
580 i32,
581 };
582 try testing.expect(a[0] == u32);
583 try testing.expect(a[1] == i32);
584}