]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++, coroutines: The frame pointer is used in the helpers [PR116482].
authorIain Sandoe <iain@sandoe.co.uk>
Mon, 26 Aug 2024 13:09:40 +0000 (14:09 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Tue, 27 Aug 2024 07:41:37 +0000 (08:41 +0100)
We have a bogus warning about the coroutine state frame pointers
being apparently unused in the resume and destroy functions.  Fixed
by making the parameters DECL_ARTIFICIAL.

PR c++/116482

gcc/cp/ChangeLog:

* coroutines.cc
(coro_build_actor_or_destroy_function): Make the parameter
decls DECL_ARTIFICIAL.

gcc/testsuite/ChangeLog:

* g++.dg/coroutines/pr116482.C: New test.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/cp/coroutines.cc
gcc/testsuite/g++.dg/coroutines/pr116482.C [new file with mode: 0644]

index 5bfd7943fb813429a3c053ebbfcfa390e153ab0a..31dc39afeee294c124661bbc549e204a8df69fb8 100644 (file)
@@ -4065,6 +4065,7 @@ coro_build_actor_or_destroy_function (tree orig, tree fn_type,
 
   tree id = get_identifier ("frame_ptr");
   tree fp = build_lang_decl (PARM_DECL, id, coro_frame_ptr);
+  DECL_ARTIFICIAL (fp) = true;
   DECL_CONTEXT (fp) = fn;
   DECL_ARG_TYPE (fp) = type_passed_as (coro_frame_ptr);
   DECL_ARGUMENTS (fn) = fp;
diff --git a/gcc/testsuite/g++.dg/coroutines/pr116482.C b/gcc/testsuite/g++.dg/coroutines/pr116482.C
new file mode 100644 (file)
index 0000000..702d1e2
--- /dev/null
@@ -0,0 +1,30 @@
+// Override default options.
+// { dg-options "-std=c++20 -fno-exceptions -Wall -Wextra" }
+
+#include <coroutine>
+
+struct SuspendNever {
+    bool await_ready();
+    void await_suspend(std::coroutine_handle<>);
+    void await_resume();
+};
+
+struct Coroutine;
+
+struct PromiseType {
+    Coroutine get_return_object();
+    SuspendNever initial_suspend();
+    SuspendNever final_suspend();
+#if __cpp_exceptions
+    void unhandled_exception() { /*std::terminate();*/ };
+#endif
+    void return_void();
+};
+
+struct Coroutine {
+    using promise_type = PromiseType;
+};
+
+Coroutine __async_test_input_basic() {
+    co_return;
+}