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