From: Eric Botcazou Date: Tue, 9 Mar 2021 15:12:22 +0000 (+0100) Subject: Fix internal error on lambda function X-Git-Tag: releases/gcc-10.3.0~238 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6051af8e3db9e6cea79d0e86da0e0dad286f7e4e;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/calls.c b/gcc/calls.c index e0831e9d4b93..26894342c213 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2308,19 +2308,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