From 622159ae6482dd4ca1ab0cf1d651cf6a2ee551ee Mon Sep 17 00:00:00 2001 From: Lazizbek Ergashev Date: Sun, 16 Aug 2026 02:24:50 +0500 Subject: [PATCH] Fix GH-23301: nested "yield from" repeats a value after "yield from []" --- NEWS | 2 ++ Zend/tests/generators/gh23301.phpt | 29 +++++++++++++++++++++++++++++ Zend/zend_generators.c | 2 +- 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/generators/gh23301.phpt diff --git a/NEWS b/NEWS index ecb4d105e917..6f02804e00de 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ PHP NEWS - Core: . Fixed bug GH-15375 (Nested "yield from" skips items after a valid() or next() call on the inner generator). (iliaal) + . Fixed bug GH-23301 (Nested "yield from" yields a value twice when the + middle generator ends with "yield from []"). (Lazizbek Ergashev) - Opcache: . Fixed opcache.protect_memory race under ZTS. (realFlowControl) diff --git a/Zend/tests/generators/gh23301.phpt b/Zend/tests/generators/gh23301.phpt new file mode 100644 index 000000000000..dd71cf5f0ffc --- /dev/null +++ b/Zend/tests/generators/gh23301.phpt @@ -0,0 +1,29 @@ +--TEST-- +GH-23301 (Nested "yield from" yields a value twice when the middle generator ends with "yield from []") +--FILE-- + +--EXPECT-- +A +B +C diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 83815773b912..25669f8e54d5 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -890,7 +890,7 @@ ZEND_API void zend_generator_resume(zend_generator *orig_generator) /* {{{ */ /* yield from was used, try another resume. */ if (UNEXPECTED(generator->execute_data && generator->execute_data->opline->opcode == ZEND_YIELD_FROM)) { - delegator = generator; + delegator = generator->node.parent ? generator : orig_generator; generator = zend_generator_get_current(orig_generator); goto try_again; }