OSDN Git Service

PR middle-end/18164
[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 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   /* Thunks are always addressable; they only appear in vtables.  */
332   TREE_ADDRESSABLE (thunk_fndecl) = 1;
333
334   /* Figure out what function is being thunked to.  It's referenced in
335      this translation unit.  */
336   TREE_ADDRESSABLE (function) = 1;
337   mark_used (function);
338   if (!emit_p)
339     return;
340
341   if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function))
342    alias = make_alias_for_thunk (function);
343   else
344    alias = function;
345
346   fixed_offset = THUNK_FIXED_OFFSET (thunk_fndecl);
347   virtual_offset = THUNK_VIRTUAL_OFFSET (thunk_fndecl);
348
349   if (virtual_offset)
350     {
351       if (!this_adjusting)
352         virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
353       virtual_value = tree_low_cst (virtual_offset, /*pos=*/0);
354       gcc_assert (virtual_value);
355     }
356   else
357     virtual_value = 0;
358   
359   /* And, if we need to emit the thunk, it's used.  */
360   mark_used (thunk_fndecl);
361   /* This thunk is actually defined.  */
362   DECL_EXTERNAL (thunk_fndecl) = 0;
363   /* The linkage of the function may have changed.  FIXME in linkage
364      rewrite.  */
365   TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function);
366   DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
367   DECL_VISIBILITY_SPECIFIED (thunk_fndecl) 
368     = DECL_VISIBILITY_SPECIFIED (function);
369   if (flag_weak && TREE_PUBLIC (thunk_fndecl))
370     comdat_linkage (thunk_fndecl);
371
372   if (flag_syntax_only)
373     {
374       TREE_ASM_WRITTEN (thunk_fndecl) = 1;
375       return;
376     }
377
378   push_to_top_level ();
379
380   if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function)
381       && targetm.have_named_sections)
382     {
383       resolve_unique_section (function, 0, flag_function_sections);
384
385       if (DECL_SECTION_NAME (function) != NULL && DECL_ONE_ONLY (function))
386         {
387           resolve_unique_section (thunk_fndecl, 0, flag_function_sections);
388
389           /* Output the thunk into the same section as function.  */
390           DECL_SECTION_NAME (thunk_fndecl) = DECL_SECTION_NAME (function);
391         }
392     }
393
394   /* The back-end expects DECL_INITIAL to contain a BLOCK, so we
395      create one.  */
396   DECL_INITIAL (thunk_fndecl) = make_node (BLOCK);
397
398   /* Set up cloned argument trees for the thunk.  */
399   t = NULL_TREE;
400   for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
401     {
402       tree x = copy_node (a);
403       TREE_CHAIN (x) = t;
404       DECL_CONTEXT (x) = thunk_fndecl;
405       SET_DECL_RTL (x, NULL_RTX);
406       t = x;
407     }
408   a = nreverse (t);
409   DECL_ARGUMENTS (thunk_fndecl) = a;
410   BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = a;
411   
412   if (this_adjusting
413       && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
414                                               virtual_value, alias))
415     {
416       const char *fnname;
417       current_function_decl = thunk_fndecl;
418       DECL_RESULT (thunk_fndecl)
419         = build_decl (RESULT_DECL, 0, integer_type_node);
420       fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0);
421       init_function_start (thunk_fndecl);
422       current_function_is_thunk = 1;
423       assemble_start_function (thunk_fndecl, fnname);
424
425       targetm.asm_out.output_mi_thunk (asm_out_file, thunk_fndecl,
426                                        fixed_offset, virtual_value, alias);
427
428       assemble_end_function (thunk_fndecl, fnname);
429       current_function_decl = 0;
430       cfun = 0;
431       TREE_ASM_WRITTEN (thunk_fndecl) = 1;
432     }
433   else
434     {
435       /* If this is a covariant thunk, or we don't have the necessary
436          code for efficient thunks, generate a thunk function that
437          just makes a call to the real function.  Unfortunately, this
438          doesn't work for varargs.  */
439
440       if (varargs_function_p (function))
441         error ("generic thunk code fails for method %q#D which uses %<...%>",
442                function);
443
444       DECL_RESULT (thunk_fndecl) = NULL_TREE;
445
446       start_preparsed_function (thunk_fndecl, NULL_TREE, SF_PRE_PARSED);
447       /* We don't bother with a body block for thunks.  */
448
449       /* There's no need to check accessibility inside the thunk body.  */
450       push_deferring_access_checks (dk_no_check);
451
452       t = a;
453       if (this_adjusting)
454         t = thunk_adjust (t, /*this_adjusting=*/1,
455                           fixed_offset, virtual_offset);
456       
457       /* Build up the call to the real function.  */
458       t = tree_cons (NULL_TREE, t, NULL_TREE);
459       for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a))
460         t = tree_cons (NULL_TREE, a, t);
461       t = nreverse (t);
462       t = build_call (alias, t);
463       CALL_FROM_THUNK_P (t) = 1;
464       
465       if (VOID_TYPE_P (TREE_TYPE (t)))
466         finish_expr_stmt (t);
467       else
468         {
469           t = force_target_expr (TREE_TYPE (t), t);
470           if (!this_adjusting)
471             t = thunk_adjust (t, /*this_adjusting=*/0,
472                               fixed_offset, virtual_offset);
473           finish_return_stmt (t);
474         }
475
476       /* Since we want to emit the thunk, we explicitly mark its name as
477          referenced.  */
478       mark_decl_referenced (thunk_fndecl);
479
480       /* But we don't want debugging information about it.  */
481       DECL_IGNORED_P (thunk_fndecl) = 1;
482
483       /* Re-enable access control.  */
484       pop_deferring_access_checks ();
485
486       expand_body (finish_function (0));
487     }
488
489   pop_from_top_level ();
490 }
491 \f
492 /* Code for synthesizing methods which have default semantics defined.  */
493
494 /* Generate code for default X(X&) constructor.  */
495
496 static void
497 do_build_copy_constructor (tree fndecl)
498 {
499   tree parm = FUNCTION_FIRST_USER_PARM (fndecl);
500   tree t;
501
502   parm = convert_from_reference (parm);
503
504   if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type)
505       && is_empty_class (current_class_type))
506     /* Don't copy the padding byte; it might not have been allocated
507        if *this is a base subobject.  */;
508   else if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type))
509     {
510       t = build2 (INIT_EXPR, void_type_node, current_class_ref, parm);
511       finish_expr_stmt (t);
512     }
513   else
514     {
515       tree fields = TYPE_FIELDS (current_class_type);
516       tree member_init_list = NULL_TREE;
517       int cvquals = cp_type_quals (TREE_TYPE (parm));
518       int i;
519       tree binfo, base_binfo;
520       VEC (tree) *vbases;
521
522       /* Initialize all the base-classes with the parameter converted
523          to their type so that we get their copy constructor and not
524          another constructor that takes current_class_type.  We must
525          deal with the binfo's directly as a direct base might be
526          inaccessible due to ambiguity.  */
527       for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
528            VEC_iterate (tree, vbases, i, binfo); i++)
529         {
530           member_init_list 
531             = tree_cons (binfo,
532                          build_tree_list (NULL_TREE,
533                                           build_base_path (PLUS_EXPR, parm,
534                                                            binfo, 1)),
535                          member_init_list);
536         }
537
538       for (binfo = TYPE_BINFO (current_class_type), i = 0;
539            BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
540         {
541           if (BINFO_VIRTUAL_P (base_binfo))
542             continue; 
543
544           member_init_list 
545             = tree_cons (base_binfo,
546                          build_tree_list (NULL_TREE,
547                                           build_base_path (PLUS_EXPR, parm,
548                                                            base_binfo, 1)),
549                          member_init_list);
550         }
551
552       for (; fields; fields = TREE_CHAIN (fields))
553         {
554           tree init;
555           tree field = fields;
556           tree expr_type;
557
558           if (TREE_CODE (field) != FIELD_DECL)
559             continue;
560
561           init = parm;
562           if (DECL_NAME (field))
563             {
564               if (VFIELD_NAME_P (DECL_NAME (field)))
565                 continue;
566             }
567           else if ((t = TREE_TYPE (field)) != NULL_TREE
568                    && ANON_AGGR_TYPE_P (t)
569                    && TYPE_FIELDS (t) != NULL_TREE)
570             /* Just use the field; anonymous types can't have
571                nontrivial copy ctors or assignment ops.  */;
572           else
573             continue;
574
575           /* Compute the type of "init->field".  If the copy-constructor
576              parameter is, for example, "const S&", and the type of
577              the field is "T", then the type will usually be "const
578              T".  (There are no cv-qualified variants of reference
579              types.)  */
580           expr_type = TREE_TYPE (field);
581           if (TREE_CODE (expr_type) != REFERENCE_TYPE)
582             expr_type = cp_build_qualified_type (expr_type, cvquals);
583           init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE);
584           init = build_tree_list (NULL_TREE, init);
585
586           member_init_list
587             = tree_cons (field, init, member_init_list);
588         }
589       finish_mem_initializers (member_init_list);
590     }
591 }
592
593 static void
594 do_build_assign_ref (tree fndecl)
595 {
596   tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
597   tree compound_stmt;
598
599   compound_stmt = begin_compound_stmt (0);
600   parm = convert_from_reference (parm);
601
602   if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type)
603       && is_empty_class (current_class_type))
604     /* Don't copy the padding byte; it might not have been allocated
605        if *this is a base subobject.  */;
606   else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type))
607     {
608       tree t = build2 (MODIFY_EXPR, void_type_node, current_class_ref, parm);
609       finish_expr_stmt (t);
610     }
611   else
612     {
613       tree fields;
614       int cvquals = cp_type_quals (TREE_TYPE (parm));
615       int i;
616       tree binfo, base_binfo;
617
618       /* Assign to each of the direct base classes.  */
619       for (binfo = TYPE_BINFO (current_class_type), i = 0;
620            BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
621         {
622           tree converted_parm;
623
624           /* We must convert PARM directly to the base class
625              explicitly since the base class may be ambiguous.  */
626           converted_parm = build_base_path (PLUS_EXPR, parm, base_binfo, 1);
627           /* Call the base class assignment operator.  */
628           finish_expr_stmt 
629             (build_special_member_call (current_class_ref, 
630                                         ansi_assopname (NOP_EXPR),
631                                         build_tree_list (NULL_TREE, 
632                                                          converted_parm),
633                                         base_binfo,
634                                         LOOKUP_NORMAL | LOOKUP_NONVIRTUAL));
635         }
636
637       /* Assign to each of the non-static data members.  */
638       for (fields = TYPE_FIELDS (current_class_type); 
639            fields; 
640            fields = TREE_CHAIN (fields))
641         {
642           tree comp, init, t;
643           tree field = fields;
644
645           if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
646             continue;
647
648           if (CP_TYPE_CONST_P (TREE_TYPE (field)))
649             {
650               error ("non-static const member %q#D, can't use default "
651                      "assignment operator", field);
652               continue;
653             }
654           else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE)
655             {
656               error ("non-static reference member %q#D, can't use "
657                      "default assignment operator", field);
658               continue;
659             }
660
661           comp = current_class_ref;
662           init = parm;
663
664           if (DECL_NAME (field))
665             {
666               if (VFIELD_NAME_P (DECL_NAME (field)))
667                 continue;
668             }
669           else if ((t = TREE_TYPE (field)) != NULL_TREE
670                    && ANON_AGGR_TYPE_P (t)
671                    && TYPE_FIELDS (t) != NULL_TREE)
672             /* Just use the field; anonymous types can't have
673                nontrivial copy ctors or assignment ops.  */;
674           else
675             continue;
676
677           comp = build3 (COMPONENT_REF, TREE_TYPE (field), comp, field,
678                          NULL_TREE);
679           init = build3 (COMPONENT_REF,
680                          cp_build_qualified_type (TREE_TYPE (field), cvquals),
681                          init, field, NULL_TREE);
682
683           if (DECL_NAME (field))
684             finish_expr_stmt (build_modify_expr (comp, NOP_EXPR, init));
685           else
686             finish_expr_stmt (build2 (MODIFY_EXPR, TREE_TYPE (comp), comp,
687                                       init));
688         }
689     }
690   finish_return_stmt (current_class_ref);
691   finish_compound_stmt (compound_stmt);
692 }
693
694 void
695 synthesize_method (tree fndecl)
696 {
697   bool nested = (current_function_decl != NULL_TREE);
698   tree context = decl_function_context (fndecl);
699   bool need_body = true;
700   tree stmt;
701
702   /* If we've been asked to synthesize a clone, just synthesize the
703      cloned function instead.  Doing so will automatically fill in the
704      body for the clone.  */
705   if (DECL_CLONED_FUNCTION_P (fndecl))
706     {
707       synthesize_method (DECL_CLONED_FUNCTION (fndecl));
708       return;
709     }
710
711   /* We may be in the middle of deferred access check.  Disable
712      it now.  */
713   push_deferring_access_checks (dk_no_deferred);
714
715   if (! context)
716     push_to_top_level ();
717   else if (nested)
718     push_function_context_to (context);
719
720   /* Put the function definition at the position where it is needed,
721      rather than within the body of the class.  That way, an error
722      during the generation of the implicit body points at the place
723      where the attempt to generate the function occurs, giving the
724      user a hint as to why we are attempting to generate the
725      function.  */
726   DECL_SOURCE_LOCATION (fndecl) = input_location;
727
728   start_preparsed_function (fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
729   stmt = begin_function_body ();
730
731   if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR)
732     {
733       do_build_assign_ref (fndecl);
734       need_body = false;
735     }
736   else if (DECL_CONSTRUCTOR_P (fndecl))
737     {
738       tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl);
739       if (arg_chain != void_list_node)
740         do_build_copy_constructor (fndecl);
741       else if (TYPE_NEEDS_CONSTRUCTING (current_class_type))
742         finish_mem_initializers (NULL_TREE);
743     }
744
745   /* If we haven't yet generated the body of the function, just
746      generate an empty compound statement.  */
747   if (need_body)
748     {
749       tree compound_stmt;
750       compound_stmt = begin_compound_stmt (BCS_FN_BODY);
751       finish_compound_stmt (compound_stmt);
752     }
753
754   finish_function_body (stmt);
755   expand_or_defer_fn (finish_function (0));
756
757   if (! context)
758     pop_from_top_level ();
759   else if (nested)
760     pop_function_context_from (context);
761
762   pop_deferring_access_checks ();
763 }
764
765 /* Use EXTRACTOR to locate the relevant function called for each base &
766    class field of TYPE. CLIENT allows additional information to be passed
767    to EXTRACTOR.  Generates the union of all exceptions generated by those
768    functions.  Note that we haven't updated TYPE_FIELDS and such of any
769    variants yet, so we need to look at the main one.  */
770
771 static tree
772 synthesize_exception_spec (tree type, tree (*extractor) (tree, void*),
773                            void *client)
774 {
775   tree raises = empty_except_spec;
776   tree fields = TYPE_FIELDS (type);
777   tree binfo, base_binfo;
778   int i;
779
780   for (binfo = TYPE_BINFO (type), i = 0;
781        BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
782     {
783       tree fn = (*extractor) (BINFO_TYPE (base_binfo), client);
784       if (fn)
785         {
786           tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
787           
788           raises = merge_exception_specifiers (raises, fn_raises);
789         }
790     }
791   for (; fields; fields = TREE_CHAIN (fields))
792     {
793       tree type = TREE_TYPE (fields);
794       tree fn;
795       
796       if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
797         continue;
798       while (TREE_CODE (type) == ARRAY_TYPE)
799         type = TREE_TYPE (type);
800       if (TREE_CODE (type) != RECORD_TYPE)
801         continue;
802       
803       fn = (*extractor) (type, client);
804       if (fn)
805         {
806           tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
807           
808           raises = merge_exception_specifiers (raises, fn_raises);
809         }
810     }
811   return raises;
812 }
813
814 /* Locate the dtor of TYPE.  */
815
816 static tree
817 locate_dtor (tree type, void *client ATTRIBUTE_UNUSED)
818 {
819   return (CLASSTYPE_METHOD_VEC (type) 
820           ? CLASSTYPE_DESTRUCTORS (type) 
821           : NULL_TREE);
822 }
823
824 /* Locate the default ctor of TYPE.  */
825
826 static tree
827 locate_ctor (tree type, void *client ATTRIBUTE_UNUSED)
828 {
829   tree fns;
830   
831   if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
832     return NULL_TREE;
833
834   /* Call lookup_fnfields_1 to create the constructor declarations, if
835      necessary.  */
836   if (CLASSTYPE_LAZY_DEFAULT_CTOR (type))
837     return lazily_declare_fn (sfk_constructor, type);
838
839   for (fns = CLASSTYPE_CONSTRUCTORS (type); fns; fns = OVL_NEXT (fns))
840     {
841       tree fn = OVL_CURRENT (fns);
842       tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
843       
844       if (sufficient_parms_p (TREE_CHAIN (parms)))
845         return fn;
846     }
847   return NULL_TREE;
848 }
849
850 struct copy_data
851 {
852   tree name;
853   int quals;
854 };
855
856 /* Locate the copy ctor or copy assignment of TYPE. CLIENT_
857    points to a COPY_DATA holding the name (NULL for the ctor)
858    and desired qualifiers of the source operand.  */
859
860 static tree
861 locate_copy (tree type, void *client_)
862 {
863   struct copy_data *client = (struct copy_data *)client_;
864   tree fns;
865   tree best = NULL_TREE;
866   bool excess_p = false;
867   
868   if (client->name)
869     {
870       int ix;
871       ix = lookup_fnfields_1 (type, client->name);
872       if (ix < 0)
873         return NULL_TREE;
874       fns = VEC_index (tree, CLASSTYPE_METHOD_VEC (type), ix);
875     }
876   else if (TYPE_HAS_INIT_REF (type))
877     {
878       /* If construction of the copy constructor was postponed, create
879          it now.  */
880       if (CLASSTYPE_LAZY_COPY_CTOR (type))
881         lazily_declare_fn (sfk_copy_constructor, type);
882       fns = CLASSTYPE_CONSTRUCTORS (type);
883     }
884   else
885     return NULL_TREE;
886   for (; fns; fns = OVL_NEXT (fns))
887     {
888       tree fn = OVL_CURRENT (fns);
889       tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
890       tree src_type;
891       int excess;
892       int quals;
893       
894       parms = TREE_CHAIN (parms);
895       if (!parms)
896         continue;
897       src_type = non_reference (TREE_VALUE (parms));
898       if (!same_type_ignoring_top_level_qualifiers_p (src_type, type))
899         continue;
900       if (!sufficient_parms_p (TREE_CHAIN (parms)))
901         continue;
902       quals = cp_type_quals (src_type);
903       if (client->quals & ~quals)
904         continue;
905       excess = quals & ~client->quals;
906       if (!best || (excess_p && !excess))
907         {
908           best = fn;
909           excess_p = excess;
910         }
911       else
912         /* Ambiguous */
913         return NULL_TREE;
914     }
915   return best;
916 }
917
918 /* Implicitly declare the special function indicated by KIND, as a
919    member of TYPE.  For copy constructors and assignment operators,
920    CONST_P indicates whether these functions should take a const
921    reference argument or a non-const reference.  */
922
923 tree
924 implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
925 {
926   tree fn;
927   tree parameter_types = void_list_node;
928   tree return_type;
929   tree fn_type;
930   tree raises = empty_except_spec;
931   tree rhs_parm_type = NULL_TREE;
932   tree name;
933
934   type = TYPE_MAIN_VARIANT (type);
935
936   if (targetm.cxx.cdtor_returns_this () && !TYPE_FOR_JAVA (type))
937     {
938       if (kind == sfk_destructor)
939         /* See comment in check_special_function_return_type.  */
940         return_type = build_pointer_type (void_type_node);
941       else
942         return_type = build_pointer_type (type);
943     }
944   else
945     return_type = void_type_node;
946
947   switch (kind)
948     {
949     case sfk_destructor:
950       /* Destructor.  */
951       name = constructor_name (type);
952       raises = synthesize_exception_spec (type, &locate_dtor, 0);
953       break;
954
955     case sfk_constructor:
956       /* Default constructor.  */
957       name = constructor_name (type);
958       raises = synthesize_exception_spec (type, &locate_ctor, 0);
959       break;
960
961     case sfk_copy_constructor:
962     case sfk_assignment_operator:
963     {
964       struct copy_data data;
965       
966       data.name = NULL;
967       data.quals = 0;
968       if (kind == sfk_assignment_operator)
969         {
970           return_type = build_reference_type (type);
971           name = ansi_assopname (NOP_EXPR);
972           data.name = name;
973         }
974       else
975         name = constructor_name (type);
976
977       if (const_p)
978         {
979           data.quals = TYPE_QUAL_CONST;
980           rhs_parm_type = build_qualified_type (type, TYPE_QUAL_CONST);
981         }
982       else
983         rhs_parm_type = type;
984       rhs_parm_type = build_reference_type (rhs_parm_type);
985       parameter_types = tree_cons (NULL_TREE, rhs_parm_type, parameter_types);
986       raises = synthesize_exception_spec (type, &locate_copy, &data);
987       break;
988     }
989     default:
990       gcc_unreachable ();
991     }
992
993   /* Create the function.  */
994   fn_type = build_method_type_directly (type, return_type, parameter_types);
995   if (raises)
996     fn_type = build_exception_variant (fn_type, raises);
997   fn = build_lang_decl (FUNCTION_DECL, name, fn_type);
998   DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (TYPE_NAME (type));
999   if (kind == sfk_constructor || kind == sfk_copy_constructor)
1000     DECL_CONSTRUCTOR_P (fn) = 1;
1001   else if (kind == sfk_destructor)
1002     DECL_DESTRUCTOR_P (fn) = 1;
1003   else
1004     {
1005       DECL_ASSIGNMENT_OPERATOR_P (fn) = 1;
1006       SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR);
1007     }
1008   /* Create the argument list.  The call to "grokclassfn" will add the
1009      "this" parameter and any other implicit parameters.  */
1010   if (rhs_parm_type)
1011     {
1012       /* Note that this parameter is *not* marked DECL_ARTIFICIAL; we
1013          want its type to be included in the mangled function
1014          name.  */
1015       DECL_ARGUMENTS (fn) = cp_build_parm_decl (NULL_TREE, rhs_parm_type);
1016       TREE_READONLY (DECL_ARGUMENTS (fn)) = 1;
1017     }
1018
1019   grokclassfn (type, fn, kind == sfk_destructor ? DTOR_FLAG : NO_SPECIAL,
1020                TYPE_UNQUALIFIED);
1021   grok_special_member_properties (fn);
1022   set_linkage_according_to_type (type, fn);
1023   rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof);
1024   DECL_IN_AGGR_P (fn) = 1;
1025   DECL_ARTIFICIAL (fn) = 1;
1026   DECL_NOT_REALLY_EXTERN (fn) = 1;
1027   DECL_DECLARED_INLINE_P (fn) = 1;
1028   DECL_INLINE (fn) = 1;
1029   gcc_assert (!TREE_USED (fn));
1030   
1031   return fn;
1032 }
1033
1034 /* Add an implicit declaration to TYPE for the kind of function
1035    indicated by SFK.  Return the FUNCTION_DECL for the new implicit
1036    declaration.  */
1037
1038 tree
1039 lazily_declare_fn (special_function_kind sfk, tree type)
1040 {
1041   tree fn;
1042   bool const_p;
1043
1044   /* Figure out whether or not the argument has a const reference
1045      type.  */
1046   if (sfk == sfk_copy_constructor)
1047     const_p = TYPE_HAS_CONST_INIT_REF (type);
1048   else if (sfk == sfk_assignment_operator)
1049     const_p = TYPE_HAS_CONST_ASSIGN_REF (type);
1050   else
1051     /* In this case, CONST_P will be ignored.  */
1052     const_p = false;
1053   /* Declare the function.  */
1054   fn = implicitly_declare_fn (sfk, type, const_p);
1055   /* Add it to CLASSTYPE_METHOD_VEC.  */
1056   add_method (type, fn);
1057   /* Add it to TYPE_METHODS.  */
1058   TREE_CHAIN (fn) = TYPE_METHODS (type);
1059   TYPE_METHODS (type) = fn;
1060   maybe_add_class_template_decl_list (type, fn, /*friend_p=*/0);
1061   if (sfk == sfk_constructor || sfk == sfk_copy_constructor)
1062     {
1063       /* Remember that the function has been created.  */
1064       if (sfk == sfk_constructor)
1065         CLASSTYPE_LAZY_DEFAULT_CTOR (type) = 0;
1066       else
1067         CLASSTYPE_LAZY_COPY_CTOR (type) = 0;
1068       /* Create appropriate clones.  */
1069       clone_function_decl (fn, /*update_method_vec=*/true);
1070     }
1071   else if (sfk == sfk_assignment_operator)
1072     CLASSTYPE_LAZY_ASSIGNMENT_OP (type) = 0;
1073
1074   return fn;
1075 }
1076
1077 /* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
1078    as there are artificial parms in FN.  */
1079
1080 tree
1081 skip_artificial_parms_for (tree fn, tree list)
1082 {
1083   if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
1084     list = TREE_CHAIN (list);
1085   else
1086     return list;
1087
1088   if (DECL_HAS_IN_CHARGE_PARM_P (fn))
1089     list = TREE_CHAIN (list);
1090   if (DECL_HAS_VTT_PARM_P (fn))
1091     list = TREE_CHAIN (list);
1092   return list;
1093 }
1094
1095 #include "gt-cp-method.h"