mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Made delete work with 'where alloctype(T) : delete' constraint
This commit is contained in:
parent
5f4514211e
commit
4fa46b6a92
1 changed files with 62 additions and 36 deletions
|
@ -4167,47 +4167,73 @@ void BfModule::Visit(BfDeleteStatement* deleteStmt)
|
||||||
auto val = CreateValueFromExpression(deleteStmt->mExpression);
|
auto val = CreateValueFromExpression(deleteStmt->mExpression);
|
||||||
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()))
|
||||||
|
genericType = (BfGenericParamType*)checkType->GetUnderlyingType();
|
||||||
|
if ((genericType != NULL) || (checkType->IsUnspecializedType()))
|
||||||
|
{
|
||||||
|
BfGenericParamFlags genericParamFlags = BfGenericParamFlag_None;
|
||||||
|
BfType* typeConstraint = NULL;
|
||||||
|
BfGenericParamInstance* genericParam = NULL;
|
||||||
|
if (genericType != NULL)
|
||||||
|
genericParam = GetMergedGenericParamData(genericType, genericParamFlags, typeConstraint);
|
||||||
|
if (genericParam == NULL)
|
||||||
|
GetMergedGenericParamData(checkType, genericParamFlags, typeConstraint);
|
||||||
|
|
||||||
if (typeConstraint != NULL)
|
if (typeConstraint != NULL)
|
||||||
checkType = typeConstraint;
|
checkType = typeConstraint;
|
||||||
bool canAlwaysDelete = checkType->IsDelegate() || checkType->IsFunction() || checkType->IsArray();
|
bool canAlwaysDelete = checkType->IsDelegate() || checkType->IsFunction() || checkType->IsArray();
|
||||||
if (auto checkTypeInst = checkType->ToTypeInstance())
|
if (auto checkTypeInst = checkType->ToTypeInstance())
|
||||||
{
|
{
|
||||||
if ((checkTypeInst->IsInstanceOf(mCompiler->mDelegateTypeDef)) ||
|
if ((checkTypeInst->IsInstanceOf(mCompiler->mDelegateTypeDef)) ||
|
||||||
(checkTypeInst->IsInstanceOf(mCompiler->mFunctionTypeDef)))
|
(checkTypeInst->IsInstanceOf(mCompiler->mFunctionTypeDef)))
|
||||||
canAlwaysDelete = true;
|
canAlwaysDelete = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!canAlwaysDelete)
|
if (!canAlwaysDelete)
|
||||||
{
|
{
|
||||||
if (genericParamFlags & (BfGenericParamFlag_Delete | BfGenericParamFlag_Var))
|
bool success = false;
|
||||||
return;
|
if (genericParamFlags & (BfGenericParamFlag_Delete | BfGenericParamFlag_Var))
|
||||||
if (genericParamFlags & BfGenericParamFlag_StructPtr)
|
success = true;
|
||||||
return;
|
else if (genericParamFlags & BfGenericParamFlag_StructPtr)
|
||||||
if ((genericParamFlags & BfGenericParamFlag_Struct) && (checkType->IsPointer()))
|
success = true;
|
||||||
return;
|
else if ((genericParamFlags & BfGenericParamFlag_Struct) && (checkType->IsPointer()))
|
||||||
auto genericParamInst = GetGenericParamInstance(genericType);
|
success = true;
|
||||||
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);
|
if (success)
|
||||||
return;
|
{
|
||||||
|
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 (checkType->IsAllocType())
|
||||||
|
checkType = checkType->GetUnderlyingType();
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (checkType->IsVar())
|
if (checkType->IsVar())
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue