--TEST--
yield from on multiple trees needing merge
--FILE--
<?php

function from($levels) {
    foreach (range(0, 2 << $levels) as $v) {
        yield $v;
        if ($v == (1 << ($levels - 1)) - 2) {
            throw new Exception();
        }
    }
}

function gen($gen, $level) {
    yield from $gen;
}

$levels = 5;

print "$levels levels\n\n";

$all = array();
$all[] = $gens[0][0] = from($levels);

for ($level = 1; $level < $levels; $level++) {
    for ($i = 0; $i < (1 << $level); $i++) {
        $all[] = $gens[$level][$i] = gen($gens[$level-1][$i >> 1], $level);
    }
}

for ($i = 0; $i < 2; $i++) {
    try {
        foreach ($all as $gen) {
            var_dump($gen->current());
            $gen->next();
            if (!$gen->valid()) {
                break;
            }
        }
    } catch(Exception $e) {
        print "$e\n";
        unset($all[array_search($gen, $all)]);
    }
}
?>
--EXPECTF--
5 levels

int(0)
int(1)
int(2)
int(3)
int(4)
int(5)
int(6)
int(7)
int(8)
int(9)
int(10)
int(11)
int(12)
int(13)
int(14)
Exception in %s:%d
Stack trace:
#0 %s(%d): from(5)
#1 %s(%d): gen(Object(Generator), 1)
#2 %s(%d): gen(Object(Generator), 2)
#3 [internal function]: gen(Object(Generator), 3)
#4 %s(%d): Generator->next()
#5 {main}
ClosedGeneratorException: Generator yielded from aborted, no return value available in %s:%d
Stack trace:
#0 [internal function]: gen(Object(Generator), 1)
#1 %s(%d): Generator->current()
#2 {main}
