From: Iain Sandoe Date: Sun, 26 Apr 2020 18:34:50 +0000 (+0100) Subject: coroutines: Do not assume parms are named [PR94752]. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=29f55115583a0dab6cbac749c4f0804fd88e9536;p=gcc.git 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 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 PR c++/94752 * g++.dg/coroutines/pr94752.C: New test. --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f0c62783101..32408f7056b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2020-04-26 Iain Sandoe + + 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 PR c++/94583 diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index 4f254b7fd10..0a5a0c9b1d2 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; + 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 c4f5f83552e..07fe8a68598 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-26 Iain Sandoe + + PR c++/94752 + * g++.dg/coroutines/pr94752.C: New test. + 2020-04-26 Thomas Koenig 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 00000000000..89ace6a6bff --- /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; +}