diff --git a/rules-tests/DeadCode/Rector/For_/RemoveDeadIfForeachForRector/Fixture/skip_foreach_over_call_side_effect.php.inc b/rules-tests/DeadCode/Rector/For_/RemoveDeadIfForeachForRector/Fixture/skip_foreach_over_call_side_effect.php.inc new file mode 100644 index 00000000000..fc5c907e16d --- /dev/null +++ b/rules-tests/DeadCode/Rector/For_/RemoveDeadIfForeachForRector/Fixture/skip_foreach_over_call_side_effect.php.inc @@ -0,0 +1,24 @@ +result)) { + foreach ($this->events() as $event) { + } + } + + return $this->result; + } + + private function events(): iterable + { + $this->result = 1; + yield 1; + } +} diff --git a/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php b/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php index fef1be4bb0f..f4a86bb53ba 100644 --- a/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php +++ b/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php @@ -166,6 +166,11 @@ private function processForForeach(For_|Foreach_ $for, int $key, Node $stmtsAwar return; } + // the iterated expression itself may have side effects, e.g. foreach (generator() as $event) {} + if ($this->hasNodeSideEffect($for->expr)) { + return; + } + $exprs = [$for->expr, $for->valueVar, $for->valueVar]; $variables = $this->betterNodeFinder->findInstanceOf($exprs, Variable::class); foreach ($variables as $variable) {