diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-04-23 11:13:31 +0300 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-05-16 17:42:51 -0700 |
| commit | ab4ec35b8bb3a19361afa315f77cce5f6054b109 (patch) | |
| tree | 9aa1100a74f3beba5b1ca35d4f9c3dc52e360a11 /src/AstGen.zig | |
| parent | e369752430a1b3a50e57e11b9f0682d026c62feb (diff) | |
| download | zig-ab4ec35b8bb3a19361afa315f77cce5f6054b109.tar.gz zig-ab4ec35b8bb3a19361afa315f77cce5f6054b109.zip | |
stage2: add runtime safety for unwrapping error
Diffstat (limited to 'src/AstGen.zig')
| -rw-r--r-- | src/AstGen.zig | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/AstGen.zig b/src/AstGen.zig index d4895aa2e4..3e502625db 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -856,6 +856,33 @@ fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: Ast.Node.Index) InnerEr catch_token + 2 else null; + + var rhs = node_datas[node].rhs; + while (true) switch (node_tags[rhs]) { + .grouped_expression => rhs = node_datas[rhs].lhs, + .unreachable_literal => { + if (payload_token != null and mem.eql(u8, tree.tokenSlice(payload_token.?), "_")) { + return astgen.failTok(payload_token.?, "discard of error capture; omit it instead", .{}); + } else if (payload_token != null) { + return astgen.failTok(payload_token.?, "unused capture", .{}); + } + const lhs = node_datas[node].lhs; + + const operand = try reachableExpr(gz, scope, switch (rl) { + .ref => .ref, + else => .none, + }, lhs, lhs); + const result = try gz.addUnNode(switch (rl) { + .ref => .err_union_payload_safe_ptr, + else => .err_union_payload_safe, + }, operand, node); + switch (rl) { + .none, .coerced_ty, .discard, .ref => return result, + else => return rvalue(gz, rl, result, lhs), + } + }, + else => break, + }; switch (rl) { .ref => return orelseCatchExpr( gz, |
