Skip to content

Commit 55ccf4c

Browse files
mitchellhandrewrk
authored andcommitted
stage2: elem vals of many pointers need not deref pointers
By the time zirElemVal is reached for a many pointer, a load has already happened, making sure the operand is already dereferenced. This makes `mem.sliceTo` now work.
1 parent 6ffa445 commit 55ccf4c

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

src/Sema.zig

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15629,15 +15629,13 @@ fn elemVal(
1562915629
return block.addBinOp(.slice_elem_val, array, elem_index);
1563015630
},
1563115631
.Many, .C => {
15632-
const maybe_ptr_val = try sema.resolveDefinedValue(block, array_src, array);
15632+
const maybe_array_val = try sema.resolveDefinedValue(block, array_src, array);
1563315633
const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);
1563415634

1563515635
const runtime_src = rs: {
15636-
const ptr_val = maybe_ptr_val orelse break :rs array_src;
15636+
const array_val = maybe_array_val orelse break :rs array_src;
1563715637
const index_val = maybe_index_val orelse break :rs elem_index_src;
1563815638
const index = @intCast(usize, index_val.toUnsignedInt());
15639-
const maybe_array_val = try sema.pointerDeref(block, array_src, ptr_val, array_ty);
15640-
const array_val = maybe_array_val orelse break :rs array_src;
1564115639
const elem_val = try array_val.elemValue(sema.arena, index);
1564215640
return sema.addConstant(array_ty.elemType2(), elem_val);
1564315641
};

test/behavior/cast.zig

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,11 @@ fn testCastPtrOfArrayToSliceAndPtr() !void {
521521
}
522522

523523
test "cast *[1][*]const u8 to [*]const ?[*]const u8" {
524-
if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
524+
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
525+
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
526+
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
527+
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
528+
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
525529

526530
const window_name = [1][*]const u8{"window name"};
527531
const x: [*]const ?[*]const u8 = &window_name;

test/behavior/pointers.zig

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,11 @@ test "array initialization types" {
279279
}
280280

281281
test "null terminated pointer" {
282-
if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
282+
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
283+
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
284+
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
285+
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
286+
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
283287

284288
const S = struct {
285289
fn doTheTest() !void {
@@ -295,7 +299,11 @@ test "null terminated pointer" {
295299
}
296300

297301
test "allow any sentinel" {
298-
if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
302+
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
303+
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
304+
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
305+
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
306+
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
299307

300308
const S = struct {
301309
fn doTheTest() !void {

0 commit comments

Comments
 (0)