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();
}