aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2024-08-26 14:09:40 +0100
committerIain Sandoe <iain@sandoe.co.uk>2024-08-27 08:41:37 +0100
commit8d6d6c864442a1cc987b3e6bcb1d903ceb975e4a (patch)
tree26ac9109d93fc7f45add9018b039c67e843d6671 /gcc
parent172637cf0d9b7b2798f83b9c5f9598b449675cb0 (diff)
downloadgcc-8d6d6c864442a1cc987b3e6bcb1d903ceb975e4a.zip
gcc-8d6d6c864442a1cc987b3e6bcb1d903ceb975e4a.tar.gz
gcc-8d6d6c864442a1cc987b3e6bcb1d903ceb975e4a.tar.bz2
c++, coroutines: The frame pointer is used in the helpers [PR116482].
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/coroutines.cc1
-rw-r--r--gcc/testsuite/g++.dg/coroutines/pr116482.C30
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index 5bfd794..31dc39a 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -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
index 0000000..702d1e2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr116482.C
@@ -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;
+}