authorgravatar for topolarity@tapscott.meCody Tapscott <topolarity@tapscott.me> 2022-03-22 23:07:46-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-23 13:44:31-07:00
log1c223819098e5621e2e5ad526879cd33852144e1
tree1e472eb0497e45fcc3c888815cf26a0ec71f33d3
parentb872539a13ac46abe57a59bafdf5392812468482

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.

1 files changed, 3 insertions(+), 16 deletions(-)

src/Sema.zig+3-16
......@@ -17045,17 +17045,9 @@ fn elemVal(
1704517045 const indexable_val = maybe_indexable_val orelse break :rs indexable_src;
1704617046 const index_val = maybe_index_val orelse break :rs elem_index_src;
1704717047 const index = @intCast(usize, index_val.toUnsignedInt(target));
17048 const elem_ty = indexable_ty.elemType2();
17049
17050 var payload: Value.Payload.ElemPtr = .{ .data = .{
17051 .array_ptr = indexable_val,
17052 .elem_ty = elem_ty,
17053 .index = index,
17054 } };
17055 const elem_ptr_val = Value.initPayload(&payload.base);
17056
17048 const elem_ptr_val = try indexable_val.elemPtr(indexable_ty, sema.arena, index, target);
1705717049 if (try sema.pointerDeref(block, indexable_src, elem_ptr_val, indexable_ty)) |elem_val| {
17058 return sema.addConstant(elem_ty, elem_val);
17050 return sema.addConstant(indexable_ty.elemType2(), elem_val);
1705917051 }
1706017052 break :rs indexable_src;
1706117053 };
......@@ -17310,12 +17302,7 @@ fn elemValSlice(
1731017302 const sentinel_label: []const u8 = if (slice_sent) " +1 (sentinel)" else "";
1731117303 return sema.fail(block, elem_index_src, "index {d} outside slice of length {d}{s}", .{ index, slice_len, sentinel_label });
1731217304 }
17313 var elem_ptr_pl: Value.Payload.ElemPtr = .{ .data = .{
17314 .array_ptr = slice_val.slicePtr(),
17315 .elem_ty = elem_ty,
17316 .index = index,
17317 } };
17318 const elem_ptr_val = Value.initPayload(&elem_ptr_pl.base);
17305 const elem_ptr_val = try slice_val.elemPtr(slice_ty, sema.arena, index, target);
1731917306 if (try sema.pointerDeref(block, slice_src, elem_ptr_val, slice_ty)) |elem_val| {
1732017307 return sema.addConstant(elem_ty, elem_val);
1732117308 }