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(
2646526465 .@"struct" => {
2646626466 if (zcu.typeToStruct(concrete_ty)) |struct_type| {
2646726467 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]);
26469
26470 return sema.finishFieldCallBind(block, src, ptr_ty, field_ty, field_index, object_ptr);
26468 return sema.finishFieldCallBind(block, src, ptr_ty, field_index, object_ptr);
2647126469 } else if (concrete_ty.isTuple(zcu)) {
2647226470 if (field_name.eqlSlice("len", ip)) {
2647326471 return .{ .direct = try pt.intRef(.usize, concrete_ty.structFieldCount(zcu)) };
2647426472 }
2647526473 if (field_name.toUnsigned(ip)) |field_index| {
2647626474 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);
2647826476 }
2647926477 } else {
2648026478 const max = concrete_ty.structFieldCount(zcu);
2648126479 for (0..max) |i_usize| {
2648226480 const i: u32 = @intCast(i_usize);
2648326481 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);
2648526483 }
2648626484 }
2648726485 }
......@@ -26597,19 +26595,12 @@ fn finishFieldCallBind(
2659726595 block: *Block,
2659826596 src: LazySrcLoc,
2659926597 ptr_ty: Type,
26600 field_ty: Type,
2660126598 field_index: u32,
2660226599 object_ptr: Air.Inst.Ref,
2660326600) CompileError!ResolvedFieldCallee {
2660426601 const pt = sema.pt;
2660526602 const zcu = pt.zcu;
26606 const ptr_field_ty = try pt.ptrType(.{
26607 .child = field_ty.toIntern(),
26608 .flags = .{
26609 .is_const = !ptr_ty.ptrIsMutable(zcu),
26610 .address_space = ptr_ty.ptrAddressSpace(zcu),
26611 },
26612 });
26603 const ptr_field_ty = try ptr_ty.fieldPtrType(field_index, pt);
2661326604
2661426605 const container_ty = ptr_ty.childType(zcu);
2661526606 if (container_ty.zigTypeTag(zcu) == .@"struct") {