From 519ccfe9696ed22f878a8d2af6a57d8e345d16fa Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 5 Sep 2022 07:58:33 -0700 Subject: [PATCH] Fixed data cycle issue, 'using' union field lookup --- IDEHelper/Compiler/BfExprEvaluator.cpp | 16 ++++++++++++++-- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 2 +- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index b14fb4f6..973b4940 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -5319,6 +5319,13 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe 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; if (target.IsSplat()) { @@ -5533,8 +5540,13 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar bool isBaseLookup = false; 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; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index b00bf11e..4a814ffc 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -5336,7 +5336,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (resolvedFieldType->IsValueType()) { - BF_ASSERT(!resolvedFieldType->IsDataIncomplete()); + BF_ASSERT((!resolvedFieldType->IsDataIncomplete()) || (resolvedFieldType->HasTypeFailed())); } if (!mCompiler->mIsResolveOnly) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 2c2b15e3..ab63952c 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -2697,7 +2697,7 @@ bool BfTypeInstance::IsValuelessType() if (mTypeDef->mIsOpaque) return false; - BF_ASSERT(mDefineState >= BfTypeDefineState_Defined); + BF_ASSERT((mDefineState >= BfTypeDefineState_Defined) || (mTypeFailed)); BF_ASSERT(mInstSize >= 0); if (mInstSize == 0) {