| ... | @@ -23235,8 +23235,16 @@ fn ptrFromIntVal( | ... | @@ -23235,8 +23235,16 @@ fn ptrFromIntVal( |
| 23235 | const addr = try operand_val.toUnsignedIntSema(pt); | 23235 | const addr = try operand_val.toUnsignedIntSema(pt); |
| 23236 | if (!ptr_ty.isAllowzeroPtr(zcu) and addr == 0) | 23236 | if (!ptr_ty.isAllowzeroPtr(zcu) and addr == 0) |
| 23237 | return sema.fail(block, operand_src, "pointer type '{}' does not allow address zero", .{ptr_ty.fmt(pt)}); | 23237 | return sema.fail(block, operand_src, "pointer type '{}' does not allow address zero", .{ptr_ty.fmt(pt)}); |
| 23238 | if (addr != 0 and ptr_align != .none and !ptr_align.check(addr)) | 23238 | if (addr != 0 and ptr_align != .none) { |
| 23239 | return sema.fail(block, operand_src, "pointer type '{}' requires aligned address", .{ptr_ty.fmt(pt)}); | 23239 | const masked_addr = if (ptr_ty.childType(zcu).fnPtrMaskOrNull(zcu)) |mask| |
| | 23240 | addr & mask |
| | 23241 | else |
| | 23242 | addr; |
| | 23243 | |
| | 23244 | if (!ptr_align.check(masked_addr)) { |
| | 23245 | return sema.fail(block, operand_src, "pointer type '{}' requires aligned address", .{ptr_ty.fmt(pt)}); |
| | 23246 | } |
| | 23247 | } |
| 23240 | | 23248 | |
| 23241 | return switch (ptr_ty.zigTypeTag(zcu)) { | 23249 | return switch (ptr_ty.zigTypeTag(zcu)) { |
| 23242 | .optional => Value.fromInterned(try pt.intern(.{ .opt = .{ | 23250 | .optional => Value.fromInterned(try pt.intern(.{ .opt = .{ |
| ... | @@ -23752,7 +23760,12 @@ fn ptrCastFull( | ... | @@ -23752,7 +23760,12 @@ fn ptrCastFull( |
| 23752 | | 23760 | |
| 23753 | if (dest_align.compare(.gt, src_align)) { | 23761 | if (dest_align.compare(.gt, src_align)) { |
| 23754 | if (try ptr_val.getUnsignedIntSema(pt)) |addr| { | 23762 | if (try ptr_val.getUnsignedIntSema(pt)) |addr| { |
| 23755 | if (!dest_align.check(addr)) { | 23763 | const masked_addr = if (Type.fromInterned(dest_info.child).fnPtrMaskOrNull(zcu)) |mask| |
| | 23764 | addr & mask |
| | 23765 | else |
| | 23766 | addr; |
| | 23767 | |
| | 23768 | if (!dest_align.check(masked_addr)) { |
| 23756 | return sema.fail(block, operand_src, "pointer address 0x{X} is not aligned to {d} bytes", .{ | 23769 | return sema.fail(block, operand_src, "pointer address 0x{X} is not aligned to {d} bytes", .{ |
| 23757 | addr, | 23770 | addr, |
| 23758 | dest_align.toByteUnits().?, | 23771 | dest_align.toByteUnits().?, |