1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 20:42:21 +02:00

Better fix for int unknown generic inference

This commit is contained in:
Brian Fiete 2021-01-19 12:33:49 -08:00
parent 20d8ae279c
commit b9c2d1b54f
3 changed files with 25 additions and 24 deletions

View file

@ -319,9 +319,7 @@ bool BfGenericInferContext::InferGenericArgument(BfMethodInstance* methodInstanc
}
}
if ((*mCheckMethodGenericArguments)[wantGenericParam->mGenericParamIdx] == NULL)
mInferredCount++;
if ((argType != NULL) && (argType->IsIntUnknown()))
argType = mModule->FixIntUnknown(argType);
mInferredCount++;
(*mCheckMethodGenericArguments)[wantGenericParam->mGenericParamIdx] = argType;
if (!mPrevArgValues.IsEmpty())
mPrevArgValues[wantGenericParam->mGenericParamIdx] = argValue;
@ -1332,7 +1330,7 @@ BfTypedValue BfMethodMatcher::ResolveArgTypedValue(BfResolvedArg& resolvedArg, B
auto prevBlock = mModule->mBfIRBuilder->GetInsertBlock();
BfExprEvaluator exprEvaluator(mModule);
exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(mBfEvalExprFlags & BfEvalExprFlags_Comptime);
exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(mBfEvalExprFlags & BfEvalExprFlags_InheritFlags);
exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | BfEvalExprFlags_AllowIntUnknown | BfEvalExprFlags_NoAutoComplete);
if ((resolvedArg.mArgFlags & BfArgFlag_ParamsExpr) != 0)
exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | BfEvalExprFlags_AllowParamsExpr);
@ -2902,6 +2900,9 @@ BfType* BfExprEvaluator::BindGenericType(BfAstNode* node, BfType* bindType)
if ((mModule->mCurMethodState->mClosureState != NULL) && (mModule->mCurMethodState->mClosureState->mCapturing))
return bindType;
if ((mBfEvalExprFlags & BfEvalExprFlags_DeclType) != 0)
return bindType;
BF_ASSERT(!mModule->mCurMethodInstance->mIsUnspecializedVariation);
auto parser = node->GetSourceData()->ToParserData();
@ -7343,7 +7344,7 @@ BfTypedValue BfExprEvaluator::ResolveArgValue(BfResolvedArg& resolvedArg, BfType
{
BfExprEvaluator exprEvaluator(mModule);
exprEvaluator.mReceivingValue = receivingValue;
BfEvalExprFlags flags = (BfEvalExprFlags)((mBfEvalExprFlags & (BfEvalExprFlags_NoAutoComplete | BfEvalExprFlags_Comptime)) | BfEvalExprFlags_NoCast);
BfEvalExprFlags flags = (BfEvalExprFlags)((mBfEvalExprFlags & BfEvalExprFlags_InheritFlags) | BfEvalExprFlags_NoCast);
if ((paramKind == BfParamKind_Params) || (paramKind == BfParamKind_DelegateParam))
flags = (BfEvalExprFlags)(flags | BfEvalExprFlags_AllowParamsExpr);
@ -14444,24 +14445,20 @@ BfModuleMethodInstance BfExprEvaluator::GetSelectedMethod(BfAstNode* targetSrc,
genericArg = genericParam->mTypeConstraint;
else
genericArg = mModule->mContext->mBfObjectType;
}
resolvedGenericArguments.push_back(genericArg);
}
}
else
{
if (genericArg->IsVar())
{
BF_ASSERT(methodMatcher.mHasVarArguments);
hasVarGenerics = true;
}
if (genericArg->IsIntUnknown())
genericArg = mModule->GetPrimitiveType(BfTypeCode_IntPtr);
auto resolvedGenericArg = genericArg;
resolvedGenericArguments.push_back(resolvedGenericArg);
if (genericArg->IsVar())
{
BF_ASSERT(methodMatcher.mHasVarArguments);
hasVarGenerics = true;
}
if (genericArg->IsIntUnknown())
genericArg = mModule->FixIntUnknown(genericArg);
auto resolvedGenericArg = genericArg;
resolvedGenericArguments.push_back(genericArg);
}
BfTypeInstance* foreignType = NULL;
@ -18015,7 +18012,7 @@ void BfExprEvaluator::InitializedSizedArray(BfSizedArrayType* arrayType, BfToken
if (expr != NULL)
{
auto evalFlags = (BfEvalExprFlags)(mBfEvalExprFlags & BfEvalExprFlags_Comptime);
auto evalFlags = (BfEvalExprFlags)(mBfEvalExprFlags & BfEvalExprFlags_InheritFlags);
bool tryDefer = false;
if ((checkArrayType->IsComposite()) &&

View file

@ -78,6 +78,8 @@ enum BfEvalExprFlags
BfEvalExprFlags_InferReturnType = 0x400000,
BfEvalExprFlags_WasMethodRef = 0x800000,
BfEvalExprFlags_DeclType = 0x1000000,
BfEvalExprFlags_InheritFlags = BfEvalExprFlags_NoAutoComplete | BfEvalExprFlags_Comptime | BfEvalExprFlags_DeclType
};
enum BfCastFlags

View file

@ -7087,20 +7087,22 @@ BfType* BfModule::ResolveGenericType(BfType* unspecializedType, BfTypeVector* ty
if ((genericParam->mGenericParamKind == BfGenericParamKind_Type) && (typeGenericArguments != NULL))
{
if (genericParam->mGenericParamIdx < (int)typeGenericArguments->size())
return (*typeGenericArguments)[genericParam->mGenericParamIdx];
return FixIntUnknown((*typeGenericArguments)[genericParam->mGenericParamIdx]);
BF_ASSERT(allowFail);
}
if ((genericParam->mGenericParamKind == BfGenericParamKind_Method) && (methodGenericArguments != NULL))
{
if (genericParam->mGenericParamIdx < (int)methodGenericArguments->size())
return (*methodGenericArguments)[genericParam->mGenericParamIdx];
return FixIntUnknown((*methodGenericArguments)[genericParam->mGenericParamIdx]);
BF_ASSERT(allowFail);
}
return unspecializedType;
}
if (!unspecializedType->IsUnspecializedType())
{
return unspecializedType;
}
if (unspecializedType->IsUnknownSizedArrayType())
{