mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Fix extern method constraints that end up not being extern
This commit is contained in:
parent
a277fa18cf
commit
1b7dbd7288
2 changed files with 26 additions and 2 deletions
|
@ -2282,6 +2282,22 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (externType->IsGenericParam())
|
||||||
|
{
|
||||||
|
auto genericParamType = (BfGenericParamType*)externType;
|
||||||
|
if (genericParamType->mGenericParamKind == BfGenericParamKind_Method)
|
||||||
|
{
|
||||||
|
auto genericArg = (*genericArgumentsSubstitute)[genericParamType->mGenericParamIdx];
|
||||||
|
if (genericArg == NULL)
|
||||||
|
{
|
||||||
|
if (allowEmptyGenericSet.Contains(genericParamType->mGenericParamIdx))
|
||||||
|
continue;
|
||||||
|
goto NoMatch;
|
||||||
|
}
|
||||||
|
externType = genericArg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!mModule->CheckGenericConstraints(BfGenericParamSource(methodInstance), externType, NULL, genericParam, externGenericArgumentsSubstitute, NULL))
|
if (!mModule->CheckGenericConstraints(BfGenericParamSource(methodInstance), externType, NULL, genericParam, externGenericArgumentsSubstitute, NULL))
|
||||||
goto NoMatch;
|
goto NoMatch;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8451,6 +8451,9 @@ BfGenericParamInstance* BfModule::GetGenericTypeParamInstance(int genericParamId
|
||||||
|
|
||||||
if (genericParamIdx >= (int)genericTypeInst->mGenericTypeInfo->mTypeGenericArguments.size())
|
if (genericParamIdx >= (int)genericTypeInst->mGenericTypeInfo->mTypeGenericArguments.size())
|
||||||
{
|
{
|
||||||
|
if (genericParamIdx >= genericTypeInst->mGenericTypeInfo->mGenericParams.mSize)
|
||||||
|
FatalError("Invalid GetGenericTypeParamInstance");
|
||||||
|
|
||||||
// Extern constraints should always be directly used - they don't get extended
|
// Extern constraints should always be directly used - they don't get extended
|
||||||
return genericTypeInst->mGenericTypeInfo->mGenericParams[genericParamIdx];
|
return genericTypeInst->mGenericTypeInfo->mGenericParams[genericParamIdx];
|
||||||
}
|
}
|
||||||
|
@ -8473,7 +8476,7 @@ BfGenericParamInstance* BfModule::GetGenericTypeParamInstance(int genericParamId
|
||||||
{
|
{
|
||||||
if ((mCompiler->mResolvePassData == NULL) || (mCompiler->mResolvePassData->mAutoComplete == NULL))
|
if ((mCompiler->mResolvePassData == NULL) || (mCompiler->mResolvePassData->mAutoComplete == NULL))
|
||||||
{
|
{
|
||||||
BFMODULE_FATAL(this, "Invalid GetGenericParamInstance with extension");
|
FatalError("Invalid GetGenericParamInstance with extension");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8562,7 +8565,12 @@ BfGenericParamInstance* BfModule::GetMergedGenericParamData(BfGenericParamType*
|
||||||
BfGenericParamInstance* BfModule::GetGenericParamInstance(BfGenericParamType* type)
|
BfGenericParamInstance* BfModule::GetGenericParamInstance(BfGenericParamType* type)
|
||||||
{
|
{
|
||||||
if (type->mGenericParamKind == BfGenericParamKind_Method)
|
if (type->mGenericParamKind == BfGenericParamKind_Method)
|
||||||
{
|
{
|
||||||
|
if ((mCurMethodInstance->mMethodInfoEx == NULL) || (type->mGenericParamIdx >= mCurMethodInstance->mMethodInfoEx->mGenericParams.mSize))
|
||||||
|
{
|
||||||
|
FatalError("Invalid GetGenericParamInstance method generic param");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return mCurMethodInstance->mMethodInfoEx->mGenericParams[type->mGenericParamIdx];
|
return mCurMethodInstance->mMethodInfoEx->mGenericParams[type->mGenericParamIdx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue