https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118574
--- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> --- No thread/chrono: #include <vector> #include <time.h> #include <cerrno> #include <coroutine> struct TimerAwaiter { long ns; bool await_ready() const noexcept { return false; } void await_suspend(std::coroutine_handle<> h) const noexcept { struct ::timespec __ts = { 0, ns }; while (::nanosleep(&__ts, &__ts) == -1 && errno == EINTR) ; h.resume(); } void await_resume() const noexcept {} }; struct Task { 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 = std::move(v); } void unhandled_exception() { __builtin_abort(); } Task get_return_object() { return Task{this}; } }; promise_type *p; explicit Task(promise_type *p) : p(p) {} const char *get() { return p->value; } }; std::vector<const char *> getStringList() { std::vector<const char *> a; a.push_back("foo"); a.push_back("bar"); return a; } Task processStringList() { std::vector<const char *> ret; for (const auto &item : getStringList()) { co_await TimerAwaiter{200000}; ret.push_back(item); } co_return "foobar"; } int main() { auto task = processStringList(); if (__builtin_strcmp (task.get(), "foobar")) __builtin_abort(); }