aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-10-03 14:05:55 +0300
committerVeikka Tuominen <git@vexu.eu>2022-10-05 17:26:29 +0300
commit40578656e85a4bd930b03c143f179d43a925d151 (patch)
tree521053cc75e0b05a1baee26f640e1fc6e87c8aa7
parentc0350cf87eaae64ca81e17aef8872e8e55767437 (diff)
downloadzig-40578656e85a4bd930b03c143f179d43a925d151.tar.gz
zig-40578656e85a4bd930b03c143f179d43a925d151.zip
Zir: handle ranges in `getMultiProng`
Closes #12890
-rw-r--r--src/Zir.zig7
-rw-r--r--test/behavior.zig1
-rw-r--r--test/behavior/bugs/12890.zig18
3 files changed, 25 insertions, 1 deletions
diff --git a/src/Zir.zig b/src/Zir.zig
index add8bad801..40e1686a9b 100644
--- a/src/Zir.zig
+++ b/src/Zir.zig
@@ -3051,11 +3051,16 @@ pub const Inst = struct {
var multi_i: u32 = 0;
while (true) : (multi_i += 1) {
const items_len = zir.extra[extra_index];
- extra_index += 2;
+ extra_index += 1;
+ const ranges_len = zir.extra[extra_index];
+ extra_index += 1;
const body_len = @truncate(u31, zir.extra[extra_index]);
extra_index += 1;
const items = zir.refSlice(extra_index, items_len);
extra_index += items_len;
+ // Each range has a start and an end.
+ extra_index += 2 * ranges_len;
+
const body = zir.extra[extra_index..][0..body_len];
extra_index += body_len;
diff --git a/test/behavior.zig b/test/behavior.zig
index 8f4657e634..6c181d38bb 100644
--- a/test/behavior.zig
+++ b/test/behavior.zig
@@ -95,6 +95,7 @@ test {
_ = @import("behavior/bugs/12801-1.zig");
_ = @import("behavior/bugs/12801-2.zig");
_ = @import("behavior/bugs/12885.zig");
+ _ = @import("behavior/bugs/12890.zig");
_ = @import("behavior/bugs/12911.zig");
_ = @import("behavior/bugs/12928.zig");
_ = @import("behavior/bugs/12945.zig");
diff --git a/test/behavior/bugs/12890.zig b/test/behavior/bugs/12890.zig
new file mode 100644
index 0000000000..cae79136dc
--- /dev/null
+++ b/test/behavior/bugs/12890.zig
@@ -0,0 +1,18 @@
+const expect = @import("std").testing.expect;
+const builtin = @import("builtin");
+
+fn a(b: []u3, c: u3) void {
+ switch (c) {
+ 0...1 => b[c] = c,
+ 2...3 => b[c] = c,
+ 4...7 => |d| b[d] = c,
+ }
+}
+test {
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+
+ var arr: [8]u3 = undefined;
+ a(&arr, 5);
+ try expect(arr[5] == 5);
+}