aboutsummaryrefslogtreecommitdiff
path: root/src/AstGen.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-04-23 11:13:31 +0300
committerAndrew Kelley <andrew@ziglang.org>2022-05-16 17:42:51 -0700
commitab4ec35b8bb3a19361afa315f77cce5f6054b109 (patch)
tree9aa1100a74f3beba5b1ca35d4f9c3dc52e360a11 /src/AstGen.zig
parente369752430a1b3a50e57e11b9f0682d026c62feb (diff)
downloadzig-ab4ec35b8bb3a19361afa315f77cce5f6054b109.tar.gz
zig-ab4ec35b8bb3a19361afa315f77cce5f6054b109.zip
stage2: add runtime safety for unwrapping error
Diffstat (limited to 'src/AstGen.zig')
-rw-r--r--src/AstGen.zig27
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,