authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-02-02 14:39:13+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-02-11 14:36:54+02:00
log31ed8d293ddb79d34306e0b23e76d8a361c8856f
tree6058e6849762e925518b5b64cbf800643f248290
parentb9c2837c1c9eddc903aeeb168b8d2daa48837ddb

Sema: add missing peer type resolution for error unions

Closes #14077

2 files changed, 31 insertions(+), 0 deletions(-)

src/Sema.zig+19
......@@ -29761,6 +29761,25 @@ fn resolvePeerTypes(
2976129761 continue;
2976229762 }
2976329763 },
29764 .ErrorSet => {
29765 chosen = candidate;
29766 chosen_i = candidate_i + 1;
29767 if (err_set_ty) |chosen_set_ty| {
29768 if (.ok == try sema.coerceInMemoryAllowedErrorSets(block, chosen_set_ty, chosen_ty, src, src)) {
29769 continue;
29770 }
29771 if (.ok == try sema.coerceInMemoryAllowedErrorSets(block, chosen_ty, chosen_set_ty, src, src)) {
29772 err_set_ty = chosen_ty;
29773 continue;
29774 }
29775
29776 err_set_ty = try chosen_set_ty.errorSetMerge(sema.arena, chosen_ty);
29777 continue;
29778 } else {
29779 err_set_ty = chosen_ty;
29780 continue;
29781 }
29782 },
2976429783 else => {},
2976529784 }
2976629785
test/behavior/cast.zig+12
......@@ -1541,3 +1541,15 @@ test "single item pointer to pointer to array to slice" {
15411541 const z1 = @as([]const i32, @as(*[1]i32, &x));
15421542 try expect(z1[0] == 1234);
15431543}
1544
1545test "peer type resolution forms error union" {
1546 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1547
1548 var foo: i32 = 123;
1549 const result = if (foo < 0) switch (-foo) {
1550 0 => unreachable,
1551 42 => error.AccessDenied,
1552 else => unreachable,
1553 } else @intCast(u32, foo);
1554 try expect(try result == 123);
1555}