Hello,
Using GCC 10.1 and Boost 1.77 I get a mem fault when executing the
following code:
#include <iostream>
#include
#include
struct TestStruct {
std::string strField;
};
boost::asio::awaitable<bool> TestFunction(TestStruct param) {
std::cout << param.strField << std::endl;
co_return true;
}
boost::asio::awaitable<void> TestCoroutine() {
// This causes mem issue
co_await TestFunction(TestStruct{"some string"});
}
int main()
{
boost::asio::io_context io_context;
boost::asio::co_spawn(
io_context,
[]() { return TestCoroutine(); },
boost::asio::detached);
io_context.run();
return 0;
} Also tested with GCC 12.1 and Boost 1.79 - the result is the same (
https://godbolt.org/z/69MKbz7qE).
Works if I use a temp variable:
boost::asio::awaitable<void> TestCoroutine() {
auto testStruct = TestStruct{"some string"};
co_await TestFunction(testStruct);
}
Or if I add a constructor to test struct:
struct TestStruct {
explicit TestStruct(const std::string& str) : strField(str) {}
std::string strField;
};
boost::asio::awaitable<void> TestCoroutine() {
co_await TestFunction(TestStruct("some string"));
}
Is there any coroutines rule that I am violating here? If yes - is there
any compiler option I can use to get a warning / error message?
Full code with cmake can be found here:
https://github.com/piotrgoslawski/mem_issue
Thank you