https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95895
--- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> ---
Reduced test-case:
cat x.ii
namespace std {
template <typename> struct remove_reference;
template <typename _Tp> struct remove_reference<_Tp &> { typedef _Tp type; };
template <typename _Tp> remove_reference<_Tp>::type move(_Tp &&);
template <typename _Tp> class optional {
public:
_Tp *operator->();
};
class vector {
public:
int begin();
int end();
};
} // namespace std
template <typename...> class future { future(future &&); };
namespace internal {
struct extract_values_from_futures_vector {
using future_type = future<>;
static future_type current_exception_as_future();
};
} // namespace internal
template <typename FutureIterator>
auto when_all_succeed(FutureIterator, FutureIterator) {
using result_transform = internal::extract_values_from_futures_vector;
return result_transform::current_exception_as_future();
}
namespace std {
template <typename...> struct coroutine_traits;
template <typename = void> struct coroutine_handle;
template <> struct coroutine_handle<> {};
template <typename> struct coroutine_handle : coroutine_handle<> {};
struct suspend_never {
void await_ready();
void await_suspend(coroutine_handle<>);
void await_resume();
};
} // namespace std
namespace internal {
class coroutine_traits_base {
public:
class promise_type {
public:
std::suspend_never initial_suspend();
std::suspend_never final_suspend();
};
};
struct awaiter {
future<> _future;
void await_ready();
template <typename U> void await_suspend(std::coroutine_handle<U>);
void await_resume();
};
} // namespace internal
auto operator co_await(future<> f) { return internal::awaiter(std::move(f)); }
namespace std {
template <typename... T, typename... Args>
class coroutine_traits<future<T...>, Args...>
: public internal::coroutine_traits_base {};
class server {
struct leader_state {
vector _replicatoin_fibers;
};
optional<leader_state> _leader_state;
future<> drop_leadership();
};
future<> server::drop_leadership() {
co_await when_all_succeed(_leader_state->_replicatoin_fibers.begin(),
_leader_state->_replicatoin_fibers.end());