aboutsummaryrefslogtreecommitdiff
path: root/test
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 /test
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 'test')
-rw-r--r--test/cases/compile_errors/slice_of_array_by-length_oversized.zig19
-rw-r--r--test/cases/safety/array slice by-length oversized.zig21
2 files changed, 40 insertions, 0 deletions
diff --git a/test/cases/compile_errors/slice_of_array_by-length_oversized.zig b/test/cases/compile_errors/slice_of_array_by-length_oversized.zig
new file mode 100644
index 0000000000..e482197d1a
--- /dev/null
+++ b/test/cases/compile_errors/slice_of_array_by-length_oversized.zig
@@ -0,0 +1,19 @@
+export fn entry1() void {
+ var buf: [5]u8 = undefined;
+ var a: u32 = 6;
+ _ = &a;
+ _ = buf[a..][0..10];
+}
+
+export fn entry2() void {
+ var buf: [5]u8 = undefined;
+ const a: u32 = 6;
+ _ = buf[a..][0..10];
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :5:21: error: length 10 out of bounds for array of length 5
+// :11:21: error: length 10 out of bounds for array of length 5
diff --git a/test/cases/safety/array slice by-length oversized.zig b/test/cases/safety/array slice by-length oversized.zig
new file mode 100644
index 0000000000..a8b33e428a
--- /dev/null
+++ b/test/cases/safety/array slice by-length oversized.zig
@@ -0,0 +1,21 @@
+const std = @import("std");
+
+pub fn panic(message: []const u8, stack_trace: ?*std.builtin.StackTrace, _: ?usize) noreturn {
+ _ = stack_trace;
+ if (std.mem.eql(u8, message, "index out of bounds: index 12, len 5")) {
+ std.process.exit(0);
+ }
+ std.process.exit(1);
+}
+
+pub fn main() !void {
+ var buf: [5]u8 = undefined;
+ var a: u32 = 6;
+ _ = &a;
+ _ = buf[a..][0..a];
+ return error.TestFailed;
+}
+
+// run
+// backend=llvm
+// target=native