diff options
| author | David Rubin <87927264+Rexicon226@users.noreply.github.com> | 2024-05-22 08:51:16 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-22 10:51:16 -0500 |
| commit | a7de02e05216db9a04e438703ddf1b6b12f3fbef (patch) | |
| tree | bf70046bbcf24c00bf201c0638f2f90543a62df5 /src/Sema.zig | |
| parent | ed75f62568f64c0d3859aab35aaf5289c3f07026 (diff) | |
| download | zig-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.zig | 29 |
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; |
