From: Eric Botcazou Date: Tue, 9 Mar 2021 15:12:22 +0000 (+0100) Subject: Fix internal error on lambda function X-Git-Tag: basepoints/gcc-12~678 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=defafb78cbcb7e2d5abd40379afdecee8b1a0d06;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 1fea022ad8af..ff606204772b 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