aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2021-03-09 16:12:22 +0100
committerEric Botcazou <ebotcazou@adacore.com>2021-03-09 16:22:55 +0100
commitdefafb78cbcb7e2d5abd40379afdecee8b1a0d06 (patch)
tree7327a6bb625ade52873bfdf87b09166b1f11608c /gcc
parent9725df0233b6fb6e761875968b3b8e9fd9f522ac (diff)
downloadgcc-defafb78cbcb7e2d5abd40379afdecee8b1a0d06.zip
gcc-defafb78cbcb7e2d5abd40379afdecee8b1a0d06.tar.gz
gcc-defafb78cbcb7e2d5abd40379afdecee8b1a0d06.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/calls.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/gcc/calls.c b/gcc/calls.c
index 1fea022..ff60620 100644
--- a/gcc/calls.c
+++ b/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;
-
- 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