OSDN Git Service

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