1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 12:32:20 +02:00

Fixed some issues with new/delete generic constraints

This commit is contained in:
Brian Fiete 2020-02-20 11:57:25 -08:00
parent a781f29c31
commit c2c2c24ac8
9 changed files with 99 additions and 26 deletions

View file

@ -3636,16 +3636,37 @@ void BfModule::Visit(BfDeleteStatement* deleteStmt)
if (!val)
return;
auto checkType = val.mType;
BfGenericParamType* genericType = NULL;
if (val.mType->IsGenericParam())
genericType = (BfGenericParamType*)val.mType;
if ((val.mType->IsPointer()) && (val.mType->GetUnderlyingType()->IsGenericParam()))
genericType = (BfGenericParamType*)val.mType->GetUnderlyingType();
auto checkType = val.mType;
if (genericType != NULL)
{
auto genericParamInst = GetGenericParamInstance((BfGenericParamType*)checkType);
auto genericParamInst = GetGenericParamInstance(genericType);
if (genericParamInst->mTypeConstraint != NULL)
checkType = genericParamInst->mTypeConstraint;
if (genericParamInst->mGenericParamFlags & (BfGenericParamFlag_Delete | BfGenericParamFlag_Var))
return;
}
bool canAlwaysDelete = checkType->IsDelegate() || checkType->IsFunction() || checkType->IsArray();
if (auto checkTypeInst = checkType->ToTypeInstance())
{
if ((checkTypeInst->mTypeDef == mCompiler->mDelegateTypeDef) ||
(checkTypeInst->mTypeDef == mCompiler->mFunctionTypeDef))
canAlwaysDelete = true;
}
if (!canAlwaysDelete)
{
if (genericParamInst->mGenericParamFlags & (BfGenericParamFlag_Delete | BfGenericParamFlag_Var))
return;
Fail(StrFormat("Must add 'where %s : delete' constraint to generic parameter to delete generic type '%s'",
genericParamInst->GetGenericParamDef()->mName.c_str(), TypeToString(val.mType).c_str()), deleteStmt->mExpression);
return;
}
}
if (checkType->IsVar())
{
// Mixin or unconstrained generic