Fix internal error on lambda function
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.
This commit is contained in:
parent
9725df0233
commit
defafb78cb
22
gcc/calls.c
22
gcc/calls.c
|
@ -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;
|
||||
const bool callee_copies
|
||||
= reference_callee_copied (args_so_far_pnt, arg);
|
||||
tree base;
|
||||
|
||||
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)))))
|
||||
/* 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
|
||||
|
|
Loading…
Reference in New Issue