1
0
Fork 0
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:
Brian Fiete 2022-02-22 08:42:41 -08:00
parent c2490278fa
commit e5f280de32
4 changed files with 20 additions and 6 deletions

View file

@ -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);

View file

@ -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);
} }

View file

@ -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;
} }

View file

@ -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);
} }
} }
} }