From c710d5eefe3f83226f1651947239730e77af43cb Mon Sep 17 00:00:00 2001 From: joachimschmidt557 Date: Sun, 2 Jan 2022 17:03:21 +0100 Subject: [PATCH] stage2 ARM: implement wrap_errunion_err for empty payloads --- src/arch/arm/CodeGen.zig | 9 ++++++++- test/behavior.zig | 18 +++++++++--------- test/stage2/arm.zig | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/arch/arm/CodeGen.zig b/src/arch/arm/CodeGen.zig index e90c0ad5e4..b24ec3fa9b 100644 --- a/src/arch/arm/CodeGen.zig +++ b/src/arch/arm/CodeGen.zig @@ -1160,7 +1160,14 @@ fn airWrapErrUnionPayload(self: *Self, inst: Air.Inst.Index) !void { /// E to E!T fn airWrapErrUnionErr(self: *Self, inst: Air.Inst.Index) !void { const ty_op = self.air.instructions.items(.data)[inst].ty_op; - const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement wrap errunion error for {}", .{self.target.cpu.arch}); + const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: { + const error_union_ty = self.air.getRefType(ty_op.ty); + const payload_ty = error_union_ty.errorUnionPayload(); + const mcv = try self.resolveInst(ty_op.operand); + if (!payload_ty.hasCodeGenBits()) break :result mcv; + + return self.fail("TODO implement wrap errunion error for non-empty payloads", .{}); + }; return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); } diff --git a/test/behavior.zig b/test/behavior.zig index 31158120c6..3fb1a5e2d4 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -2,10 +2,19 @@ const builtin = @import("builtin"); test { // Tests that pass for stage1, llvm backend, C backend, wasm backend, and arm backend. + _ = @import("behavior/bugs/679.zig"); _ = @import("behavior/bugs/1111.zig"); _ = @import("behavior/bugs/2346.zig"); _ = @import("behavior/bugs/3586.zig"); + _ = @import("behavior/bugs/4560.zig"); + _ = @import("behavior/bugs/6850.zig"); _ = @import("behavior/slice_sentinel_comptime.zig"); + _ = @import("behavior/fn_in_struct_in_comptime.zig"); + _ = @import("behavior/hasfield.zig"); + _ = @import("behavior/hasdecl.zig"); + _ = @import("behavior/pub_enum.zig"); + _ = @import("behavior/type_info.zig"); + _ = @import("behavior/type.zig"); if (!builtin.zig_is_stage2 or builtin.stage2_arch != .arm) { // Tests that pass for stage1, llvm backend, C backend, wasm backend. @@ -14,36 +23,27 @@ test { _ = @import("behavior/bool.zig"); _ = @import("behavior/bugs/624.zig"); _ = @import("behavior/bugs/655.zig"); - _ = @import("behavior/bugs/679.zig"); _ = @import("behavior/bugs/704.zig"); _ = @import("behavior/bugs/1486.zig"); _ = @import("behavior/bugs/2692.zig"); _ = @import("behavior/bugs/2889.zig"); _ = @import("behavior/bugs/3046.zig"); - _ = @import("behavior/bugs/4560.zig"); _ = @import("behavior/bugs/4769_a.zig"); _ = @import("behavior/bugs/4769_b.zig"); _ = @import("behavior/bugs/4954.zig"); - _ = @import("behavior/bugs/6850.zig"); _ = @import("behavior/byval_arg_var.zig"); _ = @import("behavior/call.zig"); _ = @import("behavior/defer.zig"); _ = @import("behavior/enum.zig"); _ = @import("behavior/error.zig"); - _ = @import("behavior/fn_in_struct_in_comptime.zig"); - _ = @import("behavior/hasdecl.zig"); - _ = @import("behavior/hasfield.zig"); _ = @import("behavior/if.zig"); _ = @import("behavior/import.zig"); _ = @import("behavior/incomplete_struct_param_tld.zig"); _ = @import("behavior/inttoptr.zig"); _ = @import("behavior/pointers.zig"); _ = @import("behavior/ptrcast.zig"); - _ = @import("behavior/pub_enum.zig"); _ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig"); _ = @import("behavior/truncate.zig"); - _ = @import("behavior/type_info.zig"); - _ = @import("behavior/type.zig"); _ = @import("behavior/usingnamespace.zig"); _ = @import("behavior/underscore.zig"); diff --git a/test/stage2/arm.zig b/test/stage2/arm.zig index e76847f58a..060d40e6e1 100644 --- a/test/stage2/arm.zig +++ b/test/stage2/arm.zig @@ -665,6 +665,20 @@ pub fn addCases(ctx: *TestContext) !void { , "", ); + + case.addCompareOutput( + \\pub fn main() void { + \\ foo() catch unreachable; + \\} + \\ + \\fn foo() anyerror!void { + \\ try bar(); + \\} + \\ + \\fn bar() anyerror!void {} + , + "", + ); } {