================ @@ -9363,6 +9363,126 @@ Example: }]; } +def CoroAwaitSuspendDestroyDoc : Documentation { + let Category = DocCatFunction; + let Content = [{ + +The ``[[clang::coro_await_suspend_destroy]]`` attribute applies to an +``await_suspend(std::coroutine_handle<Promise>)`` member function of a +coroutine awaiter. When applied, suspensions into the awaiter use an optimized +call path that bypasses standard suspend intrinsics, and immediately destroys +the suspending coro. + +Instead of calling the annotated ``await_suspend()``, the coroutine calls +``await_suspend_destroy(Promise&)`` and immediately destroys the coroutine. + +Although it is not called, it is strongly recommended that `await_suspend()` +contain the following portability stub. The stub ensures the awaiter behaves +equivalently without `coro_await_suspend_destroy` support, and makes the +control flow clear to readers unfamiliar with the attribute: + +.. code-block:: c++ + + void await_suspend_destroy(Promise&) { /* actual implementation*/ } + [[clang::coro_await_suspend_destroy]] + void await_suspend(std::coroutine_handle<Promise> handle) { + // Stub to preserve behavior when the attribute is not supported + await_suspend_destroy(handle.promise()); + handle.destroy(); + } ---------------- ChuanqiXu9 wrote:
It is clear now but may be too verbose. But I get your point. https://github.com/llvm/llvm-project/pull/152623 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits