mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
astgen: generate correct switch prong indices
Switch prong values are fetched by index in semantic analysis by prong offset, but these were computed as capture offset. This means that a switch where the first prong does not capture and the second does, the switch_capture zir instruction would be assigned switch_prong 0 instead of 1.
This commit is contained in:
parent
17e46a3b97
commit
25012ab3d1
@ -6070,6 +6070,13 @@ fn switchExpr(
|
|||||||
|
|
||||||
var capture_val_scope: Scope.LocalVal = undefined;
|
var capture_val_scope: Scope.LocalVal = undefined;
|
||||||
const sub_scope = blk: {
|
const sub_scope = blk: {
|
||||||
|
const capture_index = if (is_multi_case) ci: {
|
||||||
|
multi_case_index += 1;
|
||||||
|
break :ci multi_case_index - 1;
|
||||||
|
} else ci: {
|
||||||
|
scalar_case_index += 1;
|
||||||
|
break :ci scalar_case_index - 1;
|
||||||
|
};
|
||||||
const payload_token = case.payload_token orelse break :blk &case_scope.base;
|
const payload_token = case.payload_token orelse break :blk &case_scope.base;
|
||||||
const ident = if (token_tags[payload_token] == .asterisk)
|
const ident = if (token_tags[payload_token] == .asterisk)
|
||||||
payload_token + 1
|
payload_token + 1
|
||||||
@ -6103,13 +6110,6 @@ fn switchExpr(
|
|||||||
0b10 => .switch_capture_multi,
|
0b10 => .switch_capture_multi,
|
||||||
0b11 => .switch_capture_multi_ref,
|
0b11 => .switch_capture_multi_ref,
|
||||||
};
|
};
|
||||||
const capture_index = if (is_multi_case) ci: {
|
|
||||||
multi_case_index += 1;
|
|
||||||
break :ci multi_case_index - 1;
|
|
||||||
} else ci: {
|
|
||||||
scalar_case_index += 1;
|
|
||||||
break :ci scalar_case_index - 1;
|
|
||||||
};
|
|
||||||
break :capture try case_scope.add(.{
|
break :capture try case_scope.add(.{
|
||||||
.tag = capture_tag,
|
.tag = capture_tag,
|
||||||
.data = .{ .switch_capture = .{
|
.data = .{ .switch_capture = .{
|
||||||
|
|||||||
@ -299,3 +299,17 @@ fn testSwitchHandleAllCasesRange(x: u8) u8 {
|
|||||||
204...255 => 3,
|
204...255 => 3,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "switch on union with some prongs capturing" {
|
||||||
|
const X = union(enum) {
|
||||||
|
a,
|
||||||
|
b: i32,
|
||||||
|
};
|
||||||
|
|
||||||
|
var x: X = X{ .b = 10 };
|
||||||
|
var y: i32 = switch (x) {
|
||||||
|
.a => unreachable,
|
||||||
|
.b => |b| b + 1,
|
||||||
|
};
|
||||||
|
try expect(y == 11);
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user