diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index 433d29c8..eb071580 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -766,7 +766,7 @@ BfType * BfContext::FindTypeById(int typeId) void BfContext::AddTypeToWorkList(BfType* type) { - BF_ASSERT(!mAssertOnPopulateType); + //BF_ASSERT(!mAssertOnPopulateType); BF_ASSERT((type->mRebuildFlags & BfTypeRebuildFlag_InTempPool) == 0); if ((type->mRebuildFlags & BfTypeRebuildFlag_AddedToWorkList) == 0) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index c22e5fc2..4113d6a2 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -6865,10 +6865,26 @@ bool BfModule::CheckGenericConstraints(const BfGenericParamSource& genericParamS { if (checkTypeInst->IsObjectOrStruct()) { - auto ctorClear = GetRawMethodByName(checkTypeInst, "__BfCtor", 0); - if (ctorClear->mMethodDef->mProtection == BfProtection_Public) - canAlloc = true; - else if ((ctorClear->mMethodDef->mProtection == BfProtection_Protected) && (mCurTypeInstance != NULL)) + checkTypeInst->mTypeDef->PopulateMemberSets(); + BfMemberSetEntry* entry = NULL; + BfMethodDef* checkMethodDef = NULL; + checkTypeInst->mTypeDef->mMethodSet.TryGetWith(String("__BfCtor"), &entry); + if (entry != NULL) + checkMethodDef = (BfMethodDef*)entry->mMemberDef; + bool hadProtected = false; + while (checkMethodDef != NULL) + { + if (checkMethodDef->mProtection == BfProtection_Public) + { + canAlloc = true; + break; + } + if (checkMethodDef->mProtection == BfProtection_Protected) + hadProtected = true; + checkMethodDef = checkMethodDef->mNextWithSameName; + } + + if ((!canAlloc) && (hadProtected) && (mCurTypeInstance != NULL)) canAlloc = TypeIsSubTypeOf(mCurTypeInstance, checkTypeInst, false); } } @@ -9024,8 +9040,9 @@ BfMethodInstance* BfModule::GetRawMethodInstanceAtIdx(BfTypeInstance* typeInstan { if (!mCompiler->mIsResolveOnly) { - BF_ASSERT((methodGroup.mOnDemandKind == BfMethodOnDemandKind_NoDecl_AwaitingReference) || (methodGroup.mOnDemandKind == BfMethodOnDemandKind_Decl_AwaitingDecl)); - methodGroup.mOnDemandKind = BfMethodOnDemandKind_Decl_AwaitingDecl; + BF_ASSERT((methodGroup.mOnDemandKind == BfMethodOnDemandKind_NoDecl_AwaitingReference) || (methodGroup.mOnDemandKind == BfMethodOnDemandKind_Decl_AwaitingDecl) || (typeInstance->mTypeFailed)); + if ((methodGroup.mOnDemandKind == BfMethodOnDemandKind_NoDecl_AwaitingReference) || (methodGroup.mOnDemandKind == BfMethodOnDemandKind_Decl_AwaitingDecl)) + methodGroup.mOnDemandKind = BfMethodOnDemandKind_Decl_AwaitingDecl; // Get it from the owning module so we don't create a reference prematurely... auto declModule = typeInstance->mModule;