@@ -1194,10 +1194,8 @@ private function processStmtNode(
11941194
11951195 if ($ alwaysIterates ) {
11961196 $ isAlwaysTerminating = count ($ finalScopeResult ->getExitPointsByType (Break_::class)) === 0 ;
1197- } elseif ($ isIterableAtLeastOnce ) {
1198- $ isAlwaysTerminating = $ finalScopeResult ->isAlwaysTerminating ();
11991197 } else {
1200- $ isAlwaysTerminating = false ;
1198+ $ isAlwaysTerminating = $ isIterableAtLeastOnce && $ finalScopeResult -> isAlwaysTerminating () ;
12011199 }
12021200 $ condScope = $ condResult ->getFalseyScope ();
12031201 if (!$ isIterableAtLeastOnce ) {
@@ -1314,6 +1312,7 @@ private function processStmtNode(
13141312 }
13151313
13161314 $ bodyScope = $ initScope ;
1315+ $ alwaysIterates = $ stmt ->cond === [] && $ context ->isTopLevel ();
13171316 $ isIterableAtLeastOnce = TrinaryLogic::createYes ();
13181317 $ lastCondExpr = $ stmt ->cond [count ($ stmt ->cond ) - 1 ] ?? null ;
13191318 foreach ($ stmt ->cond as $ condExpr ) {
@@ -1411,10 +1410,16 @@ private function processStmtNode(
14111410 }
14121411 }
14131412
1413+ if ($ alwaysIterates ) {
1414+ $ isAlwaysTerminating = count ($ finalScopeResult ->getExitPointsByType (Break_::class)) === 0 ;
1415+ } else {
1416+ $ isAlwaysTerminating = false ; // $finalScopeResult->isAlwaysTerminating() && $isAlwaysIterable
1417+ }
1418+
14141419 return new StatementResult (
14151420 $ finalScope ,
14161421 $ finalScopeResult ->hasYield () || $ hasYield ,
1417- false /* $finalScopeResult-> isAlwaysTerminating() && $isAlwaysIterable*/ ,
1422+ $ isAlwaysTerminating ,
14181423 $ finalScopeResult ->getExitPointsForOuterLoop (),
14191424 array_merge ($ throwPoints , $ finalScopeResult ->getThrowPoints ()),
14201425 array_merge ($ impurePoints , $ finalScopeResult ->getImpurePoints ()),
0 commit comments