From 1c223819098e5621e2e5ad526879cd33852144e1 Mon Sep 17 00:00:00 2001 From: Cody Tapscott Date: Tue, 22 Mar 2022 23:07:46 -0700 Subject: [PATCH] stage2: Properly "flatten" elem_ptrs before deref Sema.pointerDeref() assumes that elem_ptrs have been "flattened" when they were created, so that you an elem_ptr will never be the array_ptr of another elem_ptr when they share the same type. Value.elemPtr does this already, but a couple of places in Sema were bypassing this logic. --- src/Sema.zig | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 03a8a8905423d6ffef689321dbaa4c9ee3691673..7b5296dd780490955a0302ec79ff6068f5fc2142 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -17045,17 +17045,9 @@ fn elemVal( const indexable_val = maybe_indexable_val orelse break :rs indexable_src; const index_val = maybe_index_val orelse break :rs elem_index_src; const index = @intCast(usize, index_val.toUnsignedInt(target)); - const elem_ty = indexable_ty.elemType2(); - - var payload: Value.Payload.ElemPtr = .{ .data = .{ - .array_ptr = indexable_val, - .elem_ty = elem_ty, - .index = index, - } }; - const elem_ptr_val = Value.initPayload(&payload.base); - + const elem_ptr_val = try indexable_val.elemPtr(indexable_ty, sema.arena, index, target); if (try sema.pointerDeref(block, indexable_src, elem_ptr_val, indexable_ty)) |elem_val| { - return sema.addConstant(elem_ty, elem_val); + return sema.addConstant(indexable_ty.elemType2(), elem_val); } break :rs indexable_src; }; @@ -17310,12 +17302,7 @@ fn elemValSlice( const sentinel_label: []const u8 = if (slice_sent) " +1 (sentinel)" else ""; return sema.fail(block, elem_index_src, "index {d} outside slice of length {d}{s}", .{ index, slice_len, sentinel_label }); } - var elem_ptr_pl: Value.Payload.ElemPtr = .{ .data = .{ - .array_ptr = slice_val.slicePtr(), - .elem_ty = elem_ty, - .index = index, - } }; - const elem_ptr_val = Value.initPayload(&elem_ptr_pl.base); + const elem_ptr_val = try slice_val.elemPtr(slice_ty, sema.arena, index, target); if (try sema.pointerDeref(block, slice_src, elem_ptr_val, slice_ty)) |elem_val| { return sema.addConstant(elem_ty, elem_val); } -- 2.54.0