diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-30 23:38:13 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-06-10 20:47:57 -0700 |
| commit | 99531b0d52392668fe9f86b5109fff74cd37aff3 (patch) | |
| tree | de874c13fbfd1ee086a70e3a2ad31496d88cd65e /src/Sema.zig | |
| parent | 1430ac2fbba9c8077b9b164b97010c1bac195ed7 (diff) | |
| download | zig-99531b0d52392668fe9f86b5109fff74cd37aff3.tar.gz zig-99531b0d52392668fe9f86b5109fff74cd37aff3.zip | |
Sema: make sentinel load through array pointer comptime known
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 2ee3404f66..23a54da5ca 100644 --- 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); }, |
