]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++, coroutines: Partial reversion of r12-8308-g15a176a833f23e [PR105426].
authorIain Sandoe <iain@sandoe.co.uk>
Thu, 28 Apr 2022 19:06:29 +0000 (20:06 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Fri, 29 Apr 2022 06:36:26 +0000 (07:36 +0100)
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.

gcc/cp/coroutines.cc

index 551ddc9cc4139110cdc11072ac03c54e556f84d6..1d886b31c77e1e2dd2c5bf3236c7844cdbafe681 100644 (file)
@@ -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.  */
        }