chriskohlhoff / asio

Asio C++ Library
http://think-async.com/Asio
4.72k stars 1.19k forks source link

experimental/awaitable_operators build failure with BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT #1397

Open anarthal opened 6 months ago

anarthal commented 6 months ago

Version: Boost 1.84 Compiler: clang++16, under Ubuntu 22.04, -std=c++20, debug

Sample program:

#define BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT

#include <boost/asio/any_io_executor.hpp>
#include <boost/asio/awaitable.hpp>
#include <boost/asio/experimental/awaitable_operators.hpp>
#include <boost/asio/steady_timer.hpp>
#include <boost/asio/use_awaitable.hpp>

namespace asio = boost::asio;

asio::awaitable<void> f(asio::steady_timer& tim)
{
    using namespace boost::asio::experimental::awaitable_operators;
    co_await (tim.async_wait(asio::use_awaitable) || tim.async_wait(asio::use_awaitable));
}

Fails with the following error:


[build] In file included from /home/ruben/workspace/mysql/private/test-programs/testground/main.cpp:5:
[build] In file included from /opt/boost-1.84.0/include/boost/asio/experimental/awaitable_operators.hpp:27:
[build] In file included from /opt/boost-1.84.0/include/boost/asio/experimental/parallel_group.hpp:456:
[build] /opt/boost-1.84.0/include/boost/asio/experimental/impl/parallel_group.hpp:135:17: error: field has incomplete type 'executor_type' (aka 'void')
[build]   executor_type executor_;
[build]                 ^
[build] /opt/boost-1.84.0/include/boost/asio/experimental/impl/parallel_group.hpp:183:54: note: in instantiation of template class 'boost::asio::experimental::detail::parallel_group_completion_handler<boost::asio::detail::awaitable_async_op_handler<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::executor>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>' requested here
[build]   parallel_group_completion_handler<Handler, Ops...> handler_;
[build]                                                      ^
[build] /opt/boost-1.84.0/include/boost/asio/experimental/impl/parallel_group.hpp:386:13: note: in instantiation of template class 'boost::asio::experimental::detail::parallel_group_state<boost::asio::experimental::wait_for_one_success, boost::asio::detail::awaitable_async_op_handler<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::executor>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>' requested here
[build]   if ((state->cancellations_requested_ -= sizeof...(Ops)) > 0)
[build]             ^
[build] /opt/boost-1.84.0/include/boost/asio/experimental/parallel_group.hpp:150:15: note: in instantiation of function template specialization 'boost::asio::experimental::detail::parallel_group_launch<boost::asio::experimental::wait_for_one_success, boost::asio::detail::awaitable_async_op_handler<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::executor>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, 0UL, 1UL>' requested here
[build]       detail::parallel_group_launch(
[build]               ^
[build] /opt/boost-1.84.0/include/boost/asio/async_result.hpp:273:5: note: in instantiation of function template specialization 'boost::asio::experimental::parallel_group<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>::initiate_async_wait::operator()<boost::asio::detail::awaitable_async_op_handler<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::executor>, boost::asio::experimental::wait_for_one_success>' requested here
[build]     static_cast<Initiation&&>(initiation)(
[build]     ^
[build] /opt/boost-1.84.0/include/boost/asio/async_result.hpp:570:65: note: in instantiation of function template specialization 'boost::asio::detail::completion_handler_async_result<boost::asio::detail::awaitable_async_op_handler<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::executor>, void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr)>::initiate<boost::asio::experimental::parallel_group<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>::initiate_async_wait, boost::asio::detail::awaitable_async_op_handler<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::executor>, boost::asio::experimental::wait_for_one_success, std::tuple<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>>' requested here
[build]   return async_result<decay_t<CompletionToken>, Signatures...>::initiate(
[build]                                                                 ^
[build] /opt/boost-1.84.0/include/boost/asio/deferred.hpp:319:12: note: in instantiation of function template specialization 'boost::asio::async_initiate<boost::asio::detail::awaitable_async_op_handler<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::executor>, void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::experimental::parallel_group<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>::initiate_async_wait, boost::asio::experimental::wait_for_one_success, std::tuple<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>>' requested here
[build]     return async_initiate<CompletionToken, Signature>(
[build]            ^
[build] /opt/boost-1.84.0/include/boost/asio/deferred.hpp:354:18: note: in instantiation of function template specialization 'boost::asio::deferred_async_operation<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::experimental::parallel_group<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>::initiate_async_wait, boost::asio::experimental::wait_for_one_success, std::tuple<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>>::invoke_helper<boost::asio::detail::awaitable_async_op_handler<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::executor>, 0UL, 1UL>' requested here
[build]     return this->invoke_helper(
[build]                  ^
[build] /opt/boost-1.84.0/include/boost/asio/impl/awaitable.hpp:1142:11: note: in instantiation of function template specialization 'boost::asio::deferred_async_operation<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::experimental::parallel_group<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>::initiate_async_wait, boost::asio::experimental::wait_for_one_success, std::tuple<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>>::operator()<boost::asio::detail::awaitable_async_op_handler<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::executor>>' requested here
[build]           std::forward<Op&&>(self->op_)(
[build]           ^
[build] /opt/boost-1.84.0/include/boost/asio/experimental/awaitable_operators.hpp:259:5: note: in instantiation of member function 'boost::asio::detail::awaitable_async_op<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::deferred_async_operation<void (std::array<unsigned long, 2>, std::__exception_ptr::exception_ptr, std::__exception_ptr::exception_ptr), boost::asio::experimental::parallel_group<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>::initiate_async_wait, boost::asio::experimental::wait_for_one_success, std::tuple<boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>, boost::asio::deferred_async_operation<void (std::__exception_ptr::exception_ptr), boost::asio::detail::initiate_co_spawn<boost::asio::executor>, boost::asio::detail::awaitable_as_function<void, boost::asio::executor>>>>, boost::asio::executor>::await_suspend' requested here
[build]     co_await make_parallel_group(
[build]     ^
[build] /home/ruben/workspace/mysql/private/test-programs/testground/main.cpp:14:51: note: in instantiation of function template specialization 'boost::asio::experimental::awaitable_operators::operator||<boost::asio::executor>' requested here
[build]     co_await (tim.async_wait(asio::use_awaitable) || tim.async_wait(asio::use_awaitable));
``