https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118574
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- No iostream/string: #include <vector> #include <chrono> #include <thread> #include <coroutine> using namespace std::chrono_literals; struct TimerAwaiter { std::chrono::milliseconds duration; bool await_ready() const noexcept { return false; } void await_suspend(std::coroutine_handle<> h) const noexcept { std::this_thread::sleep_for(duration); 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() { std::terminate(); } 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{200ms}; ret.push_back(item); } co_return "foobar"; } int main() { auto task = processStringList(); if (__builtin_strcmp (task.get(), "foobar")) __builtin_abort(); return 0; }