Bug Summary

File:build/gcc/cp/optimize.cc
Warning:line 695, column 7
Value stored to 'first' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-suse-linux -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name optimize.cc -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model static -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -resource-dir /usr/lib64/clang/15.0.7 -D IN_GCC_FRONTEND -D IN_GCC -D HAVE_CONFIG_H -I . -I cp -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcpp/include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcody -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber/bid -I ../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libbacktrace -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/x86_64-suse-linux -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/backward -internal-isystem /usr/lib64/clang/15.0.7/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-narrowing -Wwrite-strings -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fdeprecated-macro -fdebug-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -ferror-limit 19 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=plist-html -analyzer-config silence-checkers=core.NullDereference -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /buildworker/marxinbox-gcc-clang-static-analyzer/objdir/clang-static-analyzer/2023-03-27-141847-20772-1/report-Pn0XjS.plist -x c++ /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc
1/* Perform optimizations on tree structure.
2 Copyright (C) 1998-2023 Free Software Foundation, Inc.
3 Written by Mark Michell (mark@codesourcery.com).
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful, but
13WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "target.h"
25#include "cp-tree.h"
26#include "stringpool.h"
27#include "cgraph.h"
28#include "debug.h"
29#include "tree-inline.h"
30#include "tree-iterator.h"
31
32/* Prototypes. */
33
34static void update_cloned_parm (tree, tree, bool);
35
36/* CLONED_PARM is a copy of CLONE, generated for a cloned constructor
37 or destructor. Update it to ensure that the source-position for
38 the cloned parameter matches that for the original, and that the
39 debugging generation code will be able to find the original PARM. */
40
41static void
42update_cloned_parm (tree parm, tree cloned_parm, bool first)
43{
44 DECL_ABSTRACT_ORIGIN (cloned_parm)((contains_struct_check ((cloned_parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 44, __FUNCTION__))->decl_common.abstract_origin)
= parm;
45
46 /* We may have taken its address. */
47 TREE_ADDRESSABLE (cloned_parm)((cloned_parm)->base.addressable_flag) = TREE_ADDRESSABLE (parm)((parm)->base.addressable_flag);
48
49 DECL_BY_REFERENCE (cloned_parm)((tree_check3 ((cloned_parm), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 49, __FUNCTION__, (VAR_DECL), (PARM_DECL), (RESULT_DECL)))->
decl_common.decl_by_reference_flag)
= DECL_BY_REFERENCE (parm)((tree_check3 ((parm), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 49, __FUNCTION__, (VAR_DECL), (PARM_DECL), (RESULT_DECL)))->
decl_common.decl_by_reference_flag)
;
50
51 /* The definition might have different constness. */
52 TREE_READONLY (cloned_parm)((non_type_check ((cloned_parm), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 52, __FUNCTION__))->base.readonly_flag)
= TREE_READONLY (parm)((non_type_check ((parm), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 52, __FUNCTION__))->base.readonly_flag)
;
53
54 TREE_USED (cloned_parm)((cloned_parm)->base.used_flag) = !first || TREE_USED (parm)((parm)->base.used_flag);
55
56 /* The name may have changed from the declaration. */
57 DECL_NAME (cloned_parm)((contains_struct_check ((cloned_parm), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 57, __FUNCTION__))->decl_minimal.name)
= DECL_NAME (parm)((contains_struct_check ((parm), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 57, __FUNCTION__))->decl_minimal.name)
;
58 DECL_SOURCE_LOCATION (cloned_parm)((contains_struct_check ((cloned_parm), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 58, __FUNCTION__))->decl_minimal.locus)
= DECL_SOURCE_LOCATION (parm)((contains_struct_check ((parm), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 58, __FUNCTION__))->decl_minimal.locus)
;
59 TREE_TYPE (cloned_parm)((contains_struct_check ((cloned_parm), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 59, __FUNCTION__))->typed.type)
= TREE_TYPE (parm)((contains_struct_check ((parm), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 59, __FUNCTION__))->typed.type)
;
60
61 DECL_NOT_GIMPLE_REG_P (cloned_parm)(contains_struct_check ((cloned_parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 61, __FUNCTION__))->decl_common.not_gimple_reg_flag
= DECL_NOT_GIMPLE_REG_P (parm)(contains_struct_check ((parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 61, __FUNCTION__))->decl_common.not_gimple_reg_flag
;
62}
63
64/* Like copy_decl_no_change, but handle DECL_OMP_PRIVATIZED_MEMBER
65 properly. */
66
67static tree
68cxx_copy_decl (tree decl, copy_body_data *id)
69{
70 tree copy = copy_decl_no_change (decl, id);
71 if (VAR_P (decl)(((enum tree_code) (decl)->base.code) == VAR_DECL)
72 && DECL_HAS_VALUE_EXPR_P (decl)((tree_check3 ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 72, __FUNCTION__, (VAR_DECL), (PARM_DECL), (RESULT_DECL))) ->
decl_common.decl_flag_2)
73 && DECL_ARTIFICIAL (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 73, __FUNCTION__))->decl_common.artificial_flag)
74 && DECL_LANG_SPECIFIC (decl)((contains_struct_check ((decl), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 74, __FUNCTION__))->decl_common.lang_specific)
75 && DECL_OMP_PRIVATIZED_MEMBER (decl)(((contains_struct_check (((tree_check ((decl), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 75, __FUNCTION__, (VAR_DECL)))), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 75, __FUNCTION__))->decl_common.lang_specific)->u.base
.anticipated_p)
)
76 {
77 tree expr = DECL_VALUE_EXPR (copy)(decl_value_expr_lookup ((contains_struct_check ((copy), (TS_DECL_WRTL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 77, __FUNCTION__))))
;
78 walk_tree (&expr, copy_tree_body_r, id, NULL)walk_tree_1 (&expr, copy_tree_body_r, id, nullptr, nullptr
)
;
79 SET_DECL_VALUE_EXPR (copy, expr)(decl_value_expr_insert ((contains_struct_check ((copy), (TS_DECL_WRTL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 79, __FUNCTION__)), expr))
;
80 }
81 return copy;
82}
83
84/* FN is a function in High GIMPLE form that has a complete body and no
85 CFG. CLONE is a function whose body is to be set to a copy of FN,
86 mapping argument declarations according to the ARG_MAP splay_tree. */
87
88static void
89clone_body (tree clone, tree fn, void *arg_map)
90{
91 copy_body_data id;
92 tree stmts;
93
94 /* Clone the body, as if we were making an inline call. But, remap
95 the parameters in the callee to the parameters of caller. */
96 memset (&id, 0, sizeof (id));
97 id.src_fn = fn;
98 id.dst_fn = clone;
99 id.src_cfun = DECL_STRUCT_FUNCTION (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 99, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f)
;
100 id.decl_map = static_cast<hash_map<tree, tree> *> (arg_map);
101
102 id.copy_decl = cxx_copy_decl;
103 id.transform_call_graph_edges = CB_CGE_DUPLICATE;
104 id.transform_new_cfg = true;
105 id.transform_return_to_modify = false;
106
107 /* We're not inside any EH region. */
108 id.eh_lp_nr = 0;
109
110 stmts = DECL_SAVED_TREE (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 110, __FUNCTION__, (FUNCTION_DECL)))->function_decl.saved_tree
)
;
111 walk_tree (&stmts, copy_tree_body_r, &id, NULL)walk_tree_1 (&stmts, copy_tree_body_r, &id, nullptr, nullptr
)
;
112
113 /* Also remap the initializer of any static variables so that they (in
114 particular, any label addresses) correspond to the base variant rather
115 than the abstract one. */
116 if (DECL_NAME (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 116, __FUNCTION__))->decl_minimal.name)
== base_dtor_identifiercp_global_trees[CPTI_BASE_DTOR_IDENTIFIER]
117 || DECL_NAME (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 117, __FUNCTION__))->decl_minimal.name)
== base_ctor_identifiercp_global_trees[CPTI_BASE_CTOR_IDENTIFIER])
118 {
119 unsigned ix;
120 tree decl;
121
122 FOR_EACH_LOCAL_DECL (DECL_STRUCT_FUNCTION (fn), ix, decl)for (ix = vec_safe_length ((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 122, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f))->
local_decls) - 1; vec_safe_iterate (((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 122, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f))->
local_decls), (ix), &(decl)); (ix)--)
123 walk_tree (&DECL_INITIAL (decl), copy_tree_body_r, &id, NULL)walk_tree_1 (&((contains_struct_check ((decl), (TS_DECL_COMMON
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 123, __FUNCTION__))->decl_common.initial), copy_tree_body_r
, &id, nullptr, nullptr)
;
124 }
125
126 append_to_statement_list_force (stmts, &DECL_SAVED_TREE (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 126, __FUNCTION__, (FUNCTION_DECL)))->function_decl.saved_tree
)
);
127}
128
129/* DELETE_DTOR is a delete destructor whose body will be built.
130 COMPLETE_DTOR is the corresponding complete destructor. */
131
132static void
133build_delete_destructor_body (tree delete_dtor, tree complete_dtor)
134{
135 tree parm = DECL_ARGUMENTS (delete_dtor)((tree_check ((delete_dtor), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 135, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
;
136 tree virtual_size = cxx_sizeof (current_class_type)cxx_sizeof_or_alignof_type (input_location, scope_chain->class_type
, SIZEOF_EXPR, false, true)
;
137
138 /* Call the delete function. */
139 tree call_delete = build_op_delete_call (DELETE_EXPR, current_class_ptr(*((cfun + 0) && ((cfun + 0)->language) ? &((cfun
+ 0)->language)->x_current_class_ptr : &scope_chain
->x_current_class_ptr))
,
140 virtual_size,
141 /*global_p=*/false,
142 /*placement=*/NULL_TREE(tree) nullptr,
143 /*alloc_fn=*/NULL_TREE(tree) nullptr,
144 tf_warning_or_error);
145
146 tree op = get_callee_fndecl (call_delete);
147 if (op && DECL_P (op)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (op)->base.code))] == tcc_declaration)
&& destroying_delete_p (op))
148 {
149 /* The destroying delete will handle calling complete_dtor. */
150 add_stmt (call_delete);
151 }
152 else
153 {
154 /* Call the corresponding complete destructor. */
155 gcc_assert (complete_dtor)((void)(!(complete_dtor) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 155, __FUNCTION__), 0 : 0))
;
156 tree call_dtor = build_cxx_call (complete_dtor, 1, &parm,
157 tf_warning_or_error);
158
159 /* Operator delete must be called, whether or not the dtor throws. */
160 add_stmt (build2 (TRY_FINALLY_EXPR, void_type_nodeglobal_trees[TI_VOID_TYPE],
161 call_dtor, call_delete));
162 }
163
164 /* Return the address of the object.
165 ??? How is it useful to return an invalid address? */
166 maybe_return_this ();
167}
168
169/* Return name of comdat group for complete and base ctor (or dtor)
170 that have the same body. If dtor is virtual, deleting dtor goes
171 into this comdat group as well. */
172
173static tree
174cdtor_comdat_group (tree complete, tree base)
175{
176 tree complete_name = DECL_ASSEMBLER_NAME (complete)decl_assembler_name (complete);
177 tree base_name = DECL_ASSEMBLER_NAME (base)decl_assembler_name (base);
178 char *grp_name;
179 const char *p, *q;
180 bool diff_seen = false;
181 size_t idx;
182 gcc_assert (IDENTIFIER_LENGTH (complete_name)((void)(!(((tree_check ((complete_name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 182, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.len
) == ((tree_check ((base_name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 183, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.len
)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 183, __FUNCTION__), 0 : 0))
183 == IDENTIFIER_LENGTH (base_name))((void)(!(((tree_check ((complete_name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 182, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.len
) == ((tree_check ((base_name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 183, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.len
)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 183, __FUNCTION__), 0 : 0))
;
184 grp_name = XALLOCAVEC (char, IDENTIFIER_LENGTH (complete_name) + 1)((char *) __builtin_alloca(sizeof (char) * (((tree_check ((complete_name
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 184, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.len
) + 1)))
;
185 p = IDENTIFIER_POINTER (complete_name)((const char *) (tree_check ((complete_name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 185, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str
)
;
186 q = IDENTIFIER_POINTER (base_name)((const char *) (tree_check ((base_name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 186, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.str
)
;
187 for (idx = 0; idx < IDENTIFIER_LENGTH (complete_name)((tree_check ((complete_name), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 187, __FUNCTION__, (IDENTIFIER_NODE)))->identifier.id.len
)
; idx++)
188 if (p[idx] == q[idx])
189 grp_name[idx] = p[idx];
190 else
191 {
192 gcc_assert (!diff_seen((void)(!(!diff_seen && idx > 0 && (p[idx -
1] == 'C' || p[idx - 1] == 'D' || p[idx - 1] == 'I') &&
p[idx] == '1' && q[idx] == '2') ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 197, __FUNCTION__), 0 : 0))
193 && idx > 0((void)(!(!diff_seen && idx > 0 && (p[idx -
1] == 'C' || p[idx - 1] == 'D' || p[idx - 1] == 'I') &&
p[idx] == '1' && q[idx] == '2') ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 197, __FUNCTION__), 0 : 0))
194 && (p[idx - 1] == 'C' || p[idx - 1] == 'D'((void)(!(!diff_seen && idx > 0 && (p[idx -
1] == 'C' || p[idx - 1] == 'D' || p[idx - 1] == 'I') &&
p[idx] == '1' && q[idx] == '2') ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 197, __FUNCTION__), 0 : 0))
195 || p[idx - 1] == 'I')((void)(!(!diff_seen && idx > 0 && (p[idx -
1] == 'C' || p[idx - 1] == 'D' || p[idx - 1] == 'I') &&
p[idx] == '1' && q[idx] == '2') ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 197, __FUNCTION__), 0 : 0))
196 && p[idx] == '1'((void)(!(!diff_seen && idx > 0 && (p[idx -
1] == 'C' || p[idx - 1] == 'D' || p[idx - 1] == 'I') &&
p[idx] == '1' && q[idx] == '2') ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 197, __FUNCTION__), 0 : 0))
197 && q[idx] == '2')((void)(!(!diff_seen && idx > 0 && (p[idx -
1] == 'C' || p[idx - 1] == 'D' || p[idx - 1] == 'I') &&
p[idx] == '1' && q[idx] == '2') ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 197, __FUNCTION__), 0 : 0))
;
198 grp_name[idx] = '5';
199 diff_seen = true;
200 }
201 grp_name[idx] = '\0';
202 gcc_assert (diff_seen)((void)(!(diff_seen) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 202, __FUNCTION__), 0 : 0))
;
203 return get_identifier (grp_name)(__builtin_constant_p (grp_name) ? get_identifier_with_length
((grp_name), strlen (grp_name)) : get_identifier (grp_name))
;
204}
205
206/* Returns true iff we can make the base and complete [cd]tor aliases of
207 the same symbol rather than separate functions. */
208
209static bool
210can_alias_cdtor (tree fn)
211{
212 /* If aliases aren't supported by the assembler, fail. */
213 if (!TARGET_SUPPORTS_ALIASES1)
214 return false;
215
216 /* We can't use an alias if there are virtual bases. */
217 if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn))((((tree_class_check ((((contains_struct_check ((fn), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 217, __FUNCTION__))->decl_minimal.context)), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 217, __FUNCTION__))->type_with_lang_specific.lang_specific
))->vbases)
)
218 return false;
219 gcc_assert (DECL_MAYBE_IN_CHARGE_CDTOR_P (fn))((void)(!(((((contains_struct_check ((fn), (TS_DECL_MINIMAL),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 219, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_CTOR_IDENTIFIER]) || (((contains_struct_check ((fn), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 219, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_DTOR_IDENTIFIER]))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 219, __FUNCTION__), 0 : 0))
;
220 /* Don't use aliases for weak/linkonce definitions unless we can put both
221 symbols in the same COMDAT group. */
222 return (DECL_INTERFACE_KNOWN (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 222, __FUNCTION__))->decl_common.lang_flag_5)
223 && (SUPPORTS_ONE_ONLY1 || !DECL_WEAK (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 223, __FUNCTION__))->decl_with_vis.weak_flag)
)
224 && (!DECL_ONE_ONLY (fn)(decl_comdat_group (fn) != (tree) nullptr && (((fn)->
base.public_flag) || ((contains_struct_check ((fn), (TS_DECL_COMMON
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 224, __FUNCTION__))->decl_common.decl_flag_1)))
225 || (HAVE_COMDAT_GROUP1 && DECL_WEAK (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 225, __FUNCTION__))->decl_with_vis.weak_flag)
)));
226}
227
228/* FN is a [cd]tor, fns is a pointer to an array of length 3. Fill fns
229 with pointers to the base, complete, and deleting variants. */
230
231static void
232populate_clone_array (tree fn, tree *fns)
233{
234 tree clone;
235
236 fns[0] = NULL_TREE(tree) nullptr;
237 fns[1] = NULL_TREE(tree) nullptr;
238 fns[2] = NULL_TREE(tree) nullptr;
239
240 FOR_EACH_CLONE (clone, fn)if (!(((enum tree_code) (fn)->base.code) == FUNCTION_DECL &&
((((contains_struct_check ((fn), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_CTOR_IDENTIFIER]) || (((contains_struct_check ((fn), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_DTOR_IDENTIFIER])))) ; else for (clone = (((contains_struct_check
(((contains_struct_check ((fn), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))->common.chain)); clone && ((
(contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))->decl_minimal.name) && ((!((
tree_not_check2 (((tree_check ((((contains_struct_check ((clone
), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits
.lang_flag_2)) & ((tree_not_check2 (((tree_check ((((contains_struct_check
((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits
.lang_flag_1)) && !((((contains_struct_check ((clone)
, (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_CTOR_IDENTIFIER]) || (((contains_struct_check ((clone),
(TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_DTOR_IDENTIFIER]))); clone = (((contains_struct_check (
((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 240, __FUNCTION__))->common.chain)))
241 if (DECL_NAME (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 241, __FUNCTION__))->decl_minimal.name)
== complete_dtor_identifiercp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER]
242 || DECL_NAME (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 242, __FUNCTION__))->decl_minimal.name)
== complete_ctor_identifiercp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER])
243 fns[1] = clone;
244 else if (DECL_NAME (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 244, __FUNCTION__))->decl_minimal.name)
== base_dtor_identifiercp_global_trees[CPTI_BASE_DTOR_IDENTIFIER]
245 || DECL_NAME (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 245, __FUNCTION__))->decl_minimal.name)
== base_ctor_identifiercp_global_trees[CPTI_BASE_CTOR_IDENTIFIER])
246 fns[0] = clone;
247 else if (DECL_NAME (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 247, __FUNCTION__))->decl_minimal.name)
== deleting_dtor_identifiercp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER])
248 fns[2] = clone;
249 else
250 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 250, __FUNCTION__))
;
251}
252
253/* FN is a constructor or destructor, and there are FUNCTION_DECLs
254 cloned from it nearby. Instead of cloning this body, leave it
255 alone and create tiny one-call bodies for the cloned
256 FUNCTION_DECLs. These clones are sibcall candidates, and their
257 resulting code will be very thunk-esque. */
258
259static bool
260maybe_thunk_body (tree fn, bool force)
261{
262 tree bind, block, call, clone, clone_result, fn_parm, fn_parm_typelist;
263 tree last_arg, modify, *args;
264 int parmno, vtt_parmno, max_parms;
265 tree fns[3];
266
267 if (!force && !flag_declone_ctor_dtorglobal_options.x_flag_declone_ctor_dtor)
268 return 0;
269
270 /* If function accepts variable arguments, give up. */
271 last_arg = tree_last (TYPE_ARG_TYPES (TREE_TYPE (fn))((tree_check2 ((((contains_struct_check ((fn), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 271, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 271, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))->type_non_common
.values)
);
272 if (last_arg != void_list_nodeglobal_trees[TI_VOID_LIST_NODE])
273 return 0;
274
275 /* If we got this far, we've decided to turn the clones into thunks. */
276
277 /* We're going to generate code for fn, so it is no longer "abstract."
278 Also make the unified ctor/dtor private to either the translation unit
279 (for non-vague linkage ctors) or the COMDAT group (otherwise). */
280
281 populate_clone_array (fn, fns);
282
283 /* Can happen during error recovery (c++/71464). */
284 if (!fns[0] || !fns[1])
285 return 0;
286
287 /* Don't use thunks if the base clone omits inherited parameters. */
288 if (ctor_omit_inherited_parms (fns[0]))
289 return 0;
290
291 DECL_ABSTRACT_P (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 291, __FUNCTION__))->decl_common.abstract_flag)
= false;
292 if (!DECL_WEAK (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 292, __FUNCTION__))->decl_with_vis.weak_flag)
)
293 {
294 TREE_PUBLIC (fn)((fn)->base.public_flag) = false;
295 DECL_EXTERNAL (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 295, __FUNCTION__))->decl_common.decl_flag_1)
= false;
296 DECL_INTERFACE_KNOWN (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 296, __FUNCTION__))->decl_common.lang_flag_5)
= true;
297 }
298 else if (HAVE_COMDAT_GROUP1)
299 {
300 /* At eof, defer creation of mangling aliases temporarily. */
301 bool save_defer_mangling_aliases = defer_mangling_aliases;
302 defer_mangling_aliases = true;
303 tree comdat_group = cdtor_comdat_group (fns[1], fns[0]);
304 defer_mangling_aliases = save_defer_mangling_aliases;
305 cgraph_node::get_create (fns[0])->set_comdat_group (comdat_group);
306 cgraph_node::get_create (fns[1])->add_to_same_comdat_group
307 (cgraph_node::get_create (fns[0]));
308 symtab_node::get (fn)->add_to_same_comdat_group
309 (symtab_node::get (fns[0]));
310 if (fns[2])
311 /* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
312 virtual, it goes into the same comdat group as well. */
313 cgraph_node::get_create (fns[2])->add_to_same_comdat_group
314 (symtab_node::get (fns[0]));
315 /* Emit them now that the thunks are same comdat group aliases. */
316 if (!save_defer_mangling_aliases)
317 generate_mangling_aliases ();
318 TREE_PUBLIC (fn)((fn)->base.public_flag) = false;
319 DECL_EXTERNAL (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 319, __FUNCTION__))->decl_common.decl_flag_1)
= false;
320 DECL_INTERFACE_KNOWN (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 320, __FUNCTION__))->decl_common.lang_flag_5)
= true;
321 /* function_and_variable_visibility doesn't want !PUBLIC decls to
322 have these flags set. */
323 DECL_WEAK (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 323, __FUNCTION__))->decl_with_vis.weak_flag)
= false;
324 DECL_COMDAT (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 324, __FUNCTION__))->decl_with_vis.comdat_flag)
= false;
325 }
326
327 /* Find the vtt_parm, if present. */
328 for (vtt_parmno = -1, parmno = 0, fn_parm = DECL_ARGUMENTS (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 328, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
;
329 fn_parm;
330 ++parmno, fn_parm = TREE_CHAIN (fn_parm)((contains_struct_check ((fn_parm), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 330, __FUNCTION__))->common.chain)
)
331 {
332 if (DECL_ARTIFICIAL (fn_parm)((contains_struct_check ((fn_parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 332, __FUNCTION__))->decl_common.artificial_flag)
333 && DECL_NAME (fn_parm)((contains_struct_check ((fn_parm), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 333, __FUNCTION__))->decl_minimal.name)
== vtt_parm_identifiercp_global_trees[CPTI_VTT_PARM_IDENTIFIER])
334 {
335 /* Compensate for removed in_charge parameter. */
336 vtt_parmno = parmno;
337 break;
338 }
339 }
340
341 /* Allocate an argument buffer for build_cxx_call().
342 Make sure it is large enough for any of the clones. */
343 max_parms = 0;
344 FOR_EACH_CLONE (clone, fn)if (!(((enum tree_code) (fn)->base.code) == FUNCTION_DECL &&
((((contains_struct_check ((fn), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_CTOR_IDENTIFIER]) || (((contains_struct_check ((fn), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_DTOR_IDENTIFIER])))) ; else for (clone = (((contains_struct_check
(((contains_struct_check ((fn), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))->common.chain)); clone && ((
(contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))->decl_minimal.name) && ((!((
tree_not_check2 (((tree_check ((((contains_struct_check ((clone
), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits
.lang_flag_2)) & ((tree_not_check2 (((tree_check ((((contains_struct_check
((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits
.lang_flag_1)) && !((((contains_struct_check ((clone)
, (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_CTOR_IDENTIFIER]) || (((contains_struct_check ((clone),
(TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_DTOR_IDENTIFIER]))); clone = (((contains_struct_check (
((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 344, __FUNCTION__))->common.chain)))
345 {
346 int length = list_length (DECL_ARGUMENTS (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 346, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
);
347 if (length > max_parms)
348 max_parms = length;
349 }
350 args = XALLOCAVEC (tree, max_parms)((tree *) __builtin_alloca(sizeof (tree) * (max_parms)));
351
352 /* We know that any clones immediately follow FN in TYPE_FIELDS. */
353 FOR_EACH_CLONE (clone, fn)if (!(((enum tree_code) (fn)->base.code) == FUNCTION_DECL &&
((((contains_struct_check ((fn), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_CTOR_IDENTIFIER]) || (((contains_struct_check ((fn), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_DTOR_IDENTIFIER])))) ; else for (clone = (((contains_struct_check
(((contains_struct_check ((fn), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))->common.chain)); clone && ((
(contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))->decl_minimal.name) && ((!((
tree_not_check2 (((tree_check ((((contains_struct_check ((clone
), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits
.lang_flag_2)) & ((tree_not_check2 (((tree_check ((((contains_struct_check
((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))->decl_minimal.name)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__, (IDENTIFIER_NODE)))), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__, (TREE_VEC), (SSA_NAME)))->base.u.bits
.lang_flag_1)) && !((((contains_struct_check ((clone)
, (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_CTOR_IDENTIFIER]) || (((contains_struct_check ((clone),
(TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_DTOR_IDENTIFIER]))); clone = (((contains_struct_check (
((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 353, __FUNCTION__))->common.chain)))
354 {
355 tree clone_parm;
356
357 /* If we've already generated a body for this clone, avoid
358 duplicating it. (Is it possible for a clone-list to grow after we
359 first see it?) */
360 if (DECL_SAVED_TREE (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 360, __FUNCTION__, (FUNCTION_DECL)))->function_decl.saved_tree
)
|| TREE_ASM_WRITTEN (clone)((clone)->base.asm_written_flag))
361 continue;
362
363 /* Start processing the function. */
364 start_preparsed_function (clone, NULL_TREE(tree) nullptr, SF_PRE_PARSED1);
365
366 if (clone == fns[2])
367 {
368 for (clone_parm = DECL_ARGUMENTS (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 368, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
; clone_parm;
369 clone_parm = TREE_CHAIN (clone_parm)((contains_struct_check ((clone_parm), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 369, __FUNCTION__))->common.chain)
)
370 DECL_ABSTRACT_ORIGIN (clone_parm)((contains_struct_check ((clone_parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 370, __FUNCTION__))->decl_common.abstract_origin)
= NULL_TREE(tree) nullptr;
371 /* Build the delete destructor by calling complete destructor and
372 delete function. */
373 build_delete_destructor_body (clone, fns[1]);
374 }
375 else
376 {
377 /* Walk parameter lists together, creating parameter list for
378 call to original function. */
379 for (parmno = 0,
380 fn_parm = DECL_ARGUMENTS (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 380, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
,
381 fn_parm_typelist = TYPE_ARG_TYPES (TREE_TYPE (fn))((tree_check2 ((((contains_struct_check ((fn), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 381, __FUNCTION__))->typed.type)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 381, __FUNCTION__, (FUNCTION_TYPE), (METHOD_TYPE)))->type_non_common
.values)
,
382 clone_parm = DECL_ARGUMENTS (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 382, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
;
383 fn_parm;
384 ++parmno,
385 fn_parm = TREE_CHAIN (fn_parm)((contains_struct_check ((fn_parm), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 385, __FUNCTION__))->common.chain)
)
386 {
387 if (parmno == vtt_parmno && ! DECL_HAS_VTT_PARM_P (clone)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check
(((((enum tree_code) (clone)->base.code) == TEMPLATE_DECL
? ((struct tree_template_decl *)(const_cast<union tree_node
*> ((((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 387, __FUNCTION__, (TEMPLATE_DECL))))))))->result : clone
)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 387, __FUNCTION__))->decl_common.lang_specific); if (!((
(enum tree_code) (clone)->base.code) == FUNCTION_DECL || (
((enum tree_code) (clone)->base.code) == TEMPLATE_DECL &&
((struct tree_template_decl *)(const_cast<union tree_node
*> ((((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 387, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree
) nullptr && ((enum tree_code) (((struct tree_template_decl
*)(const_cast<union tree_node *> ((((tree_check ((clone
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 387, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base
.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn
) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 387, __FUNCTION__); &lt->u.fn; })->has_vtt_parm_p
)
)
388 {
389 gcc_assert (fn_parm_typelist)((void)(!(fn_parm_typelist) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 389, __FUNCTION__), 0 : 0))
;
390 /* Clobber argument with formal parameter type. */
391 args[parmno]
392 = convert (TREE_VALUE (fn_parm_typelist)((tree_check ((fn_parm_typelist), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 392, __FUNCTION__, (TREE_LIST)))->list.value)
,
393 null_pointer_nodeglobal_trees[TI_NULL_POINTER]);
394 }
395 else if (parmno == 1 && DECL_HAS_IN_CHARGE_PARM_P (fn)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check
(((((enum tree_code) (fn)->base.code) == TEMPLATE_DECL ? (
(struct tree_template_decl *)(const_cast<union tree_node *
> ((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 395, __FUNCTION__, (TEMPLATE_DECL))))))))->result : fn))
, (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 395, __FUNCTION__))->decl_common.lang_specific); if (!((
(enum tree_code) (fn)->base.code) == FUNCTION_DECL || (((enum
tree_code) (fn)->base.code) == TEMPLATE_DECL && (
(struct tree_template_decl *)(const_cast<union tree_node *
> ((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 395, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree
) nullptr && ((enum tree_code) (((struct tree_template_decl
*)(const_cast<union tree_node *> ((((tree_check ((fn),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 395, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base
.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn
) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 395, __FUNCTION__); &lt->u.fn; })->has_in_charge_parm_p
)
)
396 {
397 tree in_charge
398 = copy_node (in_charge_arg_for_name (DECL_NAME (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 398, __FUNCTION__))->decl_minimal.name)
));
399 args[parmno] = in_charge;
400 }
401 /* Map other parameters to their equivalents in the cloned
402 function. */
403 else
404 {
405 gcc_assert (clone_parm)((void)(!(clone_parm) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 405, __FUNCTION__), 0 : 0))
;
406 DECL_ABSTRACT_ORIGIN (clone_parm)((contains_struct_check ((clone_parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 406, __FUNCTION__))->decl_common.abstract_origin)
= NULLnullptr;
407 args[parmno] = clone_parm;
408 /* Clear TREE_ADDRESSABLE on thunk arguments. */
409 TREE_ADDRESSABLE (clone_parm)((clone_parm)->base.addressable_flag) = 0;
410 clone_parm = TREE_CHAIN (clone_parm)((contains_struct_check ((clone_parm), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 410, __FUNCTION__))->common.chain)
;
411 }
412 if (fn_parm_typelist)
413 fn_parm_typelist = TREE_CHAIN (fn_parm_typelist)((contains_struct_check ((fn_parm_typelist), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 413, __FUNCTION__))->common.chain)
;
414 }
415
416 /* We built this list backwards; fix now. */
417 mark_used (fn);
418 call = build_cxx_call (fn, parmno, args, tf_warning_or_error);
419 /* Arguments passed to the thunk by invisible reference should
420 be transmitted to the callee unchanged. Do not create a
421 temporary and invoke the copy constructor. The thunking
422 transformation must not introduce any constructor calls. */
423 CALL_FROM_THUNK_P (call)((tree_check ((call), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 423, __FUNCTION__, (CALL_EXPR)))->base.protected_flag)
= 1;
424 block = make_node (BLOCK);
425 if (targetm.cxx.cdtor_returns_this ())
426 {
427 clone_result = DECL_RESULT (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 427, __FUNCTION__, (FUNCTION_DECL)))->decl_non_common.result
)
;
428 modify = build2 (MODIFY_EXPR, TREE_TYPE (clone_result)((contains_struct_check ((clone_result), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 428, __FUNCTION__))->typed.type)
,
429 clone_result, call);
430 modify = build1 (RETURN_EXPR, void_type_nodeglobal_trees[TI_VOID_TYPE], modify);
431 add_stmt (modify);
432 }
433 else
434 {
435 add_stmt (call);
436 }
437 bind = c_build_bind_expr (DECL_SOURCE_LOCATION (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 437, __FUNCTION__))->decl_minimal.locus)
,
438 block, cur_stmt_list((current_stmt_tree ()->x_cur_stmt_list)->last ()));
439 DECL_SAVED_TREE (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 439, __FUNCTION__, (FUNCTION_DECL)))->function_decl.saved_tree
)
= push_stmt_list ();
440 add_stmt (bind);
441 }
442
443 DECL_ABSTRACT_ORIGIN (clone)((contains_struct_check ((clone), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 443, __FUNCTION__))->decl_common.abstract_origin)
= NULLnullptr;
444 expand_or_defer_fn (finish_function (/*inline_p=*/false));
445 }
446 return 1;
447}
448
449/* FN is a function that has a complete body. Clone the body as
450 necessary. Returns nonzero if there's no longer any need to
451 process the main body. */
452
453bool
454maybe_clone_body (tree fn)
455{
456 tree comdat_group = NULL_TREE(tree) nullptr;
457 tree clone;
458 tree fns[3];
459 bool first = true;
460 int idx;
461 bool need_alias = false;
462
463 /* We only clone constructors and destructors. */
464 if (!DECL_MAYBE_IN_CHARGE_CDTOR_P (fn)((((contains_struct_check ((fn), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 464, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_CTOR_IDENTIFIER]) || (((contains_struct_check ((fn), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 464, __FUNCTION__))->decl_minimal.name) == cp_global_trees
[CPTI_DTOR_IDENTIFIER]))
)
465 return 0;
466
467 populate_clone_array (fn, fns);
468
469 /* Remember if we can't have multiple clones for some reason. We need to
470 check this before we remap local static initializers in clone_body. */
471 if (!tree_versionable_function_p (fn))
472 need_alias = true;
473
474 /* We know that any clones immediately follow FN in the TYPE_FIELDS
475 list. */
476 push_to_top_level ();
477 for (idx = 0; idx < 3; idx++)
478 {
479 tree parm;
480 tree clone_parm;
481
482 clone = fns[idx];
483 if (!clone)
484 continue;
485
486 /* Update CLONE's source position information to match FN's. */
487 DECL_SOURCE_LOCATION (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 487, __FUNCTION__))->decl_minimal.locus)
= DECL_SOURCE_LOCATION (fn)((contains_struct_check ((fn), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 487, __FUNCTION__))->decl_minimal.locus)
;
488 DECL_DECLARED_INLINE_P (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 488, __FUNCTION__, (FUNCTION_DECL)))->function_decl.declared_inline_flag
)
= DECL_DECLARED_INLINE_P (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 488, __FUNCTION__, (FUNCTION_DECL)))->function_decl.declared_inline_flag
)
;
489 DECL_DECLARED_CONSTEXPR_P (clone)((contains_struct_check (((tree_check2 (((((enum tree_code) (
clone)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl
*)(const_cast<union tree_node *> ((((tree_check ((clone
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 489, __FUNCTION__, (TEMPLATE_DECL))))))))->result : clone
)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 489, __FUNCTION__, (VAR_DECL), (FUNCTION_DECL)))), (TS_DECL_COMMON
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 489, __FUNCTION__))->decl_common.lang_flag_8)
= DECL_DECLARED_CONSTEXPR_P (fn)((contains_struct_check (((tree_check2 (((((enum tree_code) (
fn)->base.code) == TEMPLATE_DECL ? ((struct tree_template_decl
*)(const_cast<union tree_node *> ((((tree_check ((fn),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 489, __FUNCTION__, (TEMPLATE_DECL))))))))->result : fn))
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 489, __FUNCTION__, (VAR_DECL), (FUNCTION_DECL)))), (TS_DECL_COMMON
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 489, __FUNCTION__))->decl_common.lang_flag_8)
;
490 DECL_COMDAT (clone)((contains_struct_check ((clone), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 490, __FUNCTION__))->decl_with_vis.comdat_flag)
= DECL_COMDAT (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 490, __FUNCTION__))->decl_with_vis.comdat_flag)
;
491 DECL_WEAK (clone)((contains_struct_check ((clone), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 491, __FUNCTION__))->decl_with_vis.weak_flag)
= DECL_WEAK (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 491, __FUNCTION__))->decl_with_vis.weak_flag)
;
492
493 /* We don't copy the comdat group from fn to clone because the assembler
494 name of fn was corrupted by write_mangled_name by adding *INTERNAL*
495 to it. By doing so, it also corrupted the comdat group. */
496 if (DECL_ONE_ONLY (fn)(decl_comdat_group (fn) != (tree) nullptr && (((fn)->
base.public_flag) || ((contains_struct_check ((fn), (TS_DECL_COMMON
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 496, __FUNCTION__))->decl_common.decl_flag_1)))
)
497 cgraph_node::get_create (clone)->set_comdat_group (cxx_comdat_group (clone));
498 DECL_USE_TEMPLATE (clone)(((contains_struct_check ((clone), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 498, __FUNCTION__))->decl_common.lang_specific)->u.base
.use_template)
= DECL_USE_TEMPLATE (fn)(((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 498, __FUNCTION__))->decl_common.lang_specific)->u.base
.use_template)
;
499 DECL_EXTERNAL (clone)((contains_struct_check ((clone), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 499, __FUNCTION__))->decl_common.decl_flag_1)
= DECL_EXTERNAL (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 499, __FUNCTION__))->decl_common.decl_flag_1)
;
500 DECL_INTERFACE_KNOWN (clone)((contains_struct_check ((clone), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 500, __FUNCTION__))->decl_common.lang_flag_5)
= DECL_INTERFACE_KNOWN (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 500, __FUNCTION__))->decl_common.lang_flag_5)
;
501 DECL_NOT_REALLY_EXTERN (clone)(((contains_struct_check ((clone), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 501, __FUNCTION__))->decl_common.lang_specific)->u.base
.not_really_extern)
= DECL_NOT_REALLY_EXTERN (fn)(((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 501, __FUNCTION__))->decl_common.lang_specific)->u.base
.not_really_extern)
;
502 TREE_PUBLIC (clone)((clone)->base.public_flag) = TREE_PUBLIC (fn)((fn)->base.public_flag);
503 DECL_VISIBILITY (clone)((contains_struct_check ((clone), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 503, __FUNCTION__))->decl_with_vis.visibility)
= DECL_VISIBILITY (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 503, __FUNCTION__))->decl_with_vis.visibility)
;
504 DECL_VISIBILITY_SPECIFIED (clone)((contains_struct_check ((clone), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 504, __FUNCTION__))->decl_with_vis.visibility_specified)
= DECL_VISIBILITY_SPECIFIED (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 504, __FUNCTION__))->decl_with_vis.visibility_specified)
;
505 DECL_DLLIMPORT_P (clone)((contains_struct_check ((clone), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 505, __FUNCTION__))->decl_with_vis.dllimport_flag)
= DECL_DLLIMPORT_P (fn)((contains_struct_check ((fn), (TS_DECL_WITH_VIS), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 505, __FUNCTION__))->decl_with_vis.dllimport_flag)
;
506 DECL_ATTRIBUTES (clone)((contains_struct_check ((clone), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 506, __FUNCTION__))->decl_common.attributes)
= copy_list (DECL_ATTRIBUTES (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 506, __FUNCTION__))->decl_common.attributes)
);
507 DECL_DISREGARD_INLINE_LIMITS (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 507, __FUNCTION__, (FUNCTION_DECL)))->function_decl.disregard_inline_limits
)
= DECL_DISREGARD_INLINE_LIMITS (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 507, __FUNCTION__, (FUNCTION_DECL)))->function_decl.disregard_inline_limits
)
;
508 set_decl_section_name (clone, fn);
509
510 /* Adjust the parameter names and locations. */
511 parm = DECL_ARGUMENTS (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 511, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
;
512 clone_parm = DECL_ARGUMENTS (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 512, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
;
513 /* Update the `this' parameter, which is always first. */
514 update_cloned_parm (parm, clone_parm, first);
515 parm = DECL_CHAIN (parm)(((contains_struct_check (((contains_struct_check ((parm), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 515, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 515, __FUNCTION__))->common.chain))
;
516 clone_parm = DECL_CHAIN (clone_parm)(((contains_struct_check (((contains_struct_check ((clone_parm
), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 516, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 516, __FUNCTION__))->common.chain))
;
517 if (DECL_HAS_IN_CHARGE_PARM_P (fn)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check
(((((enum tree_code) (fn)->base.code) == TEMPLATE_DECL ? (
(struct tree_template_decl *)(const_cast<union tree_node *
> ((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 517, __FUNCTION__, (TEMPLATE_DECL))))))))->result : fn))
, (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 517, __FUNCTION__))->decl_common.lang_specific); if (!((
(enum tree_code) (fn)->base.code) == FUNCTION_DECL || (((enum
tree_code) (fn)->base.code) == TEMPLATE_DECL && (
(struct tree_template_decl *)(const_cast<union tree_node *
> ((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 517, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree
) nullptr && ((enum tree_code) (((struct tree_template_decl
*)(const_cast<union tree_node *> ((((tree_check ((fn),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 517, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base
.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn
) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 517, __FUNCTION__); &lt->u.fn; })->has_in_charge_parm_p
)
)
518 parm = DECL_CHAIN (parm)(((contains_struct_check (((contains_struct_check ((parm), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 518, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 518, __FUNCTION__))->common.chain))
;
519 if (DECL_HAS_VTT_PARM_P (fn)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check
(((((enum tree_code) (fn)->base.code) == TEMPLATE_DECL ? (
(struct tree_template_decl *)(const_cast<union tree_node *
> ((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 519, __FUNCTION__, (TEMPLATE_DECL))))))))->result : fn))
, (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 519, __FUNCTION__))->decl_common.lang_specific); if (!((
(enum tree_code) (fn)->base.code) == FUNCTION_DECL || (((enum
tree_code) (fn)->base.code) == TEMPLATE_DECL && (
(struct tree_template_decl *)(const_cast<union tree_node *
> ((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 519, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree
) nullptr && ((enum tree_code) (((struct tree_template_decl
*)(const_cast<union tree_node *> ((((tree_check ((fn),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 519, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base
.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn
) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 519, __FUNCTION__); &lt->u.fn; })->has_vtt_parm_p
)
)
520 parm = DECL_CHAIN (parm)(((contains_struct_check (((contains_struct_check ((parm), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 520, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 520, __FUNCTION__))->common.chain))
;
521 if (DECL_HAS_VTT_PARM_P (clone)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check
(((((enum tree_code) (clone)->base.code) == TEMPLATE_DECL
? ((struct tree_template_decl *)(const_cast<union tree_node
*> ((((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 521, __FUNCTION__, (TEMPLATE_DECL))))))))->result : clone
)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 521, __FUNCTION__))->decl_common.lang_specific); if (!((
(enum tree_code) (clone)->base.code) == FUNCTION_DECL || (
((enum tree_code) (clone)->base.code) == TEMPLATE_DECL &&
((struct tree_template_decl *)(const_cast<union tree_node
*> ((((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 521, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree
) nullptr && ((enum tree_code) (((struct tree_template_decl
*)(const_cast<union tree_node *> ((((tree_check ((clone
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 521, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base
.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn
) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 521, __FUNCTION__); &lt->u.fn; })->has_vtt_parm_p
)
)
522 clone_parm = DECL_CHAIN (clone_parm)(((contains_struct_check (((contains_struct_check ((clone_parm
), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 522, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 522, __FUNCTION__))->common.chain))
;
523 for (; parm && clone_parm;
524 parm = DECL_CHAIN (parm)(((contains_struct_check (((contains_struct_check ((parm), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 524, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 524, __FUNCTION__))->common.chain))
, clone_parm = DECL_CHAIN (clone_parm)(((contains_struct_check (((contains_struct_check ((clone_parm
), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 524, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 524, __FUNCTION__))->common.chain))
)
525 /* Update this parameter. */
526 update_cloned_parm (parm, clone_parm, first);
527 }
528
529 bool can_alias = can_alias_cdtor (fn);
530
531 /* If we decide to turn clones into thunks, they will branch to fn.
532 Must have original function available to call. */
533 if (!can_alias && maybe_thunk_body (fn, need_alias))
534 {
535 pop_from_top_level ();
536 /* We still need to emit the original function. */
537 return 0;
538 }
539
540 /* Emit the DWARF1 abstract instance. */
541 (*debug_hooks->deferred_inline_function) (fn);
542
543 /* We know that any clones immediately follow FN in the TYPE_FIELDS. */
544 for (idx = 0; idx < 3; idx++)
545 {
546 tree parm;
547 tree clone_parm;
548 int parmno;
549 hash_map<tree, tree> *decl_map;
550 bool alias = false;
551
552 clone = fns[idx];
553 if (!clone)
554 continue;
555
556 /* Start processing the function. */
557 start_preparsed_function (clone, NULL_TREE(tree) nullptr, SF_PRE_PARSED1);
558
559 /* Tell cgraph if both ctors or both dtors are known to have
560 the same body. */
561 if (can_alias
562 && fns[0]
563 && idx == 1
564 && cgraph_node::get_create (fns[0])->create_same_body_alias
565 (clone, fns[0]))
566 {
567 alias = true;
568 if (DECL_ONE_ONLY (fns[0])(decl_comdat_group (fns[0]) != (tree) nullptr && (((fns
[0])->base.public_flag) || ((contains_struct_check ((fns[0
]), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 568, __FUNCTION__))->decl_common.decl_flag_1)))
)
569 {
570 /* For comdat base and complete cdtors put them
571 into the same, *[CD]5* comdat group instead of
572 *[CD][12]*. */
573 comdat_group = cdtor_comdat_group (fns[1], fns[0]);
574 cgraph_node::get_create (fns[0])->set_comdat_group (comdat_group);
575 if (symtab_node::get (clone)->same_comdat_group)
576 symtab_node::get (clone)->remove_from_same_comdat_group ();
577 symtab_node::get (clone)->add_to_same_comdat_group
578 (symtab_node::get (fns[0]));
579 }
580 }
581
582 /* Build the delete destructor by calling complete destructor
583 and delete function. */
584 if (idx == 2)
585 {
586 build_delete_destructor_body (clone, fns[1]);
587 /* If *[CD][12]* dtors go into the *[CD]5* comdat group and dtor is
588 virtual, it goes into the same comdat group as well. */
589 if (comdat_group)
590 cgraph_node::get_create (clone)->add_to_same_comdat_group
591 (symtab_node::get (fns[0]));
592 }
593 else if (alias)
594 /* No need to populate body. */ ;
595 else
596 {
597 /* If we can't have multiple copies of FN (say, because there's a
598 static local initialized with the address of a label), we need
599 to use an alias for the complete variant. */
600 if (idx == 1 && need_alias)
601 {
602 if (DECL_STRUCT_FUNCTION (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 602, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f)
->cannot_be_copied_set)
603 sorry (DECL_STRUCT_FUNCTION (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 603, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f)
->cannot_be_copied_reason, fn);
604 else
605 sorry ("making multiple clones of %qD", fn);
606 }
607
608 /* Remap the parameters. */
609 decl_map = new hash_map<tree, tree>;
610 for (parmno = 0,
611 parm = DECL_ARGUMENTS (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 611, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
,
612 clone_parm = DECL_ARGUMENTS (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 612, __FUNCTION__, (FUNCTION_DECL)))->function_decl.arguments
)
;
613 parm;
614 ++parmno,
615 parm = DECL_CHAIN (parm)(((contains_struct_check (((contains_struct_check ((parm), (TS_DECL_MINIMAL
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 615, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 615, __FUNCTION__))->common.chain))
)
616 {
617 /* Map the in-charge parameter to an appropriate constant. */
618 if (DECL_HAS_IN_CHARGE_PARM_P (fn)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check
(((((enum tree_code) (fn)->base.code) == TEMPLATE_DECL ? (
(struct tree_template_decl *)(const_cast<union tree_node *
> ((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 618, __FUNCTION__, (TEMPLATE_DECL))))))))->result : fn))
, (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 618, __FUNCTION__))->decl_common.lang_specific); if (!((
(enum tree_code) (fn)->base.code) == FUNCTION_DECL || (((enum
tree_code) (fn)->base.code) == TEMPLATE_DECL && (
(struct tree_template_decl *)(const_cast<union tree_node *
> ((((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 618, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree
) nullptr && ((enum tree_code) (((struct tree_template_decl
*)(const_cast<union tree_node *> ((((tree_check ((fn),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 618, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base
.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn
) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 618, __FUNCTION__); &lt->u.fn; })->has_in_charge_parm_p
)
&& parmno == 1)
619 {
620 tree in_charge;
621 in_charge = in_charge_arg_for_name (DECL_NAME (clone)((contains_struct_check ((clone), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 621, __FUNCTION__))->decl_minimal.name)
);
622 decl_map->put (parm, in_charge);
623 }
624 else if (DECL_ARTIFICIAL (parm)((contains_struct_check ((parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 624, __FUNCTION__))->decl_common.artificial_flag)
625 && DECL_NAME (parm)((contains_struct_check ((parm), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 625, __FUNCTION__))->decl_minimal.name)
== vtt_parm_identifiercp_global_trees[CPTI_VTT_PARM_IDENTIFIER])
626 {
627 /* For a subobject constructor or destructor, the next
628 argument is the VTT parameter. Remap the VTT_PARM
629 from the CLONE to this parameter. */
630 if (DECL_HAS_VTT_PARM_P (clone)(__extension__ ({ struct lang_decl *lt = ((contains_struct_check
(((((enum tree_code) (clone)->base.code) == TEMPLATE_DECL
? ((struct tree_template_decl *)(const_cast<union tree_node
*> ((((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 630, __FUNCTION__, (TEMPLATE_DECL))))))))->result : clone
)), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 630, __FUNCTION__))->decl_common.lang_specific); if (!((
(enum tree_code) (clone)->base.code) == FUNCTION_DECL || (
((enum tree_code) (clone)->base.code) == TEMPLATE_DECL &&
((struct tree_template_decl *)(const_cast<union tree_node
*> ((((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 630, __FUNCTION__, (TEMPLATE_DECL))))))))->result != (tree
) nullptr && ((enum tree_code) (((struct tree_template_decl
*)(const_cast<union tree_node *> ((((tree_check ((clone
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 630, __FUNCTION__, (TEMPLATE_DECL))))))))->result)->base
.code) == FUNCTION_DECL)) || lt->u.base.selector != lds_fn
) lang_check_failed ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 630, __FUNCTION__); &lt->u.fn; })->has_vtt_parm_p
)
)
631 {
632 DECL_ABSTRACT_ORIGIN (clone_parm)((contains_struct_check ((clone_parm), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 632, __FUNCTION__))->decl_common.abstract_origin)
= parm;
633 decl_map->put (parm, clone_parm);
634 clone_parm = DECL_CHAIN (clone_parm)(((contains_struct_check (((contains_struct_check ((clone_parm
), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 634, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 634, __FUNCTION__))->common.chain))
;
635 }
636 /* Otherwise, map the VTT parameter to `NULL'. */
637 else
638 {
639 tree t
640 = fold_convert (TREE_TYPE (parm), null_pointer_node)fold_convert_loc (((location_t) 0), ((contains_struct_check (
(parm), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 640, __FUNCTION__))->typed.type), global_trees[TI_NULL_POINTER
])
;
641 decl_map->put (parm, t);
642 }
643 }
644 /* Map other parameters to their equivalents in the cloned
645 function. */
646 else
647 {
648 tree replacement;
649 if (clone_parm)
650 {
651 replacement = clone_parm;
652 clone_parm = DECL_CHAIN (clone_parm)(((contains_struct_check (((contains_struct_check ((clone_parm
), (TS_DECL_MINIMAL), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 652, __FUNCTION__))), (TS_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 652, __FUNCTION__))->common.chain))
;
653 }
654 else
655 {
656 /* Inheriting ctors can omit parameters from the base
657 clone. Replace them with null lvalues. */
658 tree reftype = build_reference_type (TREE_TYPE (parm)((contains_struct_check ((parm), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 658, __FUNCTION__))->typed.type)
);
659 replacement = fold_convert (reftype, null_pointer_node)fold_convert_loc (((location_t) 0), reftype, global_trees[TI_NULL_POINTER
])
;
660 replacement = convert_from_reference (replacement);
661 }
662 decl_map->put (parm, replacement);
663 }
664 }
665
666 if (targetm.cxx.cdtor_returns_this ())
667 {
668 parm = DECL_RESULT (fn)((tree_check ((fn), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 668, __FUNCTION__, (FUNCTION_DECL)))->decl_non_common.result
)
;
669 clone_parm = DECL_RESULT (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 669, __FUNCTION__, (FUNCTION_DECL)))->decl_non_common.result
)
;
670 decl_map->put (parm, clone_parm);
671 }
672
673 /* Clone the body. */
674 clone_body (clone, fn, decl_map);
675
676 /* Clean up. */
677 delete decl_map;
678 }
679
680 /* The clone can throw iff the original function can throw. */
681 cp_function_chain((cfun + 0)->language)->can_throw = !TREE_NOTHROW (fn)((fn)->base.nothrow_flag);
682
683 /* Now, expand this function into RTL, if appropriate. */
684 finish_function (/*inline_p=*/false);
685 BLOCK_ABSTRACT_ORIGIN (DECL_INITIAL (clone))((tree_check ((((contains_struct_check ((clone), (TS_DECL_COMMON
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 685, __FUNCTION__))->decl_common.initial)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 685, __FUNCTION__, (BLOCK)))->block.abstract_origin)
= DECL_INITIAL (fn)((contains_struct_check ((fn), (TS_DECL_COMMON), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 685, __FUNCTION__))->decl_common.initial)
;
686 if (alias)
687 {
688 if (expand_or_defer_fn_1 (clone))
689 emit_associated_thunks (clone);
690 /* We didn't generate a body, so remove the empty one. */
691 DECL_SAVED_TREE (clone)((tree_check ((clone), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/cp/optimize.cc"
, 691, __FUNCTION__, (FUNCTION_DECL)))->function_decl.saved_tree
)
= NULL_TREE(tree) nullptr;
692 }
693 else
694 expand_or_defer_fn (clone);
695 first = false;
Value stored to 'first' is never read
696 }
697 pop_from_top_level ();
698
699 /* We don't need to process the original function any further. */
700 return 1;
701}