diff options
| author | Veikka Tuominen <git@vexu.eu> | 2024-01-02 17:37:21 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-02 17:37:21 +0200 |
| commit | d9d840a33ac8abb0e616de862f592821a7f4a35e (patch) | |
| tree | dd17b4f37cf2b08816af8a99159e5630c6268b35 /src | |
| parent | a04d4330945565b8d6f298ace993f6954c42d0f3 (diff) | |
| parent | 41d5aa1b365516c5f1bad63bfa3bdd7ad0ba6842 (diff) | |
| download | zig-d9d840a33ac8abb0e616de862f592821a7f4a35e.tar.gz zig-d9d840a33ac8abb0e616de862f592821a7f4a35e.zip | |
Merge pull request #18410 from dweiller/by-length-slice-bug
sema: add compile error for OOB by-length slice of array
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 2f1dc07328..e9af6d1740 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -32160,6 +32160,30 @@ fn analyzeSlice( if (!end_is_len) { const end = if (by_length) end: { const len = try sema.coerce(block, Type.usize, uncasted_end_opt, end_src); + if (try sema.resolveValue(len)) |slice_len_val| { + const len_s_val = try mod.intValue( + Type.usize, + array_ty.arrayLenIncludingSentinel(mod), + ); + if (!(try sema.compareScalar(slice_len_val, .lte, len_s_val, Type.usize))) { + const sentinel_label: []const u8 = if (array_ty.sentinel(mod) != null) + " +1 (sentinel)" + else + ""; + + return sema.fail( + block, + end_src, + "length {} out of bounds for array of length {}{s}", + .{ + slice_len_val.fmtValue(Type.usize, mod), + len_val.fmtValue(Type.usize, mod), + sentinel_label, + }, + ); + } + } + // check len is less than array size if comptime known const uncasted_end = try sema.analyzeArithmetic(block, .add, start, len, src, start_src, end_src, false); break :end try sema.coerce(block, Type.usize, uncasted_end, end_src); } else try sema.coerce(block, Type.usize, uncasted_end_opt, end_src); |
