aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2024-01-02 17:37:21 +0200
committerGitHub <noreply@github.com>2024-01-02 17:37:21 +0200
commitd9d840a33ac8abb0e616de862f592821a7f4a35e (patch)
treedd17b4f37cf2b08816af8a99159e5630c6268b35 /src
parenta04d4330945565b8d6f298ace993f6954c42d0f3 (diff)
parent41d5aa1b365516c5f1bad63bfa3bdd7ad0ba6842 (diff)
downloadzig-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.zig24
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);