diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 19dea090..6863b4ce 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -8397,6 +8397,9 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp needsMut = false; } + if ((mFunctionBindResult != NULL) && (mFunctionBindResult->mSkipMutCheck)) + needsMut = false; + if (needsMut) { String err = StrFormat("call mutating method '%s' on", mModule->MethodToString(moduleMethodInstance.mMethodInstance).c_str()); @@ -10748,8 +10751,12 @@ void BfExprEvaluator::Visit(BfDelegateBindExpression* delegateBindExpr) result = mModule->mBfIRBuilder->CreatePtrToInt(funcValue, BfTypeCode_IntPtr); } } - else + else if ((bindResult.mOrigTarget) && (bindResult.mOrigTarget.mType->IsGenericParam()) && (bindResult.mMethodInstance->GetOwner()->IsInterface())) { + result = mModule->mBfIRBuilder->GetFakeVal(); + } + else + { result = mModule->CastToFunction(delegateBindExpr->mTarget, bindResult.mOrigTarget, bindResult.mMethodInstance, mExpectingType); } if (result) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index b171624a..72269233 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -3813,7 +3813,7 @@ bool BfResolvedTypeSet::Equals(BfType* lhs, BfTypeReference* rhs, LookupContext* bool isMutating = true; int paramRefOfs = 0; - if (!rhsDelegateType->mParams.IsEmpty()) + if ((!rhsDelegateType->mParams.IsEmpty()) && (lhs->IsFunction())) { auto param0 = rhsDelegateType->mParams[0]; if ((param0->mNameNode != NULL) && (param0->mNameNode->Equals("this")))