diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2024-08-26 14:09:40 +0100 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2024-08-27 08:41:37 +0100 |
commit | 8d6d6c864442a1cc987b3e6bcb1d903ceb975e4a (patch) | |
tree | 26ac9109d93fc7f45add9018b039c67e843d6671 /gcc | |
parent | 172637cf0d9b7b2798f83b9c5f9598b449675cb0 (diff) | |
download | gcc-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.cc | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/coroutines/pr116482.C | 30 |
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; +} |