Bläddra i källkod

Generic resolution fix

Brian Fiete 8 månader sedan
förälder
incheckning
7f9a272e23

+ 10 - 1
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -2344,7 +2344,16 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst
 			// If we allowed this then it would allow too many matches (and allow conversion to any type during CastToValue)
 			// If we allowed this then it would allow too many matches (and allow conversion to any type during CastToValue)
 			goto NoMatch;
 			goto NoMatch;
 		}
 		}
+
+		bool doFullTypeResolve = false;
+		if (returnType->IsUnspecializedTypeVariation())
+		{
+			returnType = typeUnspecMethodInstance->mReturnType;
+			doFullTypeResolve = true;
+		}		
 		if ((genericArgumentsSubstitute != NULL) && (returnType->IsUnspecializedType()))
 		if ((genericArgumentsSubstitute != NULL) && (returnType->IsUnspecializedType()))
+			doFullTypeResolve = true;
+		if (doFullTypeResolve)
 		{
 		{
 			auto resolvedType = mModule->ResolveGenericType(returnType, typeGenericArguments, genericArgumentsSubstitute, mModule->mCurTypeInstance, false);
 			auto resolvedType = mModule->ResolveGenericType(returnType, typeGenericArguments, genericArgumentsSubstitute, mModule->mCurTypeInstance, false);
 			if (resolvedType == NULL)
 			if (resolvedType == NULL)
@@ -6383,7 +6392,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance*
 			mModule->mCurMethodState->mCancelledDeferredCall = true;
 			mModule->mCurMethodState->mCancelledDeferredCall = true;
 	}
 	}
 
 
