diff --git a/src/check_type.cpp b/src/check_type.cpp index c119ce6b5..9653a980b 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -135,6 +135,8 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, SliceStruct.is_polymorphic = true; type = nullptr; + } else if(struct_type->Struct.is_packed) { + type->flags |= TypeFlag_Packed; } } if (type == nullptr) { diff --git a/src/types.cpp b/src/types.cpp index 3ec05059f..55d083a9a 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -321,6 +321,7 @@ enum TypeFlag : u32 { TypeFlag_Polymorphic = 1<<1, TypeFlag_PolySpecialized = 1<<2, TypeFlag_InProcessOfCheckingPolymorphic = 1<<3, + TypeFlag_Packed = 1<<4, }; struct Type { @@ -3671,6 +3672,9 @@ gb_internal i64 type_align_of(Type *t) { if (t == nullptr) { return 1; } + if (t->flags & TypeFlag_Packed) { + return 1; + } if (t->kind != Type_Named && t->cached_align > 0) { return t->cached_align.load(); }