]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
coroutines: Handle lambda closure pointers like 'this'.
authorIain Sandoe <iain@sandoe.co.uk>
Sun, 14 Jun 2020 16:01:57 +0000 (17:01 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Sun, 14 Jun 2020 17:44:43 +0000 (18:44 +0100)
It was agreed amongst the implementors that the correct
interpretation of the standard is that lambda closure pointers
should be treated in the same manner as class object pointers.

gcc/cp/ChangeLog:

* coroutines.cc (instantiate_coro_traits): Pass a reference
to lambda closure objects to traits instantiation.
(morph_fn_to_coro): Likewise for promise parameter
preview and allocator lookup.

(cherry picked from commit 1c140cfbfa4b465a29ef26f1fdfef04c671e3c9c)

gcc/cp/coroutines.cc

index 04be11edac8dcab14f723e0e7754fea792eef260..2e1c3f836756ec17e5b18a070671f2d67fa505eb 100644 (file)
@@ -297,15 +297,14 @@ instantiate_coro_traits (tree fndecl, location_t kw)
 
   tree functyp = TREE_TYPE (fndecl);
   tree arg = DECL_ARGUMENTS (fndecl);
-  bool lambda_p = LAMBDA_FUNCTION_P (fndecl);
   tree arg_node = TYPE_ARG_TYPES (functyp);
   tree argtypes = make_tree_vec (list_length (arg_node)-1);
   unsigned p = 0;
 
   while (arg_node != NULL_TREE && !VOID_TYPE_P (TREE_VALUE (arg_node)))
     {
-      /* See PR94807, as to why we must exclude lambda here.  */
-      if (is_this_parameter (arg) && !lambda_p)
+      if (is_this_parameter (arg)
+         || DECL_NAME (arg) == closure_identifier)
        {
          /* We pass a reference to *this to the param preview.  */
          tree ct = TREE_TYPE (TREE_TYPE (arg));
@@ -3963,9 +3962,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer)
        {
          param_info *parm_i = param_uses->get (arg);
          gcc_checking_assert (parm_i);
-         if (parm_i->lambda_cobj)
-           vec_safe_push (args, arg);
-         else if (parm_i->this_ptr)
+         if (parm_i->this_ptr || parm_i->lambda_cobj)
            {
              /* We pass a reference to *this to the allocator lookup.  */
              tree tt = TREE_TYPE (TREE_TYPE (arg));
@@ -4169,9 +4166,7 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer)
 
          /* Add this to the promise CTOR arguments list, accounting for
             refs and special handling for method this ptr.  */
-         if (parm.lambda_cobj)
-           vec_safe_push (promise_args, arg);
-         else if (parm.this_ptr)
+         if (parm.this_ptr || parm.lambda_cobj)
            {
              /* We pass a reference to *this to the param preview.  */
              tree tt = TREE_TYPE (arg);