From 8695bc7ed3583bb6b896079dd0b7bfd678e82722 Mon Sep 17 00:00:00 2001 From: dweiller <4678790+dweiller@users.noreply.github.com> Date: Fri, 8 Dec 2023 20:16:11 +1100 Subject: [PATCH] langref: mention error union switch peer resolution --- doc/langref.html.in | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/doc/langref.html.in b/doc/langref.html.in index 865f4ecf87..311d373a87 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -6801,6 +6801,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 just 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 just 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#}