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