|
@@ -20,7 +20,8 @@
|
|
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
|
|
-#if __has_builtin(__builtin_coro_noop)
|
|
|
+#if __has_builtin(__builtin_coro_noop) || defined(_LIBCPP_COMPILER_GCC)
|
|
|
+
|
|
|
// [coroutine.noop]
|
|
|
// [coroutine.promise.noop]
|
|
|
struct noop_coroutine_promise {};
|
|
@@ -64,20 +65,45 @@ private:
|
|
|
_LIBCPP_HIDE_FROM_ABI
|
|
|
friend coroutine_handle<noop_coroutine_promise> noop_coroutine() noexcept;
|
|
|
|
|
|
+#if __has_builtin(__builtin_coro_noop)
|
|
|
_LIBCPP_HIDE_FROM_ABI coroutine_handle() noexcept {
|
|
|
this->__handle_ = __builtin_coro_noop();
|
|
|
}
|
|
|
|
|
|
void* __handle_ = nullptr;
|
|
|
+
|
|
|
+#elif defined(_LIBCPP_COMPILER_GCC)
|
|
|
+ // GCC doesn't implement __builtin_coro_noop().
|
|
|
+ // Construct the coroutine frame manually instead.
|
|
|
+ struct __noop_coroutine_frame_ty_ {
|
|
|
+ static void __dummy_resume_destroy_func() { }
|
|
|
+
|
|
|
+ void (*__resume_)() = __dummy_resume_destroy_func;
|
|
|
+ void (*__destroy_)() = __dummy_resume_destroy_func;
|
|
|
+ struct noop_coroutine_promise __promise_;
|
|
|
+ };
|
|
|
+
|
|
|
+ static __noop_coroutine_frame_ty_ __noop_coroutine_frame_;
|
|
|
+
|
|
|
+ void* __handle_ = &__noop_coroutine_frame_;
|
|
|
+
|
|
|
+ _LIBCPP_HIDE_FROM_ABI coroutine_handle() noexcept = default;
|
|
|
+
|
|
|
+#endif // __has_builtin(__builtin_coro_noop)
|
|
|
};
|
|
|
|
|
|
using noop_coroutine_handle = coroutine_handle<noop_coroutine_promise>;
|
|
|
|
|
|
+#if defined(_LIBCPP_COMPILER_GCC)
|
|
|
+inline noop_coroutine_handle::__noop_coroutine_frame_ty_
|
|
|
+ noop_coroutine_handle::__noop_coroutine_frame_{};
|
|
|
+#endif
|
|
|
+
|
|
|
// [coroutine.noop.coroutine]
|
|
|
inline _LIBCPP_HIDE_FROM_ABI
|
|
|
noop_coroutine_handle noop_coroutine() noexcept { return noop_coroutine_handle(); }
|
|
|
|
|
|
-#endif // __has_builtin(__builtin_coro_noop)
|
|
|
+#endif // __has_builtin(__builtin_coro_noop) || defined(_LIBCPP_COMPILER_GCC)
|
|
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|