diff --git a/doc/langref.html.in b/doc/langref.html.in index 870726fada07..c115ff578c74 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -6804,6 +6804,32 @@ test "peer type resolution: *const T and ?*T" { try expect(a == b); try expect(b == a); } + +test "peer type resolution: error union switch" { + // The non-error and error cases are only peers if the error case is only a switch expression; + // the pattern `if (x) {...} else |err| blk: { switch (err) {...} }` does not consider the + // non-error and error case to be peers. + var a: error{ A, B, C }!u32 = 0; + _ = &a; + const b = if (a) |x| + x + 3 + else |err| switch (err) { + error.A => 0, + error.B => 1, + error.C => null, + }; + try expect(@TypeOf(b) == ?u32); + + // The non-error and error cases are only peers if the error case is only a switch expression; + // the pattern `x catch |err| blk: { switch (err) {...} }` does not consider the unwrapped `x` + // and error case to be peers. + const c = a catch |err| switch (err) { + error.A => 0, + error.B => 1, + error.C => null, + }; + try expect(@TypeOf(c) == ?u32); +} {#code_end#} {#header_close#} {#header_close#}