diff --git a/IDEHelper/Compiler/BfCompiler.h b/IDEHelper/Compiler/BfCompiler.h index a4d30622..c4288e96 100644 --- a/IDEHelper/Compiler/BfCompiler.h +++ b/IDEHelper/Compiler/BfCompiler.h @@ -74,6 +74,7 @@ public: int mQueuedTypesProcessed; int mTypesQueued; int mTypesDeleted; + int mTypesDeleted_LastUpdateAfterDeletingTypes; int mMethodsQueued; int mModulesStarted; diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index b0aca5ae..6dca982a 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -2036,9 +2036,10 @@ void BfContext::DeleteType(BfType* type, bool deferDepRebuilds) void BfContext::UpdateAfterDeletingTypes() { BP_ZONE("BfContext::UpdateAfterDeletingTypes"); - BfLogSysM("UpdateAfterDeletingTypes\n"); + BfLogSysM("UpdateAfterDeletingTypes\n"); int graveyardStart = (int)mTypeGraveyard.size(); + while (true) { @@ -2124,6 +2125,8 @@ void BfContext::UpdateAfterDeletingTypes() SaveDeletingType(type); } } + + mCompiler->mStats.mTypesDeleted_LastUpdateAfterDeletingTypes = mCompiler->mStats.mTypesDeleted; } // This happens before the old defs have been injected @@ -3487,6 +3490,13 @@ void BfContext::Cleanup() mCompiler->mCompileState = BfCompiler::CompileState_Cleanup; + if (mCompiler->mStats.mTypesDeleted_LastUpdateAfterDeletingTypes != mCompiler->mStats.mTypesDeleted) + { + // Should only occur for internal compiler errors + BF_ASSERT(mCompiler->mExtraCompileRequested); + UpdateAfterDeletingTypes(); + } + /// { Array survivingLocalMethods; diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 324e607f..6e5181cf 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -9508,8 +9508,14 @@ BfTypedValue BfExprEvaluator::CheckEnumCreation(BfAstNode* targetSrc, BfTypeInst BfTypedValue receivingValue; BfIRValue tupleFieldPtr; - if (tuplePtr) + + mModule->PopulateType(tupleFieldInstance->mResolvedType); + if (tupleFieldInstance->mResolvedType->IsValuelessType()) { + receivingValue = mModule->GetDefaultTypedValue(tupleFieldInstance->mResolvedType); + } + else if (tuplePtr) + { tupleFieldPtr = mModule->mBfIRBuilder->CreateInBoundsGEP(tuplePtr, 0, tupleFieldInstance->mDataIdx); receivingValue = BfTypedValue(tupleFieldPtr, tupleFieldInstance->mResolvedType, true); } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 109239d7..a99933f5 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -7791,17 +7791,27 @@ BfUnknownSizedArrayType* BfModule::CreateUnknownSizedArrayType(BfType* resolvedT BfPointerType* BfModule::CreatePointerType(BfType* resolvedType) { BF_ASSERT(!resolvedType->IsVar()); - BF_ASSERT_REL(!resolvedType->IsDeleting()); - + auto pointerType = mContext->mPointerTypePool.Get(); pointerType->mContext = mContext; pointerType->mElementType = resolvedType; auto resolvedPointerType = (BfPointerType*)ResolveType(pointerType); if (resolvedPointerType != pointerType) + { mContext->mPointerTypePool.GiveBack(pointerType); + } + else + { + if (resolvedType->IsDeleting()) + { + mCompiler->RequestExtraCompile(); + InternalError("CreatePointerType using deleted type"); + mContext->DeleteType(resolvedPointerType); + } + } BF_ASSERT(resolvedPointerType->mElementType == resolvedType); - + return resolvedPointerType; } diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 02f0ae82..b318ac2a 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -2947,6 +2947,13 @@ BfTypedValue BfModule::TryCaseEnumMatch(BfTypedValue enumVal, BfTypedValue tagVa PopulateType(tupleType); mBfIRBuilder->PopulateType(tupleType); + if (tupleType->IsDeleting()) + { + mCompiler->RequestExtraCompile(); + InternalError("TryCaseEnumMatch using deleted type", expr); + return BfTypedValue(); + } + auto boolType = GetPrimitiveType(BfTypeCode_Boolean); tagId = -fieldInstance->mDataIdx - 1;