From 55ccf4c7a8451edca47d8d6d82bddd9fe192744a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 8 Mar 2022 09:23:30 -0800 Subject: [PATCH] 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. --- src/Sema.zig | 8 +++----- test/behavior/cast.zig | 6 +++++- test/behavior/pointers.zig | 12 ++++++++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 0a90101c8a67329387f50a7eae17d00c60357c44..249e3be34d9b28cfd0b270b767375ed14967025f 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -15629,15 +15629,13 @@ fn elemVal( return block.addBinOp(.slice_elem_val, array, elem_index); }, .Many, .C => { - const maybe_ptr_val = try sema.resolveDefinedValue(block, array_src, array); + const maybe_array_val = try sema.resolveDefinedValue(block, array_src, array); const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index); const runtime_src = rs: { - const ptr_val = maybe_ptr_val orelse break :rs array_src; - const index_val = maybe_index_val orelse break :rs elem_index_src; - const index = @intCast(usize, index_val.toUnsignedInt()); - const maybe_array_val = try sema.pointerDeref(block, array_src, ptr_val, array_ty); const array_val = maybe_array_val orelse break :rs array_src; + const index_val = maybe_index_val orelse break :rs elem_index_src; + const index = @intCast(usize, index_val.toUnsignedInt()); const elem_val = try array_val.elemValue(sema.arena, index); return sema.addConstant(array_ty.elemType2(), elem_val); }; diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index 78fe373d7fe4db73cc4c015a45aba7c1dee51022..e92e20f941bb3f93a462747b4707991e9d5e754b 100644 --- a/test/behavior/cast.zig +++ b/test/behavior/cast.zig @@ -521,7 +521,11 @@ fn testCastPtrOfArrayToSliceAndPtr() !void { } test "cast *[1][*]const u8 to [*]const ?[*]const u8" { - if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO const window_name = [1][*]const u8{"window name"}; const x: [*]const ?[*]const u8 = &window_name; diff --git a/test/behavior/pointers.zig b/test/behavior/pointers.zig index d2ec6d9bbc603d7f75fdf9438e9c8b05c2719e06..c3d4220742c49b2e14efaeea189ac8d137928321 100644 --- a/test/behavior/pointers.zig +++ b/test/behavior/pointers.zig @@ -279,7 +279,11 @@ test "array initialization types" { } test "null terminated pointer" { - if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO const S = struct { fn doTheTest() !void { @@ -295,7 +299,11 @@ test "null terminated pointer" { } test "allow any sentinel" { - if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO const S = struct { fn doTheTest() !void { -- 2.54.0