| ... | @@ -7669,17 +7669,21 @@ fn zirErrorUnionType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr | ... | @@ -7669,17 +7669,21 @@ fn zirErrorUnionType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 7669 | error_set.fmt(sema.mod), | 7669 | error_set.fmt(sema.mod), |
| 7670 | }); | 7670 | }); |
| 7671 | } | 7671 | } |
| 7672 | if (payload.zigTypeTag() == .Opaque) { | 7672 | try sema.validateErrorUnionPayloadType(block, payload, rhs_src); |
| 7673 | return sema.fail(block, rhs_src, "error union with payload of opaque type '{}' not allowed", .{ | 7673 | const err_union_ty = try Type.errorUnion(sema.arena, error_set, payload, sema.mod); |
| 7674 | payload.fmt(sema.mod), | 7674 | return sema.addType(err_union_ty); |
| | 7675 | } |
| | 7676 | |
| | 7677 | fn validateErrorUnionPayloadType(sema: *Sema, block: *Block, payload_ty: Type, payload_src: LazySrcLoc) !void { |
| | 7678 | if (payload_ty.zigTypeTag() == .Opaque) { |
| | 7679 | return sema.fail(block, payload_src, "error union with payload of opaque type '{}' not allowed", .{ |
| | 7680 | payload_ty.fmt(sema.mod), |
| 7675 | }); | 7681 | }); |
| 7676 | } else if (payload.zigTypeTag() == .ErrorSet) { | 7682 | } else if (payload_ty.zigTypeTag() == .ErrorSet) { |
| 7677 | return sema.fail(block, rhs_src, "error union with payload of error set type '{}' not allowed", .{ | 7683 | return sema.fail(block, payload_src, "error union with payload of error set type '{}' not allowed", .{ |
| 7678 | payload.fmt(sema.mod), | 7684 | payload_ty.fmt(sema.mod), |
| 7679 | }); | 7685 | }); |
| 7680 | } | 7686 | } |
| 7681 | const err_union_ty = try Type.errorUnion(sema.arena, error_set, payload, sema.mod); | | |
| 7682 | return sema.addType(err_union_ty); | | |
| 7683 | } | 7687 | } |
| 7684 | | 7688 | |
| 7685 | fn zirErrorValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 7689 | fn zirErrorValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | @@ -8639,6 +8643,7 @@ fn funcCommon( | ... | @@ -8639,6 +8643,7 @@ fn funcCommon( |
| 8639 | const return_type = if (!inferred_error_set or ret_poison) | 8643 | const return_type = if (!inferred_error_set or ret_poison) |
| 8640 | bare_return_type | 8644 | bare_return_type |
| 8641 | else blk: { | 8645 | else blk: { |
| | 8646 | try sema.validateErrorUnionPayloadType(block, bare_return_type, ret_ty_src); |
| 8642 | const node = try sema.gpa.create(Module.Fn.InferredErrorSetListNode); | 8647 | const node = try sema.gpa.create(Module.Fn.InferredErrorSetListNode); |
| 8643 | node.data = .{ .func = new_func }; | 8648 | node.data = .{ .func = new_func }; |
| 8644 | maybe_inferred_error_set_node = node; | 8649 | maybe_inferred_error_set_node = node; |
| ... | @@ -8650,15 +8655,15 @@ fn funcCommon( | ... | @@ -8650,15 +8655,15 @@ fn funcCommon( |
| 8650 | }); | 8655 | }); |
| 8651 | }; | 8656 | }; |
| 8652 | | 8657 | |
| 8653 | if (!bare_return_type.isValidReturnType()) { | 8658 | if (!return_type.isValidReturnType()) { |
| 8654 | const opaque_str = if (bare_return_type.zigTypeTag() == .Opaque) "opaque " else ""; | 8659 | const opaque_str = if (return_type.zigTypeTag() == .Opaque) "opaque " else ""; |
| 8655 | const msg = msg: { | 8660 | const msg = msg: { |
| 8656 | const msg = try sema.errMsg(block, ret_ty_src, "{s}return type '{}' not allowed", .{ | 8661 | const msg = try sema.errMsg(block, ret_ty_src, "{s}return type '{}' not allowed", .{ |
| 8657 | opaque_str, bare_return_type.fmt(sema.mod), | 8662 | opaque_str, return_type.fmt(sema.mod), |
| 8658 | }); | 8663 | }); |
| 8659 | errdefer msg.destroy(sema.gpa); | 8664 | errdefer msg.destroy(sema.gpa); |
| 8660 | | 8665 | |
| 8661 | try sema.addDeclaredHereNote(msg, bare_return_type); | 8666 | try sema.addDeclaredHereNote(msg, return_type); |
| 8662 | break :msg msg; | 8667 | break :msg msg; |
| 8663 | }; | 8668 | }; |
| 8664 | return sema.failWithOwnedErrorMsg(msg); | 8669 | return sema.failWithOwnedErrorMsg(msg); |