blob: 8687effb56375dfaf88710dfd1cc4f9f8db79416 [file] [log] [blame]
// { dg-additional-options "-fpreprocessed -std=gnu++20 -w -fconcepts" }
int _M_invoke___functor;
namespace std {
template <int __v> struct integral_constant {
static constexpr bool value = __v;
};
template <typename> struct decay { typedef int type; };
template <bool, typename> struct enable_if;
template <typename _Tp> struct enable_if<true, _Tp> { typedef _Tp type; };
template <typename, typename _Fn, typename... _Args>
void __invoke_impl(_Fn __f, _Args... __args) {
__f(__args...);
}
template <typename, typename _Callable, typename... _Args>
void __invoke_r(_Callable __fn, _Args... __args) {
using __result = int;
using __type = __result;
__invoke_impl<__type>(__fn, __args...);
}
template <typename> class function;
template <typename _Functor> struct _Base_manager {
static _Functor *_M_get_pointer(int) {}
};
template <typename, typename> class _Function_handler;
template <typename _Res, typename _Functor, typename... _ArgTypes>
struct _Function_handler<_Res(_ArgTypes...), _Functor> {
static _Res _M_invoke(_ArgTypes... __args) {
auto __trans_tmp_1 =
_Base_manager<_Functor>::_M_get_pointer(_M_invoke___functor);
__invoke_r<_Res>(*__trans_tmp_1, __args...);
}
};
template <typename _Res, typename... _ArgTypes>
struct function<_Res(_ArgTypes...)> {
template <typename _Functor> function(_Functor) {
_Function_handler<_Res(_ArgTypes...), _Functor>::_M_invoke;
}
};
template <typename _Tp> struct __shared_ptr_access {
using element_type = _Tp;
element_type *operator->();
};
template <typename> void make_shared();
} // namespace std
namespace boost {
using std::decay;
using std::enable_if;
using std::integral_constant;
namespace asio {
namespace detail {
template <typename> struct is_completion_signature;
template <typename R, typename... Args>
struct is_completion_signature<R(Args...)> : integral_constant<true> {};
} // namespace detail
template <typename T>
concept completion_signature = detail::is_completion_signature<T>::value;
template <typename...> struct async_result;
namespace detail {
template <completion_signature>
struct async_result_has_initiate_memfn : integral_constant<1> {};
} // namespace detail
template <typename CompletionToken, completion_signature... Signatures,
typename Initiation>
enable_if<detail::async_result_has_initiate_memfn<Signatures...>::value,
decltype(async_result<typename decay<CompletionToken>::type,
Signatures...>::initiate(0))>::type
async_initiate(Initiation) {}
} // namespace asio
} // namespace boost
namespace malloy::websocket {
struct connection {
auto read(auto, auto done) {
auto wrapper = [] {};
return boost::asio::async_initiate<decltype(done), void()>(wrapper);
}
};
} // namespace malloy::websocket
namespace std {
template <typename...> struct coroutine_traits;
template <typename = void> struct coroutine_handle {
operator coroutine_handle<>();
};
struct suspend_always {
bool await_ready();
void await_suspend(coroutine_handle<>);
void await_resume();
};
} // namespace std
namespace boost {
namespace asio {
namespace detail {
using std::coroutine_handle;
using std::suspend_always;
template <typename> class awaitable_frame;
} // namespace detail
template <typename, typename = int> struct awaitable {
bool await_ready();
template <class U>
void await_suspend(detail::coroutine_handle<detail::awaitable_frame<U>>);
void await_resume();
};
namespace detail {
struct awaitable_frame_base {
auto initial_suspend() { return suspend_always(); }
auto final_suspend() noexcept {
struct result {
bool await_ready() noexcept;
void await_suspend(coroutine_handle<>) noexcept;
void await_resume() noexcept;
};
return result{};
}
void unhandled_exception();
template <typename T> auto await_transform(T a) { return a; }
};
template <> struct awaitable_frame<void> : awaitable_frame_base {
void get_return_object();
};
} // namespace detail
} // namespace asio
} // namespace boost
namespace std {
template <typename T, typename Executor, typename... Args>
struct coroutine_traits<boost::asio::awaitable<T, Executor>, Args...> {
typedef boost::asio::detail::awaitable_frame<T> promise_type;
};
} // namespace std
namespace boost {
namespace asio {
struct use_awaitable_t {
use_awaitable_t(char, int, char);
} use_awaitable(0, 0, 0);
template <typename Executor, typename R, typename... Args>
struct async_result<Executor, R(Args...)> {
template <typename Initiation> static awaitable<int> initiate(Initiation);
};
} // namespace asio
} // namespace boost
namespace malloy::test {
void roundtrip_coro(std::function<void(int)>);
}
using boost::asio::awaitable;
template <int> awaitable<void> client_ws_handler_coro() {
std::__shared_ptr_access<malloy::websocket::connection> conn;
auto buffer = std::make_shared<int>;
co_await conn->read(buffer, boost::asio::use_awaitable);
}
void port() {
malloy::test::roundtrip_coro([](auto) { client_ws_handler_coro<false>; });
}