Hi,

I use boost 1.60 and coroutines2, Visual Studio 2015 Update 2.

When I throw an exception from the pull function after the first push, everything is ok. But if I throw an exception before the first push, then I get an Access Violation. According to the spec in this case I shall get an exception from the constructor.

In the example below:
- When I use cooperative as the pull function then I do not catch the exceptio in the mainTest side. It simply just go forward - I guess it did not rethrow the exception.
- When I use cooperative2 (I do a push before throwing the exception, then it is fine, the exception is caught in the mainTest side (as const MyError&)

What is wrong here?

Regards,
Tamas

class MyError : public std::runtime_error
{
public:
        MyError()
                : runtime_error("rt error")
        {
        }

        explicit MyError(char const* _Message)
                : runtime_error(_Message)
        {
        }


        explicit MyError(runtime_error const& _Other)
                : runtime_error(_Other)
        {
        }
};

void cooperative(boost::coroutines2::coroutine<void>::push_type &)
{
        throw MyError("error");
}

void cooperative2(boost::coroutines2::coroutine<void>::push_type &sink)
{
        sink();
        throw MyError("error");
}

void mainTest()
{
        try
        {
                #ifdef BUG
                boost::coroutines2::coroutine<void>::pull_type source(&cooperative);  // Not OK
                #else
                boost::coroutines2::coroutine<void>::pull_type source(&cooperative2); // -> OK
                source();
                #endif
        }
        catch (const MyError &e)
        {
                std::cerr << e.what() << '\n';
        }
        catch (const std::runtime_error &e)
        {
                std::cerr << e.what() << '\n';
        }
        catch (const std::exception &e)
        {
                std::cerr << e.what() << '\n';
        }
}