commit 99531b0d52392668fe9f86b5109fff74cd37aff3 (tree)
parent 1430ac2fbba9c8077b9b164b97010c1bac195ed7
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date: Tue, 30 May 2023 23:38:13 -0400
Sema: make sentinel load through array pointer comptime known
Diffstat:
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/Sema.zig b/src/Sema.zig
@@ -25520,7 +25520,19 @@ fn elemVal(
return block.addBinOp(.ptr_elem_val, indexable, elem_index);
},
.One => {
- assert(indexable_ty.childType(mod).zigTypeTag(mod) == .Array); // Guaranteed by checkIndexable
+ const array_ty = indexable_ty.childType(mod); // Guaranteed by checkIndexable
+ assert(array_ty.zigTypeTag(mod) == .Array);
+
+ if (array_ty.sentinel(mod)) |sentinel| {
+ // index must be defined since it can access out of bounds
+ if (try sema.resolveDefinedValue(block, elem_index_src, elem_index)) |index_val| {
+ const index = @intCast(usize, index_val.toUnsignedInt(mod));
+ if (index == array_ty.arrayLen(mod)) {
+ return sema.addConstant(array_ty.childType(mod), sentinel);
+ }
+ }
+ }
+
const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false, oob_safety);
return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src);
},