diff --git a/IDEHelper/Compiler/BfIRBuilder.cpp b/IDEHelper/Compiler/BfIRBuilder.cpp index 7ed11ec8..1e9eb5e6 100644 --- a/IDEHelper/Compiler/BfIRBuilder.cpp +++ b/IDEHelper/Compiler/BfIRBuilder.cpp @@ -3179,7 +3179,7 @@ void BfIRBuilder::CreateDbgTypeDefinition(BfType* type) auto resolvedFieldDIType = DbgGetType(fieldType); String fieldName = "$bfunion"; auto memberType = DbgCreateMemberType(diForwardDecl, fieldName, fileDIScope, lineNum, - fieldType->mSize * 8, fieldType->mAlign * 8, 0, + fieldType->mSize * 8, fieldType->mAlign * 8, typeInstance->mBaseType->mInstSize * 8, flags, resolvedFieldDIType); diFieldTypes.push_back(memberType); } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index e9a3943a..4f8b9312 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -5433,8 +5433,8 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy { BF_ASSERT(resolvedFieldType->mSize >= 0); - if (alignSize > 1) - dataPos = (dataPos + (alignSize - 1)) & ~(alignSize - 1); +// if (alignSize > 1) +// dataPos = (dataPos + (alignSize - 1)) & ~(alignSize - 1); fieldInstance->mDataOffset = dataPos; typeInstance->mInstAlign = std::max(typeInstance->mInstAlign, alignSize); @@ -5623,7 +5623,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (unionInnerType != NULL) { - dataPos = unionInnerType->mSize; + dataPos = startDataPos + unionInnerType->mSize; typeInstance->mInstAlign = BF_MAX(unionInnerType->mAlign, typeInstance->mInstAlign); } diff --git a/IDEHelper/Tests/src/Unions.bf b/IDEHelper/Tests/src/Unions.bf index 9dfe1b07..227cfc72 100644 --- a/IDEHelper/Tests/src/Unions.bf +++ b/IDEHelper/Tests/src/Unions.bf @@ -29,6 +29,12 @@ namespace Tests } } + [Union] + struct UnionD : UnionC + { + public int16 mInt16; + } + [Test] static void TestBasics() { @@ -41,6 +47,13 @@ namespace Tests *((float*)&ub.mInt32) = 1.2f; Test.Assert(ub.mFloat == 1.2f); Test.Assert(sizeof(UnionB) == 4); + + UnionD ud = .(); + ud.mInt32 = 123; + ud.mInt16 = 234; + Test.Assert(sizeof(UnionD) == 6); + Test.Assert(alignof(UnionD) == 4); + Test.Assert(((int16*)&ud)[3] == 234); } } }