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