From 03b1fbe50d302cdb961661c10bb51699b4dcbaf2 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 22 Jul 2022 21:07:55 +0300 Subject: [PATCH] stage2: fix airIsErr when `is_ptr == true` --- src/codegen/c.zig | 5 +++-- src/codegen/llvm.zig | 3 ++- test/behavior/error.zig | 12 ++++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 15eb917fda..1e629d7cb0 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -3618,8 +3618,9 @@ fn airIsErr( const operand = try f.resolveInst(un_op); const operand_ty = f.air.typeOf(un_op); const local = try f.allocLocal(Type.initTag(.bool), .Const); - const payload_ty = operand_ty.errorUnionPayload(); - const error_ty = operand_ty.errorUnionSet(); + const err_union_ty = if (is_ptr) operand_ty.childType() else operand_ty; + const payload_ty = err_union_ty.errorUnionPayload(); + const error_ty = err_union_ty.errorUnionSet(); try writer.writeAll(" = "); diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 9dc20755eb..af610c8601 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -5693,7 +5693,8 @@ pub const FuncGen = struct { const un_op = self.air.instructions.items(.data)[inst].un_op; const operand = try self.resolveInst(un_op); - const err_union_ty = self.air.typeOf(un_op); + const operand_ty = self.air.typeOf(un_op); + const err_union_ty = if (operand_is_ptr) operand_ty.childType() else operand_ty; const payload_ty = err_union_ty.errorUnionPayload(); const err_set_ty = try self.dg.lowerType(Type.initTag(.anyerror)); const zero = err_set_ty.constNull(); diff --git a/test/behavior/error.zig b/test/behavior/error.zig index 0e3767a4ca..306dad5d9e 100644 --- a/test/behavior/error.zig +++ b/test/behavior/error.zig @@ -724,3 +724,15 @@ test "simple else prong allowed even when all errors handled" { }; try expect(value == 255); } + +test { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + + var err_union: anyerror!u8 = 15; + + const payload_ptr = &(err_union catch unreachable); + try expect(payload_ptr.* == 15); +}