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

Generic resolution fix

This commit is contained in:
Brian Fiete 2025-01-02 13:33:45 -08:00
parent 5d55409841
commit 7f9a272e23
3 changed files with 58 additions and 41 deletions

View file

@ -2344,7 +2344,16 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst
// If we allowed this then it would allow too many matches (and allow conversion to any type during CastToValue) // If we allowed this then it would allow too many matches (and allow conversion to any type during CastToValue)
goto NoMatch; goto NoMatch;
} }
bool doFullTypeResolve = false;
if (returnType->IsUnspecializedTypeVariation())
{
returnType = typeUnspecMethodInstance->mReturnType;
doFullTypeResolve = true;
}
if ((genericArgumentsSubstitute != NULL) && (returnType->IsUnspecializedType())) if ((genericArgumentsSubstitute != NULL) && (returnType->IsUnspecializedType()))
doFullTypeResolve = true;
if (doFullTypeResolve)
{ {
auto resolvedType = mModule->ResolveGenericType(returnType, typeGenericArguments, genericArgumentsSubstitute, mModule->mCurTypeInstance, false); auto resolvedType = mModule->ResolveGenericType(returnType, typeGenericArguments, genericArgumentsSubstitute, mModule->mCurTypeInstance, false);
if (resolvedType == NULL) if (resolvedType == NULL)
@ -6383,7 +6392,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance*
mModule->mCurMethodState->mCancelledDeferredCall = true; mModule->mCurMethodState->mCancelledDeferredCall = true;
} }
if (methodDef->mIsNoReturn) if ((methodDef->mIsNoReturn) && ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) == 0))
{ {
mModule->mCurMethodState->SetHadReturn(true); mModule->mCurMethodState->SetHadReturn(true);
mModule->mCurMethodState->mLeftBlockUncond = true; mModule->mCurMethodState->mLeftBlockUncond = true;

View file

@ -21653,50 +21653,55 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup,
else else
{ {
auto innerMethodDef = innerMethodInstance.mMethodInstance->mMethodDef; auto innerMethodDef = innerMethodInstance.mMethodInstance->mMethodDef;
BF_ASSERT(innerMethodDef == methodDef); if ((innerMethodDef == methodDef != NULL) && (!CompareMethodSignatures(methodInstance, innerMethodInstance.mMethodInstance)))
SizedArray<BfIRValue, 8> innerParams;
BfExprEvaluator exprEvaluator(this);
if (!innerType->IsValuelessType())
{ {
BfIRValue thisValue = mBfIRBuilder->CreateInBoundsGEP(mCurMethodState->mLocals[0]->mValue, 0, 1); InternalError("Boxing method passthrough error");
BfTypedValue innerVal(thisValue, innerType, true);
if (boxedType->IsBoxedStructPtr())
{
innerVal = LoadValue(innerVal);
innerVal = BfTypedValue(innerVal.mValue, innerType, true);
}
exprEvaluator.PushThis(NULL, innerVal, innerMethodInstance.mMethodInstance, innerParams);
}
for (int i = 1; i < (int)mCurMethodState->mLocals.size(); i++)
{
BfLocalVariable* localVar = mCurMethodState->mLocals[i];
BfTypedValue localVal = exprEvaluator.LoadLocal(localVar, true);
exprEvaluator.PushArg(localVal, innerParams);
}
if (!innerMethodInstance.mFunc)
{
BF_ASSERT(innerType->IsUnspecializedType());
}
else if ((!mIsComptimeModule) && (methodInstance->GetStructRetIdx() != -1))
{
mBfIRBuilder->PopulateType(methodInstance->mReturnType);
auto returnType = BfTypedValue(mBfIRBuilder->GetArgument(methodInstance->GetStructRetIdx()), methodInstance->mReturnType, true);
exprEvaluator.mReceivingValue = &returnType;
auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
BF_ASSERT(exprEvaluator.mReceivingValue == NULL); // Ensure it was actually used
mBfIRBuilder->CreateRetVoid();
} }
else else
{ {
mBfIRBuilder->PopulateType(methodInstance->mReturnType); SizedArray<BfIRValue, 8> innerParams;
auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall); BfExprEvaluator exprEvaluator(this);
if (mCurMethodInstance->mReturnType->IsValueType())
retVal = LoadValue(retVal); if (!innerType->IsValuelessType())
CreateReturn(retVal.mValue); {
BfIRValue thisValue = mBfIRBuilder->CreateInBoundsGEP(mCurMethodState->mLocals[0]->mValue, 0, 1);
BfTypedValue innerVal(thisValue, innerType, true);
if (boxedType->IsBoxedStructPtr())
{
innerVal = LoadValue(innerVal);
innerVal = BfTypedValue(innerVal.mValue, innerType, true);
}
exprEvaluator.PushThis(NULL, innerVal, innerMethodInstance.mMethodInstance, innerParams);
}
for (int i = 1; i < (int)mCurMethodState->mLocals.size(); i++)
{
BfLocalVariable* localVar = mCurMethodState->mLocals[i];
BfTypedValue localVal = exprEvaluator.LoadLocal(localVar, true);
exprEvaluator.PushArg(localVal, innerParams);
}
if (!innerMethodInstance.mFunc)
{
BF_ASSERT(innerType->IsUnspecializedType());
}
else if ((!mIsComptimeModule) && (methodInstance->GetStructRetIdx() != -1))
{
mBfIRBuilder->PopulateType(methodInstance->mReturnType);
auto returnType = BfTypedValue(mBfIRBuilder->GetArgument(methodInstance->GetStructRetIdx()), methodInstance->mReturnType, true);
exprEvaluator.mReceivingValue = &returnType;
auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
BF_ASSERT(exprEvaluator.mReceivingValue == NULL); // Ensure it was actually used
mBfIRBuilder->CreateRetVoid();
}
else
{
mBfIRBuilder->PopulateType(methodInstance->mReturnType);
auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
if (mCurMethodInstance->mReturnType->IsValueType())
retVal = LoadValue(retVal);
CreateReturn(retVal.mValue);
}
} }
} }
} }

View file

@ -3472,6 +3472,9 @@ void BfModule::DoPopulateType_TypeAlias(BfTypeAliasType* typeAlias)
void BfModule::DoPopulateType_InitSearches(BfTypeInstance* typeInstance) void BfModule::DoPopulateType_InitSearches(BfTypeInstance* typeInstance)
{ {
if (typeInstance->IsBoxed())
return;
auto typeDef = typeInstance->mTypeDef; auto typeDef = typeInstance->mTypeDef;
auto _AddStaticSearch = [&](BfTypeDef* typeDef) auto _AddStaticSearch = [&](BfTypeDef* typeDef)