From 41f3799bf0cfc8241f458094781ba45967e2576e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 14 Jan 2022 23:05:33 -0700 Subject: Sema: fix array_init with runtime element Previously it emitted an invalid AIR encoding. --- src/Sema.zig | 23 ++++++++++++++++++++--- src/type.zig | 1 + 2 files changed, 21 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/Sema.zig b/src/Sema.zig index 7504352576..563b1d5096 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -366,11 +366,21 @@ pub const Block = struct { array_ptr: Air.Inst.Ref, elem_index: Air.Inst.Ref, elem_ptr_ty: Type, + ) !Air.Inst.Ref { + const ty_ref = try block.sema.addType(elem_ptr_ty); + return block.addPtrElemPtrTypeRef(array_ptr, elem_index, ty_ref); + } + + pub fn addPtrElemPtrTypeRef( + block: *Block, + array_ptr: Air.Inst.Ref, + elem_index: Air.Inst.Ref, + elem_ptr_ty: Air.Inst.Ref, ) !Air.Inst.Ref { return block.addInst(.{ .tag = .ptr_elem_ptr, .data = .{ .ty_pl = .{ - .ty = try block.sema.addType(elem_ptr_ty), + .ty = elem_ptr_ty, .payload = try block.sema.addExtra(Air.Bin{ .lhs = array_ptr, .rhs = elem_index, @@ -10538,9 +10548,16 @@ fn zirArrayInit( }); const alloc = try block.addTy(.alloc, alloc_ty); + const elem_ptr_ty = try Type.ptr(sema.arena, .{ + .mutable = true, + .@"addrspace" = target_util.defaultAddressSpace(sema.mod.getTarget(), .local), + .pointee_type = elem_ty, + }); + const elem_ptr_ty_ref = try sema.addType(elem_ptr_ty); + for (resolved_args) |arg, i| { - const index = try sema.addIntUnsigned(Type.initTag(.u64), i); - const elem_ptr = try block.addBinOp(.ptr_elem_ptr, alloc, index); + const index = try sema.addIntUnsigned(Type.u64, i); + const elem_ptr = try block.addPtrElemPtrTypeRef(alloc, index, elem_ptr_ty_ref); _ = try block.addBinOp(.store, elem_ptr, arg); } if (is_ref) { diff --git a/src/type.zig b/src/type.zig index b759a4bc34..e14c81f707 100644 --- a/src/type.zig +++ b/src/type.zig @@ -4511,6 +4511,7 @@ pub const Type = extern union { pub const @"u8" = initTag(.u8); pub const @"u32" = initTag(.u32); + pub const @"u64" = initTag(.u64); pub const @"bool" = initTag(.bool); pub const @"usize" = initTag(.usize); pub const @"isize" = initTag(.isize); -- cgit v1.2.3