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

Reply via email to