
Another issue that I see is with reference/pointer types. The fact that the following code will blow up is troubling:
[snip]
X * val is an address of x1/x2 on the stack of foo(). no danglingpointer until coroutine is alive.
Yes, the address would still be valid (stack is not gone) but the object would have already been destroyed. Maybe a better example: struct X { ~X() { std::cout << "~X" << std::endl; } }; typedef boost::coro::generator< X* > gen_t; void foo(gen_t::self_t& self) { X x1, x2; self.yield(&x1); self.yield(&x2); } int main() { gen_t g(foo); while( g ) { X* val = g(); std::cout << "use val" << std::endl; } return 0; } Outputs (ran against the coroutine branch): use val ~X ~X use val Clearly the use of x2 occurs after its destruction.