aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorDavid Rubin <87927264+Rexicon226@users.noreply.github.com>2024-05-22 08:51:16 -0700
committerGitHub <noreply@github.com>2024-05-22 10:51:16 -0500
commita7de02e05216db9a04e438703ddf1b6b12f3fbef (patch)
treebf70046bbcf24c00bf201c0638f2f90543a62df5 /src/Sema.zig
parented75f62568f64c0d3859aab35aaf5289c3f07026 (diff)
downloadzig-a7de02e05216db9a04e438703ddf1b6b12f3fbef.tar.gz
zig-a7de02e05216db9a04e438703ddf1b6b12f3fbef.zip
implement `@expect` builtin (#19658)
* implement `@expect` * add docs * add a second arg for expected bool * fix typo * move `expect` to use BinOp * update to newer langref format
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index ca6d562eef..fcf82b1153 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -1258,6 +1258,7 @@ fn analyzeBodyInner(
.work_group_size => try sema.zirWorkItem( block, extended, extended.opcode),
.work_group_id => try sema.zirWorkItem( block, extended, extended.opcode),
.in_comptime => try sema.zirInComptime( block),
+ .expect => try sema.zirExpect( block, extended),
.closure_get => try sema.zirClosureGet( block, extended),
// zig fmt: on
@@ -17553,6 +17554,34 @@ fn zirThis(
return sema.analyzeDeclVal(block, src, this_decl_index);
}
+fn zirExpect(sema: *Sema, block: *Block, inst: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref {
+ const bin_op = sema.code.extraData(Zir.Inst.BinNode, inst.operand).data;
+ const operand = try sema.resolveInst(bin_op.lhs);
+ const expected = try sema.resolveInst(bin_op.rhs);
+
+ const expected_src = LazySrcLoc{ .node_offset_builtin_call_arg1 = bin_op.node };
+
+ if (!try sema.isComptimeKnown(expected)) {
+ return sema.fail(block, expected_src, "@expect 'expected' must be comptime-known", .{});
+ }
+
+ if (try sema.resolveValue(operand)) |op| {
+ return Air.internedToRef(op.toIntern());
+ }
+
+ if (sema.mod.backendSupportsFeature(.can_expect) and sema.mod.optimizeMode() != .Debug) {
+ return try block.addInst(.{
+ .tag = .expect,
+ .data = .{ .bin_op = .{
+ .lhs = operand,
+ .rhs = expected,
+ } },
+ });
+ } else {
+ return operand;
+ }
+}
+
fn zirClosureGet(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref {
const mod = sema.mod;
const ip = &mod.intern_pool;