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