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