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