diff --git a/IDE/Tests/CompileFail001/src/LocalVars.bf b/IDE/Tests/CompileFail001/src/LocalVars.bf index 0cee7ef5..96246310 100644 --- a/IDE/Tests/CompileFail001/src/LocalVars.bf +++ b/IDE/Tests/CompileFail001/src/LocalVars.bf @@ -416,5 +416,38 @@ namespace IDETest } while (read > 0); //FAIL } + + public void Local13() + { + int a = 123; + int b; + switch (a) + { + default: b = 0; + } + int c = b; + } + + public void Local14() + { + int a = 123; + int b; + switch (a) + { + default: b = 0; break; + } + int c = b; + } + + public void Local15() + { + int a = 123; + int b; + switch (a) + { + default: break; + } + int c = b; //FAIL + } } } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 8601c7f7..e5264006 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -327,27 +327,24 @@ void BfMethodState::ApplyDeferredLocalAssignData(const BfDeferredLocalAssignData if (deferredLocalAssignData.mLeftBlockUncond) { - if (mLeftBlockUncond) + for (int localIdx = 0; localIdx < (int)mLocals.size(); localIdx++) { - for (int localIdx = 0; localIdx < (int)mLocals.size(); localIdx++) + auto localDef = mLocals[localIdx]; + if (localDef->mAssignedKind == BfLocalVarAssignKind_None) { - auto localDef = mLocals[localIdx]; - if (localDef->mAssignedKind == BfLocalVarAssignKind_None) + bool hadAssignment = false; + if (mDeferredLocalAssignData != NULL) { - bool hadAssignment = false; - if (mDeferredLocalAssignData != NULL) - { - for (auto& entry : mDeferredLocalAssignData->mAssignedLocals) - if (entry.mLocalVar == localDef) - hadAssignment = true; - } - if (!hadAssignment) - { - LocalDefined(localDef); - } + for (auto& entry : mDeferredLocalAssignData->mAssignedLocals) + if (entry.mLocalVar == localDef) + hadAssignment = true; + } + if (!hadAssignment) + { + LocalDefined(localDef); } } - } + } } else { diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index a646c735..24c5fb1a 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -5054,19 +5054,27 @@ void BfModule::Visit(BfSwitchStatement* switchStmt) if (switchCase->mCodeBlock != NULL) { isComprehensive = true; - UpdateSrcPos(switchCase->mCodeBlock); - + UpdateSrcPos(switchCase->mCodeBlock); + deferredLocalAssignDataVec[blockIdx].mScopeData = mCurMethodState->mCurScope; deferredLocalAssignDataVec[blockIdx].ExtendFrom(mCurMethodState->mDeferredLocalAssignData); SetAndRestoreValue prevDLA(mCurMethodState->mDeferredLocalAssignData, &deferredLocalAssignDataVec[blockIdx]); mCurMethodState->mDeferredLocalAssignData->mVarIdBarrier = startingLocalVarId; + BfScopeData caseScopeData; + caseScopeData.mOuterIsConditional = true; + caseScopeData.mIsSharedTempBlock = true; + mCurMethodState->AddScope(&caseScopeData); + NewScopeState(); + bool hadReturn = false; VisitCodeBlock(switchCase->mCodeBlock, BfIRBlock(), endBlock, BfIRBlock(), true, &hadReturn, switchStmt->mLabelNode); deferredLocalAssignDataVec[blockIdx].mHadReturn = hadReturn; caseCount++; if (!hadReturn) allHadReturns = false; + + RestoreScopeState(); } } else @@ -5796,9 +5804,12 @@ void BfModule::Visit(BfRepeatStatement* repeatStmt) } } - + RestoreScopeState(); + prevDLA.Restore(); + mCurMethodState->ApplyDeferredLocalAssignData(deferredLocalAssignData); + if (isInfiniteLoop) EmitDefaultReturn(); }