mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Fix for unbound generic type lookups
This commit is contained in:
parent
c2490278fa
commit
e5f280de32
4 changed files with 20 additions and 6 deletions
|
@ -10552,6 +10552,12 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
return ResolveTypeResult(typeRef, resolvedEntry->mValue, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, resolvedEntry->mValue, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((lookupCtx.mIsUnboundGeneric) && (lookupCtx.mRootTypeDef != NULL))
|
||||||
|
{
|
||||||
|
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
||||||
|
return ResolveTypeResult(typeRef, ResolveTypeDef(lookupCtx.mRootTypeDef), populateType, resolveFlags);
|
||||||
|
}
|
||||||
|
|
||||||
if ((resolveFlags & BfResolveTypeRefFlag_NoCreate) != 0)
|
if ((resolveFlags & BfResolveTypeRefFlag_NoCreate) != 0)
|
||||||
{
|
{
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
||||||
|
|
|
@ -3146,11 +3146,13 @@ void BfResolvedTypeSet::HashGenericArguments(BfTypeReference* typeRef, LookupCon
|
||||||
{
|
{
|
||||||
for (int genericIdx = 0; genericIdx < BF_MAX(genericTypeRef->mGenericArguments.mSize, genericTypeRef->mCommas.mSize + 1); genericIdx++)
|
for (int genericIdx = 0; genericIdx < BF_MAX(genericTypeRef->mGenericArguments.mSize, genericTypeRef->mCommas.mSize + 1); genericIdx++)
|
||||||
{
|
{
|
||||||
|
bool allowUnboundGeneric = ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowUnboundGeneric) != 0) && (typeRef == ctx->mRootTypeRef);
|
||||||
|
|
||||||
BfAstNode* genericArgTypeRef = NULL;
|
BfAstNode* genericArgTypeRef = NULL;
|
||||||
if (genericIdx < genericTypeRef->mGenericArguments.mSize)
|
if (genericIdx < genericTypeRef->mGenericArguments.mSize)
|
||||||
genericArgTypeRef = genericTypeRef->mGenericArguments[genericIdx];
|
genericArgTypeRef = genericTypeRef->mGenericArguments[genericIdx];
|
||||||
|
|
||||||
if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowUnboundGeneric) != 0)
|
if (allowUnboundGeneric)
|
||||||
{
|
{
|
||||||
if (BfNodeIsExact<BfWildcardTypeReference>(genericArgTypeRef))
|
if (BfNodeIsExact<BfWildcardTypeReference>(genericArgTypeRef))
|
||||||
genericArgTypeRef = NULL;
|
genericArgTypeRef = NULL;
|
||||||
|
@ -3160,14 +3162,15 @@ void BfResolvedTypeSet::HashGenericArguments(BfTypeReference* typeRef, LookupCon
|
||||||
if (genericArgTypeRef != NULL)
|
if (genericArgTypeRef != NULL)
|
||||||
{
|
{
|
||||||
argHashVal = Hash(genericArgTypeRef, ctx, BfHashFlag_AllowGenericParamConstValue, hashSeed + 1);
|
argHashVal = Hash(genericArgTypeRef, ctx, BfHashFlag_AllowGenericParamConstValue, hashSeed + 1);
|
||||||
if ((ctx->mResolveFlags & BfResolveTypeRefFlag_ForceUnboundGeneric) != 0)
|
if ((allowUnboundGeneric) && ((ctx->mResolveFlags & BfResolveTypeRefFlag_ForceUnboundGeneric) != 0))
|
||||||
genericArgTypeRef = NULL;
|
genericArgTypeRef = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (genericArgTypeRef == NULL)
|
if (genericArgTypeRef == NULL)
|
||||||
{
|
{
|
||||||
if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowUnboundGeneric) != 0)
|
if (allowUnboundGeneric)
|
||||||
{
|
{
|
||||||
|
ctx->mIsUnboundGeneric = true;
|
||||||
argHashVal = (((int)BfGenericParamKind_Type + 0xB00) << 8) ^ (genericIdx + 1);
|
argHashVal = (((int)BfGenericParamKind_Type + 0xB00) << 8) ^ (genericIdx + 1);
|
||||||
argHashVal = HASH_MIX(argHashVal, hashSeed + 1);
|
argHashVal = HASH_MIX(argHashVal, hashSeed + 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2608,6 +2608,7 @@ public:
|
||||||
BfCallingConvention mCallingConvention;
|
BfCallingConvention mCallingConvention;
|
||||||
bool mHadVar;
|
bool mHadVar;
|
||||||
bool mFailed;
|
bool mFailed;
|
||||||
|
bool mIsUnboundGeneric;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LookupContext()
|
LookupContext()
|
||||||
|
@ -2619,6 +2620,7 @@ public:
|
||||||
mRootResolvedType = NULL;
|
mRootResolvedType = NULL;
|
||||||
mFailed = false;
|
mFailed = false;
|
||||||
mHadVar = false;
|
mHadVar = false;
|
||||||
|
mIsUnboundGeneric = false;
|
||||||
mResolveFlags = BfResolveTypeRefFlag_None;
|
mResolveFlags = BfResolveTypeRefFlag_None;
|
||||||
mCallingConvention = BfCallingConvention_Unspecified;
|
mCallingConvention = BfCallingConvention_Unspecified;
|
||||||
}
|
}
|
||||||
|
|
|
@ -487,6 +487,9 @@ namespace Tests
|
||||||
b = Foo<int>.value > val;
|
b = Foo<int>.value > val;
|
||||||
b = Foo<int>.Inner<float>.value2 < 1.2f;
|
b = Foo<int>.Inner<float>.value2 < 1.2f;
|
||||||
b = Foo<int>.Inner<float>.value2 > 2.3f;
|
b = Foo<int>.Inner<float>.value2 > 2.3f;
|
||||||
|
|
||||||
|
var t = typeof(Array2<>);
|
||||||
|
t = typeof(Dictionary<,>.Enumerator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue