It's impossible to avoid exceptions using the coroutines2 library (Boost version 1.69).
Consider this (pretty much the example) code where a coroutine gets created, used and destroyed:
Does the unwind need to happen here on the coroutine destruction? Doesn't look like it. However, the forced_unwind
exception still gets thrown. Here's the backtrace:
#0 __cxxabiv1::__cxa_throw (... <typeinfo for boost::context::detail::forced_unwind>
#1 in boost::context::detail::fiber_unwind (t=...)
at .../include/boost/context/fiber_fcontext.hpp:58
#2 in boost::context::fiber::resume()
at .../include/boost/context/fiber_fcontext.hpp:289
#3 in boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}::operator()(boost::context::fiber) (...)
at .../include/boost/coroutine2/detail/pull_control_block_cc.ipp:95
#4 in std::__invoke_impl<boost::context::fiber, boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}&, boost::context::fiber>(std::__invoke_other, boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}&, boost::context::fiber&&) (__f=..., __args#0=...)
at .../8.2.0/include/g++-v8/bits/invoke.h:60
#5 in std::__invoke<boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&>(boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}&, boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}&) (__fn=..., __args#0=...)
at .../8.2.0/include/g++-v8/bits/invoke.h:96
#6 in std::invoke<boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&>(boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}&, boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}&) (__fn=..., __args#0=...)
at .../8.2.0/include/g++-v8/functional:82
#7 in boost::context::detail::fiber_record<boost::context::fiber, boost::context::basic_fixedsize_stack<boost::context::stack_traits>, boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}>::run(void*) (...)
at .../include/boost/context/fiber_fcontext.hpp:144
#8 in boost::context::detail::fiber_entry<boost::context::detail::fiber_record<boost::context::fiber, boost::context::basic_fixedsize_stack<boost::context::stack_traits>, boost::coroutines2::detail::pull_coroutine<int>::control_block::control_block<boost::context::basic_fixedsize_stack<boost::context::stack_traits>, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}>(boost::context::preallocated, boost::context::basic_fixedsize_stack<boost::context::stack_traits>&&, make_coro()::{lambda(boost::coroutines2::detail::push_coroutine<int>&)#1}&&)::{lambda(boost::context::fiber&&)#1}> >(boost::context::detail::transfer_t) (t=...)
at .../include/boost/context/fiber_fcontext.hpp:80
#9 in make_fcontext ()