]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix internal error on lambda function
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 9 Mar 2021 15:12:22 +0000 (16:12 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Tue, 9 Mar 2021 15:22:55 +0000 (16:22 +0100)
This boils down to the RTL expander trying to take the address of a DECL
whose RTX is a register.

gcc/
PR c++/90448
* calls.c (initialize_argument_information): When the argument
is passed by reference, do not make a copy in a thunk only if
the argument is already in memory.  Remove redundant test for
the case of callee copy.

gcc/calls.c

index 1fea022ad8af799b3456bf6376bc55a6a78beeb0..ff606204772bd3e98064b2ccd5f90cab09ae1062 100644 (file)
@@ -2388,19 +2388,17 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
       function_arg_info arg (type, argpos < n_named_args);
       if (pass_by_reference (args_so_far_pnt, arg))
        {
-         bool callee_copies;
-         tree base = NULL_TREE;
-
-         callee_copies = reference_callee_copied (args_so_far_pnt, arg);
-
-         /* If we're compiling a thunk, pass through invisible references
-            instead of making a copy.  */
-         if (call_from_thunk_p
-             || (callee_copies
-                 && !TREE_ADDRESSABLE (type)
-                 && (base = get_base_address (args[i].tree_value))
-                 && TREE_CODE (base) != SSA_NAME
-                 && (!DECL_P (base) || MEM_P (DECL_RTL (base)))))
+         const bool callee_copies
+           = reference_callee_copied (args_so_far_pnt, arg);
+         tree base;
+
+         /* If we're compiling a thunk, pass directly the address of an object
+            already in memory, instead of making a copy.  Likewise if we want
+            to make the copy in the callee instead of the caller.  */
+         if ((call_from_thunk_p || callee_copies)
+             && (base = get_base_address (args[i].tree_value))
+             && TREE_CODE (base) != SSA_NAME
+             && (!DECL_P (base) || MEM_P (DECL_RTL (base))))
            {
              /* We may have turned the parameter value into an SSA name.
                 Go back to the original parameter so we can take the