Commit 89e8bb409a

Veikka Tuominen <git@vexu.eu>
2022-11-08 15:48:12
AstGen: use `condbr_inline` if force_comptime is set
The `finishThenElseBlock` would correctly use `break_inline` which would cause Sema to use `addRuntimeBreak` instead of doing the branch at comptime.
1 parent 2897641
Changed files (2)
src/AstGen.zig
@@ -5294,9 +5294,11 @@ fn orelseCatchExpr(
     // up for this fact by calling rvalue on the else branch.
     const operand = try reachableExpr(&block_scope, &block_scope.base, operand_ri, lhs, rhs);
     const cond = try block_scope.addUnNode(cond_op, operand, node);
-    const condbr = try block_scope.addCondBr(.condbr, node);
+    const condbr_tag: Zir.Inst.Tag = if (parent_gz.force_comptime) .condbr_inline else .condbr;
+    const condbr = try block_scope.addCondBr(condbr_tag, node);
 
-    const block = try parent_gz.makeBlockInst(.block, node);
+    const block_tag: Zir.Inst.Tag = if (parent_gz.force_comptime) .block_inline else .block;
+    const block = try parent_gz.makeBlockInst(block_tag, node);
     try block_scope.setBlockBody(block);
     // block_scope unstacked now, can add new instructions to parent_gz
     try parent_gz.instructions.append(astgen.gpa, block);
@@ -5608,9 +5610,11 @@ fn ifExpr(
         }
     };
 
-    const condbr = try block_scope.addCondBr(.condbr, node);
+    const condbr_tag: Zir.Inst.Tag = if (parent_gz.force_comptime) .condbr_inline else .condbr;
+    const condbr = try block_scope.addCondBr(condbr_tag, node);
 
-    const block = try parent_gz.makeBlockInst(.block, node);
+    const block_tag: Zir.Inst.Tag = if (parent_gz.force_comptime) .block_inline else .block;
+    const block = try parent_gz.makeBlockInst(block_tag, node);
     try block_scope.setBlockBody(block);
     // block_scope unstacked now, can add new instructions to parent_gz
     try parent_gz.instructions.append(astgen.gpa, block);
test/cases/compile_errors/branch_in_comptime_only_scope_uses_condbr_inline.zig
@@ -0,0 +1,22 @@
+pub export fn entry1() void {
+    var x: u32 = 3;
+    _ = @shuffle(u32, [_]u32{0}, @splat(1, @as(u32, 0)), [_]i8{
+        if (x > 1) 1 else -1,
+    });
+}
+
+pub export fn entry2() void {
+    var y: ?i8 = -1;
+    _ = @shuffle(u32, [_]u32{0}, @splat(1, @as(u32, 0)), [_]i8{
+        y orelse 1,
+    });
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :4:15: error: unable to resolve comptime value
+// :4:15: note: condition in comptime branch must be comptime-known
+// :11:11: error: unable to resolve comptime value
+// :11:11: note: condition in comptime branch must be comptime-known