@@ -1637,8 +1637,20 @@ private function processStmtNode(
16371637 } else {
16381638 $ this ->processExprNode ($ stmt , $ stmt ->cond , $ bodyScope , $ storage , $ nodeCallback , ExpressionContext::createDeep ());
16391639 }
1640- foreach ($ bodyScopeResult ->getExitPointsByType (Break_::class) as $ breakExitPoint ) {
1641- $ finalScope = $ breakExitPoint ->getScope ()->mergeWith ($ finalScope );
1640+
1641+ $ breakExitPoints = $ bodyScopeResult ->getExitPointsByType (Break_::class);
1642+ if ($ alwaysIterates && count ($ breakExitPoints ) > 0 ) {
1643+ $ breakScope = null ;
1644+ foreach ($ breakExitPoints as $ breakExitPoint ) {
1645+ $ breakScope = $ breakScope === null
1646+ ? $ breakExitPoint ->getScope ()
1647+ : $ breakScope ->mergeWith ($ breakExitPoint ->getScope ());
1648+ }
1649+ $ finalScope = $ breakScope ;
1650+ } else {
1651+ foreach ($ breakExitPoints as $ breakExitPoint ) {
1652+ $ finalScope = $ finalScope ->mergeWith ($ breakExitPoint ->getScope ());
1653+ }
16421654 }
16431655
16441656 return new InternalStatementResult (
@@ -1749,8 +1761,19 @@ private function processStmtNode(
17491761 $ finalScope = $ finalScope ->filterByFalseyValue ($ lastCondExpr );
17501762 }
17511763
1752- foreach ($ finalScopeResult ->getExitPointsByType (Break_::class) as $ breakExitPoint ) {
1753- $ finalScope = $ breakExitPoint ->getScope ()->mergeWith ($ finalScope );
1764+ $ breakExitPoints = $ finalScopeResult ->getExitPointsByType (Break_::class);
1765+ if ($ alwaysIterates ->yes () && count ($ breakExitPoints ) > 0 ) {
1766+ $ breakScope = null ;
1767+ foreach ($ breakExitPoints as $ breakExitPoint ) {
1768+ $ breakScope = $ breakScope === null
1769+ ? $ breakExitPoint ->getScope ()
1770+ : $ breakScope ->mergeWith ($ breakExitPoint ->getScope ());
1771+ }
1772+ $ finalScope = $ breakScope ;
1773+ } else {
1774+ foreach ($ breakExitPoints as $ breakExitPoint ) {
1775+ $ finalScope = $ finalScope ->mergeWith ($ breakExitPoint ->getScope ());
1776+ }
17541777 }
17551778
17561779 if ($ isIterableAtLeastOnce ->no () || $ finalScopeResult ->isAlwaysTerminating ()) {
0 commit comments