From 1a1a5702abd61bb670b26bfa4a02d0ff7a6cc84b Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 27 Nov 2022 19:00:47 +0200 Subject: [PATCH] cbe: correctly handle pointers to zero bit error union payloads --- src/codegen/c.zig | 13 ++++++++++++- test/behavior/optional.zig | 1 - 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 97b37309b2..6a7ef2c007 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -4580,7 +4580,18 @@ fn airUnwrapErrUnionPay(f: *Function, inst: Air.Inst.Index, is_ptr: bool) !CValu const operand_is_ptr = operand_ty.zigTypeTag() == .Pointer; const error_union_ty = if (operand_is_ptr) operand_ty.childType() else operand_ty; - if (!error_union_ty.errorUnionPayload().hasRuntimeBits()) return CValue.none; + if (!error_union_ty.errorUnionPayload().hasRuntimeBits()) { + if (!is_ptr) return CValue.none; + + const local = try f.allocLocal(inst_ty, .Const); + const w = f.object.writer(); + try w.writeAll(" = ("); + try f.renderTypecast(w, inst_ty); + try w.writeByte(')'); + try f.writeCValue(w, operand, .Initializer); + try w.writeAll(";\n"); + return local; + } const writer = f.object.writer(); const local = try f.allocLocal(inst_ty, .Const); diff --git a/test/behavior/optional.zig b/test/behavior/optional.zig index 5bc79ed31c..9058f4e136 100644 --- a/test/behavior/optional.zig +++ b/test/behavior/optional.zig @@ -342,7 +342,6 @@ test "optional pointer to zero bit optional payload" { } test "optional pointer to zero bit error union payload" { - if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO