| ... | @@ -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 | }); | | |
| 26613 | | 26604 | |
| 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") { |