diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-09-04 19:33:06 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-09-20 18:33:00 -0700 |
| commit | 4fef90fa92094a47b2258333a522bf12bb736afe (patch) | |
| tree | 1b5d308393ac41404b56232c8a1122e666c07717 /src/Sema.zig | |
| parent | 9afa6835df021441d82b8d450d39a83808c5096a (diff) | |
| download | zig-4fef90fa92094a47b2258333a522bf12bb736afe.tar.gz zig-4fef90fa92094a47b2258333a522bf12bb736afe.zip | |
Sema: more conservative elem_ptr_load implementation
like field_ptr_load, this now does byval operations when the lhs is
comptime-known.
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index b6252551ae..5f2a6a0079 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -10112,6 +10112,13 @@ fn zirElemPtrLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data; const array_ptr = try sema.resolveInst(extra.lhs); const uncoerced_elem_index = try sema.resolveInst(extra.rhs); + if (try sema.resolveDefinedValue(block, src, array_ptr)) |array_ptr_val| { + const array_ptr_ty = sema.typeOf(array_ptr); + if (try sema.pointerDeref(block, src, array_ptr_val, array_ptr_ty)) |array_val| { + const array: Air.Inst.Ref = .fromValue(array_val); + return elemVal(sema, block, src, array, uncoerced_elem_index, elem_index_src, true); + } + } const elem_index = try sema.coerce(block, .usize, uncoerced_elem_index, elem_index_src); const elem_ptr = try elemPtr(sema, block, src, array_ptr, elem_index, elem_index_src, false, true); return analyzeLoad(sema, block, src, elem_ptr, elem_index_src); |
