@@ -17173,24 +17173,30 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr
1717317173 }
1717417174 try sema.resolveTypeLayout(block, ty_src, struct_ty);
1717517175
17176- const struct_obj = struct_ty.castTag(.@"struct").?.data;
17177- const field_index = struct_obj.fields.getIndex(field_name) orelse
17178- return sema.failWithBadStructFieldAccess(block, struct_obj, name_src, field_name);
17176+ const field_index = if (struct_ty.isTuple()) b: {
17177+ if (std.fmt.parseUnsigned(u32, field_name, 10)) |idx| {
17178+ if (idx < struct_ty.structFieldCount()) break :b idx;
17179+ } else |_| {}
17180+ return sema.fail(block, name_src, "tuple '{}' has no such field '{s}'", .{
17181+ struct_ty.fmt(sema.mod), field_name,
17182+ });
17183+ } else try sema.structFieldIndex(block, struct_ty, field_name, name_src);
1717917184
1718017185 try sema.checkPtrOperand(block, ptr_src, field_ptr_ty);
17181- const field = struct_obj.fields.values()[field_index];
1718217186 const field_ptr_ty_info = field_ptr_ty.ptrInfo().data;
1718317187
1718417188 var ptr_ty_data: Type.Payload.Pointer.Data = .{
17185- .pointee_type = field.ty ,
17189+ .pointee_type = struct_ty.structFieldType(field_index) ,
1718617190 .mutable = field_ptr_ty_info.mutable,
1718717191 .@"addrspace" = field_ptr_ty_info.@"addrspace",
1718817192 };
1718917193
17190- if (struct_obj.layout == .Packed) {
17194+ if (struct_ty.containerLayout() == .Packed) {
1719117195 return sema.fail(block, src, "TODO handle packed structs with @fieldParentPtr", .{});
1719217196 } else {
17193- ptr_ty_data.@"align" = field.abi_align;
17197+ ptr_ty_data.@"align" = if (struct_ty.castTag(.@"struct")) |struct_obj| b: {
17198+ break :b struct_obj.data.fields.values()[field_index].abi_align;
17199+ } else 0;
1719417200 }
1719517201
1719617202 const actual_field_ptr_ty = try Type.ptr(sema.arena, sema.mod, ptr_ty_data);
0 commit comments