| ... | @@ -197,3 +197,40 @@ const defer_assign = switch (block: { | ... | @@ -197,3 +197,40 @@ const defer_assign = switch (block: { |
| 197 | comptime { | 197 | comptime { |
| 198 | if (defer_assign != 0) @compileError("defer_assign failed!"); | 198 | if (defer_assign != 0) @compileError("defer_assign failed!"); |
| 199 | } | 199 | } |
| | 200 | |
| | 201 | test "errdefer capture" { |
| | 202 | const S = struct { |
| | 203 | fail: bool = undefined, |
| | 204 | fn bar0(self: *@This()) error{a}!void { |
| | 205 | self.fail = false; |
| | 206 | errdefer |err| if (@TypeOf(err) != error{a}) { |
| | 207 | self.fail = true; |
| | 208 | }; |
| | 209 | return error.a; |
| | 210 | } |
| | 211 | fn bar1(self: *@This()) error{a}!void { |
| | 212 | self.fail = false; |
| | 213 | errdefer |err| if (@TypeOf(err) != error{a}) { |
| | 214 | self.fail = true; |
| | 215 | }; |
| | 216 | const rv: error{a}!void = @errorCast(@as(error{a}!void, error.a)); |
| | 217 | return rv; |
| | 218 | } |
| | 219 | // https://github.com/ziglang/zig/issues/20371 |
| | 220 | fn bar2(self: *@This()) error{a}!void { |
| | 221 | self.fail = false; |
| | 222 | errdefer |err| if (@TypeOf(err) != error{a}) { |
| | 223 | self.fail = true; |
| | 224 | }; |
| | 225 | return @errorCast(@as(error{a}!void, error.a)); |
| | 226 | } |
| | 227 | }; |
| | 228 | |
| | 229 | var s: S = .{}; |
| | 230 | s.bar0() catch {}; |
| | 231 | if (s.fail) return error.TestExpectedError; |
| | 232 | s.bar1() catch {}; |
| | 233 | if (s.fail) return error.TestExpectedError; |
| | 234 | s.bar2() catch {}; |
| | 235 | if (s.fail) return error.TestExpectedError; |
| | 236 | } |