1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +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

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

View file

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

View file

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