diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 08fbf045..af827b7a 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -4615,7 +4615,15 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy typeInstance->mInstSize = baseTypeInst->mInstSize; typeInstance->mInstAlign = baseTypeInst->mInstAlign; typeInstance->mAlign = baseTypeInst->mAlign; - typeInstance->mSize = baseTypeInst->mSize; + typeInstance->mSize = baseTypeInst->mSize; + + if (baseTypeInst->IsValuelessCReprType()) + { + typeInstance->mInstSize = 0; + if (typeInstance->IsValueType()) + typeInstance->mSize = 0; + } + typeInstance->mHasPackingHoles = baseTypeInst->mHasPackingHoles; if (baseTypeInst->mIsTypedPrimitive) typeInstance->mIsTypedPrimitive = true; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index ced53d56..e3368715 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -2861,6 +2861,25 @@ bool BfTypeInstance::IsValuelessType() return false; } +bool BfTypeInstance::IsValuelessCReprType() +{ + if (!mIsCRepr) + return false; + if (mInstSize > 1) + return false; + if ((mBaseType->mIsCRepr) && (!IsValuelessCReprType())) + return false; + + BF_ASSERT((mDefineState >= BfTypeDefineState_Defined) || (mTypeFailed)); + for (auto& fieldInst : mFieldInstances) + { + if (fieldInst.mDataIdx >= 0) + return false; + } + + return true; +} + bool BfTypeInstance::IsIRFuncUsed(BfIRFunction func) { for (auto& group : mMethodInstanceGroups) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 7f5ce088..b02fc351 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -2175,6 +2175,7 @@ public: //virtual bool IsValuelessType() override { return (mIsTypedPrimitive) && (mInstSize == 0); } virtual bool CanBeValuelessType() override { return (mTypeDef->mTypeCode == BfTypeCode_Struct) || (mTypeDef->mTypeCode == BfTypeCode_Enum); } virtual bool IsValuelessType() override; + virtual bool IsValuelessCReprType(); virtual bool HasPackingHoles() override { return mHasPackingHoles; } virtual bool IsTypeMemberAccessible(BfTypeDef* declaringTypeDef, BfTypeDef* activeTypeDef) override; virtual bool IsTypeMemberAccessible(BfTypeDef* declaringTypeDef, BfProject* curProject) override;