1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Fix for generic constraints checking with mixins

This commit is contained in:
Brian Fiete 2020-06-20 09:49:30 -07:00
parent e865e675a7
commit 1e7bd7d43f
2 changed files with 77 additions and 0 deletions

View file

@ -6836,6 +6836,52 @@ bool BfModule::CheckGenericConstraints(const BfGenericParamSource& genericParamS
return false;
}
}
if ((genericParamInst->mGenericParamFlags & BfGenericParamFlag_Delete) != 0)
{
bool canDelete = false;
if (checkArgType->IsPointer())
canDelete = true;
else if (checkArgType->IsObjectOrInterface())
canDelete = true;
if (!canDelete)
{
if (!ignoreErrors)
*errorOut = Fail(StrFormat("The type '%s' must be a deletable type in order to use it as parameter '%s' for '%s'",
_TypeToString(origCheckArgType).c_str(), genericParamInst->GetName().c_str(), GenericParamSourceToString(genericParamSource).c_str()), checkArgTypeRef);
return false;
}
}
if ((genericParamInst->mGenericParamFlags & BfGenericParamFlag_New) != 0)
{
bool canAlloc = false;
if (auto checkTypeInst = checkArgType->ToTypeInstance())
{
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))
canAlloc = TypeIsSubTypeOf(mCurTypeInstance, checkTypeInst, false);
}
}
else
{
// Any primitive types and stuff can be allocated
canAlloc = true;
}
if (!canAlloc)
{
if (!ignoreErrors)
*errorOut = Fail(StrFormat("The type '%s' must have an accessible default constructor in order to use it as parameter '%s' for '%s'",
_TypeToString(origCheckArgType).c_str(), genericParamInst->GetName().c_str(), GenericParamSourceToString(genericParamSource).c_str()), checkArgTypeRef);
return false;
}
}
if ((genericParamInst->mInterfaceConstraints.IsEmpty()) && (genericParamInst->mOperatorConstraints.IsEmpty()) && (genericParamInst->mTypeConstraint == NULL))
return true;
@ -12101,6 +12147,12 @@ BfModuleMethodInstance BfModule::GetMethodInstance(BfTypeInstance* typeInst, BfM
SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(declareModule->mCurTypeInstance, typeInst);
SetAndRestoreValue<BfFilePosition> prevFilePos(declareModule->mCurFilePosition);
if ((methodDef->mMethodType == BfMethodType_Mixin) && (methodDef->mGenericParams.size() != 0) && (!isUnspecializedPass))
{
// For mixins we only process the unspecialized version
addToWorkList = false;
}
declareModule->DoMethodDeclaration(methodDef->GetMethodDeclaration(), false, addToWorkList);
if (processNow)