mirror of
https://github.com/ziglang/zig.git
synced 2024-11-27 07:32:44 +00:00
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.
This commit is contained in:
parent
2897641fb9
commit
89e8bb409a
@ -5294,9 +5294,11 @@ fn orelseCatchExpr(
|
|||||||
// up for this fact by calling rvalue on the else branch.
|
// 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 operand = try reachableExpr(&block_scope, &block_scope.base, operand_ri, lhs, rhs);
|
||||||
const cond = try block_scope.addUnNode(cond_op, operand, node);
|
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);
|
try block_scope.setBlockBody(block);
|
||||||
// block_scope unstacked now, can add new instructions to parent_gz
|
// block_scope unstacked now, can add new instructions to parent_gz
|
||||||
try parent_gz.instructions.append(astgen.gpa, block);
|
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);
|
try block_scope.setBlockBody(block);
|
||||||
// block_scope unstacked now, can add new instructions to parent_gz
|
// block_scope unstacked now, can add new instructions to parent_gz
|
||||||
try parent_gz.instructions.append(astgen.gpa, block);
|
try parent_gz.instructions.append(astgen.gpa, block);
|
||||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user