OSDN Git Service

PR c++/26912
[pf3gnuchains/gcc-fork.git] / 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 Free Software Foundation, Inc.
5    Contributed by Michael Tiemann (tiemann@cygnus.com)
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING.  If not, write to
21 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA.  */
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 "rtl.h"
33 #include "expr.h"
34 #include "output.h"
35 #include "flags.h"
36 #include "toplev.h"
37 #include "tm_p.h"
38 #include "target.h"
39 #include "tree-pass.h"
40 #include "diagnostic.h"
41
42 /* Various flags to control the mangling process.  */
43
44 enum mangling_flags
45 {
46   /* No flags.  */
47   mf_none = 0,
48   /* The thing we are presently mangling is part of a template type,
49      rather than a fully instantiated type.  Therefore, we may see
50      complex expressions where we would normally expect to see a
51      simple integer constant.  */
52   mf_maybe_uninstantiated = 1,
53   /* When mangling a numeric value, use the form `_XX_' (instead of
54      just `XX') if the value has more than one digit.  */
55   mf_use_underscores_around_value = 2
56 };
57
58 typedef enum mangling_flags mangling_flags;
59
60 static tree thunk_adjust (tree, bool, HOST_WIDE_INT, tree);
61 static void do_build_assign_ref (tree);
62 static void do_build_copy_constructor (tree);
63 static tree synthesize_exception_spec (tree, tree (*) (tree, void *), void *);
64 static tree locate_dtor (tree, void *);
65 static tree locate_ctor (tree, void *);
66 static tree locate_copy (tree, void *);
67 static tree make_alias_for_thunk (tree);
68
69 /* Called once to initialize method.c.  */
70
71 void
72 init_method (void)
73 {
74   init_mangle ();
75 }
76 \f
77 /* Return a this or result adjusting thunk to FUNCTION.  THIS_ADJUSTING
78    indicates whether it is a this or result adjusting thunk.
79    FIXED_OFFSET and VIRTUAL_OFFSET indicate how to do the adjustment
80    (see thunk_adjust).  VIRTUAL_OFFSET can be NULL, but FIXED_OFFSET
81    never is.  VIRTUAL_OFFSET is the /index/ into the vtable for this
82    adjusting thunks, we scale it to a byte offset. For covariant
83    thunks VIRTUAL_OFFSET is the virtual binfo.  You must post process
84    the returned thunk with finish_thunk.  */
85
86 tree
87 make_thunk (tree function, bool this_adjusting,
88             tree fixed_offset, tree virtual_offset)
89 {
90   HOST_WIDE_INT d;
91   tree thunk;
92
93   gcc_assert (TREE_CODE (function) == FUNCTION_DECL);
94   /* We can have this thunks to covariant thunks, but not vice versa.  */
95   gcc_assert (!DECL_THIS_THUNK_P (function));
96   gcc_assert (!DECL_RESULT_THUNK_P (function) || this_adjusting);
97
98   /* Scale the VIRTUAL_OFFSET to be in terms of bytes.  */
99   if (this_adjusting && virtual_offset)
100     virtual_offset
101       = size_binop (MULT_EXPR,
102                     virtual_offset,
103                     convert (ssizetype,
104                              TYPE_SIZE_UNIT (vtable_entry_type)));
105
106   d = tree_low_cst (fixed_offset, 0);
107
108   /* See if we already have the thunk in question.  For this_adjusting
109      thunks VIRTUAL_OFFSET will be an INTEGER_CST, for covariant thunks it
110      will be a BINFO.  */
111   for (thunk = DECL_THUNKS (function); thunk; thunk = TREE_CHAIN (thunk))
112     if (DECL_THIS_THUNK_P (thunk) == this_adjusting
113         && THUNK_FIXED_OFFSET (thunk) == d
114         && !virtual_offset == !THUNK_VIRTUAL_OFFSET (thunk)
115         && (!virtual_offset
116             || (this_adjusting
117                 ? tree_int_cst_equal (THUNK_VIRTUAL_OFFSET (thunk),
118                                       virtual_offset)
119                 : THUNK_VIRTUAL_OFFSET (thunk) == virtual_offset)))
120       return thunk;
121
122   /* All thunks must be created before FUNCTION is actually emitted;
123      the ABI requires that all thunks be emitted together with the
124      function to which they transfer control.  */
125   gcc_assert (!TREE_ASM_WRITTEN (function));
126   /* Likewise, we can only be adding thunks to a function declared in
127      the class currently being laid out.  */
128   gcc_assert (TYPE_SIZE (DECL_CONTEXT (function))
129               && TYPE_BEING_DEFINED (DECL_CONTEXT (function)));
130
131   thunk = build_decl (FUNCTION_DECL, NULL_TREE, TREE_TYPE (function));
132   DECL_LANG_SPECIFIC (thunk) = DECL_LANG_SPECIFIC (function);
133   cxx_dup_lang_specific_decl (thunk);
134   DECL_THUNKS (thunk) = NULL_TREE;
135
136   DECL_CONTEXT (thunk) = DECL_CONTEXT (function);
137   TREE_READONLY (thunk) = TREE_READONLY (function);
138   TREE_THIS_VOLATILE (thunk) = TREE_THIS_VOLATILE (function);
139   TREE_PUBLIC (thunk) = TREE_PUBLIC (function);
140   SET_DECL_THUNK_P (thunk, this_adjusting);
141   THUNK_TARGET (thunk) = function;
142   THUNK_FIXED_OFFSET (thunk) = d;
143   THUNK_VIRTUAL_OFFSET (thunk) = virtual_offset;
144   THUNK_ALIAS (thunk) = NULL_TREE;
145
146   /* The thunk itself is not a constructor or destructor, even if
147      the thing it is thunking to is.  */
148   DECL_INTERFACE_KNOWN (thunk) = 1;
149   DECL_NOT_REALLY_EXTERN (thunk) = 1;
150   DECL_SAVED_FUNCTION_DATA (thunk) = NULL;
151   DECL_DESTRUCTOR_P (thunk) = 0;
152   DECL_CONSTRUCTOR_P (thunk) = 0;
153   DECL_EXTERNAL (thunk) = 1;
154   DECL_ARTIFICIAL (thunk) = 1;
155   /* Even if this thunk is a member of a local class, we don't
156      need a static chain.  */
157   DECL_NO_STATIC_CHAIN (thunk) = 1;
158   /* The THUNK is not a pending inline, even if the FUNCTION is.  */
159   DECL_PENDING_INLINE_P (thunk) = 0;
160   DECL_INLINE (thunk) = 0;
161   DECL_DECLARED_INLINE_P (thunk) = 0;
162   /* Nor has it been deferred.  */
163   DECL_DEFERRED_FN (thunk) = 0;
164
165   /* Add it to the list of thunks associated with FUNCTION.  */
166   TREE_CHAIN (thunk) = DECL_THUNKS (function);
167   DECL_THUNKS (function) = thunk;
168
169   return thunk;
170 }
171
172 /* Finish THUNK, a thunk decl.  */
173
174 void
175 finish_thunk (tree thunk)
176 {
177   tree function, name;
178   tree fixed_offset = ssize_int (THUNK_FIXED_OFFSET (thunk));
179   tree virtual_offset = THUNK_VIRTUAL_OFFSET (thunk);
180
181   gcc_assert (!DECL_NAME (thunk) && DECL_THUNK_P (thunk));
182   if (virtual_offset && DECL_RESULT_THUNK_P (thunk))
183     virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
184   function = THUNK_TARGET (thunk);
185   name = mangle_thunk (function, DECL_THIS_THUNK_P (thunk),
186                        fixed_offset, virtual_offset);
187
188   /* We can end up with declarations of (logically) different
189      covariant thunks, that do identical adjustments.  The two thunks
190      will be adjusting between within different hierarchies, which
191      happen to have the same layout.  We must nullify one of them to
192      refer to the other.  */
193   if (DECL_RESULT_THUNK_P (thunk))
194     {
195       tree cov_probe;
196
197       for (cov_probe = DECL_THUNKS (function);
198            cov_probe; cov_probe = TREE_CHAIN (cov_probe))
199         if (DECL_NAME (cov_probe) == name)
200           {
201             gcc_assert (!DECL_THUNKS (thunk));
202             THUNK_ALIAS (thunk) = (THUNK_ALIAS (cov_probe)
203                                    ? THUNK_ALIAS (cov_probe) : cov_probe);
204             break;
205           }
206     }
207
208   DECL_NAME (thunk) = name;
209   SET_DECL_ASSEMBLER_NAME (thunk, name);
210 }
211
212 /* Adjust PTR by the constant FIXED_OFFSET, and by the vtable
213    offset indicated by VIRTUAL_OFFSET, if that is
214    non-null. THIS_ADJUSTING is nonzero for a this adjusting thunk and
215    zero for a result adjusting thunk.  */
216
217 static tree
218 thunk_adjust (tree ptr, bool this_adjusting,
219               HOST_WIDE_INT fixed_offset, tree virtual_offset)
220 {
221   if (this_adjusting)
222     /* Adjust the pointer by the constant.  */
223     ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr,
224                        ssize_int (fixed_offset));
225
226   /* If there's a virtual offset, look up that value in the vtable and
227      adjust the pointer again.  */
228   if (virtual_offset)
229     {
230       tree vtable;
231
232       ptr = save_expr (ptr);
233       /* The vptr is always at offset zero in the object.  */
234       vtable = build1 (NOP_EXPR,
235                        build_pointer_type (build_pointer_type
236                                            (vtable_entry_type)),
237                        ptr);
238       /* Form the vtable address.  */
239       vtable = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (vtable)), vtable);
240       /* Find the entry with the vcall offset.  */
241       vtable = build2 (PLUS_EXPR, TREE_TYPE (vtable), vtable, virtual_offset);
242       /* Get the offset itself.  */
243       vtable = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (vtable)), vtable);
244       /* Adjust the `this' pointer.  */
245       ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr, vtable);
246     }
247
248   if (!this_adjusting)
249     /* Adjust the pointer by the constant.  */
250     ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr,
251                        ssize_int (fixed_offset));
252
253   return ptr;
254 }
255
256 static GTY (()) int thunk_labelno;
257
258 /* Create a static alias to function.  */
259
260 tree
261 make_alias_for (tree function, tree newid)
262 {
263   tree alias = build_decl (FUNCTION_DECL, newid, TREE_TYPE (function));
264   DECL_LANG_SPECIFIC (alias) = DECL_LANG_SPECIFIC (function);
265   cxx_dup_lang_specific_decl (alias);
266   DECL_CONTEXT (alias) = NULL;
267   TREE_READONLY (alias) = TREE_READONLY (function);
268   TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (function);
269   TREE_PUBLIC (alias) = 0;
270   DECL_INTERFACE_KNOWN (alias) = 1;
271   DECL_NOT_REALLY_EXTERN (alias) = 1;
272   DECL_THIS_STATIC (alias) = 1;
273   DECL_SAVED_FUNCTION_DATA (alias) = NULL;
274   DECL_DESTRUCTOR_P (alias) = 0;
275   DECL_CONSTRUCTOR_P (alias) = 0;
276   DECL_CLONED_FUNCTION (alias) = NULL_TREE;
277   DECL_EXTERNAL (alias) = 0;
278   DECL_ARTIFICIAL (alias) = 1;
279   DECL_NO_STATIC_CHAIN (alias) = 1;
280   DECL_PENDING_INLINE_P (alias) = 0;
281   DECL_INLINE (alias) = 0;
282   DECL_DECLARED_INLINE_P (alias) = 0;
283   DECL_DEFERRED_FN (alias) = 0;
284   DECL_USE_TEMPLATE (alias) = 0;
285   DECL_TEMPLATE_INSTANTIATED (alias) = 0;
286   DECL_TEMPLATE_INFO (alias) = NULL;
287   DECL_INITIAL (alias) = error_mark_node;
288   TREE_ADDRESSABLE (alias) = 1;
289   TREE_USED (alias) = 1;
290   SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
291   TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
292   return alias;
293 }
294
295 static tree
296 make_alias_for_thunk (tree function)
297 {
298   tree alias;
299   char buf[256];
300
301   ASM_GENERATE_INTERNAL_LABEL (buf, "LTHUNK", thunk_labelno);
302   thunk_labelno++;
303
304   alias = make_alias_for (function, get_identifier (buf));
305
306   if (!flag_syntax_only)
307     assemble_alias (alias, DECL_ASSEMBLER_NAME (function));
308
309   return alias;
310 }
311
312 /* Emit the definition of a C++ multiple inheritance or covariant
313    return vtable thunk.  If EMIT_P is nonzero, the thunk is emitted
314    immediately.  */
315
316 void
317 use_thunk (tree thunk_fndecl, bool emit_p)
318 {
319   tree a, t, function, alias;
320   tree virtual_offset;
321   HOST_WIDE_INT fixed_offset, virtual_value;
322   bool this_adjusting = DECL_THIS_THUNK_P (thunk_fndecl);
323
324   /* We should have called finish_thunk to give it a name.  */
325   gcc_assert (DECL_NAME (thunk_fndecl));
326
327   /* We should never be using an alias, always refer to the
328      aliased thunk.  */
329   gcc_assert (!THUNK_ALIAS (thunk_fndecl));
330
331   if (TREE_ASM_WRITTEN (thunk_fndecl))
332     return;
333
334   function = THUNK_TARGET (thunk_fndecl);
335   if (DECL_RESULT (thunk_fndecl))
336     /* We already turned this thunk into an ordinary function.
337        There's no need to process this thunk again.  */
338     return;
339
340   if (DECL_THUNK_P (function))
341     /* The target is itself a thunk, process it now.  */
342     use_thunk (function, emit_p);
343
344   /* Thunks are always addressable; they only appear in vtables.  */
345   TREE_ADDRESSABLE (thunk_fndecl) = 1;
346
347   /* Figure out what function is being thunked to.  It's referenced in
348      this translation unit.  */
349   TREE_ADDRESSABLE (function) = 1;
350   mark_used (function);
351   if (!emit_p)
352     return;
353
354   if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function))
355    alias = make_alias_for_thunk (function);
356   else
357    alias = function;
358
359   fixed_offset = THUNK_FIXED_OFFSET (thunk_fndecl);
360   virtual_offset = THUNK_VIRTUAL_OFFSET (thunk_fndecl);
361
362   if (virtual_offset)
363     {
364       if (!this_adjusting)
365         virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
366       virtual_value = tree_low_cst (virtual_offset, /*pos=*/0);
367       gcc_assert (virtual_value);
368     }
369   else
370     virtual_value = 0;
371
372   /* And, if we need to emit the thunk, it's used.  */
373   mark_used (thunk_fndecl);
374   /* This thunk is actually defined.  */
375   DECL_EXTERNAL (thunk_fndecl) = 0;
376   /* The linkage of the function may have changed.  FIXME in linkage
377      rewrite.  */
378   TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function);
379   DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
380   DECL_VISIBILITY_SPECIFIED (thunk_fndecl)
381     = DECL_VISIBILITY_SPECIFIED (function);
382   if (DECL_ONE_ONLY (function))
383     make_decl_one_only (thunk_fndecl);
384
385   if (flag_syntax_only)
386     {
387       TREE_ASM_WRITTEN (thunk_fndecl) = 1;
388       return;
389     }
390
391   push_to_top_level ();
392
393   if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function)
394       && targetm.have_named_sections)
395     {
396       resolve_unique_section (function, 0, flag_function_sections);
397
398       if (DECL_SECTION_NAME (function) != NULL && DECL_ONE_ONLY (function))
399         {
400           resolve_unique_section (thunk_fndecl, 0, flag_function_sections);
401
402           /* Output the thunk into the same section as function.  */
403           DECL_SECTION_NAME (thunk_fndecl) = DECL_SECTION_NAME (function);
404         }
405     }
406
407   /* The back-end expects DECL_INITIAL to contain a BLOCK, so we
408      create one.  */
409   DECL_INITIAL (thunk_fndecl) = make_node (BLOCK);
410
411   /* Set up cloned argument trees for the thunk.  */
412   t = NULL_TREE;
413   for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
414     {
415       tree x = copy_node (a);
416       TREE_CHAIN (x) = t;
417       DECL_CONTEXT (x) = thunk_fndecl;
418       SET_DECL_RTL (x, NULL_RTX);
419       t = x;
420     }
421   a = nreverse (t);
422   DECL_ARGUMENTS (thunk_fndecl) = a;
423   BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = a;
424
425   if (this_adjusting
426       && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
427                                               virtual_value, alias))
428     {
429       const char *fnname;
430       current_function_decl = thunk_fndecl;
431       DECL_RESULT (thunk_fndecl)
432         = build_decl (RESULT_DECL, 0, integer_type_node);
433       fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0);
434       init_function_start (thunk_fndecl);
435       current_function_is_thunk = 1;
436       assemble_start_function (thunk_fndecl, fnname);
437
438       targetm.asm_out.output_mi_thunk (asm_out_file, thunk_fndecl,
439                                        fixed_offset, virtual_value, alias);
440
441       assemble_end_function (thunk_fndecl, fnname);
442       init_insn_lengths ();
443       current_function_decl = 0;
444       cfun = 0;
445       TREE_ASM_WRITTEN (thunk_fndecl) = 1;
446     }
447   else
448     {
449       /* If this is a covariant thunk, or we don't have the necessary
450          code for efficient thunks, generate a thunk function that
451          just makes a call to the real function.  Unfortunately, this
452          doesn't work for varargs.  */
453
454       if (varargs_function_p (function))
455         error ("generic thunk code fails for method %q#D which uses %<...%>",
456                function);
457
458       DECL_RESULT (thunk_fndecl) = NULL_TREE;
459
460       start_preparsed_function (thunk_fndecl, NULL_TREE, SF_PRE_PARSED);
461       /* We don't bother with a body block for thunks.  */
462
463       /* There's no need to check accessibility inside the thunk body.  */
464       push_deferring_access_checks (dk_no_check);
465
466       t = a;
467       if (this_adjusting)
468         t = thunk_adjust (t, /*this_adjusting=*/1,
469                           fixed_offset, virtual_offset);
470
471       /* Build up the call to the real function.  */
472       t = tree_cons (NULL_TREE, t, NULL_TREE);
473       for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a))
474         t = tree_cons (NULL_TREE, a, t);
475       t = nreverse (t);
476       t = build_call (alias, t);
477       CALL_FROM_THUNK_P (t) = 1;
478
479       if (VOID_TYPE_P (TREE_TYPE (t)))
480         finish_expr_stmt (t);
481       else
482         {
483           if (!this_adjusting)
484             {
485               tree cond = NULL_TREE;
486
487               if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
488                 {
489                   /* If the return type is a pointer, we need to
490                      protect against NULL.  We know there will be an
491                      adjustment, because that's why we're emitting a
492                      thunk.  */
493                   t = save_expr (t);
494                   cond = cp_convert (boolean_type_node, t);
495                 }
496
497               t = thunk_adjust (t, /*this_adjusting=*/0,
498                                 fixed_offset, virtual_offset);
499               if (cond)
500                 t = build3 (COND_EXPR, TREE_TYPE (t), cond, t,
501                             cp_convert (TREE_TYPE (t), integer_zero_node));
502             }
503           if (IS_AGGR_TYPE (TREE_TYPE (t)))
504             t = build_cplus_new (TREE_TYPE (t), t);
505           finish_return_stmt (t);
506         }
507
508       /* Since we want to emit the thunk, we explicitly mark its name as
509          referenced.  */
510       mark_decl_referenced (thunk_fndecl);
511
512       /* But we don't want debugging information about it.  */
513       DECL_IGNORED_P (thunk_fndecl) = 1;
514
515       /* Re-enable access control.  */
516       pop_deferring_access_checks ();
517
518       thunk_fndecl = finish_function (0);
519       tree_lowering_passes (thunk_fndecl);
520       expand_body (thunk_fndecl);
521     }
522
523   pop_from_top_level ();
524 }
525 \f
526 /* Code for synthesizing methods which have default semantics defined.  */
527
528 /* Generate code for default X(X&) constructor.  */
529
530 static void
531 do_build_copy_constructor (tree fndecl)
532 {
533   tree parm = FUNCTION_FIRST_USER_PARM (fndecl);
534
535   parm = convert_from_reference (parm);
536
537   if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type)
538       && is_empty_class (current_class_type))
539     /* Don't copy the padding byte; it might not have been allocated
540        if *this is a base subobject.  */;
541   else if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type))
542     {
543       tree t = build2 (INIT_EXPR, void_type_node, current_class_ref, parm);
544       finish_expr_stmt (t);
545     }
546   else
547     {
548       tree fields = TYPE_FIELDS (current_class_type);
549       tree member_init_list = NULL_TREE;
550       int cvquals = cp_type_quals (TREE_TYPE (parm));
551       int i;
552       tree binfo, base_binfo;
553       VEC(tree,gc) *vbases;
554
555       /* Initialize all the base-classes with the parameter converted
556          to their type so that we get their copy constructor and not
557          another constructor that takes current_class_type.  We must
558          deal with the binfo's directly as a direct base might be
559          inaccessible due to ambiguity.  */
560       for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
561            VEC_iterate (tree, vbases, i, binfo); i++)
562         {
563           member_init_list
564             = tree_cons (binfo,
565                          build_tree_list (NULL_TREE,
566                                           build_base_path (PLUS_EXPR, parm,
567                                                            binfo, 1)),
568                          member_init_list);
569         }
570
571       for (binfo = TYPE_BINFO (current_class_type), i = 0;
572            BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
573         {
574           if (BINFO_VIRTUAL_P (base_binfo))
575             continue;
576
577           member_init_list
578             = tree_cons (base_binfo,
579                          build_tree_list (NULL_TREE,
580                                           build_base_path (PLUS_EXPR, parm,
581                                                            base_binfo, 1)),
582                          member_init_list);
583         }
584
585       for (; fields; fields = TREE_CHAIN (fields))
586         {
587           tree init = parm;
588           tree field = fields;
589           tree expr_type;
590
591           if (TREE_CODE (field) != FIELD_DECL)
592             continue;
593
594           expr_type = TREE_TYPE (field);
595           if (DECL_NAME (field))
596             {
597               if (VFIELD_NAME_P (DECL_NAME (field)))
598                 continue;
599             }
600           else if (ANON_AGGR_TYPE_P (expr_type) && TYPE_FIELDS (expr_type))
601             /* Just use the field; anonymous types can't have
602                nontrivial copy ctors or assignment ops.  */;
603           else
604             continue;
605
606           /* Compute the type of "init->field".  If the copy-constructor
607              parameter is, for example, "const S&", and the type of
608              the field is "T", then the type will usually be "const
609              T".  (There are no cv-qualified variants of reference
610              types.)  */
611           if (TREE_CODE (expr_type) != REFERENCE_TYPE)
612             {
613               int quals = cvquals;
614
615               if (DECL_MUTABLE_P (field))
616                 quals &= ~TYPE_QUAL_CONST;
617               expr_type = cp_build_qualified_type (expr_type, quals);
618             }
619
620           init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE);
621           init = build_tree_list (NULL_TREE, init);
622
623           member_init_list = tree_cons (field, init, member_init_list);
624         }
625       finish_mem_initializers (member_init_list);
626     }
627 }
628
629 static void
630 do_build_assign_ref (tree fndecl)
631 {
632   tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
633   tree compound_stmt;
634
635   compound_stmt = begin_compound_stmt (0);
636   parm = convert_from_reference (parm);
637
638   if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type)
639       && is_empty_class (current_class_type))
640     /* Don't copy the padding byte; it might not have been allocated
641        if *this is a base subobject.  */;
642   else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type))
643     {
644       tree t = build2 (MODIFY_EXPR, void_type_node, current_class_ref, parm);
645       finish_expr_stmt (t);
646     }
647   else
648     {
649       tree fields;
650       int cvquals = cp_type_quals (TREE_TYPE (parm));
651       int i;
652       tree binfo, base_binfo;
653
654       /* Assign to each of the direct base classes.  */
655       for (binfo = TYPE_BINFO (current_class_type), i = 0;
656            BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
657         {
658           tree converted_parm;
659
660           /* We must convert PARM directly to the base class
661              explicitly since the base class may be ambiguous.  */
662           converted_parm = build_base_path (PLUS_EXPR, parm, base_binfo, 1);
663           /* Call the base class assignment operator.  */
664           finish_expr_stmt
665             (build_special_member_call (current_class_ref,
666                                         ansi_assopname (NOP_EXPR),
667                                         build_tree_list (NULL_TREE,
668                                                          converted_parm),
669                                         base_binfo,
670                                         LOOKUP_NORMAL | LOOKUP_NONVIRTUAL));
671         }
672
673       /* Assign to each of the non-static data members.  */
674       for (fields = TYPE_FIELDS (current_class_type);
675            fields;
676            fields = TREE_CHAIN (fields))
677         {
678           tree comp = current_class_ref;
679           tree init = parm;
680           tree field = fields;
681           tree expr_type;
682           int quals;
683
684           if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
685             continue;
686
687           expr_type = TREE_TYPE (field);
688
689           if (CP_TYPE_CONST_P (expr_type))
690             {
691               error ("non-static const member %q#D, can't use default "
692                      "assignment operator", field);
693               continue;
694             }
695           else if (TREE_CODE (expr_type) == REFERENCE_TYPE)
696             {
697               error ("non-static reference member %q#D, can't use "
698                      "default assignment operator", field);
699               continue;
700             }
701
702           if (DECL_NAME (field))
703             {
704               if (VFIELD_NAME_P (DECL_NAME (field)))
705                 continue;
706             }
707           else if (ANON_AGGR_TYPE_P (expr_type)
708                    && TYPE_FIELDS (expr_type) != NULL_TREE)
709             /* Just use the field; anonymous types can't have
710                nontrivial copy ctors or assignment ops.  */;
711           else
712             continue;
713
714           comp = build3 (COMPONENT_REF, expr_type, comp, field, NULL_TREE);
715
716           /* Compute the type of init->field  */
717           quals = cvquals;
718           if (DECL_MUTABLE_P (field))
719             quals &= ~TYPE_QUAL_CONST;
720           expr_type = cp_build_qualified_type (expr_type, quals);
721
722           init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE);
723
724           if (DECL_NAME (field))
725             init = build_modify_expr (comp, NOP_EXPR, init);
726           else
727             init = build2 (MODIFY_EXPR, TREE_TYPE (comp), comp, init);
728           finish_expr_stmt (init);
729         }
730     }
731   finish_return_stmt (current_class_ref);
732   finish_compound_stmt (compound_stmt);
733 }
734
735 /* Synthesize FNDECL, a non-static member function.   */
736
737 void
738 synthesize_method (tree fndecl)
739 {
740   bool nested = (current_function_decl != NULL_TREE);
741   tree context = decl_function_context (fndecl);
742   bool need_body = true;
743   tree stmt;
744   location_t save_input_location = input_location;
745   int error_count = errorcount;
746   int warning_count = warningcount;
747
748   /* Reset the source location, we might have been previously
749      deferred, and thus have saved where we were first needed.  */
750   DECL_SOURCE_LOCATION (fndecl)
751     = DECL_SOURCE_LOCATION (TYPE_NAME (DECL_CONTEXT (fndecl)));
752
753   /* If we've been asked to synthesize a clone, just synthesize the
754      cloned function instead.  Doing so will automatically fill in the
755      body for the clone.  */
756   if (DECL_CLONED_FUNCTION_P (fndecl))
757     fndecl = DECL_CLONED_FUNCTION (fndecl);
758
759   /* We may be in the middle of deferred access check.  Disable
760      it now.  */
761   push_deferring_access_checks (dk_no_deferred);
762
763   if (! context)
764     push_to_top_level ();
765   else if (nested)
766     push_function_context_to (context);
767
768   input_location = DECL_SOURCE_LOCATION (fndecl);
769
770   start_preparsed_function (fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
771   stmt = begin_function_body ();
772
773   if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR)
774     {
775       do_build_assign_ref (fndecl);
776       need_body = false;
777     }
778   else if (DECL_CONSTRUCTOR_P (fndecl))
779     {
780       tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl);
781       if (arg_chain != void_list_node)
782         do_build_copy_constructor (fndecl);
783       else if (TYPE_NEEDS_CONSTRUCTING (current_class_type))
784         finish_mem_initializers (NULL_TREE);
785     }
786
787   /* If we haven't yet generated the body of the function, just
788      generate an empty compound statement.  */
789   if (need_body)
790     {
791       tree compound_stmt;
792       compound_stmt = begin_compound_stmt (BCS_FN_BODY);
793       finish_compound_stmt (compound_stmt);
794     }
795
796   finish_function_body (stmt);
797   expand_or_defer_fn (finish_function (0));
798
799   input_location = save_input_location;
800
801   if (! context)
802     pop_from_top_level ();
803   else if (nested)
804     pop_function_context_from (context);
805
806   pop_deferring_access_checks ();
807
808   if (error_count != errorcount || warning_count != warningcount)
809     inform ("%Hsynthesized method %qD first required here ",
810             &input_location, fndecl);
811 }
812
813 /* Use EXTRACTOR to locate the relevant function called for each base &
814    class field of TYPE. CLIENT allows additional information to be passed
815    to EXTRACTOR.  Generates the union of all exceptions generated by those
816    functions.  Note that we haven't updated TYPE_FIELDS and such of any
817    variants yet, so we need to look at the main one.  */
818
819 static tree
820 synthesize_exception_spec (tree type, tree (*extractor) (tree, void*),
821                            void *client)
822 {
823   tree raises = empty_except_spec;
824   tree fields = TYPE_FIELDS (type);
825   tree binfo, base_binfo;
826   int i;
827
828   for (binfo = TYPE_BINFO (type), i = 0;
829        BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
830     {
831       tree fn = (*extractor) (BINFO_TYPE (base_binfo), client);
832       if (fn)
833         {
834           tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
835
836           raises = merge_exception_specifiers (raises, fn_raises);
837         }
838     }
839   for (; fields; fields = TREE_CHAIN (fields))
840     {
841       tree type = TREE_TYPE (fields);
842       tree fn;
843
844       if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
845         continue;
846       while (TREE_CODE (type) == ARRAY_TYPE)
847         type = TREE_TYPE (type);
848       if (!CLASS_TYPE_P (type))
849         continue;
850
851       fn = (*extractor) (type, client);
852       if (fn)
853         {
854           tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
855
856           raises = merge_exception_specifiers (raises, fn_raises);
857         }
858     }
859   return raises;
860 }
861
862 /* Locate the dtor of TYPE.  */
863
864 static tree
865 locate_dtor (tree type, void *client ATTRIBUTE_UNUSED)
866 {
867   return CLASSTYPE_DESTRUCTORS (type);
868 }
869
870 /* Locate the default ctor of TYPE.  */
871
872 static tree
873 locate_ctor (tree type, void *client ATTRIBUTE_UNUSED)
874 {
875   tree fns;
876
877   if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
878     return NULL_TREE;
879
880   /* Call lookup_fnfields_1 to create the constructor declarations, if
881      necessary.  */
882   if (CLASSTYPE_LAZY_DEFAULT_CTOR (type))
883     return lazily_declare_fn (sfk_constructor, type);
884
885   for (fns = CLASSTYPE_CONSTRUCTORS (type); fns; fns = OVL_NEXT (fns))
886     {
887       tree fn = OVL_CURRENT (fns);
888       tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
889
890       parms = skip_artificial_parms_for (fn, parms);
891
892       if (sufficient_parms_p (parms))
893         return fn;
894     }
895   gcc_unreachable ();
896 }
897
898 struct copy_data
899 {
900   tree name;
901   int quals;
902 };
903
904 /* Locate the copy ctor or copy assignment of TYPE. CLIENT_
905    points to a COPY_DATA holding the name (NULL for the ctor)
906    and desired qualifiers of the source operand.  */
907
908 static tree
909 locate_copy (tree type, void *client_)
910 {
911   struct copy_data *client = (struct copy_data *)client_;
912   tree fns;
913   tree best = NULL_TREE;
914   bool excess_p = false;
915
916   if (client->name)
917     {
918       int ix;
919       ix = lookup_fnfields_1 (type, client->name);
920       if (ix < 0)
921         return NULL_TREE;
922       fns = VEC_index (tree, CLASSTYPE_METHOD_VEC (type), ix);
923     }
924   else if (TYPE_HAS_INIT_REF (type))
925     {
926       /* If construction of the copy constructor was postponed, create
927          it now.  */
928       if (CLASSTYPE_LAZY_COPY_CTOR (type))
929         lazily_declare_fn (sfk_copy_constructor, type);
930       fns = CLASSTYPE_CONSTRUCTORS (type);
931     }
932   else
933     return NULL_TREE;
934   for (; fns; fns = OVL_NEXT (fns))
935     {
936       tree fn = OVL_CURRENT (fns);
937       tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
938       tree src_type;
939       int excess;
940       int quals;
941
942       parms = skip_artificial_parms_for (fn, parms);
943       if (!parms)
944         continue;
945       src_type = non_reference (TREE_VALUE (parms));
946       if (!same_type_ignoring_top_level_qualifiers_p (src_type, type))
947         continue;
948       if (!sufficient_parms_p (TREE_CHAIN (parms)))
949         continue;
950       quals = cp_type_quals (src_type);
951       if (client->quals & ~quals)
952         continue;
953       excess = quals & ~client->quals;
954       if (!best || (excess_p && !excess))
955         {
956           best = fn;
957           excess_p = excess;
958         }
959       else
960         /* Ambiguous */
961         return NULL_TREE;
962     }
963   return best;
964 }
965
966 /* Implicitly declare the special function indicated by KIND, as a
967    member of TYPE.  For copy constructors and assignment operators,
968    CONST_P indicates whether these functions should take a const
969    reference argument or a non-const reference.  Returns the
970    FUNCTION_DECL for the implicitly declared function.  */
971
972 static tree
973 implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
974 {
975   tree fn;
976   tree parameter_types = void_list_node;
977   tree return_type;
978   tree fn_type;
979   tree raises = empty_except_spec;
980   tree rhs_parm_type = NULL_TREE;
981   tree this_parm;
982   tree name;
983   HOST_WIDE_INT saved_processing_template_decl;
984
985   /* Because we create declarations for implicitly declared functions
986      lazily, we may be creating the declaration for a member of TYPE
987      while in some completely different context.  However, TYPE will
988      never be a dependent class (because we never want to do lookups
989      for implicitly defined functions in a dependent class).
990      Furthermore, we must set PROCESSING_TEMPLATE_DECL to zero here
991      because we only create clones for constructors and destructors
992      when not in a template.  */
993   gcc_assert (!dependent_type_p (type));
994   saved_processing_template_decl = processing_template_decl;
995   processing_template_decl = 0;
996
997   type = TYPE_MAIN_VARIANT (type);
998
999   if (targetm.cxx.cdtor_returns_this () && !TYPE_FOR_JAVA (type))
1000     {
1001       if (kind == sfk_destructor)
1002         /* See comment in check_special_function_return_type.  */
1003         return_type = build_pointer_type (void_type_node);
1004       else
1005         return_type = build_pointer_type (type);
1006     }
1007   else
1008     return_type = void_type_node;
1009
1010   switch (kind)
1011     {
1012     case sfk_destructor:
1013       /* Destructor.  */
1014       name = constructor_name (type);
1015       raises = synthesize_exception_spec (type, &locate_dtor, 0);
1016       break;
1017
1018     case sfk_constructor:
1019       /* Default constructor.  */
1020       name = constructor_name (type);
1021       raises = synthesize_exception_spec (type, &locate_ctor, 0);
1022       break;
1023
1024     case sfk_copy_constructor:
1025     case sfk_assignment_operator:
1026     {
1027       struct copy_data data;
1028
1029       data.name = NULL;
1030       data.quals = 0;
1031       if (kind == sfk_assignment_operator)
1032         {
1033           return_type = build_reference_type (type);
1034           name = ansi_assopname (NOP_EXPR);
1035           data.name = name;
1036         }
1037       else
1038         name = constructor_name (type);
1039
1040       if (const_p)
1041         {
1042           data.quals = TYPE_QUAL_CONST;
1043           rhs_parm_type = build_qualified_type (type, TYPE_QUAL_CONST);
1044         }
1045       else
1046         rhs_parm_type = type;
1047       rhs_parm_type = build_reference_type (rhs_parm_type);
1048       parameter_types = tree_cons (NULL_TREE, rhs_parm_type, parameter_types);
1049       raises = synthesize_exception_spec (type, &locate_copy, &data);
1050       break;
1051     }
1052     default:
1053       gcc_unreachable ();
1054     }
1055
1056   /* Create the function.  */
1057   fn_type = build_method_type_directly (type, return_type, parameter_types);
1058   if (raises)
1059     fn_type = build_exception_variant (fn_type, raises);
1060   fn = build_lang_decl (FUNCTION_DECL, name, fn_type);
1061   DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (TYPE_NAME (type));
1062   if (kind == sfk_constructor || kind == sfk_copy_constructor)
1063     DECL_CONSTRUCTOR_P (fn) = 1;
1064   else if (kind == sfk_destructor)
1065     DECL_DESTRUCTOR_P (fn) = 1;
1066   else
1067     {
1068       DECL_ASSIGNMENT_OPERATOR_P (fn) = 1;
1069       SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR);
1070     }
1071   /* Create the explicit arguments.  */
1072   if (rhs_parm_type)
1073     {
1074       /* Note that this parameter is *not* marked DECL_ARTIFICIAL; we
1075          want its type to be included in the mangled function
1076          name.  */
1077       DECL_ARGUMENTS (fn) = cp_build_parm_decl (NULL_TREE, rhs_parm_type);
1078       TREE_READONLY (DECL_ARGUMENTS (fn)) = 1;
1079     }
1080   /* Add the "this" parameter.  */ 
1081   this_parm = build_this_parm (fn_type, TYPE_UNQUALIFIED);
1082   TREE_CHAIN (this_parm) = DECL_ARGUMENTS (fn);
1083   DECL_ARGUMENTS (fn) = this_parm;
1084
1085   grokclassfn (type, fn, kind == sfk_destructor ? DTOR_FLAG : NO_SPECIAL);
1086   grok_special_member_properties (fn);
1087   set_linkage_according_to_type (type, fn);
1088   rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof);
1089   DECL_IN_AGGR_P (fn) = 1;
1090   DECL_ARTIFICIAL (fn) = 1;
1091   DECL_NOT_REALLY_EXTERN (fn) = 1;
1092   DECL_DECLARED_INLINE_P (fn) = 1;
1093   DECL_INLINE (fn) = 1;
1094   gcc_assert (!TREE_USED (fn));
1095
1096   /* Restore PROCESSING_TEMPLATE_DECL.  */
1097   processing_template_decl = saved_processing_template_decl;
1098
1099   return fn;
1100 }
1101
1102 /* Add an implicit declaration to TYPE for the kind of function
1103    indicated by SFK.  Return the FUNCTION_DECL for the new implicit
1104    declaration.  */
1105
1106 tree
1107 lazily_declare_fn (special_function_kind sfk, tree type)
1108 {
1109   tree fn;
1110   bool const_p;
1111
1112   /* Figure out whether or not the argument has a const reference
1113      type.  */
1114   if (sfk == sfk_copy_constructor)
1115     const_p = TYPE_HAS_CONST_INIT_REF (type);
1116   else if (sfk == sfk_assignment_operator)
1117     const_p = TYPE_HAS_CONST_ASSIGN_REF (type);
1118   else
1119     /* In this case, CONST_P will be ignored.  */
1120     const_p = false;
1121   /* Declare the function.  */
1122   fn = implicitly_declare_fn (sfk, type, const_p);
1123   /* A destructor may be virtual.  */
1124   if (sfk == sfk_destructor)
1125     check_for_override (fn, type);
1126   /* Add it to CLASSTYPE_METHOD_VEC.  */
1127   add_method (type, fn, NULL_TREE);
1128   /* Add it to TYPE_METHODS.  */
1129   if (sfk == sfk_destructor
1130       && DECL_VIRTUAL_P (fn)
1131       && abi_version_at_least (2))
1132     /* The ABI requires that a virtual destructor go at the end of the
1133        vtable.  */
1134     TYPE_METHODS (type) = chainon (TYPE_METHODS (type), fn);
1135   else
1136     {
1137       /* G++ 3.2 put the implicit destructor at the *beginning* of the
1138          TYPE_METHODS list, which cause the destructor to be emitted
1139          in an incorrect location in the vtable.  */
1140       if (warn_abi && DECL_VIRTUAL_P (fn))
1141         warning (OPT_Wabi, "vtable layout for class %qT may not be ABI-compliant"
1142                  "and may change in a future version of GCC due to "
1143                  "implicit virtual destructor",
1144                  type);
1145       TREE_CHAIN (fn) = TYPE_METHODS (type);
1146       TYPE_METHODS (type) = fn;
1147     }
1148   maybe_add_class_template_decl_list (type, fn, /*friend_p=*/0);
1149   if (sfk == sfk_assignment_operator)
1150     CLASSTYPE_LAZY_ASSIGNMENT_OP (type) = 0;
1151   else
1152     {
1153       /* Remember that the function has been created.  */
1154       if (sfk == sfk_constructor)
1155         CLASSTYPE_LAZY_DEFAULT_CTOR (type) = 0;
1156       else if (sfk == sfk_copy_constructor)
1157         CLASSTYPE_LAZY_COPY_CTOR (type) = 0;
1158       else if (sfk == sfk_destructor)
1159         CLASSTYPE_LAZY_DESTRUCTOR (type) = 0;
1160       /* Create appropriate clones.  */
1161       clone_function_decl (fn, /*update_method_vec=*/true);
1162     }
1163
1164   return fn;
1165 }
1166
1167 /* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
1168    as there are artificial parms in FN.  */
1169
1170 tree
1171 skip_artificial_parms_for (tree fn, tree list)
1172 {
1173   if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
1174     list = TREE_CHAIN (list);
1175   else
1176     return list;
1177
1178   if (DECL_HAS_IN_CHARGE_PARM_P (fn))
1179     list = TREE_CHAIN (list);
1180   if (DECL_HAS_VTT_PARM_P (fn))
1181     list = TREE_CHAIN (list);
1182   return list;
1183 }
1184
1185 #include "gt-cp-method.h"