aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorMitchell Hashimoto <mitchell.hashimoto@gmail.com>2022-03-08 09:23:30 -0800
committerAndrew Kelley <andrew@ziglang.org>2022-03-08 14:10:43 -0500
commit55ccf4c7a8451edca47d8d6d82bddd9fe192744a (patch)
tree9fd1bb8ed2c124c3162ba6f400b3af834d9b0892 /src/Sema.zig
parent6ffa44554ef70dea9e4e58e0c8a4733be7c939b3 (diff)
downloadzig-55ccf4c7a8451edca47d8d6d82bddd9fe192744a.tar.gz
zig-55ccf4c7a8451edca47d8d6d82bddd9fe192744a.zip
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.
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig6
1 files changed, 2 insertions, 4 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 0a90101c8a..249e3be34d 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 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 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 elem_val = try array_val.elemValue(sema.arena, index);
return sema.addConstant(array_ty.elemType2(), elem_val);
};