diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2020-04-26 19:34:50 +0100 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2020-04-26 20:29:51 +0100 |
commit | 29f55115583a0dab6cbac749c4f0804fd88e9536 (patch) | |
tree | 17d248078a09a9bae1f20fcfec4ba15a4899ae65 | |
parent | 870923cd48e1e715120ff68425437e5b346283a1 (diff) | |
download | gcc-29f55115583a0dab6cbac749c4f0804fd88e9536.zip gcc-29f55115583a0dab6cbac749c4f0804fd88e9536.tar.gz gcc-29f55115583a0dab6cbac749c4f0804fd88e9536.tar.bz2 |
coroutines: Do not assume parms are named [PR94752].
Parameters to user-defined coroutines might be unnamed.
In that case, we must synthesize a name for the coroutine
frame copy.
gcc/cp/ChangeLog:
2020-04-26 Iain Sandoe <iain@sandoe.co.uk>
PR c++/94752
* coroutines.cc (morph_fn_to_coro): Ensure that
unnamed function params have a usable and distinct
frame field name.
gcc/testsuite/ChangeLog:
2020-04-26 Iain Sandoe <iain@sandoe.co.uk>
PR c++/94752
* g++.dg/coroutines/pr94752.C: New test.
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/coroutines.cc | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/coroutines/pr94752.C | 20 |
4 files changed, 41 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f0c6278..32408f7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2020-04-26 Iain Sandoe <iain@sandoe.co.uk> + + PR c++/94752 + * coroutines.cc (morph_fn_to_coro): Ensure that + unnamed function params have a usable and distinct + frame field name. + 2020-04-24 Jason Merrill <jason@redhat.com> PR c++/94583 diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index 4f254b7..0a5a0c9 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -3653,6 +3653,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) when we see uses. */ param_uses = new hash_map<tree, param_info>; + unsigned no_name_parm = 0; for (tree arg = DECL_ARGUMENTS (orig); arg != NULL; arg = DECL_CHAIN (arg)) { @@ -3693,8 +3694,14 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) parm.frame_type = actual_type; parm.this_ptr = is_this_parameter (arg); parm.trivial_dtor = TYPE_HAS_TRIVIAL_DESTRUCTOR (parm.frame_type); - tree pname = DECL_NAME (arg); - char *buf = xasprintf ("__parm.%s", IDENTIFIER_POINTER (pname)); + char *buf; + if (DECL_NAME (arg)) + { + tree pname = DECL_NAME (arg); + buf = xasprintf ("__parm.%s", IDENTIFIER_POINTER (pname)); + } + else + buf = xasprintf ("__unnamed_parm.%d", no_name_parm++); parm.field_id = coro_make_frame_entry (&field_list, buf, actual_type, DECL_SOURCE_LOCATION (arg)); free (buf); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c4f5f83..07fe8a6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-26 Iain Sandoe <iain@sandoe.co.uk> + + PR c++/94752 + * g++.dg/coroutines/pr94752.C: New test. + 2020-04-26 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/94737 diff --git a/gcc/testsuite/g++.dg/coroutines/pr94752.C b/gcc/testsuite/g++.dg/coroutines/pr94752.C new file mode 100644 index 0000000..89ace6a --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/pr94752.C @@ -0,0 +1,20 @@ +// { dg-additional-options "-w" } + +#include "coro.h" + +using namespace std; + +struct task { + struct promise_type { + promise_type() {} + task get_return_object() { return {}; } + suspend_never initial_suspend() { return {}; } + suspend_never final_suspend() { return {}; } + void return_void() {} + void unhandled_exception() {} + }; +}; + +task foo(int) { + co_return; +} |