Forráskód Böngészése

Fixed data cycle issue, 'using' union field lookup

Brian Fiete 3 éve
szülő
commit
519ccfe969

+ 14 - 2
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;
 

+ 1 - 1
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)

+ 1 - 1
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)
 	{