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:
parent
20d8ae279c
commit
b9c2d1b54f
3 changed files with 25 additions and 24 deletions
|
@ -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()) &&
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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())
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue