aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2022-04-28 20:06:29 +0100
committerIain Sandoe <iain@sandoe.co.uk>2022-04-29 07:36:26 +0100
commit3d8d093e820b10a4b4b2af8949a368377c0888cb (patch)
treeaed18909cd70650cb669e4e71bd85b9d10e916df /gcc
parente27eef7478f30ea79048dbde3317e89679d75a6e (diff)
downloadgcc-3d8d093e820b10a4b4b2af8949a368377c0888cb.zip
gcc-3d8d093e820b10a4b4b2af8949a368377c0888cb.tar.gz
gcc-3d8d093e820b10a4b4b2af8949a368377c0888cb.tar.bz2
c++, coroutines: Partial reversion of r12-8308-g15a176a833f23e [PR105426].
The changes to fix PR 105287 included a tightening of the constraints on which variables are promoted to frame copies. This has exposed that we are failing to name some variables that should be promoted. We avoid the use of DECL_UID to build anonymous symbols since that might not be stable for -fcompare-debug. The long-term fix is to address the cases where the naming has been missed, but for the short-term (and for the GCC-12 branch) backing out the additional constraint is proposed. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> PR c++/105426 gcc/cp/ChangeLog: * coroutines.cc (register_local_var_uses): Allow promotion of unnamed temporaries to coroutine frame copies.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/coroutines.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index 551ddc9..1d886b3 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -3913,6 +3913,7 @@ register_local_var_uses (tree *stmt, int *do_subtree, void *d)
if (TREE_CODE (*stmt) == BIND_EXPR)
{
tree lvar;
+ unsigned serial = 0;
for (lvar = BIND_EXPR_VARS (*stmt); lvar != NULL;
lvar = DECL_CHAIN (lvar))
{
@@ -3973,14 +3974,15 @@ register_local_var_uses (tree *stmt, int *do_subtree, void *d)
else if (lvname != NULL_TREE)
buf = xasprintf ("%s_%u_%u", IDENTIFIER_POINTER (lvname),
lvd->nest_depth, lvd->bind_indx);
+ else
+ buf = xasprintf ("_D%u_%u_%u", lvd->nest_depth, lvd->bind_indx,
+ serial++);
+
/* TODO: Figure out if we should build a local type that has any
excess alignment or size from the original decl. */
- if (buf)
- {
- local_var.field_id = coro_make_frame_entry (lvd->field_list, buf,
- lvtype, lvd->loc);
- free (buf);
- }
+ local_var.field_id = coro_make_frame_entry (lvd->field_list, buf,
+ lvtype, lvd->loc);
+ free (buf);
/* We don't walk any of the local var sub-trees, they won't contain
any bind exprs. */
}