aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-09-12 16:11:18 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-09-12 16:11:18 -0700
commit011663eea590dddff79b73c72bfeda5dd7f947cc (patch)
treec51299eb6d22d3762674540de062d7e4723c9a92 /src/Sema.zig
parent01e89fec71c781113f4be6f65af8e1702c8dde7c (diff)
parente323cf1264f390911dcc2efea71d46be1d631d92 (diff)
downloadzig-011663eea590dddff79b73c72bfeda5dd7f947cc.tar.gz
zig-011663eea590dddff79b73c72bfeda5dd7f947cc.zip
Merge remote-tracking branch 'origin/master' into llvm15
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 15e891ef87..f5e4402ea8 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -1461,6 +1461,29 @@ fn analyzeBodyInner(
// break break_data.inst;
// }
//},
+ .@"defer" => blk: {
+ const inst_data = sema.code.instructions.items(.data)[inst].@"defer";
+ const defer_body = sema.code.extra[inst_data.index..][0..inst_data.len];
+ const break_inst = sema.analyzeBodyInner(block, defer_body) catch |err| switch (err) {
+ error.ComptimeBreak => sema.comptime_break_inst,
+ else => |e| return e,
+ };
+ if (break_inst != defer_body[defer_body.len - 1]) break always_noreturn;
+ break :blk Air.Inst.Ref.void_value;
+ },
+ .defer_err_code => blk: {
+ const inst_data = sema.code.instructions.items(.data)[inst].defer_err_code;
+ const extra = sema.code.extraData(Zir.Inst.DeferErrCode, inst_data.payload_index).data;
+ const defer_body = sema.code.extra[extra.index..][0..extra.len];
+ const err_code = try sema.resolveInst(inst_data.err_code);
+ try sema.inst_map.put(sema.gpa, extra.remapped_err_code, err_code);
+ const break_inst = sema.analyzeBodyInner(block, defer_body) catch |err| switch (err) {
+ error.ComptimeBreak => sema.comptime_break_inst,
+ else => |e| return e,
+ };
+ if (break_inst != defer_body[defer_body.len - 1]) break always_noreturn;
+ break :blk Air.Inst.Ref.void_value;
+ },
};
if (sema.typeOf(air_inst).isNoReturn())
break always_noreturn;
@@ -9394,11 +9417,6 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
}
if (special_prong == .@"else" and seen_errors.count() == operand_ty.errorSetNames().len) {
-
- // TODO re-enable if defer implementation is improved
- // https://github.com/ziglang/zig/issues/11798
- if (true) break :else_validation;
-
// In order to enable common patterns for generic code allow simple else bodies
// else => unreachable,
// else => return,
@@ -9415,6 +9433,12 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
.as_node,
.ret_node,
.@"unreachable",
+ .@"defer",
+ .defer_err_code,
+ .err_union_code,
+ .ret_err_value_code,
+ .is_non_err,
+ .condbr,
=> {},
else => break,
} else break :else_validation;