| ... | ... | @@ -34280,9 +34280,54 @@ pub fn resolveTypeLayout(sema: *Sema, ty: Type) CompileError!void { |
| 34280 | 34280 | } |
| 34281 | 34281 | } |
| 34282 | 34282 | |
| 34283 | | fn resolveStructLayout(sema: *Sema, ty: Type) CompileError!void { |
| 34284 | | try sema.resolveTypeFields(ty); |
| 34283 | /// Resolve a struct's alignment only without triggering resolution of its layout. |
| 34284 | /// Asserts that the alignment is not yet resolved and the layout is non-packed. |
| 34285 | pub fn resolveStructAlignment( |
| 34286 | sema: *Sema, |
| 34287 | ty: InternPool.Index, |
| 34288 | struct_type: InternPool.Key.StructType, |
| 34289 | ) CompileError!Alignment { |
| 34290 | const mod = sema.mod; |
| 34291 | const ip = &mod.intern_pool; |
| 34292 | const target = mod.getTarget(); |
| 34293 | |
| 34294 | assert(struct_type.flagsPtr(ip).alignment == .none); |
| 34295 | assert(struct_type.layout != .Packed); |
| 34296 | |
| 34297 | if (struct_type.flagsPtr(ip).field_types_wip) { |
| 34298 | // We'll guess "pointer-aligned", if the struct has an |
| 34299 | // underaligned pointer field then some allocations |
| 34300 | // might require explicit alignment. |
| 34301 | //TODO write this bit and emit an error later if incorrect |
| 34302 | //struct_type.flagsPtr(ip).assumed_pointer_aligned = true; |
| 34303 | const result = Alignment.fromByteUnits(@divExact(target.ptrBitWidth(), 8)); |
| 34304 | struct_type.flagsPtr(ip).alignment = result; |
| 34305 | return result; |
| 34306 | } |
| 34307 | |
| 34308 | try sema.resolveTypeFieldsStruct(ty, struct_type); |
| 34309 | |
| 34310 | var result: Alignment = .@"1"; |
| 34285 | 34311 | |
| 34312 | for (0..struct_type.field_types.len) |i| { |
| 34313 | if (struct_type.fieldIsComptime(ip, i)) continue; |
| 34314 | const field_ty = struct_type.field_types.get(ip)[i].toType(); |
| 34315 | if (try sema.typeRequiresComptime(field_ty)) continue; |
| 34316 | if (try sema.typeHasRuntimeBits(field_ty)) { |
| 34317 | const field_align = try sema.structFieldAlignment( |
| 34318 | struct_type.fieldAlign(ip, i), |
| 34319 | field_ty, |
| 34320 | struct_type.layout, |
| 34321 | ); |
| 34322 | result = result.max(field_align); |
| 34323 | } |
| 34324 | } |
| 34325 | |
| 34326 | struct_type.flagsPtr(ip).alignment = result; |
| 34327 | return result; |
| 34328 | } |
| 34329 | |
| 34330 | fn resolveStructLayout(sema: *Sema, ty: Type) CompileError!void { |
| 34286 | 34331 | const mod = sema.mod; |
| 34287 | 34332 | const ip = &mod.intern_pool; |
| 34288 | 34333 | const struct_type = mod.typeToStruct(ty) orelse return; |
| ... | ... | @@ -34290,6 +34335,8 @@ fn resolveStructLayout(sema: *Sema, ty: Type) CompileError!void { |
| 34290 | 34335 | if (struct_type.haveLayout(ip)) |
| 34291 | 34336 | return; |
| 34292 | 34337 | |
| 34338 | try sema.resolveTypeFields(ty); |
| 34339 | |
| 34293 | 34340 | if (struct_type.layout == .Packed) { |
| 34294 | 34341 | try semaBackingIntType(mod, struct_type); |
| 34295 | 34342 | return; |