authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-30 23:38:13-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-10 20:47:57-07:00
log99531b0d52392668fe9f86b5109fff74cd37aff3
treede874c13fbfd1ee086a70e3a2ad31496d88cd65e
parent1430ac2fbba9c8077b9b164b97010c1bac195ed7

Sema: make sentinel load through array pointer comptime known


1 files changed, 13 insertions(+), 1 deletions(-)

src/Sema.zig+13-1
...@@ -25520,7 +25520,19 @@ fn elemVal(...@@ -25520,7 +25520,19 @@ fn elemVal(
25520 return block.addBinOp(.ptr_elem_val, indexable, elem_index);25520 return block.addBinOp(.ptr_elem_val, indexable, elem_index);
25521 },25521 },
25522 .One => {25522 .One => {
25523 assert(indexable_ty.childType(mod).zigTypeTag(mod) == .Array); // Guaranteed by checkIndexable25523 const array_ty = indexable_ty.childType(mod); // Guaranteed by checkIndexable
25524 assert(array_ty.zigTypeTag(mod) == .Array);
25525
25526 if (array_ty.sentinel(mod)) |sentinel| {
25527 // index must be defined since it can access out of bounds
25528 if (try sema.resolveDefinedValue(block, elem_index_src, elem_index)) |index_val| {
25529 const index = @intCast(usize, index_val.toUnsignedInt(mod));
25530 if (index == array_ty.arrayLen(mod)) {
25531 return sema.addConstant(array_ty.childType(mod), sentinel);
25532 }
25533 }
25534 }
25535
25524 const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false, oob_safety);25536 const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false, oob_safety);
25525 return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src);25537 return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src);
25526 },25538 },