| ... | @@ -6769,66 +6769,46 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air | ... | @@ -6769,66 +6769,46 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 6769 | | 6769 | |
| 6770 | const dest_ty = try sema.resolveType(block, dest_ty_src, extra.lhs); | 6770 | const dest_ty = try sema.resolveType(block, dest_ty_src, extra.lhs); |
| 6771 | switch (dest_ty.zigTypeTag()) { | 6771 | switch (dest_ty.zigTypeTag()) { |
| 6772 | .Type, | 6772 | .AnyFrame, |
| 6773 | .Void, | | |
| 6774 | .NoReturn, | | |
| 6775 | .ComptimeFloat, | 6773 | .ComptimeFloat, |
| 6776 | .ComptimeInt, | 6774 | .ComptimeInt, |
| 6777 | .Undefined, | 6775 | .Enum, |
| 6778 | .Null, | | |
| 6779 | .Optional, | | |
| 6780 | .ErrorUnion, | | |
| 6781 | .ErrorSet, | | |
| 6782 | .Opaque, | | |
| 6783 | .Frame, | | |
| 6784 | .AnyFrame, | | |
| 6785 | .EnumLiteral, | 6776 | .EnumLiteral, |
| 6786 | .Union, | 6777 | .ErrorSet, |
| | 6778 | .ErrorUnion, |
| 6787 | .Fn, | 6779 | .Fn, |
| | 6780 | .Frame, |
| | 6781 | .NoReturn, |
| | 6782 | .Null, |
| | 6783 | .Opaque, |
| | 6784 | .Optional, |
| | 6785 | .Type, |
| | 6786 | .Undefined, |
| | 6787 | .Void, |
| 6788 | => return sema.fail(block, dest_ty_src, "invalid type '{}' for @bitCast", .{dest_ty.fmt(target)}), | 6788 | => return sema.fail(block, dest_ty_src, "invalid type '{}' for @bitCast", .{dest_ty.fmt(target)}), |
| 6789 | | 6789 | |
| 6790 | .Pointer => { | 6790 | .Pointer => return sema.fail(block, dest_ty_src, "cannot @bitCast to '{}', use @ptrCast to cast to a pointer", .{ |
| 6791 | const msg = msg: { | 6791 | dest_ty.fmt(target), |
| 6792 | const msg = try sema.errMsg(block, dest_ty_src, "cannot @bitCast to pointer type '{}'", .{dest_ty.fmt(target)}); | 6792 | }), |
| 6793 | errdefer msg.destroy(sema.gpa); | 6793 | .Struct, .Union => if (dest_ty.containerLayout() == .Auto) { |
| 6794 | | 6794 | const container = switch (dest_ty.zigTypeTag()) { |
| 6795 | const pointee_ty = dest_ty.ptrInfo().data.pointee_type; | 6795 | .Struct => "struct", |
| 6796 | try sema.errNote(block, dest_ty_src, msg, "to cast to a pointer type, use @ptrCast({}, ...)", .{dest_ty.fmt(target)}); | 6796 | .Union => "union", |
| 6797 | try sema.errNote(block, dest_ty_src, msg, "to cast to a non-pointer type, use @bitCast({}, ...)", .{pointee_ty.fmt(target)}); | 6797 | else => unreachable, |
| 6798 | break :msg msg; | | |
| 6799 | }; | 6798 | }; |
| 6800 | return sema.failWithOwnedErrorMsg(block, msg); | 6799 | return sema.fail(block, dest_ty_src, "cannot @bitCast to '{}', {s} does not have a guaranteed in-memory layout", .{ |
| 6801 | }, | 6800 | dest_ty.fmt(target), container, |
| 6802 | .Struct => { | 6801 | }); |
| 6803 | if (dest_ty.containerLayout() == .Auto) { | | |
| 6804 | const msg = msg: { | | |
| 6805 | const msg = try sema.errMsg( | | |
| 6806 | block, | | |
| 6807 | dest_ty_src, | | |
| 6808 | "cannot @bitCast to '{}', struct does not have a specified layout", | | |
| 6809 | .{dest_ty.fmt(target)}, | | |
| 6810 | ); | | |
| 6811 | errdefer msg.destroy(sema.gpa); | | |
| 6812 | | | |
| 6813 | const ty_decl_src = dest_ty.declSrcLoc(); | | |
| 6814 | try sema.mod.errNoteNonLazy( | | |
| 6815 | ty_decl_src, | | |
| 6816 | msg, | | |
| 6817 | "consider using 'packed struct' or 'extern struct' for a specified layout.", | | |
| 6818 | .{}, | | |
| 6819 | ); | | |
| 6820 | break :msg msg; | | |
| 6821 | }; | | |
| 6822 | return sema.failWithOwnedErrorMsg(block, msg); | | |
| 6823 | } | | |
| 6824 | }, | 6802 | }, |
| 6825 | .BoundFn => @panic("TODO remove this type from the language and compiler"), | 6803 | .BoundFn => @panic("TODO remove this type from the language and compiler"), |
| 6826 | else => {}, | | |
| 6827 | } | | |
| 6828 | | 6804 | |
| 6829 | // When bitcasting we compare the bit size of the types, so we need to | 6805 | .Array, |
| 6830 | // fully resolve all composite types to finalize the layout. | 6806 | .Bool, |
| 6831 | try sema.resolveTypeFully(block, dest_ty_src, dest_ty); | 6807 | .Float, |
| | 6808 | .Int, |
| | 6809 | .Vector, |
| | 6810 | => {}, |
| | 6811 | } |
| 6832 | | 6812 | |
| 6833 | const operand = sema.resolveInst(extra.rhs); | 6813 | const operand = sema.resolveInst(extra.rhs); |
| 6834 | return sema.bitCast(block, dest_ty, operand, operand_src); | 6814 | return sema.bitCast(block, dest_ty, operand, operand_src); |