Oliver, thank you for your answer, it is very helpful.
I have an issue after switching from Boost.Coroutine to Boost.Coroutine2 - nested coroutine switches to its creator - not to the caller.
this is not how asymmetric coroutines are defined - a asymmetric coroutine has to return to its resumption point while suspended
Okay. But where "resumption point" belongs to? To the caller or to the creator? Sorry for posting such a long code, I think now I've simplified it - http://codepad.org/yRqRfQBI Output: When using Boost.Coroutine result is 122 When using Boost.Coroutine2 result is 1221 So there is one template test<> instantiated twice (with coroutines::coroutine<void> and coroutines2::coroutine<void>) results in two different outputs "122" and "1221". This "122" makes perfect sense. Why calling 2nd coroutine leads to calling 1st in case of Boost.Coroutine2? What is motivation for this? Now if you'll comment line 30 containing "yield();" it will still work for Boost.Coroutine but crash on assert for Boost.Coroutine2. This means inner coroutine shoud have less steps than outer coroutine. What is motivation behind that?