diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index a8e74067..039b4126 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -11480,8 +11480,7 @@ BfTypedValue BfExprEvaluator::DoImplicitArgCapture(BfAstNode* refNode, BfMethodI lookupVal = mModule->LoadValue(lookupVal); return lookupVal; } - } - BF_ASSERT(methodRefTarget.IsAddr()); + } if (paramType->IsComposite()) return BfTypedValue(mModule->mBfIRBuilder->CreateInBoundsGEP(methodRefTarget.mValue, 0, dataIdx), paramType, true); return BfTypedValue(mModule->ExtractValue(methodRefTarget, dataIdx), paramType); diff --git a/IDEHelper/Compiler/BfIRBuilder.cpp b/IDEHelper/Compiler/BfIRBuilder.cpp index 95307c23..57c74d92 100644 --- a/IDEHelper/Compiler/BfIRBuilder.cpp +++ b/IDEHelper/Compiler/BfIRBuilder.cpp @@ -2627,9 +2627,11 @@ void BfIRBuilder::CreateTypeDeclaration(BfType* type, bool forceDbgDefine) BfMethodInstance* methodInstance = methodRefType->mMethodRef; String name = "_BF_MethodRef_"; - name += BfTypeUtils::HashEncode64(methodInstance->mIdHash).c_str(); - if (wantDIData) + if (methodInstance != NULL) + name += BfTypeUtils::HashEncode64(methodInstance->mIdHash).c_str(); + + if ((wantDIData) && (methodInstance != NULL)) { auto typeDeclaration = methodInstance->GetOwner()->mTypeDef->mTypeDeclaration; diff --git a/IDEHelper/Tests/src/FuncRefs.bf b/IDEHelper/Tests/src/FuncRefs.bf index f63d4eaa..d30e8216 100644 --- a/IDEHelper/Tests/src/FuncRefs.bf +++ b/IDEHelper/Tests/src/FuncRefs.bf @@ -57,6 +57,14 @@ namespace Tests return dlg(val[0]); } + static void TestWrap(T del, bool b = false) where T : delegate void() + { + Action ac = scope () => { + del(); + }; + ac(); + } + [Test] public static void TestBasics() { @@ -78,6 +86,10 @@ namespace Tests List fList = scope .() { 1.2f, 2.3f }; Test.Assert(DoOnListA(fList, (val) => val + 100) == 101.2f); Test.Assert(DoOnListB((val) => val + 200, fList) == 201.2f); + + int a = 222; + TestWrap(() => { a += 100; }); + Test.Assert(a == 322); } struct MethodRefHolder where T : delegate int(int num)