| ... | ... | @@ -28013,12 +28013,17 @@ fn structFieldPtrByIndex( |
| 28013 | 28013 | const zcu = pt.zcu; |
| 28014 | 28014 | const ip = &zcu.intern_pool; |
| 28015 | 28015 | |
| 28016 | | if (try sema.resolveDefinedValue(block, src, struct_ptr)) |struct_ptr_val| { |
| 28017 | | const val = try struct_ptr_val.ptrField(field_index, pt); |
| 28018 | | return Air.internedToRef(val.toIntern()); |
| 28016 | const struct_type = zcu.typeToStruct(struct_ty).?; |
| 28017 | const field_is_comptime = struct_type.fieldIsComptime(ip, field_index); |
| 28018 | |
| 28019 | // Comptime fields are handled later |
| 28020 | if (!field_is_comptime) { |
| 28021 | if (try sema.resolveDefinedValue(block, src, struct_ptr)) |struct_ptr_val| { |
| 28022 | const val = try struct_ptr_val.ptrField(field_index, pt); |
| 28023 | return Air.internedToRef(val.toIntern()); |
| 28024 | } |
| 28019 | 28025 | } |
| 28020 | 28026 | |
| 28021 | | const struct_type = zcu.typeToStruct(struct_ty).?; |
| 28022 | 28027 | const field_ty = struct_type.field_types.get(ip)[field_index]; |
| 28023 | 28028 | const struct_ptr_ty = sema.typeOf(struct_ptr); |
| 28024 | 28029 | const struct_ptr_ty_info = struct_ptr_ty.ptrInfo(zcu); |
| ... | ... | @@ -28038,6 +28043,7 @@ fn structFieldPtrByIndex( |
| 28038 | 28043 | try Type.fromInterned(struct_ptr_ty_info.child).abiAlignmentSema(pt); |
| 28039 | 28044 | |
| 28040 | 28045 | if (struct_type.layout == .@"packed") { |
| 28046 | assert(!field_is_comptime); |
| 28041 | 28047 | switch (struct_ty.packedStructFieldPtrInfo(struct_ptr_ty, field_index, pt)) { |
| 28042 | 28048 | .bit_ptr => |packed_offset| { |
| 28043 | 28049 | ptr_ty_data.flags.alignment = parent_align; |
| ... | ... | @@ -28048,6 +28054,7 @@ fn structFieldPtrByIndex( |
| 28048 | 28054 | }, |
| 28049 | 28055 | } |
| 28050 | 28056 | } else if (struct_type.layout == .@"extern") { |
| 28057 | assert(!field_is_comptime); |
| 28051 | 28058 | // For extern structs, field alignment might be bigger than type's |
| 28052 | 28059 | // natural alignment. Eg, in `extern struct { x: u32, y: u16 }` the |
| 28053 | 28060 | // second field is aligned as u32. |
| ... | ... | @@ -28071,7 +28078,7 @@ fn structFieldPtrByIndex( |
| 28071 | 28078 | |
| 28072 | 28079 | const ptr_field_ty = try pt.ptrTypeSema(ptr_ty_data); |
| 28073 | 28080 | |
| 28074 | | if (struct_type.fieldIsComptime(ip, field_index)) { |
| 28081 | if (field_is_comptime) { |
| 28075 | 28082 | try struct_ty.resolveStructFieldInits(pt); |
| 28076 | 28083 | const val = try pt.intern(.{ .ptr = .{ |
| 28077 | 28084 | .ty = ptr_field_ty.toIntern(), |