| ... | ... | @@ -1732,6 +1732,7 @@ pub const DeclGen = struct { |
| 1732 | 1732 | .unreach, .trap => return self.airUnreach(), |
| 1733 | 1733 | |
| 1734 | 1734 | .unwrap_errunion_err => try self.airErrUnionErr(inst), |
| 1735 | .unwrap_errunion_payload => try self.airErrUnionPayload(inst), |
| 1735 | 1736 | .wrap_errunion_err => try self.airWrapErrUnionErr(inst), |
| 1736 | 1737 | |
| 1737 | 1738 | .is_null => try self.airIsNull(inst, .is_null), |
| ... | ... | @@ -3185,6 +3186,21 @@ pub const DeclGen = struct { |
| 3185 | 3186 | return try self.extractField(Type.anyerror, operand_id, eu_layout.errorFieldIndex()); |
| 3186 | 3187 | } |
| 3187 | 3188 | |
| 3189 | fn airErrUnionPayload(self: *DeclGen, inst: Air.Inst.Index) !?IdRef { |
| 3190 | if (self.liveness.isUnused(inst)) return null; |
| 3191 | |
| 3192 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| 3193 | const operand_id = try self.resolve(ty_op.operand); |
| 3194 | const payload_ty = self.typeOfIndex(inst); |
| 3195 | const eu_layout = self.errorUnionLayout(payload_ty); |
| 3196 | |
| 3197 | if (!eu_layout.payload_has_bits) { |
| 3198 | return null; // No error possible. |
| 3199 | } |
| 3200 | |
| 3201 | return try self.extractField(payload_ty, operand_id, eu_layout.payloadFieldIndex()); |
| 3202 | } |
| 3203 | |
| 3188 | 3204 | fn airWrapErrUnionErr(self: *DeclGen, inst: Air.Inst.Index) !?IdRef { |
| 3189 | 3205 | if (self.liveness.isUnused(inst)) return null; |
| 3190 | 3206 | |