| ... | @@ -22614,8 +22614,16 @@ fn ptrFromIntVal( | ... | @@ -22614,8 +22614,16 @@ fn ptrFromIntVal( |
| 22614 | const addr = try operand_val.toUnsignedIntSema(pt); | 22614 | const addr = try operand_val.toUnsignedIntSema(pt); |
| 22615 | if (!ptr_ty.isAllowzeroPtr(zcu) and addr == 0) | 22615 | if (!ptr_ty.isAllowzeroPtr(zcu) and addr == 0) |
| 22616 | return sema.fail(block, operand_src, "pointer type '{}' does not allow address zero", .{ptr_ty.fmt(pt)}); | 22616 | return sema.fail(block, operand_src, "pointer type '{}' does not allow address zero", .{ptr_ty.fmt(pt)}); |
| 22617 | if (addr != 0 and ptr_align != .none and !ptr_align.check(addr)) | 22617 | if (addr != 0 and ptr_align != .none) { |
| 22618 | return sema.fail(block, operand_src, "pointer type '{}' requires aligned address", .{ptr_ty.fmt(pt)}); | 22618 | const masked_addr = if (ptr_ty.childType(zcu).fnPtrMaskOrNull(zcu)) |mask| |
| | 22619 | addr & mask |
| | 22620 | else |
| | 22621 | addr; |
| | 22622 | |
| | 22623 | if (!ptr_align.check(masked_addr)) { |
| | 22624 | return sema.fail(block, operand_src, "pointer type '{}' requires aligned address", .{ptr_ty.fmt(pt)}); |
| | 22625 | } |
| | 22626 | } |
| 22619 | | 22627 | |
| 22620 | return switch (ptr_ty.zigTypeTag(zcu)) { | 22628 | return switch (ptr_ty.zigTypeTag(zcu)) { |
| 22621 | .optional => Value.fromInterned(try pt.intern(.{ .opt = .{ | 22629 | .optional => Value.fromInterned(try pt.intern(.{ .opt = .{ |
| ... | @@ -23131,7 +23139,12 @@ fn ptrCastFull( | ... | @@ -23131,7 +23139,12 @@ fn ptrCastFull( |
| 23131 | | 23139 | |
| 23132 | if (dest_align.compare(.gt, src_align)) { | 23140 | if (dest_align.compare(.gt, src_align)) { |
| 23133 | if (try ptr_val.getUnsignedIntSema(pt)) |addr| { | 23141 | if (try ptr_val.getUnsignedIntSema(pt)) |addr| { |
| 23134 | if (!dest_align.check(addr)) { | 23142 | const masked_addr = if (Type.fromInterned(dest_info.child).fnPtrMaskOrNull(zcu)) |mask| |
| | 23143 | addr & mask |
| | 23144 | else |
| | 23145 | addr; |
| | 23146 | |
| | 23147 | if (!dest_align.check(masked_addr)) { |
| 23135 | return sema.fail(block, operand_src, "pointer address 0x{X} is not aligned to {d} bytes", .{ | 23148 | return sema.fail(block, operand_src, "pointer address 0x{X} is not aligned to {d} bytes", .{ |
| 23136 | addr, | 23149 | addr, |
| 23137 | dest_align.toByteUnits().?, | 23150 | dest_align.toByteUnits().?, |