-	if (methodDef->mIsNoReturn)
+	if ((methodDef->mIsNoReturn) && ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) == 0))
 	{
 	{
 		mModule->mCurMethodState->SetHadReturn(true);
 		mModule->mCurMethodState->SetHadReturn(true);
 		mModule->mCurMethodState->mLeftBlockUncond = true;
 		mModule->mCurMethodState->mLeftBlockUncond = true;

+ 45 - 40
IDEHelper/Compiler/BfModule.cpp

@@ -21653,50 +21653,55 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup,
 			else
 			else
 			{
 			{
 				auto innerMethodDef = innerMethodInstance.mMethodInstance->mMethodDef;
 				auto innerMethodDef = innerMethodInstance.mMethodInstance->mMethodDef;
-				BF_ASSERT(innerMethodDef == methodDef);
-
-				SizedArray<BfIRValue, 8> innerParams;
-				BfExprEvaluator exprEvaluator(this);
-
-				if (!innerType->IsValuelessType())
+				if ((innerMethodDef == methodDef != NULL) && (!CompareMethodSignatures(methodInstance, innerMethodInstance.mMethodInstance)))
 				{
 				{
-					BfIRValue thisValue = mBfIRBuilder->CreateInBoundsGEP(mCurMethodState->mLocals[0]->mValue, 0, 1);
-					BfTypedValue innerVal(thisValue, innerType, true);
-					if (boxedType->IsBoxedStructPtr())
-					{
-						innerVal = LoadValue(innerVal);
-						innerVal = BfTypedValue(innerVal.mValue, innerType, true);
-					}
-
-					exprEvaluator.PushThis(NULL, innerVal, innerMethodInstance.mMethodInstance, innerParams);
-				}
-
-				for (int i = 1; i < (int)mCurMethodState->mLocals.size(); i++)
-				{
-					BfLocalVariable* localVar = mCurMethodState->mLocals[i];
-					BfTypedValue localVal = exprEvaluator.LoadLocal(localVar, true);
-					exprEvaluator.PushArg(localVal, innerParams);
-				}
-				if (!innerMethodInstance.mFunc)
-				{
-					BF_ASSERT(innerType->IsUnspecializedType());
-				}
-				else if ((!mIsComptimeModule) && (methodInstance->GetStructRetIdx() != -1))
-				{
-					mBfIRBuilder->PopulateType(methodInstance->mReturnType);
-					auto returnType = BfTypedValue(mBfIRBuilder->GetArgument(methodInstance->GetStructRetIdx()), methodInstance->mReturnType, true);
-					exprEvaluator.mReceivingValue = &returnType;
-					auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
-					BF_ASSERT(exprEvaluator.mReceivingValue == NULL); // Ensure it was actually used
-					mBfIRBuilder->CreateRetVoid();
+					InternalError("Boxing method passthrough error");
 				}
 				}
 				else
 				else
 				{
 				{
-					mBfIRBuilder->PopulateType(methodInstance->mReturnType);
-					auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
-					if (mCurMethodInstance->mReturnType->IsValueType())
-						retVal = LoadValue(retVal);
-					CreateReturn(retVal.mValue);
+					SizedArray<BfIRValue, 8> innerParams;
+					BfExprEvaluator exprEvaluator(this);
+
+					if (!innerType->IsValuelessType())
+					{
+						BfIRValue thisValue = mBfIRBuilder->CreateInBoundsGEP(mCurMethodState->mLocals[0]->mValue, 0, 1);
+						BfTypedValue innerVal(thisValue, innerType, true);
+						if (boxedType->IsBoxedStructPtr())
+						{
+							innerVal = LoadValue(innerVal);
+							innerVal = BfTypedValue(innerVal.mValue, innerType, true);
+						}
+
+						exprEvaluator.PushThis(NULL, innerVal, innerMethodInstance.mMethodInstance, innerParams);
+					}
+
+					for (int i = 1; i < (int)mCurMethodState->mLocals.size(); i++)
+					{
+						BfLocalVariable* localVar = mCurMethodState->mLocals[i];
+						BfTypedValue localVal = exprEvaluator.LoadLocal(localVar, true);
+						exprEvaluator.PushArg(localVal, innerParams);
+					}
+					if (!innerMethodInstance.mFunc)
+					{
+						BF_ASSERT(innerType->IsUnspecializedType());
+					}
+					else if ((!mIsComptimeModule) && (methodInstance->GetStructRetIdx() != -1))
+					{
+						mBfIRBuilder->PopulateType(methodInstance->mReturnType);
+						auto returnType = BfTypedValue(mBfIRBuilder->GetArgument(methodInstance->GetStructRetIdx()), methodInstance->mReturnType, true);
+						exprEvaluator.mReceivingValue = &returnType;
+						auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
+						BF_ASSERT(exprEvaluator.mReceivingValue == NULL); // Ensure it was actually used
+						mBfIRBuilder->CreateRetVoid();
+					}
+					else
+					{
+						mBfIRBuilder->PopulateType(methodInstance->mReturnType);
+						auto retVal = exprEvaluator.CreateCall(NULL, innerMethodInstance.mMethodInstance, innerMethodInstance.mFunc, true, innerParams, NULL, BfCreateCallFlags_TailCall);
+						if (mCurMethodInstance->mReturnType->IsValueType())
+							retVal = LoadValue(retVal);
+						CreateReturn(retVal.mValue);
+					}
 				}
 				}
 			}
 			}
 		}
 		}

+ 3 - 0
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -3472,6 +3472,9 @@ void BfModule::DoPopulateType_TypeAlias(BfTypeAliasType* typeAlias)
 
 
 void BfModule::DoPopulateType_InitSearches(BfTypeInstance* typeInstance)
 void BfModule::DoPopulateType_InitSearches(BfTypeInstance* typeInstance)
 {
 {
+	if (typeInstance->IsBoxed())
+		return;
+
 	auto typeDef = typeInstance->mTypeDef;
 	auto typeDef = typeInstance->mTypeDef;
 
 
 	auto _AddStaticSearch = [&](BfTypeDef* typeDef)
 	auto _AddStaticSearch = [&](BfTypeDef* typeDef)