https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118574
--- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Finally testcase with only <coroutine>:
#include <coroutine>
struct A {
const char **a = nullptr;
int n = 0;
void push_back (const char *x) { if (!a) a = new const char *[2]; a[n++] = x;
}
const char **begin () const { return a; }
const char **end () const { return a + n; }
~A () { delete[] a; }
};
struct B {
long ns;
bool await_ready () const noexcept { return false; }
void await_suspend (std::coroutine_handle<> h) const noexcept {
volatile int v = 0;
while (v < ns)
v = v + 1;
h.resume ();
}
void await_resume () const noexcept {}
};
struct C {
struct promise_type {
const char *value;
std::suspend_never initial_suspend () { return {}; }
std::suspend_always final_suspend () noexcept { return {}; }
void return_value (const char *v) { value = v; }
void unhandled_exception () { __builtin_abort (); }
C get_return_object () { return C{this}; }
};
promise_type *p;
explicit C (promise_type *p) : p(p) {}
const char *get () { return p->value; }
};
A
foo ()
{
A a;
a.push_back ("foo");
a.push_back ("bar");
return a;
}
C
bar ()
{
A ret;
for (const auto &item : foo ())
{
co_await B{200000};
ret.push_back (item);
}
co_return "foobar";
}
int
main ()
{
auto task = bar ();
if (__builtin_strcmp (task.get (), "foobar"))
__builtin_abort ();
}