aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2025-04-14 18:40:47 +0200
committerMatthew Lugg <mlugg@mlugg.co.uk>2025-04-27 23:54:54 +0100
commit5ed8bd5c85e34d200a504418ebd2fc3d902460ac (patch)
tree5315274c455873fadde58eb09c572324128e3dff /src
parente7b46363aea6e42c206cb7b1bd8c9b47a83d9045 (diff)
downloadzig-5ed8bd5c85e34d200a504418ebd2fc3d902460ac.tar.gz
zig-5ed8bd5c85e34d200a504418ebd2fc3d902460ac.zip
Sema: Fix some ptr alignment checks to handle a potential ISA tag bit.
Closes #23570.
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 38b6a7f3bc..5c084cd4b6 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -22614,8 +22614,16 @@ fn ptrFromIntVal(
const addr = try operand_val.toUnsignedIntSema(pt);
if (!ptr_ty.isAllowzeroPtr(zcu) and addr == 0)
return sema.fail(block, operand_src, "pointer type '{}' does not allow address zero", .{ptr_ty.fmt(pt)});
- if (addr != 0 and ptr_align != .none and !ptr_align.check(addr))
- return sema.fail(block, operand_src, "pointer type '{}' requires aligned address", .{ptr_ty.fmt(pt)});
+ if (addr != 0 and ptr_align != .none) {
+ const masked_addr = if (ptr_ty.childType(zcu).fnPtrMaskOrNull(zcu)) |mask|
+ addr & mask
+ else
+ addr;
+
+ if (!ptr_align.check(masked_addr)) {
+ return sema.fail(block, operand_src, "pointer type '{}' requires aligned address", .{ptr_ty.fmt(pt)});
+ }
+ }
return switch (ptr_ty.zigTypeTag(zcu)) {
.optional => Value.fromInterned(try pt.intern(.{ .opt = .{
@@ -23131,7 +23139,12 @@ fn ptrCastFull(
if (dest_align.compare(.gt, src_align)) {
if (try ptr_val.getUnsignedIntSema(pt)) |addr| {
- if (!dest_align.check(addr)) {
+ const masked_addr = if (Type.fromInterned(dest_info.child).fnPtrMaskOrNull(zcu)) |mask|
+ addr & mask
+ else
+ addr;
+
+ if (!dest_align.check(masked_addr)) {
return sema.fail(block, operand_src, "pointer address 0x{X} is not aligned to {d} bytes", .{
addr,
dest_align.toByteUnits().?,