From 4188f607c7c79d7256dfd3887e2425a71b31414b Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 1 Nov 2021 09:30:37 -0700 Subject: [PATCH] Method selection fix with extern constraint subsets, prim default ctor --- IDEHelper/Compiler/BfExprEvaluator.cpp | 11 ++++++++++- IDEHelper/Compiler/BfModule.cpp | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index f52f20ae..36b71ead 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -1102,7 +1102,7 @@ void BfMethodMatcher::CompareMethods(BfMethodInstance* prevMethodInstance, BfTyp for (auto kv : externConstraints) { - SET_BETTER_OR_WORSE(mModule->AreConstraintsSubset(kv.mValue.mParams[1], kv.mValue.mParams[0]), mModule->AreConstraintsSubset(kv.mValue.mParams[0], kv.mValue.mParams[1])); + SET_BETTER_OR_WORSE(mModule->AreConstraintsSubset(kv.mValue.mParams[0], kv.mValue.mParams[1]), mModule->AreConstraintsSubset(kv.mValue.mParams[1], kv.mValue.mParams[0])); } if ((isBetter) || (isWorse)) @@ -8127,6 +8127,8 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp { if (targetType->IsWrappableType()) { + if ((targetType->IsPrimitiveType()) && (methodName.IsEmpty())) + return mModule->GetDefaultTypedValue(targetType); targetTypeInst = mModule->GetWrappedStructType(targetType); } else if (targetType->IsGenericParam()) @@ -8518,6 +8520,9 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp { FinishDeferredEvals(argValues); + if (argValues.mResolvedArgs.IsEmpty()) + return mModule->GetDefaultTypedValue(refType); + if (argValues.mResolvedArgs.size() != 1) { mModule->Fail("Cast requires one parameter", targetSrc); @@ -16179,6 +16184,10 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m // Silently allow gaveUnqualifiedDotError = true; } + else if (expectingType->IsPrimitiveType()) + { + // Allow + } else { gaveUnqualifiedDotError = true; diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 0dd189e3..4b4d0ce2 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -7770,7 +7770,7 @@ bool BfModule::CheckGenericConstraints(const BfGenericParamSource& genericParamS { canAlloc = (checkGenericParamFlags & (BfGenericParamFlag_New | BfGenericParamFlag_Var)) != 0; } - else + else if (checkArgType->IsPrimitiveType()) { // Any primitive types and stuff can be allocated canAlloc = true;