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