]> gcc.gnu.org Git - gcc.git/blob - gcc/cp/class.c
Re-implement allocation of base class subobjects.
[gcc.git] / gcc / cp / class.c
1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1987, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com)
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22
23 /* High-level class interface. */
24
25 #include "config.h"
26 #include "system.h"
27 #include "tree.h"
28 #include "cp-tree.h"
29 #include "flags.h"
30 #include "rtl.h"
31 #include "output.h"
32
33 #include "obstack.h"
34 #define obstack_chunk_alloc xmalloc
35 #define obstack_chunk_free free
36
37 extern struct obstack permanent_obstack;
38
39 /* This is how we tell when two virtual member functions are really the
40 same. */
41 #define SAME_FN(FN1DECL, FN2DECL) (DECL_ASSEMBLER_NAME (FN1DECL) == DECL_ASSEMBLER_NAME (FN2DECL))
42
43 extern void set_class_shadows PROTO ((tree));
44
45 /* Way of stacking class types. */
46 static tree *current_class_base, *current_class_stack;
47 static int current_class_stacksize;
48 int current_class_depth;
49
50 struct class_level
51 {
52 /* The previous class level. */
53 struct class_level *level_chain;
54
55 /* The class instance variable, as a PARM_DECL. */
56 tree decl;
57 /* The class instance variable, as an object. */
58 tree object;
59 /* The virtual function table pointer
60 for the class instance variable. */
61 tree vtable_decl;
62
63 /* Name of the current class. */
64 tree name;
65 /* Type of the current class. */
66 tree type;
67
68 /* Flags for this class level. */
69 int this_is_variable;
70 int memoized_lookups;
71 int save_memoized;
72 int unused;
73 };
74
75 /* The current_class_ptr is the pointer to the current class.
76 current_class_ref is the actual current class. */
77 tree current_class_ptr, current_class_ref;
78
79 /* The following two can be derived from the previous one */
80 tree current_class_name; /* IDENTIFIER_NODE: name of current class */
81 tree current_class_type; /* _TYPE: the type of the current class */
82 tree previous_class_type; /* _TYPE: the previous type that was a class */
83 tree previous_class_values; /* TREE_LIST: copy of the class_shadowed list
84 when leaving an outermost class scope. */
85
86 struct base_info;
87
88 static tree get_vfield_name PROTO((tree));
89 static void finish_struct_anon PROTO((tree));
90 static tree build_vbase_pointer PROTO((tree, tree));
91 static int complete_type_p PROTO((tree));
92 static int typecode_p PROTO((tree, enum tree_code));
93 static tree build_vtable_entry PROTO((tree, tree));
94 static tree get_vtable_name PROTO((tree));
95 static tree get_derived_offset PROTO((tree, tree));
96 static tree get_basefndecls PROTO((tree, tree));
97 static void set_rtti_entry PROTO((tree, tree, tree));
98 static tree build_vtable PROTO((tree, tree));
99 static void prepare_fresh_vtable PROTO((tree, tree));
100 static void fixup_vtable_deltas1 PROTO((tree, tree));
101 static void fixup_vtable_deltas PROTO((tree, int, tree));
102 static void grow_method PROTO((tree, tree *));
103 static void finish_vtbls PROTO((tree, int, tree));
104 static void modify_vtable_entry PROTO((tree, tree, tree));
105 static tree get_vtable_entry_n PROTO((tree, unsigned HOST_WIDE_INT));
106 static void add_virtual_function PROTO((tree *, tree *, int *, tree, tree));
107 static tree delete_duplicate_fields_1 PROTO((tree, tree));
108 static void delete_duplicate_fields PROTO((tree));
109 static void finish_struct_bits PROTO((tree, int));
110 static int alter_access PROTO((tree, tree, tree));
111 static int overrides PROTO((tree, tree));
112 static int strictly_overrides PROTO((tree, tree));
113 static void merge_overrides PROTO((tree, tree, int, tree));
114 static void override_one_vtable PROTO((tree, tree, tree));
115 static void mark_overriders PROTO((tree, tree));
116 static void check_for_override PROTO((tree, tree));
117 static tree maybe_fixup_vptrs PROTO((tree, tree, tree));
118 static tree get_class_offset_1 PROTO((tree, tree, tree, tree, tree));
119 static tree get_class_offset PROTO((tree, tree, tree, tree));
120 static void modify_one_vtable PROTO((tree, tree, tree, tree));
121 static void modify_all_vtables PROTO((tree, tree, tree));
122 static void modify_all_direct_vtables PROTO((tree, int, tree, tree,
123 tree));
124 static void modify_all_indirect_vtables PROTO((tree, int, int, tree,
125 tree, tree));
126 static void build_class_init_list PROTO((tree));
127 static int finish_base_struct PROTO((tree, struct base_info *));
128
129 /* Way of stacking language names. */
130 tree *current_lang_base, *current_lang_stack;
131 int current_lang_stacksize;
132
133 /* Names of languages we recognize. */
134 tree lang_name_c, lang_name_cplusplus;
135 tree current_lang_name;
136
137 /* When layout out an aggregate type, the size of the
138 basetypes (virtual and non-virtual) is passed to layout_record
139 via this node. */
140 static tree base_layout_decl;
141
142 /* Constants used for access control. */
143 tree access_default_node; /* 0 */
144 tree access_public_node; /* 1 */
145 tree access_protected_node; /* 2 */
146 tree access_private_node; /* 3 */
147 tree access_default_virtual_node; /* 4 */
148 tree access_public_virtual_node; /* 5 */
149 tree access_protected_virtual_node; /* 6 */
150 tree access_private_virtual_node; /* 7 */
151
152 /* Variables shared between class.c and call.c. */
153
154 #ifdef GATHER_STATISTICS
155 int n_vtables = 0;
156 int n_vtable_entries = 0;
157 int n_vtable_searches = 0;
158 int n_vtable_elems = 0;
159 int n_convert_harshness = 0;
160 int n_compute_conversion_costs = 0;
161 int n_build_method_call = 0;
162 int n_inner_fields_searched = 0;
163 #endif
164
165 /* Virtual baseclass things. */
166
167 static tree
168 build_vbase_pointer (exp, type)
169 tree exp, type;
170 {
171 char *name;
172
173 name = (char *) alloca (TYPE_NAME_LENGTH (type) + sizeof (VBASE_NAME) + 1);
174 sprintf (name, VBASE_NAME_FORMAT, TYPE_NAME_STRING (type));
175 return build_component_ref (exp, get_identifier (name), NULL_TREE, 0);
176 }
177
178 /* Is the type of the EXPR, the complete type of the object?
179 If we are going to be wrong, we must be conservative, and return 0. */
180
181 static int
182 complete_type_p (expr)
183 tree expr;
184 {
185 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (expr));
186 while (1)
187 {
188 switch (TREE_CODE (expr))
189 {
190 case SAVE_EXPR:
191 case INDIRECT_REF:
192 case ADDR_EXPR:
193 case NOP_EXPR:
194 case CONVERT_EXPR:
195 expr = TREE_OPERAND (expr, 0);
196 continue;
197
198 case CALL_EXPR:
199 if (! TREE_HAS_CONSTRUCTOR (expr))
200 break;
201 /* fall through... */
202 case VAR_DECL:
203 case FIELD_DECL:
204 if (TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
205 && IS_AGGR_TYPE (TREE_TYPE (TREE_TYPE (expr)))
206 && TYPE_MAIN_VARIANT (TREE_TYPE (expr)) == type)
207 return 1;
208 /* fall through... */
209 case TARGET_EXPR:
210 case PARM_DECL:
211 if (IS_AGGR_TYPE (TREE_TYPE (expr))
212 && TYPE_MAIN_VARIANT (TREE_TYPE (expr)) == type)
213 return 1;
214 /* fall through... */
215 case PLUS_EXPR:
216 default:
217 break;
218 }
219 break;
220 }
221 return 0;
222 }
223
224 /* Build multi-level access to EXPR using hierarchy path PATH.
225 CODE is PLUS_EXPR if we are going with the grain,
226 and MINUS_EXPR if we are not (in which case, we cannot traverse
227 virtual baseclass links).
228
229 TYPE is the type we want this path to have on exit.
230
231 ALIAS_THIS is non-zero if EXPR in an expression involving `this'. */
232
233 tree
234 build_vbase_path (code, type, expr, path, alias_this)
235 enum tree_code code;
236 tree type, expr, path;
237 int alias_this;
238 {
239 register int changed = 0;
240 tree last = NULL_TREE, last_virtual = NULL_TREE;
241 int nonnull = 0;
242 int fixed_type_p;
243 tree null_expr = 0, nonnull_expr;
244 tree basetype;
245 tree offset = integer_zero_node;
246
247 if (BINFO_INHERITANCE_CHAIN (path) == NULL_TREE)
248 return build1 (NOP_EXPR, type, expr);
249
250 if (nonnull == 0 && (alias_this && flag_this_is_variable <= 0))
251 nonnull = 1;
252
253 #if 0
254 /* We need additional logic to convert back to the unconverted type
255 (the static type of the complete object), and then convert back
256 to the type we want. Until that is done, or until we can
257 recognize when that is, we cannot do the short cut logic. (mrs) */
258 fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull);
259 #else
260 /* Do this, until we can undo any previous conversions. See net35.C
261 for a testcase. */
262 fixed_type_p = complete_type_p (expr);
263 #endif
264
265 if (!fixed_type_p && TREE_SIDE_EFFECTS (expr))
266 expr = save_expr (expr);
267 nonnull_expr = expr;
268
269 if (BINFO_INHERITANCE_CHAIN (path))
270 {
271 tree reverse_path = NULL_TREE;
272
273 push_expression_obstack ();
274 while (path)
275 {
276 tree r = copy_node (path);
277 BINFO_INHERITANCE_CHAIN (r) = reverse_path;
278 reverse_path = r;
279 path = BINFO_INHERITANCE_CHAIN (path);
280 }
281 path = reverse_path;
282 pop_obstacks ();
283 }
284
285 basetype = BINFO_TYPE (path);
286
287 while (path)
288 {
289 if (TREE_VIA_VIRTUAL (path))
290 {
291 last_virtual = BINFO_TYPE (path);
292 if (code == PLUS_EXPR)
293 {
294 changed = ! fixed_type_p;
295
296 if (changed)
297 {
298 tree ind;
299
300 /* We already check for ambiguous things in the caller, just
301 find a path. */
302 if (last)
303 {
304 tree binfo = get_binfo (last, TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (nonnull_expr))), 0);
305 nonnull_expr = convert_pointer_to_real (binfo, nonnull_expr);
306 }
307 ind = build_indirect_ref (nonnull_expr, NULL_PTR);
308 nonnull_expr = build_vbase_pointer (ind, last_virtual);
309 if (nonnull == 0
310 && (TREE_CODE (type) == POINTER_TYPE
311 || !flag_assume_nonnull_objects)
312 && null_expr == NULL_TREE)
313 {
314 null_expr = build1 (NOP_EXPR, build_pointer_type (last_virtual), integer_zero_node);
315 expr = build (COND_EXPR, build_pointer_type (last_virtual),
316 build (EQ_EXPR, boolean_type_node, expr,
317 integer_zero_node),
318 null_expr, nonnull_expr);
319 }
320 }
321 /* else we'll figure out the offset below. */
322
323 /* Happens in the case of parse errors. */
324 if (nonnull_expr == error_mark_node)
325 return error_mark_node;
326 }
327 else
328 {
329 cp_error ("cannot cast up from virtual baseclass `%T'",
330 last_virtual);
331 return error_mark_node;
332 }
333 }
334 last = path;
335 path = BINFO_INHERITANCE_CHAIN (path);
336 }
337 /* LAST is now the last basetype assoc on the path. */
338
339 /* A pointer to a virtual base member of a non-null object
340 is non-null. Therefore, we only need to test for zeroness once.
341 Make EXPR the canonical expression to deal with here. */
342 if (null_expr)
343 {
344 TREE_OPERAND (expr, 2) = nonnull_expr;
345 TREE_TYPE (expr) = TREE_TYPE (TREE_OPERAND (expr, 1))
346 = TREE_TYPE (nonnull_expr);
347 }
348 else
349 expr = nonnull_expr;
350
351 /* If we go through any virtual base pointers, make sure that
352 casts to BASETYPE from the last virtual base class use
353 the right value for BASETYPE. */
354 if (changed)
355 {
356 tree intype = TREE_TYPE (TREE_TYPE (expr));
357 if (TYPE_MAIN_VARIANT (intype) != BINFO_TYPE (last))
358 {
359 tree binfo = get_binfo (last, TYPE_MAIN_VARIANT (intype), 0);
360 offset = BINFO_OFFSET (binfo);
361 }
362 }
363 else
364 {
365 if (last_virtual)
366 {
367 offset = BINFO_OFFSET (binfo_member (last_virtual,
368 CLASSTYPE_VBASECLASSES (basetype)));
369 offset = size_binop (PLUS_EXPR, offset, BINFO_OFFSET (last));
370 }
371 else
372 offset = BINFO_OFFSET (last);
373 }
374
375 if (TREE_INT_CST_LOW (offset))
376 {
377 /* Bash types to make the backend happy. */
378 offset = cp_convert (type, offset);
379 #if 0
380 /* This shouldn't be necessary. (mrs) */
381 expr = build1 (NOP_EXPR, type, expr);
382 #endif
383
384 /* For multiple inheritance: if `this' can be set by any
385 function, then it could be 0 on entry to any function.
386 Preserve such zeroness here. Otherwise, only in the
387 case of constructors need we worry, and in those cases,
388 it will be zero, or initialized to some valid value to
389 which we may add. */
390 if (nonnull == 0)
391 {
392 if (null_expr)
393 TREE_TYPE (null_expr) = type;
394 else
395 null_expr = build1 (NOP_EXPR, type, integer_zero_node);
396 if (TREE_SIDE_EFFECTS (expr))
397 expr = save_expr (expr);
398
399 return build (COND_EXPR, type,
400 build (EQ_EXPR, boolean_type_node, expr, integer_zero_node),
401 null_expr,
402 build (code, type, expr, offset));
403 }
404 else return build (code, type, expr, offset);
405 }
406
407 /* Cannot change the TREE_TYPE of a NOP_EXPR here, since it may
408 be used multiple times in initialization of multiple inheritance. */
409 if (null_expr)
410 {
411 TREE_TYPE (expr) = type;
412 return expr;
413 }
414 else
415 return build1 (NOP_EXPR, type, expr);
416 }
417
418 /* Virtual function things. */
419
420 /* Build an entry in the virtual function table.
421 DELTA is the offset for the `this' pointer.
422 PFN is an ADDR_EXPR containing a pointer to the virtual function.
423 Note that the index (DELTA2) in the virtual function table
424 is always 0. */
425
426 static tree
427 build_vtable_entry (delta, pfn)
428 tree delta, pfn;
429 {
430 if (flag_vtable_thunks)
431 {
432 HOST_WIDE_INT idelta = TREE_INT_CST_LOW (delta);
433 if (idelta && ! DECL_ABSTRACT_VIRTUAL_P (TREE_OPERAND (pfn, 0)))
434 {
435 pfn = build1 (ADDR_EXPR, vtable_entry_type,
436 make_thunk (pfn, idelta));
437 TREE_READONLY (pfn) = 1;
438 TREE_CONSTANT (pfn) = 1;
439 }
440 #ifdef GATHER_STATISTICS
441 n_vtable_entries += 1;
442 #endif
443 return pfn;
444 }
445 else
446 {
447 extern int flag_huge_objects;
448 tree elems = expr_tree_cons (NULL_TREE, delta,
449 expr_tree_cons (NULL_TREE, integer_zero_node,
450 build_expr_list (NULL_TREE, pfn)));
451 tree entry = build (CONSTRUCTOR, vtable_entry_type, NULL_TREE, elems);
452
453 /* DELTA is constructed by `size_int', which means it may be an
454 unsigned quantity on some platforms. Therefore, we cannot use
455 `int_fits_type_p', because when DELTA is really negative,
456 `force_fit_type' will make it look like a very large number. */
457
458 if ((TREE_INT_CST_LOW (TYPE_MAX_VALUE (delta_type_node))
459 < TREE_INT_CST_LOW (delta))
460 || (TREE_INT_CST_LOW (delta)
461 < TREE_INT_CST_LOW (TYPE_MIN_VALUE (delta_type_node))))
462 {
463 if (flag_huge_objects)
464 sorry ("object size exceeds built-in limit for virtual function table implementation");
465 else
466 sorry ("object size exceeds normal limit for virtual function table implementation, recompile all source and use -fhuge-objects");
467 }
468
469 TREE_CONSTANT (entry) = 1;
470 TREE_STATIC (entry) = 1;
471 TREE_READONLY (entry) = 1;
472
473 #ifdef GATHER_STATISTICS
474 n_vtable_entries += 1;
475 #endif
476
477 return entry;
478 }
479 }
480
481 /* Given an object INSTANCE, return an expression which yields the
482 virtual function vtable element corresponding to INDEX. There are
483 many special cases for INSTANCE which we take care of here, mainly
484 to avoid creating extra tree nodes when we don't have to. */
485
486 tree
487 build_vtbl_ref (instance, idx)
488 tree instance, idx;
489 {
490 tree vtbl, aref;
491 tree basetype = TREE_TYPE (instance);
492
493 if (TREE_CODE (basetype) == REFERENCE_TYPE)
494 basetype = TREE_TYPE (basetype);
495
496 if (instance == current_class_ref)
497 vtbl = build_indirect_ref (build_vfield_ref (instance, basetype),
498 NULL_PTR);
499 else
500 {
501 if (optimize)
502 {
503 /* Try to figure out what a reference refers to, and
504 access its virtual function table directly. */
505 tree ref = NULL_TREE;
506
507 if (TREE_CODE (instance) == INDIRECT_REF
508 && TREE_CODE (TREE_TYPE (TREE_OPERAND (instance, 0))) == REFERENCE_TYPE)
509 ref = TREE_OPERAND (instance, 0);
510 else if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE)
511 ref = instance;
512
513 if (ref && TREE_CODE (ref) == VAR_DECL
514 && DECL_INITIAL (ref))
515 {
516 tree init = DECL_INITIAL (ref);
517
518 while (TREE_CODE (init) == NOP_EXPR
519 || TREE_CODE (init) == NON_LVALUE_EXPR)
520 init = TREE_OPERAND (init, 0);
521 if (TREE_CODE (init) == ADDR_EXPR)
522 {
523 init = TREE_OPERAND (init, 0);
524 if (IS_AGGR_TYPE (TREE_TYPE (init))
525 && (TREE_CODE (init) == PARM_DECL
526 || TREE_CODE (init) == VAR_DECL))
527 instance = init;
528 }
529 }
530 }
531
532 if (IS_AGGR_TYPE (TREE_TYPE (instance))
533 && (TREE_CODE (instance) == RESULT_DECL
534 || TREE_CODE (instance) == PARM_DECL
535 || TREE_CODE (instance) == VAR_DECL))
536 vtbl = TYPE_BINFO_VTABLE (basetype);
537 else
538 vtbl = build_indirect_ref (build_vfield_ref (instance, basetype),
539 NULL_PTR);
540 }
541 assemble_external (vtbl);
542 aref = build_array_ref (vtbl, idx);
543
544 return aref;
545 }
546
547 /* Given an object INSTANCE, return an expression which yields the
548 virtual function corresponding to INDEX. There are many special
549 cases for INSTANCE which we take care of here, mainly to avoid
550 creating extra tree nodes when we don't have to. */
551
552 tree
553 build_vfn_ref (ptr_to_instptr, instance, idx)
554 tree *ptr_to_instptr, instance;
555 tree idx;
556 {
557 tree aref = build_vtbl_ref (instance, idx);
558
559 /* When using thunks, there is no extra delta, and we get the pfn
560 directly. */
561 if (flag_vtable_thunks)
562 return aref;
563
564 if (ptr_to_instptr)
565 {
566 /* Save the intermediate result in a SAVE_EXPR so we don't have to
567 compute each component of the virtual function pointer twice. */
568 if (TREE_CODE (aref) == INDIRECT_REF)
569 TREE_OPERAND (aref, 0) = save_expr (TREE_OPERAND (aref, 0));
570
571 *ptr_to_instptr
572 = build (PLUS_EXPR, TREE_TYPE (*ptr_to_instptr),
573 *ptr_to_instptr,
574 cp_convert (ptrdiff_type_node,
575 build_component_ref (aref, delta_identifier, NULL_TREE, 0)));
576 }
577
578 return build_component_ref (aref, pfn_identifier, NULL_TREE, 0);
579 }
580
581 /* Return the name of the virtual function table (as an IDENTIFIER_NODE)
582 for the given TYPE. */
583
584 static tree
585 get_vtable_name (type)
586 tree type;
587 {
588 tree type_id = build_typename_overload (type);
589 char *buf = (char *) alloca (strlen (VTABLE_NAME_FORMAT)
590 + IDENTIFIER_LENGTH (type_id) + 2);
591 char *ptr = IDENTIFIER_POINTER (type_id);
592 int i;
593 for (i = 0; ptr[i] == OPERATOR_TYPENAME_FORMAT[i]; i++) ;
594 #if 0
595 /* We don't take off the numbers; prepare_fresh_vtable uses the
596 DECL_ASSEMBLER_NAME for the type, which includes the number
597 in `3foo'. If we were to pull them off here, we'd end up with
598 something like `_vt.foo.3bar', instead of a uniform definition. */
599 while (ptr[i] >= '0' && ptr[i] <= '9')
600 i += 1;
601 #endif
602 sprintf (buf, VTABLE_NAME_FORMAT, ptr+i);
603 return get_identifier (buf);
604 }
605
606 /* Return the offset to the main vtable for a given base BINFO. */
607
608 tree
609 get_vfield_offset (binfo)
610 tree binfo;
611 {
612 tree tmp
613 = size_binop (FLOOR_DIV_EXPR,
614 DECL_FIELD_BITPOS (CLASSTYPE_VFIELD (BINFO_TYPE (binfo))),
615 size_int (BITS_PER_UNIT));
616 tmp = convert (sizetype, tmp);
617 return size_binop (PLUS_EXPR, tmp, BINFO_OFFSET (binfo));
618 }
619
620 /* Get the offset to the start of the original binfo that we derived
621 this binfo from. If we find TYPE first, return the offset only
622 that far. The shortened search is useful because the this pointer
623 on method calling is expected to point to a DECL_CONTEXT (fndecl)
624 object, and not a baseclass of it. */
625
626 static tree
627 get_derived_offset (binfo, type)
628 tree binfo, type;
629 {
630 tree offset1 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo)));
631 tree offset2;
632 int i;
633 while (BINFO_BASETYPES (binfo)
634 && (i=CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo))) != -1)
635 {
636 tree binfos = BINFO_BASETYPES (binfo);
637 if (BINFO_TYPE (binfo) == type)
638 break;
639 binfo = TREE_VEC_ELT (binfos, i);
640 }
641 offset2 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo)));
642 return size_binop (MINUS_EXPR, offset1, offset2);
643 }
644
645 /* Update the rtti info for this class. */
646
647 static void
648 set_rtti_entry (virtuals, offset, type)
649 tree virtuals, offset, type;
650 {
651 tree vfn;
652
653 if (flag_rtti)
654 vfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, get_tinfo_fn (type));
655 else
656 vfn = build1 (NOP_EXPR, vfunc_ptr_type_node, size_zero_node);
657 TREE_CONSTANT (vfn) = 1;
658
659 if (! flag_vtable_thunks)
660 TREE_VALUE (virtuals) = build_vtable_entry (offset, vfn);
661 else
662 {
663 tree voff = build1 (NOP_EXPR, vfunc_ptr_type_node, offset);
664 TREE_CONSTANT (voff) = 1;
665
666 TREE_VALUE (virtuals) = build_vtable_entry (size_zero_node, voff);
667
668 /* The second slot is for the tdesc pointer when thunks are used. */
669 TREE_VALUE (TREE_CHAIN (virtuals))
670 = build_vtable_entry (size_zero_node, vfn);
671 }
672 }
673
674 /* Build a virtual function for type TYPE.
675 If BINFO is non-NULL, build the vtable starting with the initial
676 approximation that it is the same as the one which is the head of
677 the association list. */
678
679 static tree
680 build_vtable (binfo, type)
681 tree binfo, type;
682 {
683 tree name = get_vtable_name (type);
684 tree virtuals, decl;
685
686 if (binfo)
687 {
688 tree offset;
689
690 virtuals = copy_list (BINFO_VIRTUALS (binfo));
691 decl = build_decl (VAR_DECL, name, TREE_TYPE (BINFO_VTABLE (binfo)));
692
693 /* Now do rtti stuff. */
694 offset = get_derived_offset (TYPE_BINFO (type), NULL_TREE);
695 offset = size_binop (MINUS_EXPR, size_zero_node, offset);
696 set_rtti_entry (virtuals, offset, type);
697 }
698 else
699 {
700 virtuals = NULL_TREE;
701 decl = build_decl (VAR_DECL, name, void_type_node);
702 }
703
704 #ifdef GATHER_STATISTICS
705 n_vtables += 1;
706 n_vtable_elems += list_length (virtuals);
707 #endif
708
709 /* Set TREE_PUBLIC and TREE_EXTERN as appropriate. */
710 import_export_vtable (decl, type, 0);
711
712 IDENTIFIER_GLOBAL_VALUE (name) = decl = pushdecl_top_level (decl);
713 /* Initialize the association list for this type, based
714 on our first approximation. */
715 TYPE_BINFO_VTABLE (type) = decl;
716 TYPE_BINFO_VIRTUALS (type) = virtuals;
717
718 DECL_ARTIFICIAL (decl) = 1;
719 TREE_STATIC (decl) = 1;
720 #ifndef WRITABLE_VTABLES
721 /* Make them READONLY by default. (mrs) */
722 TREE_READONLY (decl) = 1;
723 #endif
724 /* At one time the vtable info was grabbed 2 words at a time. This
725 fails on sparc unless you have 8-byte alignment. (tiemann) */
726 DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node),
727 DECL_ALIGN (decl));
728
729 /* Why is this conditional? (mrs) */
730 if (binfo && write_virtuals >= 0)
731 DECL_VIRTUAL_P (decl) = 1;
732 DECL_CONTEXT (decl) = type;
733
734 binfo = TYPE_BINFO (type);
735 SET_BINFO_NEW_VTABLE_MARKED (binfo);
736 return decl;
737 }
738
739 extern tree signed_size_zero_node;
740
741 /* Give TYPE a new virtual function table which is initialized
742 with a skeleton-copy of its original initialization. The only
743 entry that changes is the `delta' entry, so we can really
744 share a lot of structure.
745
746 FOR_TYPE is the derived type which caused this table to
747 be needed.
748
749 BINFO is the type association which provided TYPE for FOR_TYPE.
750
751 The order in which vtables are built (by calling this function) for
752 an object must remain the same, otherwise a binary incompatibility
753 can result. */
754
755 static void
756 prepare_fresh_vtable (binfo, for_type)
757 tree binfo, for_type;
758 {
759 tree basetype;
760 tree orig_decl = BINFO_VTABLE (binfo);
761 tree name;
762 tree new_decl;
763 tree offset;
764 tree path = binfo;
765 char *buf, *buf2;
766 char joiner = '_';
767 int i;
768
769 #ifdef JOINER
770 joiner = JOINER;
771 #endif
772
773 basetype = TYPE_MAIN_VARIANT (BINFO_TYPE (binfo));
774
775 buf2 = TYPE_ASSEMBLER_NAME_STRING (basetype);
776 i = TYPE_ASSEMBLER_NAME_LENGTH (basetype) + 1;
777
778 /* We know that the vtable that we are going to create doesn't exist
779 yet in the global namespace, and when we finish, it will be
780 pushed into the global namespace. In complex MI hierarchies, we
781 have to loop while the name we are thinking of adding is globally
782 defined, adding more name components to the vtable name as we
783 loop, until the name is unique. This is because in complex MI
784 cases, we might have the same base more than once. This means
785 that the order in which this function is called for vtables must
786 remain the same, otherwise binary compatibility can be
787 compromised. */
788
789 while (1)
790 {
791 char *buf1 = (char *) alloca (TYPE_ASSEMBLER_NAME_LENGTH (for_type)
792 + 1 + i);
793 char *new_buf2;
794
795 sprintf (buf1, "%s%c%s", TYPE_ASSEMBLER_NAME_STRING (for_type), joiner,
796 buf2);
797 buf = (char *) alloca (strlen (VTABLE_NAME_FORMAT) + strlen (buf1) + 1);
798 sprintf (buf, VTABLE_NAME_FORMAT, buf1);
799 name = get_identifier (buf);
800
801 /* If this name doesn't clash, then we can use it, otherwise
802 we add more to the name until it is unique. */
803
804 if (! IDENTIFIER_GLOBAL_VALUE (name))
805 break;
806
807 /* Set values for next loop through, if the name isn't unique. */
808
809 path = BINFO_INHERITANCE_CHAIN (path);
810
811 /* We better not run out of stuff to make it unique. */
812 my_friendly_assert (path != NULL_TREE, 368);
813
814 basetype = TYPE_MAIN_VARIANT (BINFO_TYPE (path));
815
816 if (for_type == basetype)
817 {
818 /* If we run out of basetypes in the path, we have already
819 found created a vtable with that name before, we now
820 resort to tacking on _%d to distinguish them. */
821 int j = 2;
822 i = TYPE_ASSEMBLER_NAME_LENGTH (basetype) + 1 + i + 1 + 3;
823 buf1 = (char *) alloca (i);
824 do {
825 sprintf (buf1, "%s%c%s%c%d",
826 TYPE_ASSEMBLER_NAME_STRING (basetype), joiner,
827 buf2, joiner, j);
828 buf = (char *) alloca (strlen (VTABLE_NAME_FORMAT)
829 + strlen (buf1) + 1);
830 sprintf (buf, VTABLE_NAME_FORMAT, buf1);
831 name = get_identifier (buf);
832
833 /* If this name doesn't clash, then we can use it,
834 otherwise we add something different to the name until
835 it is unique. */
836 } while (++j <= 999 && IDENTIFIER_GLOBAL_VALUE (name));
837
838 /* Hey, they really like MI don't they? Increase the 3
839 above to 6, and the 999 to 999999. :-) */
840 my_friendly_assert (j <= 999, 369);
841
842 break;
843 }
844
845 i = TYPE_ASSEMBLER_NAME_LENGTH (basetype) + 1 + i;
846 new_buf2 = (char *) alloca (i);
847 sprintf (new_buf2, "%s%c%s",
848 TYPE_ASSEMBLER_NAME_STRING (basetype), joiner, buf2);
849 buf2 = new_buf2;
850 }
851
852 new_decl = build_decl (VAR_DECL, name, TREE_TYPE (orig_decl));
853 /* Remember which class this vtable is really for. */
854 DECL_CONTEXT (new_decl) = for_type;
855
856 DECL_ARTIFICIAL (new_decl) = 1;
857 TREE_STATIC (new_decl) = 1;
858 BINFO_VTABLE (binfo) = pushdecl_top_level (new_decl);
859 DECL_VIRTUAL_P (new_decl) = 1;
860 #ifndef WRITABLE_VTABLES
861 /* Make them READONLY by default. (mrs) */
862 TREE_READONLY (new_decl) = 1;
863 #endif
864 DECL_ALIGN (new_decl) = DECL_ALIGN (orig_decl);
865
866 /* Make fresh virtual list, so we can smash it later. */
867 BINFO_VIRTUALS (binfo) = copy_list (BINFO_VIRTUALS (binfo));
868
869 if (TREE_VIA_VIRTUAL (binfo))
870 {
871 tree binfo1 = binfo_member (BINFO_TYPE (binfo),
872 CLASSTYPE_VBASECLASSES (for_type));
873
874 /* XXX - This should never happen, if it does, the caller should
875 ensure that the binfo is from for_type's binfos, not from any
876 base type's. We can remove all this code after a while. */
877 if (binfo1 != binfo)
878 warning ("internal inconsistency: binfo offset error for rtti");
879
880 offset = BINFO_OFFSET (binfo1);
881 }
882 else
883 offset = BINFO_OFFSET (binfo);
884
885 set_rtti_entry (BINFO_VIRTUALS (binfo),
886 size_binop (MINUS_EXPR, signed_size_zero_node, offset),
887 for_type);
888
889 #ifdef GATHER_STATISTICS
890 n_vtables += 1;
891 n_vtable_elems += list_length (BINFO_VIRTUALS (binfo));
892 #endif
893
894 /* Set TREE_PUBLIC and TREE_EXTERN as appropriate. */
895 import_export_vtable (new_decl, for_type, 0);
896
897 if (TREE_VIA_VIRTUAL (binfo))
898 my_friendly_assert (binfo == binfo_member (BINFO_TYPE (binfo),
899 CLASSTYPE_VBASECLASSES (current_class_type)),
900 170);
901 SET_BINFO_NEW_VTABLE_MARKED (binfo);
902 }
903
904 #if 0
905 /* Access the virtual function table entry that logically
906 contains BASE_FNDECL. VIRTUALS is the virtual function table's
907 initializer. We can run off the end, when dealing with virtual
908 destructors in MI situations, return NULL_TREE in that case. */
909
910 static tree
911 get_vtable_entry (virtuals, base_fndecl)
912 tree virtuals, base_fndecl;
913 {
914 unsigned HOST_WIDE_INT n = (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD
915 ? (TREE_INT_CST_LOW (DECL_VINDEX (base_fndecl))
916 & (((unsigned HOST_WIDE_INT)1<<(BITS_PER_WORD-1))-1))
917 : TREE_INT_CST_LOW (DECL_VINDEX (base_fndecl)));
918
919 #ifdef GATHER_STATISTICS
920 n_vtable_searches += n;
921 #endif
922
923 while (n > 0 && virtuals)
924 {
925 --n;
926 virtuals = TREE_CHAIN (virtuals);
927 }
928 return virtuals;
929 }
930 #endif
931
932 /* Put new entry ENTRY into virtual function table initializer
933 VIRTUALS.
934
935 Also update DECL_VINDEX (FNDECL). */
936
937 static void
938 modify_vtable_entry (old_entry_in_list, new_entry, fndecl)
939 tree old_entry_in_list, new_entry, fndecl;
940 {
941 tree base_fndecl = TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (old_entry_in_list)), 0);
942
943 #ifdef NOTQUITE
944 cp_warning ("replaced %D with %D", DECL_ASSEMBLER_NAME (base_fndecl),
945 DECL_ASSEMBLER_NAME (fndecl));
946 #endif
947 TREE_VALUE (old_entry_in_list) = new_entry;
948
949 /* Now assign virtual dispatch information, if unset. */
950 /* We can dispatch this, through any overridden base function. */
951 if (TREE_CODE (DECL_VINDEX (fndecl)) != INTEGER_CST)
952 {
953 DECL_VINDEX (fndecl) = DECL_VINDEX (base_fndecl);
954 DECL_CONTEXT (fndecl) = DECL_CONTEXT (base_fndecl);
955 }
956 }
957
958 /* Access the virtual function table entry N. VIRTUALS is the virtual
959 function table's initializer. */
960
961 static tree
962 get_vtable_entry_n (virtuals, n)
963 tree virtuals;
964 unsigned HOST_WIDE_INT n;
965 {
966 while (n > 0)
967 {
968 --n;
969 virtuals = TREE_CHAIN (virtuals);
970 }
971 return virtuals;
972 }
973
974 /* Add a virtual function to all the appropriate vtables for the class
975 T. DECL_VINDEX(X) should be error_mark_node, if we want to
976 allocate a new slot in our table. If it is error_mark_node, we
977 know that no other function from another vtable is overridden by X.
978 HAS_VIRTUAL keeps track of how many virtuals there are in our main
979 vtable for the type, and we build upon the PENDING_VIRTUALS list
980 and return it. */
981
982 static void
983 add_virtual_function (pv, phv, has_virtual, fndecl, t)
984 tree *pv, *phv;
985 int *has_virtual;
986 tree fndecl;
987 tree t; /* Structure type. */
988 {
989 tree pending_virtuals = *pv;
990 tree pending_hard_virtuals = *phv;
991
992 /* FUNCTION_TYPEs and OFFSET_TYPEs no longer freely
993 convert to void *. Make such a conversion here. */
994 tree vfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, fndecl);
995 TREE_CONSTANT (vfn) = 1;
996
997 #ifndef DUMB_USER
998 if (current_class_type == 0)
999 cp_warning ("internal problem, current_class_type is zero when adding `%D', please report",
1000 fndecl);
1001 if (current_class_type && t != current_class_type)
1002 cp_warning ("internal problem, current_class_type differs when adding `%D', please report",
1003 fndecl);
1004 #endif
1005
1006 /* If the virtual function is a redefinition of a prior one,
1007 figure out in which base class the new definition goes,
1008 and if necessary, make a fresh virtual function table
1009 to hold that entry. */
1010 if (DECL_VINDEX (fndecl) == error_mark_node)
1011 {
1012 tree entry;
1013
1014 /* We remember that this was the base sub-object for rtti. */
1015 CLASSTYPE_RTTI (t) = t;
1016
1017 /* If we are using thunks, use two slots at the front, one
1018 for the offset pointer, one for the tdesc pointer. */
1019 if (*has_virtual == 0 && flag_vtable_thunks)
1020 {
1021 *has_virtual = 1;
1022 }
1023
1024 /* Build a new INT_CST for this DECL_VINDEX. */
1025 {
1026 static tree index_table[256];
1027 tree idx;
1028 /* We skip a slot for the offset/tdesc entry. */
1029 int i = ++(*has_virtual);
1030
1031 if (i >= 256 || index_table[i] == 0)
1032 {
1033 idx = build_int_2 (i, 0);
1034 if (i < 256)
1035 index_table[i] = idx;
1036 }
1037 else
1038 idx = index_table[i];
1039
1040 /* Now assign virtual dispatch information. */
1041 DECL_VINDEX (fndecl) = idx;
1042 DECL_CONTEXT (fndecl) = t;
1043 }
1044 entry = build_vtable_entry (integer_zero_node, vfn);
1045 pending_virtuals = tree_cons (DECL_VINDEX (fndecl), entry, pending_virtuals);
1046 }
1047 /* Might already be INTEGER_CST if declared twice in class. We will
1048 give error later or we've already given it. */
1049 else if (TREE_CODE (DECL_VINDEX (fndecl)) != INTEGER_CST)
1050 {
1051 /* Need an entry in some other virtual function table.
1052 Deal with this after we have laid out our virtual base classes. */
1053 pending_hard_virtuals = temp_tree_cons (fndecl, vfn, pending_hard_virtuals);
1054 }
1055 *pv = pending_virtuals;
1056 *phv = pending_hard_virtuals;
1057 }
1058 \f
1059 /* Obstack on which to build the vector of class methods. */
1060 struct obstack class_obstack;
1061 extern struct obstack *current_obstack;
1062
1063 /* Add method METHOD to class TYPE. This is used when a method
1064 has been defined which did not initially appear in the class definition,
1065 and helps cut down on spurious error messages.
1066
1067 FIELDS is the entry in the METHOD_VEC vector entry of the class type where
1068 the method should be added. */
1069
1070 void
1071 add_method (type, fields, method)
1072 tree type, *fields, method;
1073 {
1074 /* We must make a copy of METHOD here, since we must be sure that
1075 we have exclusive title to this method's DECL_CHAIN. */
1076 tree decl;
1077
1078 push_obstacks (&permanent_obstack, &permanent_obstack);
1079 {
1080 decl = copy_node (method);
1081 if (DECL_RTL (decl) == 0
1082 && (!processing_template_decl
1083 || !uses_template_parms (decl)))
1084 {
1085 make_function_rtl (decl);
1086 DECL_RTL (method) = DECL_RTL (decl);
1087 }
1088 }
1089
1090 if (fields && *fields)
1091 {
1092 /* Take care not to hide destructor. */
1093 DECL_CHAIN (decl) = DECL_CHAIN (*fields);
1094 DECL_CHAIN (*fields) = decl;
1095 }
1096 else if (CLASSTYPE_METHOD_VEC (type) == 0)
1097 {
1098 tree method_vec = make_node (TREE_VEC);
1099 if (TYPE_IDENTIFIER (type) == DECL_NAME (decl))
1100 {
1101 /* ??? Is it possible for there to have been enough room in the
1102 current chunk for the tree_vec structure but not a tree_vec
1103 plus a tree*? Will this work in that case? */
1104 obstack_free (current_obstack, method_vec);
1105 obstack_blank (current_obstack, sizeof (struct tree_vec) + sizeof (tree *));
1106 if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl)))
1107 TREE_VEC_ELT (method_vec, 1) = decl;
1108 else
1109 TREE_VEC_ELT (method_vec, 0) = decl;
1110 TREE_VEC_LENGTH (method_vec) = 2;
1111 }
1112 else
1113 {
1114 /* ??? Is it possible for there to have been enough room in the
1115 current chunk for the tree_vec structure but not a tree_vec
1116 plus a tree*? Will this work in that case? */
1117 obstack_free (current_obstack, method_vec);
1118 obstack_blank (current_obstack, sizeof (struct tree_vec) + 2*sizeof (tree *));
1119 TREE_VEC_ELT (method_vec, 2) = decl;
1120 TREE_VEC_LENGTH (method_vec) = 3;
1121 obstack_finish (current_obstack);
1122 }
1123 CLASSTYPE_METHOD_VEC (type) = method_vec;
1124 }
1125 else
1126 {
1127 tree method_vec = CLASSTYPE_METHOD_VEC (type);
1128 int len = TREE_VEC_LENGTH (method_vec);
1129
1130 /* Adding a new ctor or dtor. This is easy because our
1131 METHOD_VEC always has a slot for such entries. */
1132 if (TYPE_IDENTIFIER (type) == DECL_NAME (decl))
1133 {
1134 int idx = !!DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl));
1135 /* TREE_VEC_ELT (method_vec, idx) = decl; */
1136 if (decl != TREE_VEC_ELT (method_vec, idx))
1137 {
1138 DECL_CHAIN (decl) = TREE_VEC_ELT (method_vec, idx);
1139 TREE_VEC_ELT (method_vec, idx) = decl;
1140 }
1141 }
1142 else
1143 {
1144 /* This is trickier. We try to extend the TREE_VEC in-place,
1145 but if that does not work, we copy all its data to a new
1146 TREE_VEC that's large enough. */
1147 struct obstack *ob = &class_obstack;
1148 tree *end = (tree *)obstack_next_free (ob);
1149
1150 if (end != TREE_VEC_END (method_vec))
1151 {
1152 ob = current_obstack;
1153 TREE_VEC_LENGTH (method_vec) += 1;
1154 TREE_VEC_ELT (method_vec, len) = NULL_TREE;
1155 method_vec = copy_node (method_vec);
1156 TREE_VEC_LENGTH (method_vec) -= 1;
1157 }
1158 else
1159 {
1160 tree tmp_vec = (tree) obstack_base (ob);
1161 if (obstack_room (ob) < sizeof (tree))
1162 {
1163 obstack_blank (ob, sizeof (struct tree_common)
1164 + tree_code_length[(int) TREE_VEC]
1165 * sizeof (char *)
1166 + len * sizeof (tree));
1167 tmp_vec = (tree) obstack_base (ob);
1168 bcopy ((char *) method_vec, (char *) tmp_vec,
1169 (sizeof (struct tree_common)
1170 + tree_code_length[(int) TREE_VEC] * sizeof (char *)
1171 + (len-1) * sizeof (tree)));
1172 method_vec = tmp_vec;
1173 }
1174 else
1175 obstack_blank (ob, sizeof (tree));
1176 }
1177
1178 obstack_finish (ob);
1179 TREE_VEC_ELT (method_vec, len) = decl;
1180 TREE_VEC_LENGTH (method_vec) = len + 1;
1181 CLASSTYPE_METHOD_VEC (type) = method_vec;
1182
1183 if (TYPE_BINFO_BASETYPES (type) && CLASSTYPE_BASELINK_VEC (type))
1184 {
1185 /* ??? May be better to know whether these can be extended? */
1186 tree baselink_vec = CLASSTYPE_BASELINK_VEC (type);
1187
1188 TREE_VEC_LENGTH (baselink_vec) += 1;
1189 CLASSTYPE_BASELINK_VEC (type) = copy_node (baselink_vec);
1190 TREE_VEC_LENGTH (baselink_vec) -= 1;
1191
1192 TREE_VEC_ELT (CLASSTYPE_BASELINK_VEC (type), len) = 0;
1193 }
1194 }
1195 }
1196 DECL_CONTEXT (decl) = type;
1197 DECL_CLASS_CONTEXT (decl) = type;
1198
1199 pop_obstacks ();
1200 }
1201
1202 /* Subroutines of finish_struct. */
1203
1204 /* Look through the list of fields for this struct, deleting
1205 duplicates as we go. This must be recursive to handle
1206 anonymous unions.
1207
1208 FIELD is the field which may not appear anywhere in FIELDS.
1209 FIELD_PTR, if non-null, is the starting point at which
1210 chained deletions may take place.
1211 The value returned is the first acceptable entry found
1212 in FIELDS.
1213
1214 Note that anonymous fields which are not of UNION_TYPE are
1215 not duplicates, they are just anonymous fields. This happens
1216 when we have unnamed bitfields, for example. */
1217
1218 static tree
1219 delete_duplicate_fields_1 (field, fields)
1220 tree field, fields;
1221 {
1222 tree x;
1223 tree prev = 0;
1224 if (DECL_NAME (field) == 0)
1225 {
1226 if (TREE_CODE (TREE_TYPE (field)) != UNION_TYPE)
1227 return fields;
1228
1229 for (x = TYPE_FIELDS (TREE_TYPE (field)); x; x = TREE_CHAIN (x))
1230 fields = delete_duplicate_fields_1 (x, fields);
1231 return fields;
1232 }
1233 else
1234 {
1235 for (x = fields; x; prev = x, x = TREE_CHAIN (x))
1236 {
1237 if (DECL_NAME (x) == 0)
1238 {
1239 if (TREE_CODE (TREE_TYPE (x)) != UNION_TYPE)
1240 continue;
1241 TYPE_FIELDS (TREE_TYPE (x))
1242 = delete_duplicate_fields_1 (field, TYPE_FIELDS (TREE_TYPE (x)));
1243 if (TYPE_FIELDS (TREE_TYPE (x)) == 0)
1244 {
1245 if (prev == 0)
1246 fields = TREE_CHAIN (fields);
1247 else
1248 TREE_CHAIN (prev) = TREE_CHAIN (x);
1249 }
1250 }
1251 else
1252 {
1253 if (DECL_NAME (field) == DECL_NAME (x))
1254 {
1255 if (TREE_CODE (field) == CONST_DECL
1256 && TREE_CODE (x) == CONST_DECL)
1257 cp_error_at ("duplicate enum value `%D'", x);
1258 else if (TREE_CODE (field) == CONST_DECL
1259 || TREE_CODE (x) == CONST_DECL)
1260 cp_error_at ("duplicate field `%D' (as enum and non-enum)",
1261 x);
1262 else if (TREE_CODE (field) == TYPE_DECL
1263 && TREE_CODE (x) == TYPE_DECL)
1264 {
1265 if (TREE_TYPE (field) == TREE_TYPE (x))
1266 continue;
1267 cp_error_at ("duplicate nested type `%D'", x);
1268 }
1269 else if (TREE_CODE (field) == TYPE_DECL
1270 || TREE_CODE (x) == TYPE_DECL)
1271 {
1272 /* Hide tag decls. */
1273 if ((TREE_CODE (field) == TYPE_DECL
1274 && DECL_ARTIFICIAL (field))
1275 || (TREE_CODE (x) == TYPE_DECL
1276 && DECL_ARTIFICIAL (x)))
1277 continue;
1278 cp_error_at ("duplicate field `%D' (as type and non-type)",
1279 x);
1280 }
1281 else
1282 cp_error_at ("duplicate member `%D'", x);
1283 if (prev == 0)
1284 fields = TREE_CHAIN (fields);
1285 else
1286 TREE_CHAIN (prev) = TREE_CHAIN (x);
1287 }
1288 }
1289 }
1290 }
1291 return fields;
1292 }
1293
1294 static void
1295 delete_duplicate_fields (fields)
1296 tree fields;
1297 {
1298 tree x;
1299 for (x = fields; x && TREE_CHAIN (x); x = TREE_CHAIN (x))
1300 TREE_CHAIN (x) = delete_duplicate_fields_1 (x, TREE_CHAIN (x));
1301 }
1302
1303 /* Change the access of FDECL to ACCESS in T.
1304 Return 1 if change was legit, otherwise return 0. */
1305
1306 static int
1307 alter_access (t, fdecl, access)
1308 tree t;
1309 tree fdecl;
1310 tree access;
1311 {
1312 tree elem = purpose_member (t, DECL_ACCESS (fdecl));
1313 if (elem)
1314 {
1315 if (TREE_VALUE (elem) != access)
1316 {
1317 if (TREE_CODE (TREE_TYPE (fdecl)) == FUNCTION_DECL)
1318 cp_error_at ("conflicting access specifications for method `%D', ignored", TREE_TYPE (fdecl));
1319 else
1320 error ("conflicting access specifications for field `%s', ignored",
1321 IDENTIFIER_POINTER (DECL_NAME (fdecl)));
1322 }
1323 else
1324 {
1325 /* They're changing the access to the same thing they changed
1326 it to before. That's OK. */
1327 ;
1328 }
1329 }
1330 else
1331 {
1332 enforce_access (TYPE_BINFO (t), fdecl);
1333
1334 DECL_ACCESS (fdecl) = tree_cons (t, access, DECL_ACCESS (fdecl));
1335 return 1;
1336 }
1337 return 0;
1338 }
1339
1340 /* If FOR_TYPE needs to reinitialize virtual function table pointers
1341 for TYPE's sub-objects, add such reinitializations to BASE_INIT_LIST.
1342 Returns BASE_INIT_LIST appropriately modified. */
1343
1344 static tree
1345 maybe_fixup_vptrs (for_type, binfo, base_init_list)
1346 tree for_type, binfo, base_init_list;
1347 {
1348 /* Now reinitialize any slots that don't fall under our virtual
1349 function table pointer. */
1350 tree vfields = CLASSTYPE_VFIELDS (BINFO_TYPE (binfo));
1351 while (vfields)
1352 {
1353 tree basetype = VF_NORMAL_VALUE (vfields)
1354 ? TYPE_MAIN_VARIANT (VF_NORMAL_VALUE (vfields))
1355 : VF_BASETYPE_VALUE (vfields);
1356
1357 tree base_binfo = get_binfo (basetype, for_type, 0);
1358 /* Punt until this is implemented. */
1359 if (1 /* BINFO_MODIFIED (base_binfo) */)
1360 {
1361 tree base_offset = get_vfield_offset (base_binfo);
1362 if (! tree_int_cst_equal (base_offset, get_vfield_offset (TYPE_BINFO (for_type)))
1363 && ! tree_int_cst_equal (base_offset, get_vfield_offset (binfo)))
1364 base_init_list = tree_cons (error_mark_node, base_binfo,
1365 base_init_list);
1366 }
1367 vfields = TREE_CHAIN (vfields);
1368 }
1369 return base_init_list;
1370 }
1371
1372 /* If TYPE does not have a constructor, then the compiler must
1373 manually deal with all of the initialization this type requires.
1374
1375 If a base initializer exists only to fill in the virtual function
1376 table pointer, then we mark that fact with the TREE_VIRTUAL bit.
1377 This way, we avoid multiple initializations of the same field by
1378 each virtual function table up the class hierarchy.
1379
1380 Virtual base class pointers are not initialized here. They are
1381 initialized only at the "top level" of object creation. If we
1382 initialized them here, we would have to skip a lot of work. */
1383
1384 static void
1385 build_class_init_list (type)
1386 tree type;
1387 {
1388 tree base_init_list = NULL_TREE;
1389 tree member_init_list = NULL_TREE;
1390
1391 /* Since we build member_init_list and base_init_list using
1392 tree_cons, backwards fields the all through work. */
1393 tree x;
1394 tree binfos = BINFO_BASETYPES (TYPE_BINFO (type));
1395 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
1396
1397 for (x = TYPE_FIELDS (type); x; x = TREE_CHAIN (x))
1398 {
1399 if (TREE_CODE (x) != FIELD_DECL)
1400 continue;
1401
1402 if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (x))
1403 || DECL_INITIAL (x) != NULL_TREE)
1404 member_init_list = tree_cons (x, type, member_init_list);
1405 }
1406 member_init_list = nreverse (member_init_list);
1407
1408 /* We will end up doing this last. Need special marker
1409 to avoid infinite regress. */
1410 if (TYPE_VIRTUAL_P (type))
1411 {
1412 base_init_list = build_tree_list (error_mark_node, TYPE_BINFO (type));
1413 if (CLASSTYPE_NEEDS_VIRTUAL_REINIT (type) == 0)
1414 TREE_VALUE (base_init_list) = NULL_TREE;
1415 TREE_ADDRESSABLE (base_init_list) = 1;
1416 }
1417
1418 /* Each base class which needs to have initialization
1419 of some kind gets to make such requests known here. */
1420 for (i = n_baseclasses-1; i >= 0; i--)
1421 {
1422 tree base_binfo = TREE_VEC_ELT (binfos, i);
1423 tree blist;
1424
1425 /* Don't initialize virtual baseclasses this way. */
1426 if (TREE_VIA_VIRTUAL (base_binfo))
1427 continue;
1428
1429 if (TYPE_HAS_CONSTRUCTOR (BINFO_TYPE (base_binfo)))
1430 {
1431 /* ...and the last shall come first... */
1432 base_init_list = maybe_fixup_vptrs (type, base_binfo, base_init_list);
1433 base_init_list = tree_cons (NULL_TREE, base_binfo, base_init_list);
1434 continue;
1435 }
1436
1437 if ((blist = CLASSTYPE_BASE_INIT_LIST (BINFO_TYPE (base_binfo))) == NULL_TREE)
1438 /* Nothing to initialize. */
1439 continue;
1440
1441 /* ...ditto... */
1442 base_init_list = maybe_fixup_vptrs (type, base_binfo, base_init_list);
1443
1444 /* This is normally true for single inheritance.
1445 The win is we can shrink the chain of initializations
1446 to be done by only converting to the actual type
1447 we are interested in. */
1448 if (TREE_VALUE (blist)
1449 && TREE_CODE (TREE_VALUE (blist)) == TREE_VEC
1450 && tree_int_cst_equal (BINFO_OFFSET (base_binfo),
1451 BINFO_OFFSET (TREE_VALUE (blist))))
1452 {
1453 if (base_init_list)
1454 {
1455 /* Does it do more than just fill in a
1456 virtual function table pointer? */
1457 if (! TREE_ADDRESSABLE (blist))
1458 base_init_list = build_tree_list (blist, base_init_list);
1459 /* Can we get by just with the virtual function table
1460 pointer that it fills in? */
1461 else if (TREE_ADDRESSABLE (base_init_list)
1462 && TREE_VALUE (base_init_list) == 0)
1463 base_init_list = blist;
1464 /* Maybe, but it is not obvious as the previous case. */
1465 else if (! CLASSTYPE_NEEDS_VIRTUAL_REINIT (type))
1466 {
1467 tree last = tree_last (base_init_list);
1468 while (TREE_VALUE (last)
1469 && TREE_CODE (TREE_VALUE (last)) == TREE_LIST)
1470 last = tree_last (TREE_VALUE (last));
1471 if (TREE_VALUE (last) == 0)
1472 base_init_list = build_tree_list (blist, base_init_list);
1473 }
1474 }
1475 else
1476 base_init_list = blist;
1477 }
1478 else
1479 {
1480 /* The function expand_aggr_init knows how to do the
1481 initialization of `basetype' without getting
1482 an explicit `blist'. */
1483 if (base_init_list)
1484 base_init_list = tree_cons (NULL_TREE, base_binfo, base_init_list);
1485 else
1486 base_init_list = CLASSTYPE_BINFO_AS_LIST (BINFO_TYPE (base_binfo));
1487 }
1488 }
1489
1490 if (base_init_list)
1491 {
1492 if (member_init_list)
1493 CLASSTYPE_BASE_INIT_LIST (type) =
1494 build_tree_list (base_init_list, member_init_list);
1495 else
1496 CLASSTYPE_BASE_INIT_LIST (type) = base_init_list;
1497 }
1498 else if (member_init_list)
1499 CLASSTYPE_BASE_INIT_LIST (type) = member_init_list;
1500 }
1501 \f
1502 struct base_info
1503 {
1504 int has_virtual;
1505 int max_has_virtual;
1506 int n_ancestors;
1507 tree vfield;
1508 tree vfields;
1509 tree rtti;
1510 char cant_have_default_ctor;
1511 char cant_have_const_ctor;
1512 char no_const_asn_ref;
1513 };
1514
1515 /* Record information about type T derived from its base classes.
1516 Store most of that information in T itself, and place the
1517 remaining information in the struct BASE_INFO.
1518
1519 Propagate basetype offsets throughout the lattice. Note that the
1520 lattice topped by T is really a pair: it's a DAG that gives the
1521 structure of the derivation hierarchy, and it's a list of the
1522 virtual baseclasses that appear anywhere in the DAG. When a vbase
1523 type appears in the DAG, it's offset is 0, and it's children start
1524 their offsets from that point. When a vbase type appears in the list,
1525 its offset is the offset it has in the hierarchy, and its children's
1526 offsets include that offset in theirs.
1527
1528 Returns the index of the first base class to have virtual functions,
1529 or -1 if no such base class. */
1530
1531 static int
1532 finish_base_struct (t, b)
1533 tree t;
1534 struct base_info *b;
1535 {
1536 tree binfos = TYPE_BINFO_BASETYPES (t);
1537 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
1538 int first_vfn_base_index = -1;
1539 bzero ((char *) b, sizeof (struct base_info));
1540
1541 for (i = 0; i < n_baseclasses; i++)
1542 {
1543 tree base_binfo = TREE_VEC_ELT (binfos, i);
1544 tree basetype = BINFO_TYPE (base_binfo);
1545
1546 /* Effective C++ rule 14. We only need to check TYPE_VIRTUAL_P
1547 here because the case of virtual functions but non-virtual
1548 dtor is handled in finish_struct_1. */
1549 if (warn_ecpp && ! TYPE_VIRTUAL_P (basetype)
1550 && TYPE_HAS_DESTRUCTOR (basetype))
1551 cp_warning ("base class `%#T' has a non-virtual destructor", basetype);
1552
1553 /* If the type of basetype is incomplete, then
1554 we already complained about that fact
1555 (and we should have fixed it up as well). */
1556 if (TYPE_SIZE (basetype) == 0)
1557 {
1558 int j;
1559 /* The base type is of incomplete type. It is
1560 probably best to pretend that it does not
1561 exist. */
1562 if (i == n_baseclasses-1)
1563 TREE_VEC_ELT (binfos, i) = NULL_TREE;
1564 TREE_VEC_LENGTH (binfos) -= 1;
1565 n_baseclasses -= 1;
1566 for (j = i; j+1 < n_baseclasses; j++)
1567 TREE_VEC_ELT (binfos, j) = TREE_VEC_ELT (binfos, j+1);
1568 }
1569
1570 if (! TYPE_HAS_CONST_INIT_REF (basetype))
1571 b->cant_have_const_ctor = 1;
1572
1573 if (TYPE_HAS_CONSTRUCTOR (basetype)
1574 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype))
1575 {
1576 b->cant_have_default_ctor = 1;
1577 if (! TYPE_HAS_CONSTRUCTOR (t))
1578 {
1579 cp_pedwarn ("base `%T' with only non-default constructor",
1580 basetype);
1581 cp_pedwarn ("in class without a constructor");
1582 }
1583 }
1584
1585 if (TYPE_HAS_ASSIGN_REF (basetype)
1586 && !TYPE_HAS_CONST_ASSIGN_REF (basetype))
1587 b->no_const_asn_ref = 1;
1588
1589 b->n_ancestors += CLASSTYPE_N_SUPERCLASSES (basetype);
1590 TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (basetype);
1591 TYPE_NEEDS_DESTRUCTOR (t) |= TYPE_NEEDS_DESTRUCTOR (basetype);
1592 TYPE_HAS_COMPLEX_ASSIGN_REF (t) |= TYPE_HAS_COMPLEX_ASSIGN_REF (basetype);
1593 TYPE_HAS_COMPLEX_INIT_REF (t) |= TYPE_HAS_COMPLEX_INIT_REF (basetype);
1594
1595 TYPE_OVERLOADS_CALL_EXPR (t) |= TYPE_OVERLOADS_CALL_EXPR (basetype);
1596 TYPE_OVERLOADS_ARRAY_REF (t) |= TYPE_OVERLOADS_ARRAY_REF (basetype);
1597 TYPE_OVERLOADS_ARROW (t) |= TYPE_OVERLOADS_ARROW (basetype);
1598
1599 if (! TREE_VIA_VIRTUAL (base_binfo))
1600 CLASSTYPE_N_SUPERCLASSES (t) += 1;
1601
1602 if (TYPE_VIRTUAL_P (basetype))
1603 {
1604 /* Ensure that this is set from at least a virtual base
1605 class. */
1606 if (b->rtti == NULL_TREE)
1607 b->rtti = CLASSTYPE_RTTI (basetype);
1608
1609 /* Don't borrow virtuals from virtual baseclasses. */
1610 if (TREE_VIA_VIRTUAL (base_binfo))
1611 continue;
1612
1613 if (first_vfn_base_index < 0)
1614 {
1615 tree vfields;
1616 first_vfn_base_index = i;
1617
1618 /* Update these two, now that we know what vtable we are
1619 going to extend. This is so that we can add virtual
1620 functions, and override them properly. */
1621 TYPE_BINFO_VTABLE (t) = TYPE_BINFO_VTABLE (basetype);
1622 TYPE_BINFO_VIRTUALS (t) = TYPE_BINFO_VIRTUALS (basetype);
1623 b->has_virtual = CLASSTYPE_VSIZE (basetype);
1624 b->vfield = CLASSTYPE_VFIELD (basetype);
1625 b->vfields = copy_list (CLASSTYPE_VFIELDS (basetype));
1626 vfields = b->vfields;
1627 while (vfields)
1628 {
1629 if (VF_BINFO_VALUE (vfields) == NULL_TREE
1630 || ! TREE_VIA_VIRTUAL (VF_BINFO_VALUE (vfields)))
1631 {
1632 tree value = VF_BASETYPE_VALUE (vfields);
1633 if (DECL_NAME (CLASSTYPE_VFIELD (value))
1634 == DECL_NAME (CLASSTYPE_VFIELD (basetype)))
1635 VF_NORMAL_VALUE (b->vfields) = basetype;
1636 else
1637 VF_NORMAL_VALUE (b->vfields) = VF_NORMAL_VALUE (vfields);
1638 }
1639 vfields = TREE_CHAIN (vfields);
1640 }
1641 CLASSTYPE_VFIELD (t) = b->vfield;
1642 }
1643 else
1644 {
1645 /* Only add unique vfields, and flatten them out as we go. */
1646 tree vfields = CLASSTYPE_VFIELDS (basetype);
1647 while (vfields)
1648 {
1649 if (VF_BINFO_VALUE (vfields) == NULL_TREE
1650 || ! TREE_VIA_VIRTUAL (VF_BINFO_VALUE (vfields)))
1651 {
1652 tree value = VF_BASETYPE_VALUE (vfields);
1653 b->vfields = tree_cons (base_binfo, value, b->vfields);
1654 if (DECL_NAME (CLASSTYPE_VFIELD (value))
1655 == DECL_NAME (CLASSTYPE_VFIELD (basetype)))
1656 VF_NORMAL_VALUE (b->vfields) = basetype;
1657 else
1658 VF_NORMAL_VALUE (b->vfields) = VF_NORMAL_VALUE (vfields);
1659 }
1660 vfields = TREE_CHAIN (vfields);
1661 }
1662
1663 if (b->has_virtual == 0)
1664 {
1665 first_vfn_base_index = i;
1666
1667 /* Update these two, now that we know what vtable we are
1668 going to extend. This is so that we can add virtual
1669 functions, and override them properly. */
1670 TYPE_BINFO_VTABLE (t) = TYPE_BINFO_VTABLE (basetype);
1671 TYPE_BINFO_VIRTUALS (t) = TYPE_BINFO_VIRTUALS (basetype);
1672 b->has_virtual = CLASSTYPE_VSIZE (basetype);
1673 b->vfield = CLASSTYPE_VFIELD (basetype);
1674 CLASSTYPE_VFIELD (t) = b->vfield;
1675 /* When we install the first one, set the VF_NORMAL_VALUE
1676 to be the current class, as this it is the most derived
1677 class. Hopefully, this is not set to something else
1678 later. (mrs) */
1679 vfields = b->vfields;
1680 while (vfields)
1681 {
1682 if (DECL_NAME (CLASSTYPE_VFIELD (t))
1683 == DECL_NAME (CLASSTYPE_VFIELD (basetype)))
1684 {
1685 VF_NORMAL_VALUE (vfields) = t;
1686 /* There should only be one of them! And it should
1687 always be found, if we get into here. (mrs) */
1688 break;
1689 }
1690 vfields = TREE_CHAIN (vfields);
1691 }
1692 }
1693 }
1694 }
1695 }
1696
1697 /* This comment said "Must come after offsets are fixed for all bases."
1698 Well, now this happens before the offsets are fixed, but it seems to
1699 work fine. Guess we'll see... */
1700 for (i = 0; i < n_baseclasses; i++)
1701 {
1702 tree base_binfo = TREE_VEC_ELT (binfos, i);
1703 tree basetype = BINFO_TYPE (base_binfo);
1704
1705 if (get_base_distance (basetype, t, 0, (tree*)0) == -2)
1706 {
1707 cp_warning ("direct base `%T' inaccessible in `%T' due to ambiguity",
1708 basetype, t);
1709 }
1710 }
1711 {
1712 tree v = get_vbase_types (t);
1713
1714 for (; v; v = TREE_CHAIN (v))
1715 {
1716 tree basetype = BINFO_TYPE (v);
1717 if (get_base_distance (basetype, t, 0, (tree*)0) == -2)
1718 {
1719 if (extra_warnings)
1720 cp_warning ("virtual base `%T' inaccessible in `%T' due to ambiguity",
1721 basetype, t);
1722 }
1723 }
1724 }
1725
1726 {
1727 tree vfields;
1728 /* Find the base class with the largest number of virtual functions. */
1729 for (vfields = b->vfields; vfields; vfields = TREE_CHAIN (vfields))
1730 {
1731 if (CLASSTYPE_VSIZE (VF_BASETYPE_VALUE (vfields)) > b->max_has_virtual)
1732 b->max_has_virtual = CLASSTYPE_VSIZE (VF_BASETYPE_VALUE (vfields));
1733 if (VF_DERIVED_VALUE (vfields)
1734 && CLASSTYPE_VSIZE (VF_DERIVED_VALUE (vfields)) > b->max_has_virtual)
1735 b->max_has_virtual = CLASSTYPE_VSIZE (VF_DERIVED_VALUE (vfields));
1736 }
1737 }
1738
1739 if (b->vfield == 0)
1740 /* If all virtual functions come only from virtual baseclasses. */
1741 return -1;
1742
1743 /* Update the rtti base if we have a non-virtual base class version
1744 of it. */
1745 b->rtti = CLASSTYPE_RTTI (BINFO_TYPE (TREE_VEC_ELT (binfos, first_vfn_base_index)));
1746
1747 return first_vfn_base_index;
1748 }
1749
1750 static int
1751 typecode_p (type, code)
1752 tree type;
1753 enum tree_code code;
1754 {
1755 return (TREE_CODE (type) == code
1756 || (TREE_CODE (type) == REFERENCE_TYPE
1757 && TREE_CODE (TREE_TYPE (type)) == code));
1758 }
1759 \f
1760 /* Set memoizing fields and bits of T (and its variants) for later use.
1761 MAX_HAS_VIRTUAL is the largest size of any T's virtual function tables. */
1762
1763 static void
1764 finish_struct_bits (t, max_has_virtual)
1765 tree t;
1766 int max_has_virtual;
1767 {
1768 int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t);
1769
1770 /* Fix up variants (if any). */
1771 tree variants = TYPE_NEXT_VARIANT (t);
1772 while (variants)
1773 {
1774 /* These fields are in the _TYPE part of the node, not in
1775 the TYPE_LANG_SPECIFIC component, so they are not shared. */
1776 TYPE_HAS_CONSTRUCTOR (variants) = TYPE_HAS_CONSTRUCTOR (t);
1777 TYPE_HAS_DESTRUCTOR (variants) = TYPE_HAS_DESTRUCTOR (t);
1778 TYPE_NEEDS_CONSTRUCTING (variants) = TYPE_NEEDS_CONSTRUCTING (t);
1779 TYPE_NEEDS_DESTRUCTOR (variants) = TYPE_NEEDS_DESTRUCTOR (t);
1780
1781 TYPE_USES_COMPLEX_INHERITANCE (variants) = TYPE_USES_COMPLEX_INHERITANCE (t);
1782 TYPE_VIRTUAL_P (variants) = TYPE_VIRTUAL_P (t);
1783 TYPE_USES_VIRTUAL_BASECLASSES (variants) = TYPE_USES_VIRTUAL_BASECLASSES (t);
1784 /* Copy whatever these are holding today. */
1785 TYPE_MIN_VALUE (variants) = TYPE_MIN_VALUE (t);
1786 TYPE_MAX_VALUE (variants) = TYPE_MAX_VALUE (t);
1787 TYPE_FIELDS (variants) = TYPE_FIELDS (t);
1788 TYPE_SIZE (variants) = TYPE_SIZE (t);
1789 variants = TYPE_NEXT_VARIANT (variants);
1790 }
1791
1792 if (n_baseclasses && max_has_virtual)
1793 {
1794 /* Done by `finish_struct' for classes without baseclasses. */
1795 int might_have_abstract_virtuals = CLASSTYPE_ABSTRACT_VIRTUALS (t) != 0;
1796 tree binfos = TYPE_BINFO_BASETYPES (t);
1797 for (i = n_baseclasses-1; i >= 0; i--)
1798 {
1799 might_have_abstract_virtuals
1800 |= (CLASSTYPE_ABSTRACT_VIRTUALS (BINFO_TYPE (TREE_VEC_ELT (binfos, i))) != 0);
1801 if (might_have_abstract_virtuals)
1802 break;
1803 }
1804 if (might_have_abstract_virtuals)
1805 {
1806 /* We use error_mark_node from override_one_vtable to signal
1807 an artificial abstract. */
1808 if (CLASSTYPE_ABSTRACT_VIRTUALS (t) == error_mark_node)
1809 CLASSTYPE_ABSTRACT_VIRTUALS (t) = NULL_TREE;
1810 CLASSTYPE_ABSTRACT_VIRTUALS (t) = get_abstract_virtuals (t);
1811 }
1812 }
1813
1814 if (n_baseclasses)
1815 {
1816 /* Notice whether this class has type conversion functions defined. */
1817 tree binfo = TYPE_BINFO (t);
1818 tree binfos = BINFO_BASETYPES (binfo);
1819 tree basetype;
1820
1821 for (i = n_baseclasses-1; i >= 0; i--)
1822 {
1823 basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
1824
1825 TYPE_HAS_CONVERSION (t) |= TYPE_HAS_CONVERSION (basetype);
1826 if (CLASSTYPE_MAX_DEPTH (basetype) >= CLASSTYPE_MAX_DEPTH (t))
1827 CLASSTYPE_MAX_DEPTH (t) = CLASSTYPE_MAX_DEPTH (basetype) + 1;
1828 }
1829 }
1830
1831 /* If this type has a copy constructor, force its mode to be BLKmode, and
1832 force its TREE_ADDRESSABLE bit to be nonzero. This will cause it to
1833 be passed by invisible reference and prevent it from being returned in
1834 a register.
1835
1836 Also do this if the class has BLKmode but can still be returned in
1837 registers, since function_cannot_inline_p won't let us inline
1838 functions returning such a type. This affects the HP-PA. */
1839 if (! TYPE_HAS_TRIVIAL_INIT_REF (t)
1840 || (TYPE_MODE (t) == BLKmode && ! aggregate_value_p (t)
1841 && CLASSTYPE_NON_AGGREGATE (t)))
1842 {
1843 tree variants;
1844 DECL_MODE (TYPE_MAIN_DECL (t)) = BLKmode;
1845 for (variants = t; variants; variants = TYPE_NEXT_VARIANT (variants))
1846 {
1847 TYPE_MODE (variants) = BLKmode;
1848 TREE_ADDRESSABLE (variants) = 1;
1849 }
1850 }
1851 }
1852
1853 /* Add FNDECL to the method_vec growing on the class_obstack. Used by
1854 finish_struct_methods. Note, FNDECL cannot be a constructor or
1855 destructor, those cases are handled by the caller. */
1856
1857 static void
1858 grow_method (fndecl, method_vec_ptr)
1859 tree fndecl;
1860 tree *method_vec_ptr;
1861 {
1862 tree method_vec = (tree)obstack_base (&class_obstack);
1863
1864 /* Start off past the constructors and destructor. */
1865 tree *testp = &TREE_VEC_ELT (method_vec, 2);
1866
1867 while (testp < (tree *) obstack_next_free (&class_obstack)
1868 && (*testp == NULL_TREE || DECL_NAME (*testp) != DECL_NAME (fndecl)))
1869 testp++;
1870
1871 if (testp < (tree *) obstack_next_free (&class_obstack))
1872 {
1873 tree *p;
1874 for (p = testp; *p; )
1875 p = &DECL_CHAIN (*p);
1876 *p = fndecl;
1877 }
1878 else
1879 {
1880 obstack_ptr_grow (&class_obstack, fndecl);
1881 *method_vec_ptr = (tree)obstack_base (&class_obstack);
1882 }
1883 }
1884
1885 /* Warn about duplicate methods in fn_fields. Also compact method
1886 lists so that lookup can be made faster.
1887
1888 Algorithm: Outer loop builds lists by method name. Inner loop
1889 checks for redundant method names within a list.
1890
1891 Data Structure: List of method lists. The outer list is a
1892 TREE_LIST, whose TREE_PURPOSE field is the field name and the
1893 TREE_VALUE is the DECL_CHAIN of the FUNCTION_DECLs. TREE_CHAIN
1894 links the entire list of methods for TYPE_METHODS. Friends are
1895 chained in the same way as member functions (? TREE_CHAIN or
1896 DECL_CHAIN), but they live in the TREE_TYPE field of the outer
1897 list. That allows them to be quickly deleted, and requires no
1898 extra storage.
1899
1900 If there are any constructors/destructors, they are moved to the
1901 front of the list. This makes pushclass more efficient.
1902
1903 We also link each field which has shares a name with its baseclass
1904 to the head of the list of fields for that base class. This allows
1905 us to reduce search time in places like `build_method_call' to
1906 consider only reasonably likely functions. */
1907
1908 tree
1909 finish_struct_methods (t, fn_fields, nonprivate_method)
1910 tree t;
1911 tree fn_fields;
1912 int nonprivate_method;
1913 {
1914 tree method_vec;
1915 tree save_fn_fields = fn_fields;
1916 tree ctor_name = constructor_name (t);
1917 int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t);
1918
1919 /* Now prepare to gather fn_fields into vector. */
1920 struct obstack *ambient_obstack = current_obstack;
1921 current_obstack = &class_obstack;
1922 method_vec = make_tree_vec (2);
1923 current_obstack = ambient_obstack;
1924
1925 /* Now make this a live vector. */
1926 obstack_free (&class_obstack, method_vec);
1927
1928 /* Save room for constructors and destructors. */
1929 obstack_blank (&class_obstack, sizeof (struct tree_vec) + sizeof (struct tree *));
1930
1931 /* First fill in entry 0 with the constructors, entry 1 with destructors,
1932 and the next few with type conversion operators (if any). */
1933
1934 for (; fn_fields; fn_fields = TREE_CHAIN (fn_fields))
1935 {
1936 tree fn_name = DECL_NAME (fn_fields);
1937
1938 /* Clear out this flag.
1939
1940 @@ Doug may figure out how to break
1941 @@ this with nested classes and friends. */
1942 DECL_IN_AGGR_P (fn_fields) = 0;
1943
1944 /* Note here that a copy ctor is private, so we don't dare generate
1945 a default copy constructor for a class that has a member
1946 of this type without making sure they have access to it. */
1947 if (fn_name == ctor_name)
1948 {
1949 tree parmtypes = FUNCTION_ARG_CHAIN (fn_fields);
1950 tree parmtype = parmtypes ? TREE_VALUE (parmtypes) : void_type_node;
1951
1952 if (TREE_CODE (parmtype) == REFERENCE_TYPE
1953 && TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)) == t)
1954 {
1955 if (TREE_CHAIN (parmtypes) == NULL_TREE
1956 || TREE_CHAIN (parmtypes) == void_list_node
1957 || TREE_PURPOSE (TREE_CHAIN (parmtypes)))
1958 {
1959 if (TREE_PROTECTED (fn_fields))
1960 TYPE_HAS_NONPUBLIC_CTOR (t) = 1;
1961 else if (TREE_PRIVATE (fn_fields))
1962 TYPE_HAS_NONPUBLIC_CTOR (t) = 2;
1963 }
1964 }
1965 if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fn_fields)))
1966 {
1967 /* Destructors go in slot 1. */
1968 DECL_CHAIN (fn_fields) = TREE_VEC_ELT (method_vec, 1);
1969 TREE_VEC_ELT (method_vec, 1) = fn_fields;
1970 }
1971 else
1972 {
1973 /* Constructors go in slot 0. */
1974 DECL_CHAIN (fn_fields) = TREE_VEC_ELT (method_vec, 0);
1975 TREE_VEC_ELT (method_vec, 0) = fn_fields;
1976 }
1977 }
1978 else if (IDENTIFIER_TYPENAME_P (fn_name))
1979 grow_method (fn_fields, &method_vec);
1980 }
1981
1982 fn_fields = save_fn_fields;
1983 for (; fn_fields; fn_fields = TREE_CHAIN (fn_fields))
1984 {
1985 tree fn_name = DECL_NAME (fn_fields);
1986
1987 if (fn_name == ctor_name || IDENTIFIER_TYPENAME_P (fn_name))
1988 continue;
1989
1990 if (fn_name == ansi_opname[(int) MODIFY_EXPR])
1991 {
1992 tree parmtype = TREE_VALUE (FUNCTION_ARG_CHAIN (fn_fields));
1993
1994 if (copy_assignment_arg_p (parmtype, DECL_VIRTUAL_P (fn_fields)))
1995 {
1996 if (TREE_PROTECTED (fn_fields))
1997 TYPE_HAS_NONPUBLIC_ASSIGN_REF (t) = 1;
1998 else if (TREE_PRIVATE (fn_fields))
1999 TYPE_HAS_NONPUBLIC_ASSIGN_REF (t) = 2;
2000 }
2001 }
2002
2003 grow_method (fn_fields, &method_vec);
2004 }
2005
2006 TREE_VEC_LENGTH (method_vec) = (tree *)obstack_next_free (&class_obstack)
2007 - (&TREE_VEC_ELT (method_vec, 0));
2008 obstack_finish (&class_obstack);
2009 CLASSTYPE_METHOD_VEC (t) = method_vec;
2010
2011 if (nonprivate_method == 0
2012 && CLASSTYPE_FRIEND_CLASSES (t) == NULL_TREE
2013 && DECL_FRIENDLIST (TYPE_MAIN_DECL (t)) == NULL_TREE)
2014 {
2015 tree binfos = BINFO_BASETYPES (TYPE_BINFO (t));
2016 for (i = 0; i < n_baseclasses; i++)
2017 if (TREE_VIA_PUBLIC (TREE_VEC_ELT (binfos, i))
2018 || TREE_VIA_PROTECTED (TREE_VEC_ELT (binfos, i)))
2019 {
2020 nonprivate_method = 1;
2021 break;
2022 }
2023 if (nonprivate_method == 0
2024 && warn_ctor_dtor_privacy)
2025 cp_warning ("all member functions in class `%T' are private", t);
2026 }
2027
2028 /* Warn if all destructors are private (in which case this class is
2029 effectively unusable. */
2030 if (TYPE_HAS_DESTRUCTOR (t))
2031 {
2032 tree dtor = TREE_VEC_ELT (method_vec, 1);
2033
2034 /* Wild parse errors can cause this to happen. */
2035 if (dtor == NULL_TREE)
2036 TYPE_HAS_DESTRUCTOR (t) = 0;
2037 else if (TREE_PRIVATE (dtor)
2038 && CLASSTYPE_FRIEND_CLASSES (t) == NULL_TREE
2039 && DECL_FRIENDLIST (TYPE_MAIN_DECL (t)) == NULL_TREE
2040 && warn_ctor_dtor_privacy)
2041 cp_warning ("`%#T' only defines a private destructor and has no friends",
2042 t);
2043 }
2044
2045 /* Now for each member function (except for constructors and
2046 destructors), compute where member functions of the same
2047 name reside in base classes. */
2048 if (n_baseclasses != 0
2049 && TREE_VEC_LENGTH (method_vec) > 2)
2050 {
2051 int len = TREE_VEC_LENGTH (method_vec);
2052 tree baselink_vec = make_tree_vec (len);
2053 int any_links = 0;
2054 tree baselink_binfo = build_tree_list (NULL_TREE, TYPE_BINFO (t));
2055
2056 for (i = 2; i < len; i++)
2057 {
2058 TREE_VEC_ELT (baselink_vec, i)
2059 = get_baselinks (baselink_binfo, t, DECL_NAME (TREE_VEC_ELT (method_vec, i)));
2060 if (TREE_VEC_ELT (baselink_vec, i) != 0)
2061 any_links = 1;
2062 }
2063 if (any_links != 0)
2064 CLASSTYPE_BASELINK_VEC (t) = baselink_vec;
2065 else
2066 obstack_free (current_obstack, baselink_vec);
2067 }
2068
2069 return method_vec;
2070 }
2071
2072 /* Emit error when a duplicate definition of a type is seen. Patch up. */
2073
2074 void
2075 duplicate_tag_error (t)
2076 tree t;
2077 {
2078 cp_error ("redefinition of `%#T'", t);
2079 cp_error_at ("previous definition here", t);
2080
2081 /* Pretend we haven't defined this type. */
2082
2083 /* All of the component_decl's were TREE_CHAINed together in the parser.
2084 finish_struct_methods walks these chains and assembles all methods with
2085 the same base name into DECL_CHAINs. Now we don't need the parser chains
2086 anymore, so we unravel them. */
2087
2088 /* This used to be in finish_struct, but it turns out that the
2089 TREE_CHAIN is used by dbxout_type_methods and perhaps some other
2090 things... */
2091 if (CLASSTYPE_METHOD_VEC (t))
2092 {
2093 tree method_vec = CLASSTYPE_METHOD_VEC (t);
2094 int i, len = TREE_VEC_LENGTH (method_vec);
2095 for (i = 0; i < len; i++)
2096 {
2097 tree unchain = TREE_VEC_ELT (method_vec, i);
2098 while (unchain != NULL_TREE)
2099 {
2100 TREE_CHAIN (unchain) = NULL_TREE;
2101 unchain = DECL_CHAIN (unchain);
2102 }
2103 }
2104 }
2105
2106 if (TYPE_LANG_SPECIFIC (t))
2107 {
2108 tree as_list = CLASSTYPE_AS_LIST (t);
2109 tree binfo = TYPE_BINFO (t);
2110 tree binfo_as_list = CLASSTYPE_BINFO_AS_LIST (t);
2111 int interface_only = CLASSTYPE_INTERFACE_ONLY (t);
2112 int interface_unknown = CLASSTYPE_INTERFACE_UNKNOWN (t);
2113
2114 bzero ((char *) TYPE_LANG_SPECIFIC (t), sizeof (struct lang_type));
2115 BINFO_BASETYPES(binfo) = NULL_TREE;
2116
2117 CLASSTYPE_AS_LIST (t) = as_list;
2118 TYPE_BINFO (t) = binfo;
2119 CLASSTYPE_BINFO_AS_LIST (t) = binfo_as_list;
2120 CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
2121 SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown);
2122 TYPE_REDEFINED (t) = 1;
2123 }
2124 TYPE_SIZE (t) = NULL_TREE;
2125 TYPE_MODE (t) = VOIDmode;
2126 TYPE_FIELDS (t) = NULL_TREE;
2127 TYPE_METHODS (t) = NULL_TREE;
2128 TYPE_VFIELD (t) = NULL_TREE;
2129 TYPE_CONTEXT (t) = NULL_TREE;
2130 }
2131
2132 /* finish up all new vtables. */
2133
2134 static void
2135 finish_vtbls (binfo, do_self, t)
2136 tree binfo;
2137 int do_self;
2138 tree t;
2139 {
2140 tree binfos = BINFO_BASETYPES (binfo);
2141 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2142
2143 /* Should we use something besides CLASSTYPE_VFIELDS? */
2144 if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
2145 {
2146 if (BINFO_NEW_VTABLE_MARKED (binfo))
2147 {
2148 tree decl, context;
2149
2150 decl = BINFO_VTABLE (binfo);
2151 context = DECL_CONTEXT (decl);
2152 DECL_CONTEXT (decl) = 0;
2153 if (write_virtuals >= 0
2154 && DECL_INITIAL (decl) != BINFO_VIRTUALS (binfo))
2155 DECL_INITIAL (decl) = build_nt (CONSTRUCTOR, NULL_TREE,
2156 BINFO_VIRTUALS (binfo));
2157 cp_finish_decl (decl, DECL_INITIAL (decl), NULL_TREE, 0, 0);
2158 DECL_CONTEXT (decl) = context;
2159 }
2160 CLEAR_BINFO_NEW_VTABLE_MARKED (binfo);
2161 }
2162
2163 for (i = 0; i < n_baselinks; i++)
2164 {
2165 tree base_binfo = TREE_VEC_ELT (binfos, i);
2166 int is_not_base_vtable
2167 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo));
2168 if (TREE_VIA_VIRTUAL (base_binfo))
2169 {
2170 base_binfo = binfo_member (BINFO_TYPE (base_binfo), CLASSTYPE_VBASECLASSES (t));
2171 }
2172 finish_vtbls (base_binfo, is_not_base_vtable, t);
2173 }
2174 }
2175
2176 /* True if we should override the given BASE_FNDECL with the given
2177 FNDECL. */
2178
2179 static int
2180 overrides (fndecl, base_fndecl)
2181 tree fndecl, base_fndecl;
2182 {
2183 /* Destructors have special names. */
2184 if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (base_fndecl))
2185 && DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl)))
2186 return 1;
2187 if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (base_fndecl))
2188 || DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl)))
2189 return 0;
2190 if (DECL_NAME (fndecl) == DECL_NAME (base_fndecl))
2191 {
2192 tree types, base_types;
2193 #if 0
2194 retypes = TREE_TYPE (TREE_TYPE (fndecl));
2195 base_retypes = TREE_TYPE (TREE_TYPE (base_fndecl));
2196 #endif
2197 types = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
2198 base_types = TYPE_ARG_TYPES (TREE_TYPE (base_fndecl));
2199 if ((TYPE_READONLY (TREE_TYPE (TREE_VALUE (base_types)))
2200 == TYPE_READONLY (TREE_TYPE (TREE_VALUE (types))))
2201 && compparms (TREE_CHAIN (base_types), TREE_CHAIN (types), 3))
2202 return 1;
2203 }
2204 return 0;
2205 }
2206
2207 static tree
2208 get_class_offset_1 (parent, binfo, context, t, fndecl)
2209 tree parent, binfo, context, t, fndecl;
2210 {
2211 tree binfos = BINFO_BASETYPES (binfo);
2212 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2213 tree rval = NULL_TREE;
2214
2215 if (binfo == parent)
2216 return error_mark_node;
2217
2218 for (i = 0; i < n_baselinks; i++)
2219 {
2220 tree base_binfo = TREE_VEC_ELT (binfos, i);
2221 tree nrval;
2222
2223 if (TREE_VIA_VIRTUAL (base_binfo))
2224 base_binfo = binfo_member (BINFO_TYPE (base_binfo),
2225 CLASSTYPE_VBASECLASSES (t));
2226 nrval = get_class_offset_1 (parent, base_binfo, context, t, fndecl);
2227 /* See if we have a new value */
2228 if (nrval && (nrval != error_mark_node || rval==0))
2229 {
2230 /* Only compare if we have two offsets */
2231 if (rval && rval != error_mark_node
2232 && ! tree_int_cst_equal (nrval, rval))
2233 {
2234 /* Only give error if the two offsets are different */
2235 error ("every virtual function must have a unique final overrider");
2236 cp_error (" found two (or more) `%T' class subobjects in `%T'", context, t);
2237 cp_error (" with virtual `%D' from virtual base class", fndecl);
2238 return rval;
2239 }
2240 rval = nrval;
2241 }
2242
2243 if (rval && BINFO_TYPE (binfo) == context)
2244 {
2245 my_friendly_assert (rval == error_mark_node
2246 || tree_int_cst_equal (rval, BINFO_OFFSET (binfo)), 999);
2247 rval = BINFO_OFFSET (binfo);
2248 }
2249 }
2250 return rval;
2251 }
2252
2253 /* Get the offset to the CONTEXT subobject that is related to the
2254 given BINFO. */
2255
2256 static tree
2257 get_class_offset (context, t, binfo, fndecl)
2258 tree context, t, binfo, fndecl;
2259 {
2260 tree first_binfo = binfo;
2261 tree offset;
2262 int i;
2263
2264 if (context == t)
2265 return integer_zero_node;
2266
2267 if (BINFO_TYPE (binfo) == context)
2268 return BINFO_OFFSET (binfo);
2269
2270 /* Check less derived binfos first. */
2271 while (BINFO_BASETYPES (binfo)
2272 && (i=CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo))) != -1)
2273 {
2274 tree binfos = BINFO_BASETYPES (binfo);
2275 binfo = TREE_VEC_ELT (binfos, i);
2276 if (BINFO_TYPE (binfo) == context)
2277 return BINFO_OFFSET (binfo);
2278 }
2279
2280 /* Ok, not found in the less derived binfos, now check the more
2281 derived binfos. */
2282 offset = get_class_offset_1 (first_binfo, TYPE_BINFO (t), context, t, fndecl);
2283 if (offset==0 || TREE_CODE (offset) != INTEGER_CST)
2284 my_friendly_abort (999); /* we have to find it. */
2285 return offset;
2286 }
2287
2288 /* Skip RTTI information at the front of the virtual list. */
2289
2290 unsigned HOST_WIDE_INT
2291 skip_rtti_stuff (virtuals)
2292 tree *virtuals;
2293 {
2294 int n;
2295
2296 n = 0;
2297 if (*virtuals)
2298 {
2299 /* We always reserve a slot for the offset/tdesc entry. */
2300 ++n;
2301 *virtuals = TREE_CHAIN (*virtuals);
2302 }
2303 if (flag_vtable_thunks && *virtuals)
2304 {
2305 /* The second slot is reserved for the tdesc pointer when thunks
2306 are used. */
2307 ++n;
2308 *virtuals = TREE_CHAIN (*virtuals);
2309 }
2310 return n;
2311 }
2312
2313 static void
2314 modify_one_vtable (binfo, t, fndecl, pfn)
2315 tree binfo, t, fndecl, pfn;
2316 {
2317 tree virtuals = BINFO_VIRTUALS (binfo);
2318 unsigned HOST_WIDE_INT n;
2319
2320 /* update rtti entry */
2321 if (flag_rtti)
2322 {
2323 if (binfo == TYPE_BINFO (t))
2324 {
2325 if (! BINFO_NEW_VTABLE_MARKED (binfo))
2326 build_vtable (TYPE_BINFO (DECL_CONTEXT (CLASSTYPE_VFIELD (t))), t);
2327 }
2328 else
2329 {
2330 if (! BINFO_NEW_VTABLE_MARKED (binfo))
2331 prepare_fresh_vtable (binfo, t);
2332 }
2333 }
2334 if (fndecl == NULL_TREE)
2335 return;
2336
2337 n = skip_rtti_stuff (&virtuals);
2338
2339 while (virtuals)
2340 {
2341 tree current_fndecl = TREE_VALUE (virtuals);
2342 current_fndecl = FNADDR_FROM_VTABLE_ENTRY (current_fndecl);
2343 current_fndecl = TREE_OPERAND (current_fndecl, 0);
2344 if (current_fndecl && overrides (fndecl, current_fndecl))
2345 {
2346 tree base_offset, offset;
2347 tree context = DECL_CLASS_CONTEXT (fndecl);
2348 tree vfield = CLASSTYPE_VFIELD (t);
2349 tree this_offset;
2350
2351 offset = get_class_offset (context, t, binfo, fndecl);
2352
2353 /* Find the right offset for the this pointer based on the
2354 base class we just found. We have to take into
2355 consideration the virtual base class pointers that we
2356 stick in before the virtual function table pointer.
2357
2358 Also, we want just the delta between the most base class
2359 that we derived this vfield from and us. */
2360 base_offset = size_binop (PLUS_EXPR,
2361 get_derived_offset (binfo, DECL_CONTEXT (current_fndecl)),
2362 BINFO_OFFSET (binfo));
2363 this_offset = size_binop (MINUS_EXPR, offset, base_offset);
2364
2365 /* Make sure we can modify the derived association with immunity. */
2366 if (TREE_USED (binfo))
2367 my_friendly_assert (0, 999);
2368
2369 if (binfo == TYPE_BINFO (t))
2370 {
2371 /* In this case, it is *type*'s vtable we are modifying.
2372 We start with the approximation that it's vtable is that
2373 of the immediate base class. */
2374 if (! BINFO_NEW_VTABLE_MARKED (binfo))
2375 build_vtable (TYPE_BINFO (DECL_CONTEXT (vfield)), t);
2376 }
2377 else
2378 {
2379 /* This is our very own copy of `basetype' to play with.
2380 Later, we will fill in all the virtual functions
2381 that override the virtual functions in these base classes
2382 which are not defined by the current type. */
2383 if (! BINFO_NEW_VTABLE_MARKED (binfo))
2384 prepare_fresh_vtable (binfo, t);
2385 }
2386
2387 #ifdef NOTQUITE
2388 cp_warning ("in %D", DECL_NAME (BINFO_VTABLE (binfo)));
2389 #endif
2390 modify_vtable_entry (get_vtable_entry_n (BINFO_VIRTUALS (binfo), n),
2391 build_vtable_entry (this_offset, pfn),
2392 fndecl);
2393 }
2394 ++n;
2395 virtuals = TREE_CHAIN (virtuals);
2396 }
2397 }
2398
2399 /* These are the ones that are not through virtual base classes. */
2400
2401 static void
2402 modify_all_direct_vtables (binfo, do_self, t, fndecl, pfn)
2403 tree binfo;
2404 int do_self;
2405 tree t, fndecl, pfn;
2406 {
2407 tree binfos = BINFO_BASETYPES (binfo);
2408 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2409
2410 /* Should we use something besides CLASSTYPE_VFIELDS? */
2411 if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
2412 {
2413 modify_one_vtable (binfo, t, fndecl, pfn);
2414 }
2415
2416 for (i = 0; i < n_baselinks; i++)
2417 {
2418 tree base_binfo = TREE_VEC_ELT (binfos, i);
2419 int is_not_base_vtable
2420 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo));
2421 if (! TREE_VIA_VIRTUAL (base_binfo))
2422 modify_all_direct_vtables (base_binfo, is_not_base_vtable, t, fndecl, pfn);
2423 }
2424 }
2425
2426 /* Fixup all the delta entries in this one vtable that need updating. */
2427
2428 static void
2429 fixup_vtable_deltas1 (binfo, t)
2430 tree binfo, t;
2431 {
2432 tree virtuals = BINFO_VIRTUALS (binfo);
2433 unsigned HOST_WIDE_INT n;
2434
2435 n = skip_rtti_stuff (&virtuals);
2436
2437 while (virtuals)
2438 {
2439 tree fndecl = TREE_VALUE (virtuals);
2440 tree pfn = FNADDR_FROM_VTABLE_ENTRY (fndecl);
2441 tree delta = DELTA_FROM_VTABLE_ENTRY (fndecl);
2442 fndecl = TREE_OPERAND (pfn, 0);
2443 if (fndecl)
2444 {
2445 tree base_offset, offset;
2446 tree context = DECL_CLASS_CONTEXT (fndecl);
2447 tree vfield = CLASSTYPE_VFIELD (t);
2448 tree this_offset;
2449
2450 offset = get_class_offset (context, t, binfo, fndecl);
2451
2452 /* Find the right offset for the this pointer based on the
2453 base class we just found. We have to take into
2454 consideration the virtual base class pointers that we
2455 stick in before the virtual function table pointer.
2456
2457 Also, we want just the delta between the most base class
2458 that we derived this vfield from and us. */
2459 base_offset = size_binop (PLUS_EXPR,
2460 get_derived_offset (binfo, DECL_CONTEXT (fndecl)),
2461 BINFO_OFFSET (binfo));
2462 this_offset = size_binop (MINUS_EXPR, offset, base_offset);
2463
2464 if (! tree_int_cst_equal (this_offset, delta))
2465 {
2466 /* Make sure we can modify the derived association with immunity. */
2467 if (TREE_USED (binfo))
2468 my_friendly_assert (0, 999);
2469
2470 if (binfo == TYPE_BINFO (t))
2471 {
2472 /* In this case, it is *type*'s vtable we are modifying.
2473 We start with the approximation that it's vtable is that
2474 of the immediate base class. */
2475 if (! BINFO_NEW_VTABLE_MARKED (binfo))
2476 build_vtable (TYPE_BINFO (DECL_CONTEXT (vfield)), t);
2477 }
2478 else
2479 {
2480 /* This is our very own copy of `basetype' to play with.
2481 Later, we will fill in all the virtual functions
2482 that override the virtual functions in these base classes
2483 which are not defined by the current type. */
2484 if (! BINFO_NEW_VTABLE_MARKED (binfo))
2485 prepare_fresh_vtable (binfo, t);
2486 }
2487
2488 modify_vtable_entry (get_vtable_entry_n (BINFO_VIRTUALS (binfo), n),
2489 build_vtable_entry (this_offset, pfn),
2490 fndecl);
2491 }
2492 }
2493 ++n;
2494 virtuals = TREE_CHAIN (virtuals);
2495 }
2496 }
2497
2498 /* Fixup all the delta entries in all the direct vtables that need updating.
2499 This happens when we have non-overridden virtual functions from a
2500 virtual base class, that are at a different offset, in the new
2501 hierarchy, because the layout of the virtual bases has changed. */
2502
2503 static void
2504 fixup_vtable_deltas (binfo, init_self, t)
2505 tree binfo;
2506 int init_self;
2507 tree t;
2508 {
2509 tree binfos = BINFO_BASETYPES (binfo);
2510 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2511
2512 for (i = 0; i < n_baselinks; i++)
2513 {
2514 tree base_binfo = TREE_VEC_ELT (binfos, i);
2515 int is_not_base_vtable
2516 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo));
2517 if (! TREE_VIA_VIRTUAL (base_binfo))
2518 fixup_vtable_deltas (base_binfo, is_not_base_vtable, t);
2519 }
2520 /* Should we use something besides CLASSTYPE_VFIELDS? */
2521 if (init_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
2522 {
2523 fixup_vtable_deltas1 (binfo, t);
2524 }
2525 }
2526
2527 /* These are the ones that are through virtual base classes. */
2528
2529 static void
2530 modify_all_indirect_vtables (binfo, do_self, via_virtual, t, fndecl, pfn)
2531 tree binfo;
2532 int do_self, via_virtual;
2533 tree t, fndecl, pfn;
2534 {
2535 tree binfos = BINFO_BASETYPES (binfo);
2536 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2537
2538 /* Should we use something besides CLASSTYPE_VFIELDS? */
2539 if (do_self && via_virtual && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
2540 {
2541 modify_one_vtable (binfo, t, fndecl, pfn);
2542 }
2543
2544 for (i = 0; i < n_baselinks; i++)
2545 {
2546 tree base_binfo = TREE_VEC_ELT (binfos, i);
2547 int is_not_base_vtable
2548 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo));
2549 if (TREE_VIA_VIRTUAL (base_binfo))
2550 {
2551 via_virtual = 1;
2552 base_binfo = binfo_member (BINFO_TYPE (base_binfo), CLASSTYPE_VBASECLASSES (t));
2553 }
2554 modify_all_indirect_vtables (base_binfo, is_not_base_vtable, via_virtual, t, fndecl, pfn);
2555 }
2556 }
2557
2558 static void
2559 modify_all_vtables (t, fndecl, vfn)
2560 tree t, fndecl, vfn;
2561 {
2562 /* Do these first, so that we will make use of any non-virtual class's
2563 vtable, over a virtual classes vtable. */
2564 modify_all_direct_vtables (TYPE_BINFO (t), 1, t, fndecl, vfn);
2565 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
2566 modify_all_indirect_vtables (TYPE_BINFO (t), 1, 0, t, fndecl, vfn);
2567 }
2568
2569 /* Here, we already know that they match in every respect.
2570 All we have to check is where they had their declarations. */
2571
2572 static int
2573 strictly_overrides (fndecl1, fndecl2)
2574 tree fndecl1, fndecl2;
2575 {
2576 int distance = get_base_distance (DECL_CLASS_CONTEXT (fndecl2),
2577 DECL_CLASS_CONTEXT (fndecl1),
2578 0, (tree *)0);
2579 if (distance == -2 || distance > 0)
2580 return 1;
2581 return 0;
2582 }
2583
2584 /* Merge overrides for one vtable.
2585 If we want to merge in same function, we are fine.
2586 else
2587 if one has a DECL_CLASS_CONTEXT that is a parent of the
2588 other, than choose the more derived one
2589 else
2590 potentially ill-formed (see 10.3 [class.virtual])
2591 we have to check later to see if there was an
2592 override in this class. If there was ok, if not
2593 then it is ill-formed. (mrs)
2594
2595 We take special care to reuse a vtable, if we can. */
2596
2597 static void
2598 override_one_vtable (binfo, old, t)
2599 tree binfo, old, t;
2600 {
2601 tree virtuals = BINFO_VIRTUALS (binfo);
2602 tree old_virtuals = BINFO_VIRTUALS (old);
2603 enum { REUSE_NEW, REUSE_OLD, UNDECIDED, NEITHER } choose = UNDECIDED;
2604
2605 /* If we have already committed to modifying it, then don't try and
2606 reuse another vtable. */
2607 if (BINFO_NEW_VTABLE_MARKED (binfo))
2608 choose = NEITHER;
2609
2610 skip_rtti_stuff (&virtuals);
2611 skip_rtti_stuff (&old_virtuals);
2612
2613 while (virtuals)
2614 {
2615 tree fndecl = TREE_VALUE (virtuals);
2616 tree old_fndecl = TREE_VALUE (old_virtuals);
2617 fndecl = FNADDR_FROM_VTABLE_ENTRY (fndecl);
2618 old_fndecl = FNADDR_FROM_VTABLE_ENTRY (old_fndecl);
2619 fndecl = TREE_OPERAND (fndecl, 0);
2620 old_fndecl = TREE_OPERAND (old_fndecl, 0);
2621 /* First check to see if they are the same. */
2622 if (DECL_ASSEMBLER_NAME (fndecl) == DECL_ASSEMBLER_NAME (old_fndecl))
2623 {
2624 /* No need to do anything. */
2625 }
2626 else if (strictly_overrides (fndecl, old_fndecl))
2627 {
2628 if (choose == UNDECIDED)
2629 choose = REUSE_NEW;
2630 else if (choose == REUSE_OLD)
2631 {
2632 choose = NEITHER;
2633 if (! BINFO_NEW_VTABLE_MARKED (binfo))
2634 {
2635 prepare_fresh_vtable (binfo, t);
2636 override_one_vtable (binfo, old, t);
2637 return;
2638 }
2639 }
2640 }
2641 else if (strictly_overrides (old_fndecl, fndecl))
2642 {
2643 if (choose == UNDECIDED)
2644 choose = REUSE_OLD;
2645 else if (choose == REUSE_NEW)
2646 {
2647 choose = NEITHER;
2648 if (! BINFO_NEW_VTABLE_MARKED (binfo))
2649 {
2650 prepare_fresh_vtable (binfo, t);
2651 override_one_vtable (binfo, old, t);
2652 return;
2653 }
2654 TREE_VALUE (virtuals) = TREE_VALUE (old_virtuals);
2655 }
2656 else if (choose == NEITHER)
2657 {
2658 TREE_VALUE (virtuals) = TREE_VALUE (old_virtuals);
2659 }
2660 }
2661 else
2662 {
2663 choose = NEITHER;
2664 if (! BINFO_NEW_VTABLE_MARKED (binfo))
2665 {
2666 prepare_fresh_vtable (binfo, t);
2667 override_one_vtable (binfo, old, t);
2668 return;
2669 }
2670 {
2671 /* This MUST be overridden, or the class is ill-formed. */
2672 /* For now, we just make it abstract. */
2673 tree fndecl = TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals)), 0);
2674 tree vfn;
2675
2676 fndecl = copy_node (fndecl);
2677 copy_lang_decl (fndecl);
2678 DECL_ABSTRACT_VIRTUAL_P (fndecl) = 1;
2679 DECL_NEEDS_FINAL_OVERRIDER_P (fndecl) = 1;
2680 /* Make sure we search for it later. */
2681 if (! CLASSTYPE_ABSTRACT_VIRTUALS (t))
2682 CLASSTYPE_ABSTRACT_VIRTUALS (t) = error_mark_node;
2683
2684 vfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, fndecl);
2685 TREE_CONSTANT (vfn) = 1;
2686
2687 /* We can use integer_zero_node, as we will will core dump
2688 if this is used anyway. */
2689 TREE_VALUE (virtuals) = build_vtable_entry (integer_zero_node, vfn);
2690 }
2691 }
2692 virtuals = TREE_CHAIN (virtuals);
2693 old_virtuals = TREE_CHAIN (old_virtuals);
2694 }
2695
2696 /* Let's reuse the old vtable. */
2697 if (choose == REUSE_OLD)
2698 {
2699 BINFO_VTABLE (binfo) = BINFO_VTABLE (old);
2700 BINFO_VIRTUALS (binfo) = BINFO_VIRTUALS (old);
2701 }
2702 }
2703
2704 /* Merge in overrides for virtual bases.
2705 BINFO is the hierarchy we want to modify, and OLD has the potential
2706 overrides. */
2707
2708 static void
2709 merge_overrides (binfo, old, do_self, t)
2710 tree binfo, old;
2711 int do_self;
2712 tree t;
2713 {
2714 tree binfos = BINFO_BASETYPES (binfo);
2715 tree old_binfos = BINFO_BASETYPES (old);
2716 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2717
2718 /* Should we use something besides CLASSTYPE_VFIELDS? */
2719 if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
2720 {
2721 override_one_vtable (binfo, old, t);
2722 }
2723
2724 for (i = 0; i < n_baselinks; i++)
2725 {
2726 tree base_binfo = TREE_VEC_ELT (binfos, i);
2727 tree old_base_binfo = TREE_VEC_ELT (old_binfos, i);
2728 int is_not_base_vtable
2729 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo));
2730 if (! TREE_VIA_VIRTUAL (base_binfo))
2731 merge_overrides (base_binfo, old_base_binfo, is_not_base_vtable, t);
2732 }
2733 }
2734
2735 /* Get the base virtual function declarations in T that are either
2736 overridden or hidden by FNDECL as a list. We set TREE_PURPOSE with
2737 the overrider/hider. */
2738
2739 static tree
2740 get_basefndecls (fndecl, t)
2741 tree fndecl, t;
2742 {
2743 tree methods = TYPE_METHODS (t);
2744 tree base_fndecls = NULL_TREE;
2745 tree binfos = BINFO_BASETYPES (TYPE_BINFO (t));
2746 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2747
2748 while (methods)
2749 {
2750 if (TREE_CODE (methods) == FUNCTION_DECL
2751 && DECL_VINDEX (methods) != NULL_TREE
2752 && DECL_NAME (fndecl) == DECL_NAME (methods))
2753 base_fndecls = temp_tree_cons (fndecl, methods, base_fndecls);
2754
2755 methods = TREE_CHAIN (methods);
2756 }
2757
2758 if (base_fndecls)
2759 return base_fndecls;
2760
2761 for (i = 0; i < n_baseclasses; i++)
2762 {
2763 tree base_binfo = TREE_VEC_ELT (binfos, i);
2764 tree basetype = BINFO_TYPE (base_binfo);
2765
2766 base_fndecls = chainon (get_basefndecls (fndecl, basetype),
2767 base_fndecls);
2768 }
2769
2770 return base_fndecls;
2771 }
2772
2773 /* Mark the functions that have been hidden with their overriders.
2774 Since we start out with all functions already marked with a hider,
2775 no need to mark functions that are just hidden. */
2776
2777 static void
2778 mark_overriders (fndecl, base_fndecls)
2779 tree fndecl, base_fndecls;
2780 {
2781 while (base_fndecls)
2782 {
2783 if (overrides (TREE_VALUE (base_fndecls), fndecl))
2784 TREE_PURPOSE (base_fndecls) = fndecl;
2785
2786 base_fndecls = TREE_CHAIN (base_fndecls);
2787 }
2788 }
2789
2790 /* If this declaration supersedes the declaration of
2791 a method declared virtual in the base class, then
2792 mark this field as being virtual as well. */
2793
2794 static void
2795 check_for_override (decl, ctype)
2796 tree decl, ctype;
2797 {
2798 tree binfos = BINFO_BASETYPES (TYPE_BINFO (ctype));
2799 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2800 int virtualp = DECL_VIRTUAL_P (decl);
2801
2802 for (i = 0; i < n_baselinks; i++)
2803 {
2804 tree base_binfo = TREE_VEC_ELT (binfos, i);
2805 if (TYPE_VIRTUAL_P (BINFO_TYPE (base_binfo))
2806 || flag_all_virtual == 1)
2807 {
2808 tree tmp = get_matching_virtual
2809 (base_binfo, decl,
2810 DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl)));
2811 if (tmp)
2812 {
2813 /* If this function overrides some virtual in some base
2814 class, then the function itself is also necessarily
2815 virtual, even if the user didn't explicitly say so. */
2816 DECL_VIRTUAL_P (decl) = 1;
2817
2818 /* The TMP we really want is the one from the deepest
2819 baseclass on this path, taking care not to
2820 duplicate if we have already found it (via another
2821 path to its virtual baseclass. */
2822 if (TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE)
2823 {
2824 cp_error_at ("method `%D' may not be declared static",
2825 decl);
2826 cp_error_at ("(since `%D' declared virtual in base class.)",
2827 tmp);
2828 break;
2829 }
2830 virtualp = 1;
2831
2832 #if 0 /* The signature of an overriding function is not changed. */
2833 {
2834 /* The argument types may have changed... */
2835 tree type = TREE_TYPE (decl);
2836 tree argtypes = TYPE_ARG_TYPES (type);
2837 tree base_variant = TREE_TYPE (TREE_VALUE (argtypes));
2838 tree raises = TYPE_RAISES_EXCEPTIONS (type);
2839
2840 argtypes = commonparms (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (tmp))),
2841 TREE_CHAIN (argtypes));
2842 /* But the return type has not. */
2843 type = build_cplus_method_type (base_variant, TREE_TYPE (type), argtypes);
2844 if (raises)
2845 type = build_exception_variant (type, raises);
2846 TREE_TYPE (decl) = type;
2847 }
2848 #endif
2849 DECL_VINDEX (decl)
2850 = tree_cons (NULL_TREE, tmp, DECL_VINDEX (decl));
2851 break;
2852 }
2853 }
2854 }
2855 if (virtualp)
2856 {
2857 if (DECL_VINDEX (decl) == NULL_TREE)
2858 DECL_VINDEX (decl) = error_mark_node;
2859 IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1;
2860 }
2861 }
2862
2863 /* Warn about hidden virtual functions that are not overridden in t.
2864 We know that constructors and destructors don't apply. */
2865
2866 void
2867 warn_hidden (t)
2868 tree t;
2869 {
2870 tree method_vec = CLASSTYPE_METHOD_VEC (t);
2871 int n_methods = method_vec ? TREE_VEC_LENGTH (method_vec) : 0;
2872 int i;
2873
2874 /* We go through each separately named virtual function. */
2875 for (i = 2; i < n_methods; ++i)
2876 {
2877 tree fndecl = TREE_VEC_ELT (method_vec, i);
2878
2879 tree base_fndecls = NULL_TREE;
2880 tree binfos = BINFO_BASETYPES (TYPE_BINFO (t));
2881 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2882
2883 if (DECL_VINDEX (fndecl) == NULL_TREE)
2884 continue;
2885
2886 /* First we get a list of all possible functions that might be
2887 hidden from each base class. */
2888 for (i = 0; i < n_baseclasses; i++)
2889 {
2890 tree base_binfo = TREE_VEC_ELT (binfos, i);
2891 tree basetype = BINFO_TYPE (base_binfo);
2892
2893 base_fndecls = chainon (get_basefndecls (fndecl, basetype),
2894 base_fndecls);
2895 }
2896
2897 if (TREE_CHAIN (fndecl)
2898 && DECL_NAME (TREE_CHAIN (fndecl)) == DECL_NAME (fndecl))
2899 fndecl = TREE_CHAIN (fndecl);
2900 else
2901 fndecl = NULL_TREE;
2902
2903 /* ...then mark up all the base functions with overriders, preferring
2904 overriders to hiders. */
2905 if (base_fndecls)
2906 while (fndecl)
2907 {
2908 mark_overriders (fndecl, base_fndecls);
2909
2910 if (TREE_CHAIN (fndecl)
2911 && DECL_NAME (TREE_CHAIN (fndecl)) == DECL_NAME (fndecl))
2912 fndecl = TREE_CHAIN (fndecl);
2913 else
2914 fndecl = NULL_TREE;
2915 }
2916
2917 /* Now give a warning for all base functions without overriders,
2918 as they are hidden. */
2919 while (base_fndecls)
2920 {
2921 if (! overrides (TREE_VALUE (base_fndecls),
2922 TREE_PURPOSE (base_fndecls)))
2923 {
2924 /* Here we know it is a hider, and no overrider exists. */
2925 cp_warning_at ("`%D' was hidden", TREE_VALUE (base_fndecls));
2926 cp_warning_at (" by `%D'", TREE_PURPOSE (base_fndecls));
2927 }
2928
2929 base_fndecls = TREE_CHAIN (base_fndecls);
2930 }
2931 }
2932 }
2933
2934 /* Check for things that are invalid. There are probably plenty of other
2935 things we should check for also. */
2936
2937 static void
2938 finish_struct_anon (t)
2939 tree t;
2940 {
2941 tree field;
2942 for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field))
2943 {
2944 if (TREE_STATIC (field))
2945 continue;
2946 if (TREE_CODE (field) != FIELD_DECL)
2947 continue;
2948
2949 if (DECL_NAME (field) == NULL_TREE
2950 && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
2951 {
2952 tree* uelt = &TYPE_FIELDS (TREE_TYPE (field));
2953 for (; *uelt; uelt = &TREE_CHAIN (*uelt))
2954 {
2955 if (TREE_CODE (*uelt) != FIELD_DECL)
2956 continue;
2957
2958 if (TREE_PRIVATE (*uelt))
2959 cp_pedwarn_at ("private member `%#D' in anonymous union",
2960 *uelt);
2961 else if (TREE_PROTECTED (*uelt))
2962 cp_pedwarn_at ("protected member `%#D' in anonymous union",
2963 *uelt);
2964
2965 TREE_PRIVATE (*uelt) = TREE_PRIVATE (field);
2966 TREE_PROTECTED (*uelt) = TREE_PROTECTED (field);
2967 }
2968 }
2969 }
2970 }
2971
2972 extern int interface_only, interface_unknown;
2973
2974 /* Create a RECORD_TYPE or UNION_TYPE node for a C struct or union declaration
2975 (or C++ class declaration).
2976
2977 For C++, we must handle the building of derived classes.
2978 Also, C++ allows static class members. The way that this is
2979 handled is to keep the field name where it is (as the DECL_NAME
2980 of the field), and place the overloaded decl in the DECL_FIELD_BITPOS
2981 of the field. layout_record and layout_union will know about this.
2982
2983 More C++ hair: inline functions have text in their
2984 DECL_PENDING_INLINE_INFO nodes which must somehow be parsed into
2985 meaningful tree structure. After the struct has been laid out, set
2986 things up so that this can happen.
2987
2988 And still more: virtual functions. In the case of single inheritance,
2989 when a new virtual function is seen which redefines a virtual function
2990 from the base class, the new virtual function is placed into
2991 the virtual function table at exactly the same address that
2992 it had in the base class. When this is extended to multiple
2993 inheritance, the same thing happens, except that multiple virtual
2994 function tables must be maintained. The first virtual function
2995 table is treated in exactly the same way as in the case of single
2996 inheritance. Additional virtual function tables have different
2997 DELTAs, which tell how to adjust `this' to point to the right thing.
2998
2999 LIST_OF_FIELDLISTS is just that. The elements of the list are
3000 TREE_LIST elements, whose TREE_PURPOSE field tells what access
3001 the list has, and the TREE_VALUE slot gives the actual fields.
3002
3003 ATTRIBUTES is the set of decl attributes to be applied, if any.
3004
3005 If flag_all_virtual == 1, then we lay all functions into
3006 the virtual function table, as though they were declared
3007 virtual. Constructors do not lay down in the virtual function table.
3008
3009 If flag_all_virtual == 2, then we lay all functions into
3010 the virtual function table, such that virtual functions
3011 occupy a space by themselves, and then all functions
3012 of the class occupy a space by themselves. This is illustrated
3013 in the following diagram:
3014
3015 class A; class B : A;
3016
3017 Class A's vtbl: Class B's vtbl:
3018 --------------------------------------------------------------------
3019 | A's virtual functions| | B's virtual functions |
3020 | | | (may inherit some from A). |
3021 --------------------------------------------------------------------
3022 | All of A's functions | | All of A's functions |
3023 | (such as a->A::f). | | (such as b->A::f) |
3024 --------------------------------------------------------------------
3025 | B's new virtual functions |
3026 | (not defined in A.) |
3027 -------------------------------
3028 | All of B's functions |
3029 | (such as b->B::f) |
3030 -------------------------------
3031
3032 this allows the program to make references to any function, virtual
3033 or otherwise in a type-consistent manner. */
3034
3035 tree
3036 finish_struct_1 (t, warn_anon)
3037 tree t;
3038 int warn_anon;
3039 {
3040 int old;
3041 tree name = TYPE_IDENTIFIER (t);
3042 enum tree_code code = TREE_CODE (t);
3043 tree fields = TYPE_FIELDS (t);
3044 tree fn_fields = TYPE_METHODS (t);
3045 tree x, last_x, method_vec;
3046 int all_virtual;
3047 int has_virtual;
3048 int max_has_virtual;
3049 tree pending_virtuals = NULL_TREE;
3050 tree pending_hard_virtuals = NULL_TREE;
3051 tree abstract_virtuals = NULL_TREE;
3052 tree vfield;
3053 tree vfields;
3054 int cant_have_default_ctor;
3055 int cant_have_const_ctor;
3056 int no_const_asn_ref;
3057
3058 /* The index of the first base class which has virtual
3059 functions. Only applied to non-virtual baseclasses. */
3060 int first_vfn_base_index;
3061
3062 int n_baseclasses;
3063 int any_default_members = 0;
3064 int const_sans_init = 0;
3065 int ref_sans_init = 0;
3066 int nonprivate_method = 0;
3067 tree access_decls = NULL_TREE;
3068 int aggregate = 1;
3069 int empty = 1;
3070 int has_pointers = 0;
3071
3072 if (warn_anon && code != UNION_TYPE && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))
3073 pedwarn ("anonymous class type not used to declare any objects");
3074
3075 if (TYPE_SIZE (t))
3076 {
3077 if (IS_AGGR_TYPE (t))
3078 cp_error ("redefinition of `%#T'", t);
3079 else
3080 my_friendly_abort (172);
3081 popclass (0);
3082 return t;
3083 }
3084
3085 GNU_xref_decl (current_function_decl, t);
3086
3087 /* If this type was previously laid out as a forward reference,
3088 make sure we lay it out again. */
3089
3090 TYPE_SIZE (t) = NULL_TREE;
3091 CLASSTYPE_GOT_SEMICOLON (t) = 0;
3092
3093 #if 0
3094 /* This is in general too late to do this. I moved the main case up to
3095 left_curly, what else needs to move? */
3096 if (! IS_SIGNATURE (t))
3097 {
3098 my_friendly_assert (CLASSTYPE_INTERFACE_ONLY (t) == interface_only, 999);
3099 my_friendly_assert (CLASSTYPE_INTERFACE_KNOWN (t) == ! interface_unknown, 999);
3100 }
3101 #endif
3102
3103 old = suspend_momentary ();
3104
3105 /* Install struct as DECL_FIELD_CONTEXT of each field decl.
3106 Also process specified field sizes.
3107 Set DECL_FIELD_SIZE to the specified size, or 0 if none specified.
3108 The specified size is found in the DECL_INITIAL.
3109 Store 0 there, except for ": 0" fields (so we can find them
3110 and delete them, below). */
3111
3112 if (TYPE_BINFO_BASETYPES (t))
3113 n_baseclasses = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (t));
3114 else
3115 n_baseclasses = 0;
3116
3117 if (n_baseclasses > 0)
3118 {
3119 struct base_info base_info;
3120
3121 first_vfn_base_index = finish_base_struct (t, &base_info);
3122 /* Remember where we got our vfield from. */
3123 CLASSTYPE_VFIELD_PARENT (t) = first_vfn_base_index;
3124 has_virtual = base_info.has_virtual;
3125 max_has_virtual = base_info.max_has_virtual;
3126 CLASSTYPE_N_SUPERCLASSES (t) += base_info.n_ancestors;
3127 vfield = base_info.vfield;
3128 vfields = base_info.vfields;
3129 CLASSTYPE_RTTI (t) = base_info.rtti;
3130 cant_have_default_ctor = base_info.cant_have_default_ctor;
3131 cant_have_const_ctor = base_info.cant_have_const_ctor;
3132 no_const_asn_ref = base_info.no_const_asn_ref;
3133 aggregate = 0;
3134 empty = 0;
3135 }
3136 else
3137 {
3138 first_vfn_base_index = -1;
3139 has_virtual = 0;
3140 max_has_virtual = has_virtual;
3141 vfield = NULL_TREE;
3142 vfields = NULL_TREE;
3143 CLASSTYPE_RTTI (t) = NULL_TREE;
3144 cant_have_default_ctor = 0;
3145 cant_have_const_ctor = 0;
3146 no_const_asn_ref = 0;
3147 }
3148
3149 #if 0
3150 /* Both of these should be done before now. */
3151 if (write_virtuals == 3 && CLASSTYPE_INTERFACE_KNOWN (t)
3152 && ! IS_SIGNATURE (t))
3153 {
3154 my_friendly_assert (CLASSTYPE_INTERFACE_ONLY (t) == interface_only, 999);
3155 my_friendly_assert (CLASSTYPE_VTABLE_NEEDS_WRITING (t) == ! interface_only, 999);
3156 }
3157 #endif
3158
3159 /* The three of these are approximations which may later be
3160 modified. Needed at this point to make add_virtual_function
3161 and modify_vtable_entries work. */
3162 CLASSTYPE_VFIELDS (t) = vfields;
3163 CLASSTYPE_VFIELD (t) = vfield;
3164
3165 if (IS_SIGNATURE (t))
3166 all_virtual = 0;
3167 else if (flag_all_virtual == 1)
3168 all_virtual = 1;
3169 else
3170 all_virtual = 0;
3171
3172 for (x = TYPE_METHODS (t); x; x = TREE_CHAIN (x))
3173 {
3174 GNU_xref_member (current_class_name, x);
3175
3176 nonprivate_method |= ! TREE_PRIVATE (x);
3177
3178 /* If this was an evil function, don't keep it in class. */
3179 if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (x)))
3180 continue;
3181
3182 DECL_CLASS_CONTEXT (x) = t;
3183
3184 /* Do both of these, even though they're in the same union;
3185 if the insn `r' member and the size `i' member are
3186 different sizes, as on the alpha, the larger of the two
3187 will end up with garbage in it. */
3188 DECL_SAVED_INSNS (x) = NULL_RTX;
3189 DECL_FIELD_SIZE (x) = 0;
3190
3191 check_for_override (x, t);
3192 if (DECL_ABSTRACT_VIRTUAL_P (x) && ! DECL_VINDEX (x))
3193 cp_error_at ("initializer specified for non-virtual method `%D'", x);
3194
3195 /* The name of the field is the original field name
3196 Save this in auxiliary field for later overloading. */
3197 if (DECL_VINDEX (x)
3198 || (all_virtual == 1 && ! DECL_CONSTRUCTOR_P (x)))
3199 {
3200 add_virtual_function (&pending_virtuals, &pending_hard_virtuals,
3201 &has_virtual, x, t);
3202 if (DECL_ABSTRACT_VIRTUAL_P (x))
3203 abstract_virtuals = tree_cons (NULL_TREE, x, abstract_virtuals);
3204 #if 0
3205 /* XXX Why did I comment this out? (jason) */
3206 else
3207 TREE_USED (x) = 1;
3208 #endif
3209 }
3210 }
3211
3212 last_x = NULL_TREE;
3213 for (x = fields; x; x = TREE_CHAIN (x))
3214 {
3215 GNU_xref_member (current_class_name, x);
3216
3217 if (TREE_CODE (x) == FIELD_DECL)
3218 {
3219 DECL_PACKED (x) |= TYPE_PACKED (t);
3220 empty = 0;
3221 }
3222
3223 /* Handle access declarations. */
3224 if (TREE_CODE (x) == USING_DECL)
3225 {
3226 tree ctype = DECL_INITIAL (x);
3227 tree sname = DECL_NAME (x);
3228 tree access
3229 = TREE_PRIVATE (x) ? access_private_node
3230 : TREE_PROTECTED (x) ? access_protected_node
3231 : access_public_node;
3232 tree fdecl, binfo;
3233
3234 if (last_x)
3235 TREE_CHAIN (last_x) = TREE_CHAIN (x);
3236 else
3237 fields = TREE_CHAIN (x);
3238
3239 binfo = binfo_or_else (ctype, t);
3240 if (! binfo)
3241 continue;
3242
3243 if (sname == constructor_name (ctype)
3244 || sname == constructor_name_full (ctype))
3245 cp_error_at ("using-declaration for constructor", x);
3246
3247 fdecl = lookup_field (binfo, sname, 0, 0);
3248 if (! fdecl)
3249 fdecl = lookup_fnfields (binfo, sname, 0);
3250
3251 if (fdecl)
3252 access_decls = scratch_tree_cons (access, fdecl, access_decls);
3253 else
3254 cp_error_at ("no members matching `%D' in `%#T'", x, ctype);
3255 continue;
3256 }
3257
3258 last_x = x;
3259
3260 if (TREE_CODE (x) == TYPE_DECL
3261 || TREE_CODE (x) == TEMPLATE_DECL)
3262 continue;
3263
3264 /* If we've gotten this far, it's a data member, possibly static,
3265 or an enumerator. */
3266
3267 DECL_FIELD_CONTEXT (x) = t;
3268
3269 /* ``A local class cannot have static data members.'' ARM 9.4 */
3270 if (current_function_decl && TREE_STATIC (x))
3271 cp_error_at ("field `%D' in local class cannot be static", x);
3272
3273 /* Perform error checking that did not get done in
3274 grokdeclarator. */
3275 if (TREE_CODE (TREE_TYPE (x)) == FUNCTION_TYPE)
3276 {
3277 cp_error_at ("field `%D' invalidly declared function type",
3278 x);
3279 TREE_TYPE (x) = build_pointer_type (TREE_TYPE (x));
3280 }
3281 else if (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE)
3282 {
3283 cp_error_at ("field `%D' invalidly declared method type", x);
3284 TREE_TYPE (x) = build_pointer_type (TREE_TYPE (x));
3285 }
3286 else if (TREE_CODE (TREE_TYPE (x)) == OFFSET_TYPE)
3287 {
3288 cp_error_at ("field `%D' invalidly declared offset type", x);
3289 TREE_TYPE (x) = build_pointer_type (TREE_TYPE (x));
3290 }
3291
3292 #if 0
3293 if (DECL_NAME (x) == constructor_name (t))
3294 cant_have_default_ctor = 1;
3295 #endif
3296
3297 if (TREE_TYPE (x) == error_mark_node)
3298 continue;
3299
3300 DECL_SAVED_INSNS (x) = NULL_RTX;
3301 DECL_FIELD_SIZE (x) = 0;
3302
3303 /* When this goes into scope, it will be a non-local reference. */
3304 DECL_NONLOCAL (x) = 1;
3305
3306 if (TREE_CODE (x) == CONST_DECL)
3307 continue;
3308
3309 if (TREE_CODE (x) == VAR_DECL)
3310 {
3311 if (TREE_CODE (t) == UNION_TYPE)
3312 /* Unions cannot have static members. */
3313 cp_error_at ("field `%D' declared static in union", x);
3314
3315 continue;
3316 }
3317
3318 /* Now it can only be a FIELD_DECL. */
3319
3320 if (TREE_PRIVATE (x) || TREE_PROTECTED (x))
3321 aggregate = 0;
3322
3323 /* If this is of reference type, check if it needs an init.
3324 Also do a little ANSI jig if necessary. */
3325 if (TREE_CODE (TREE_TYPE (x)) == REFERENCE_TYPE)
3326 {
3327 if (DECL_INITIAL (x) == NULL_TREE)
3328 ref_sans_init = 1;
3329
3330 /* ARM $12.6.2: [A member initializer list] (or, for an
3331 aggregate, initialization by a brace-enclosed list) is the
3332 only way to initialize nonstatic const and reference
3333 members. */
3334 cant_have_default_ctor = 1;
3335 TYPE_HAS_COMPLEX_ASSIGN_REF (t) = 1;
3336
3337 if (! TYPE_HAS_CONSTRUCTOR (t) && extra_warnings)
3338 {
3339 if (DECL_NAME (x))
3340 cp_warning_at ("non-static reference `%#D' in class without a constructor", x);
3341 else
3342 cp_warning_at ("non-static reference in class without a constructor", x);
3343 }
3344 }
3345
3346 if (TREE_CODE (TREE_TYPE (x)) == POINTER_TYPE)
3347 has_pointers = 1;
3348
3349 /* If any field is const, the structure type is pseudo-const. */
3350 if (TREE_READONLY (x))
3351 {
3352 C_TYPE_FIELDS_READONLY (t) = 1;
3353 if (DECL_INITIAL (x) == NULL_TREE)
3354 const_sans_init = 1;
3355
3356 /* ARM $12.6.2: [A member initializer list] (or, for an
3357 aggregate, initialization by a brace-enclosed list) is the
3358 only way to initialize nonstatic const and reference
3359 members. */
3360 cant_have_default_ctor = 1;
3361 TYPE_HAS_COMPLEX_ASSIGN_REF (t) = 1;
3362
3363 if (! TYPE_HAS_CONSTRUCTOR (t) && !IS_SIGNATURE (t)
3364 && extra_warnings)
3365 {
3366 if (DECL_NAME (x))
3367 cp_warning_at ("non-static const member `%#D' in class without a constructor", x);
3368 else
3369 cp_warning_at ("non-static const member in class without a constructor", x);
3370 }
3371 }
3372 else
3373 {
3374 /* A field that is pseudo-const makes the structure
3375 likewise. */
3376 tree t1 = TREE_TYPE (x);
3377 while (TREE_CODE (t1) == ARRAY_TYPE)
3378 t1 = TREE_TYPE (t1);
3379 if (IS_AGGR_TYPE (t1))
3380 {
3381 if (C_TYPE_FIELDS_READONLY (t1))
3382 C_TYPE_FIELDS_READONLY (t) = 1;
3383 if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (t1))
3384 const_sans_init = 1;
3385 }
3386 }
3387
3388 /* We set DECL_BIT_FIELD tentatively in grokbitfield.
3389 If the type and width are valid, we'll keep it set.
3390 Otherwise, the flag is cleared. */
3391 if (DECL_BIT_FIELD (x))
3392 {
3393 DECL_BIT_FIELD (x) = 0;
3394 /* Invalid bit-field size done by grokfield. */
3395 /* Detect invalid bit-field type. */
3396 if (DECL_INITIAL (x)
3397 && ! INTEGRAL_TYPE_P (TREE_TYPE (x)))
3398 {
3399 cp_error_at ("bit-field `%#D' with non-integral type", x);
3400 DECL_INITIAL (x) = NULL;
3401 }
3402
3403 /* Detect and ignore out of range field width. */
3404 if (DECL_INITIAL (x))
3405 {
3406 tree w = DECL_INITIAL (x);
3407 register int width = 0;
3408
3409 /* Avoid the non_lvalue wrapper added by fold for PLUS_EXPRs. */
3410 STRIP_NOPS (w);
3411
3412 /* detect invalid field size. */
3413 if (TREE_CODE (w) == CONST_DECL)
3414 w = DECL_INITIAL (w);
3415 else if (TREE_READONLY_DECL_P (w))
3416 w = decl_constant_value (w);
3417
3418 if (TREE_CODE (w) != INTEGER_CST)
3419 {
3420 cp_error_at ("bit-field `%D' width not an integer constant",
3421 x);
3422 DECL_INITIAL (x) = NULL_TREE;
3423 }
3424 else if (width = TREE_INT_CST_LOW (w),
3425 width < 0)
3426 {
3427 DECL_INITIAL (x) = NULL;
3428 cp_error_at ("negative width in bit-field `%D'", x);
3429 }
3430 else if (width == 0 && DECL_NAME (x) != 0)
3431 {
3432 DECL_INITIAL (x) = NULL;
3433 cp_error_at ("zero width for bit-field `%D'", x);
3434 }
3435 else if (width
3436 > TYPE_PRECISION (long_long_unsigned_type_node))
3437 {
3438 /* The backend will dump if you try to use something
3439 too big; avoid that. */
3440 DECL_INITIAL (x) = NULL;
3441 sorry ("bit-fields larger than %d bits",
3442 TYPE_PRECISION (long_long_unsigned_type_node));
3443 cp_error_at (" in declaration of `%D'", x);
3444 }
3445 else if (width > TYPE_PRECISION (TREE_TYPE (x))
3446 && TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE
3447 && TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE)
3448 {
3449 cp_warning_at ("width of `%D' exceeds its type", x);
3450 }
3451 else if (TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE
3452 && ((min_precision (TYPE_MIN_VALUE (TREE_TYPE (x)),
3453 TREE_UNSIGNED (TREE_TYPE (x))) > width)
3454 || (min_precision (TYPE_MAX_VALUE (TREE_TYPE (x)),
3455 TREE_UNSIGNED (TREE_TYPE (x))) > width)))
3456 {
3457 cp_warning_at ("`%D' is too small to hold all values of `%#T'",
3458 x, TREE_TYPE (x));
3459 }
3460
3461 if (DECL_INITIAL (x) == NULL_TREE)
3462 ;
3463 else if (width == 0)
3464 {
3465 #ifdef EMPTY_FIELD_BOUNDARY
3466 DECL_ALIGN (x) = MAX (DECL_ALIGN (x), EMPTY_FIELD_BOUNDARY);
3467 #endif
3468 #ifdef PCC_BITFIELD_TYPE_MATTERS
3469 DECL_ALIGN (x) = MAX (DECL_ALIGN (x),
3470 TYPE_ALIGN (TREE_TYPE (x)));
3471 #endif
3472 }
3473 else
3474 {
3475 DECL_INITIAL (x) = NULL_TREE;
3476 DECL_FIELD_SIZE (x) = width;
3477 DECL_BIT_FIELD (x) = 1;
3478 }
3479 }
3480 else
3481 /* Non-bit-fields are aligned for their type. */
3482 DECL_ALIGN (x) = MAX (DECL_ALIGN (x), TYPE_ALIGN (TREE_TYPE (x)));
3483 }
3484 else
3485 {
3486 tree type = TREE_TYPE (x);
3487
3488 while (TREE_CODE (type) == ARRAY_TYPE)
3489 type = TREE_TYPE (type);
3490
3491 if (TYPE_LANG_SPECIFIC (type) && ! ANON_UNION_P (x)
3492 && ! TYPE_PTRMEMFUNC_P (type))
3493 {
3494 /* Never let anything with uninheritable virtuals
3495 make it through without complaint. */
3496 if (CLASSTYPE_ABSTRACT_VIRTUALS (type))
3497 abstract_virtuals_error (x, type);
3498
3499 /* Don't let signatures make it through either. */
3500 if (IS_SIGNATURE (type))
3501 signature_error (x, type);
3502
3503 if (code == UNION_TYPE)
3504 {
3505 char *fie = NULL;
3506 if (TYPE_NEEDS_CONSTRUCTING (type))
3507 fie = "constructor";
3508 else if (TYPE_NEEDS_DESTRUCTOR (type))
3509 fie = "destructor";
3510 else if (TYPE_HAS_REAL_ASSIGNMENT (type))
3511 fie = "assignment operator";
3512 if (fie)
3513 cp_error_at ("member `%#D' with %s not allowed in union", x,
3514 fie);
3515 }
3516 else
3517 {
3518 TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (type);
3519 TYPE_NEEDS_DESTRUCTOR (t) |= TYPE_NEEDS_DESTRUCTOR (type);
3520 TYPE_HAS_COMPLEX_ASSIGN_REF (t) |= TYPE_HAS_COMPLEX_ASSIGN_REF (type);
3521 TYPE_HAS_COMPLEX_INIT_REF (t) |= TYPE_HAS_COMPLEX_INIT_REF (type);
3522 }
3523
3524 if (!TYPE_HAS_CONST_INIT_REF (type))
3525 cant_have_const_ctor = 1;
3526
3527 if (!TYPE_HAS_CONST_ASSIGN_REF (type))
3528 no_const_asn_ref = 1;
3529
3530 if (TYPE_HAS_CONSTRUCTOR (type)
3531 && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
3532 {
3533 cant_have_default_ctor = 1;
3534 #if 0
3535 /* This is wrong for aggregates. */
3536 if (! TYPE_HAS_CONSTRUCTOR (t))
3537 {
3538 if (DECL_NAME (x))
3539 cp_pedwarn_at ("member `%#D' with only non-default constructor", x);
3540 else
3541 cp_pedwarn_at ("member with only non-default constructor", x);
3542 cp_pedwarn_at ("in class without a constructor",
3543 x);
3544 }
3545 #endif
3546 }
3547 }
3548 if (DECL_INITIAL (x) != NULL_TREE)
3549 {
3550 /* `build_class_init_list' does not recognize
3551 non-FIELD_DECLs. */
3552 if (code == UNION_TYPE && any_default_members != 0)
3553 cp_error_at ("multiple fields in union `%T' initialized");
3554 any_default_members = 1;
3555 }
3556 }
3557 }
3558
3559 /* If this type has any constant members which did not come
3560 with their own initialization, mark that fact here. It is
3561 not an error here, since such types can be saved either by their
3562 constructors, or by fortuitous initialization. */
3563 CLASSTYPE_READONLY_FIELDS_NEED_INIT (t) = const_sans_init;
3564 CLASSTYPE_REF_FIELDS_NEED_INIT (t) = ref_sans_init;
3565 CLASSTYPE_ABSTRACT_VIRTUALS (t) = abstract_virtuals;
3566
3567 /* Synthesize any needed methods. Note that methods will be synthesized
3568 for anonymous unions; grok_x_components undoes that. */
3569
3570 if (! fn_fields)
3571 nonprivate_method = 1;
3572
3573 if (TYPE_NEEDS_DESTRUCTOR (t) && !TYPE_HAS_DESTRUCTOR (t)
3574 && !IS_SIGNATURE (t))
3575 {
3576 /* Here we must cons up a destructor on the fly. */
3577 tree dtor = cons_up_default_function (t, name, 0);
3578 check_for_override (dtor, t);
3579
3580 /* If we couldn't make it work, then pretend we didn't need it. */
3581 if (dtor == void_type_node)
3582 TYPE_NEEDS_DESTRUCTOR (t) = 0;
3583 else
3584 {
3585 /* Link dtor onto end of fn_fields. */
3586
3587 TREE_CHAIN (dtor) = fn_fields;
3588 fn_fields = dtor;
3589
3590 if (DECL_VINDEX (dtor))
3591 add_virtual_function (&pending_virtuals, &pending_hard_virtuals,
3592 &has_virtual, dtor, t);
3593 nonprivate_method = 1;
3594 }
3595 }
3596
3597 /* Effective C++ rule 11. */
3598 if (has_pointers && warn_ecpp && TYPE_HAS_CONSTRUCTOR (t)
3599 && ! (TYPE_HAS_INIT_REF (t) && TYPE_HAS_ASSIGN_REF (t)))
3600 {
3601 cp_warning ("`%#T' has pointer data members", t);
3602
3603 if (! TYPE_HAS_INIT_REF (t))
3604 {
3605 cp_warning (" but does not override `%T(const %T&)'", t, t);
3606 if (! TYPE_HAS_ASSIGN_REF (t))
3607 cp_warning (" or `operator=(const %T&)'", t);
3608 }
3609 else if (! TYPE_HAS_ASSIGN_REF (t))
3610 cp_warning (" but does not override `operator=(const %T&)'", t);
3611 }
3612
3613 TYPE_NEEDS_DESTRUCTOR (t) |= TYPE_HAS_DESTRUCTOR (t);
3614
3615 TYPE_HAS_COMPLEX_INIT_REF (t)
3616 |= (TYPE_HAS_INIT_REF (t) || TYPE_USES_VIRTUAL_BASECLASSES (t)
3617 || has_virtual || any_default_members);
3618 TYPE_NEEDS_CONSTRUCTING (t)
3619 |= (TYPE_HAS_CONSTRUCTOR (t) || TYPE_USES_VIRTUAL_BASECLASSES (t)
3620 || has_virtual || any_default_members);
3621 if (! IS_SIGNATURE (t))
3622 CLASSTYPE_NON_AGGREGATE (t)
3623 = ! aggregate || has_virtual || TYPE_HAS_CONSTRUCTOR (t);
3624
3625 /* ARM $12.1: A default constructor will be generated for a class X
3626 only if no constructor has been declared for class X. So we
3627 check TYPE_HAS_CONSTRUCTOR also, to make sure we don't generate
3628 one if they declared a constructor in this class. */
3629 if (! TYPE_HAS_CONSTRUCTOR (t) && ! cant_have_default_ctor
3630 && ! IS_SIGNATURE (t))
3631 {
3632 tree default_fn = cons_up_default_function (t, name, 2);
3633 TREE_CHAIN (default_fn) = fn_fields;
3634 fn_fields = default_fn;
3635 }
3636
3637 /* Create default copy constructor, if needed. */
3638 if (! TYPE_HAS_INIT_REF (t) && ! IS_SIGNATURE (t))
3639 {
3640 /* ARM 12.18: You get either X(X&) or X(const X&), but
3641 not both. --Chip */
3642 tree default_fn = cons_up_default_function (t, name,
3643 3 + cant_have_const_ctor);
3644 TREE_CHAIN (default_fn) = fn_fields;
3645 fn_fields = default_fn;
3646 }
3647
3648 TYPE_HAS_REAL_ASSIGNMENT (t) |= TYPE_HAS_ASSIGNMENT (t);
3649 TYPE_HAS_REAL_ASSIGN_REF (t) |= TYPE_HAS_ASSIGN_REF (t);
3650 TYPE_HAS_COMPLEX_ASSIGN_REF (t)
3651 |= TYPE_HAS_ASSIGN_REF (t) || TYPE_USES_VIRTUAL_BASECLASSES (t);
3652
3653 if (! TYPE_HAS_ASSIGN_REF (t) && ! IS_SIGNATURE (t))
3654 {
3655 tree default_fn = cons_up_default_function (t, name,
3656 5 + no_const_asn_ref);
3657 TREE_CHAIN (default_fn) = fn_fields;
3658 fn_fields = default_fn;
3659 }
3660
3661 if (fn_fields)
3662 {
3663 TYPE_METHODS (t) = fn_fields;
3664 method_vec = finish_struct_methods (t, fn_fields, nonprivate_method);
3665
3666 if (TYPE_HAS_CONSTRUCTOR (t)
3667 && CLASSTYPE_FRIEND_CLASSES (t) == NULL_TREE
3668 && DECL_FRIENDLIST (TYPE_MAIN_DECL (t)) == NULL_TREE)
3669 {
3670 int nonprivate_ctor = 0;
3671 tree ctor;
3672
3673 for (ctor = TREE_VEC_ELT (method_vec, 0);
3674 ctor;
3675 ctor = DECL_CHAIN (ctor))
3676 if (! TREE_PRIVATE (ctor))
3677 {
3678 nonprivate_ctor = 1;
3679 break;
3680 }
3681
3682 if (nonprivate_ctor == 0 && warn_ctor_dtor_privacy)
3683 cp_warning ("`%#T' only defines private constructors and has no friends",
3684 t);
3685 }
3686 }
3687 else
3688 {
3689 method_vec = 0;
3690
3691 /* Just in case these got accidentally
3692 filled in by syntax errors. */
3693 TYPE_HAS_CONSTRUCTOR (t) = 0;
3694 TYPE_HAS_DESTRUCTOR (t) = 0;
3695 }
3696
3697 {
3698 int n_methods = method_vec ? TREE_VEC_LENGTH (method_vec) : 0;
3699
3700 for (access_decls = nreverse (access_decls); access_decls;
3701 access_decls = TREE_CHAIN (access_decls))
3702 {
3703 tree fdecl = TREE_VALUE (access_decls);
3704 tree flist = NULL_TREE;
3705 tree name;
3706 tree access = TREE_PURPOSE (access_decls);
3707 int i = 2;
3708 tree tmp;
3709
3710 if (TREE_CODE (fdecl) == TREE_LIST)
3711 {
3712 flist = fdecl;
3713 fdecl = TREE_VALUE (flist);
3714 }
3715
3716 name = DECL_NAME (fdecl);
3717
3718 for (; i < n_methods; i++)
3719 if (DECL_NAME (TREE_VEC_ELT (method_vec, i)) == name)
3720 {
3721 cp_error ("cannot adjust access to `%#D' in `%#T'", fdecl, t);
3722 cp_error_at (" because of local method `%#D' with same name",
3723 TREE_VEC_ELT (method_vec, i));
3724 fdecl = NULL_TREE;
3725 break;
3726 }
3727
3728 if (! fdecl)
3729 continue;
3730
3731 for (tmp = fields; tmp; tmp = TREE_CHAIN (tmp))
3732 if (DECL_NAME (tmp) == name)
3733 {
3734 cp_error ("cannot adjust access to `%#D' in `%#T'", fdecl, t);
3735 cp_error_at (" because of local field `%#D' with same name", tmp);
3736 fdecl = NULL_TREE;
3737 break;
3738 }
3739
3740 if (!fdecl)
3741 continue;
3742
3743 /* Make type T see field decl FDECL with access ACCESS.*/
3744 if (flist)
3745 {
3746 fdecl = TREE_VALUE (flist);
3747 while (fdecl)
3748 {
3749 if (alter_access (t, fdecl, access) == 0)
3750 break;
3751 fdecl = DECL_CHAIN (fdecl);
3752 }
3753 }
3754 else
3755 alter_access (t, fdecl, access);
3756 }
3757
3758 }
3759
3760 if (n_baseclasses)
3761 fields = chainon (build_vbase_pointer_fields (t), fields);
3762
3763 if (vfield == NULL_TREE && has_virtual)
3764 {
3765 /* We build this decl with ptr_type_node, and
3766 change the type when we know what it should be. */
3767 vfield = build_lang_field_decl (FIELD_DECL, get_vfield_name (t),
3768 ptr_type_node);
3769 /* If you change any of the below, take a look at all the
3770 other VFIELD_BASEs and VTABLE_BASEs in the code, and change
3771 them too. */
3772 DECL_ASSEMBLER_NAME (vfield) = get_identifier (VFIELD_BASE);
3773 CLASSTYPE_VFIELD (t) = vfield;
3774 DECL_VIRTUAL_P (vfield) = 1;
3775 DECL_ARTIFICIAL (vfield) = 1;
3776 DECL_FIELD_CONTEXT (vfield) = t;
3777 DECL_CLASS_CONTEXT (vfield) = t;
3778 DECL_FCONTEXT (vfield) = t;
3779 DECL_SAVED_INSNS (vfield) = NULL_RTX;
3780 DECL_FIELD_SIZE (vfield) = 0;
3781 DECL_ALIGN (vfield) = TYPE_ALIGN (ptr_type_node);
3782 #if 0
3783 /* This is more efficient, but breaks binary compatibility, turn
3784 it on sometime when we don't care. If we turn it on, we also
3785 have to enable the code in dfs_init_vbase_pointers. */
3786 /* vfield is always first entry in structure. */
3787 TREE_CHAIN (vfield) = fields;
3788 fields = vfield;
3789 #else
3790 if (last_x)
3791 {
3792 my_friendly_assert (TREE_CHAIN (last_x) == NULL_TREE, 175);
3793 TREE_CHAIN (last_x) = vfield;
3794 last_x = vfield;
3795 }
3796 else
3797 fields = vfield;
3798 #endif
3799 empty = 0;
3800 vfields = chainon (vfields, CLASSTYPE_AS_LIST (t));
3801 }
3802
3803 /* Now DECL_INITIAL is null on all members except for zero-width bit-fields.
3804 And they have already done their work.
3805
3806 C++: maybe we will support default field initialization some day... */
3807
3808 /* Delete all zero-width bit-fields from the front of the fieldlist */
3809 while (fields && DECL_BIT_FIELD (fields)
3810 && DECL_INITIAL (fields))
3811 fields = TREE_CHAIN (fields);
3812 /* Delete all such fields from the rest of the fields. */
3813 for (x = fields; x;)
3814 {
3815 if (TREE_CHAIN (x) && DECL_BIT_FIELD (TREE_CHAIN (x))
3816 && DECL_INITIAL (TREE_CHAIN (x)))
3817 TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x));
3818 else
3819 x = TREE_CHAIN (x);
3820 }
3821 /* Delete all duplicate fields from the fields */
3822 delete_duplicate_fields (fields);
3823
3824 /* Catch function/field name conflict. We don't need to do this for a
3825 signature, since it can only contain the fields constructed in
3826 append_signature_fields. */
3827 if (! IS_SIGNATURE (t))
3828 {
3829 int n_methods = method_vec ? TREE_VEC_LENGTH (method_vec) : 0;
3830 for (x = fields; x; x = TREE_CHAIN (x))
3831 {
3832 tree name = DECL_NAME (x);
3833 int i = 2;
3834
3835 if (TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x))
3836 continue;
3837
3838 for (; i < n_methods; ++i)
3839 if (DECL_NAME (TREE_VEC_ELT (method_vec, i)) == name)
3840 {
3841 cp_error_at ("data member `%#D' conflicts with", x);
3842 cp_error_at ("function member `%#D'",
3843 TREE_VEC_ELT (method_vec, i));
3844 break;
3845 }
3846 }
3847 }
3848
3849 /* Now we have the final fieldlist for the data fields. Record it,
3850 then lay out the structure or union (including the fields). */
3851
3852 TYPE_FIELDS (t) = fields;
3853
3854 if (n_baseclasses)
3855 TYPE_FIELDS (t) = chainon (build_base_fields (t), fields);
3856 else if (empty)
3857 {
3858 /* C++: do not let empty structures exist. */
3859 tree decl = build_lang_field_decl
3860 (FIELD_DECL, NULL_TREE, char_type_node);
3861 TREE_CHAIN (decl) = TYPE_FIELDS (t);
3862 TYPE_FIELDS (t) = decl;
3863 }
3864
3865 layout_type (t);
3866
3867 /* Remember the size and alignment of the class before adding
3868 the virtual bases. */
3869 CLASSTYPE_SIZE (t) = TYPE_SIZE (t);
3870 CLASSTYPE_ALIGN (t) = TYPE_ALIGN (t);
3871
3872 finish_struct_anon (t);
3873
3874 /* Set the TYPE_DECL for this type to contain the right
3875 value for DECL_OFFSET, so that we can use it as part
3876 of a COMPONENT_REF for multiple inheritance. */
3877
3878 layout_decl (TYPE_MAIN_DECL (t), 0);
3879
3880 /* Now fix up any virtual base class types that we left lying
3881 around. We must get these done before we try to lay out the
3882 virtual function table. */
3883 pending_hard_virtuals = nreverse (pending_hard_virtuals);
3884
3885 if (n_baseclasses)
3886 /* layout_basetypes will remove the base subobject fields. */
3887 max_has_virtual = layout_basetypes (t, max_has_virtual);
3888 else if (empty)
3889 TYPE_FIELDS (t) = fields;
3890
3891 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
3892 {
3893 tree vbases;
3894
3895 vbases = CLASSTYPE_VBASECLASSES (t);
3896 CLASSTYPE_N_VBASECLASSES (t) = list_length (vbases);
3897
3898 {
3899 /* Now fixup overrides of all functions in vtables from all
3900 direct or indirect virtual base classes. */
3901 tree binfos = BINFO_BASETYPES (TYPE_BINFO (t));
3902 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
3903
3904 for (i = 0; i < n_baseclasses; i++)
3905 {
3906 tree base_binfo = TREE_VEC_ELT (binfos, i);
3907 tree basetype = BINFO_TYPE (base_binfo);
3908 tree vbases;
3909
3910 vbases = CLASSTYPE_VBASECLASSES (basetype);
3911 while (vbases)
3912 {
3913 merge_overrides (binfo_member (BINFO_TYPE (vbases),
3914 CLASSTYPE_VBASECLASSES (t)),
3915 vbases, 1, t);
3916 vbases = TREE_CHAIN (vbases);
3917 }
3918 }
3919 }
3920 }
3921
3922 /* Set up the DECL_FIELD_BITPOS of the vfield if we need to, as we
3923 might need to know it for setting up the offsets in the vtable
3924 (or in thunks) below. */
3925 if (vfield != NULL_TREE
3926 && DECL_FIELD_CONTEXT (vfield) != t)
3927 {
3928 tree binfo = get_binfo (DECL_FIELD_CONTEXT (vfield), t, 0);
3929 tree offset = BINFO_OFFSET (binfo);
3930
3931 vfield = copy_node (vfield);
3932 copy_lang_decl (vfield);
3933
3934 if (! integer_zerop (offset))
3935 offset = size_binop (MULT_EXPR, offset, size_int (BITS_PER_UNIT));
3936 DECL_FIELD_CONTEXT (vfield) = t;
3937 DECL_CLASS_CONTEXT (vfield) = t;
3938 DECL_FIELD_BITPOS (vfield)
3939 = size_binop (PLUS_EXPR, offset, DECL_FIELD_BITPOS (vfield));
3940 CLASSTYPE_VFIELD (t) = vfield;
3941 }
3942
3943 #ifdef NOTQUITE
3944 cp_warning ("Doing hard virtuals for %T...", t);
3945 #endif
3946
3947 if (has_virtual > max_has_virtual)
3948 max_has_virtual = has_virtual;
3949 if (max_has_virtual > 0)
3950 TYPE_VIRTUAL_P (t) = 1;
3951
3952 if (flag_rtti && TYPE_VIRTUAL_P (t) && !pending_hard_virtuals)
3953 modify_all_vtables (t, NULL_TREE, NULL_TREE);
3954
3955 while (pending_hard_virtuals)
3956 {
3957 modify_all_vtables (t,
3958 TREE_PURPOSE (pending_hard_virtuals),
3959 TREE_VALUE (pending_hard_virtuals));
3960 pending_hard_virtuals = TREE_CHAIN (pending_hard_virtuals);
3961 }
3962
3963 if (TYPE_USES_VIRTUAL_BASECLASSES (t))
3964 {
3965 tree vbases;
3966 /* Now fixup any virtual function entries from virtual bases
3967 that have different deltas. This has to come after we do the
3968 pending hard virtuals, as we might have a function that comes
3969 from multiple virtual base instances that is only overridden
3970 by a hard virtual above. */
3971 vbases = CLASSTYPE_VBASECLASSES (t);
3972 while (vbases)
3973 {
3974 /* We might be able to shorten the amount of work we do by
3975 only doing this for vtables that come from virtual bases
3976 that have differing offsets, but don't want to miss any
3977 entries. */
3978 fixup_vtable_deltas (vbases, 1, t);
3979 vbases = TREE_CHAIN (vbases);
3980 }
3981 }
3982
3983 /* Under our model of GC, every C++ class gets its own virtual
3984 function table, at least virtually. */
3985 if (pending_virtuals)
3986 {
3987 pending_virtuals = nreverse (pending_virtuals);
3988 /* We must enter these virtuals into the table. */
3989 if (first_vfn_base_index < 0)
3990 {
3991 /* The second slot is for the tdesc pointer when thunks are used. */
3992 if (flag_vtable_thunks)
3993 pending_virtuals = tree_cons (NULL_TREE, NULL_TREE, pending_virtuals);
3994
3995 /* The first slot is for the rtti offset. */
3996 pending_virtuals = tree_cons (NULL_TREE, NULL_TREE, pending_virtuals);
3997
3998 set_rtti_entry (pending_virtuals, size_zero_node, t);
3999 build_vtable (NULL_TREE, t);
4000 }
4001 else
4002 {
4003 /* Here we know enough to change the type of our virtual
4004 function table, but we will wait until later this function. */
4005
4006 if (! BINFO_NEW_VTABLE_MARKED (TYPE_BINFO (t)))
4007 build_vtable (TREE_VEC_ELT (TYPE_BINFO_BASETYPES (t), first_vfn_base_index), t);
4008 }
4009
4010 /* If this type has basetypes with constructors, then those
4011 constructors might clobber the virtual function table. But
4012 they don't if the derived class shares the exact vtable of the base
4013 class. */
4014
4015 CLASSTYPE_NEEDS_VIRTUAL_REINIT (t) = 1;
4016 }
4017 else if (first_vfn_base_index >= 0)
4018 {
4019 tree binfo = TREE_VEC_ELT (TYPE_BINFO_BASETYPES (t), first_vfn_base_index);
4020 /* This class contributes nothing new to the virtual function
4021 table. However, it may have declared functions which
4022 went into the virtual function table "inherited" from the
4023 base class. If so, we grab a copy of those updated functions,
4024 and pretend they are ours. */
4025
4026 /* See if we should steal the virtual info from base class. */
4027 if (TYPE_BINFO_VTABLE (t) == NULL_TREE)
4028 TYPE_BINFO_VTABLE (t) = BINFO_VTABLE (binfo);
4029 if (TYPE_BINFO_VIRTUALS (t) == NULL_TREE)
4030 TYPE_BINFO_VIRTUALS (t) = BINFO_VIRTUALS (binfo);
4031 if (TYPE_BINFO_VTABLE (t) != BINFO_VTABLE (binfo))
4032 CLASSTYPE_NEEDS_VIRTUAL_REINIT (t) = 1;
4033 }
4034
4035 if (max_has_virtual || first_vfn_base_index >= 0)
4036 {
4037 CLASSTYPE_VSIZE (t) = has_virtual;
4038 if (first_vfn_base_index >= 0)
4039 {
4040 if (pending_virtuals)
4041 TYPE_BINFO_VIRTUALS (t) = chainon (TYPE_BINFO_VIRTUALS (t),
4042 pending_virtuals);
4043 }
4044 else if (has_virtual)
4045 {
4046 TYPE_BINFO_VIRTUALS (t) = pending_virtuals;
4047 if (write_virtuals >= 0)
4048 DECL_VIRTUAL_P (TYPE_BINFO_VTABLE (t)) = 1;
4049 }
4050 }
4051
4052 /* Now lay out the virtual function table. */
4053 if (has_virtual)
4054 {
4055 tree atype, itype;
4056
4057 if (TREE_TYPE (vfield) == ptr_type_node)
4058 {
4059 /* We must create a pointer to this table because
4060 the one inherited from base class does not exist.
4061 We will fill in the type when we know what it
4062 should really be. Use `size_int' so values are memoized
4063 in common cases. */
4064 itype = build_index_type (size_int (has_virtual));
4065 atype = build_array_type (vtable_entry_type, itype);
4066 layout_type (atype);
4067 TREE_TYPE (vfield) = build_pointer_type (atype);
4068 }
4069 else
4070 {
4071 atype = TREE_TYPE (TREE_TYPE (vfield));
4072
4073 if (has_virtual != TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (atype))))
4074 {
4075 /* We must extend (or create) the boundaries on this array,
4076 because we picked up virtual functions from multiple
4077 base classes. */
4078 itype = build_index_type (size_int (has_virtual));
4079 atype = build_array_type (vtable_entry_type, itype);
4080 layout_type (atype);
4081 vfield = copy_node (vfield);
4082 TREE_TYPE (vfield) = build_pointer_type (atype);
4083 }
4084 }
4085
4086 CLASSTYPE_VFIELD (t) = vfield;
4087 if (TREE_TYPE (TYPE_BINFO_VTABLE (t)) != atype)
4088 {
4089 TREE_TYPE (TYPE_BINFO_VTABLE (t)) = atype;
4090 DECL_SIZE (TYPE_BINFO_VTABLE (t)) = 0;
4091 layout_decl (TYPE_BINFO_VTABLE (t), 0);
4092 /* At one time the vtable info was grabbed 2 words at a time. This
4093 fails on sparc unless you have 8-byte alignment. (tiemann) */
4094 DECL_ALIGN (TYPE_BINFO_VTABLE (t))
4095 = MAX (TYPE_ALIGN (double_type_node),
4096 DECL_ALIGN (TYPE_BINFO_VTABLE (t)));
4097 }
4098 }
4099 else if (first_vfn_base_index >= 0)
4100 CLASSTYPE_VFIELD (t) = vfield;
4101 CLASSTYPE_VFIELDS (t) = vfields;
4102
4103 finish_struct_bits (t, max_has_virtual);
4104
4105 /* Complete the rtl for any static member objects of the type we're
4106 working on. */
4107 for (x = fields; x; x = TREE_CHAIN (x))
4108 {
4109 if (TREE_CODE (x) == VAR_DECL && TREE_STATIC (x)
4110 && TREE_TYPE (x) == t)
4111 {
4112 DECL_MODE (x) = TYPE_MODE (t);
4113 make_decl_rtl (x, NULL, 0);
4114 }
4115 }
4116
4117 if (TYPE_HAS_CONSTRUCTOR (t))
4118 {
4119 tree vfields = CLASSTYPE_VFIELDS (t);
4120
4121 while (vfields)
4122 {
4123 /* Mark the fact that constructor for T
4124 could affect anybody inheriting from T
4125 who wants to initialize vtables for VFIELDS's type. */
4126 if (VF_DERIVED_VALUE (vfields))
4127 TREE_ADDRESSABLE (vfields) = 1;
4128 vfields = TREE_CHAIN (vfields);
4129 }
4130 if (any_default_members != 0)
4131 build_class_init_list (t);
4132 }
4133 else if (TYPE_NEEDS_CONSTRUCTING (t))
4134 build_class_init_list (t);
4135
4136 /* Write out inline function definitions. */
4137 do_inline_function_hair (t, CLASSTYPE_INLINE_FRIENDS (t));
4138 CLASSTYPE_INLINE_FRIENDS (t) = 0;
4139
4140 if (CLASSTYPE_VSIZE (t) != 0)
4141 {
4142 #if 0
4143 /* This is now done above. */
4144 if (DECL_FIELD_CONTEXT (vfield) != t)
4145 {
4146 tree binfo = get_binfo (DECL_FIELD_CONTEXT (vfield), t, 0);
4147 tree offset = BINFO_OFFSET (binfo);
4148
4149 vfield = copy_node (vfield);
4150 copy_lang_decl (vfield);
4151
4152 if (! integer_zerop (offset))
4153 offset = size_binop (MULT_EXPR, offset, size_int (BITS_PER_UNIT));
4154 DECL_FIELD_CONTEXT (vfield) = t;
4155 DECL_CLASS_CONTEXT (vfield) = t;
4156 DECL_FIELD_BITPOS (vfield)
4157 = size_binop (PLUS_EXPR, offset, DECL_FIELD_BITPOS (vfield));
4158 CLASSTYPE_VFIELD (t) = vfield;
4159 }
4160 #endif
4161
4162 /* In addition to this one, all the other vfields should be listed. */
4163 /* Before that can be done, we have to have FIELD_DECLs for them, and
4164 a place to find them. */
4165 TYPE_NONCOPIED_PARTS (t) = build_tree_list (default_conversion (TYPE_BINFO_VTABLE (t)), vfield);
4166
4167 if (warn_nonvdtor && TYPE_HAS_DESTRUCTOR (t)
4168 && DECL_VINDEX (TREE_VEC_ELT (method_vec, 1)) == NULL_TREE)
4169 cp_warning ("`%#T' has virtual functions but non-virtual destructor",
4170 t);
4171 }
4172
4173 /* Make the rtl for any new vtables we have created, and unmark
4174 the base types we marked. */
4175 finish_vtbls (TYPE_BINFO (t), 1, t);
4176 hack_incomplete_structures (t);
4177
4178 #if 0
4179 if (TYPE_NAME (t) && TYPE_IDENTIFIER (t))
4180 undo_template_name_overload (TYPE_IDENTIFIER (t), 1);
4181 #endif
4182
4183 resume_momentary (old);
4184
4185 if (warn_overloaded_virtual)
4186 warn_hidden (t);
4187
4188 #if 0
4189 /* This has to be done after we have sorted out what to do with
4190 the enclosing type. */
4191 if (write_symbols != DWARF_DEBUG)
4192 {
4193 /* Be smarter about nested classes here. If a type is nested,
4194 only output it if we would output the enclosing type. */
4195 if (DECL_CONTEXT (TYPE_MAIN_DECL (t))
4196 && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (TYPE_MAIN_DECL (t)))) == 't')
4197 DECL_IGNORED_P (TYPE_MAIN_DECL (t)) = TREE_ASM_WRITTEN (TYPE_MAIN_DECL (t));
4198 }
4199 #endif
4200
4201 if (write_symbols != DWARF_DEBUG && write_symbols != DWARF2_DEBUG)
4202 {
4203 /* If the type has methods, we want to think about cutting down
4204 the amount of symbol table stuff we output. The value stored in
4205 the TYPE_DECL's DECL_IGNORED_P slot is a first approximation.
4206 For example, if a member function is seen and we decide to
4207 write out that member function, then we can change the value
4208 of the DECL_IGNORED_P slot, and the type will be output when
4209 that member function's debug info is written out.
4210
4211 We can't do this with DWARF, which does not support name
4212 references between translation units. */
4213 if (CLASSTYPE_METHOD_VEC (t))
4214 {
4215 extern tree pending_vtables;
4216
4217 /* Don't output full info about any type
4218 which does not have its implementation defined here. */
4219 if (TYPE_VIRTUAL_P (t) && write_virtuals == 2)
4220 TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t))
4221 = (value_member (TYPE_IDENTIFIER (t), pending_vtables) == 0);
4222 else if (CLASSTYPE_INTERFACE_ONLY (t))
4223 TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
4224 #if 0
4225 /* XXX do something about this. */
4226 else if (CLASSTYPE_INTERFACE_UNKNOWN (t))
4227 /* Only a first approximation! */
4228 TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
4229 #endif
4230 }
4231 else if (CLASSTYPE_INTERFACE_ONLY (t))
4232 TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
4233 }
4234
4235 /* Finish debugging output for this type. */
4236 rest_of_type_compilation (t, toplevel_bindings_p ());
4237
4238 return t;
4239 }
4240
4241 tree
4242 finish_struct (t, list_of_fieldlists, attributes, warn_anon)
4243 tree t, list_of_fieldlists, attributes;
4244 int warn_anon;
4245 {
4246 tree fields = NULL_TREE;
4247 tree *tail = &TYPE_METHODS (t);
4248 tree specializations = NULL_TREE;
4249 tree *specialization_tail = &specializations;
4250 tree name = TYPE_NAME (t);
4251 tree x, last_x = NULL_TREE;
4252 tree access;
4253 tree dummy = NULL_TREE;
4254 tree next_x = NULL_TREE;
4255
4256 if (TREE_CODE (name) == TYPE_DECL)
4257 {
4258 extern int lineno;
4259
4260 DECL_SOURCE_FILE (name) = input_filename;
4261 /* For TYPE_DECL that are not typedefs (those marked with a line
4262 number of zero, we don't want to mark them as real typedefs.
4263 If this fails one needs to make sure real typedefs have a
4264 previous line number, even if it is wrong, that way the below
4265 will fill in the right line number. (mrs) */
4266 if (DECL_SOURCE_LINE (name))
4267 DECL_SOURCE_LINE (name) = lineno;
4268 CLASSTYPE_SOURCE_LINE (t) = lineno;
4269 name = DECL_NAME (name);
4270 }
4271
4272 /* Append the fields we need for constructing signature tables. */
4273 if (IS_SIGNATURE (t))
4274 append_signature_fields (list_of_fieldlists);
4275
4276 /* Move our self-reference declaration to the end of the field list so
4277 any real field with the same name takes precedence. */
4278 if (list_of_fieldlists
4279 && TREE_VALUE (list_of_fieldlists)
4280 && DECL_ARTIFICIAL (TREE_VALUE (list_of_fieldlists)))
4281 {
4282 dummy = TREE_VALUE (list_of_fieldlists);
4283 list_of_fieldlists = TREE_CHAIN (list_of_fieldlists);
4284 }
4285
4286 if (last_x && list_of_fieldlists)
4287 TREE_CHAIN (last_x) = TREE_VALUE (list_of_fieldlists);
4288
4289 while (list_of_fieldlists)
4290 {
4291 access = TREE_PURPOSE (list_of_fieldlists);
4292
4293 /* For signatures, we made all methods `public' in the parser and
4294 reported an error if a access specifier was used. */
4295 if (access == access_default_node)
4296 {
4297 if (CLASSTYPE_DECLARED_CLASS (t) == 0)
4298 access = access_public_node;
4299 else
4300 access = access_private_node;
4301 }
4302
4303 for (x = TREE_VALUE (list_of_fieldlists); x; x = next_x)
4304 {
4305 next_x = TREE_CHAIN (x);
4306
4307 TREE_PRIVATE (x) = access == access_private_node;
4308 TREE_PROTECTED (x) = access == access_protected_node;
4309
4310 /* Check for inconsistent use of this name in the class body.
4311 Enums, types and static vars have already been checked. */
4312 if (TREE_CODE (x) != TYPE_DECL && TREE_CODE (x) != USING_DECL
4313 && ! (TREE_CODE (x) == TEMPLATE_DECL
4314 && TREE_CODE (DECL_RESULT (x)) == TYPE_DECL)
4315 && TREE_CODE (x) != CONST_DECL && TREE_CODE (x) != VAR_DECL)
4316 {
4317 tree name = DECL_NAME (x);
4318 tree icv;
4319
4320 /* Don't get confused by access decls. */
4321 if (name && TREE_CODE (name) == IDENTIFIER_NODE)
4322 icv = IDENTIFIER_CLASS_VALUE (name);
4323 else
4324 icv = NULL_TREE;
4325
4326 if (icv
4327 /* Don't complain about constructors. */
4328 && name != constructor_name (current_class_type)
4329 /* Or inherited names. */
4330 && id_in_current_class (name)
4331 /* Or shadowed tags. */
4332 && !(TREE_CODE (icv) == TYPE_DECL
4333 && DECL_CONTEXT (icv) == t))
4334 {
4335 cp_error_at ("declaration of identifier `%D' as `%+#D'",
4336 name, x);
4337 cp_error_at ("conflicts with other use in class as `%#D'",
4338 icv);
4339 }
4340 }
4341
4342 if (TREE_CODE (x) == FUNCTION_DECL
4343 || DECL_FUNCTION_TEMPLATE_P (x))
4344 {
4345 DECL_CLASS_CONTEXT (x) = t;
4346
4347 if (last_x)
4348 TREE_CHAIN (last_x) = next_x;
4349
4350 if (DECL_TEMPLATE_SPECIALIZATION (x))
4351 /* We don't enter the specialization into the class
4352 method vector since specializations don't affect
4353 overloading. Instead we keep track of the
4354 specializations, and process them after the method
4355 vector is complete. */
4356 {
4357 *specialization_tail = x;
4358 specialization_tail = &TREE_CHAIN (x);
4359 TREE_CHAIN (x) = NULL_TREE;
4360 continue;
4361 }
4362
4363 /* Link x onto end of TYPE_METHODS. */
4364 *tail = x;
4365 tail = &TREE_CHAIN (x);
4366 continue;
4367 }
4368
4369 if (TREE_CODE (x) != TYPE_DECL)
4370 DECL_FIELD_CONTEXT (x) = t;
4371
4372 if (! fields)
4373 fields = x;
4374 last_x = x;
4375 }
4376 list_of_fieldlists = TREE_CHAIN (list_of_fieldlists);
4377 /* link the tail while we have it! */
4378 if (last_x)
4379 {
4380 TREE_CHAIN (last_x) = NULL_TREE;
4381
4382 if (list_of_fieldlists
4383 && TREE_VALUE (list_of_fieldlists)
4384 && TREE_CODE (TREE_VALUE (list_of_fieldlists)) != FUNCTION_DECL)
4385 TREE_CHAIN (last_x) = TREE_VALUE (list_of_fieldlists);
4386 }
4387 }
4388
4389 /* Now add the tags, if any, to the list of TYPE_DECLs
4390 defined for this type. */
4391 if (CLASSTYPE_TAGS (t) || dummy)
4392 {
4393 /* The list of tags was built up in pushtag in reverse order; we need
4394 to fix that so that enumerators will be processed in forward order
4395 in template instantiation. */
4396 CLASSTYPE_TAGS (t) = x = nreverse (CLASSTYPE_TAGS (t));
4397 while (x)
4398 {
4399 tree tag = TYPE_MAIN_DECL (TREE_VALUE (x));
4400
4401 TREE_NONLOCAL_FLAG (TREE_VALUE (x)) = 0;
4402 x = TREE_CHAIN (x);
4403 last_x = chainon (last_x, tag);
4404 }
4405 if (dummy)
4406 last_x = chainon (last_x, dummy);
4407 if (fields == NULL_TREE)
4408 fields = last_x;
4409 CLASSTYPE_LOCAL_TYPEDECLS (t) = 1;
4410 }
4411
4412 *tail = NULL_TREE;
4413 TYPE_FIELDS (t) = fields;
4414
4415 cplus_decl_attributes (t, attributes, NULL_TREE);
4416
4417 if (processing_template_decl)
4418 {
4419 tree d = getdecls ();
4420 for (; d; d = TREE_CHAIN (d))
4421 {
4422 /* If this is the decl for the class or one of the template
4423 parms, we've seen all the injected decls. */
4424 if ((TREE_CODE (d) == TYPE_DECL
4425 && (TREE_TYPE (d) == t
4426 || TREE_CODE (TREE_TYPE (d)) == TEMPLATE_TYPE_PARM
4427 || TREE_CODE (TREE_TYPE (d)) == TEMPLATE_TEMPLATE_PARM))
4428 || TREE_CODE (d) == CONST_DECL)
4429 break;
4430 /* Don't inject cache decls. */
4431 else if (IDENTIFIER_TEMPLATE (DECL_NAME (d)))
4432 continue;
4433 DECL_TEMPLATE_INJECT (CLASSTYPE_TI_TEMPLATE (t))
4434 = tree_cons (NULL_TREE, d,
4435 DECL_TEMPLATE_INJECT (CLASSTYPE_TI_TEMPLATE (t)));
4436 }
4437 CLASSTYPE_METHOD_VEC (t)
4438 = finish_struct_methods (t, TYPE_METHODS (t), 1);
4439 TYPE_SIZE (t) = integer_zero_node;
4440 }
4441 else
4442 t = finish_struct_1 (t, warn_anon);
4443
4444 TYPE_BEING_DEFINED (t) = 0;
4445
4446 /* Now, figure out which member templates we're specializing. */
4447 for (x = specializations; x != NULL_TREE; x = TREE_CHAIN (x))
4448 {
4449 tree spec_args;
4450 tree fn;
4451 int pending_specialization;
4452
4453 if (uses_template_parms (t))
4454 /* If t is a template class, and x is a specialization, then x
4455 is itself really a template. Due to the vagaries of the
4456 parser, however, we will have a handle to a function
4457 declaration, rather than the template declaration, at this
4458 point. */
4459 {
4460 my_friendly_assert (DECL_TEMPLATE_INFO (x) != NULL_TREE, 0);
4461 my_friendly_assert (DECL_TI_TEMPLATE (x) != NULL_TREE, 0);
4462 fn = DECL_TI_TEMPLATE (x);
4463 }
4464 else
4465 fn = x;
4466
4467 /* We want the specialization arguments, which will be the
4468 innermost ones. */
4469 if (DECL_TI_ARGS (fn) && TREE_CODE (DECL_TI_ARGS (fn)) == TREE_VEC)
4470 spec_args
4471 = TREE_VEC_ELT (DECL_TI_ARGS (fn), 0);
4472 else
4473 spec_args = DECL_TI_ARGS (fn);
4474
4475 pending_specialization
4476 = TI_PENDING_SPECIALIZATION_FLAG (DECL_TEMPLATE_INFO (fn));
4477 check_explicit_specialization
4478 (lookup_template_function (DECL_NAME (fn), spec_args),
4479 fn, 0, 1 | (8 * pending_specialization));
4480 TI_PENDING_SPECIALIZATION_FLAG (DECL_TEMPLATE_INFO (fn)) = 0;
4481
4482 /* Now, the assembler name will be correct for fn, so we
4483 make its RTL. */
4484 DECL_RTL (fn) = 0;
4485 make_decl_rtl (fn, NULL_PTR, 1);
4486
4487 if (x != fn)
4488 {
4489 DECL_RTL (x) = 0;
4490 make_decl_rtl (x, NULL_PTR, 1);
4491 }
4492 }
4493
4494 if (current_class_type)
4495 popclass (0);
4496 else
4497 error ("trying to finish struct, but kicked out due to previous parse errors.");
4498
4499 return t;
4500 }
4501 \f
4502 /* Return non-zero if the effective type of INSTANCE is static.
4503 Used to determine whether the virtual function table is needed
4504 or not.
4505
4506 *NONNULL is set iff INSTANCE can be known to be nonnull, regardless
4507 of our knowledge of its type. */
4508
4509 int
4510 resolves_to_fixed_type_p (instance, nonnull)
4511 tree instance;
4512 int *nonnull;
4513 {
4514 switch (TREE_CODE (instance))
4515 {
4516 case INDIRECT_REF:
4517 /* Check that we are not going through a cast of some sort. */
4518 if (TREE_TYPE (instance)
4519 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (instance, 0))))
4520 instance = TREE_OPERAND (instance, 0);
4521 /* fall through... */
4522 case CALL_EXPR:
4523 /* This is a call to a constructor, hence it's never zero. */
4524 if (TREE_HAS_CONSTRUCTOR (instance))
4525 {
4526 if (nonnull)
4527 *nonnull = 1;
4528 return 1;
4529 }
4530 return 0;
4531
4532 case SAVE_EXPR:
4533 /* This is a call to a constructor, hence it's never zero. */
4534 if (TREE_HAS_CONSTRUCTOR (instance))
4535 {
4536 if (nonnull)
4537 *nonnull = 1;
4538 return 1;
4539 }
4540 return resolves_to_fixed_type_p (TREE_OPERAND (instance, 0), nonnull);
4541
4542 case RTL_EXPR:
4543 return 0;
4544
4545 case PLUS_EXPR:
4546 case MINUS_EXPR:
4547 if (TREE_CODE (TREE_OPERAND (instance, 1)) == INTEGER_CST)
4548 /* Propagate nonnull. */
4549 resolves_to_fixed_type_p (TREE_OPERAND (instance, 0), nonnull);
4550 if (TREE_CODE (TREE_OPERAND (instance, 0)) == ADDR_EXPR)
4551 return resolves_to_fixed_type_p (TREE_OPERAND (instance, 0), nonnull);
4552 return 0;
4553
4554 case NOP_EXPR:
4555 case CONVERT_EXPR:
4556 return resolves_to_fixed_type_p (TREE_OPERAND (instance, 0), nonnull);
4557
4558 case ADDR_EXPR:
4559 if (nonnull)
4560 *nonnull = 1;
4561 return resolves_to_fixed_type_p (TREE_OPERAND (instance, 0), nonnull);
4562
4563 case COMPONENT_REF:
4564 return resolves_to_fixed_type_p (TREE_OPERAND (instance, 1), nonnull);
4565
4566 case VAR_DECL:
4567 case FIELD_DECL:
4568 if (TREE_CODE (TREE_TYPE (instance)) == ARRAY_TYPE
4569 && IS_AGGR_TYPE (TREE_TYPE (TREE_TYPE (instance))))
4570 {
4571 if (nonnull)
4572 *nonnull = 1;
4573 return 1;
4574 }
4575 /* fall through... */
4576 case TARGET_EXPR:
4577 case PARM_DECL:
4578 if (IS_AGGR_TYPE (TREE_TYPE (instance)))
4579 {
4580 if (nonnull)
4581 *nonnull = 1;
4582 return 1;
4583 }
4584 else if (nonnull)
4585 {
4586 if (instance == current_class_ptr
4587 && flag_this_is_variable <= 0)
4588 {
4589 /* Some people still use `this = 0' inside destructors. */
4590 *nonnull = ! DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (current_function_decl));
4591 /* In a constructor, we know our type. */
4592 if (flag_this_is_variable < 0)
4593 return 1;
4594 }
4595 else if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE)
4596 /* Reference variables should be references to objects. */
4597 *nonnull = 1;
4598 }
4599 return 0;
4600
4601 default:
4602 return 0;
4603 }
4604 }
4605 \f
4606 void
4607 init_class_processing ()
4608 {
4609 current_class_depth = 0;
4610 current_class_stacksize = 10;
4611 current_class_base = (tree *)xmalloc(current_class_stacksize * sizeof (tree));
4612 current_class_stack = current_class_base;
4613
4614 current_lang_stacksize = 10;
4615 current_lang_base = (tree *)xmalloc(current_lang_stacksize * sizeof (tree));
4616 current_lang_stack = current_lang_base;
4617
4618 access_default_node = build_int_2 (0, 0);
4619 access_public_node = build_int_2 (1, 0);
4620 access_protected_node = build_int_2 (2, 0);
4621 access_private_node = build_int_2 (3, 0);
4622 access_default_virtual_node = build_int_2 (4, 0);
4623 access_public_virtual_node = build_int_2 (5, 0);
4624 access_protected_virtual_node = build_int_2 (6, 0);
4625 access_private_virtual_node = build_int_2 (7, 0);
4626
4627 /* Keep these values lying around. */
4628 base_layout_decl = build_lang_field_decl (FIELD_DECL, NULL_TREE, error_mark_node);
4629 TREE_TYPE (base_layout_decl) = make_node (RECORD_TYPE);
4630
4631 gcc_obstack_init (&class_obstack);
4632 }
4633
4634 /* Set current scope to NAME. CODE tells us if this is a
4635 STRUCT, UNION, or ENUM environment.
4636
4637 NAME may end up being NULL_TREE if this is an anonymous or
4638 late-bound struct (as in "struct { ... } foo;") */
4639
4640 /* Set global variables CURRENT_CLASS_NAME and CURRENT_CLASS_TYPE to
4641 appropriate values, found by looking up the type definition of
4642 NAME (as a CODE).
4643
4644 If MODIFY is 1, we set IDENTIFIER_CLASS_VALUE's of names
4645 which can be seen locally to the class. They are shadowed by
4646 any subsequent local declaration (including parameter names).
4647
4648 If MODIFY is 2, we set IDENTIFIER_CLASS_VALUE's of names
4649 which have static meaning (i.e., static members, static
4650 member functions, enum declarations, etc).
4651
4652 If MODIFY is 3, we set IDENTIFIER_CLASS_VALUE of names
4653 which can be seen locally to the class (as in 1), but
4654 know that we are doing this for declaration purposes
4655 (i.e. friend foo::bar (int)).
4656
4657 So that we may avoid calls to lookup_name, we cache the _TYPE
4658 nodes of local TYPE_DECLs in the TREE_TYPE field of the name.
4659
4660 For multiple inheritance, we perform a two-pass depth-first search
4661 of the type lattice. The first pass performs a pre-order search,
4662 marking types after the type has had its fields installed in
4663 the appropriate IDENTIFIER_CLASS_VALUE slot. The second pass merely
4664 unmarks the marked types. If a field or member function name
4665 appears in an ambiguous way, the IDENTIFIER_CLASS_VALUE of
4666 that name becomes `error_mark_node'. */
4667
4668 void
4669 pushclass (type, modify)
4670 tree type;
4671 int modify;
4672 {
4673 push_memoized_context (type, modify);
4674
4675 current_class_depth++;
4676 *current_class_stack++ = current_class_name;
4677 *current_class_stack++ = current_class_type;
4678 if (current_class_stack >= current_class_base + current_class_stacksize)
4679 {
4680 current_class_base
4681 = (tree *)xrealloc (current_class_base,
4682 sizeof (tree) * (current_class_stacksize + 10));
4683 current_class_stack = current_class_base + current_class_stacksize;
4684 current_class_stacksize += 10;
4685 }
4686
4687 current_class_name = TYPE_NAME (type);
4688 if (TREE_CODE (current_class_name) == TYPE_DECL)
4689 current_class_name = DECL_NAME (current_class_name);
4690 current_class_type = type;
4691
4692 if (previous_class_type != NULL_TREE
4693 && (type != previous_class_type || TYPE_SIZE (previous_class_type) == NULL_TREE)
4694 && current_class_depth == 1)
4695 {
4696 /* Forcibly remove any old class remnants. */
4697 popclass (-1);
4698 previous_class_type = NULL_TREE;
4699 }
4700
4701 pushlevel_class ();
4702
4703 #if 0
4704 if (CLASSTYPE_TEMPLATE_INFO (type))
4705 overload_template_name (type);
4706 #endif
4707
4708 if (modify)
4709 {
4710 tree tags;
4711 tree this_fndecl = current_function_decl;
4712
4713 if (current_function_decl
4714 && DECL_CONTEXT (current_function_decl)
4715 && TREE_CODE (DECL_CONTEXT (current_function_decl)) == FUNCTION_DECL)
4716 current_function_decl = DECL_CONTEXT (current_function_decl);
4717 else
4718 current_function_decl = NULL_TREE;
4719
4720 if (type != previous_class_type || current_class_depth > 1)
4721 {
4722 #ifdef MI_MATRIX
4723 build_mi_matrix (type);
4724 push_class_decls (type);
4725 free_mi_matrix ();
4726 #else
4727 push_class_decls (type);
4728 #endif
4729 }
4730 else
4731 {
4732 tree item;
4733
4734 /* Hooray, we successfully cached; let's just install the
4735 cached class_shadowed list, and walk through it to get the
4736 IDENTIFIER_TYPE_VALUEs correct. */
4737 set_class_shadows (previous_class_values);
4738 for (item = previous_class_values; item; item = TREE_CHAIN (item))
4739 {
4740 tree id = TREE_PURPOSE (item);
4741 tree decl = IDENTIFIER_CLASS_VALUE (id);
4742
4743 if (TREE_CODE (decl) == TYPE_DECL)
4744 set_identifier_type_value (id, TREE_TYPE (decl));
4745 }
4746 unuse_fields (type);
4747 }
4748
4749 for (tags = CLASSTYPE_TAGS (type); tags; tags = TREE_CHAIN (tags))
4750 {
4751 TREE_NONLOCAL_FLAG (TREE_VALUE (tags)) = 1;
4752 if (! TREE_PURPOSE (tags))
4753 continue;
4754 pushtag (TREE_PURPOSE (tags), TREE_VALUE (tags), 0);
4755 }
4756
4757 current_function_decl = this_fndecl;
4758 }
4759 }
4760
4761 /* Get out of the current class scope. If we were in a class scope
4762 previously, that is the one popped to. The flag MODIFY tells whether
4763 the current scope declarations needs to be modified as a result of
4764 popping to the previous scope. 0 is used for class definitions. */
4765
4766 void
4767 popclass (modify)
4768 int modify;
4769 {
4770 if (modify < 0)
4771 {
4772 /* Back this old class out completely. */
4773 tree tags = CLASSTYPE_TAGS (previous_class_type);
4774 tree t;
4775
4776 /* This code can be seen as a cache miss. When we've cached a
4777 class' scope's bindings and we can't use them, we need to reset
4778 them. This is it! */
4779 for (t = previous_class_values; t; t = TREE_CHAIN (t))
4780 IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (t)) = NULL_TREE;
4781 while (tags)
4782 {
4783 TREE_NONLOCAL_FLAG (TREE_VALUE (tags)) = 0;
4784 tags = TREE_CHAIN (tags);
4785 }
4786 goto ret;
4787 }
4788
4789 if (modify)
4790 {
4791 /* Just remove from this class what didn't make
4792 it into IDENTIFIER_CLASS_VALUE. */
4793 tree tags = CLASSTYPE_TAGS (current_class_type);
4794
4795 while (tags)
4796 {
4797 TREE_NONLOCAL_FLAG (TREE_VALUE (tags)) = 0;
4798 tags = TREE_CHAIN (tags);
4799 }
4800 }
4801
4802 /* Force clearing of IDENTIFIER_CLASS_VALUEs after a class definition,
4803 since not all class decls make it there currently. */
4804 poplevel_class (! modify);
4805
4806 /* Since poplevel_class does the popping of class decls nowadays,
4807 this really only frees the obstack used for these decls.
4808 That's why it had to be moved down here. */
4809 if (modify)
4810 pop_class_decls ();
4811
4812 current_class_depth--;
4813 current_class_type = *--current_class_stack;
4814 current_class_name = *--current_class_stack;
4815
4816 pop_memoized_context (modify);
4817
4818 ret:
4819 ;
4820 }
4821
4822 /* When entering a class scope, all enclosing class scopes' names with
4823 static meaning (static variables, static functions, types and enumerators)
4824 have to be visible. This recursive function calls pushclass for all
4825 enclosing class contexts until global or a local scope is reached.
4826 TYPE is the enclosed class and MODIFY is equivalent with the pushclass
4827 formal of the same name. */
4828
4829 void
4830 push_nested_class (type, modify)
4831 tree type;
4832 int modify;
4833 {
4834 tree context;
4835
4836 if (type == NULL_TREE || type == error_mark_node || ! IS_AGGR_TYPE (type)
4837 || TREE_CODE (type) == TEMPLATE_TYPE_PARM
4838 || TREE_CODE (type) == TEMPLATE_TEMPLATE_PARM)
4839 return;
4840
4841 context = DECL_CONTEXT (TYPE_MAIN_DECL (type));
4842
4843 if (context && TREE_CODE (context) == RECORD_TYPE)
4844 push_nested_class (context, 2);
4845 pushclass (type, modify);
4846 }
4847
4848 /* Undoes a push_nested_class call. MODIFY is passed on to popclass. */
4849
4850 void
4851 pop_nested_class (modify)
4852 int modify;
4853 {
4854 tree context = DECL_CONTEXT (TYPE_MAIN_DECL (current_class_type));
4855
4856 popclass (modify);
4857 if (context && TREE_CODE (context) == RECORD_TYPE)
4858 pop_nested_class (modify);
4859 }
4860
4861 /* Set global variables CURRENT_LANG_NAME to appropriate value
4862 so that behavior of name-mangling machinery is correct. */
4863
4864 void
4865 push_lang_context (name)
4866 tree name;
4867 {
4868 *current_lang_stack++ = current_lang_name;
4869 if (current_lang_stack >= current_lang_base + current_lang_stacksize)
4870 {
4871 current_lang_base
4872 = (tree *)xrealloc (current_lang_base,
4873 sizeof (tree) * (current_lang_stacksize + 10));
4874 current_lang_stack = current_lang_base + current_lang_stacksize;
4875 current_lang_stacksize += 10;
4876 }
4877
4878 if (name == lang_name_cplusplus)
4879 {
4880 strict_prototype = strict_prototypes_lang_cplusplus;
4881 current_lang_name = name;
4882 }
4883 else if (name == lang_name_c)
4884 {
4885 strict_prototype = strict_prototypes_lang_c;
4886 current_lang_name = name;
4887 }
4888 else
4889 error ("language string `\"%s\"' not recognized", IDENTIFIER_POINTER (name));
4890 }
4891
4892 /* Get out of the current language scope. */
4893
4894 void
4895 pop_lang_context ()
4896 {
4897 current_lang_name = *--current_lang_stack;
4898 if (current_lang_name == lang_name_cplusplus)
4899 strict_prototype = strict_prototypes_lang_cplusplus;
4900 else if (current_lang_name == lang_name_c)
4901 strict_prototype = strict_prototypes_lang_c;
4902 }
4903 \f
4904 /* Type instantiation routines. */
4905
4906 /* This function will instantiate the type of the expression given in
4907 RHS to match the type of LHSTYPE. If errors exist, then return
4908 error_mark_node. If only complain is COMPLAIN is set. If we are
4909 not complaining, never modify rhs, as overload resolution wants to
4910 try many possible instantiations, in hopes that at least one will
4911 work.
4912
4913 This function is used in build_modify_expr, convert_arguments,
4914 build_c_cast, and compute_conversion_costs. */
4915
4916 tree
4917 instantiate_type (lhstype, rhs, complain)
4918 tree lhstype, rhs;
4919 int complain;
4920 {
4921 tree explicit_targs = NULL_TREE;
4922
4923 if (TREE_CODE (lhstype) == UNKNOWN_TYPE)
4924 {
4925 if (complain)
4926 error ("not enough type information");
4927 return error_mark_node;
4928 }
4929
4930 if (TREE_TYPE (rhs) != NULL_TREE && ! (type_unknown_p (rhs)))
4931 {
4932 if (comptypes (lhstype, TREE_TYPE (rhs), 1))
4933 return rhs;
4934 if (complain)
4935 cp_error ("argument of type `%T' does not match `%T'",
4936 TREE_TYPE (rhs), lhstype);
4937 return error_mark_node;
4938 }
4939
4940 rhs = copy_node (rhs);
4941
4942 /* This should really only be used when attempting to distinguish
4943 what sort of a pointer to function we have. For now, any
4944 arithmetic operation which is not supported on pointers
4945 is rejected as an error. */
4946
4947 switch (TREE_CODE (rhs))
4948 {
4949 case TYPE_EXPR:
4950 case CONVERT_EXPR:
4951 case SAVE_EXPR:
4952 case CONSTRUCTOR:
4953 case BUFFER_REF:
4954 my_friendly_abort (177);
4955 return error_mark_node;
4956
4957 case INDIRECT_REF:
4958 case ARRAY_REF:
4959 {
4960 tree new_rhs;
4961
4962 new_rhs = instantiate_type (build_pointer_type (lhstype),
4963 TREE_OPERAND (rhs, 0), complain);
4964 if (new_rhs == error_mark_node)
4965 return error_mark_node;
4966
4967 TREE_TYPE (rhs) = lhstype;
4968 TREE_OPERAND (rhs, 0) = new_rhs;
4969 return rhs;
4970 }
4971
4972 case NOP_EXPR:
4973 rhs = copy_node (TREE_OPERAND (rhs, 0));
4974 TREE_TYPE (rhs) = unknown_type_node;
4975 return instantiate_type (lhstype, rhs, complain);
4976
4977 case COMPONENT_REF:
4978 {
4979 tree field = TREE_OPERAND (rhs, 1);
4980 if (TREE_CODE (field) == TREE_LIST)
4981 {
4982 tree function = instantiate_type (lhstype, field, complain);
4983 if (function == error_mark_node)
4984 return error_mark_node;
4985 my_friendly_assert (TREE_CODE (function) == FUNCTION_DECL, 185);
4986 if (DECL_VINDEX (function))
4987 {
4988 tree base = TREE_OPERAND (rhs, 0);
4989 tree base_ptr = build_unary_op (ADDR_EXPR, base, 0);
4990 if (base_ptr == error_mark_node)
4991 return error_mark_node;
4992 base_ptr = convert_pointer_to (DECL_CONTEXT (function), base_ptr);
4993 if (base_ptr == error_mark_node)
4994 return error_mark_node;
4995 return build_vfn_ref (&base_ptr, base, DECL_VINDEX (function));
4996 }
4997 mark_used (function);
4998 return function;
4999 }
5000
5001 my_friendly_assert (TREE_CODE (field) == FIELD_DECL, 178);
5002 my_friendly_assert (!(TREE_CODE (TREE_TYPE (field)) == FUNCTION_TYPE
5003 || TREE_CODE (TREE_TYPE (field)) == METHOD_TYPE),
5004 179);
5005
5006 TREE_TYPE (rhs) = lhstype;
5007 /* First look for an exact match */
5008
5009 while (field && TREE_TYPE (field) != lhstype)
5010 field = DECL_CHAIN (field);
5011 if (field)
5012 {
5013 TREE_OPERAND (rhs, 1) = field;
5014 mark_used (field);
5015 return rhs;
5016 }
5017
5018 /* No exact match found, look for a compatible function. */
5019 field = TREE_OPERAND (rhs, 1);
5020 while (field && ! comptypes (lhstype, TREE_TYPE (field), 0))
5021 field = DECL_CHAIN (field);
5022 if (field)
5023 {
5024 TREE_OPERAND (rhs, 1) = field;
5025 field = DECL_CHAIN (field);
5026 while (field && ! comptypes (lhstype, TREE_TYPE (field), 0))
5027 field = DECL_CHAIN (field);
5028 if (field)
5029 {
5030 if (complain)
5031 error ("ambiguous overload for COMPONENT_REF requested");
5032 return error_mark_node;
5033 }
5034 }
5035 else
5036 {
5037 if (complain)
5038 error ("no appropriate overload exists for COMPONENT_REF");
5039 return error_mark_node;
5040 }
5041 return rhs;
5042 }
5043
5044 case TEMPLATE_ID_EXPR:
5045 {
5046 explicit_targs = TREE_OPERAND (rhs, 1);
5047 rhs = TREE_OPERAND (rhs, 0);
5048 }
5049 /* fall through */
5050
5051 case TREE_LIST:
5052 {
5053 tree elem, baselink, name = NULL_TREE;
5054 int globals = overloaded_globals_p (rhs);
5055
5056 /* First look for an exact match. Search either overloaded
5057 functions or member functions. May have to undo what
5058 `default_conversion' might do to lhstype. */
5059
5060 if (TYPE_PTRMEMFUNC_P (lhstype))
5061 lhstype = TYPE_PTRMEMFUNC_FN_TYPE (lhstype);
5062
5063 if (TREE_CODE (lhstype) == POINTER_TYPE)
5064 {
5065 if (TREE_CODE (TREE_TYPE (lhstype)) == FUNCTION_TYPE
5066 || TREE_CODE (TREE_TYPE (lhstype)) == METHOD_TYPE)
5067 lhstype = TREE_TYPE (lhstype);
5068 else
5069 {
5070 if (complain)
5071 error ("invalid type combination for overload");
5072 return error_mark_node;
5073 }
5074 }
5075
5076 if (TREE_CODE (lhstype) != FUNCTION_TYPE && globals > 0)
5077 {
5078 if (complain)
5079 cp_error ("cannot resolve overloaded function `%D' based on non-function type",
5080 TREE_PURPOSE (rhs));
5081 return error_mark_node;
5082 }
5083
5084 if (globals > 0)
5085 {
5086 elem = get_first_fn (rhs);
5087 /* If there are explicit_targs, only a template function
5088 can match. */
5089 if (explicit_targs == NULL_TREE)
5090 while (elem)
5091 {
5092 if (! comptypes (lhstype, TREE_TYPE (elem), 1))
5093 elem = DECL_CHAIN (elem);
5094 else
5095 {
5096 mark_used (elem);
5097 return elem;
5098 }
5099 }
5100
5101 /* No exact match found, look for a compatible template. */
5102 {
5103 tree save_elem = 0;
5104 for (elem = get_first_fn (rhs); elem; elem = DECL_CHAIN (elem))
5105 if (TREE_CODE (elem) == TEMPLATE_DECL)
5106 {
5107 int n = DECL_NTPARMS (elem);
5108 tree t = make_scratch_vec (n);
5109 int i;
5110 i = type_unification
5111 (DECL_INNERMOST_TEMPLATE_PARMS (elem), t,
5112 TYPE_ARG_TYPES (TREE_TYPE (elem)),
5113 TYPE_ARG_TYPES (lhstype), explicit_targs, 1, 1);
5114 if (i == 0)
5115 {
5116 if (save_elem)
5117 {
5118 cp_error ("ambiguous template instantiation converting to `%#T'", lhstype);
5119 return error_mark_node;
5120 }
5121 save_elem = instantiate_template (elem, t);
5122 /* Check the return type. */
5123 if (! comptypes (TREE_TYPE (lhstype),
5124 TREE_TYPE (TREE_TYPE (save_elem)), 1))
5125 save_elem = 0;
5126 }
5127 }
5128 if (save_elem)
5129 {
5130 mark_used (save_elem);
5131 return save_elem;
5132 }
5133 }
5134
5135 /* If there are explicit_targs, only a template function
5136 can match. */
5137 if (explicit_targs == NULL_TREE)
5138 {
5139 /* No match found, look for a compatible function. */
5140 elem = get_first_fn (rhs);
5141 while (elem && comp_target_types (lhstype,
5142 TREE_TYPE (elem), 1) <= 0)
5143 elem = DECL_CHAIN (elem);
5144 if (elem)
5145 {
5146 tree save_elem = elem;
5147 elem = DECL_CHAIN (elem);
5148 while (elem
5149 && comp_target_types (lhstype,
5150 TREE_TYPE (elem), 0) <= 0)
5151 elem = DECL_CHAIN (elem);
5152 if (elem)
5153 {
5154 if (complain)
5155 {
5156 cp_error
5157 ("cannot resolve overload to target type `%#T'",
5158 lhstype);
5159 cp_error_at (" ambiguity between `%#D'",
5160 save_elem);
5161 cp_error_at (" and `%#D', at least", elem);
5162 }
5163 return error_mark_node;
5164 }
5165 mark_used (save_elem);
5166 return save_elem;
5167 }
5168 }
5169 if (complain)
5170 {
5171 cp_error ("cannot resolve overload to target type `%#T'",
5172 lhstype);
5173 cp_error
5174 (" because no suitable overload of function `%D' exists",
5175 TREE_PURPOSE (rhs));
5176 }
5177 return error_mark_node;
5178 }
5179
5180 if (TREE_NONLOCAL_FLAG (rhs))
5181 {
5182 /* Got to get it as a baselink. */
5183 rhs = lookup_fnfields (TYPE_BINFO (current_class_type),
5184 TREE_PURPOSE (rhs), 0);
5185 }
5186 else
5187 {
5188 my_friendly_assert (TREE_CHAIN (rhs) == NULL_TREE, 181);
5189 if (TREE_CODE (TREE_VALUE (rhs)) == TREE_LIST)
5190 rhs = TREE_VALUE (rhs);
5191 my_friendly_assert (TREE_CODE (TREE_VALUE (rhs)) == FUNCTION_DECL,
5192 182);
5193 }
5194
5195 for (baselink = rhs; baselink;
5196 baselink = next_baselink (baselink))
5197 {
5198 elem = TREE_VALUE (baselink);
5199 while (elem)
5200 if (comptypes (lhstype, TREE_TYPE (elem), 1))
5201 {
5202 mark_used (elem);
5203 return elem;
5204 }
5205 else
5206 elem = DECL_CHAIN (elem);
5207 }
5208
5209 /* No exact match found, look for a compatible method. */
5210 for (baselink = rhs; baselink;
5211 baselink = next_baselink (baselink))
5212 {
5213 elem = TREE_VALUE (baselink);
5214 while (elem && comp_target_types (lhstype,
5215 TREE_TYPE (elem), 1) <= 0)
5216 elem = DECL_CHAIN (elem);
5217 if (elem)
5218 {
5219 tree save_elem = elem;
5220 elem = DECL_CHAIN (elem);
5221 while (elem && comp_target_types (lhstype,
5222 TREE_TYPE (elem), 0) <= 0)
5223 elem = DECL_CHAIN (elem);
5224 if (elem)
5225 {
5226 if (complain)
5227 error ("ambiguous overload for overloaded method requested");
5228 return error_mark_node;
5229 }
5230 mark_used (save_elem);
5231 return save_elem;
5232 }
5233 name = DECL_NAME (TREE_VALUE (rhs));
5234 #if 0
5235 if (TREE_CODE (lhstype) == FUNCTION_TYPE && globals < 0)
5236 {
5237 /* Try to instantiate from non-member functions. */
5238 rhs = lookup_name_nonclass (name);
5239 if (rhs && TREE_CODE (rhs) == TREE_LIST)
5240 {
5241 /* This code seems to be missing a `return'. */
5242 my_friendly_abort (4);
5243 instantiate_type (lhstype, rhs, complain);
5244 }
5245 }
5246 #endif
5247 }
5248 if (complain)
5249 cp_error ("no compatible member functions named `%D'", name);
5250 return error_mark_node;
5251 }
5252
5253 case CALL_EXPR:
5254 /* This is too hard for now. */
5255 my_friendly_abort (183);
5256 return error_mark_node;
5257
5258 case PLUS_EXPR:
5259 case MINUS_EXPR:
5260 case COMPOUND_EXPR:
5261 TREE_OPERAND (rhs, 0)
5262 = instantiate_type (lhstype, TREE_OPERAND (rhs, 0), complain);
5263 if (TREE_OPERAND (rhs, 0) == error_mark_node)
5264 return error_mark_node;
5265 TREE_OPERAND (rhs, 1)
5266 = instantiate_type (lhstype, TREE_OPERAND (rhs, 1), complain);
5267 if (TREE_OPERAND (rhs, 1) == error_mark_node)
5268 return error_mark_node;
5269
5270 TREE_TYPE (rhs) = lhstype;
5271 return rhs;
5272
5273 case MULT_EXPR:
5274 case TRUNC_DIV_EXPR:
5275 case FLOOR_DIV_EXPR:
5276 case CEIL_DIV_EXPR:
5277 case ROUND_DIV_EXPR:
5278 case RDIV_EXPR:
5279 case TRUNC_MOD_EXPR:
5280 case FLOOR_MOD_EXPR:
5281 case CEIL_MOD_EXPR:
5282 case ROUND_MOD_EXPR:
5283 case FIX_ROUND_EXPR:
5284 case FIX_FLOOR_EXPR:
5285 case FIX_CEIL_EXPR:
5286 case FIX_TRUNC_EXPR:
5287 case FLOAT_EXPR:
5288 case NEGATE_EXPR:
5289 case ABS_EXPR:
5290 case MAX_EXPR:
5291 case MIN_EXPR:
5292 case FFS_EXPR:
5293
5294 case BIT_AND_EXPR:
5295 case BIT_IOR_EXPR:
5296 case BIT_XOR_EXPR:
5297 case LSHIFT_EXPR:
5298 case RSHIFT_EXPR:
5299 case LROTATE_EXPR:
5300 case RROTATE_EXPR:
5301
5302 case PREINCREMENT_EXPR:
5303 case PREDECREMENT_EXPR:
5304 case POSTINCREMENT_EXPR:
5305 case POSTDECREMENT_EXPR:
5306 if (complain)
5307 error ("invalid operation on uninstantiated type");
5308 return error_mark_node;
5309
5310 case TRUTH_AND_EXPR:
5311 case TRUTH_OR_EXPR:
5312 case TRUTH_XOR_EXPR:
5313 case LT_EXPR:
5314 case LE_EXPR:
5315 case GT_EXPR:
5316 case GE_EXPR:
5317 case EQ_EXPR:
5318 case NE_EXPR:
5319 case TRUTH_ANDIF_EXPR:
5320 case TRUTH_ORIF_EXPR:
5321 case TRUTH_NOT_EXPR:
5322 if (complain)
5323 error ("not enough type information");
5324 return error_mark_node;
5325
5326 case COND_EXPR:
5327 if (type_unknown_p (TREE_OPERAND (rhs, 0)))
5328 {
5329 if (complain)
5330 error ("not enough type information");
5331 return error_mark_node;
5332 }
5333 TREE_OPERAND (rhs, 1)
5334 = instantiate_type (lhstype, TREE_OPERAND (rhs, 1), complain);
5335 if (TREE_OPERAND (rhs, 1) == error_mark_node)
5336 return error_mark_node;
5337 TREE_OPERAND (rhs, 2)
5338 = instantiate_type (lhstype, TREE_OPERAND (rhs, 2), complain);
5339 if (TREE_OPERAND (rhs, 2) == error_mark_node)
5340 return error_mark_node;
5341
5342 TREE_TYPE (rhs) = lhstype;
5343 return rhs;
5344
5345 case MODIFY_EXPR:
5346 TREE_OPERAND (rhs, 1)
5347 = instantiate_type (lhstype, TREE_OPERAND (rhs, 1), complain);
5348 if (TREE_OPERAND (rhs, 1) == error_mark_node)
5349 return error_mark_node;
5350
5351 TREE_TYPE (rhs) = lhstype;
5352 return rhs;
5353
5354 case ADDR_EXPR:
5355 if (TYPE_PTRMEMFUNC_P (lhstype))
5356 lhstype = TYPE_PTRMEMFUNC_FN_TYPE (lhstype);
5357 else if (TREE_CODE (lhstype) != POINTER_TYPE)
5358 {
5359 if (complain)
5360 error ("type for resolving address of overloaded function must be pointer type");
5361 return error_mark_node;
5362 }
5363 {
5364 tree fn = instantiate_type (TREE_TYPE (lhstype), TREE_OPERAND (rhs, 0), complain);
5365 if (fn == error_mark_node)
5366 return error_mark_node;
5367 mark_addressable (fn);
5368 TREE_TYPE (rhs) = lhstype;
5369 TREE_OPERAND (rhs, 0) = fn;
5370 TREE_CONSTANT (rhs) = staticp (fn);
5371 if (TREE_CODE (lhstype) == POINTER_TYPE
5372 && TREE_CODE (TREE_TYPE (lhstype)) == METHOD_TYPE)
5373 {
5374 build_ptrmemfunc_type (lhstype);
5375 rhs = build_ptrmemfunc (lhstype, rhs, 0);
5376 }
5377 }
5378 return rhs;
5379
5380 case ENTRY_VALUE_EXPR:
5381 my_friendly_abort (184);
5382 return error_mark_node;
5383
5384 case ERROR_MARK:
5385 return error_mark_node;
5386
5387 default:
5388 my_friendly_abort (185);
5389 return error_mark_node;
5390 }
5391 }
5392 \f
5393 /* Return the name of the virtual function pointer field
5394 (as an IDENTIFIER_NODE) for the given TYPE. Note that
5395 this may have to look back through base types to find the
5396 ultimate field name. (For single inheritance, these could
5397 all be the same name. Who knows for multiple inheritance). */
5398
5399 static tree
5400 get_vfield_name (type)
5401 tree type;
5402 {
5403 tree binfo = TYPE_BINFO (type);
5404 char *buf;
5405
5406 while (BINFO_BASETYPES (binfo)
5407 && TYPE_VIRTUAL_P (BINFO_TYPE (BINFO_BASETYPE (binfo, 0)))
5408 && ! TREE_VIA_VIRTUAL (BINFO_BASETYPE (binfo, 0)))
5409 binfo = BINFO_BASETYPE (binfo, 0);
5410
5411 type = BINFO_TYPE (binfo);
5412 buf = (char *) alloca (sizeof (VFIELD_NAME_FORMAT)
5413 + TYPE_NAME_LENGTH (type) + 2);
5414 sprintf (buf, VFIELD_NAME_FORMAT, TYPE_NAME_STRING (type));
5415 return get_identifier (buf);
5416 }
5417
5418 void
5419 print_class_statistics ()
5420 {
5421 #ifdef GATHER_STATISTICS
5422 fprintf (stderr, "convert_harshness = %d\n", n_convert_harshness);
5423 fprintf (stderr, "compute_conversion_costs = %d\n", n_compute_conversion_costs);
5424 fprintf (stderr, "build_method_call = %d (inner = %d)\n",
5425 n_build_method_call, n_inner_fields_searched);
5426 if (n_vtables)
5427 {
5428 fprintf (stderr, "vtables = %d; vtable searches = %d\n",
5429 n_vtables, n_vtable_searches);
5430 fprintf (stderr, "vtable entries = %d; vtable elems = %d\n",
5431 n_vtable_entries, n_vtable_elems);
5432 }
5433 #endif
5434 }
5435
5436 /* Push an obstack which is sufficiently long-lived to hold such class
5437 decls that may be cached in the previous_class_values list. For now, let's
5438 use the permanent obstack, later we may create a dedicated obstack just
5439 for this purpose. The effect is undone by pop_obstacks. */
5440
5441 void
5442 maybe_push_cache_obstack ()
5443 {
5444 push_obstacks_nochange ();
5445 if (current_class_depth == 1)
5446 current_obstack = &permanent_obstack;
5447 }
5448
5449 /* Build a dummy reference to ourselves so Derived::Base (and A::A) works,
5450 according to [class]:
5451 The class-name is also inserted
5452 into the scope of the class itself. For purposes of access checking,
5453 the inserted class name is treated as if it were a public member name. */
5454
5455 tree
5456 build_self_reference ()
5457 {
5458 tree name = constructor_name (current_class_type);
5459 tree value = build_lang_decl (TYPE_DECL, name, current_class_type);
5460 DECL_NONLOCAL (value) = 1;
5461 DECL_CONTEXT (value) = current_class_type;
5462 DECL_CLASS_CONTEXT (value) = current_class_type;
5463 CLASSTYPE_LOCAL_TYPEDECLS (current_class_type) = 1;
5464 DECL_ARTIFICIAL (value) = 1;
5465
5466 pushdecl_class_level (value);
5467 return value;
5468 }
5469
5470 /* Returns 1 if TYPE contains only padding bytes. */
5471
5472 int
5473 is_empty_class (type)
5474 tree type;
5475 {
5476 tree t;
5477
5478 if (! IS_AGGR_TYPE (type) || TYPE_BINFO_BASETYPES (type))
5479 return 0;
5480 t = TYPE_FIELDS (type);
5481 while (t && TREE_CODE (t) != FIELD_DECL)
5482 t = TREE_CHAIN (t);
5483 return (t == NULL_TREE);
5484 }
This page took 0.285439 seconds and 5 git commands to generate.