Import gcc-4.7.2 to new vendor branch
[dragonfly.git] / contrib / gcc-4.7 / gcc / cp / method.c
1 /* Handle the hair of processing (but not expanding) inline functions.
2    Also manage function and variable name overloading.
3    Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
5    Free Software Foundation, Inc.
6    Contributed by Michael Tiemann (tiemann@cygnus.com)
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3, or (at your option)
13 any later version.
14
15 GCC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3.  If not see
22 <http://www.gnu.org/licenses/>.  */
23
24
25 /* Handle method declarations.  */
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tm.h"
30 #include "tree.h"
31 #include "cp-tree.h"
32 #include "output.h"
33 #include "flags.h"
34 #include "toplev.h"
35 #include "tm_p.h"
36 #include "target.h"
37 #include "common/common-target.h"
38 #include "tree-pass.h"
39 #include "diagnostic.h"
40 #include "cgraph.h"
41 #include "gimple.h"
42
43 /* Various flags to control the mangling process.  */
44
45 enum mangling_flags
46 {
47   /* No flags.  */
48   mf_none = 0,
49   /* The thing we are presently mangling is part of a template type,
50      rather than a fully instantiated type.  Therefore, we may see
51      complex expressions where we would normally expect to see a
52      simple integer constant.  */
53   mf_maybe_uninstantiated = 1,
54   /* When mangling a numeric value, use the form `_XX_' (instead of
55      just `XX') if the value has more than one digit.  */
56   mf_use_underscores_around_value = 2
57 };
58
59 typedef enum mangling_flags mangling_flags;
60
61 static void do_build_copy_assign (tree);
62 static void do_build_copy_constructor (tree);
63 static tree make_alias_for_thunk (tree);
64
65 /* Called once to initialize method.c.  */
66
67 void
68 init_method (void)
69 {
70   init_mangle ();
71 }
72 \f
73 /* Return a this or result adjusting thunk to FUNCTION.  THIS_ADJUSTING
74    indicates whether it is a this or result adjusting thunk.
75    FIXED_OFFSET and VIRTUAL_OFFSET indicate how to do the adjustment
76    (see thunk_adjust).  VIRTUAL_OFFSET can be NULL, but FIXED_OFFSET
77    never is.  VIRTUAL_OFFSET is the /index/ into the vtable for this
78    adjusting thunks, we scale it to a byte offset. For covariant
79    thunks VIRTUAL_OFFSET is the virtual binfo.  You must post process
80    the returned thunk with finish_thunk.  */
81
82 tree
83 make_thunk (tree function, bool this_adjusting,
84             tree fixed_offset, tree virtual_offset)
85 {
86   HOST_WIDE_INT d;
87   tree thunk;
88
89   gcc_assert (TREE_CODE (function) == FUNCTION_DECL);
90   /* We can have this thunks to covariant thunks, but not vice versa.  */
91   gcc_assert (!DECL_THIS_THUNK_P (function));
92   gcc_assert (!DECL_RESULT_THUNK_P (function) || this_adjusting);
93
94   /* Scale the VIRTUAL_OFFSET to be in terms of bytes.  */
95   if (this_adjusting && virtual_offset)
96     virtual_offset
97       = size_binop (MULT_EXPR,
98                     virtual_offset,
99                     convert (ssizetype,
100                              TYPE_SIZE_UNIT (vtable_entry_type)));
101
102   d = tree_low_cst (fixed_offset, 0);
103
104   /* See if we already have the thunk in question.  For this_adjusting
105      thunks VIRTUAL_OFFSET will be an INTEGER_CST, for covariant thunks it
106      will be a BINFO.  */
107   for (thunk = DECL_THUNKS (function); thunk; thunk = DECL_CHAIN (thunk))
108     if (DECL_THIS_THUNK_P (thunk) == this_adjusting
109         && THUNK_FIXED_OFFSET (thunk) == d
110         && !virtual_offset == !THUNK_VIRTUAL_OFFSET (thunk)
111         && (!virtual_offset
112             || (this_adjusting
113                 ? tree_int_cst_equal (THUNK_VIRTUAL_OFFSET (thunk),
114                                       virtual_offset)
115                 : THUNK_VIRTUAL_OFFSET (thunk) == virtual_offset)))
116       return thunk;
117
118   /* All thunks must be created before FUNCTION is actually emitted;
119      the ABI requires that all thunks be emitted together with the
120      function to which they transfer control.  */
121   gcc_assert (!TREE_ASM_WRITTEN (function));
122   /* Likewise, we can only be adding thunks to a function declared in
123      the class currently being laid out.  */
124   gcc_assert (TYPE_SIZE (DECL_CONTEXT (function))
125               && TYPE_BEING_DEFINED (DECL_CONTEXT (function)));
126
127   thunk = build_decl (DECL_SOURCE_LOCATION (function),
128                       FUNCTION_DECL, NULL_TREE, TREE_TYPE (function));
129   DECL_LANG_SPECIFIC (thunk) = DECL_LANG_SPECIFIC (function);
130   cxx_dup_lang_specific_decl (thunk);
131   DECL_THUNKS (thunk) = NULL_TREE;
132
133   DECL_CONTEXT (thunk) = DECL_CONTEXT (function);
134   TREE_READONLY (thunk) = TREE_READONLY (function);
135   TREE_THIS_VOLATILE (thunk) = TREE_THIS_VOLATILE (function);
136   TREE_PUBLIC (thunk) = TREE_PUBLIC (function);
137   SET_DECL_THUNK_P (thunk, this_adjusting);
138   THUNK_TARGET (thunk) = function;
139   THUNK_FIXED_OFFSET (thunk) = d;
140   THUNK_VIRTUAL_OFFSET (thunk) = virtual_offset;
141   THUNK_ALIAS (thunk) = NULL_TREE;
142
143   DECL_INTERFACE_KNOWN (thunk) = 1;
144   DECL_NOT_REALLY_EXTERN (thunk) = 1;
145   DECL_COMDAT (thunk) = DECL_COMDAT (function);
146   DECL_SAVED_FUNCTION_DATA (thunk) = NULL;
147   /* The thunk itself is not a constructor or destructor, even if
148      the thing it is thunking to is.  */
149   DECL_DESTRUCTOR_P (thunk) = 0;
150   DECL_CONSTRUCTOR_P (thunk) = 0;
151   DECL_EXTERNAL (thunk) = 1;
152   DECL_ARTIFICIAL (thunk) = 1;
153   /* The THUNK is not a pending inline, even if the FUNCTION is.  */
154   DECL_PENDING_INLINE_P (thunk) = 0;
155   DECL_DECLARED_INLINE_P (thunk) = 0;
156   /* Nor is it a template instantiation.  */
157   DECL_USE_TEMPLATE (thunk) = 0;
158   DECL_TEMPLATE_INFO (thunk) = NULL;
159
160   /* Add it to the list of thunks associated with FUNCTION.  */
161   DECL_CHAIN (thunk) = DECL_THUNKS (function);
162   DECL_THUNKS (function) = thunk;
163
164   return thunk;
165 }
166
167 /* Finish THUNK, a thunk decl.  */
168
169 void
170 finish_thunk (tree thunk)
171 {
172   tree function, name;
173   tree fixed_offset = ssize_int (THUNK_FIXED_OFFSET (thunk));
174   tree virtual_offset = THUNK_VIRTUAL_OFFSET (thunk);
175
176   gcc_assert (!DECL_NAME (thunk) && DECL_THUNK_P (thunk));
177   if (virtual_offset && DECL_RESULT_THUNK_P (thunk))
178     virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
179   function = THUNK_TARGET (thunk);
180   name = mangle_thunk (function, DECL_THIS_THUNK_P (thunk),
181                        fixed_offset, virtual_offset);
182
183   /* We can end up with declarations of (logically) different
184      covariant thunks, that do identical adjustments.  The two thunks
185      will be adjusting between within different hierarchies, which
186      happen to have the same layout.  We must nullify one of them to
187      refer to the other.  */
188   if (DECL_RESULT_THUNK_P (thunk))
189     {
190       tree cov_probe;
191
192       for (cov_probe = DECL_THUNKS (function);
193            cov_probe; cov_probe = DECL_CHAIN (cov_probe))
194         if (DECL_NAME (cov_probe) == name)
195           {
196             gcc_assert (!DECL_THUNKS (thunk));
197             THUNK_ALIAS (thunk) = (THUNK_ALIAS (cov_probe)
198                                    ? THUNK_ALIAS (cov_probe) : cov_probe);
199             break;
200           }
201     }
202
203   DECL_NAME (thunk) = name;
204   SET_DECL_ASSEMBLER_NAME (thunk, name);
205 }
206
207 static GTY (()) int thunk_labelno;
208
209 /* Create a static alias to target.  */
210
211 tree
212 make_alias_for (tree target, tree newid)
213 {
214   tree alias = build_decl (DECL_SOURCE_LOCATION (target),
215                            TREE_CODE (target), newid, TREE_TYPE (target));
216   DECL_LANG_SPECIFIC (alias) = DECL_LANG_SPECIFIC (target);
217   cxx_dup_lang_specific_decl (alias);
218   DECL_CONTEXT (alias) = NULL;
219   TREE_READONLY (alias) = TREE_READONLY (target);
220   TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (target);
221   TREE_PUBLIC (alias) = 0;
222   DECL_INTERFACE_KNOWN (alias) = 1;
223   if (DECL_LANG_SPECIFIC (alias))
224     {
225       DECL_NOT_REALLY_EXTERN (alias) = 1;
226       DECL_USE_TEMPLATE (alias) = 0;
227       DECL_TEMPLATE_INFO (alias) = NULL;
228     }
229   DECL_EXTERNAL (alias) = 0;
230   DECL_ARTIFICIAL (alias) = 1;
231   DECL_TEMPLATE_INSTANTIATED (alias) = 0;
232   if (TREE_CODE (alias) == FUNCTION_DECL)
233     {
234       DECL_SAVED_FUNCTION_DATA (alias) = NULL;
235       DECL_DESTRUCTOR_P (alias) = 0;
236       DECL_CONSTRUCTOR_P (alias) = 0;
237       DECL_PENDING_INLINE_P (alias) = 0;
238       DECL_DECLARED_INLINE_P (alias) = 0;
239       DECL_INITIAL (alias) = error_mark_node;
240       DECL_ARGUMENTS (alias) = copy_list (DECL_ARGUMENTS (target));
241     }
242   else
243     TREE_STATIC (alias) = 1;
244   TREE_ADDRESSABLE (alias) = 1;
245   TREE_USED (alias) = 1;
246   SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
247   TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
248   return alias;
249 }
250
251 static tree
252 make_alias_for_thunk (tree function)
253 {
254   tree alias;
255   char buf[256];
256
257   targetm.asm_out.generate_internal_label (buf, "LTHUNK", thunk_labelno);
258   thunk_labelno++;
259
260   alias = make_alias_for (function, get_identifier (buf));
261
262   if (!flag_syntax_only)
263     {
264       struct cgraph_node *funcn, *aliasn;
265       funcn = cgraph_get_node (function);
266       gcc_checking_assert (funcn);
267       aliasn = cgraph_same_body_alias (funcn, alias, function);
268       DECL_ASSEMBLER_NAME (function);
269       gcc_assert (aliasn != NULL);
270     }
271
272   return alias;
273 }
274
275 /* Emit the definition of a C++ multiple inheritance or covariant
276    return vtable thunk.  If EMIT_P is nonzero, the thunk is emitted
277    immediately.  */
278
279 void
280 use_thunk (tree thunk_fndecl, bool emit_p)
281 {
282   tree a, t, function, alias;
283   tree virtual_offset;
284   HOST_WIDE_INT fixed_offset, virtual_value;
285   bool this_adjusting = DECL_THIS_THUNK_P (thunk_fndecl);
286   struct cgraph_node *funcn, *thunk_node;
287
288   /* We should have called finish_thunk to give it a name.  */
289   gcc_assert (DECL_NAME (thunk_fndecl));
290
291   /* We should never be using an alias, always refer to the
292      aliased thunk.  */
293   gcc_assert (!THUNK_ALIAS (thunk_fndecl));
294
295   if (TREE_ASM_WRITTEN (thunk_fndecl))
296     return;
297
298   function = THUNK_TARGET (thunk_fndecl);
299   if (DECL_RESULT (thunk_fndecl))
300     /* We already turned this thunk into an ordinary function.
301        There's no need to process this thunk again.  */
302     return;
303
304   if (DECL_THUNK_P (function))
305     /* The target is itself a thunk, process it now.  */
306     use_thunk (function, emit_p);
307
308   /* Thunks are always addressable; they only appear in vtables.  */
309   TREE_ADDRESSABLE (thunk_fndecl) = 1;
310
311   /* Figure out what function is being thunked to.  It's referenced in
312      this translation unit.  */
313   TREE_ADDRESSABLE (function) = 1;
314   mark_used (function);
315   if (!emit_p)
316     return;
317
318   if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function))
319    alias = make_alias_for_thunk (function);
320   else
321    alias = function;
322
323   fixed_offset = THUNK_FIXED_OFFSET (thunk_fndecl);
324   virtual_offset = THUNK_VIRTUAL_OFFSET (thunk_fndecl);
325
326   if (virtual_offset)
327     {
328       if (!this_adjusting)
329         virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
330       virtual_value = tree_low_cst (virtual_offset, /*pos=*/0);
331       gcc_assert (virtual_value);
332     }
333   else
334     virtual_value = 0;
335
336   /* And, if we need to emit the thunk, it's used.  */
337   mark_used (thunk_fndecl);
338   /* This thunk is actually defined.  */
339   DECL_EXTERNAL (thunk_fndecl) = 0;
340   /* The linkage of the function may have changed.  FIXME in linkage
341      rewrite.  */
342   gcc_assert (DECL_INTERFACE_KNOWN (function));
343   TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function);
344   DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
345   DECL_VISIBILITY_SPECIFIED (thunk_fndecl)
346     = DECL_VISIBILITY_SPECIFIED (function);
347   DECL_COMDAT (thunk_fndecl) = DECL_COMDAT (function);
348   DECL_WEAK (thunk_fndecl) = DECL_WEAK (function);
349
350   if (flag_syntax_only)
351     {
352       TREE_ASM_WRITTEN (thunk_fndecl) = 1;
353       return;
354     }
355
356   push_to_top_level ();
357
358   if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function)
359       && targetm_common.have_named_sections)
360     {
361       resolve_unique_section (function, 0, flag_function_sections);
362
363       if (DECL_SECTION_NAME (function) != NULL && DECL_ONE_ONLY (function))
364         {
365           resolve_unique_section (thunk_fndecl, 0, flag_function_sections);
366
367           /* Output the thunk into the same section as function.  */
368           DECL_SECTION_NAME (thunk_fndecl) = DECL_SECTION_NAME (function);
369         }
370     }
371
372   /* Set up cloned argument trees for the thunk.  */
373   t = NULL_TREE;
374   for (a = DECL_ARGUMENTS (function); a; a = DECL_CHAIN (a))
375     {
376       tree x = copy_node (a);
377       DECL_CHAIN (x) = t;
378       DECL_CONTEXT (x) = thunk_fndecl;
379       SET_DECL_RTL (x, NULL);
380       DECL_HAS_VALUE_EXPR_P (x) = 0;
381       TREE_ADDRESSABLE (x) = 0;
382       t = x;
383     }
384   a = nreverse (t);
385   DECL_ARGUMENTS (thunk_fndecl) = a;
386   TREE_ASM_WRITTEN (thunk_fndecl) = 1;
387   funcn = cgraph_get_node (function);
388   gcc_checking_assert (funcn);
389   thunk_node = cgraph_add_thunk (funcn, thunk_fndecl, function,
390                                  this_adjusting, fixed_offset, virtual_value,
391                                  virtual_offset, alias);
392   if (DECL_ONE_ONLY (function))
393     cgraph_add_to_same_comdat_group (thunk_node, funcn);
394
395   if (!this_adjusting
396       || !targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
397                                                virtual_value, alias))
398     {
399       /* If this is a covariant thunk, or we don't have the necessary
400          code for efficient thunks, generate a thunk function that
401          just makes a call to the real function.  Unfortunately, this
402          doesn't work for varargs.  */
403
404       if (varargs_function_p (function))
405         error ("generic thunk code fails for method %q#D which uses %<...%>",
406                function);
407     }
408
409   pop_from_top_level ();
410 }
411 \f
412 /* Code for synthesizing methods which have default semantics defined.  */
413
414 /* True iff CTYPE has a trivial SFK.  */
415
416 static bool
417 type_has_trivial_fn (tree ctype, special_function_kind sfk)
418 {
419   switch (sfk)
420     {
421     case sfk_constructor:
422       return !TYPE_HAS_COMPLEX_DFLT (ctype);
423     case sfk_copy_constructor:
424       return !TYPE_HAS_COMPLEX_COPY_CTOR (ctype);
425     case sfk_move_constructor:
426       return !TYPE_HAS_COMPLEX_MOVE_CTOR (ctype);
427     case sfk_copy_assignment:
428       return !TYPE_HAS_COMPLEX_COPY_ASSIGN (ctype);
429     case sfk_move_assignment:
430       return !TYPE_HAS_COMPLEX_MOVE_ASSIGN (ctype);
431     case sfk_destructor:
432       return !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (ctype);
433     default:
434       gcc_unreachable ();
435     }
436 }
437
438 /* Note that CTYPE has a non-trivial SFK even though we previously thought
439    it was trivial.  */
440
441 static void
442 type_set_nontrivial_flag (tree ctype, special_function_kind sfk)
443 {
444   switch (sfk)
445     {
446     case sfk_constructor:
447       TYPE_HAS_COMPLEX_DFLT (ctype) = true;
448       return;
449     case sfk_copy_constructor:
450       TYPE_HAS_COMPLEX_COPY_CTOR (ctype) = true;
451       return;
452     case sfk_move_constructor:
453       TYPE_HAS_COMPLEX_MOVE_CTOR (ctype) = true;
454       return;
455     case sfk_copy_assignment:
456       TYPE_HAS_COMPLEX_COPY_ASSIGN (ctype) = true;
457       return;
458     case sfk_move_assignment:
459       TYPE_HAS_COMPLEX_MOVE_ASSIGN (ctype) = true;
460       return;
461     case sfk_destructor:
462       TYPE_HAS_NONTRIVIAL_DESTRUCTOR (ctype) = true;
463       return;
464     default:
465       gcc_unreachable ();
466     }
467 }
468
469 /* True iff FN is a trivial defaulted member function ([cd]tor, op=).  */
470
471 bool
472 trivial_fn_p (tree fn)
473 {
474   if (!DECL_DEFAULTED_FN (fn))
475     return false;
476
477   /* If fn is a clone, get the primary variant.  */
478   fn = DECL_ORIGIN (fn);
479   return type_has_trivial_fn (DECL_CONTEXT (fn), special_function_p (fn));
480 }
481
482 /* Generate code for default X(X&) or X(X&&) constructor.  */
483
484 static void
485 do_build_copy_constructor (tree fndecl)
486 {
487   tree parm = FUNCTION_FIRST_USER_PARM (fndecl);
488   bool move_p = DECL_MOVE_CONSTRUCTOR_P (fndecl);
489   bool trivial = trivial_fn_p (fndecl);
490
491   parm = convert_from_reference (parm);
492
493   if (trivial
494       && is_empty_class (current_class_type))
495     /* Don't copy the padding byte; it might not have been allocated
496        if *this is a base subobject.  */;
497   else if (trivial)
498     {
499       tree t = build2 (INIT_EXPR, void_type_node, current_class_ref, parm);
500       finish_expr_stmt (t);
501     }
502   else
503     {
504       tree fields = TYPE_FIELDS (current_class_type);
505       tree member_init_list = NULL_TREE;
506       int cvquals = cp_type_quals (TREE_TYPE (parm));
507       int i;
508       tree binfo, base_binfo;
509       tree init;
510       VEC(tree,gc) *vbases;
511
512       /* Initialize all the base-classes with the parameter converted
513          to their type so that we get their copy constructor and not
514          another constructor that takes current_class_type.  We must
515          deal with the binfo's directly as a direct base might be
516          inaccessible due to ambiguity.  */
517       for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
518            VEC_iterate (tree, vbases, i, binfo); i++)
519         {
520           init = build_base_path (PLUS_EXPR, parm, binfo, 1,
521                                   tf_warning_or_error);
522           if (move_p)
523             init = move (init);
524           member_init_list
525             = tree_cons (binfo,
526                          build_tree_list (NULL_TREE, init),
527                          member_init_list);
528         }
529
530       for (binfo = TYPE_BINFO (current_class_type), i = 0;
531            BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
532         {
533           if (BINFO_VIRTUAL_P (base_binfo))
534             continue;
535
536           init = build_base_path (PLUS_EXPR, parm, base_binfo, 1,
537                                   tf_warning_or_error);
538           if (move_p)
539             init = move (init);
540           member_init_list
541             = tree_cons (base_binfo,
542                          build_tree_list (NULL_TREE, init),
543                          member_init_list);
544         }
545
546       for (; fields; fields = DECL_CHAIN (fields))
547         {
548           tree field = fields;
549           tree expr_type;
550
551           if (TREE_CODE (field) != FIELD_DECL)
552             continue;
553
554           expr_type = TREE_TYPE (field);
555           if (DECL_NAME (field))
556             {
557               if (VFIELD_NAME_P (DECL_NAME (field)))
558                 continue;
559             }
560           else if (ANON_AGGR_TYPE_P (expr_type) && TYPE_FIELDS (expr_type))
561             /* Just use the field; anonymous types can't have
562                nontrivial copy ctors or assignment ops or this
563                function would be deleted.  */;
564           else
565             continue;
566
567           /* Compute the type of "init->field".  If the copy-constructor
568              parameter is, for example, "const S&", and the type of
569              the field is "T", then the type will usually be "const
570              T".  (There are no cv-qualified variants of reference
571              types.)  */
572           if (TREE_CODE (expr_type) != REFERENCE_TYPE)
573             {
574               int quals = cvquals;
575
576               if (DECL_MUTABLE_P (field))
577                 quals &= ~TYPE_QUAL_CONST;
578               quals |= cp_type_quals (expr_type);
579               expr_type = cp_build_qualified_type (expr_type, quals);
580             }
581
582           init = build3 (COMPONENT_REF, expr_type, parm, field, NULL_TREE);
583           if (move_p && TREE_CODE (expr_type) != REFERENCE_TYPE)
584             init = move (init);
585           init = build_tree_list (NULL_TREE, init);
586
587           member_init_list = tree_cons (field, init, member_init_list);
588         }
589       finish_mem_initializers (member_init_list);
590     }
591 }
592
593 static void
594 do_build_copy_assign (tree fndecl)
595 {
596   tree parm = DECL_CHAIN (DECL_ARGUMENTS (fndecl));
597   tree compound_stmt;
598   bool move_p = move_fn_p (fndecl);
599   bool trivial = trivial_fn_p (fndecl);
600   int flags = LOOKUP_NORMAL | LOOKUP_NONVIRTUAL | LOOKUP_DEFAULTED;
601
602   compound_stmt = begin_compound_stmt (0);
603   parm = convert_from_reference (parm);
604
605   if (trivial
606       && is_empty_class (current_class_type))
607     /* Don't copy the padding byte; it might not have been allocated
608        if *this is a base subobject.  */;
609   else if (trivial)
610     {
611       tree t = build2 (MODIFY_EXPR, void_type_node, current_class_ref, parm);
612       finish_expr_stmt (t);
613     }
614   else
615     {
616       tree fields;
617       int cvquals = cp_type_quals (TREE_TYPE (parm));
618       int i;
619       tree binfo, base_binfo;
620
621       /* Assign to each of the direct base classes.  */
622       for (binfo = TYPE_BINFO (current_class_type), i = 0;
623            BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
624         {
625           tree converted_parm;
626           VEC(tree,gc) *parmvec;
627
628           /* We must convert PARM directly to the base class
629              explicitly since the base class may be ambiguous.  */
630           converted_parm = build_base_path (PLUS_EXPR, parm, base_binfo, 1,
631                                             tf_warning_or_error);
632           if (move_p)
633             converted_parm = move (converted_parm);
634           /* Call the base class assignment operator.  */
635           parmvec = make_tree_vector_single (converted_parm);
636           finish_expr_stmt
637             (build_special_member_call (current_class_ref,
638                                         ansi_assopname (NOP_EXPR),
639                                         &parmvec,
640                                         base_binfo,
641                                         flags,
642                                         tf_warning_or_error));
643           release_tree_vector (parmvec);
644         }
645
646       /* Assign to each of the non-static data members.  */
647       for (fields = TYPE_FIELDS (current_class_type);
648            fields;
649            fields = DECL_CHAIN (fields))
650         {
651           tree comp = current_class_ref;
652           tree init = parm;
653           tree field = fields;
654           tree expr_type;
655           int quals;
656
657           if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
658             continue;
659
660           expr_type = TREE_TYPE (field);
661
662           if (CP_TYPE_CONST_P (expr_type))
663             {
664               error ("non-static const member %q#D, can%'t use default "
665                      "assignment operator", field);
666               continue;
667             }
668           else if (TREE_CODE (expr_type) == REFERENCE_TYPE)
669             {
670               error ("non-static reference member %q#D, can%'t use "
671                      "default assignment operator", field);
672               continue;
673             }
674
675           if (DECL_NAME (field))
676             {
677               if (VFIELD_NAME_P (DECL_NAME (field)))
678                 continue;
679             }
680           else if (ANON_AGGR_TYPE_P (expr_type)
681                    && TYPE_FIELDS (expr_type) != NULL_TREE)
682             /* Just use the field; anonymous types can't have
683                nontrivial copy ctors or assignment ops or this
684                function would be deleted.  */;
685           else
686             continue;
687
688           comp = build3 (COMPONENT_REF, expr_type, comp, field, NULL_TREE);
689
690           /* Compute the type of init->field  */
691           quals = cvquals;
692           if (DECL_MUTABLE_P (field))
693             quals &= ~TYPE_QUAL_CONST;
694           expr_type = cp_build_qualified_type (expr_type, quals);
695
696           init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE);
697           if (move_p && TREE_CODE (expr_type) != REFERENCE_TYPE)
698             init = move (init);
699
700           if (DECL_NAME (field))
701             init = cp_build_modify_expr (comp, NOP_EXPR, init, 
702                                          tf_warning_or_error);
703           else
704             init = build2 (MODIFY_EXPR, TREE_TYPE (comp), comp, init);
705           finish_expr_stmt (init);
706         }
707     }
708   finish_return_stmt (current_class_ref);
709   finish_compound_stmt (compound_stmt);
710 }
711
712 /* Synthesize FNDECL, a non-static member function.   */
713
714 void
715 synthesize_method (tree fndecl)
716 {
717   bool nested = (current_function_decl != NULL_TREE);
718   tree context = decl_function_context (fndecl);
719   bool need_body = true;
720   tree stmt;
721   location_t save_input_location = input_location;
722   int error_count = errorcount;
723   int warning_count = warningcount;
724
725   /* Reset the source location, we might have been previously
726      deferred, and thus have saved where we were first needed.  */
727   DECL_SOURCE_LOCATION (fndecl)
728     = DECL_SOURCE_LOCATION (TYPE_NAME (DECL_CONTEXT (fndecl)));
729
730   /* If we've been asked to synthesize a clone, just synthesize the
731      cloned function instead.  Doing so will automatically fill in the
732      body for the clone.  */
733   if (DECL_CLONED_FUNCTION_P (fndecl))
734     fndecl = DECL_CLONED_FUNCTION (fndecl);
735
736   /* We may be in the middle of deferred access check.  Disable
737      it now.  */
738   push_deferring_access_checks (dk_no_deferred);
739
740   if (! context)
741     push_to_top_level ();
742   else if (nested)
743     push_function_context ();
744
745   input_location = DECL_SOURCE_LOCATION (fndecl);
746
747   start_preparsed_function (fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
748   stmt = begin_function_body ();
749
750   if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR)
751     {
752       do_build_copy_assign (fndecl);
753       need_body = false;
754     }
755   else if (DECL_CONSTRUCTOR_P (fndecl))
756     {
757       tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl);
758       if (arg_chain != void_list_node)
759         do_build_copy_constructor (fndecl);
760       else
761         finish_mem_initializers (NULL_TREE);
762     }
763
764   /* If we haven't yet generated the body of the function, just
765      generate an empty compound statement.  */
766   if (need_body)
767     {
768       tree compound_stmt;
769       compound_stmt = begin_compound_stmt (BCS_FN_BODY);
770       finish_compound_stmt (compound_stmt);
771     }
772
773   finish_function_body (stmt);
774   expand_or_defer_fn (finish_function (0));
775
776   input_location = save_input_location;
777
778   if (! context)
779     pop_from_top_level ();
780   else if (nested)
781     pop_function_context ();
782
783   pop_deferring_access_checks ();
784
785   if (error_count != errorcount || warning_count != warningcount)
786     inform (input_location, "synthesized method %qD first required here ",
787             fndecl);
788 }
789
790 /* Build a reference to type TYPE with cv-quals QUALS, which is an
791    rvalue if RVALUE is true.  */
792
793 static tree
794 build_stub_type (tree type, int quals, bool rvalue)
795 {
796   tree argtype = cp_build_qualified_type (type, quals);
797   return cp_build_reference_type (argtype, rvalue);
798 }
799
800 /* Build a dummy glvalue from dereferencing a dummy reference of type
801    REFTYPE.  */
802
803 static tree
804 build_stub_object (tree reftype)
805 {
806   tree stub = build1 (NOP_EXPR, reftype, integer_one_node);
807   return convert_from_reference (stub);
808 }
809
810 /* Determine which function will be called when looking up NAME in TYPE,
811    called with a single ARGTYPE argument, or no argument if ARGTYPE is
812    null.  FLAGS and COMPLAIN are as for build_new_method_call.
813
814    Returns a FUNCTION_DECL if all is well.
815    Returns NULL_TREE if overload resolution failed.
816    Returns error_mark_node if the chosen function cannot be called.  */
817
818 static tree
819 locate_fn_flags (tree type, tree name, tree argtype, int flags,
820                  tsubst_flags_t complain)
821 {
822   tree ob, fn, fns, binfo, rval;
823   VEC(tree,gc) *args;
824
825   if (TYPE_P (type))
826     binfo = TYPE_BINFO (type);
827   else
828     {
829       binfo = type;
830       type = BINFO_TYPE (binfo);
831     }
832
833   ob = build_stub_object (cp_build_reference_type (type, false));
834   args = make_tree_vector ();
835   if (argtype)
836     {
837       tree arg = build_stub_object (argtype);
838       VEC_quick_push (tree, args, arg);
839     }
840
841   fns = lookup_fnfields (binfo, name, 0);
842   rval = build_new_method_call (ob, fns, &args, binfo, flags, &fn, complain);
843
844   release_tree_vector (args);
845   if (fn && rval == error_mark_node)
846     return rval;
847   else
848     return fn;
849 }
850
851 /* Locate the dtor of TYPE.  */
852
853 tree
854 get_dtor (tree type, tsubst_flags_t complain)
855 {
856   tree fn = locate_fn_flags (type, complete_dtor_identifier, NULL_TREE,
857                              LOOKUP_NORMAL, complain);
858   if (fn == error_mark_node)
859     return NULL_TREE;
860   return fn;
861 }
862
863 /* Locate the default ctor of TYPE.  */
864
865 tree
866 locate_ctor (tree type)
867 {
868   tree fn;
869
870   push_deferring_access_checks (dk_no_check);
871   fn = locate_fn_flags (type, complete_ctor_identifier, NULL_TREE,
872                         LOOKUP_SPECULATIVE, tf_none);
873   pop_deferring_access_checks ();
874   if (fn == error_mark_node)
875     return NULL_TREE;
876   return fn;
877 }
878
879 /* Likewise, but give any appropriate errors.  */
880
881 tree
882 get_default_ctor (tree type)
883 {
884   tree fn = locate_fn_flags (type, complete_ctor_identifier, NULL_TREE,
885                              LOOKUP_NORMAL, tf_warning_or_error);
886   if (fn == error_mark_node)
887     return NULL_TREE;
888   return fn;
889 }
890
891 /* Locate the copy ctor of TYPE.  */
892
893 tree
894 get_copy_ctor (tree type, tsubst_flags_t complain)
895 {
896   int quals = (TYPE_HAS_CONST_COPY_CTOR (type)
897                ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED);
898   tree argtype = build_stub_type (type, quals, false);
899   tree fn = locate_fn_flags (type, complete_ctor_identifier, argtype,
900                              LOOKUP_NORMAL, complain);
901   if (fn == error_mark_node)
902     return NULL_TREE;
903   return fn;
904 }
905
906 /* Locate the copy assignment operator of TYPE.  */
907
908 tree
909 get_copy_assign (tree type)
910 {
911   int quals = (TYPE_HAS_CONST_COPY_ASSIGN (type)
912                ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED);
913   tree argtype = build_stub_type (type, quals, false);
914   tree fn = locate_fn_flags (type, ansi_assopname (NOP_EXPR), argtype,
915                              LOOKUP_NORMAL, tf_warning_or_error);
916   if (fn == error_mark_node)
917     return NULL_TREE;
918   return fn;
919 }
920
921 /* Subroutine of synthesized_method_walk.  Update SPEC_P, TRIVIAL_P and
922    DELETED_P or give an error message MSG with argument ARG.  */
923
924 static void
925 process_subob_fn (tree fn, bool move_p, tree *spec_p, bool *trivial_p,
926                   bool *deleted_p, bool *constexpr_p, bool *no_implicit_p,
927                   const char *msg, tree arg)
928 {
929   if (!fn || fn == error_mark_node)
930     goto bad;
931
932   if (spec_p)
933     {
934       tree raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
935       *spec_p = merge_exception_specifiers (*spec_p, raises, fn);
936     }
937
938   if (!trivial_fn_p (fn))
939     {
940       if (trivial_p)
941         *trivial_p = false;
942       if (TREE_CODE (arg) == FIELD_DECL
943           && TREE_CODE (DECL_CONTEXT (arg)) == UNION_TYPE)
944         {
945           if (deleted_p)
946             *deleted_p = true;
947           if (msg)
948             error ("union member %q+D with non-trivial %qD", arg, fn);
949         }
950     }
951
952   /* Core 1402: A non-trivial non-move ctor suppresses the implicit
953      declaration of the move ctor/op=.  */
954   if (no_implicit_p && move_p && !move_signature_fn_p (fn)
955       && !trivial_fn_p (fn))
956     *no_implicit_p = true;
957
958   if (constexpr_p && !DECL_DECLARED_CONSTEXPR_P (fn))
959     {
960       *constexpr_p = false;
961       if (msg)
962         {
963           inform (0, "defaulted constructor calls non-constexpr "
964                   "%q+D", fn);
965           explain_invalid_constexpr_fn (fn);
966         }
967     }
968
969   return;
970
971  bad:
972   if (deleted_p)
973     *deleted_p = true;
974 }
975
976 /* Subroutine of synthesized_method_walk to allow recursion into anonymous
977    aggregates.  */
978
979 static void
980 walk_field_subobs (tree fields, tree fnname, special_function_kind sfk,
981                    int quals, bool copy_arg_p, bool move_p,
982                    bool assign_p, tree *spec_p, bool *trivial_p,
983                    bool *deleted_p, bool *constexpr_p, bool *no_implicit_p,
984                    const char *msg, int flags, tsubst_flags_t complain)
985 {
986   tree field;
987   for (field = fields; field; field = DECL_CHAIN (field))
988     {
989       tree mem_type, argtype, rval;
990
991       if (TREE_CODE (field) != FIELD_DECL
992           || DECL_ARTIFICIAL (field))
993         continue;
994
995       mem_type = strip_array_types (TREE_TYPE (field));
996       if (assign_p)
997         {
998           bool bad = true;
999           if (CP_TYPE_CONST_P (mem_type) && !CLASS_TYPE_P (mem_type))
1000             {
1001               if (msg)
1002                 error ("non-static const member %q#D, can%'t use default "
1003                        "assignment operator", field);
1004             }
1005           else if (TREE_CODE (mem_type) == REFERENCE_TYPE)
1006             {
1007               if (msg)
1008                 error ("non-static reference member %q#D, can%'t use "
1009                        "default assignment operator", field);
1010             }
1011           else
1012             bad = false;
1013
1014           if (bad && deleted_p)
1015             *deleted_p = true;
1016         }
1017       else if (sfk == sfk_constructor)
1018         {
1019           bool bad;
1020
1021           if (DECL_INITIAL (field))
1022             {
1023               if (msg && DECL_INITIAL (field) == error_mark_node)
1024                 inform (0, "initializer for %q+#D is invalid", field);
1025               if (trivial_p)
1026                 *trivial_p = false;
1027 #if 0
1028               /* Core 1351: If the field has an NSDMI that could throw, the
1029                  default constructor is noexcept(false).  FIXME this is
1030                  broken by deferred parsing and 1360 saying we can't lazily
1031                  declare a non-trivial default constructor.  Also this
1032                  needs to do deferred instantiation.  Disable until the
1033                  conflict between 1351 and 1360 is resolved.  */
1034               if (spec_p && !expr_noexcept_p (DECL_INITIAL (field), complain))
1035                 *spec_p = noexcept_false_spec;
1036 #endif
1037
1038               /* Don't do the normal processing.  */
1039               continue;
1040             }
1041
1042           bad = false;
1043           if (CP_TYPE_CONST_P (mem_type)
1044               && default_init_uninitialized_part (mem_type))
1045             {
1046               if (msg)
1047                 error ("uninitialized non-static const member %q#D",
1048                        field);
1049               bad = true;
1050             }
1051           else if (TREE_CODE (mem_type) == REFERENCE_TYPE)
1052             {
1053               if (msg)
1054                 error ("uninitialized non-static reference member %q#D",
1055                        field);
1056               bad = true;
1057             }
1058
1059           if (bad && deleted_p)
1060             *deleted_p = true;
1061
1062           /* For an implicitly-defined default constructor to be constexpr,
1063              every member must have a user-provided default constructor or
1064              an explicit initializer.  */
1065           if (constexpr_p && !CLASS_TYPE_P (mem_type)
1066               && TREE_CODE (DECL_CONTEXT (field)) != UNION_TYPE)
1067             {
1068               *constexpr_p = false;
1069               if (msg)
1070                 inform (0, "defaulted default constructor does not "
1071                         "initialize %q+#D", field);
1072             }
1073         }
1074
1075       if (!CLASS_TYPE_P (mem_type))
1076         continue;
1077
1078       if (ANON_AGGR_TYPE_P (mem_type))
1079         {
1080           walk_field_subobs (TYPE_FIELDS (mem_type), fnname, sfk, quals,
1081                              copy_arg_p, move_p, assign_p, spec_p, trivial_p,
1082                              deleted_p, constexpr_p, no_implicit_p,
1083                              msg, flags, complain);
1084           continue;
1085         }
1086
1087       if (copy_arg_p)
1088         {
1089           int mem_quals = cp_type_quals (mem_type) | quals;
1090           if (DECL_MUTABLE_P (field))
1091             mem_quals &= ~TYPE_QUAL_CONST;
1092           argtype = build_stub_type (mem_type, mem_quals, move_p);
1093         }
1094       else
1095         argtype = NULL_TREE;
1096
1097       rval = locate_fn_flags (mem_type, fnname, argtype, flags, complain);
1098
1099       process_subob_fn (rval, move_p, spec_p, trivial_p, deleted_p,
1100                         constexpr_p, no_implicit_p, msg, field);
1101     }
1102 }
1103
1104 /* The caller wants to generate an implicit declaration of SFK for CTYPE
1105    which is const if relevant and CONST_P is set.  If spec_p, trivial_p and
1106    deleted_p are non-null, set their referent appropriately.  If diag is
1107    true, we're either being called from maybe_explain_implicit_delete to
1108    give errors, or if constexpr_p is non-null, from
1109    explain_invalid_constexpr_fn.  */
1110
1111 static void
1112 synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
1113                          tree *spec_p, bool *trivial_p, bool *deleted_p,
1114                          bool *constexpr_p, bool *no_implicit_p, bool diag)
1115 {
1116   tree binfo, base_binfo, scope, fnname, rval, argtype;
1117   bool move_p, copy_arg_p, assign_p, expected_trivial, check_vdtor;
1118   VEC(tree,gc) *vbases;
1119   int i, quals, flags;
1120   tsubst_flags_t complain;
1121   const char *msg;
1122   bool ctor_p;
1123
1124   if (spec_p)
1125     *spec_p = (cxx_dialect >= cxx0x ? noexcept_true_spec : empty_except_spec);
1126
1127   if (no_implicit_p)
1128     *no_implicit_p = false;
1129
1130   if (deleted_p)
1131     {
1132       /* "The closure type associated with a lambda-expression has a deleted
1133          default constructor and a deleted copy assignment operator."
1134          This is diagnosed in maybe_explain_implicit_delete.  */
1135       if (LAMBDA_TYPE_P (ctype)
1136           && (sfk == sfk_constructor
1137               || sfk == sfk_copy_assignment))
1138         {
1139           *deleted_p = true;
1140           return;
1141         }
1142
1143       *deleted_p = false;
1144     }
1145
1146   ctor_p = false;
1147   assign_p = false;
1148   check_vdtor = false;
1149   switch (sfk)
1150     {
1151     case sfk_move_assignment:
1152     case sfk_copy_assignment:
1153       assign_p = true;
1154       fnname = ansi_assopname (NOP_EXPR);
1155       break;
1156
1157     case sfk_destructor:
1158       check_vdtor = true;
1159       /* The synthesized method will call base dtors, but check complete
1160          here to avoid having to deal with VTT.  */
1161       fnname = complete_dtor_identifier;
1162       break;
1163
1164     case sfk_constructor:
1165     case sfk_move_constructor:
1166     case sfk_copy_constructor:
1167       ctor_p = true;
1168       fnname = complete_ctor_identifier;
1169       break;
1170
1171     default:
1172       gcc_unreachable ();
1173     }
1174
1175   /* If that user-written default constructor would satisfy the
1176      requirements of a constexpr constructor (7.1.5), the
1177      implicitly-defined default constructor is constexpr.  */
1178   if (constexpr_p)
1179     *constexpr_p = ctor_p;
1180
1181   move_p = false;
1182   switch (sfk)
1183     {
1184     case sfk_constructor:
1185     case sfk_destructor:
1186       copy_arg_p = false;
1187       break;
1188
1189     case sfk_move_constructor:
1190     case sfk_move_assignment:
1191       move_p = true;
1192     case sfk_copy_constructor:
1193     case sfk_copy_assignment:
1194       copy_arg_p = true;
1195       break;
1196
1197     default:
1198       gcc_unreachable ();
1199     }
1200
1201   expected_trivial = type_has_trivial_fn (ctype, sfk);
1202   if (trivial_p)
1203     *trivial_p = expected_trivial;
1204
1205   /* The TYPE_HAS_COMPLEX_* flags tell us about constraints from base
1206      class versions and other properties of the type.  But a subobject
1207      class can be trivially copyable and yet have overload resolution
1208      choose a template constructor for initialization, depending on
1209      rvalueness and cv-quals.  So we can't exit early for copy/move
1210      methods in C++0x.  The same considerations apply in C++98/03, but
1211      there the definition of triviality does not consider overload
1212      resolution, so a constructor can be trivial even if it would otherwise
1213      call a non-trivial constructor.  */
1214   if (expected_trivial
1215       && (!copy_arg_p || cxx_dialect < cxx0x))
1216     {
1217       if (constexpr_p && sfk == sfk_constructor)
1218         {
1219           bool cx = trivial_default_constructor_is_constexpr (ctype);
1220           *constexpr_p = cx;
1221           if (diag && !cx && TREE_CODE (ctype) == UNION_TYPE)
1222             /* A trivial constructor doesn't have any NSDMI.  */
1223             inform (input_location, "defaulted default constructor does "
1224                     "not initialize any non-static data member");
1225         }
1226       if (!diag)
1227         return;
1228     }
1229
1230   ++cp_unevaluated_operand;
1231   ++c_inhibit_evaluation_warnings;
1232
1233   scope = push_scope (ctype);
1234
1235   if (diag)
1236     {
1237       flags = LOOKUP_NORMAL|LOOKUP_SPECULATIVE|LOOKUP_DEFAULTED;
1238       complain = tf_warning_or_error;
1239     }
1240   else
1241     {
1242       flags = LOOKUP_PROTECT|LOOKUP_SPECULATIVE|LOOKUP_DEFAULTED;
1243       complain = tf_none;
1244     }
1245
1246   if (const_p)
1247     quals = TYPE_QUAL_CONST;
1248   else
1249     quals = TYPE_UNQUALIFIED;
1250   argtype = NULL_TREE;
1251
1252   if (!diag)
1253     msg = NULL;
1254   else if (assign_p)
1255     msg = ("base %qT does not have a move assignment operator or trivial "
1256            "copy assignment operator");
1257   else
1258     msg = ("base %qT does not have a move constructor or trivial "
1259            "copy constructor");
1260
1261   for (binfo = TYPE_BINFO (ctype), i = 0;
1262        BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
1263     {
1264       tree basetype = BINFO_TYPE (base_binfo);
1265       if (copy_arg_p)
1266         argtype = build_stub_type (basetype, quals, move_p);
1267       rval = locate_fn_flags (base_binfo, fnname, argtype, flags, complain);
1268
1269       process_subob_fn (rval, move_p, spec_p, trivial_p, deleted_p,
1270                         constexpr_p, no_implicit_p, msg, basetype);
1271       if (ctor_p && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (basetype))
1272         {
1273           /* In a constructor we also need to check the subobject
1274              destructors for cleanup of partially constructed objects.  */
1275           rval = locate_fn_flags (base_binfo, complete_dtor_identifier,
1276                                   NULL_TREE, flags, complain);
1277           /* Note that we don't pass down trivial_p; the subobject
1278              destructors don't affect triviality of the constructor.  Nor
1279              do they affect constexpr-ness (a constant expression doesn't
1280              throw) or exception-specification (a throw from one of the
1281              dtors would be a double-fault).  */
1282           process_subob_fn (rval, false, NULL, NULL,
1283                             deleted_p, NULL, NULL, NULL,
1284                             basetype);
1285         }
1286
1287       if (check_vdtor && type_has_virtual_destructor (basetype))
1288         {
1289           rval = locate_fn_flags (ctype, ansi_opname (DELETE_EXPR),
1290                                   ptr_type_node, flags, complain);
1291           /* Unlike for base ctor/op=/dtor, for operator delete it's fine
1292              to have a null rval (no class-specific op delete).  */
1293           if (rval && rval == error_mark_node && deleted_p)
1294             *deleted_p = true;
1295           check_vdtor = false;
1296         }
1297     }
1298
1299   vbases = CLASSTYPE_VBASECLASSES (ctype);
1300   if (vbases && assign_p && move_p)
1301     {
1302       /* Should the spec be changed to allow vbases that only occur once?  */
1303       if (diag)
1304         error ("%qT has virtual bases, default move assignment operator "
1305                "cannot be generated", ctype);
1306       else if (deleted_p)
1307         *deleted_p = true;
1308     }
1309   else if (!assign_p)
1310     {
1311       if (diag)
1312         msg = ("virtual base %qT does not have a move constructor "
1313                "or trivial copy constructor");
1314       if (vbases && constexpr_p)
1315         *constexpr_p = false;
1316       FOR_EACH_VEC_ELT (tree, vbases, i, base_binfo)
1317         {
1318           tree basetype = BINFO_TYPE (base_binfo);
1319           if (copy_arg_p)
1320             argtype = build_stub_type (basetype, quals, move_p);
1321           rval = locate_fn_flags (base_binfo, fnname, argtype, flags, complain);
1322
1323           process_subob_fn (rval, move_p, spec_p, trivial_p, deleted_p,
1324                             constexpr_p, no_implicit_p, msg, basetype);
1325           if (ctor_p && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (basetype))
1326             {
1327               rval = locate_fn_flags (base_binfo, complete_dtor_identifier,
1328                                       NULL_TREE, flags, complain);
1329               process_subob_fn (rval, false, NULL, NULL,
1330                                 deleted_p, NULL, NULL, NULL,
1331                                 basetype);
1332             }
1333         }
1334     }
1335   if (!diag)
1336     /* Leave msg null. */;
1337   else if (assign_p)
1338     msg = ("non-static data member %qD does not have a move "
1339            "assignment operator or trivial copy assignment operator");
1340   else
1341     msg = ("non-static data member %qD does not have a move "
1342            "constructor or trivial copy constructor");
1343   walk_field_subobs (TYPE_FIELDS (ctype), fnname, sfk, quals,
1344                      copy_arg_p, move_p, assign_p, spec_p, trivial_p,
1345                      deleted_p, constexpr_p, no_implicit_p,
1346                      msg, flags, complain);
1347   if (ctor_p)
1348     walk_field_subobs (TYPE_FIELDS (ctype), complete_dtor_identifier,
1349                        sfk_destructor, TYPE_UNQUALIFIED, false,
1350                        false, false, NULL, NULL,
1351                        deleted_p, NULL,
1352                        NULL, NULL, flags, complain);
1353
1354   pop_scope (scope);
1355
1356   --cp_unevaluated_operand;
1357   --c_inhibit_evaluation_warnings;
1358 }
1359
1360 /* DECL is a deleted function.  If it's implicitly deleted, explain why and
1361    return true; else return false.  */
1362
1363 bool
1364 maybe_explain_implicit_delete (tree decl)
1365 {
1366   /* If decl is a clone, get the primary variant.  */
1367   decl = DECL_ORIGIN (decl);
1368   gcc_assert (DECL_DELETED_FN (decl));
1369   if (DECL_DEFAULTED_FN (decl))
1370     {
1371       /* Not marked GTY; it doesn't need to be GC'd or written to PCH.  */
1372       static struct pointer_set_t *explained;
1373
1374       special_function_kind sfk;
1375       location_t loc;
1376       bool informed;
1377       tree ctype;
1378
1379       if (!explained)
1380         explained = pointer_set_create ();
1381       if (pointer_set_insert (explained, decl))
1382         return true;
1383
1384       sfk = special_function_p (decl);
1385       ctype = DECL_CONTEXT (decl);
1386       loc = input_location;
1387       input_location = DECL_SOURCE_LOCATION (decl);
1388
1389       informed = false;
1390       if (LAMBDA_TYPE_P (ctype))
1391         {
1392           informed = true;
1393           if (sfk == sfk_constructor)
1394             inform (DECL_SOURCE_LOCATION (decl),
1395                     "a lambda closure type has a deleted default constructor");
1396           else if (sfk == sfk_copy_assignment)
1397             inform (DECL_SOURCE_LOCATION (decl),
1398                     "a lambda closure type has a deleted copy assignment operator");
1399           else
1400             informed = false;
1401         }
1402       else if (DECL_ARTIFICIAL (decl)
1403                && (sfk == sfk_copy_assignment
1404                    || sfk == sfk_copy_constructor)
1405                && (type_has_user_declared_move_constructor (ctype)
1406                    || type_has_user_declared_move_assign (ctype)))
1407         {
1408           inform (0, "%q+#D is implicitly declared as deleted because %qT "
1409                  "declares a move constructor or move assignment operator",
1410                  decl, ctype);
1411           informed = true;
1412         }
1413       if (!informed)
1414         {
1415           tree parm_type = TREE_VALUE (FUNCTION_FIRST_USER_PARMTYPE (decl));
1416           bool const_p = CP_TYPE_CONST_P (non_reference (parm_type));
1417           tree scope = push_scope (ctype);
1418           inform (0, "%q+#D is implicitly deleted because the default "
1419                  "definition would be ill-formed:", decl);
1420           pop_scope (scope);
1421           synthesized_method_walk (ctype, sfk, const_p,
1422                                    NULL, NULL, NULL, NULL, NULL, true);
1423         }
1424
1425       input_location = loc;
1426       return true;
1427     }
1428   return false;
1429 }
1430
1431 /* DECL is a defaulted function which was declared constexpr.  Explain why
1432    it can't be constexpr.  */
1433
1434 void
1435 explain_implicit_non_constexpr (tree decl)
1436 {
1437   tree parm_type = TREE_VALUE (FUNCTION_FIRST_USER_PARMTYPE (decl));
1438   bool const_p = CP_TYPE_CONST_P (non_reference (parm_type));
1439   bool dummy;
1440   synthesized_method_walk (DECL_CLASS_CONTEXT (decl),
1441                            special_function_p (decl), const_p,
1442                            NULL, NULL, NULL, &dummy, NULL, true);
1443 }
1444
1445 /* Implicitly declare the special function indicated by KIND, as a
1446    member of TYPE.  For copy constructors and assignment operators,
1447    CONST_P indicates whether these functions should take a const
1448    reference argument or a non-const reference.  Returns the
1449    FUNCTION_DECL for the implicitly declared function.  */
1450
1451 static tree
1452 implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
1453 {
1454   tree fn;
1455   tree parameter_types = void_list_node;
1456   tree return_type;
1457   tree fn_type;
1458   tree raises = empty_except_spec;
1459   tree rhs_parm_type = NULL_TREE;
1460   tree this_parm;
1461   tree name;
1462   HOST_WIDE_INT saved_processing_template_decl;
1463   bool deleted_p;
1464   bool trivial_p;
1465   bool constexpr_p;
1466   bool no_implicit_p;
1467
1468   /* Because we create declarations for implicitly declared functions
1469      lazily, we may be creating the declaration for a member of TYPE
1470      while in some completely different context.  However, TYPE will
1471      never be a dependent class (because we never want to do lookups
1472      for implicitly defined functions in a dependent class).
1473      Furthermore, we must set PROCESSING_TEMPLATE_DECL to zero here
1474      because we only create clones for constructors and destructors
1475      when not in a template.  */
1476   gcc_assert (!dependent_type_p (type));
1477   saved_processing_template_decl = processing_template_decl;
1478   processing_template_decl = 0;
1479
1480   type = TYPE_MAIN_VARIANT (type);
1481
1482   if (targetm.cxx.cdtor_returns_this () && !TYPE_FOR_JAVA (type))
1483     {
1484       if (kind == sfk_destructor)
1485         /* See comment in check_special_function_return_type.  */
1486         return_type = build_pointer_type (void_type_node);
1487       else
1488         return_type = build_pointer_type (type);
1489     }
1490   else
1491     return_type = void_type_node;
1492
1493   switch (kind)
1494     {
1495     case sfk_destructor:
1496       /* Destructor.  */
1497       name = constructor_name (type);
1498       break;
1499
1500     case sfk_constructor:
1501       /* Default constructor.  */
1502       name = constructor_name (type);
1503       break;
1504
1505     case sfk_copy_constructor:
1506     case sfk_copy_assignment:
1507     case sfk_move_constructor:
1508     case sfk_move_assignment:
1509     {
1510       bool move_p;
1511       if (kind == sfk_copy_assignment
1512           || kind == sfk_move_assignment)
1513         {
1514           return_type = build_reference_type (type);
1515           name = ansi_assopname (NOP_EXPR);
1516         }
1517       else
1518         name = constructor_name (type);
1519
1520       if (const_p)
1521         rhs_parm_type = cp_build_qualified_type (type, TYPE_QUAL_CONST);
1522       else
1523         rhs_parm_type = type;
1524       move_p = (kind == sfk_move_assignment
1525                 || kind == sfk_move_constructor);
1526       rhs_parm_type = cp_build_reference_type (rhs_parm_type, move_p);
1527
1528       parameter_types = tree_cons (NULL_TREE, rhs_parm_type, parameter_types);
1529       break;
1530     }
1531     default:
1532       gcc_unreachable ();
1533     }
1534
1535   synthesized_method_walk (type, kind, const_p, &raises, &trivial_p,
1536                            &deleted_p, &constexpr_p, &no_implicit_p, false);
1537   /* Don't bother marking a deleted constructor as constexpr.  */
1538   if (deleted_p)
1539     constexpr_p = false;
1540   /* A trivial copy/move constructor is also a constexpr constructor.  */
1541   else if (trivial_p && cxx_dialect >= cxx0x
1542            && (kind == sfk_copy_constructor
1543                || kind == sfk_move_constructor))
1544     gcc_assert (constexpr_p);
1545
1546   if (!trivial_p && type_has_trivial_fn (type, kind))
1547     type_set_nontrivial_flag (type, kind);
1548
1549   /* Create the function.  */
1550   fn_type = build_method_type_directly (type, return_type, parameter_types);
1551   if (raises)
1552     fn_type = build_exception_variant (fn_type, raises);
1553   fn = build_lang_decl (FUNCTION_DECL, name, fn_type);
1554   DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (TYPE_NAME (type));
1555   if (kind == sfk_constructor || kind == sfk_copy_constructor
1556       || kind == sfk_move_constructor)
1557     DECL_CONSTRUCTOR_P (fn) = 1;
1558   else if (kind == sfk_destructor)
1559     DECL_DESTRUCTOR_P (fn) = 1;
1560   else
1561     {
1562       DECL_ASSIGNMENT_OPERATOR_P (fn) = 1;
1563       SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR);
1564     }
1565   
1566   /* If pointers to member functions use the least significant bit to
1567      indicate whether a function is virtual, ensure a pointer
1568      to this function will have that bit clear.  */
1569   if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
1570       && DECL_ALIGN (fn) < 2 * BITS_PER_UNIT)
1571     DECL_ALIGN (fn) = 2 * BITS_PER_UNIT;
1572
1573   /* Create the explicit arguments.  */
1574   if (rhs_parm_type)
1575     {
1576       /* Note that this parameter is *not* marked DECL_ARTIFICIAL; we
1577          want its type to be included in the mangled function
1578          name.  */
1579       tree decl = cp_build_parm_decl (NULL_TREE, rhs_parm_type);
1580       TREE_READONLY (decl) = 1;
1581       retrofit_lang_decl (decl);
1582       DECL_PARM_INDEX (decl) = DECL_PARM_LEVEL (decl) = 1;
1583       DECL_ARGUMENTS (fn) = decl;
1584     }
1585   /* Add the "this" parameter.  */
1586   this_parm = build_this_parm (fn_type, TYPE_UNQUALIFIED);
1587   DECL_CHAIN (this_parm) = DECL_ARGUMENTS (fn);
1588   DECL_ARGUMENTS (fn) = this_parm;
1589
1590   grokclassfn (type, fn, kind == sfk_destructor ? DTOR_FLAG : NO_SPECIAL);
1591   set_linkage_according_to_type (type, fn);
1592   rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof);
1593   DECL_IN_AGGR_P (fn) = 1;
1594   DECL_ARTIFICIAL (fn) = 1;
1595   DECL_DEFAULTED_FN (fn) = 1;
1596   if (cxx_dialect >= cxx0x)
1597     {
1598       DECL_DELETED_FN (fn) = deleted_p;
1599       DECL_DECLARED_CONSTEXPR_P (fn) = constexpr_p;
1600     }
1601   FNDECL_SUPPRESS_IMPLICIT_DECL (fn) = no_implicit_p;
1602   DECL_EXTERNAL (fn) = true;
1603   DECL_NOT_REALLY_EXTERN (fn) = 1;
1604   DECL_DECLARED_INLINE_P (fn) = 1;
1605   gcc_assert (!TREE_USED (fn));
1606
1607   /* Restore PROCESSING_TEMPLATE_DECL.  */
1608   processing_template_decl = saved_processing_template_decl;
1609
1610   return fn;
1611 }
1612
1613 /* Gives any errors about defaulted functions which need to be deferred
1614    until the containing class is complete.  */
1615
1616 void
1617 defaulted_late_check (tree fn)
1618 {
1619   /* Complain about invalid signature for defaulted fn.  */
1620   tree ctx = DECL_CONTEXT (fn);
1621   special_function_kind kind = special_function_p (fn);
1622   bool fn_const_p = (copy_fn_p (fn) == 2);
1623   tree implicit_fn = implicitly_declare_fn (kind, ctx, fn_const_p);
1624
1625   if (!same_type_p (TREE_TYPE (TREE_TYPE (fn)),
1626                     TREE_TYPE (TREE_TYPE (implicit_fn)))
1627       || !compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)),
1628                      TYPE_ARG_TYPES (TREE_TYPE (implicit_fn))))
1629     {
1630       error ("defaulted declaration %q+D", fn);
1631       error_at (DECL_SOURCE_LOCATION (fn),
1632                 "does not match expected signature %qD", implicit_fn);
1633     }
1634
1635   /* 8.4.2/2: If it is explicitly defaulted on its first declaration, it is
1636      implicitly considered to have the same exception-specification as if
1637      it had been implicitly declared.  */
1638   if (DECL_DEFAULTED_IN_CLASS_P (fn))
1639     {
1640       tree eh_spec = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (implicit_fn));
1641       if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)))
1642         {
1643           maybe_instantiate_noexcept (fn);
1644           if (!comp_except_specs (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)),
1645                                   eh_spec, ce_normal))
1646             error ("function %q+D defaulted on its first declaration "
1647                    "with an exception-specification that differs from "
1648                    "the implicit declaration %q#D", fn, implicit_fn);
1649         }
1650       TREE_TYPE (fn) = build_exception_variant (TREE_TYPE (fn), eh_spec);
1651       if (DECL_DECLARED_CONSTEXPR_P (implicit_fn))
1652         {
1653           /* Hmm...should we do this for out-of-class too? Should it be OK to
1654              add constexpr later like inline, rather than requiring
1655              declarations to match?  */
1656           DECL_DECLARED_CONSTEXPR_P (fn) = true;
1657           if (kind == sfk_constructor)
1658             TYPE_HAS_CONSTEXPR_CTOR (ctx) = true;
1659         }
1660     }
1661
1662   if (!DECL_DECLARED_CONSTEXPR_P (implicit_fn)
1663       && DECL_DECLARED_CONSTEXPR_P (fn))
1664     {
1665       if (!CLASSTYPE_TEMPLATE_INSTANTIATION (ctx))
1666         {
1667           error ("explicitly defaulted function %q+D cannot be declared "
1668                  "as constexpr because the implicit declaration is not "
1669                  "constexpr:", fn);
1670           explain_implicit_non_constexpr (fn);
1671         }
1672       DECL_DECLARED_CONSTEXPR_P (fn) = false;
1673     }
1674
1675   if (DECL_DELETED_FN (implicit_fn))
1676     DECL_DELETED_FN (fn) = 1;
1677 }
1678
1679 /* Returns true iff FN can be explicitly defaulted, and gives any
1680    errors if defaulting FN is ill-formed.  */
1681
1682 bool
1683 defaultable_fn_check (tree fn)
1684 {
1685   special_function_kind kind = sfk_none;
1686
1687   if (template_parm_scope_p ())
1688     {
1689       error ("a template cannot be defaulted");
1690       return false;
1691     }
1692
1693   if (DECL_CONSTRUCTOR_P (fn))
1694     {
1695       if (FUNCTION_FIRST_USER_PARMTYPE (fn) == void_list_node)
1696         kind = sfk_constructor;
1697       else if (copy_fn_p (fn) > 0
1698                && (TREE_CHAIN (FUNCTION_FIRST_USER_PARMTYPE (fn))
1699                    == void_list_node))
1700         kind = sfk_copy_constructor;
1701       else if (move_fn_p (fn))
1702         kind = sfk_move_constructor;
1703     }
1704   else if (DECL_DESTRUCTOR_P (fn))
1705     kind = sfk_destructor;
1706   else if (DECL_ASSIGNMENT_OPERATOR_P (fn)
1707            && DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR)
1708     {
1709       if (copy_fn_p (fn))
1710         kind = sfk_copy_assignment;
1711       else if (move_fn_p (fn))
1712         kind = sfk_move_assignment;
1713     }
1714
1715   if (kind == sfk_none)
1716     {
1717       error ("%qD cannot be defaulted", fn);
1718       return false;
1719     }
1720   else
1721     {
1722       tree t = FUNCTION_FIRST_USER_PARMTYPE (fn);
1723       for (; t && t != void_list_node; t = TREE_CHAIN (t))
1724         if (TREE_PURPOSE (t))
1725           {
1726             error ("defaulted function %q+D with default argument", fn);
1727             break;
1728           }
1729       if (TYPE_BEING_DEFINED (DECL_CONTEXT (fn)))
1730         /* Defer checking.  */;
1731       else if (!processing_template_decl)
1732         defaulted_late_check (fn);
1733
1734       return true;
1735     }
1736 }
1737
1738 /* Add an implicit declaration to TYPE for the kind of function
1739    indicated by SFK.  Return the FUNCTION_DECL for the new implicit
1740    declaration.  */
1741
1742 tree
1743 lazily_declare_fn (special_function_kind sfk, tree type)
1744 {
1745   tree fn;
1746   /* Whether or not the argument has a const reference type.  */
1747   bool const_p = false;
1748
1749   switch (sfk)
1750     {
1751     case sfk_constructor:
1752       CLASSTYPE_LAZY_DEFAULT_CTOR (type) = 0;
1753       break;
1754     case sfk_copy_constructor:
1755       const_p = TYPE_HAS_CONST_COPY_CTOR (type);
1756       CLASSTYPE_LAZY_COPY_CTOR (type) = 0;
1757       break;
1758     case sfk_move_constructor:
1759       CLASSTYPE_LAZY_MOVE_CTOR (type) = 0;
1760       break;
1761     case sfk_copy_assignment:
1762       const_p = TYPE_HAS_CONST_COPY_ASSIGN (type);
1763       CLASSTYPE_LAZY_COPY_ASSIGN (type) = 0;
1764       break;
1765     case sfk_move_assignment:
1766       CLASSTYPE_LAZY_MOVE_ASSIGN (type) = 0;
1767       break;
1768     case sfk_destructor:
1769       CLASSTYPE_LAZY_DESTRUCTOR (type) = 0;
1770       break;
1771     default:
1772       gcc_unreachable ();
1773     }
1774
1775   /* Declare the function.  */
1776   fn = implicitly_declare_fn (sfk, type, const_p);
1777
1778   /* [class.copy]/8 If the class definition declares a move constructor or
1779      move assignment operator, the implicitly declared copy constructor is
1780      defined as deleted.... */
1781   if ((sfk == sfk_copy_assignment
1782        || sfk == sfk_copy_constructor)
1783       && (type_has_user_declared_move_constructor (type)
1784           || type_has_user_declared_move_assign (type)))
1785     DECL_DELETED_FN (fn) = true;
1786
1787   /* For move variants, rather than declare them as deleted we just
1788      don't declare them at all.  */
1789   if (DECL_DELETED_FN (fn)
1790       && (sfk == sfk_move_constructor
1791           || sfk == sfk_move_assignment))
1792     return NULL_TREE;
1793
1794   /* We also suppress implicit move if it would call a non-trivial copy.  */
1795   if (FNDECL_SUPPRESS_IMPLICIT_DECL (fn))
1796     return NULL_TREE;
1797
1798   /* A destructor may be virtual.  */
1799   if (sfk == sfk_destructor
1800       || sfk == sfk_move_assignment
1801       || sfk == sfk_copy_assignment)
1802     check_for_override (fn, type);
1803   /* Add it to CLASSTYPE_METHOD_VEC.  */
1804   add_method (type, fn, NULL_TREE);
1805   /* Add it to TYPE_METHODS.  */
1806   if (sfk == sfk_destructor
1807       && DECL_VIRTUAL_P (fn)
1808       && abi_version_at_least (2))
1809     /* The ABI requires that a virtual destructor go at the end of the
1810        vtable.  */
1811     TYPE_METHODS (type) = chainon (TYPE_METHODS (type), fn);
1812   else
1813     {
1814       /* G++ 3.2 put the implicit destructor at the *beginning* of the
1815          TYPE_METHODS list, which cause the destructor to be emitted
1816          in an incorrect location in the vtable.  */
1817       if (warn_abi && sfk == sfk_destructor && DECL_VIRTUAL_P (fn))
1818         warning (OPT_Wabi, "vtable layout for class %qT may not be ABI-compliant"
1819                  "and may change in a future version of GCC due to "
1820                  "implicit virtual destructor",
1821                  type);
1822       DECL_CHAIN (fn) = TYPE_METHODS (type);
1823       TYPE_METHODS (type) = fn;
1824     }
1825   maybe_add_class_template_decl_list (type, fn, /*friend_p=*/0);
1826   if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (fn)
1827       || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fn))
1828     /* Create appropriate clones.  */
1829     clone_function_decl (fn, /*update_method_vec=*/true);
1830
1831   return fn;
1832 }
1833
1834 /* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
1835    as there are artificial parms in FN.  */
1836
1837 tree
1838 skip_artificial_parms_for (const_tree fn, tree list)
1839 {
1840   if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
1841     list = TREE_CHAIN (list);
1842   else
1843     return list;
1844
1845   if (DECL_HAS_IN_CHARGE_PARM_P (fn))
1846     list = TREE_CHAIN (list);
1847   if (DECL_HAS_VTT_PARM_P (fn))
1848     list = TREE_CHAIN (list);
1849   return list;
1850 }
1851
1852 /* Given a FUNCTION_DECL FN and a chain LIST, return the number of
1853    artificial parms in FN.  */
1854
1855 int
1856 num_artificial_parms_for (const_tree fn)
1857 {
1858   int count = 0;
1859
1860   if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
1861     count++;
1862   else
1863     return 0;
1864
1865   if (DECL_HAS_IN_CHARGE_PARM_P (fn))
1866     count++;
1867   if (DECL_HAS_VTT_PARM_P (fn))
1868     count++;
1869   return count;
1870 }
1871
1872
1873 #include "gt-cp-method.h"