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

Boxing result change, warning on boxing obj, boxing generics

This commit is contained in:
Brian Fiete 2020-01-30 07:06:16 -08:00
parent 17fbd8f8d6
commit d6566982f2
4 changed files with 60 additions and 27 deletions

View file

@ -4774,13 +4774,16 @@ BfBoxedType* BfModule::CreateBoxedType(BfType* resolvedTypeRef)
}
BfTypeInstance* typeInst = resolvedTypeRef->ToTypeInstance();
if (typeInst == NULL)
if ((typeInst == NULL) && (!resolvedTypeRef->IsGenericParam()))
return NULL;
auto boxedType = mContext->mBoxedTypePool.Get();
boxedType->mContext = mContext;
boxedType->mElementType = typeInst;
boxedType->mTypeDef = boxedType->mElementType->mTypeDef;
boxedType->mElementType = resolvedTypeRef;
if (typeInst != NULL)
boxedType->mTypeDef = typeInst->mTypeDef;
else
boxedType->mTypeDef = mCompiler->mValueTypeTypeDef;
boxedType->mBoxedFlags = isStructPtr ? BfBoxedType::BoxedFlags_StructPtr : BfBoxedType::BoxedFlags_None;
auto resolvedBoxedType = ResolveType(boxedType);
if (resolvedBoxedType != boxedType)
@ -9102,6 +9105,21 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp
}
}
if (typedVal.mType->IsBoxed())
{
BfBoxedType* boxedType = (BfBoxedType*)typedVal.mType;
if (boxedType->mElementType->IsGenericParam())
{
// If we have a boxed generic param, the actual available interfaces constraints won't be
// handled, so we need to pass through again as the root generic param
BfTypedValue unboxedValue = typedVal;
unboxedValue.mType = boxedType->mElementType;
auto result = CastToValue(srcNode, unboxedValue, toType, (BfCastFlags)(castFlags | BfCastFlags_SilentFail), resultFlags);
if (result)
return result;
}
}
if (mayBeBox)
{
BfScopeData* scopeData = NULL;