1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 20:12:21 +02:00

Fixed data cycle issue, 'using' union field lookup

This commit is contained in:
Brian Fiete 2022-09-05 07:58:33 -07:00
parent c6f2798db7
commit 519ccfe969
3 changed files with 16 additions and 4 deletions

View file

@ -5319,6 +5319,13 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
return mModule->GetDefaultTypedValue(resolvedFieldType); return mModule->GetDefaultTypedValue(resolvedFieldType);
} }
if ((target.mType->IsUnion()) && (!target.mType->IsValuelessType()))
{
auto ptrTarget = mModule->MakeAddressable(target);
BfIRType llvmPtrType = mModule->mBfIRBuilder->GetPointerTo(mModule->mBfIRBuilder->MapType(resolvedFieldType));
return BfTypedValue(mModule->mBfIRBuilder->CreateBitCast(ptrTarget.mValue, llvmPtrType), resolvedFieldType, true);
}
BfTypedValue retVal; BfTypedValue retVal;
if (target.IsSplat()) if (target.IsSplat())
{ {
@ -5533,8 +5540,13 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar
bool isBaseLookup = false; bool isBaseLookup = false;
while (curCheckType != NULL) while (curCheckType != NULL)
{ {
/// if (((flags & BfLookupFieldFlag_CheckingOuter) != 0) && ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0))
{
// Don't fully populateType for CheckingOuter - it carries a risk of an inadvertent data cycle
// Avoiding this could cause issues finding emitted statics/constants
}
else
{ {
bool isPopulatingType = false; bool isPopulatingType = false;

View file

@ -5336,7 +5336,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
if (resolvedFieldType->IsValueType()) if (resolvedFieldType->IsValueType())
{ {
BF_ASSERT(!resolvedFieldType->IsDataIncomplete()); BF_ASSERT((!resolvedFieldType->IsDataIncomplete()) || (resolvedFieldType->HasTypeFailed()));
} }
if (!mCompiler->mIsResolveOnly) if (!mCompiler->mIsResolveOnly)

View file

@ -2697,7 +2697,7 @@ bool BfTypeInstance::IsValuelessType()
if (mTypeDef->mIsOpaque) if (mTypeDef->mIsOpaque)
return false; return false;
BF_ASSERT(mDefineState >= BfTypeDefineState_Defined); BF_ASSERT((mDefineState >= BfTypeDefineState_Defined) || (mTypeFailed));
BF_ASSERT(mInstSize >= 0); BF_ASSERT(mInstSize >= 0);
if (mInstSize == 0) if (mInstSize == 0)
{ {