1 /* Handle the hair of processing (but not expanding) inline functions.
2 Also manage function and variable name overloading.
3 Copyright (C) 1987-2018 Free Software Foundation, Inc.
4 Contributed by Michael Tiemann (tiemann@cygnus.com)
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22
23 /* Handle method declarations. */
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "target.h"
28 #include "cp-tree.h"
29 #include "stringpool.h"
30 #include "cgraph.h"
31 #include "varasm.h"
32 #include "toplev.h"
33 #include "common/common-target.h"
34
35 static void do_build_copy_assign (tree);
36 static void do_build_copy_constructor (tree);
37 static tree make_alias_for_thunk (tree);
38
39 /* Called once to initialize method.c. */
40
41 void
init_method(void)42 init_method (void)
43 {
44 init_mangle ();
45 }
46
47 /* Return a this or result adjusting thunk to FUNCTION. THIS_ADJUSTING
48 indicates whether it is a this or result adjusting thunk.
49 FIXED_OFFSET and VIRTUAL_OFFSET indicate how to do the adjustment
50 (see thunk_adjust). VIRTUAL_OFFSET can be NULL, but FIXED_OFFSET
51 never is. VIRTUAL_OFFSET is the /index/ into the vtable for this
52 adjusting thunks, we scale it to a byte offset. For covariant
53 thunks VIRTUAL_OFFSET is the virtual binfo. You must post process
54 the returned thunk with finish_thunk. */
55
56 tree
make_thunk(tree function,bool this_adjusting,tree fixed_offset,tree virtual_offset)57 make_thunk (tree function, bool this_adjusting,
58 tree fixed_offset, tree virtual_offset)
59 {
60 HOST_WIDE_INT d;
61 tree thunk;
62
63 gcc_assert (TREE_CODE (function) == FUNCTION_DECL);
64 /* We can have this thunks to covariant thunks, but not vice versa. */
65 gcc_assert (!DECL_THIS_THUNK_P (function));
66 gcc_assert (!DECL_RESULT_THUNK_P (function) || this_adjusting);
67
68 /* Scale the VIRTUAL_OFFSET to be in terms of bytes. */
69 if (this_adjusting && virtual_offset)
70 virtual_offset
71 = size_binop (MULT_EXPR,
72 virtual_offset,
73 convert (ssizetype,
74 TYPE_SIZE_UNIT (vtable_entry_type)));
75
76 d = tree_to_shwi (fixed_offset);
77
78 /* See if we already have the thunk in question. For this_adjusting
79 thunks VIRTUAL_OFFSET will be an INTEGER_CST, for covariant thunks it
80 will be a BINFO. */
81 for (thunk = DECL_THUNKS (function); thunk; thunk = DECL_CHAIN (thunk))
82 if (DECL_THIS_THUNK_P (thunk) == this_adjusting
83 && THUNK_FIXED_OFFSET (thunk) == d
84 && !virtual_offset == !THUNK_VIRTUAL_OFFSET (thunk)
85 && (!virtual_offset
86 || (this_adjusting
87 ? tree_int_cst_equal (THUNK_VIRTUAL_OFFSET (thunk),
88 virtual_offset)
89 : THUNK_VIRTUAL_OFFSET (thunk) == virtual_offset)))
90 return thunk;
91
92 /* All thunks must be created before FUNCTION is actually emitted;
93 the ABI requires that all thunks be emitted together with the
94 function to which they transfer control. */
95 gcc_assert (!TREE_ASM_WRITTEN (function));
96 /* Likewise, we can only be adding thunks to a function declared in
97 the class currently being laid out. */
98 gcc_assert (TYPE_SIZE (DECL_CONTEXT (function))
99 && TYPE_BEING_DEFINED (DECL_CONTEXT (function)));
100
101 thunk = build_decl (DECL_SOURCE_LOCATION (function),
102 FUNCTION_DECL, NULL_TREE, TREE_TYPE (function));
103 DECL_LANG_SPECIFIC (thunk) = DECL_LANG_SPECIFIC (function);
104 cxx_dup_lang_specific_decl (thunk);
105 DECL_VIRTUAL_P (thunk) = true;
106 SET_DECL_THUNKS (thunk, NULL_TREE);
107
108 DECL_CONTEXT (thunk) = DECL_CONTEXT (function);
109 TREE_READONLY (thunk) = TREE_READONLY (function);
110 TREE_THIS_VOLATILE (thunk) = TREE_THIS_VOLATILE (function);
111 TREE_PUBLIC (thunk) = TREE_PUBLIC (function);
112 SET_DECL_THUNK_P (thunk, this_adjusting);
113 THUNK_TARGET (thunk) = function;
114 THUNK_FIXED_OFFSET (thunk) = d;
115 THUNK_VIRTUAL_OFFSET (thunk) = virtual_offset;
116 THUNK_ALIAS (thunk) = NULL_TREE;
117
118 DECL_INTERFACE_KNOWN (thunk) = 1;
119 DECL_NOT_REALLY_EXTERN (thunk) = 1;
120 DECL_COMDAT (thunk) = DECL_COMDAT (function);
121 DECL_SAVED_FUNCTION_DATA (thunk) = NULL;
122 /* The thunk itself is not a constructor or destructor, even if
123 the thing it is thunking to is. */
124 DECL_CXX_DESTRUCTOR_P (thunk) = 0;
125 DECL_CXX_CONSTRUCTOR_P (thunk) = 0;
126 DECL_EXTERNAL (thunk) = 1;
127 DECL_ARTIFICIAL (thunk) = 1;
128 /* The THUNK is not a pending inline, even if the FUNCTION is. */
129 DECL_PENDING_INLINE_P (thunk) = 0;
130 DECL_DECLARED_INLINE_P (thunk) = 0;
131 /* Nor is it a template instantiation. */
132 DECL_USE_TEMPLATE (thunk) = 0;
133 DECL_TEMPLATE_INFO (thunk) = NULL;
134
135 /* Add it to the list of thunks associated with FUNCTION. */
136 DECL_CHAIN (thunk) = DECL_THUNKS (function);
137 SET_DECL_THUNKS (function, thunk);
138
139 return thunk;
140 }
141
142 /* Finish THUNK, a thunk decl. */
143
144 void
finish_thunk(tree thunk)145 finish_thunk (tree thunk)
146 {
147 tree function, name;
148 tree fixed_offset = ssize_int (THUNK_FIXED_OFFSET (thunk));
149 tree virtual_offset = THUNK_VIRTUAL_OFFSET (thunk);
150
151 gcc_assert (!DECL_NAME (thunk) && DECL_THUNK_P (thunk));
152 if (virtual_offset && DECL_RESULT_THUNK_P (thunk))
153 virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
154 function = THUNK_TARGET (thunk);
155 name = mangle_thunk (function, DECL_THIS_THUNK_P (thunk),
156 fixed_offset, virtual_offset, thunk);
157
158 /* We can end up with declarations of (logically) different
159 covariant thunks, that do identical adjustments. The two thunks
160 will be adjusting between within different hierarchies, which
161 happen to have the same layout. We must nullify one of them to
162 refer to the other. */
163 if (DECL_RESULT_THUNK_P (thunk))
164 {
165 tree cov_probe;
166
167 for (cov_probe = DECL_THUNKS (function);
168 cov_probe; cov_probe = DECL_CHAIN (cov_probe))
169 if (DECL_NAME (cov_probe) == name)
170 {
171 gcc_assert (!DECL_THUNKS (thunk));
172 THUNK_ALIAS (thunk) = (THUNK_ALIAS (cov_probe)
173 ? THUNK_ALIAS (cov_probe) : cov_probe);
174 break;
175 }
176 }
177
178 DECL_NAME (thunk) = name;
179 SET_DECL_ASSEMBLER_NAME (thunk, name);
180 }
181
182 static GTY (()) int thunk_labelno;
183
184 /* Create a static alias to target. */
185
186 tree
make_alias_for(tree target,tree newid)187 make_alias_for (tree target, tree newid)
188 {
189 tree alias = build_decl (DECL_SOURCE_LOCATION (target),
190 TREE_CODE (target), newid, TREE_TYPE (target));
191 DECL_LANG_SPECIFIC (alias) = DECL_LANG_SPECIFIC (target);
192 cxx_dup_lang_specific_decl (alias);
193 DECL_CONTEXT (alias) = DECL_CONTEXT (target);
194 TREE_READONLY (alias) = TREE_READONLY (target);
195 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (target);
196 TREE_PUBLIC (alias) = 0;
197 DECL_INTERFACE_KNOWN (alias) = 1;
198 if (DECL_LANG_SPECIFIC (alias))
199 {
200 DECL_NOT_REALLY_EXTERN (alias) = 1;
201 DECL_USE_TEMPLATE (alias) = 0;
202 DECL_TEMPLATE_INFO (alias) = NULL;
203 }
204 DECL_EXTERNAL (alias) = 0;
205 DECL_ARTIFICIAL (alias) = 1;
206 DECL_TEMPLATE_INSTANTIATED (alias) = 0;
207 if (TREE_CODE (alias) == FUNCTION_DECL)
208 {
209 DECL_SAVED_FUNCTION_DATA (alias) = NULL;
210 DECL_CXX_DESTRUCTOR_P (alias) = 0;
211 DECL_CXX_CONSTRUCTOR_P (alias) = 0;
212 DECL_PENDING_INLINE_P (alias) = 0;
213 DECL_DECLARED_INLINE_P (alias) = 0;
214 DECL_INITIAL (alias) = error_mark_node;
215 DECL_ARGUMENTS (alias) = copy_list (DECL_ARGUMENTS (target));
216 }
217 else
218 TREE_STATIC (alias) = 1;
219 TREE_ADDRESSABLE (alias) = 1;
220 TREE_USED (alias) = 1;
221 SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
222 return alias;
223 }
224
225 static tree
make_alias_for_thunk(tree function)226 make_alias_for_thunk (tree function)
227 {
228 tree alias;
229 char buf[256];
230
231 targetm.asm_out.generate_internal_label (buf, "LTHUNK", thunk_labelno);
232 thunk_labelno++;
233
234 alias = make_alias_for (function, get_identifier (buf));
235
236 if (!flag_syntax_only)
237 {
238 struct cgraph_node *funcn, *aliasn;
239 funcn = cgraph_node::get (function);
240 gcc_checking_assert (funcn);
241 aliasn = cgraph_node::create_same_body_alias (alias, function);
242 DECL_ASSEMBLER_NAME (function);
243 gcc_assert (aliasn != NULL);
244 }
245
246 return alias;
247 }
248
249 /* Emit the definition of a C++ multiple inheritance or covariant
250 return vtable thunk. If EMIT_P is nonzero, the thunk is emitted
251 immediately. */
252
253 void
use_thunk(tree thunk_fndecl,bool emit_p)254 use_thunk (tree thunk_fndecl, bool emit_p)
255 {
256 tree a, t, function, alias;
257 tree virtual_offset;
258 HOST_WIDE_INT fixed_offset, virtual_value;
259 bool this_adjusting = DECL_THIS_THUNK_P (thunk_fndecl);
260 struct cgraph_node *funcn, *thunk_node;
261
262 /* We should have called finish_thunk to give it a name. */
263 gcc_assert (DECL_NAME (thunk_fndecl));
264
265 /* We should never be using an alias, always refer to the
266 aliased thunk. */
267 gcc_assert (!THUNK_ALIAS (thunk_fndecl));
268
269 if (TREE_ASM_WRITTEN (thunk_fndecl))
270 return;
271
272 function = THUNK_TARGET (thunk_fndecl);
273 if (DECL_RESULT (thunk_fndecl))
274 /* We already turned this thunk into an ordinary function.
275 There's no need to process this thunk again. */
276 return;
277
278 if (DECL_THUNK_P (function))
279 /* The target is itself a thunk, process it now. */
280 use_thunk (function, emit_p);
281
282 /* Thunks are always addressable; they only appear in vtables. */
283 TREE_ADDRESSABLE (thunk_fndecl) = 1;
284
285 /* Figure out what function is being thunked to. It's referenced in
286 this translation unit. */
287 TREE_ADDRESSABLE (function) = 1;
288 mark_used (function);
289 if (!emit_p)
290 return;
291
292 if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function))
293 alias = make_alias_for_thunk (function);
294 else
295 alias = function;
296
297 fixed_offset = THUNK_FIXED_OFFSET (thunk_fndecl);
298 virtual_offset = THUNK_VIRTUAL_OFFSET (thunk_fndecl);
299
300 if (virtual_offset)
301 {
302 if (!this_adjusting)
303 virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
304 virtual_value = tree_to_shwi (virtual_offset);
305 gcc_assert (virtual_value);
306 }
307 else
308 virtual_value = 0;
309
310 /* And, if we need to emit the thunk, it's used. */
311 mark_used (thunk_fndecl);
312 /* This thunk is actually defined. */
313 DECL_EXTERNAL (thunk_fndecl) = 0;
314 /* The linkage of the function may have changed. FIXME in linkage
315 rewrite. */
316 gcc_assert (DECL_INTERFACE_KNOWN (function));
317 TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function);
318 DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
319 DECL_VISIBILITY_SPECIFIED (thunk_fndecl)
320 = DECL_VISIBILITY_SPECIFIED (function);
321 DECL_COMDAT (thunk_fndecl) = DECL_COMDAT (function);
322 DECL_WEAK (thunk_fndecl) = DECL_WEAK (function);
323
324 if (flag_syntax_only)
325 {
326 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
327 return;
328 }
329
330 push_to_top_level ();
331
332 if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function)
333 && targetm_common.have_named_sections)
334 {
335 tree fn = function;
336 struct symtab_node *symbol;
337
338 if ((symbol = symtab_node::get (function))
339 && symbol->alias)
340 {
341 if (symbol->analyzed)
342 fn = symtab_node::get (function)->ultimate_alias_target ()->decl;
343 else
344 fn = symtab_node::get (function)->alias_target;
345 }
346 resolve_unique_section (fn, 0, flag_function_sections);
347
348 if (DECL_SECTION_NAME (fn) != NULL && DECL_ONE_ONLY (fn))
349 {
350 resolve_unique_section (thunk_fndecl, 0, flag_function_sections);
351
352 /* Output the thunk into the same section as function. */
353 set_decl_section_name (thunk_fndecl, DECL_SECTION_NAME (fn));
354 symtab_node::get (thunk_fndecl)->implicit_section
355 = symtab_node::get (fn)->implicit_section;
356 }
357 }
358
359 /* Set up cloned argument trees for the thunk. */
360 t = NULL_TREE;
361 for (a = DECL_ARGUMENTS (function); a; a = DECL_CHAIN (a))
362 {
363 tree x = copy_node (a);
364 DECL_CHAIN (x) = t;
365 DECL_CONTEXT (x) = thunk_fndecl;
366 SET_DECL_RTL (x, NULL);
367 DECL_HAS_VALUE_EXPR_P (x) = 0;
368 TREE_ADDRESSABLE (x) = 0;
369 t = x;
370 }
371 a = nreverse (t);
372 DECL_ARGUMENTS (thunk_fndecl) = a;
373 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
374 funcn = cgraph_node::get (function);
375 gcc_checking_assert (funcn);
376 thunk_node = funcn->create_thunk (thunk_fndecl, function,
377 this_adjusting, fixed_offset, virtual_value,
378 virtual_offset, alias);
379 if (DECL_ONE_ONLY (function))
380 thunk_node->add_to_same_comdat_group (funcn);
381
382 pop_from_top_level ();
383 }
384
385 /* Code for synthesizing methods which have default semantics defined. */
386
387 /* True iff CTYPE has a trivial SFK. */
388
389 static bool
type_has_trivial_fn(tree ctype,special_function_kind sfk)390 type_has_trivial_fn (tree ctype, special_function_kind sfk)
391 {
392 switch (sfk)
393 {
394 case sfk_constructor:
395 return !TYPE_HAS_COMPLEX_DFLT (ctype);
396 case sfk_copy_constructor:
397 return !TYPE_HAS_COMPLEX_COPY_CTOR (ctype);
398 case sfk_move_constructor:
399 return !TYPE_HAS_COMPLEX_MOVE_CTOR (ctype);
400 case sfk_copy_assignment:
401 return !TYPE_HAS_COMPLEX_COPY_ASSIGN (ctype);
402 case sfk_move_assignment:
403 return !TYPE_HAS_COMPLEX_MOVE_ASSIGN (ctype);
404 case sfk_destructor:
405 return !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (ctype);
406 case sfk_inheriting_constructor:
407 return false;
408 default:
409 gcc_unreachable ();
410 }
411 }
412
413 /* Note that CTYPE has a non-trivial SFK even though we previously thought
414 it was trivial. */
415
416 static void
type_set_nontrivial_flag(tree ctype,special_function_kind sfk)417 type_set_nontrivial_flag (tree ctype, special_function_kind sfk)
418 {
419 switch (sfk)
420 {
421 case sfk_constructor:
422 TYPE_HAS_COMPLEX_DFLT (ctype) = true;
423 return;
424 case sfk_copy_constructor:
425 TYPE_HAS_COMPLEX_COPY_CTOR (ctype) = true;
426 return;
427 case sfk_move_constructor:
428 TYPE_HAS_COMPLEX_MOVE_CTOR (ctype) = true;
429 return;
430 case sfk_copy_assignment:
431 TYPE_HAS_COMPLEX_COPY_ASSIGN (ctype) = true;
432 return;
433 case sfk_move_assignment:
434 TYPE_HAS_COMPLEX_MOVE_ASSIGN (ctype) = true;
435 return;
436 case sfk_destructor:
437 TYPE_HAS_NONTRIVIAL_DESTRUCTOR (ctype) = true;
438 return;
439 case sfk_inheriting_constructor:
440 default:
441 gcc_unreachable ();
442 }
443 }
444
445 /* True iff FN is a trivial defaulted member function ([cd]tor, op=). */
446
447 bool
trivial_fn_p(tree fn)448 trivial_fn_p (tree fn)
449 {
450 if (TREE_CODE (fn) == TEMPLATE_DECL)
451 return false;
452 if (!DECL_DEFAULTED_FN (fn))
453 return false;
454
455 /* If fn is a clone, get the primary variant. */
456 if (tree prim = DECL_CLONED_FUNCTION (fn))
457 fn = prim;
458 return type_has_trivial_fn (DECL_CONTEXT (fn), special_function_p (fn));
459 }
460
461 /* PARM is a PARM_DECL for a function which we want to forward to another
462 function without changing its value category, a la std::forward. */
463
464 tree
forward_parm(tree parm)465 forward_parm (tree parm)
466 {
467 tree exp = convert_from_reference (parm);
468 tree type = TREE_TYPE (parm);
469 if (DECL_PACK_P (parm))
470 type = PACK_EXPANSION_PATTERN (type);
471 if (TREE_CODE (type) != REFERENCE_TYPE)
472 type = cp_build_reference_type (type, /*rval=*/true);
473 warning_sentinel w (warn_useless_cast);
474 exp = build_static_cast (type, exp, tf_warning_or_error);
475 if (DECL_PACK_P (parm))
476 exp = make_pack_expansion (exp);
477 return exp;
478 }
479
480 /* Strip all inheriting constructors, if any, to return the original
481 constructor from a (possibly indirect) base class. */
482
483 tree
strip_inheriting_ctors(tree dfn)484 strip_inheriting_ctors (tree dfn)
485 {
486 if (!flag_new_inheriting_ctors)
487 return dfn;
488 tree fn = dfn;
489 while (tree inh = DECL_INHERITED_CTOR (fn))
490 fn = OVL_FIRST (inh);
491
492 if (TREE_CODE (fn) == TEMPLATE_DECL
493 && TREE_CODE (dfn) == FUNCTION_DECL)
494 fn = DECL_TEMPLATE_RESULT (fn);
495 return fn;
496 }
497
498 /* Find the binfo for the base subobject of BINFO being initialized by
499 inherited constructor FNDECL (a member of a direct base of BINFO). */
500
501 static tree inherited_ctor_binfo (tree, tree);
502 static tree
inherited_ctor_binfo_1(tree binfo,tree fndecl)503 inherited_ctor_binfo_1 (tree binfo, tree fndecl)
504 {
505 tree base = DECL_CONTEXT (fndecl);
506 tree base_binfo;
507 for (int i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
508 if (BINFO_TYPE (base_binfo) == base)
509 return inherited_ctor_binfo (base_binfo, fndecl);
510
511 gcc_unreachable();
512 }
513
514 /* Find the binfo for the base subobject of BINFO being initialized by
515 inheriting constructor FNDECL (a member of BINFO), or BINFO if FNDECL is not
516 an inheriting constructor. */
517
518 static tree
inherited_ctor_binfo(tree binfo,tree fndecl)519 inherited_ctor_binfo (tree binfo, tree fndecl)
520 {
521 tree inh = DECL_INHERITED_CTOR (fndecl);
522 if (!inh)
523 return binfo;
524
525 tree results = NULL_TREE;
526 for (ovl_iterator iter (inh); iter; ++iter)
527 {
528 tree one = inherited_ctor_binfo_1 (binfo, *iter);
529 if (!results)
530 results = one;
531 else if (one != results)
532 results = tree_cons (NULL_TREE, one, results);
533 }
534 return results;
535 }
536
537 /* Find the binfo for the base subobject being initialized by inheriting
538 constructor FNDECL, or NULL_TREE if FNDECL is not an inheriting
539 constructor. */
540
541 tree
inherited_ctor_binfo(tree fndecl)542 inherited_ctor_binfo (tree fndecl)
543 {
544 if (!DECL_INHERITED_CTOR (fndecl))
545 return NULL_TREE;
546 tree binfo = TYPE_BINFO (DECL_CONTEXT (fndecl));
547 return inherited_ctor_binfo (binfo, fndecl);
548 }
549
550 /* True if we should omit all user-declared parameters from constructor FN,
551 because it is a base clone of a ctor inherited from a virtual base. */
552
553 bool
ctor_omit_inherited_parms(tree fn)554 ctor_omit_inherited_parms (tree fn)
555 {
556 if (!flag_new_inheriting_ctors)
557 /* We only optimize away the parameters in the new model. */
558 return false;
559 if (!DECL_BASE_CONSTRUCTOR_P (fn)
560 || !CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn)))
561 return false;
562 if (FUNCTION_FIRST_USER_PARMTYPE (DECL_ORIGIN (fn)) == void_list_node)
563 /* No user-declared parameters to omit. */
564 return false;
565 tree binfo = inherited_ctor_binfo (fn);
566 for (; binfo; binfo = BINFO_INHERITANCE_CHAIN (binfo))
567 if (BINFO_VIRTUAL_P (binfo))
568 return true;
569 return false;
570 }
571
572 /* True iff constructor(s) INH inherited into BINFO initializes INIT_BINFO.
573 This can be true for multiple virtual bases as well as one direct
574 non-virtual base. */
575
576 static bool
binfo_inherited_from(tree binfo,tree init_binfo,tree inh)577 binfo_inherited_from (tree binfo, tree init_binfo, tree inh)
578 {
579 /* inh is an OVERLOAD if we inherited the same constructor along
580 multiple paths, check all of them. */
581 for (ovl_iterator iter (inh); iter; ++iter)
582 {
583 tree fn = *iter;
584 tree base = DECL_CONTEXT (fn);
585 tree base_binfo = NULL_TREE;
586 for (int i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
587 if (BINFO_TYPE (base_binfo) == base)
588 break;
589 if (base_binfo == init_binfo
590 || (flag_new_inheriting_ctors
591 && binfo_inherited_from (base_binfo, init_binfo,
592 DECL_INHERITED_CTOR (fn))))
593 return true;
594 }
595 return false;
596 }
597
598 /* Subroutine of do_build_copy_constructor: Add a mem-initializer for BINFO
599 given the parameter or parameters PARM, possibly inherited constructor
600 base INH, or move flag MOVE_P. */
601
602 static tree
add_one_base_init(tree binfo,tree parm,bool move_p,tree inh,tree member_init_list)603 add_one_base_init (tree binfo, tree parm, bool move_p, tree inh,
604 tree member_init_list)
605 {
606 tree init;
607 if (inh)
608 {
609 /* An inheriting constructor only has a mem-initializer for
610 the base it inherits from. */
611 if (!binfo_inherited_from (TYPE_BINFO (current_class_type), binfo, inh))
612 return member_init_list;
613
614 tree *p = &init;
615 init = NULL_TREE;
616 for (; parm; parm = DECL_CHAIN (parm))
617 {
618 tree exp = forward_parm (parm);
619 *p = build_tree_list (NULL_TREE, exp);
620 p = &TREE_CHAIN (*p);
621 }
622 }
623 else
624 {
625 init = build_base_path (PLUS_EXPR, parm, binfo, 1,
626 tf_warning_or_error);
627 if (move_p)
628 init = move (init);
629 init = build_tree_list (NULL_TREE, init);
630 }
631 return tree_cons (binfo, init, member_init_list);
632 }
633
634 /* Generate code for default X(X&) or X(X&&) constructor or an inheriting
635 constructor. */
636
637 static void
do_build_copy_constructor(tree fndecl)638 do_build_copy_constructor (tree fndecl)
639 {
640 tree parm = FUNCTION_FIRST_USER_PARM (fndecl);
641 bool move_p = DECL_MOVE_CONSTRUCTOR_P (fndecl);
642 bool trivial = trivial_fn_p (fndecl);
643 tree inh = DECL_INHERITED_CTOR (fndecl);
644
645 if (!inh)
646 parm = convert_from_reference (parm);
647
648 if (trivial)
649 {
650 if (is_empty_class (current_class_type))
651 /* Don't copy the padding byte; it might not have been allocated
652 if *this is a base subobject. */;
653 else if (tree_int_cst_equal (TYPE_SIZE (current_class_type),
654 CLASSTYPE_SIZE (current_class_type)))
655 {
656 tree t = build2 (INIT_EXPR, void_type_node, current_class_ref, parm);
657 finish_expr_stmt (t);
658 }
659 else
660 {
661 /* We must only copy the non-tail padding parts. */
662 tree base_size = CLASSTYPE_SIZE_UNIT (current_class_type);
663 base_size = size_binop (MINUS_EXPR, base_size, size_int (1));
664 tree array_type = build_array_type (unsigned_char_type_node,
665 build_index_type (base_size));
666 tree alias_set = build_int_cst (TREE_TYPE (current_class_ptr), 0);
667 tree lhs = build2 (MEM_REF, array_type,
668 current_class_ptr, alias_set);
669 tree rhs = build2 (MEM_REF, array_type,
670 TREE_OPERAND (parm, 0), alias_set);
671 tree t = build2 (INIT_EXPR, void_type_node, lhs, rhs);
672 finish_expr_stmt (t);
673 }
674 }
675 else
676 {
677 tree fields = TYPE_FIELDS (current_class_type);
678 tree member_init_list = NULL_TREE;
679 int cvquals = cp_type_quals (TREE_TYPE (parm));
680 int i;
681 tree binfo, base_binfo;
682 tree init;
683 vec<tree, va_gc> *vbases;
684
685 /* Initialize all the base-classes with the parameter converted
686 to their type so that we get their copy constructor and not
687 another constructor that takes current_class_type. We must
688 deal with the binfo's directly as a direct base might be
689 inaccessible due to ambiguity. */
690 for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
691 vec_safe_iterate (vbases, i, &binfo); i++)
692 {
693 member_init_list = add_one_base_init (binfo, parm, move_p, inh,
694 member_init_list);
695 }
696
697 for (binfo = TYPE_BINFO (current_class_type), i = 0;
698 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
699 {
700 if (BINFO_VIRTUAL_P (base_binfo))
701 continue;
702 member_init_list = add_one_base_init (base_binfo, parm, move_p,
703 inh, member_init_list);
704 }
705
706 for (; fields; fields = DECL_CHAIN (fields))
707 {
708 tree field = fields;
709 tree expr_type;
710
711 if (TREE_CODE (field) != FIELD_DECL)
712 continue;
713 if (inh)
714 continue;
715
716 expr_type = TREE_TYPE (field);
717 if (DECL_NAME (field))
718 {
719 if (VFIELD_NAME_P (DECL_NAME (field)))
720 continue;
721 }
722 else if (ANON_AGGR_TYPE_P (expr_type) && TYPE_FIELDS (expr_type))
723 /* Just use the field; anonymous types can't have
724 nontrivial copy ctors or assignment ops or this
725 function would be deleted. */;
726 else
727 continue;
728
729 /* Compute the type of "init->field". If the copy-constructor
730 parameter is, for example, "const S&", and the type of
731 the field is "T", then the type will usually be "const
732 T". (There are no cv-qualified variants of reference
733 types.) */
734 if (TREE_CODE (expr_type) != REFERENCE_TYPE)
735 {
736 int quals = cvquals;
737
738 if (DECL_MUTABLE_P (field))
739 quals &= ~TYPE_QUAL_CONST;
740 quals |= cp_type_quals (expr_type);
741 expr_type = cp_build_qualified_type (expr_type, quals);
742 }
743
744 init = build3 (COMPONENT_REF, expr_type, parm, field, NULL_TREE);
745 if (move_p && TREE_CODE (expr_type) != REFERENCE_TYPE
746 /* 'move' breaks bit-fields, and has no effect for scalars. */
747 && !scalarish_type_p (expr_type))
748 init = move (init);
749 init = build_tree_list (NULL_TREE, init);
750
751 member_init_list = tree_cons (field, init, member_init_list);
752 }
753 finish_mem_initializers (member_init_list);
754 }
755 }
756
757 static void
do_build_copy_assign(tree fndecl)758 do_build_copy_assign (tree fndecl)
759 {
760 tree parm = DECL_CHAIN (DECL_ARGUMENTS (fndecl));
761 tree compound_stmt;
762 bool move_p = move_fn_p (fndecl);
763 bool trivial = trivial_fn_p (fndecl);
764 int flags = LOOKUP_NORMAL | LOOKUP_NONVIRTUAL | LOOKUP_DEFAULTED;
765
766 compound_stmt = begin_compound_stmt (0);
767 parm = convert_from_reference (parm);
768
769 if (trivial
770 && is_empty_class (current_class_type))
771 /* Don't copy the padding byte; it might not have been allocated
772 if *this is a base subobject. */;
773 else if (trivial)
774 {
775 tree t = build2 (MODIFY_EXPR, void_type_node, current_class_ref, parm);
776 finish_expr_stmt (t);
777 }
778 else
779 {
780 tree fields;
781 int cvquals = cp_type_quals (TREE_TYPE (parm));
782 int i;
783 tree binfo, base_binfo;
784
785 /* Assign to each of the direct base classes. */
786 for (binfo = TYPE_BINFO (current_class_type), i = 0;
787 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
788 {
789 tree converted_parm;
790 vec<tree, va_gc> *parmvec;
791
792 /* We must convert PARM directly to the base class
793 explicitly since the base class may be ambiguous. */
794 converted_parm = build_base_path (PLUS_EXPR, parm, base_binfo, 1,
795 tf_warning_or_error);
796 if (move_p)
797 converted_parm = move (converted_parm);
798 /* Call the base class assignment operator. */
799 parmvec = make_tree_vector_single (converted_parm);
800 finish_expr_stmt
801 (build_special_member_call (current_class_ref,
802 assign_op_identifier,
803 &parmvec,
804 base_binfo,
805 flags,
806 tf_warning_or_error));
807 release_tree_vector (parmvec);
808 }
809
810 /* Assign to each of the non-static data members. */
811 for (fields = TYPE_FIELDS (current_class_type);
812 fields;
813 fields = DECL_CHAIN (fields))
814 {
815 tree comp = current_class_ref;
816 tree init = parm;
817 tree field = fields;
818 tree expr_type;
819 int quals;
820
821 if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
822 continue;
823
824 expr_type = TREE_TYPE (field);
825
826 if (CP_TYPE_CONST_P (expr_type))
827 {
828 error ("non-static const member %q#D, can%'t use default "
829 "assignment operator", field);
830 continue;
831 }
832 else if (TREE_CODE (expr_type) == REFERENCE_TYPE)
833 {
834 error ("non-static reference member %q#D, can%'t use "
835 "default assignment operator", field);
836 continue;
837 }
838
839 if (DECL_NAME (field))
840 {
841 if (VFIELD_NAME_P (DECL_NAME (field)))
842 continue;
843 }
844 else if (ANON_AGGR_TYPE_P (expr_type)
845 && TYPE_FIELDS (expr_type) != NULL_TREE)
846 /* Just use the field; anonymous types can't have
847 nontrivial copy ctors or assignment ops or this
848 function would be deleted. */;
849 else
850 continue;
851
852 comp = build3 (COMPONENT_REF, expr_type, comp, field, NULL_TREE);
853
854 /* Compute the type of init->field */
855 quals = cvquals;
856 if (DECL_MUTABLE_P (field))
857 quals &= ~TYPE_QUAL_CONST;
858 expr_type = cp_build_qualified_type (expr_type, quals);
859
860 init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE);
861 if (move_p && TREE_CODE (expr_type) != REFERENCE_TYPE
862 /* 'move' breaks bit-fields, and has no effect for scalars. */
863 && !scalarish_type_p (expr_type))
864 init = move (init);
865
866 if (DECL_NAME (field))
867 init = cp_build_modify_expr (input_location, comp, NOP_EXPR, init,
868 tf_warning_or_error);
869 else
870 init = build2 (MODIFY_EXPR, TREE_TYPE (comp), comp, init);
871 finish_expr_stmt (init);
872 }
873 }
874 finish_return_stmt (current_class_ref);
875 finish_compound_stmt (compound_stmt);
876 }
877
878 /* Synthesize FNDECL, a non-static member function. */
879
880 void
synthesize_method(tree fndecl)881 synthesize_method (tree fndecl)
882 {
883 bool nested = (current_function_decl != NULL_TREE);
884 tree context = decl_function_context (fndecl);
885 bool need_body = true;
886 tree stmt;
887 location_t save_input_location = input_location;
888 int error_count = errorcount;
889 int warning_count = warningcount + werrorcount;
890
891 /* Reset the source location, we might have been previously
892 deferred, and thus have saved where we were first needed. */
893 DECL_SOURCE_LOCATION (fndecl)
894 = DECL_SOURCE_LOCATION (TYPE_NAME (DECL_CONTEXT (fndecl)));
895
896 /* If we've been asked to synthesize a clone, just synthesize the
897 cloned function instead. Doing so will automatically fill in the
898 body for the clone. */
899 if (DECL_CLONED_FUNCTION_P (fndecl))
900 fndecl = DECL_CLONED_FUNCTION (fndecl);
901
902 /* We may be in the middle of deferred access check. Disable
903 it now. */
904 push_deferring_access_checks (dk_no_deferred);
905
906 if (! context)
907 push_to_top_level ();
908 else if (nested)
909 push_function_context ();
910
911 input_location = DECL_SOURCE_LOCATION (fndecl);
912
913 start_preparsed_function (fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
914 stmt = begin_function_body ();
915
916 if (DECL_ASSIGNMENT_OPERATOR_P (fndecl)
917 && DECL_OVERLOADED_OPERATOR_IS (fndecl, NOP_EXPR))
918 {
919 do_build_copy_assign (fndecl);
920 need_body = false;
921 }
922 else if (DECL_CONSTRUCTOR_P (fndecl))
923 {
924 tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl);
925 if (arg_chain != void_list_node)
926 do_build_copy_constructor (fndecl);
927 else
928 finish_mem_initializers (NULL_TREE);
929 }
930
931 /* If we haven't yet generated the body of the function, just
932 generate an empty compound statement. */
933 if (need_body)
934 {
935 tree compound_stmt;
936 compound_stmt = begin_compound_stmt (BCS_FN_BODY);
937 finish_compound_stmt (compound_stmt);
938 }
939
940 finish_function_body (stmt);
941 expand_or_defer_fn (finish_function (/*inline_p=*/false));
942
943 input_location = save_input_location;
944
945 if (! context)
946 pop_from_top_level ();
947 else if (nested)
948 pop_function_context ();
949
950 pop_deferring_access_checks ();
951
952 if (error_count != errorcount || warning_count != warningcount + werrorcount)
953 inform (input_location, "synthesized method %qD first required here",
954 fndecl);
955 }
956
957 /* Build a reference to type TYPE with cv-quals QUALS, which is an
958 rvalue if RVALUE is true. */
959
960 static tree
build_stub_type(tree type,int quals,bool rvalue)961 build_stub_type (tree type, int quals, bool rvalue)
962 {
963 tree argtype = cp_build_qualified_type (type, quals);
964 return cp_build_reference_type (argtype, rvalue);
965 }
966
967 /* Build a dummy glvalue from dereferencing a dummy reference of type
968 REFTYPE. */
969
970 static tree
build_stub_object(tree reftype)971 build_stub_object (tree reftype)
972 {
973 if (TREE_CODE (reftype) != REFERENCE_TYPE)
974 reftype = cp_build_reference_type (reftype, /*rval*/true);
975 tree stub = build1 (CONVERT_EXPR, reftype, integer_one_node);
976 return convert_from_reference (stub);
977 }
978
979 /* Determine which function will be called when looking up NAME in TYPE,
980 called with a single ARGTYPE argument, or no argument if ARGTYPE is
981 null. FLAGS and COMPLAIN are as for build_new_method_call.
982
983 Returns a FUNCTION_DECL if all is well.
984 Returns NULL_TREE if overload resolution failed.
985 Returns error_mark_node if the chosen function cannot be called. */
986
987 static tree
locate_fn_flags(tree type,tree name,tree argtype,int flags,tsubst_flags_t complain)988 locate_fn_flags (tree type, tree name, tree argtype, int flags,
989 tsubst_flags_t complain)
990 {
991 tree ob, fn, fns, binfo, rval;
992 vec<tree, va_gc> *args;
993
994 if (TYPE_P (type))
995 binfo = TYPE_BINFO (type);
996 else
997 {
998 binfo = type;
999 type = BINFO_TYPE (binfo);
1000 }
1001
1002 ob = build_stub_object (cp_build_reference_type (type, false));
1003 args = make_tree_vector ();
1004 if (argtype)
1005 {
1006 if (TREE_CODE (argtype) == TREE_LIST)
1007 {
1008 for (tree elt = argtype; elt && elt != void_list_node;
1009 elt = TREE_CHAIN (elt))
1010 {
1011 tree type = TREE_VALUE (elt);
1012 tree arg = build_stub_object (type);
1013 vec_safe_push (args, arg);
1014 }
1015 }
1016 else
1017 {
1018 tree arg = build_stub_object (argtype);
1019 args->quick_push (arg);
1020 }
1021 }
1022
1023 fns = lookup_fnfields (binfo, name, 0);
1024 rval = build_new_method_call (ob, fns, &args, binfo, flags, &fn, complain);
1025
1026 release_tree_vector (args);
1027 if (fn && rval == error_mark_node)
1028 return rval;
1029 else
1030 return fn;
1031 }
1032
1033 /* Locate the dtor of TYPE. */
1034
1035 tree
get_dtor(tree type,tsubst_flags_t complain)1036 get_dtor (tree type, tsubst_flags_t complain)
1037 {
1038 tree fn = locate_fn_flags (type, complete_dtor_identifier, NULL_TREE,
1039 LOOKUP_NORMAL, complain);
1040 if (fn == error_mark_node)
1041 return NULL_TREE;
1042 return fn;
1043 }
1044
1045 /* Locate the default ctor of TYPE. */
1046
1047 tree
locate_ctor(tree type)1048 locate_ctor (tree type)
1049 {
1050 tree fn;
1051
1052 push_deferring_access_checks (dk_no_check);
1053 fn = locate_fn_flags (type, complete_ctor_identifier, NULL_TREE,
1054 LOOKUP_SPECULATIVE, tf_none);
1055 pop_deferring_access_checks ();
1056 if (fn == error_mark_node)
1057 return NULL_TREE;
1058 return fn;
1059 }
1060
1061 /* Likewise, but give any appropriate errors. */
1062
1063 tree
get_default_ctor(tree type)1064 get_default_ctor (tree type)
1065 {
1066 tree fn = locate_fn_flags (type, complete_ctor_identifier, NULL_TREE,
1067 LOOKUP_NORMAL, tf_warning_or_error);
1068 if (fn == error_mark_node)
1069 return NULL_TREE;
1070 return fn;
1071 }
1072
1073 /* Locate the copy ctor of TYPE. */
1074
1075 tree
get_copy_ctor(tree type,tsubst_flags_t complain)1076 get_copy_ctor (tree type, tsubst_flags_t complain)
1077 {
1078 int quals = (TYPE_HAS_CONST_COPY_CTOR (type)
1079 ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED);
1080 tree argtype = build_stub_type (type, quals, false);
1081 tree fn = locate_fn_flags (type, complete_ctor_identifier, argtype,
1082 LOOKUP_NORMAL, complain);
1083 if (fn == error_mark_node)
1084 return NULL_TREE;
1085 return fn;
1086 }
1087
1088 /* Locate the copy assignment operator of TYPE. */
1089
1090 tree
get_copy_assign(tree type)1091 get_copy_assign (tree type)
1092 {
1093 int quals = (TYPE_HAS_CONST_COPY_ASSIGN (type)
1094 ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED);
1095 tree argtype = build_stub_type (type, quals, false);
1096 tree fn = locate_fn_flags (type, assign_op_identifier, argtype,
1097 LOOKUP_NORMAL, tf_warning_or_error);
1098 if (fn == error_mark_node)
1099 return NULL_TREE;
1100 return fn;
1101 }
1102
1103 /* walk_tree helper function for is_trivially_xible. If *TP is a call,
1104 return it if it calls something other than a trivial special member
1105 function. */
1106
1107 static tree
check_nontriv(tree * tp,int *,void *)1108 check_nontriv (tree *tp, int *, void *)
1109 {
1110 tree fn = cp_get_callee (*tp);
1111 if (fn == NULL_TREE)
1112 return NULL_TREE;
1113
1114 if (TREE_CODE (fn) == ADDR_EXPR)
1115 fn = TREE_OPERAND (fn, 0);
1116
1117 if (TREE_CODE (fn) != FUNCTION_DECL
1118 || !trivial_fn_p (fn))
1119 return fn;
1120 return NULL_TREE;
1121 }
1122
1123 /* Return declval<T>() = declval<U>() treated as an unevaluated operand. */
1124
1125 static tree
assignable_expr(tree to,tree from)1126 assignable_expr (tree to, tree from)
1127 {
1128 ++cp_unevaluated_operand;
1129 to = build_stub_object (to);
1130 from = build_stub_object (from);
1131 tree r = cp_build_modify_expr (input_location, to, NOP_EXPR, from, tf_none);
1132 --cp_unevaluated_operand;
1133 return r;
1134 }
1135
1136 /* The predicate condition for a template specialization
1137 is_constructible<T, Args...> shall be satisfied if and only if the
1138 following variable definition would be well-formed for some invented
1139 variable t: T t(create<Args>()...);
1140
1141 Return something equivalent in well-formedness and triviality. */
1142
1143 static tree
constructible_expr(tree to,tree from)1144 constructible_expr (tree to, tree from)
1145 {
1146 tree expr;
1147 cp_unevaluated cp_uneval_guard;
1148 if (CLASS_TYPE_P (to))
1149 {
1150 tree ctype = to;
1151 vec<tree, va_gc> *args = NULL;
1152 if (TREE_CODE (to) != REFERENCE_TYPE)
1153 to = cp_build_reference_type (to, /*rval*/false);
1154 tree ob = build_stub_object (to);
1155 for (; from; from = TREE_CHAIN (from))
1156 vec_safe_push (args, build_stub_object (TREE_VALUE (from)));
1157 expr = build_special_member_call (ob, complete_ctor_identifier, &args,
1158 ctype, LOOKUP_NORMAL, tf_none);
1159 if (expr == error_mark_node)
1160 return error_mark_node;
1161 /* The current state of the standard vis-a-vis LWG 2116 is that
1162 is_*constructible involves destruction as well. */
1163 if (type_build_dtor_call (ctype))
1164 {
1165 tree dtor = build_special_member_call (ob, complete_dtor_identifier,
1166 NULL, ctype, LOOKUP_NORMAL,
1167 tf_none);
1168 if (dtor == error_mark_node)
1169 return error_mark_node;
1170 if (!TYPE_HAS_TRIVIAL_DESTRUCTOR (ctype))
1171 expr = build2 (COMPOUND_EXPR, void_type_node, expr, dtor);
1172 }
1173 }
1174 else
1175 {
1176 if (from == NULL_TREE)
1177 return build_value_init (strip_array_types (to), tf_none);
1178 else if (TREE_CHAIN (from))
1179 return error_mark_node; // too many initializers
1180 from = build_stub_object (TREE_VALUE (from));
1181 expr = perform_direct_initialization_if_possible (to, from,
1182 /*cast*/false,
1183 tf_none);
1184 }
1185 return expr;
1186 }
1187
1188 /* Returns a tree iff TO is assignable (if CODE is MODIFY_EXPR) or
1189 constructible (otherwise) from FROM, which is a single type for
1190 assignment or a list of types for construction. */
1191
1192 static tree
is_xible_helper(enum tree_code code,tree to,tree from,bool trivial)1193 is_xible_helper (enum tree_code code, tree to, tree from, bool trivial)
1194 {
1195 if (VOID_TYPE_P (to) || ABSTRACT_CLASS_TYPE_P (to)
1196 || (from && FUNC_OR_METHOD_TYPE_P (from)
1197 && (TYPE_READONLY (from) || FUNCTION_REF_QUALIFIED (from))))
1198 return error_mark_node;
1199 tree expr;
1200 if (code == MODIFY_EXPR)
1201 expr = assignable_expr (to, from);
1202 else if (trivial && from && TREE_CHAIN (from))
1203 return error_mark_node; // only 0- and 1-argument ctors can be trivial
1204 else if (TREE_CODE (to) == ARRAY_TYPE && !TYPE_DOMAIN (to))
1205 return error_mark_node; // can't construct an array of unknown bound
1206 else
1207 expr = constructible_expr (to, from);
1208 return expr;
1209 }
1210
1211 /* Returns true iff TO is trivially assignable (if CODE is MODIFY_EXPR) or
1212 constructible (otherwise) from FROM, which is a single type for
1213 assignment or a list of types for construction. */
1214
1215 bool
is_trivially_xible(enum tree_code code,tree to,tree from)1216 is_trivially_xible (enum tree_code code, tree to, tree from)
1217 {
1218 tree expr;
1219 expr = is_xible_helper (code, to, from, /*trivial*/true);
1220
1221 if (expr == NULL_TREE || expr == error_mark_node)
1222 return false;
1223 tree nt = cp_walk_tree_without_duplicates (&expr, check_nontriv, NULL);
1224 return !nt;
1225 }
1226
1227 /* Returns true iff TO is assignable (if CODE is MODIFY_EXPR) or
1228 constructible (otherwise) from FROM, which is a single type for
1229 assignment or a list of types for construction. */
1230
1231 bool
is_xible(enum tree_code code,tree to,tree from)1232 is_xible (enum tree_code code, tree to, tree from)
1233 {
1234 tree expr = is_xible_helper (code, to, from, /*trivial*/false);
1235 if (expr == error_mark_node)
1236 return false;
1237 return !!expr;
1238 }
1239
1240 /* Subroutine of synthesized_method_walk. Update SPEC_P, TRIVIAL_P and
1241 DELETED_P or give an error message MSG with argument ARG. */
1242
1243 static void
1244 process_subob_fn (tree fn, tree *spec_p, bool *trivial_p,
1245 bool *deleted_p, bool *constexpr_p,
1246 bool diag, tree arg, bool dtor_from_ctor = false)
1247 {
1248 if (!fn || fn == error_mark_node)
1249 {
1250 if (deleted_p)
1251 *deleted_p = true;
1252 return;
1253 }
1254
1255 if (spec_p)
1256 {
1257 maybe_instantiate_noexcept (fn);
1258 tree raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
1259 *spec_p = merge_exception_specifiers (*spec_p, raises);
1260 }
1261
1262 if (!trivial_fn_p (fn) && !dtor_from_ctor)
1263 {
1264 if (trivial_p)
1265 *trivial_p = false;
1266 if (TREE_CODE (arg) == FIELD_DECL
1267 && TREE_CODE (DECL_CONTEXT (arg)) == UNION_TYPE)
1268 {
1269 if (deleted_p)
1270 *deleted_p = true;
1271 if (diag)
1272 error ("union member %q+D with non-trivial %qD", arg, fn);
1273 }
1274 }
1275
1276 if (constexpr_p && !DECL_DECLARED_CONSTEXPR_P (fn))
1277 {
1278 *constexpr_p = false;
1279 if (diag)
1280 {
1281 inform (DECL_SOURCE_LOCATION (fn),
1282 "defaulted constructor calls non-%<constexpr%> %qD", fn);
1283 explain_invalid_constexpr_fn (fn);
1284 }
1285 }
1286 }
1287
1288 /* Subroutine of synthesized_method_walk to allow recursion into anonymous
1289 aggregates. If DTOR_FROM_CTOR is true, we're walking subobject destructors
1290 called from a synthesized constructor, in which case we don't consider
1291 the triviality of the subobject destructor. */
1292
1293 static void
walk_field_subobs(tree fields,tree fnname,special_function_kind sfk,int quals,bool copy_arg_p,bool move_p,bool assign_p,tree * spec_p,bool * trivial_p,bool * deleted_p,bool * constexpr_p,bool diag,int flags,tsubst_flags_t complain,bool dtor_from_ctor)1294 walk_field_subobs (tree fields, tree fnname, special_function_kind sfk,
1295 int quals, bool copy_arg_p, bool move_p,
1296 bool assign_p, tree *spec_p, bool *trivial_p,
1297 bool *deleted_p, bool *constexpr_p,
1298 bool diag, int flags, tsubst_flags_t complain,
1299 bool dtor_from_ctor)
1300 {
1301 tree field;
1302 for (field = fields; field; field = DECL_CHAIN (field))
1303 {
1304 tree mem_type, argtype, rval;
1305
1306 if (TREE_CODE (field) != FIELD_DECL
1307 || DECL_ARTIFICIAL (field))
1308 continue;
1309
1310 /* Variant members only affect deletedness. In particular, they don't
1311 affect the exception-specification of a user-provided destructor,
1312 which we're figuring out via get_defaulted_eh_spec. So if we aren't
1313 asking if this is deleted, don't even look up the function; we don't
1314 want an error about a deleted function we aren't actually calling. */
1315 if (sfk == sfk_destructor && deleted_p == NULL
1316 && TREE_CODE (DECL_CONTEXT (field)) == UNION_TYPE)
1317 break;
1318
1319 mem_type = strip_array_types (TREE_TYPE (field));
1320 if (assign_p)
1321 {
1322 bool bad = true;
1323 if (CP_TYPE_CONST_P (mem_type) && !CLASS_TYPE_P (mem_type))
1324 {
1325 if (diag)
1326 error ("non-static const member %q#D, can%'t use default "
1327 "assignment operator", field);
1328 }
1329 else if (TREE_CODE (mem_type) == REFERENCE_TYPE)
1330 {
1331 if (diag)
1332 error ("non-static reference member %q#D, can%'t use "
1333 "default assignment operator", field);
1334 }
1335 else
1336 bad = false;
1337
1338 if (bad && deleted_p)
1339 *deleted_p = true;
1340 }
1341 else if (sfk == sfk_constructor || sfk == sfk_inheriting_constructor)
1342 {
1343 bool bad;
1344
1345 if (DECL_INITIAL (field))
1346 {
1347 if (diag && DECL_INITIAL (field) == error_mark_node)
1348 inform (DECL_SOURCE_LOCATION (field),
1349 "initializer for %q#D is invalid", field);
1350 if (trivial_p)
1351 *trivial_p = false;
1352 /* Core 1351: If the field has an NSDMI that could throw, the
1353 default constructor is noexcept(false). */
1354 if (spec_p)
1355 {
1356 tree nsdmi = get_nsdmi (field, /*ctor*/false, complain);
1357 if (!expr_noexcept_p (nsdmi, complain))
1358 *spec_p = noexcept_false_spec;
1359 }
1360 /* Don't do the normal processing. */
1361 continue;
1362 }
1363
1364 bad = false;
1365 if (CP_TYPE_CONST_P (mem_type)
1366 && default_init_uninitialized_part (mem_type))
1367 {
1368 if (diag)
1369 {
1370 error ("uninitialized const member in %q#T",
1371 current_class_type);
1372 inform (DECL_SOURCE_LOCATION (field),
1373 "%q#D should be initialized", field);
1374 }
1375 bad = true;
1376 }
1377 else if (TREE_CODE (mem_type) == REFERENCE_TYPE)
1378 {
1379 if (diag)
1380 {
1381 error ("uninitialized reference member in %q#T",
1382 current_class_type);
1383 inform (DECL_SOURCE_LOCATION (field),
1384 "%q#D should be initialized", field);
1385 }
1386 bad = true;
1387 }
1388
1389 if (bad && deleted_p)
1390 *deleted_p = true;
1391
1392 /* For an implicitly-defined default constructor to be constexpr,
1393 every member must have a user-provided default constructor or
1394 an explicit initializer. */
1395 if (constexpr_p && !CLASS_TYPE_P (mem_type)
1396 && TREE_CODE (DECL_CONTEXT (field)) != UNION_TYPE)
1397 {
1398 *constexpr_p = false;
1399 if (diag)
1400 inform (DECL_SOURCE_LOCATION (field),
1401 "defaulted default constructor does not "
1402 "initialize %q#D", field);
1403 }
1404 }
1405 else if (sfk == sfk_copy_constructor)
1406 {
1407 /* 12.8p11b5 */
1408 if (TREE_CODE (mem_type) == REFERENCE_TYPE
1409 && TYPE_REF_IS_RVALUE (mem_type))
1410 {
1411 if (diag)
1412 error ("copying non-static data member %q#D of rvalue "
1413 "reference type", field);
1414 if (deleted_p)
1415 *deleted_p = true;
1416 }
1417 }
1418
1419 if (!CLASS_TYPE_P (mem_type))
1420 continue;
1421
1422 if (ANON_AGGR_TYPE_P (mem_type))
1423 {
1424 walk_field_subobs (TYPE_FIELDS (mem_type), fnname, sfk, quals,
1425 copy_arg_p, move_p, assign_p, spec_p, trivial_p,
1426 deleted_p, constexpr_p,
1427 diag, flags, complain, dtor_from_ctor);
1428 continue;
1429 }
1430
1431 if (copy_arg_p)
1432 {
1433 int mem_quals = cp_type_quals (mem_type) | quals;
1434 if (DECL_MUTABLE_P (field))
1435 mem_quals &= ~TYPE_QUAL_CONST;
1436 argtype = build_stub_type (mem_type, mem_quals, move_p);
1437 }
1438 else
1439 argtype = NULL_TREE;
1440
1441 rval = locate_fn_flags (mem_type, fnname, argtype, flags, complain);
1442
1443 process_subob_fn (rval, spec_p, trivial_p, deleted_p,
1444 constexpr_p, diag, field, dtor_from_ctor);
1445 }
1446 }
1447
1448 /* Base walker helper for synthesized_method_walk. Inspect a direct
1449 or virtual base. BINFO is the parent type's binfo. BASE_BINFO is
1450 the base binfo of interests. All other parms are as for
1451 synthesized_method_walk, or its local vars. */
1452
1453 static tree
synthesized_method_base_walk(tree binfo,tree base_binfo,int quals,bool copy_arg_p,bool move_p,bool ctor_p,tree * inheriting_ctor,tree inherited_parms,tree fnname,int flags,bool diag,tree * spec_p,bool * trivial_p,bool * deleted_p,bool * constexpr_p)1454 synthesized_method_base_walk (tree binfo, tree base_binfo,
1455 int quals, bool copy_arg_p,
1456 bool move_p, bool ctor_p,
1457 tree *inheriting_ctor, tree inherited_parms,
1458 tree fnname, int flags, bool diag,
1459 tree *spec_p, bool *trivial_p,
1460 bool *deleted_p, bool *constexpr_p)
1461 {
1462 bool inherited_binfo = false;
1463 tree argtype = NULL_TREE;
1464 deferring_kind defer = dk_no_deferred;
1465
1466 if (copy_arg_p)
1467 argtype = build_stub_type (BINFO_TYPE (base_binfo), quals, move_p);
1468 else if (inheriting_ctor
1469 && (inherited_binfo
1470 = binfo_inherited_from (binfo, base_binfo, *inheriting_ctor)))
1471 {
1472 argtype = inherited_parms;
1473 /* Don't check access on the inherited constructor. */
1474 if (flag_new_inheriting_ctors)
1475 defer = dk_deferred;
1476 }
1477 /* To be conservative, ignore access to the base dtor that
1478 DR1658 instructs us to ignore. See the comment in
1479 synthesized_method_walk. */
1480 else if (cxx_dialect >= cxx14 && fnname == complete_dtor_identifier
1481 && BINFO_VIRTUAL_P (base_binfo)
1482 && ABSTRACT_CLASS_TYPE_P (BINFO_TYPE (binfo)))
1483 defer = dk_no_check;
1484
1485 if (defer != dk_no_deferred)
1486 push_deferring_access_checks (defer);
1487 tree rval = locate_fn_flags (base_binfo, fnname, argtype, flags,
1488 diag ? tf_warning_or_error : tf_none);
1489 if (defer != dk_no_deferred)
1490 pop_deferring_access_checks ();
1491
1492 /* Replace an inherited template with the appropriate specialization. */
1493 if (inherited_binfo && rval
1494 && DECL_P (*inheriting_ctor) && DECL_P (rval)
1495 && DECL_CONTEXT (*inheriting_ctor) == DECL_CONTEXT (rval))
1496 *inheriting_ctor = DECL_CLONED_FUNCTION (rval);
1497
1498 process_subob_fn (rval, spec_p, trivial_p, deleted_p,
1499 constexpr_p, diag, BINFO_TYPE (base_binfo));
1500 if (ctor_p &&
1501 (!BINFO_VIRTUAL_P (base_binfo)
1502 || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo))))
1503 {
1504 /* In a constructor we also need to check the subobject
1505 destructors for cleanup of partially constructed objects. */
1506 tree dtor = locate_fn_flags (base_binfo, complete_dtor_identifier,
1507 NULL_TREE, flags,
1508 diag ? tf_warning_or_error : tf_none);
1509 /* Note that we don't pass down trivial_p; the subobject
1510 destructors don't affect triviality of the constructor. Nor
1511 do they affect constexpr-ness (a constant expression doesn't
1512 throw) or exception-specification (a throw from one of the
1513 dtors would be a double-fault). */
1514 process_subob_fn (dtor, NULL, NULL, deleted_p, NULL, false,
1515 BINFO_TYPE (base_binfo), /*dtor_from_ctor*/true);
1516 }
1517
1518 return rval;
1519 }
1520
1521 /* The caller wants to generate an implicit declaration of SFK for
1522 CTYPE which is const if relevant and CONST_P is set. If SPEC_P,
1523 TRIVIAL_P, DELETED_P or CONSTEXPR_P are non-null, set their
1524 referent appropriately. If DIAG is true, we're either being called
1525 from maybe_explain_implicit_delete to give errors, or if
1526 CONSTEXPR_P is non-null, from explain_invalid_constexpr_fn. */
1527
1528 static void
synthesized_method_walk(tree ctype,special_function_kind sfk,bool const_p,tree * spec_p,bool * trivial_p,bool * deleted_p,bool * constexpr_p,bool diag,tree * inheriting_ctor,tree inherited_parms)1529 synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
1530 tree *spec_p, bool *trivial_p, bool *deleted_p,
1531 bool *constexpr_p, bool diag,
1532 tree *inheriting_ctor, tree inherited_parms)
1533 {
1534 tree binfo, base_binfo, fnname;
1535 int i;
1536
1537 if (spec_p)
1538 *spec_p = (cxx_dialect >= cxx11 ? noexcept_true_spec : empty_except_spec);
1539
1540 if (deleted_p)
1541 {
1542 /* "The closure type associated with a lambda-expression has a deleted
1543 default constructor and a deleted copy assignment operator."
1544 This is diagnosed in maybe_explain_implicit_delete. */
1545 if (LAMBDA_TYPE_P (ctype)
1546 && (sfk == sfk_constructor
1547 || sfk == sfk_copy_assignment))
1548 {
1549 *deleted_p = true;
1550 return;
1551 }
1552
1553 *deleted_p = false;
1554 }
1555
1556 bool ctor_p = false;
1557 bool assign_p = false;
1558 bool check_vdtor = false;
1559 switch (sfk)
1560 {
1561 case sfk_move_assignment:
1562 case sfk_copy_assignment:
1563 assign_p = true;
1564 fnname = assign_op_identifier;
1565 break;
1566
1567 case sfk_destructor:
1568 check_vdtor = true;
1569 /* The synthesized method will call base dtors, but check complete
1570 here to avoid having to deal with VTT. */
1571 fnname = complete_dtor_identifier;
1572 break;
1573
1574 case sfk_constructor:
1575 case sfk_move_constructor:
1576 case sfk_copy_constructor:
1577 case sfk_inheriting_constructor:
1578 ctor_p = true;
1579 fnname = complete_ctor_identifier;
1580 break;
1581
1582 default:
1583 gcc_unreachable ();
1584 }
1585
1586 gcc_assert ((sfk == sfk_inheriting_constructor)
1587 == (inheriting_ctor && *inheriting_ctor != NULL_TREE));
1588
1589 /* If that user-written default constructor would satisfy the
1590 requirements of a constexpr constructor (7.1.5), the
1591 implicitly-defined default constructor is constexpr.
1592
1593 The implicitly-defined copy/move assignment operator is constexpr if
1594 - X is a literal type, and
1595 - the assignment operator selected to copy/move each direct base class
1596 subobject is a constexpr function, and
1597 - for each non-static data member of X that is of class type (or array
1598 thereof), the assignment operator selected to copy/move that
1599 member is a constexpr function. */
1600 if (constexpr_p)
1601 *constexpr_p = ctor_p || (assign_p && cxx_dialect >= cxx14);
1602
1603 bool move_p = false;
1604 bool copy_arg_p = false;
1605 switch (sfk)
1606 {
1607 case sfk_constructor:
1608 case sfk_destructor:
1609 case sfk_inheriting_constructor:
1610 break;
1611
1612 case sfk_move_constructor:
1613 case sfk_move_assignment:
1614 move_p = true;
1615 /* FALLTHRU */
1616 case sfk_copy_constructor:
1617 case sfk_copy_assignment:
1618 copy_arg_p = true;
1619 break;
1620
1621 default:
1622 gcc_unreachable ();
1623 }
1624
1625 bool expected_trivial = type_has_trivial_fn (ctype, sfk);
1626 if (trivial_p)
1627 *trivial_p = expected_trivial;
1628
1629 /* The TYPE_HAS_COMPLEX_* flags tell us about constraints from base
1630 class versions and other properties of the type. But a subobject
1631 class can be trivially copyable and yet have overload resolution
1632 choose a template constructor for initialization, depending on
1633 rvalueness and cv-quals. And furthermore, a member in a base might
1634 be trivial but deleted or otherwise not callable. So we can't exit
1635 early in C++0x. The same considerations apply in C++98/03, but
1636 there the definition of triviality does not consider overload
1637 resolution, so a constructor can be trivial even if it would otherwise
1638 call a non-trivial constructor. */
1639 if (expected_trivial
1640 && (!copy_arg_p || cxx_dialect < cxx11))
1641 {
1642 if (constexpr_p && sfk == sfk_constructor)
1643 {
1644 bool cx = trivial_default_constructor_is_constexpr (ctype);
1645 *constexpr_p = cx;
1646 if (diag && !cx && TREE_CODE (ctype) == UNION_TYPE)
1647 /* A trivial constructor doesn't have any NSDMI. */
1648 inform (input_location, "defaulted default constructor does "
1649 "not initialize any non-static data member");
1650 }
1651 if (!diag && cxx_dialect < cxx11)
1652 return;
1653 }
1654
1655 ++cp_unevaluated_operand;
1656 ++c_inhibit_evaluation_warnings;
1657 push_deferring_access_checks (dk_no_deferred);
1658
1659 tree scope = push_scope (ctype);
1660
1661 int flags = LOOKUP_NORMAL | LOOKUP_SPECULATIVE;
1662 if (sfk != sfk_inheriting_constructor)
1663 flags |= LOOKUP_DEFAULTED;
1664
1665 tsubst_flags_t complain = diag ? tf_warning_or_error : tf_none;
1666 if (diag && spec_p)
1667 /* We're in get_defaulted_eh_spec; we don't actually want any walking
1668 diagnostics, we just want complain set. */
1669 diag = false;
1670 int quals = const_p ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED;
1671
1672 for (binfo = TYPE_BINFO (ctype), i = 0;
1673 BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
1674 {
1675 if (!assign_p && BINFO_VIRTUAL_P (base_binfo))
1676 /* We'll handle virtual bases below. */
1677 continue;
1678
1679 tree fn = synthesized_method_base_walk (binfo, base_binfo, quals,
1680 copy_arg_p, move_p, ctor_p,
1681 inheriting_ctor,
1682 inherited_parms,
1683 fnname, flags, diag,
1684 spec_p, trivial_p,
1685 deleted_p, constexpr_p);
1686
1687 if (diag && assign_p && move_p
1688 && BINFO_VIRTUAL_P (base_binfo)
1689 && fn && TREE_CODE (fn) == FUNCTION_DECL
1690 && move_fn_p (fn) && !trivial_fn_p (fn)
1691 && vbase_has_user_provided_move_assign (BINFO_TYPE (base_binfo)))
1692 warning (OPT_Wvirtual_move_assign,
1693 "defaulted move assignment for %qT calls a non-trivial "
1694 "move assignment operator for virtual base %qT",
1695 ctype, BINFO_TYPE (base_binfo));
1696
1697 if (check_vdtor && type_has_virtual_destructor (BINFO_TYPE (base_binfo)))
1698 {
1699 /* Unlike for base ctor/op=/dtor, for operator delete it's fine
1700 to have a null fn (no class-specific op delete). */
1701 fn = locate_fn_flags (ctype, ovl_op_identifier (false, DELETE_EXPR),
1702 ptr_type_node, flags, tf_none);
1703 if (fn && fn == error_mark_node)
1704 {
1705 if (complain & tf_error)
1706 locate_fn_flags (ctype, ovl_op_identifier (false, DELETE_EXPR),
1707 ptr_type_node, flags, complain);
1708 if (deleted_p)
1709 *deleted_p = true;
1710 }
1711 check_vdtor = false;
1712 }
1713 }
1714
1715 vec<tree, va_gc> *vbases = CLASSTYPE_VBASECLASSES (ctype);
1716 if (assign_p)
1717 /* Already examined vbases above. */;
1718 else if (vec_safe_is_empty (vbases))
1719 /* No virtual bases to worry about. */;
1720 else if (ABSTRACT_CLASS_TYPE_P (ctype) && cxx_dialect >= cxx14
1721 /* DR 1658 specifies that vbases of abstract classes are
1722 ignored for both ctors and dtors. However, that breaks
1723 virtual dtor overriding when the ignored base has a
1724 throwing destructor. So, ignore that piece of 1658. A
1725 defect has been filed (no number yet). */
1726 && sfk != sfk_destructor)
1727 /* Vbase cdtors are not relevant. */;
1728 else
1729 {
1730 if (constexpr_p)
1731 *constexpr_p = false;
1732
1733 FOR_EACH_VEC_ELT (*vbases, i, base_binfo)
1734 synthesized_method_base_walk (binfo, base_binfo, quals,
1735 copy_arg_p, move_p, ctor_p,
1736 inheriting_ctor, inherited_parms,
1737 fnname, flags, diag,
1738 spec_p, trivial_p,
1739 deleted_p, constexpr_p);
1740 }
1741
1742 /* Now handle the non-static data members. */
1743 walk_field_subobs (TYPE_FIELDS (ctype), fnname, sfk, quals,
1744 copy_arg_p, move_p, assign_p, spec_p, trivial_p,
1745 deleted_p, constexpr_p,
1746 diag, flags, complain, /*dtor_from_ctor*/false);
1747 if (ctor_p)
1748 walk_field_subobs (TYPE_FIELDS (ctype), complete_dtor_identifier,
1749 sfk_destructor, TYPE_UNQUALIFIED, false,
1750 false, false, NULL, NULL,
1751 deleted_p, NULL,
1752 false, flags, complain, /*dtor_from_ctor*/true);
1753
1754 pop_scope (scope);
1755
1756 pop_deferring_access_checks ();
1757 --cp_unevaluated_operand;
1758 --c_inhibit_evaluation_warnings;
1759 }
1760
1761 /* DECL is a defaulted function whose exception specification is now
1762 needed. Return what it should be. */
1763
1764 tree
get_defaulted_eh_spec(tree decl,tsubst_flags_t complain)1765 get_defaulted_eh_spec (tree decl, tsubst_flags_t complain)
1766 {
1767 if (DECL_CLONED_FUNCTION_P (decl))
1768 decl = DECL_CLONED_FUNCTION (decl);
1769 special_function_kind sfk = special_function_p (decl);
1770 tree ctype = DECL_CONTEXT (decl);
1771 tree parms = FUNCTION_FIRST_USER_PARMTYPE (decl);
1772 tree parm_type = TREE_VALUE (parms);
1773 bool const_p = CP_TYPE_CONST_P (non_reference (parm_type));
1774 tree spec = empty_except_spec;
1775 bool diag = !DECL_DELETED_FN (decl) && (complain & tf_error);
1776 tree inh = DECL_INHERITED_CTOR (decl);
1777 synthesized_method_walk (ctype, sfk, const_p, &spec, NULL, NULL,
1778 NULL, diag, &inh, parms);
1779 return spec;
1780 }
1781
1782 /* DECL is a deleted function. If it's implicitly deleted, explain why and
1783 return true; else return false. */
1784
1785 bool
maybe_explain_implicit_delete(tree decl)1786 maybe_explain_implicit_delete (tree decl)
1787 {
1788 /* If decl is a clone, get the primary variant. */
1789 decl = DECL_ORIGIN (decl);
1790 gcc_assert (DECL_DELETED_FN (decl));
1791 if (DECL_DEFAULTED_FN (decl))
1792 {
1793 /* Not marked GTY; it doesn't need to be GC'd or written to PCH. */
1794 static hash_set<tree> *explained;
1795
1796 special_function_kind sfk;
1797 location_t loc;
1798 bool informed;
1799 tree ctype;
1800
1801 if (!explained)
1802 explained = new hash_set<tree>;
1803 if (explained->add (decl))
1804 return true;
1805
1806 sfk = special_function_p (decl);
1807 ctype = DECL_CONTEXT (decl);
1808 loc = input_location;
1809 input_location = DECL_SOURCE_LOCATION (decl);
1810
1811 informed = false;
1812 if (LAMBDA_TYPE_P (ctype))
1813 {
1814 informed = true;
1815 if (sfk == sfk_constructor)
1816 inform (DECL_SOURCE_LOCATION (decl),
1817 "a lambda closure type has a deleted default constructor");
1818 else if (sfk == sfk_copy_assignment)
1819 inform (DECL_SOURCE_LOCATION (decl),
1820 "a lambda closure type has a deleted copy assignment operator");
1821 else
1822 informed = false;
1823 }
1824 else if (DECL_ARTIFICIAL (decl)
1825 && (sfk == sfk_copy_assignment || sfk == sfk_copy_constructor)
1826 && classtype_has_move_assign_or_move_ctor_p (ctype, true))
1827 {
1828 inform (DECL_SOURCE_LOCATION (decl),
1829 "%q#D is implicitly declared as deleted because %qT "
1830 "declares a move constructor or move assignment operator",
1831 decl, ctype);
1832 informed = true;
1833 }
1834 else if (sfk == sfk_inheriting_constructor)
1835 {
1836 tree binfo = inherited_ctor_binfo (decl);
1837 if (TREE_CODE (binfo) != TREE_BINFO)
1838 {
1839 inform (DECL_SOURCE_LOCATION (decl),
1840 "%q#D inherits from multiple base subobjects",
1841 decl);
1842 informed = true;
1843 }
1844 }
1845 if (!informed)
1846 {
1847 tree parms = FUNCTION_FIRST_USER_PARMTYPE (decl);
1848 bool const_p = false;
1849 if (parms)
1850 {
1851 tree parm_type = TREE_VALUE (parms);
1852 const_p = CP_TYPE_CONST_P (non_reference (parm_type));
1853 }
1854 tree raises = NULL_TREE;
1855 bool deleted_p = false;
1856 tree scope = push_scope (ctype);
1857 tree inh = DECL_INHERITED_CTOR (decl);
1858
1859 synthesized_method_walk (ctype, sfk, const_p,
1860 &raises, NULL, &deleted_p, NULL, false,
1861 &inh, parms);
1862 if (deleted_p)
1863 {
1864 inform (DECL_SOURCE_LOCATION (decl),
1865 "%q#D is implicitly deleted because the default "
1866 "definition would be ill-formed:", decl);
1867 synthesized_method_walk (ctype, sfk, const_p,
1868 NULL, NULL, &deleted_p, NULL, true,
1869 &inh, parms);
1870 }
1871 else if (!comp_except_specs
1872 (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (decl)),
1873 raises, ce_normal))
1874 inform (DECL_SOURCE_LOCATION (decl), "%q#F is implicitly "
1875 "deleted because its exception-specification does not "
1876 "match the implicit exception-specification %qX",
1877 decl, raises);
1878 else if (flag_checking)
1879 gcc_unreachable ();
1880
1881 pop_scope (scope);
1882 }
1883
1884 input_location = loc;
1885 return true;
1886 }
1887 return false;
1888 }
1889
1890 /* DECL is a defaulted function which was declared constexpr. Explain why
1891 it can't be constexpr. */
1892
1893 void
explain_implicit_non_constexpr(tree decl)1894 explain_implicit_non_constexpr (tree decl)
1895 {
1896 tree parm_type = TREE_VALUE (FUNCTION_FIRST_USER_PARMTYPE (decl));
1897 bool const_p = CP_TYPE_CONST_P (non_reference (parm_type));
1898 tree inh = DECL_INHERITED_CTOR (decl);
1899 bool dummy;
1900 synthesized_method_walk (DECL_CLASS_CONTEXT (decl),
1901 special_function_p (decl), const_p,
1902 NULL, NULL, NULL, &dummy, true,
1903 &inh,
1904 FUNCTION_FIRST_USER_PARMTYPE (decl));
1905 }
1906
1907 /* DECL is an instantiation of an inheriting constructor template. Deduce
1908 the correct exception-specification and deletedness for this particular
1909 specialization. */
1910
1911 void
deduce_inheriting_ctor(tree decl)1912 deduce_inheriting_ctor (tree decl)
1913 {
1914 decl = DECL_ORIGIN (decl);
1915 gcc_assert (DECL_INHERITED_CTOR (decl));
1916 tree spec;
1917 bool trivial, constexpr_, deleted;
1918 tree inh = DECL_INHERITED_CTOR (decl);
1919 synthesized_method_walk (DECL_CONTEXT (decl), sfk_inheriting_constructor,
1920 false, &spec, &trivial, &deleted, &constexpr_,
1921 /*diag*/false,
1922 &inh,
1923 FUNCTION_FIRST_USER_PARMTYPE (decl));
1924 if (TREE_CODE (inherited_ctor_binfo (decl)) != TREE_BINFO)
1925 /* Inherited the same constructor from different base subobjects. */
1926 deleted = true;
1927 DECL_DELETED_FN (decl) = deleted;
1928 TREE_TYPE (decl) = build_exception_variant (TREE_TYPE (decl), spec);
1929 SET_DECL_INHERITED_CTOR (decl, inh);
1930
1931 tree clone;
1932 FOR_EACH_CLONE (clone, decl)
1933 {
1934 DECL_DELETED_FN (clone) = deleted;
1935 TREE_TYPE (clone) = build_exception_variant (TREE_TYPE (clone), spec);
1936 SET_DECL_INHERITED_CTOR (clone, inh);
1937 }
1938 }
1939
1940 /* Implicitly declare the special function indicated by KIND, as a
1941 member of TYPE. For copy constructors and assignment operators,
1942 CONST_P indicates whether these functions should take a const
1943 reference argument or a non-const reference. Returns the
1944 FUNCTION_DECL for the implicitly declared function. */
1945
1946 tree
implicitly_declare_fn(special_function_kind kind,tree type,bool const_p,tree inherited_ctor,tree inherited_parms)1947 implicitly_declare_fn (special_function_kind kind, tree type,
1948 bool const_p, tree inherited_ctor,
1949 tree inherited_parms)
1950 {
1951 tree fn;
1952 tree parameter_types = void_list_node;
1953 tree return_type;
1954 tree fn_type;
1955 tree raises = empty_except_spec;
1956 tree rhs_parm_type = NULL_TREE;
1957 tree this_parm;
1958 tree name;
1959 HOST_WIDE_INT saved_processing_template_decl;
1960 bool deleted_p;
1961 bool constexpr_p;
1962
1963 /* Because we create declarations for implicitly declared functions
1964 lazily, we may be creating the declaration for a member of TYPE
1965 while in some completely different context. However, TYPE will
1966 never be a dependent class (because we never want to do lookups
1967 for implicitly defined functions in a dependent class).
1968 Furthermore, we must set PROCESSING_TEMPLATE_DECL to zero here
1969 because we only create clones for constructors and destructors
1970 when not in a template. */
1971 gcc_assert (!dependent_type_p (type));
1972 saved_processing_template_decl = processing_template_decl;
1973 processing_template_decl = 0;
1974
1975 type = TYPE_MAIN_VARIANT (type);
1976
1977 if (targetm.cxx.cdtor_returns_this ())
1978 {
1979 if (kind == sfk_destructor)
1980 /* See comment in check_special_function_return_type. */
1981 return_type = build_pointer_type (void_type_node);
1982 else
1983 return_type = build_pointer_type (type);
1984 }
1985 else
1986 return_type = void_type_node;
1987
1988 switch (kind)
1989 {
1990 case sfk_destructor:
1991 /* Destructor. */
1992 name = dtor_identifier;
1993 break;
1994
1995 case sfk_constructor:
1996 /* Default constructor. */
1997 name = ctor_identifier;
1998 break;
1999
2000 case sfk_copy_constructor:
2001 case sfk_copy_assignment:
2002 case sfk_move_constructor:
2003 case sfk_move_assignment:
2004 case sfk_inheriting_constructor:
2005 {
2006 if (kind == sfk_copy_assignment
2007 || kind == sfk_move_assignment)
2008 {
2009 return_type = build_reference_type (type);
2010 name = assign_op_identifier;
2011 }
2012 else
2013 name = ctor_identifier;
2014
2015 if (kind == sfk_inheriting_constructor)
2016 parameter_types = inherited_parms;
2017 else
2018 {
2019 if (const_p)
2020 rhs_parm_type = cp_build_qualified_type (type, TYPE_QUAL_CONST);
2021 else
2022 rhs_parm_type = type;
2023 bool move_p = (kind == sfk_move_assignment
2024 || kind == sfk_move_constructor);
2025 rhs_parm_type = cp_build_reference_type (rhs_parm_type, move_p);
2026
2027 parameter_types = tree_cons (NULL_TREE, rhs_parm_type, parameter_types);
2028 }
2029 break;
2030 }
2031 default:
2032 gcc_unreachable ();
2033 }
2034
2035 bool trivial_p = false;
2036
2037 if (inherited_ctor)
2038 {
2039 /* For an inheriting constructor, just copy these flags from the
2040 inherited constructor until deduce_inheriting_ctor. */
2041 raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (inherited_ctor));
2042 deleted_p = DECL_DELETED_FN (inherited_ctor);
2043 constexpr_p = DECL_DECLARED_CONSTEXPR_P (inherited_ctor);
2044 }
2045 else if (cxx_dialect >= cxx11)
2046 {
2047 raises = noexcept_deferred_spec;
2048 synthesized_method_walk (type, kind, const_p, NULL, &trivial_p,
2049 &deleted_p, &constexpr_p, false,
2050 &inherited_ctor, inherited_parms);
2051 }
2052 else
2053 synthesized_method_walk (type, kind, const_p, &raises, &trivial_p,
2054 &deleted_p, &constexpr_p, false,
2055 &inherited_ctor, inherited_parms);
2056 /* Don't bother marking a deleted constructor as constexpr. */
2057 if (deleted_p)
2058 constexpr_p = false;
2059 /* A trivial copy/move constructor is also a constexpr constructor,
2060 unless the class has virtual bases (7.1.5p4). */
2061 else if (trivial_p && cxx_dialect >= cxx11
2062 && (kind == sfk_copy_constructor
2063 || kind == sfk_move_constructor)
2064 && !CLASSTYPE_VBASECLASSES (type))
2065 gcc_assert (constexpr_p);
2066
2067 if (!trivial_p && type_has_trivial_fn (type, kind))
2068 type_set_nontrivial_flag (type, kind);
2069
2070 /* Create the function. */
2071 fn_type = build_method_type_directly (type, return_type, parameter_types);
2072 if (raises)
2073 fn_type = build_exception_variant (fn_type, raises);
2074 fn = build_lang_decl (FUNCTION_DECL, name, fn_type);
2075 if (kind != sfk_inheriting_constructor)
2076 DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (TYPE_NAME (type));
2077
2078 if (!IDENTIFIER_CDTOR_P (name))
2079 /* Assignment operator. */
2080 DECL_OVERLOADED_OPERATOR_CODE_RAW (fn) = OVL_OP_NOP_EXPR;
2081 else if (IDENTIFIER_CTOR_P (name))
2082 DECL_CXX_CONSTRUCTOR_P (fn) = true;
2083 else
2084 DECL_CXX_DESTRUCTOR_P (fn) = true;
2085
2086 SET_DECL_ALIGN (fn, MINIMUM_METHOD_BOUNDARY);
2087
2088 /* Create the explicit arguments. */
2089 if (rhs_parm_type)
2090 {
2091 /* Note that this parameter is *not* marked DECL_ARTIFICIAL; we
2092 want its type to be included in the mangled function
2093 name. */
2094 tree decl = cp_build_parm_decl (fn, NULL_TREE, rhs_parm_type);
2095 TREE_READONLY (decl) = 1;
2096 retrofit_lang_decl (decl);
2097 DECL_PARM_INDEX (decl) = DECL_PARM_LEVEL (decl) = 1;
2098 DECL_ARGUMENTS (fn) = decl;
2099 }
2100 else if (kind == sfk_inheriting_constructor)
2101 {
2102 tree *p = &DECL_ARGUMENTS (fn);
2103 int index = 1;
2104 for (tree parm = inherited_parms; parm && parm != void_list_node;
2105 parm = TREE_CHAIN (parm))
2106 {
2107 *p = cp_build_parm_decl (fn, NULL_TREE, TREE_VALUE (parm));
2108 retrofit_lang_decl (*p);
2109 DECL_PARM_LEVEL (*p) = 1;
2110 DECL_PARM_INDEX (*p) = index++;
2111 p = &DECL_CHAIN (*p);
2112 }
2113 SET_DECL_INHERITED_CTOR (fn, inherited_ctor);
2114 DECL_NONCONVERTING_P (fn) = DECL_NONCONVERTING_P (inherited_ctor);
2115 /* A constructor so declared has the same access as the corresponding
2116 constructor in X. */
2117 TREE_PRIVATE (fn) = TREE_PRIVATE (inherited_ctor);
2118 TREE_PROTECTED (fn) = TREE_PROTECTED (inherited_ctor);
2119 /* Copy constexpr from the inherited constructor even if the
2120 inheriting constructor doesn't satisfy the requirements. */
2121 constexpr_p = DECL_DECLARED_CONSTEXPR_P (inherited_ctor);
2122 }
2123 /* Add the "this" parameter. */
2124 this_parm = build_this_parm (fn, fn_type, TYPE_UNQUALIFIED);
2125 DECL_CHAIN (this_parm) = DECL_ARGUMENTS (fn);
2126 DECL_ARGUMENTS (fn) = this_parm;
2127
2128 grokclassfn (type, fn, kind == sfk_destructor ? DTOR_FLAG : NO_SPECIAL);
2129 DECL_IN_AGGR_P (fn) = 1;
2130 DECL_ARTIFICIAL (fn) = 1;
2131 DECL_DEFAULTED_FN (fn) = 1;
2132 if (cxx_dialect >= cxx11)
2133 {
2134 DECL_DELETED_FN (fn) = deleted_p;
2135 DECL_DECLARED_CONSTEXPR_P (fn) = constexpr_p;
2136 }
2137 DECL_EXTERNAL (fn) = true;
2138 DECL_NOT_REALLY_EXTERN (fn) = 1;
2139 DECL_DECLARED_INLINE_P (fn) = 1;
2140 set_linkage_according_to_type (type, fn);
2141 if (TREE_PUBLIC (fn))
2142 DECL_COMDAT (fn) = 1;
2143 rest_of_decl_compilation (fn, namespace_bindings_p (), at_eof);
2144 gcc_assert (!TREE_USED (fn));
2145
2146 /* Propagate constraints from the inherited constructor. */
2147 if (flag_concepts && inherited_ctor)
2148 if (tree orig_ci = get_constraints (inherited_ctor))
2149 {
2150 tree new_ci = copy_node (orig_ci);
2151 set_constraints (fn, new_ci);
2152 }
2153
2154 /* Restore PROCESSING_TEMPLATE_DECL. */
2155 processing_template_decl = saved_processing_template_decl;
2156
2157 if (inherited_ctor && TREE_CODE (inherited_ctor) == TEMPLATE_DECL)
2158 fn = add_inherited_template_parms (fn, inherited_ctor);
2159
2160 /* Warn about calling a non-trivial move assignment in a virtual base. */
2161 if (kind == sfk_move_assignment && !deleted_p && !trivial_p
2162 && CLASSTYPE_VBASECLASSES (type))
2163 {
2164 location_t loc = input_location;
2165 input_location = DECL_SOURCE_LOCATION (fn);
2166 synthesized_method_walk (type, kind, const_p,
2167 NULL, NULL, NULL, NULL, true,
2168 NULL, NULL_TREE);
2169 input_location = loc;
2170 }
2171
2172 return fn;
2173 }
2174
2175 /* Gives any errors about defaulted functions which need to be deferred
2176 until the containing class is complete. */
2177
2178 void
defaulted_late_check(tree fn)2179 defaulted_late_check (tree fn)
2180 {
2181 /* Complain about invalid signature for defaulted fn. */
2182 tree ctx = DECL_CONTEXT (fn);
2183 special_function_kind kind = special_function_p (fn);
2184 bool fn_const_p = (copy_fn_p (fn) == 2);
2185 tree implicit_fn = implicitly_declare_fn (kind, ctx, fn_const_p,
2186 NULL, NULL);
2187 tree eh_spec = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (implicit_fn));
2188
2189 if (!same_type_p (TREE_TYPE (TREE_TYPE (fn)),
2190 TREE_TYPE (TREE_TYPE (implicit_fn)))
2191 || !compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)),
2192 TYPE_ARG_TYPES (TREE_TYPE (implicit_fn))))
2193 {
2194 error ("defaulted declaration %q+D does not match the "
2195 "expected signature", fn);
2196 inform (DECL_SOURCE_LOCATION (fn),
2197 "expected signature: %qD", implicit_fn);
2198 }
2199
2200 if (DECL_DELETED_FN (implicit_fn))
2201 {
2202 DECL_DELETED_FN (fn) = 1;
2203 return;
2204 }
2205
2206 /* 8.4.2/2: An explicitly-defaulted function (...) may have an explicit
2207 exception-specification only if it is compatible (15.4) with the
2208 exception-specification on the implicit declaration. If a function
2209 is explicitly defaulted on its first declaration, (...) it is
2210 implicitly considered to have the same exception-specification as if
2211 it had been implicitly declared. */
2212 maybe_instantiate_noexcept (fn);
2213 tree fn_spec = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
2214 if (!fn_spec)
2215 {
2216 if (DECL_DEFAULTED_IN_CLASS_P (fn))
2217 TREE_TYPE (fn) = build_exception_variant (TREE_TYPE (fn), eh_spec);
2218 }
2219 else if (UNEVALUATED_NOEXCEPT_SPEC_P (fn_spec))
2220 /* Equivalent to the implicit spec. */;
2221 else if (DECL_DEFAULTED_IN_CLASS_P (fn)
2222 && !CLASSTYPE_TEMPLATE_INSTANTIATION (ctx))
2223 /* We can't compare an explicit exception-specification on a
2224 constructor defaulted in the class body to the implicit
2225 exception-specification until after we've parsed any NSDMI; see
2226 after_nsdmi_defaulted_late_checks. */;
2227 else
2228 {
2229 tree eh_spec = get_defaulted_eh_spec (fn);
2230 if (!comp_except_specs (fn_spec, eh_spec, ce_normal))
2231 {
2232 if (DECL_DEFAULTED_IN_CLASS_P (fn))
2233 DECL_DELETED_FN (fn) = true;
2234 else
2235 error ("function %q+D defaulted on its redeclaration "
2236 "with an exception-specification that differs from "
2237 "the implicit exception-specification %qX", fn, eh_spec);
2238 }
2239 }
2240
2241 if (DECL_DEFAULTED_IN_CLASS_P (fn)
2242 && DECL_DECLARED_CONSTEXPR_P (implicit_fn))
2243 {
2244 /* Hmm...should we do this for out-of-class too? Should it be OK to
2245 add constexpr later like inline, rather than requiring
2246 declarations to match? */
2247 DECL_DECLARED_CONSTEXPR_P (fn) = true;
2248 if (kind == sfk_constructor)
2249 TYPE_HAS_CONSTEXPR_CTOR (ctx) = true;
2250 }
2251
2252 if (!DECL_DECLARED_CONSTEXPR_P (implicit_fn)
2253 && DECL_DECLARED_CONSTEXPR_P (fn))
2254 {
2255 if (!CLASSTYPE_TEMPLATE_INSTANTIATION (ctx))
2256 {
2257 error ("explicitly defaulted function %q+D cannot be declared "
2258 "as %<constexpr%> because the implicit declaration is not "
2259 "%<constexpr%>:", fn);
2260 explain_implicit_non_constexpr (fn);
2261 }
2262 DECL_DECLARED_CONSTEXPR_P (fn) = false;
2263 }
2264 }
2265
2266 /* OK, we've parsed the NSDMI for class T, now we can check any explicit
2267 exception-specifications on functions defaulted in the class body. */
2268
2269 void
after_nsdmi_defaulted_late_checks(tree t)2270 after_nsdmi_defaulted_late_checks (tree t)
2271 {
2272 if (uses_template_parms (t))
2273 return;
2274 if (t == error_mark_node)
2275 return;
2276 for (tree fn = TYPE_FIELDS (t); fn; fn = DECL_CHAIN (fn))
2277 if (!DECL_ARTIFICIAL (fn)
2278 && DECL_DECLARES_FUNCTION_P (fn)
2279 && DECL_DEFAULTED_IN_CLASS_P (fn))
2280 {
2281 tree fn_spec = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
2282 if (UNEVALUATED_NOEXCEPT_SPEC_P (fn_spec))
2283 continue;
2284
2285 tree eh_spec = get_defaulted_eh_spec (fn);
2286 if (!comp_except_specs (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)),
2287 eh_spec, ce_normal))
2288 DECL_DELETED_FN (fn) = true;
2289 }
2290 }
2291
2292 /* Returns true iff FN can be explicitly defaulted, and gives any
2293 errors if defaulting FN is ill-formed. */
2294
2295 bool
defaultable_fn_check(tree fn)2296 defaultable_fn_check (tree fn)
2297 {
2298 special_function_kind kind = sfk_none;
2299
2300 if (template_parm_scope_p ())
2301 {
2302 error ("a template cannot be defaulted");
2303 return false;
2304 }
2305
2306 if (DECL_CONSTRUCTOR_P (fn))
2307 {
2308 if (FUNCTION_FIRST_USER_PARMTYPE (fn) == void_list_node)
2309 kind = sfk_constructor;
2310 else if (copy_fn_p (fn) > 0
2311 && (TREE_CHAIN (FUNCTION_FIRST_USER_PARMTYPE (fn))
2312 == void_list_node))
2313 kind = sfk_copy_constructor;
2314 else if (move_fn_p (fn))
2315 kind = sfk_move_constructor;
2316 }
2317 else if (DECL_DESTRUCTOR_P (fn))
2318 kind = sfk_destructor;
2319 else if (DECL_ASSIGNMENT_OPERATOR_P (fn)
2320 && DECL_OVERLOADED_OPERATOR_IS (fn, NOP_EXPR))
2321 {
2322 if (copy_fn_p (fn))
2323 kind = sfk_copy_assignment;
2324 else if (move_fn_p (fn))
2325 kind = sfk_move_assignment;
2326 }
2327
2328 if (kind == sfk_none)
2329 {
2330 error ("%qD cannot be defaulted", fn);
2331 return false;
2332 }
2333 else
2334 {
2335 for (tree t = FUNCTION_FIRST_USER_PARMTYPE (fn);
2336 t && t != void_list_node; t = TREE_CHAIN (t))
2337 if (TREE_PURPOSE (t))
2338 {
2339 error ("defaulted function %q+D with default argument", fn);
2340 break;
2341 }
2342
2343 /* Avoid do_warn_unused_parameter warnings. */
2344 for (tree p = FUNCTION_FIRST_USER_PARM (fn); p; p = DECL_CHAIN (p))
2345 if (DECL_NAME (p))
2346 TREE_NO_WARNING (p) = 1;
2347
2348 if (TYPE_BEING_DEFINED (DECL_CONTEXT (fn)))
2349 /* Defer checking. */;
2350 else if (!processing_template_decl)
2351 defaulted_late_check (fn);
2352
2353 return true;
2354 }
2355 }
2356
2357 /* Add an implicit declaration to TYPE for the kind of function
2358 indicated by SFK. Return the FUNCTION_DECL for the new implicit
2359 declaration. */
2360
2361 tree
lazily_declare_fn(special_function_kind sfk,tree type)2362 lazily_declare_fn (special_function_kind sfk, tree type)
2363 {
2364 tree fn;
2365 /* Whether or not the argument has a const reference type. */
2366 bool const_p = false;
2367
2368 type = TYPE_MAIN_VARIANT (type);
2369
2370 switch (sfk)
2371 {
2372 case sfk_constructor:
2373 CLASSTYPE_LAZY_DEFAULT_CTOR (type) = 0;
2374 break;
2375 case sfk_copy_constructor:
2376 const_p = TYPE_HAS_CONST_COPY_CTOR (type);
2377 CLASSTYPE_LAZY_COPY_CTOR (type) = 0;
2378 break;
2379 case sfk_move_constructor:
2380 CLASSTYPE_LAZY_MOVE_CTOR (type) = 0;
2381 break;
2382 case sfk_copy_assignment:
2383 const_p = TYPE_HAS_CONST_COPY_ASSIGN (type);
2384 CLASSTYPE_LAZY_COPY_ASSIGN (type) = 0;
2385 break;
2386 case sfk_move_assignment:
2387 CLASSTYPE_LAZY_MOVE_ASSIGN (type) = 0;
2388 break;
2389 case sfk_destructor:
2390 CLASSTYPE_LAZY_DESTRUCTOR (type) = 0;
2391 break;
2392 default:
2393 gcc_unreachable ();
2394 }
2395
2396 /* Declare the function. */
2397 fn = implicitly_declare_fn (sfk, type, const_p, NULL, NULL);
2398
2399 /* [class.copy]/8 If the class definition declares a move constructor or
2400 move assignment operator, the implicitly declared copy constructor is
2401 defined as deleted.... */
2402 if ((sfk == sfk_copy_assignment || sfk == sfk_copy_constructor)
2403 && classtype_has_move_assign_or_move_ctor_p (type, true))
2404 DECL_DELETED_FN (fn) = true;
2405
2406 /* Destructors and assignment operators may be virtual. */
2407 if (sfk == sfk_destructor
2408 || sfk == sfk_move_assignment
2409 || sfk == sfk_copy_assignment)
2410 check_for_override (fn, type);
2411
2412 /* Add it to the class */
2413 bool added = add_method (type, fn, false);
2414 gcc_assert (added || errorcount);
2415
2416 /* Add it to TYPE_FIELDS. */
2417 if (sfk == sfk_destructor
2418 && DECL_VIRTUAL_P (fn))
2419 /* The ABI requires that a virtual destructor go at the end of the
2420 vtable. */
2421 TYPE_FIELDS (type) = chainon (TYPE_FIELDS (type), fn);
2422 else
2423 {
2424 DECL_CHAIN (fn) = TYPE_FIELDS (type);
2425 TYPE_FIELDS (type) = fn;
2426 }
2427 /* Propagate TYPE_FIELDS. */
2428 fixup_type_variants (type);
2429
2430 maybe_add_class_template_decl_list (type, fn, /*friend_p=*/0);
2431 if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn)
2432 || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn))
2433 /* Create appropriate clones. */
2434 clone_function_decl (fn, /*update_methods=*/true);
2435
2436 return fn;
2437 }
2438
2439 /* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
2440 as there are artificial parms in FN. */
2441
2442 tree
skip_artificial_parms_for(const_tree fn,tree list)2443 skip_artificial_parms_for (const_tree fn, tree list)
2444 {
2445 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
2446 list = TREE_CHAIN (list);
2447 else
2448 return list;
2449
2450 if (DECL_HAS_IN_CHARGE_PARM_P (fn))
2451 list = TREE_CHAIN (list);
2452 if (DECL_HAS_VTT_PARM_P (fn))
2453 list = TREE_CHAIN (list);
2454 return list;
2455 }
2456
2457 /* Given a FUNCTION_DECL FN and a chain LIST, return the number of
2458 artificial parms in FN. */
2459
2460 int
num_artificial_parms_for(const_tree fn)2461 num_artificial_parms_for (const_tree fn)
2462 {
2463 int count = 0;
2464
2465 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
2466 count++;
2467 else
2468 return 0;
2469
2470 if (DECL_HAS_IN_CHARGE_PARM_P (fn))
2471 count++;
2472 if (DECL_HAS_VTT_PARM_P (fn))
2473 count++;
2474 return count;
2475 }
2476
2477
2478 #include "gt-cp-method.h"
2479