diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2021-03-09 16:12:22 +0100 |
---|---|---|
committer | Eric Botcazou <ebotcazou@adacore.com> | 2021-03-09 16:22:55 +0100 |
commit | defafb78cbcb7e2d5abd40379afdecee8b1a0d06 (patch) | |
tree | 7327a6bb625ade52873bfdf87b09166b1f11608c /gcc | |
parent | 9725df0233b6fb6e761875968b3b8e9fd9f522ac (diff) | |
download | gcc-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.c | 24 |
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 |