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

Made delete work with 'where alloctype(T) : delete' constraint

This commit is contained in:
Brian Fiete 2025-01-15 11:24:56 -08:00
parent 5f4514211e
commit 4fa46b6a92

View file

@ -4168,44 +4168,70 @@ void BfModule::Visit(BfDeleteStatement* deleteStmt)
if (!val) if (!val)
return; return;
if (val.mType->IsAllocType())
val.mType = val.mType->GetUnderlyingType();
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; auto checkType = val.mType;
if (genericType != NULL) for (int pass = 0; pass < 2; pass++)
{ {
BfGenericParamFlags genericParamFlags = BfGenericParamFlag_None; BfGenericParamType* genericType = NULL;
BfType* typeConstraint = NULL; if (checkType->IsGenericParam())
auto genericParam = GetMergedGenericParamData(genericType, genericParamFlags, typeConstraint); genericType = (BfGenericParamType*)checkType;
if ((checkType->IsPointer()) && (checkType->GetUnderlyingType()->IsGenericParam()))
if (typeConstraint != NULL) genericType = (BfGenericParamType*)checkType->GetUnderlyingType();
checkType = typeConstraint; if ((genericType != NULL) || (checkType->IsUnspecializedType()))
bool canAlwaysDelete = checkType->IsDelegate() || checkType->IsFunction() || checkType->IsArray();
if (auto checkTypeInst = checkType->ToTypeInstance())
{ {
if ((checkTypeInst->IsInstanceOf(mCompiler->mDelegateTypeDef)) || BfGenericParamFlags genericParamFlags = BfGenericParamFlag_None;
(checkTypeInst->IsInstanceOf(mCompiler->mFunctionTypeDef))) BfType* typeConstraint = NULL;
canAlwaysDelete = true; BfGenericParamInstance* genericParam = NULL;
if (genericType != NULL)
genericParam = GetMergedGenericParamData(genericType, genericParamFlags, typeConstraint);
if (genericParam == NULL)
GetMergedGenericParamData(checkType, genericParamFlags, typeConstraint);
if (typeConstraint != NULL)
checkType = typeConstraint;
bool canAlwaysDelete = checkType->IsDelegate() || checkType->IsFunction() || checkType->IsArray();
if (auto checkTypeInst = checkType->ToTypeInstance())
{
if ((checkTypeInst->IsInstanceOf(mCompiler->mDelegateTypeDef)) ||
(checkTypeInst->IsInstanceOf(mCompiler->mFunctionTypeDef)))
canAlwaysDelete = true;
}
if (!canAlwaysDelete)
{
bool success = false;
if (genericParamFlags & (BfGenericParamFlag_Delete | BfGenericParamFlag_Var))
success = true;
else if (genericParamFlags & BfGenericParamFlag_StructPtr)
success = true;
else if ((genericParamFlags & BfGenericParamFlag_Struct) && (checkType->IsPointer()))
success = true;
if (success)
{
if ((pass == 1) && (genericType != NULL))
{
auto genericParamInst = GetGenericParamInstance(genericType);
Warn(0, StrFormat("Must add 'where alloctype(%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 (genericType != NULL)
{
auto genericParamInst = GetGenericParamInstance(genericType);
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 (pass == 0)
if (!canAlwaysDelete)
{ {
if (genericParamFlags & (BfGenericParamFlag_Delete | BfGenericParamFlag_Var)) if (checkType->IsAllocType())
return; checkType = checkType->GetUnderlyingType();
if (genericParamFlags & BfGenericParamFlag_StructPtr) else
return; break;
if ((genericParamFlags & BfGenericParamFlag_Struct) && (checkType->IsPointer()))
return;
auto genericParamInst = GetGenericParamInstance(genericType);
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;
} }
} }