diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index be2501ee..1e7c4853 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -22502,10 +22502,18 @@ BfModuleMethodInstance BfModule::GetLocalMethodInstance(BfLocalMethod* localMeth } } - // Keep outs for being marked as assigned + // Keep outs from being marked as assigned auto rootMethodState = mCurMethodState->GetRootMethodState(); BfDeferredLocalAssignData deferredLocalAssignData(rootMethodState->mCurScope); deferredLocalAssignData.mVarIdBarrier = rootMethodState->mCurLocalVarId; + if (rootMethodState->mDeferredLocalAssignData != NULL) + { + auto prevDLA = rootMethodState->mDeferredLocalAssignData; + while ((prevDLA != NULL) && (prevDLA->mIsChained)) + prevDLA = prevDLA->mChainedAssignData; + deferredLocalAssignData.mAssignedLocals = prevDLA->mAssignedLocals; + deferredLocalAssignData.mLeftBlockUncond = prevDLA->mLeftBlockUncond; + } SetAndRestoreValue prevDLA(rootMethodState->mDeferredLocalAssignData, &deferredLocalAssignData); if (!mIgnoreErrors) localMethod->mDidBodyErrorPass = true; diff --git a/IDEHelper/Tests/src/LocalFunctions.bf b/IDEHelper/Tests/src/LocalFunctions.bf index 937afa99..ac9b283d 100644 --- a/IDEHelper/Tests/src/LocalFunctions.bf +++ b/IDEHelper/Tests/src/LocalFunctions.bf @@ -347,22 +347,29 @@ namespace Tests public static void TestL() { int a = 8; + int b; - int LocalA() + if (a == 8) { - return 9; + b = 9; + + int LocalA() + { + return 9; + } + + int LocalB() + { + int q = b; + return a; + } + + function int() func = => LocalA; + Test.Assert(func() == 9); + + delegate int() dlg = scope => LocalB; + Test.Assert(dlg() == 8); } - - int LocalB() - { - return a; - } - - function int() func = => LocalA; - Test.Assert(func() == 9); - - delegate int() dlg = scope => LocalB; - Test.Assert(dlg() == 8); } } }