[clang] [llvm] [Coroutines] Introduce [[clang::coro_only_destroy_when_complete]] (PR #71014)

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 8 03:25:24 PST 2023


================
@@ -0,0 +1,59 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 \
+// RUN:     -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s
+
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 \
+// RUN:     -O3 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-O
+
+#include "Inputs/coroutine.h"
+
+using namespace std;
+
+struct A;
+struct A_promise_type {
+  A get_return_object();
+  suspend_always initial_suspend();
+  suspend_always final_suspend() noexcept;
+  void return_value(int);
+  void unhandled_exception();
+
+  std::coroutine_handle<> handle;
+};
+
+struct Awaitable{
+  bool await_ready();
+  int await_resume();
+  template <typename F>
+  void await_suspend(F);
+};
+Awaitable something();
+
+struct dtor {
+    dtor();
+    ~dtor();
+};
+
+struct [[clang::coro_only_destroy_when_complete]] A {
----------------
ChuanqiXu9 wrote:

> Since the attribute is on the return type, would that mean it would apply to any coroutine returning the particular type?

Yes.

> Say user is using some library implementation (i.e. folly::coro::Task), they would not be able to use the attribute because it would mark all the coroutines this way.

Yes. My thought is that such attribute can only be applied if the programmers understand the behavior of the coroutines very well. So that the users of the attribute should be the library writers instead of end users.

And for `folly::coro::Task`, (I didn't check it actively), it can't use the attribute if I remember correctly since its framework supports cancelling, that said, a task can be cancelled before being complete.

https://github.com/llvm/llvm-project/pull/71014


More information about the cfe-commits mailing list