diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 98eb060a..89540404 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -5738,6 +5738,10 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt) { UpdateSrcPos(forEachStmt); + auto startBB = mBfIRBuilder->GetInsertBlock(); + auto condBB = mBfIRBuilder->CreateBlock("forless.cond", true); + mBfIRBuilder->SetInsertPoint(condBB); + BfScopeData scopeData; // We set mIsLoop later if (forEachStmt->mLabelNode != NULL) @@ -5800,6 +5804,9 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt) target = GetDefaultTypedValue(varType); } PopulateType(varType, BfPopulateType_Data); + + auto condEndBB = mBfIRBuilder->GetInsertBlock(); + mBfIRBuilder->SetInsertPoint(startBB); BfLocalVariable* localDef = new BfLocalVariable(); localDef->mNameNode = BfNodeDynCast(forEachStmt->mVariableName); @@ -5822,8 +5829,7 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt) localDef->Init(); UpdateExprSrcPos(forEachStmt->mVariableName); AddLocalVariableDef(localDef, true); - - auto condBB = mBfIRBuilder->CreateBlock("forless.cond", true); + auto bodyBB = mBfIRBuilder->CreateBlock("forless.body"); auto incBB = mBfIRBuilder->CreateBlock("forless.inc"); auto endBB = mBfIRBuilder->CreateBlock("forless.end"); @@ -5837,7 +5843,7 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt) SetAndRestoreValue prevBreakData(mCurMethodState->mBreakData, &breakData); mBfIRBuilder->CreateBr(condBB); - mBfIRBuilder->SetInsertPoint(condBB); + mBfIRBuilder->SetInsertPoint(condEndBB); if (forEachStmt->mCollectionExpression != NULL) UpdateExprSrcPos(forEachStmt->mCollectionExpression); BfIRValue conditionValue; diff --git a/IDEHelper/Tests/src/Loops.bf b/IDEHelper/Tests/src/Loops.bf index 72c10767..82adf5ba 100644 --- a/IDEHelper/Tests/src/Loops.bf +++ b/IDEHelper/Tests/src/Loops.bf @@ -32,7 +32,7 @@ namespace Tests static int GetVal() { - return 10 + sGetValCount++; + return 10 + sGetValCount++ / 2; } [Test] @@ -70,8 +70,8 @@ namespace Tests { iterations++; } - Test.Assert(iterations == 10); - Test.Assert(sGetValCount == 1); + Test.Assert(iterations == 19); + Test.Assert(sGetValCount == 20); } public static void TestEnumerator1(EnumeratorTest e)