From 8d0a415eb761680e1ac040ae81bf2a6b494434db Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 14 Feb 2022 07:25:20 -0500 Subject: [PATCH] Made paths with NoReturn calls mark variables as assigned --- IDEHelper/Compiler/BfExprEvaluator.cpp | 1 + IDEHelper/Compiler/BfModule.cpp | 9 +++++---- IDEHelper/Compiler/BfModule.h | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 86ccb065..0aa0ffe3 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -5605,6 +5605,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance* { mModule->mCurMethodState->SetHadReturn(true); mModule->mCurMethodState->mLeftBlockUncond = true; + mModule->MarkScopeLeft(&mModule->mCurMethodState->mHeadScope, true); } if (mModule->mCurTypeInstance != NULL) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 1cac4bb3..da37561e 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -15519,9 +15519,9 @@ void BfModule::EmitDeferredScopeCalls(bool useSrcPositions, BfScopeData* scopeDa }*/ } -void BfModule::MarkScopeLeft(BfScopeData* scopeData) -{ - if (mCurMethodState->mDeferredLocalAssignData != NULL) +void BfModule::MarkScopeLeft(BfScopeData* scopeData, bool isNoReturn) +{ + if ((mCurMethodState->mDeferredLocalAssignData != NULL) && (!isNoReturn)) { auto deferredLocalAssignData = mCurMethodState->mDeferredLocalAssignData; @@ -15550,7 +15550,8 @@ void BfModule::MarkScopeLeft(BfScopeData* scopeData) } if (!hadAssignment) { - localDef->mHadExitBeforeAssign = true; + if (!isNoReturn) + localDef->mHadExitBeforeAssign = true; mCurMethodState->LocalDefined(localDef); } } diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 1f77b859..889be7e1 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1845,7 +1845,7 @@ public: void ClearLifetimeEnds(); bool HasDeferredScopeCalls(BfScopeData* scope); void EmitDeferredScopeCalls(bool useSrcPositions, BfScopeData* scope, BfIRBlock doneBlock = BfIRBlock()); - void MarkScopeLeft(BfScopeData* scopeData); + void MarkScopeLeft(BfScopeData* scopeData, bool isNoReturn = false); BfGenericParamType* GetGenericParamType(BfGenericParamKind paramKind, int paramIdx); BfType* ResolveGenericType(BfType* unspecializedType, BfTypeVector* typeGenericArguments, BfTypeVector* methodGenericArguments, bool allowFail = false); BfType* ResolveSelfType(BfType* type, BfTypeInstance* selfType);