authorgravatar for sinon@vortan.devDavid Rubin <sinon@vortan.dev> 2026-06-09 18:22:37-07:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-06-18 16:42:32+02:00
log5d3be4fbe8372e357a25a7e24e4825425de086fe
treeb171813ece174230ba2ed8a5658d63e261bfefef
parent6f4499c9dc069e8a6d6b6113fc918407f9d577cd

Sema: preserve alignment when performing function field call


1 files changed, 4 insertions(+), 13 deletions(-)

src/Sema.zig+4-13
...@@ -26465,23 +26465,21 @@ fn fieldCallBind(...@@ -26465,23 +26465,21 @@ fn fieldCallBind(
26465 .@"struct" => {26465 .@"struct" => {
26466 if (zcu.typeToStruct(concrete_ty)) |struct_type| {26466 if (zcu.typeToStruct(concrete_ty)) |struct_type| {
26467 const field_index = struct_type.nameIndex(ip, field_name) orelse break :find_field;26467 const field_index = struct_type.nameIndex(ip, field_name) orelse break :find_field;
26468 const field_ty: Type = .fromInterned(struct_type.field_types.get(ip)[field_index]);26468 return sema.finishFieldCallBind(block, src, ptr_ty, field_index, object_ptr);
26469
26470 return sema.finishFieldCallBind(block, src, ptr_ty, field_ty, field_index, object_ptr);
26471 } else if (concrete_ty.isTuple(zcu)) {26469 } else if (concrete_ty.isTuple(zcu)) {
26472 if (field_name.eqlSlice("len", ip)) {26470 if (field_name.eqlSlice("len", ip)) {
26473 return .{ .direct = try pt.intRef(.usize, concrete_ty.structFieldCount(zcu)) };26471 return .{ .direct = try pt.intRef(.usize, concrete_ty.structFieldCount(zcu)) };
26474 }26472 }
26475 if (field_name.toUnsigned(ip)) |field_index| {26473 if (field_name.toUnsigned(ip)) |field_index| {
26476 if (field_index >= concrete_ty.structFieldCount(zcu)) break :find_field;26474 if (field_index >= concrete_ty.structFieldCount(zcu)) break :find_field;
26477 return sema.finishFieldCallBind(block, src, ptr_ty, concrete_ty.fieldType(field_index, zcu), field_index, object_ptr);26475 return sema.finishFieldCallBind(block, src, ptr_ty, field_index, object_ptr);
26478 }26476 }
26479 } else {26477 } else {
26480 const max = concrete_ty.structFieldCount(zcu);26478 const max = concrete_ty.structFieldCount(zcu);
26481 for (0..max) |i_usize| {26479 for (0..max) |i_usize| {
26482 const i: u32 = @intCast(i_usize);26480 const i: u32 = @intCast(i_usize);
26483 if (field_name == concrete_ty.structFieldName(i, zcu).unwrap().?) {26481 if (field_name == concrete_ty.structFieldName(i, zcu).unwrap().?) {
26484 return sema.finishFieldCallBind(block, src, ptr_ty, concrete_ty.fieldType(i, zcu), i, object_ptr);26482 return sema.finishFieldCallBind(block, src, ptr_ty, i, object_ptr);
26485 }26483 }
26486 }26484 }
26487 }26485 }
...@@ -26597,19 +26595,12 @@ fn finishFieldCallBind(...@@ -26597,19 +26595,12 @@ fn finishFieldCallBind(
26597 block: *Block,26595 block: *Block,
26598 src: LazySrcLoc,26596 src: LazySrcLoc,
26599 ptr_ty: Type,26597 ptr_ty: Type,
26600 field_ty: Type,
26601 field_index: u32,26598 field_index: u32,
26602 object_ptr: Air.Inst.Ref,26599 object_ptr: Air.Inst.Ref,
26603) CompileError!ResolvedFieldCallee {26600) CompileError!ResolvedFieldCallee {
26604 const pt = sema.pt;26601 const pt = sema.pt;
26605 const zcu = pt.zcu;26602 const zcu = pt.zcu;
26606 const ptr_field_ty = try pt.ptrType(.{26603 const ptr_field_ty = try ptr_ty.fieldPtrType(field_index, pt);
26607 .child = field_ty.toIntern(),
26608 .flags = .{
26609 .is_const = !ptr_ty.ptrIsMutable(zcu),
26610 .address_space = ptr_ty.ptrAddressSpace(zcu),
26611 },
26612 });
2661326604
26614 const container_ty = ptr_ty.childType(zcu);26605 const container_ty = ptr_ty.childType(zcu);
26615 if (container_ty.zigTypeTag(zcu) == .@"struct") {26606 if (container_ty.zigTypeTag(zcu) == .@"struct") {