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.
This commit is contained in:
committed by
Andrew Kelley
parent
b872539a13
commit
1c22381909
19
src/Sema.zig
19
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user