aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2025-04-02 06:37:41 +0100
committerMatthew Lugg <mlugg@mlugg.co.uk>2025-04-28 19:43:58 +0100
commitd038676a1f46ecab2bd095d3503ab05bcd8de58c (patch)
tree8525291c4a2fd35e61299ab2d0a19b8a110f6196 /src/Sema.zig
parent365ed0ed68b6f6c39b3b8f5373fbba25fe09a518 (diff)
downloadzig-d038676a1f46ecab2bd095d3503ab05bcd8de58c.tar.gz
zig-d038676a1f46ecab2bd095d3503ab05bcd8de58c.zip
Sema: fix a few indexing bugs
* Indexing zero-bit types should not produce AIR indexing instructions * Getting a runtime-known element pointer from a many-pointer should check that the many-pointer is not comptime-only Resolves: #23405
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 9e7427b4fa..06a4d5edf7 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -28473,6 +28473,14 @@ fn elemPtrOneLayerOnly(
try sema.checkLogicalPtrOperation(block, src, indexable_ty);
const result_ty = try indexable_ty.elemPtrType(null, pt);
+ try sema.validateRuntimeElemAccess(block, elem_index_src, result_ty, indexable_ty, indexable_src);
+ try sema.validateRuntimeValue(block, indexable_src, indexable);
+
+ if (!try result_ty.childType(zcu).hasRuntimeBitsIgnoreComptimeSema(pt)) {
+ // zero-bit child type; just bitcast the pointer
+ return block.addBitCast(result_ty, indexable);
+ }
+
return block.addPtrElemPtr(indexable, elem_index, result_ty);
},
.one => {
@@ -28945,6 +28953,11 @@ fn elemPtrSlice(
const cmp_op: Air.Inst.Tag = if (slice_sent) .cmp_lte else .cmp_lt;
try sema.addSafetyCheckIndexOob(block, src, elem_index, len_inst, cmp_op);
}
+ if (!try slice_ty.childType(zcu).hasRuntimeBitsIgnoreComptimeSema(pt)) {
+ // zero-bit child type; just extract the pointer and bitcast it
+ const slice_ptr = try block.addTyOp(.slice_ptr, slice_ty.slicePtrFieldType(zcu), slice);
+ return block.addBitCast(elem_ptr_ty, slice_ptr);
+ }
return block.addSliceElemPtr(slice, elem_index, elem_ptr_ty);
}