OSDN Git Service

Use vector API for vbase list.
[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   my_friendly_assert (TREE_CODE (function) == FUNCTION_DECL, 20021025);
92   /* We can have this thunks to covariant thunks, but not vice versa.  */
93   my_friendly_assert (!DECL_THIS_THUNK_P (function), 20021127);
94   my_friendly_assert (!DECL_RESULT_THUNK_P (function) || this_adjusting,
95                       20031123);
96   
97   /* Scale the VIRTUAL_OFFSET to be in terms of bytes.  */
98   if (this_adjusting && virtual_offset)
99     virtual_offset 
100       = size_binop (MULT_EXPR,
101                     virtual_offset,
102                     convert (ssizetype,
103                              TYPE_SIZE_UNIT (vtable_entry_type)));
104   
105   d = tree_low_cst (fixed_offset, 0);
106   
107   /* See if we already have the thunk in question.  For this_adjusting
108      thunks VIRTUAL_OFFSET will be an INTEGER_CST, for covariant thunks it
109      will be a BINFO.  */
110   for (thunk = DECL_THUNKS (function); thunk; thunk = TREE_CHAIN (thunk))
111     if (DECL_THIS_THUNK_P (thunk) == this_adjusting
112         && THUNK_FIXED_OFFSET (thunk) == d
113         && !virtual_offset == !THUNK_VIRTUAL_OFFSET (thunk)
114         && (!virtual_offset
115             || (this_adjusting
116                 ? tree_int_cst_equal (THUNK_VIRTUAL_OFFSET (thunk),
117                                       virtual_offset)
118                 : THUNK_VIRTUAL_OFFSET (thunk) == virtual_offset)))
119       return thunk;
120   
121   /* All thunks must be created before FUNCTION is actually emitted;
122      the ABI requires that all thunks be emitted together with the
123      function to which they transfer control.  */
124   my_friendly_assert (!TREE_ASM_WRITTEN (function), 20021025);
125   /* Likewise, we can only be adding thunks to a function declared in
126      the class currently being laid out.  */
127   my_friendly_assert (TYPE_SIZE (DECL_CONTEXT (function))
128                       && TYPE_BEING_DEFINED (DECL_CONTEXT (function)),
129                       20031211);
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   if (flag_weak)
141     comdat_linkage (thunk);
142   SET_DECL_THUNK_P (thunk, this_adjusting);
143   THUNK_TARGET (thunk) = function;
144   THUNK_FIXED_OFFSET (thunk) = d;
145   THUNK_VIRTUAL_OFFSET (thunk) = virtual_offset;
146   THUNK_ALIAS (thunk) = NULL_TREE;
147   
148   /* The thunk itself is not a constructor or destructor, even if
149      the thing it is thunking to is.  */
150   DECL_INTERFACE_KNOWN (thunk) = 1;
151   DECL_NOT_REALLY_EXTERN (thunk) = 1;
152   DECL_SAVED_FUNCTION_DATA (thunk) = NULL;
153   DECL_DESTRUCTOR_P (thunk) = 0;
154   DECL_CONSTRUCTOR_P (thunk) = 0;
155   /* And neither is it a clone.  */
156   DECL_CLONED_FUNCTION (thunk) = NULL_TREE;
157   DECL_EXTERNAL (thunk) = 1;
158   DECL_ARTIFICIAL (thunk) = 1;
159   /* Even if this thunk is a member of a local class, we don't
160      need a static chain.  */
161   DECL_NO_STATIC_CHAIN (thunk) = 1;
162   /* The THUNK is not a pending inline, even if the FUNCTION is.  */
163   DECL_PENDING_INLINE_P (thunk) = 0;
164   DECL_INLINE (thunk) = 0;
165   DECL_DECLARED_INLINE_P (thunk) = 0;
166   /* Nor has it been deferred.  */
167   DECL_DEFERRED_FN (thunk) = 0;
168   
169   /* Add it to the list of thunks associated with FUNCTION.  */
170   TREE_CHAIN (thunk) = DECL_THUNKS (function);
171   DECL_THUNKS (function) = thunk;
172
173   return thunk;
174 }
175
176 /* Finish THUNK, a thunk decl.  */
177
178 void
179 finish_thunk (tree thunk)
180 {
181   tree function, name;
182   tree fixed_offset = ssize_int (THUNK_FIXED_OFFSET (thunk));
183   tree virtual_offset = THUNK_VIRTUAL_OFFSET (thunk);
184
185   my_friendly_assert (!DECL_NAME (thunk) && DECL_THUNK_P (thunk), 20021127);
186   if (virtual_offset && DECL_RESULT_THUNK_P (thunk))
187     virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
188   function = THUNK_TARGET (thunk);
189   name = mangle_thunk (function, DECL_THIS_THUNK_P (thunk),
190                        fixed_offset, virtual_offset);
191
192   /* We can end up with declarations of (logically) different
193      covariant thunks, that do identical adjustments.  The two thunks
194      will be adjusting between within different hierarchies, which
195      happen to have the same layout.  We must nullify one of them to
196      refer to the other.  */
197   if (DECL_RESULT_THUNK_P (thunk))
198     {
199       tree cov_probe;
200
201       for (cov_probe = DECL_THUNKS (function);
202            cov_probe; cov_probe = TREE_CHAIN (cov_probe))
203         if (DECL_NAME (cov_probe) == name)
204           {
205             my_friendly_assert (!DECL_THUNKS (thunk), 20031023);
206             THUNK_ALIAS (thunk) = (THUNK_ALIAS (cov_probe)
207                                    ? THUNK_ALIAS (cov_probe) : cov_probe);
208             break;
209           }
210     }
211   
212   DECL_NAME (thunk) = name;
213   SET_DECL_ASSEMBLER_NAME (thunk, name);
214 }
215
216 /* Adjust PTR by the constant FIXED_OFFSET, and by the vtable
217    offset indicated by VIRTUAL_OFFSET, if that is
218    non-null. THIS_ADJUSTING is nonzero for a this adjusting thunk and
219    zero for a result adjusting thunk.  */
220
221 static tree
222 thunk_adjust (tree ptr, bool this_adjusting,
223               HOST_WIDE_INT fixed_offset, tree virtual_offset)
224 {
225   if (this_adjusting)
226     /* Adjust the pointer by the constant.  */
227     ptr = fold (build (PLUS_EXPR, TREE_TYPE (ptr), ptr,
228                        ssize_int (fixed_offset)));
229
230   /* If there's a virtual offset, look up that value in the vtable and
231      adjust the pointer again.  */
232   if (virtual_offset)
233     {
234       tree vtable;
235
236       ptr = save_expr (ptr);
237       /* The vptr is always at offset zero in the object.  */
238       vtable = build1 (NOP_EXPR,
239                        build_pointer_type (build_pointer_type 
240                                            (vtable_entry_type)),
241                        ptr);
242       /* Form the vtable address.  */
243       vtable = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (vtable)), vtable);
244       /* Find the entry with the vcall offset.  */
245       vtable = build (PLUS_EXPR, TREE_TYPE (vtable), vtable, virtual_offset);
246       /* Get the offset itself.  */
247       vtable = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (vtable)), vtable);
248       /* Adjust the `this' pointer.  */
249       ptr = fold (build (PLUS_EXPR, TREE_TYPE (ptr), ptr, vtable));
250     }
251   
252   if (!this_adjusting)
253     /* Adjust the pointer by the constant.  */
254     ptr = fold (build (PLUS_EXPR, TREE_TYPE (ptr), ptr,
255                        ssize_int (fixed_offset)));
256
257   return ptr;
258 }
259
260 static GTY (()) int thunk_labelno;
261
262 /* Create a static alias to function.  */
263
264 static tree
265 make_alias_for_thunk (tree function)
266 {
267   tree alias;
268   char buf[256];
269
270   ASM_GENERATE_INTERNAL_LABEL (buf, "LTHUNK", thunk_labelno);
271   thunk_labelno++;
272   alias = build_decl (FUNCTION_DECL, get_identifier (buf),
273                       TREE_TYPE (function));
274   DECL_LANG_SPECIFIC (alias) = DECL_LANG_SPECIFIC (function);
275   cxx_dup_lang_specific_decl (alias);
276   DECL_CONTEXT (alias) = NULL;
277   TREE_READONLY (alias) = TREE_READONLY (function);
278   TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (function);
279   TREE_PUBLIC (alias) = 0;
280   DECL_INTERFACE_KNOWN (alias) = 1;
281   DECL_NOT_REALLY_EXTERN (alias) = 1;
282   DECL_THIS_STATIC (alias) = 1;
283   DECL_SAVED_FUNCTION_DATA (alias) = NULL;
284   DECL_DESTRUCTOR_P (alias) = 0;
285   DECL_CONSTRUCTOR_P (alias) = 0;
286   DECL_CLONED_FUNCTION (alias) = NULL_TREE;
287   DECL_EXTERNAL (alias) = 0;
288   DECL_ARTIFICIAL (alias) = 1;
289   DECL_NO_STATIC_CHAIN (alias) = 1;
290   DECL_PENDING_INLINE_P (alias) = 0;
291   DECL_INLINE (alias) = 0;
292   DECL_DECLARED_INLINE_P (alias) = 0;
293   DECL_DEFERRED_FN (alias) = 0;
294   DECL_USE_TEMPLATE (alias) = 0;
295   DECL_TEMPLATE_INSTANTIATED (alias) = 0;
296   DECL_TEMPLATE_INFO (alias) = NULL;
297   DECL_INITIAL (alias) = error_mark_node;
298   TREE_ADDRESSABLE (alias) = 1;
299   TREE_USED (alias) = 1;
300   SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
301   TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
302   if (!flag_syntax_only)
303     assemble_alias (alias, DECL_ASSEMBLER_NAME (function));
304   return alias;
305 }
306
307 /* Emit the definition of a C++ multiple inheritance or covariant
308    return vtable thunk.  If EMIT_P is nonzero, the thunk is emitted
309    immediately.  */
310
311 void
312 use_thunk (tree thunk_fndecl, bool emit_p)
313 {
314   tree a, t, function, alias;
315   tree virtual_offset;
316   HOST_WIDE_INT fixed_offset, virtual_value;
317   bool this_adjusting = DECL_THIS_THUNK_P (thunk_fndecl);
318
319   /* We should have called finish_thunk to give it a name.  */
320   my_friendly_assert (DECL_NAME (thunk_fndecl), 20021127);
321
322   /* We should never be using an alias, always refer to the
323      aliased thunk.  */
324   my_friendly_assert (!THUNK_ALIAS (thunk_fndecl), 20031023);
325
326   if (TREE_ASM_WRITTEN (thunk_fndecl))
327     return;
328   
329   function = THUNK_TARGET (thunk_fndecl);
330   if (DECL_RESULT (thunk_fndecl))
331     /* We already turned this thunk into an ordinary function.
332        There's no need to process this thunk again.  */
333     return;
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       my_friendly_assert (virtual_value, 20021026);
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   if (flag_weak && TREE_PUBLIC (thunk_fndecl))
372     comdat_linkage (thunk_fndecl);
373
374   if (flag_syntax_only)
375     {
376       TREE_ASM_WRITTEN (thunk_fndecl) = 1;
377       return;
378     }
379
380   push_to_top_level ();
381
382   if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function)
383       && targetm.have_named_sections)
384     {
385       resolve_unique_section (function, 0, flag_function_sections);
386
387       if (DECL_SECTION_NAME (function) != NULL && DECL_ONE_ONLY (function))
388         {
389           resolve_unique_section (thunk_fndecl, 0, flag_function_sections);
390
391           /* Output the thunk into the same section as function.  */
392           DECL_SECTION_NAME (thunk_fndecl) = DECL_SECTION_NAME (function);
393         }
394     }
395
396   /* The back-end expects DECL_INITIAL to contain a BLOCK, so we
397      create one.  */
398   DECL_INITIAL (thunk_fndecl) = make_node (BLOCK);
399
400   /* Set up cloned argument trees for the thunk.  */
401   t = NULL_TREE;
402   for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
403     {
404       tree x = copy_node (a);
405       TREE_CHAIN (x) = t;
406       DECL_CONTEXT (x) = thunk_fndecl;
407       SET_DECL_RTL (x, NULL_RTX);
408       t = x;
409     }
410   a = nreverse (t);
411   DECL_ARGUMENTS (thunk_fndecl) = a;
412   BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = a;
413   
414   if (this_adjusting
415       && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
416                                               virtual_value, alias))
417     {
418       const char *fnname;
419       current_function_decl = thunk_fndecl;
420       DECL_RESULT (thunk_fndecl)
421         = build_decl (RESULT_DECL, 0, integer_type_node);
422       fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0);
423       init_function_start (thunk_fndecl);
424       current_function_is_thunk = 1;
425       assemble_start_function (thunk_fndecl, fnname);
426
427       targetm.asm_out.output_mi_thunk (asm_out_file, thunk_fndecl,
428                                        fixed_offset, virtual_value, alias);
429
430       assemble_end_function (thunk_fndecl, fnname);
431       current_function_decl = 0;
432       cfun = 0;
433       /* Because init_function_start increments this, we must
434          decrement it.  */
435       immediate_size_expand--;
436       TREE_ASM_WRITTEN (thunk_fndecl) = 1;
437     }
438   else
439     {
440       /* If this is a covariant thunk, or we don't have the necessary
441          code for efficient thunks, generate a thunk function that
442          just makes a call to the real function.  Unfortunately, this
443          doesn't work for varargs.  */
444
445       if (varargs_function_p (function))
446         error ("generic thunk code fails for method `%#D' which uses `...'",
447                function);
448
449       DECL_RESULT (thunk_fndecl) = NULL_TREE;
450
451       start_preparsed_function (thunk_fndecl, NULL_TREE, SF_PRE_PARSED);
452       /* We don't bother with a body block for thunks.  */
453
454       /* There's no need to check accessibility inside the thunk body.  */
455       push_deferring_access_checks (dk_no_check);
456
457       t = a;
458       if (this_adjusting)
459         t = thunk_adjust (t, /*this_adjusting=*/1,
460                           fixed_offset, virtual_offset);
461       
462       /* Build up the call to the real function.  */
463       t = tree_cons (NULL_TREE, t, NULL_TREE);
464       for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a))
465         t = tree_cons (NULL_TREE, a, t);
466       t = nreverse (t);
467       t = build_call (alias, t);
468       CALL_FROM_THUNK_P (t) = 1;
469       
470       if (VOID_TYPE_P (TREE_TYPE (t)))
471         finish_expr_stmt (t);
472       else
473         {
474           t = force_target_expr (TREE_TYPE (t), t);
475           if (!this_adjusting)
476             t = thunk_adjust (t, /*this_adjusting=*/0,
477                               fixed_offset, virtual_offset);
478           finish_return_stmt (t);
479         }
480
481       /* Since we want to emit the thunk, we explicitly mark its name as
482          referenced.  */
483       mark_decl_referenced (thunk_fndecl);
484
485       /* But we don't want debugging information about it.  */
486       DECL_IGNORED_P (thunk_fndecl) = 1;
487
488       /* Re-enable access control.  */
489       pop_deferring_access_checks ();
490
491       expand_body (finish_function (0));
492     }
493
494   pop_from_top_level ();
495 }
496 \f
497 /* Code for synthesizing methods which have default semantics defined.  */
498
499 /* Generate code for default X(X&) constructor.  */
500
501 static void
502 do_build_copy_constructor (tree fndecl)
503 {
504   tree parm = FUNCTION_FIRST_USER_PARM (fndecl);
505   tree t;
506
507   parm = convert_from_reference (parm);
508
509   if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type)
510       && is_empty_class (current_class_type))
511     /* Don't copy the padding byte; it might not have been allocated
512        if *this is a base subobject.  */;
513   else if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type))
514     {
515       t = build (INIT_EXPR, void_type_node, current_class_ref, parm);
516       finish_expr_stmt (t);
517     }
518   else
519     {
520       tree fields = TYPE_FIELDS (current_class_type);
521       int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type);
522       tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
523       tree member_init_list = NULL_TREE;
524       int cvquals = cp_type_quals (TREE_TYPE (parm));
525       int i;
526       tree binfo;
527
528       /* Initialize all the base-classes with the parameter converted
529          to their type so that we get their copy constructor and not
530          another constructor that takes current_class_type.  We must
531          deal with the binfo's directly as a direct base might be
532          inaccessible due to ambiguity.  */
533       for (i = 0; (binfo = VEC_iterate
534                    (tree, CLASSTYPE_VBASECLASSES (current_class_type), i));
535            i++)
536         {
537           member_init_list 
538             = tree_cons (binfo,
539                          build_tree_list (NULL_TREE,
540                                           build_base_path (PLUS_EXPR, parm,
541                                                            binfo, 1)),
542                          member_init_list);
543         }
544
545       for (i = 0; i < n_bases; ++i)
546         {
547           tree binfo = TREE_VEC_ELT (binfos, i);
548           if (TREE_VIA_VIRTUAL (binfo))
549             continue; 
550
551           member_init_list 
552             = tree_cons (binfo,
553                          build_tree_list (NULL_TREE,
554                                           build_base_path (PLUS_EXPR, parm,
555                                                            binfo, 1)),
556                          member_init_list);
557         }
558
559       for (; fields; fields = TREE_CHAIN (fields))
560         {
561           tree init;
562           tree field = fields;
563           tree expr_type;
564
565           if (TREE_CODE (field) != FIELD_DECL)
566             continue;
567
568           init = parm;
569           if (DECL_NAME (field))
570             {
571               if (VFIELD_NAME_P (DECL_NAME (field)))
572                 continue;
573
574               /* True for duplicate members.  */
575               if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
576                 continue;
577             }
578           else if ((t = TREE_TYPE (field)) != NULL_TREE
579                    && ANON_AGGR_TYPE_P (t)
580                    && TYPE_FIELDS (t) != NULL_TREE)
581             /* Just use the field; anonymous types can't have
582                nontrivial copy ctors or assignment ops.  */;
583           else
584             continue;
585
586           /* Compute the type of "init->field".  If the copy-constructor
587              parameter is, for example, "const S&", and the type of
588              the field is "T", then the type will usually be "const
589              T".  (There are no cv-qualified variants of reference
590              types.)  */
591           expr_type = TREE_TYPE (field);
592           if (TREE_CODE (expr_type) != REFERENCE_TYPE)
593             expr_type = cp_build_qualified_type (expr_type, cvquals);
594           init = build (COMPONENT_REF, expr_type, init, field, NULL_TREE);
595           init = build_tree_list (NULL_TREE, init);
596
597           member_init_list
598             = tree_cons (field, init, member_init_list);
599         }
600       finish_mem_initializers (member_init_list);
601     }
602 }
603
604 static void
605 do_build_assign_ref (tree fndecl)
606 {
607   tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
608   tree compound_stmt;
609
610   compound_stmt = begin_compound_stmt (0);
611   parm = convert_from_reference (parm);
612
613   if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type)
614       && is_empty_class (current_class_type))
615     /* Don't copy the padding byte; it might not have been allocated
616        if *this is a base subobject.  */;
617   else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type))
618     {
619       tree t = build (MODIFY_EXPR, void_type_node, current_class_ref, parm);
620       finish_expr_stmt (t);
621     }
622   else
623     {
624       tree fields;
625       int cvquals = cp_type_quals (TREE_TYPE (parm));
626       int i;
627
628       /* Assign to each of the direct base classes.  */
629       for (i = 0; i < CLASSTYPE_N_BASECLASSES (current_class_type); ++i)
630         {
631           tree binfo;
632           tree converted_parm;
633
634           binfo = BINFO_BASETYPE (TYPE_BINFO (current_class_type), i);
635           /* We must convert PARM directly to the base class
636              explicitly since the base class may be ambiguous.  */
637           converted_parm = build_base_path (PLUS_EXPR, parm, binfo, 1);
638           /* Call the base class assignment operator.  */
639           finish_expr_stmt 
640             (build_special_member_call (current_class_ref, 
641                                         ansi_assopname (NOP_EXPR),
642                                         build_tree_list (NULL_TREE, 
643                                                          converted_parm),
644                                         binfo,
645                                         LOOKUP_NORMAL | LOOKUP_NONVIRTUAL));
646         }
647
648       /* Assign to each of the non-static data members.  */
649       for (fields = TYPE_FIELDS (current_class_type); 
650            fields; 
651            fields = TREE_CHAIN (fields))
652         {
653           tree comp, init, t;
654           tree field = fields;
655
656           if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
657             continue;
658
659           if (CP_TYPE_CONST_P (TREE_TYPE (field)))
660             {
661               error ("non-static const member `%#D', can't use default assignment operator", field);
662               continue;
663             }
664           else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE)
665             {
666               error ("non-static reference member `%#D', can't use default assignment operator", field);
667               continue;
668             }
669
670           comp = current_class_ref;
671           init = parm;
672
673           if (DECL_NAME (field))
674             {
675               if (VFIELD_NAME_P (DECL_NAME (field)))
676                 continue;
677
678               /* True for duplicate members.  */
679               if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
680                 continue;
681             }
682           else if ((t = TREE_TYPE (field)) != NULL_TREE
683                    && ANON_AGGR_TYPE_P (t)
684                    && TYPE_FIELDS (t) != NULL_TREE)
685             /* Just use the field; anonymous types can't have
686                nontrivial copy ctors or assignment ops.  */;
687           else
688             continue;
689
690           comp = build (COMPONENT_REF, TREE_TYPE (field), comp, field,
691                         NULL_TREE);
692           init = build (COMPONENT_REF,
693                         cp_build_qualified_type (TREE_TYPE (field), cvquals),
694                         init, field, NULL_TREE);
695
696           if (DECL_NAME (field))
697             finish_expr_stmt (build_modify_expr (comp, NOP_EXPR, init));
698           else
699             finish_expr_stmt (build (MODIFY_EXPR, TREE_TYPE (comp), comp,
700                                      init));
701         }
702     }
703   finish_return_stmt (current_class_ref);
704   finish_compound_stmt (compound_stmt);
705 }
706
707 void
708 synthesize_method (tree fndecl)
709 {
710   bool nested = (current_function_decl != NULL_TREE);
711   tree context = decl_function_context (fndecl);
712   bool need_body = true;
713   tree stmt;
714
715   if (at_eof)
716     import_export_decl (fndecl);
717
718   /* If we've been asked to synthesize a clone, just synthesize the
719      cloned function instead.  Doing so will automatically fill in the
720      body for the clone.  */
721   if (DECL_CLONED_FUNCTION_P (fndecl))
722     {
723       synthesize_method (DECL_CLONED_FUNCTION (fndecl));
724       return;
725     }
726
727   /* We may be in the middle of deferred access check.  Disable
728      it now.  */
729   push_deferring_access_checks (dk_no_deferred);
730
731   if (! context)
732     push_to_top_level ();
733   else if (nested)
734     push_function_context_to (context);
735
736   /* Put the function definition at the position where it is needed,
737      rather than within the body of the class.  That way, an error
738      during the generation of the implicit body points at the place
739      where the attempt to generate the function occurs, giving the
740      user a hint as to why we are attempting to generate the
741      function.  */
742   DECL_SOURCE_LOCATION (fndecl) = input_location;
743
744   interface_unknown = 1;
745   start_preparsed_function (fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
746   clear_last_expr ();
747   stmt = begin_function_body ();
748
749   if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR)
750     {
751       do_build_assign_ref (fndecl);
752       need_body = false;
753     }
754   else if (DECL_CONSTRUCTOR_P (fndecl))
755     {
756       tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl);
757       if (arg_chain != void_list_node)
758         do_build_copy_constructor (fndecl);
759       else if (TYPE_NEEDS_CONSTRUCTING (current_class_type))
760         finish_mem_initializers (NULL_TREE);
761     }
762
763   /* If we haven't yet generated the body of the function, just
764      generate an empty compound statement.  */
765   if (need_body)
766     {
767       tree compound_stmt;
768       compound_stmt = begin_compound_stmt (BCS_FN_BODY);
769       finish_compound_stmt (compound_stmt);
770     }
771
772   finish_function_body (stmt);
773   expand_or_defer_fn (finish_function (0));
774
775   extract_interface_info ();
776   if (! context)
777     pop_from_top_level ();
778   else if (nested)
779     pop_function_context_from (context);
780
781   pop_deferring_access_checks ();
782 }
783
784 /* Use EXTRACTOR to locate the relevant function called for each base &
785    class field of TYPE. CLIENT allows additional information to be passed
786    to EXTRACTOR.  Generates the union of all exceptions generated by those
787    functions.  Note that we haven't updated TYPE_FIELDS and such of any
788    variants yet, so we need to look at the main one.  */
789
790 static tree
791 synthesize_exception_spec (tree type, tree (*extractor) (tree, void*),
792                            void *client)
793 {
794   tree raises = empty_except_spec;
795   tree fields = TYPE_FIELDS (type);
796   int i, n_bases = CLASSTYPE_N_BASECLASSES (type);
797   tree binfos = TYPE_BINFO_BASETYPES (type);
798
799   for (i = 0; i != n_bases; i++)
800     {
801       tree base = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
802       tree fn = (*extractor) (base, client);
803       if (fn)
804         {
805           tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
806           
807           raises = merge_exception_specifiers (raises, fn_raises);
808         }
809     }
810   for (; fields; fields = TREE_CHAIN (fields))
811     {
812       tree type = TREE_TYPE (fields);
813       tree fn;
814       
815       if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
816         continue;
817       while (TREE_CODE (type) == ARRAY_TYPE)
818         type = TREE_TYPE (type);
819       if (TREE_CODE (type) != RECORD_TYPE)
820         continue;
821       
822       fn = (*extractor) (type, client);
823       if (fn)
824         {
825           tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
826           
827           raises = merge_exception_specifiers (raises, fn_raises);
828         }
829     }
830   return raises;
831 }
832
833 /* Locate the dtor of TYPE.  */
834
835 static tree
836 locate_dtor (tree type, void *client ATTRIBUTE_UNUSED)
837 {
838   tree fns;
839   
840   if (!TYPE_HAS_DESTRUCTOR (type))
841     return NULL_TREE;
842   fns = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type),
843                       CLASSTYPE_DESTRUCTOR_SLOT);
844   return fns;
845 }
846
847 /* Locate the default ctor of TYPE.  */
848
849 static tree
850 locate_ctor (tree type, void *client ATTRIBUTE_UNUSED)
851 {
852   tree fns;
853   
854   if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
855     return NULL_TREE;
856   
857   fns = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type),
858                       CLASSTYPE_CONSTRUCTOR_SLOT);
859   for (; fns; fns = OVL_NEXT (fns))
860     {
861       tree fn = OVL_CURRENT (fns);
862       tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
863       
864       if (sufficient_parms_p (TREE_CHAIN (parms)))
865         return fn;
866     }
867   return NULL_TREE;
868 }
869
870 struct copy_data
871 {
872   tree name;
873   int quals;
874 };
875
876 /* Locate the copy ctor or copy assignment of TYPE. CLIENT_
877    points to a COPY_DATA holding the name (NULL for the ctor)
878    and desired qualifiers of the source operand.  */
879
880 static tree
881 locate_copy (tree type, void *client_)
882 {
883   struct copy_data *client = (struct copy_data *)client_;
884   tree fns;
885   int ix = -1;
886   tree best = NULL_TREE;
887   bool excess_p = false;
888   
889   if (client->name)
890     {
891       if (TYPE_HAS_ASSIGN_REF (type))
892         ix = lookup_fnfields_1 (type, client->name);
893     }
894   else if (TYPE_HAS_INIT_REF (type))
895     ix = CLASSTYPE_CONSTRUCTOR_SLOT;
896   if (ix < 0)
897     return NULL_TREE;
898   fns = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), ix);
899   
900   for (; fns; fns = OVL_NEXT (fns))
901     {
902       tree fn = OVL_CURRENT (fns);
903       tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
904       tree src_type;
905       int excess;
906       int quals;
907       
908       parms = TREE_CHAIN (parms);
909       if (!parms)
910         continue;
911       src_type = non_reference (TREE_VALUE (parms));
912       if (!same_type_ignoring_top_level_qualifiers_p (src_type, type))
913         continue;
914       if (!sufficient_parms_p (TREE_CHAIN (parms)))
915         continue;
916       quals = cp_type_quals (src_type);
917       if (client->quals & ~quals)
918         continue;
919       excess = quals & ~client->quals;
920       if (!best || (excess_p && !excess))
921         {
922           best = fn;
923           excess_p = excess;
924         }
925       else
926         /* Ambiguous */
927         return NULL_TREE;
928     }
929   return best;
930 }
931
932 /* Implicitly declare the special function indicated by KIND, as a
933    member of TYPE.  For copy constructors and assignment operators,
934    CONST_P indicates whether these functions should take a const
935    reference argument or a non-const reference.  */
936
937 tree
938 implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
939 {
940   tree fn;
941   tree parameter_types = void_list_node;
942   tree return_type = void_type_node;
943   tree fn_type;
944   tree raises = empty_except_spec;
945   tree rhs_parm_type = NULL_TREE;
946   tree name;
947
948   switch (kind)
949     {
950     case sfk_destructor:
951       /* Destructor.  */
952       name = constructor_name (type);
953       raises = synthesize_exception_spec (type, &locate_dtor, 0);
954       break;
955
956     case sfk_constructor:
957       /* Default constructor.  */
958       name = constructor_name (type);
959       raises = synthesize_exception_spec (type, &locate_ctor, 0);
960       TYPE_HAS_CONSTRUCTOR (type) = 1;
961       break;
962
963     case sfk_copy_constructor:
964       TYPE_HAS_CONSTRUCTOR (type) = 1;
965       /* Fall through. */
966     case sfk_assignment_operator:
967     {
968       struct copy_data data;
969       
970       data.name = NULL;
971       data.quals = 0;
972       if (kind == sfk_assignment_operator)
973         {
974           return_type = build_reference_type (type);
975           name = ansi_assopname (NOP_EXPR);
976           data.name = name;
977         }
978       else
979         name = constructor_name (type);
980
981       if (const_p)
982         {
983           data.quals = TYPE_QUAL_CONST;
984           rhs_parm_type = build_qualified_type (type, TYPE_QUAL_CONST);
985         }
986       else
987         rhs_parm_type = type;
988       rhs_parm_type = build_reference_type (rhs_parm_type);
989       parameter_types = tree_cons (NULL_TREE, rhs_parm_type, parameter_types);
990       raises = synthesize_exception_spec (type, &locate_copy, &data);
991       break;
992     }
993     default:
994       abort ();
995     }
996
997   /* Create the function.  */
998   fn_type = build_method_type_directly (type, return_type, parameter_types);
999   if (raises)
1000     fn_type = build_exception_variant (fn_type, raises);
1001   fn = build_lang_decl (FUNCTION_DECL, name, fn_type);
1002   if (kind == sfk_constructor || kind == sfk_copy_constructor)
1003     DECL_CONSTRUCTOR_P (fn) = 1;
1004   else if (kind == sfk_destructor)
1005     DECL_DESTRUCTOR_P (fn) = 1;
1006   else
1007     {
1008       DECL_ASSIGNMENT_OPERATOR_P (fn) = 1;
1009       SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR);
1010     }
1011   /* Create the argument list.  The call to "grokclassfn" will add the
1012      "this" parameter and any other implicit parameters.  */
1013   if (rhs_parm_type)
1014     {
1015       /* Note that this parameter is *not* marked DECL_ARTIFICIAL; we
1016          want its type to be included in the mangled function
1017          name.  */
1018       DECL_ARGUMENTS (fn) = cp_build_parm_decl (NULL_TREE, rhs_parm_type);
1019       TREE_READONLY (DECL_ARGUMENTS (fn)) = 1;
1020     }
1021
1022   grokclassfn (type, fn, kind == sfk_destructor ? DTOR_FLAG : NO_SPECIAL,
1023                TYPE_UNQUALIFIED);
1024   grok_special_member_properties (fn);
1025   cp_finish_decl (fn, /*init=*/NULL_TREE, /*asmspec_tree=*/NULL_TREE,
1026                   /*flags=*/LOOKUP_ONLYCONVERTING);
1027   DECL_IN_AGGR_P (fn) = 1;
1028   DECL_ARTIFICIAL (fn) = 1;
1029   DECL_NOT_REALLY_EXTERN (fn) = 1;
1030   DECL_DECLARED_INLINE_P (fn) = 1;
1031   DECL_INLINE (fn) = 1;
1032   if (TREE_USED (fn))
1033     abort ();
1034   
1035   return fn;
1036 }
1037
1038 /* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
1039    as there are artificial parms in FN.  */
1040
1041 tree
1042 skip_artificial_parms_for (tree fn, tree list)
1043 {
1044   if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
1045     list = TREE_CHAIN (list);
1046   else
1047     return list;
1048
1049   if (DECL_HAS_IN_CHARGE_PARM_P (fn))
1050     list = TREE_CHAIN (list);
1051   if (DECL_HAS_VTT_PARM_P (fn))
1052     list = TREE_CHAIN (list);
1053   return list;
1054 }
1055
1056 #include "gt-cp-method.h"