diff --git a/IDEHelper/Compiler/BfIRBuilder.cpp b/IDEHelper/Compiler/BfIRBuilder.cpp index cdcc9465..00179bd4 100644 --- a/IDEHelper/Compiler/BfIRBuilder.cpp +++ b/IDEHelper/Compiler/BfIRBuilder.cpp @@ -3781,7 +3781,7 @@ void BfIRBuilder::CreateTypeDefinition_Data(BfModule* populateModule, BfTypeInst { auto fieldTypeInst = fieldInstance->mResolvedType->ToTypeInstance(); - if (fieldInstance->mDataSize != fieldTypeInst->mInstSize) + if (fieldInstance->mDataSize > fieldTypeInst->mInstSize) { SizedArray types; types.push_back(MapTypeInst(fieldTypeInst)); @@ -3789,7 +3789,7 @@ void BfIRBuilder::CreateTypeDefinition_Data(BfModule* populateModule, BfTypeInst resolvedFieldIRType = CreateStructType(types); } else - resolvedFieldIRType = MapTypeInst(fieldTypeInst); + resolvedFieldIRType = MapTypeInst(fieldTypeInst); } if (fieldInstance->mDataOffset > dataPos) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index c08c7534..21e9c105 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -5137,9 +5137,18 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurFieldDef, fieldDef); SetAndRestoreValue prevResolveKind(mContext->mCurTypeState->mResolveKind, BfTypeState::ResolveKind_FieldType); + PopulateType(resolvedFieldType, BfPopulateType_Data); + auto fieldTypeInst = resolvedFieldType->ToTypeInstance(); - dataSize = fieldTypeInst->mInstSize; - alignSize = fieldTypeInst->mInstAlign; + dataSize = BF_MAX(fieldTypeInst->mInstSize, 0); + alignSize = BF_MAX(fieldTypeInst->mInstAlign, 1); + + if (fieldTypeInst->mTypeFailed) + { + TypeFailed(fieldTypeInst); + fieldInstance->mResolvedType = GetPrimitiveType(BfTypeCode_Var); + continue; + } if ((typeInstance != NULL) && (fieldTypeInst->mTypeDef->mIsAbstract)) { @@ -5208,6 +5217,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy Fail("Append fields must be classes", nameRefNode, true); } + BF_ASSERT(dataSize >= 0); fieldInstance->mDataSize = dataSize; if (!isUnion) {