| ... | ... | @@ -17173,24 +17173,30 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 17173 | 17173 | } |
| 17174 | 17174 | try sema.resolveTypeLayout(block, ty_src, struct_ty); |
| 17175 | 17175 | |
| 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); |
| 17179 | 17184 | |
| 17180 | 17185 | try sema.checkPtrOperand(block, ptr_src, field_ptr_ty); |
| 17181 | | const field = struct_obj.fields.values()[field_index]; |
| 17182 | 17186 | const field_ptr_ty_info = field_ptr_ty.ptrInfo().data; |
| 17183 | 17187 | |
| 17184 | 17188 | var ptr_ty_data: Type.Payload.Pointer.Data = .{ |
| 17185 | | .pointee_type = field.ty, |
| 17189 | .pointee_type = struct_ty.structFieldType(field_index), |
| 17186 | 17190 | .mutable = field_ptr_ty_info.mutable, |
| 17187 | 17191 | .@"addrspace" = field_ptr_ty_info.@"addrspace", |
| 17188 | 17192 | }; |
| 17189 | 17193 | |
| 17190 | | if (struct_obj.layout == .Packed) { |
| 17194 | if (struct_ty.containerLayout() == .Packed) { |
| 17191 | 17195 | return sema.fail(block, src, "TODO handle packed structs with @fieldParentPtr", .{}); |
| 17192 | 17196 | } 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; |
| 17194 | 17200 | } |
| 17195 | 17201 | |
| 17196 | 17202 | const actual_field_ptr_ty = try Type.ptr(sema.arena, sema.mod, ptr_ty_data); |