Commit c710d5eefe

joachimschmidt557 <joachim.schmidt557@outlook.com>
2022-01-02 17:03:21
stage2 ARM: implement wrap_errunion_err for empty payloads
1 parent 36b0699
Changed files (3)
src
arch
test
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 });
 }
 
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 {}
+        ,
+            "",
+        );
     }
 
     {
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");