authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-27 19:00:47+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-30 15:14:33+02:00
log1a1a5702abd61bb670b26bfa4a02d0ff7a6cc84b
tree343a8272eb4946ae5501e56b45e0337f650fd561
parent4def9c4a9b384a5980086825bcb849a88438912b

cbe: correctly handle pointers to zero bit error union payloads


2 files changed, 12 insertions(+), 2 deletions(-)

src/codegen/c.zig+12-1
...@@ -4580,7 +4580,18 @@ fn airUnwrapErrUnionPay(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !CValu...@@ -4580,7 +4580,18 @@ fn airUnwrapErrUnionPay(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !CValu
4580 const operand_is_ptr = operand_ty.zigTypeTag() == .Pointer;4580 const operand_is_ptr = operand_ty.zigTypeTag() == .Pointer;
4581 const error_union_ty = if (operand_is_ptr) operand_ty.childType() else operand_ty;4581 const error_union_ty = if (operand_is_ptr) operand_ty.childType() else operand_ty;
45824582
4583 if (!error_union_ty.errorUnionPayload().hasRuntimeBits()) return CValue.none;4583 if (!error_union_ty.errorUnionPayload().hasRuntimeBits()) {
4584 if (!is_ptr) return CValue.none;
4585
4586 const local = try f.allocLocal(inst_ty, .Const);
4587 const w = f.object.writer();
4588 try w.writeAll(" = (");
4589 try f.renderTypecast(w, inst_ty);
4590 try w.writeByte(')');
4591 try f.writeCValue(w, operand, .Initializer);
4592 try w.writeAll(";\n");
4593 return local;
4594 }
45844595
4585 const writer = f.object.writer();4596 const writer = f.object.writer();
4586 const local = try f.allocLocal(inst_ty, .Const);4597 const local = try f.allocLocal(inst_ty, .Const);
test/behavior/optional.zig-1
...@@ -342,7 +342,6 @@ test "optional pointer to zero bit optional payload" {...@@ -342,7 +342,6 @@ test "optional pointer to zero bit optional payload" {
342}342}
343343
344test "optional pointer to zero bit error union payload" {344test "optional pointer to zero bit error union payload" {
345 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
346 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO345 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
347 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO346 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
348 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO347 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO