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

Improved generic inference from constraints

This commit is contained in:
Brian Fiete 2021-06-28 11:40:50 -07:00
parent 9875d3a12d
commit 1312272184
2 changed files with 7 additions and 21 deletions

View file

@ -242,19 +242,9 @@ bool BfGenericInferContext::InferGenericArgument(BfMethodInstance* methodInstanc
{
if (argType == NULL)
return false;
if (mIgnoreMethodGenericParam)
{
if (argType->IsGenericParam())
{
auto genericParamType = (BfGenericParamType*)argType;
if (genericParamType->mGenericParamKind == BfGenericParamKind_Method)
return false;
}
}
if (!wantType->IsUnspecializedType())
return true;
return true;
bool alreadyChecked = false;
auto _AddToCheckedSet = [](BfType* type, HashSet<BfType*>& checkedTypeSet, bool& alreadyChecked)
@ -629,16 +619,14 @@ bool BfGenericInferContext::InferGenericArguments(BfMethodInstance* methodInstan
BfGenericParamInstance* genericParam = NULL;
if (genericParamType->mGenericParamKind == BfGenericParamKind_Method)
genericParam = methodInstance->mMethodInfoEx->mGenericParams[genericParamType->mGenericParamIdx];
genericParam = mModule->mCurMethodInstance->mMethodInfoEx->mGenericParams[genericParamType->mGenericParamIdx];
else
genericParam = mModule->GetGenericParamInstance(genericParamType);
// Generic arg references in constraints refer to the caller, not the callee -- so ignore those
SetAndRestoreValue<bool> prevIgnoreMethodGenericArg(mIgnoreMethodGenericParam, true);
if (genericParam->mTypeConstraint != NULL)
InferGenericArgument(methodInstance, genericParam->mTypeConstraint, ifaceConstraint, BfIRValue());
for (auto argIfaceConstraint : genericParam->mInterfaceConstraints)
InferGenericArgument(methodInstance, argIfaceConstraint, ifaceConstraint, BfIRValue());
InferGenericArgument(methodInstance, argIfaceConstraint, ifaceConstraint, BfIRValue());
}
}
}

View file

@ -137,15 +137,13 @@ public:
BfModule* mModule;
BfTypeVector* mCheckMethodGenericArguments;
SizedArray<BfIRValue, 4> mPrevArgValues;
int mInferredCount;
bool mIgnoreMethodGenericParam;
int mInferredCount;
public:
BfGenericInferContext()
{
mModule = NULL;
mInferredCount = 0;
mIgnoreMethodGenericParam = false;
mInferredCount = 0;
}
bool InferGenericArgument(BfMethodInstance* methodInstance, BfType* argType, BfType* wantType, BfIRValue argValue);
int GetUnresolvedCount()