brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · 2aa5bbf Raw
72 lines · c
1// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++20 -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -verify -fblocks -Wno-unreachable-code -Wno-unused-value2#ifndef STD_COROUTINE_H3#define STD_COROUTINE_H4 5namespace std {6namespace experimental {7template <typename R, typename...> struct coroutine_traits {8  using promise_type = typename R::promise_type;9};10 11template <typename Promise = void> struct coroutine_handle;12 13template <> struct coroutine_handle<void> {14  static coroutine_handle from_address(void *addr) noexcept {15    coroutine_handle me;16    me.ptr = addr;17    return me;18  }19  void operator()() { resume(); }20  void *address() const noexcept { return ptr; }21  void resume() const { __builtin_coro_resume(ptr); }22  void destroy() const { __builtin_coro_destroy(ptr); }23  bool done() const { return __builtin_coro_done(ptr); }24  coroutine_handle &operator=(decltype(nullptr)) {25    ptr = nullptr;26    return *this;27  }28  coroutine_handle(decltype(nullptr)) : ptr(nullptr) {}29  coroutine_handle() : ptr(nullptr) {}30  //  void reset() { ptr = nullptr; } // add to P0057?31  explicit operator bool() const { return ptr; }32 33protected:34  void *ptr;35};36 37template <typename Promise> struct coroutine_handle : coroutine_handle<> {38  using coroutine_handle<>::operator=;39 40  static coroutine_handle from_address(void *addr) noexcept {41    coroutine_handle me;42    me.ptr = addr;43    return me;44  }45 46  Promise &promise() const {47    return *reinterpret_cast<Promise *>(48        __builtin_coro_promise(ptr, alignof(Promise), false));49  }50  static coroutine_handle from_promise(Promise &promise) {51    coroutine_handle p;52    p.ptr = __builtin_coro_promise(&promise, alignof(Promise), true);53    return p;54  }55};56 57struct suspend_always {58  bool await_ready() { return false; }59  void await_suspend(coroutine_handle<>) {}60  void await_resume() {}61};62 63struct suspend_never {64  bool await_ready() noexcept { return true; }65  void await_suspend(coroutine_handle<>) noexcept {}66  void await_resume() noexcept {}67};68} // namespace experimental69} // namespace std70 71#endif // STD_COROUTINE_H72