1 /* Language-dependent node constructors for parse phase of GNU compiler.
2 Copyright (C) 1987, 88, 92-98, 1999 Free Software Foundation, Inc.
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
5 This file is part of GNU CC.
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)
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.
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, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
31 extern void compiler_error ();
33 static tree get_identifier_list PROTO((tree));
34 static tree bot_manip PROTO((tree));
35 static tree perm_manip PROTO((tree));
36 static tree build_cplus_array_type_1 PROTO((tree, tree));
37 static void list_hash_add PROTO((int, tree));
38 static int list_hash PROTO((tree, tree, tree));
39 static tree list_hash_lookup PROTO((int, int, int, int, tree, tree,
41 static void propagate_binfo_offsets PROTO((tree, tree));
42 static int avoid_overlap PROTO((tree, tree));
43 static int lvalue_p_1 PROTO((tree, int));
45 #define CEIL(x,y) (((x) + (y) - 1) / (y))
47 /* Returns non-zero if REF is an lvalue. If
48 TREAT_CLASS_RVALUES_AS_LVALUES is non-zero, rvalues of class type
49 are considered lvalues. */
52 lvalue_p_1 (ref, treat_class_rvalues_as_lvalues)
54 int treat_class_rvalues_as_lvalues;
56 if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
59 if (ref == current_class_ptr && flag_this_is_variable <= 0)
62 switch (TREE_CODE (ref))
64 /* preincrements and predecrements are valid lvals, provided
65 what they refer to are valid lvals. */
66 case PREINCREMENT_EXPR:
67 case PREDECREMENT_EXPR:
72 case WITH_CLEANUP_EXPR:
75 return lvalue_p_1 (TREE_OPERAND (ref, 0),
76 treat_class_rvalues_as_lvalues);
82 if (TREE_READONLY (ref) && ! TREE_STATIC (ref)
83 && DECL_LANG_SPECIFIC (ref)
84 && DECL_IN_AGGR_P (ref))
90 if (TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
94 /* A currently unresolved scope ref. */
96 my_friendly_abort (103);
98 if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL)
100 return (lvalue_p_1 (TREE_OPERAND (ref, 0),
101 treat_class_rvalues_as_lvalues)
102 && lvalue_p_1 (TREE_OPERAND (ref, 1),
103 treat_class_rvalues_as_lvalues));
107 return (lvalue_p_1 (TREE_OPERAND (ref, 1),
108 treat_class_rvalues_as_lvalues)
109 && lvalue_p_1 (TREE_OPERAND (ref, 2),
110 treat_class_rvalues_as_lvalues));
116 return lvalue_p_1 (TREE_OPERAND (ref, 1),
117 treat_class_rvalues_as_lvalues);
121 return (lvalue_p_1 (TREE_OPERAND (ref, 0),
122 treat_class_rvalues_as_lvalues)
123 && lvalue_p_1 (TREE_OPERAND (ref, 1),
124 treat_class_rvalues_as_lvalues));
127 return treat_class_rvalues_as_lvalues;
130 return (treat_class_rvalues_as_lvalues
131 && IS_AGGR_TYPE (TREE_TYPE (ref)));
134 /* All functions (except non-static-member functions) are
136 return !DECL_NONSTATIC_MEMBER_FUNCTION_P (ref);
145 /* Return nonzero if REF is an lvalue valid for this language.
146 Lvalues can be assigned, unless they have TREE_READONLY, or unless
147 they are FUNCTION_DECLs. Lvalues can have their address taken,
148 unless they have DECL_REGISTER. */
154 return lvalue_p_1 (ref, /*treat_class_rvalues_as_lvalues=*/0);
157 /* This differs from real_lvalue_p in that class rvalues are considered
164 return lvalue_p_1 (ref, /*treat_class_rvalues_as_lvalues=*/1);
167 /* Return nonzero if REF is an lvalue valid for this language;
168 otherwise, print an error message and return zero. */
171 lvalue_or_else (ref, string)
175 int win = lvalue_p (ref);
177 error ("non-lvalue in %s", string);
181 /* INIT is a CALL_EXPR which needs info about its target.
182 TYPE is the type that this initialization should appear to have.
184 Build an encapsulation of the initialization to perform
185 and return it so that it can be processed by language-independent
186 and language-specific expression expanders. */
189 build_cplus_new (type, init)
196 if (TREE_CODE (init) != CALL_EXPR && TREE_CODE (init) != AGGR_INIT_EXPR)
199 slot = build (VAR_DECL, type);
200 DECL_ARTIFICIAL (slot) = 1;
201 layout_decl (slot, 0);
202 rval = build (AGGR_INIT_EXPR, type,
203 TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), slot);
204 TREE_SIDE_EFFECTS (rval) = 1;
205 rval = build (TARGET_EXPR, type, slot, rval, NULL_TREE, NULL_TREE);
206 TREE_SIDE_EFFECTS (rval) = 1;
211 /* Encapsulate the expression INIT in a TARGET_EXPR. */
214 get_target_expr (init)
220 slot = build (VAR_DECL, TREE_TYPE (init));
221 DECL_ARTIFICIAL (slot) = 1;
222 layout_decl (slot, 0);
223 rval = build (TARGET_EXPR, TREE_TYPE (init), slot, init,
224 NULL_TREE, NULL_TREE);
225 TREE_SIDE_EFFECTS (rval) = 1;
230 /* Recursively search EXP for CALL_EXPRs that need cleanups and replace
231 these CALL_EXPRs with tree nodes that will perform the cleanups. */
234 break_out_cleanups (exp)
239 if (TREE_CODE (tmp) == CALL_EXPR
240 && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (tmp)))
241 return build_cplus_new (TREE_TYPE (tmp), tmp);
243 while (TREE_CODE (tmp) == NOP_EXPR
244 || TREE_CODE (tmp) == CONVERT_EXPR
245 || TREE_CODE (tmp) == NON_LVALUE_EXPR)
247 if (TREE_CODE (TREE_OPERAND (tmp, 0)) == CALL_EXPR
248 && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (TREE_OPERAND (tmp, 0))))
250 TREE_OPERAND (tmp, 0)
251 = build_cplus_new (TREE_TYPE (TREE_OPERAND (tmp, 0)),
252 TREE_OPERAND (tmp, 0));
256 tmp = TREE_OPERAND (tmp, 0);
261 /* Recursively perform a preorder search EXP for CALL_EXPRs, making
262 copies where they are found. Returns a deep copy all nodes transitively
263 containing CALL_EXPRs. */
266 break_out_calls (exp)
269 register tree t1, t2 = NULL_TREE;
270 register enum tree_code code;
271 register int changed = 0;
274 if (exp == NULL_TREE)
277 code = TREE_CODE (exp);
279 if (code == CALL_EXPR)
280 return copy_node (exp);
282 /* Don't try and defeat a save_expr, as it should only be done once. */
283 if (code == SAVE_EXPR)
286 switch (TREE_CODE_CLASS (code))
291 case 'c': /* a constant */
292 case 't': /* a type node */
293 case 'x': /* something random, like an identifier or an ERROR_MARK. */
296 case 'd': /* A decl node */
297 #if 0 /* This is bogus. jason 9/21/94 */
299 t1 = break_out_calls (DECL_INITIAL (exp));
300 if (t1 != DECL_INITIAL (exp))
302 exp = copy_node (exp);
303 DECL_INITIAL (exp) = t1;
308 case 'b': /* A block node */
310 /* Don't know how to handle these correctly yet. Must do a
311 break_out_calls on all DECL_INITIAL values for local variables,
312 and also break_out_calls on all sub-blocks and sub-statements. */
317 case 'e': /* an expression */
318 case 'r': /* a reference */
319 case 's': /* an expression with side effects */
320 for (i = tree_code_length[(int) code] - 1; i >= 0; i--)
322 t1 = break_out_calls (TREE_OPERAND (exp, i));
323 if (t1 != TREE_OPERAND (exp, i))
325 exp = copy_node (exp);
326 TREE_OPERAND (exp, i) = t1;
331 case '<': /* a comparison expression */
332 case '2': /* a binary arithmetic expression */
333 t2 = break_out_calls (TREE_OPERAND (exp, 1));
334 if (t2 != TREE_OPERAND (exp, 1))
336 case '1': /* a unary arithmetic expression */
337 t1 = break_out_calls (TREE_OPERAND (exp, 0));
338 if (t1 != TREE_OPERAND (exp, 0))
342 if (tree_code_length[(int) code] == 1)
343 return build1 (code, TREE_TYPE (exp), t1);
345 return build (code, TREE_TYPE (exp), t1, t2);
352 extern struct obstack *current_obstack;
353 extern struct obstack permanent_obstack, class_obstack;
354 extern struct obstack *saveable_obstack;
355 extern struct obstack *expression_obstack;
357 /* Here is how primitive or already-canonicalized types' hash
358 codes are made. MUST BE CONSISTENT WITH tree.c !!! */
359 #define TYPE_HASH(TYPE) ((HOST_WIDE_INT) (TYPE) & 0777777)
361 /* Construct, lay out and return the type of methods belonging to class
362 BASETYPE and whose arguments are described by ARGTYPES and whose values
363 are described by RETTYPE. If each type exists already, reuse it. */
366 build_cplus_method_type (basetype, rettype, argtypes)
367 tree basetype, rettype, argtypes;
373 /* Make a node of the sort we want. */
374 t = make_node (METHOD_TYPE);
376 TYPE_METHOD_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype);
377 TREE_TYPE (t) = rettype;
378 if (IS_SIGNATURE (basetype))
379 ptype = build_signature_pointer_type (basetype);
381 ptype = build_pointer_type (basetype);
383 /* The actual arglist for this function includes a "hidden" argument
384 which is "this". Put it into the list of argument types. */
386 argtypes = tree_cons (NULL_TREE, ptype, argtypes);
387 TYPE_ARG_TYPES (t) = argtypes;
388 TREE_SIDE_EFFECTS (argtypes) = 1; /* Mark first argtype as "artificial". */
390 /* If we already have such a type, use the old one and free this one.
391 Note that it also frees up the above cons cell if found. */
392 hashcode = TYPE_HASH (basetype) + TYPE_HASH (rettype) + type_hash_list (argtypes);
393 t = type_hash_canon (hashcode, t);
395 if (TYPE_SIZE (t) == 0)
402 build_cplus_array_type_1 (elt_type, index_type)
406 register struct obstack *ambient_obstack = current_obstack;
407 register struct obstack *ambient_saveable_obstack = saveable_obstack;
410 /* We need a new one. If both ELT_TYPE and INDEX_TYPE are permanent,
411 make this permanent too. */
412 if (TREE_PERMANENT (elt_type)
413 && (index_type == 0 || TREE_PERMANENT (index_type)))
415 current_obstack = &permanent_obstack;
416 saveable_obstack = &permanent_obstack;
419 if (processing_template_decl
420 || uses_template_parms (elt_type)
421 || uses_template_parms (index_type))
423 t = make_node (ARRAY_TYPE);
424 TREE_TYPE (t) = elt_type;
425 TYPE_DOMAIN (t) = index_type;
428 t = build_array_type (elt_type, index_type);
430 /* Push these needs up so that initialization takes place
432 TYPE_NEEDS_CONSTRUCTING (t) = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (elt_type));
433 TYPE_NEEDS_DESTRUCTOR (t) = TYPE_NEEDS_DESTRUCTOR (TYPE_MAIN_VARIANT (elt_type));
434 current_obstack = ambient_obstack;
435 saveable_obstack = ambient_saveable_obstack;
440 build_cplus_array_type (elt_type, index_type)
445 int type_quals = CP_TYPE_QUALS (elt_type);
447 elt_type = TYPE_MAIN_VARIANT (elt_type);
449 t = build_cplus_array_type_1 (elt_type, index_type);
451 if (type_quals != TYPE_UNQUALIFIED)
452 t = cp_build_qualified_type (t, type_quals);
457 /* Make a variant type in the proper way for C/C++, propagating qualifiers
458 down to the element type of an array. */
461 cp_build_qualified_type (type, type_quals)
465 if (type == error_mark_node)
468 /* A restrict-qualified pointer type must be a pointer (or reference)
469 to object or incomplete type. */
470 if ((type_quals & TYPE_QUAL_RESTRICT)
471 && (!POINTER_TYPE_P (type)
472 || TYPE_PTRMEM_P (type)
473 || TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE))
475 cp_error ("`%T' cannot be `restrict'-qualified", type);
476 type_quals &= ~TYPE_QUAL_RESTRICT;
479 if (TREE_CODE (type) == ARRAY_TYPE)
481 tree real_main_variant = TYPE_MAIN_VARIANT (type);
483 push_obstacks (TYPE_OBSTACK (real_main_variant),
484 TYPE_OBSTACK (real_main_variant));
485 type = build_cplus_array_type_1 (cp_build_qualified_type
486 (TREE_TYPE (type), type_quals),
489 /* TYPE must be on same obstack as REAL_MAIN_VARIANT. If not,
490 make a copy. (TYPE might have come from the hash table and
491 REAL_MAIN_VARIANT might be in some function's obstack.) */
493 if (TYPE_OBSTACK (type) != TYPE_OBSTACK (real_main_variant))
495 type = copy_node (type);
496 TYPE_POINTER_TO (type) = TYPE_REFERENCE_TO (type) = 0;
499 TYPE_MAIN_VARIANT (type) = real_main_variant;
503 return build_qualified_type (type, type_quals);
506 /* Returns the canonical version of TYPE. In other words, if TYPE is
507 a typedef, returns the underlying type. The cv-qualification of
508 the type returned matches the type input; they will always be
512 canonical_type_variant (t)
515 return cp_build_qualified_type (TYPE_MAIN_VARIANT (t), CP_TYPE_QUALS (t));
518 /* Add OFFSET to all base types of T.
520 OFFSET, which is a type offset, is number of bytes.
522 Note that we don't have to worry about having two paths to the
523 same base type, since this type owns its association list. */
526 propagate_binfo_offsets (binfo, offset)
530 tree binfos = BINFO_BASETYPES (binfo);
531 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
533 for (i = 0; i < n_baselinks; /* note increment is done in the loop. */)
535 tree base_binfo = TREE_VEC_ELT (binfos, i);
537 if (TREE_VIA_VIRTUAL (base_binfo))
542 tree delta = NULL_TREE;
544 for (j = i+1; j < n_baselinks; j++)
545 if (! TREE_VIA_VIRTUAL (TREE_VEC_ELT (binfos, j)))
547 /* The next basetype offset must take into account the space
548 between the classes, not just the size of each class. */
549 delta = size_binop (MINUS_EXPR,
550 BINFO_OFFSET (TREE_VEC_ELT (binfos, j)),
551 BINFO_OFFSET (base_binfo));
556 if (BINFO_OFFSET_ZEROP (base_binfo))
557 BINFO_OFFSET (base_binfo) = offset;
559 BINFO_OFFSET (base_binfo)
560 = size_binop (PLUS_EXPR, BINFO_OFFSET (base_binfo), offset);
562 BINFO_OFFSET (base_binfo) = offset;
565 propagate_binfo_offsets (base_binfo, offset);
567 /* Go to our next class that counts for offset propagation. */
570 offset = size_binop (PLUS_EXPR, offset, delta);
575 /* Makes new binfos for the indirect bases under BINFO, and updates
576 BINFO_OFFSET for them and their bases. */
579 unshare_base_binfos (binfo)
582 tree binfos = BINFO_BASETYPES (binfo);
586 if (binfos == NULL_TREE)
589 /* Now unshare the structure beneath BINFO. */
590 for (j = TREE_VEC_LENGTH (binfos)-1;
593 tree base_binfo = TREE_VEC_ELT (binfos, j);
594 new_binfo = TREE_VEC_ELT (binfos, j)
595 = make_binfo (BINFO_OFFSET (base_binfo),
597 BINFO_VTABLE (base_binfo),
598 BINFO_VIRTUALS (base_binfo));
599 TREE_VIA_PUBLIC (new_binfo) = TREE_VIA_PUBLIC (base_binfo);
600 TREE_VIA_PROTECTED (new_binfo) = TREE_VIA_PROTECTED (base_binfo);
601 TREE_VIA_VIRTUAL (new_binfo) = TREE_VIA_VIRTUAL (base_binfo);
602 BINFO_INHERITANCE_CHAIN (new_binfo) = binfo;
603 unshare_base_binfos (new_binfo);
607 /* Finish the work of layout_record, now taking virtual bases into account.
608 Also compute the actual offsets that our base classes will have.
609 This must be performed after the fields are laid out, since virtual
610 baseclasses must lay down at the end of the record.
612 Returns the maximum number of virtual functions any of the
613 baseclasses provide. */
616 layout_basetypes (rec, max)
620 tree binfos = TYPE_BINFO_BASETYPES (rec);
621 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
625 unsigned int record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
626 unsigned int desired_align;
628 /* Record size so far is CONST_SIZE bits, where CONST_SIZE is an integer. */
629 register unsigned int const_size = 0;
630 unsigned int nonvirtual_const_size;
632 #ifdef STRUCTURE_SIZE_BOUNDARY
633 /* Packed structures don't need to have minimum size. */
634 if (! TYPE_PACKED (rec))
635 record_align = MAX (record_align, STRUCTURE_SIZE_BOUNDARY);
638 /* Get all the virtual base types that this type uses. The
639 TREE_VALUE slot holds the virtual baseclass type. Note that
640 get_vbase_types makes copies of the virtual base BINFOs, so that
641 the vbase_types are unshared. */
642 CLASSTYPE_VBASECLASSES (rec) = vbase_types = get_vbase_types (rec);
644 my_friendly_assert (TREE_CODE (TYPE_SIZE (rec)) == INTEGER_CST, 19970302);
645 const_size = TREE_INT_CST_LOW (TYPE_SIZE (rec));
647 nonvirtual_const_size = const_size;
651 tree basetype = BINFO_TYPE (vbase_types);
654 desired_align = TYPE_ALIGN (basetype);
655 record_align = MAX (record_align, desired_align);
658 offset = integer_zero_node;
661 /* Give each virtual base type the alignment it wants. */
662 const_size = CEIL (const_size, desired_align) * desired_align;
663 offset = size_int (CEIL (const_size, BITS_PER_UNIT));
666 if (CLASSTYPE_VSIZE (basetype) > max)
667 max = CLASSTYPE_VSIZE (basetype);
668 BINFO_OFFSET (vbase_types) = offset;
670 /* Every virtual baseclass takes a least a UNIT, so that we can
671 take it's address and get something different for each base. */
672 const_size += MAX (BITS_PER_UNIT,
673 TREE_INT_CST_LOW (CLASSTYPE_SIZE (basetype)));
675 vbase_types = TREE_CHAIN (vbase_types);
680 /* Because a virtual base might take a single byte above,
681 we have to re-adjust the total size to make sure it is
682 a multiple of the alignment. */
683 /* Give the whole object the alignment it wants. */
684 const_size = CEIL (const_size, record_align) * record_align;
687 /* Set the alignment in the complete type. We don't set CLASSTYPE_ALIGN
688 here, as that is for this class, without any virtual base classes. */
689 TYPE_ALIGN (rec) = record_align;
690 if (const_size != nonvirtual_const_size)
692 TYPE_SIZE (rec) = size_int (const_size);
693 TYPE_SIZE_UNIT (rec) = size_binop (FLOOR_DIV_EXPR, TYPE_SIZE (rec),
694 size_int (BITS_PER_UNIT));
697 /* Now propagate offset information throughout the lattice. */
698 for (i = 0; i < n_baseclasses; i++)
700 register tree base_binfo = TREE_VEC_ELT (binfos, i);
701 register tree basetype = BINFO_TYPE (base_binfo);
702 tree field = TYPE_FIELDS (rec);
704 if (TREE_VIA_VIRTUAL (base_binfo))
707 my_friendly_assert (TREE_TYPE (field) == basetype, 23897);
709 if (get_base_distance (basetype, rec, 0, (tree*)0) == -2)
710 cp_warning ("direct base `%T' inaccessible in `%T' due to ambiguity",
713 BINFO_OFFSET (base_binfo)
714 = size_int (CEIL (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)),
716 propagate_binfo_offsets (base_binfo, BINFO_OFFSET (base_binfo));
717 TYPE_FIELDS (rec) = TREE_CHAIN (field);
720 for (vbase_types = CLASSTYPE_VBASECLASSES (rec); vbase_types;
721 vbase_types = TREE_CHAIN (vbase_types))
723 BINFO_INHERITANCE_CHAIN (vbase_types) = TYPE_BINFO (rec);
724 unshare_base_binfos (vbase_types);
725 propagate_binfo_offsets (vbase_types, BINFO_OFFSET (vbase_types));
729 tree basetype = BINFO_TYPE (vbase_types);
730 if (get_base_distance (basetype, rec, 0, (tree*)0) == -2)
731 cp_warning ("virtual base `%T' inaccessible in `%T' due to ambiguity",
739 /* If the empty base field in DECL overlaps with a base of the same type in
740 NEWDECL, which is either another base field or the first data field of
741 the class, pad the base just before NEWDECL and return 1. Otherwise,
745 avoid_overlap (decl, newdecl)
750 if (newdecl == NULL_TREE
751 || ! types_overlap_p (TREE_TYPE (decl), TREE_TYPE (newdecl)))
754 for (field = decl; TREE_CHAIN (field) && TREE_CHAIN (field) != newdecl;
755 field = TREE_CHAIN (field))
758 DECL_SIZE (field) = integer_one_node;
763 /* Returns a list of fields to stand in for the base class subobjects
764 of REC. These fields are later removed by layout_basetypes. */
767 build_base_fields (rec)
770 /* Chain to hold all the new FIELD_DECLs which stand in for base class
772 tree base_decls = NULL_TREE;
773 tree binfos = TYPE_BINFO_BASETYPES (rec);
774 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
776 int i, saw_empty = 0;
777 unsigned int base_align = 0;
779 for (i = 0; i < n_baseclasses; ++i)
781 register tree base_binfo = TREE_VEC_ELT (binfos, i);
782 register tree basetype = BINFO_TYPE (base_binfo);
784 if (TYPE_SIZE (basetype) == 0)
785 /* This error is now reported in xref_tag, thus giving better
786 location information. */
789 if (TREE_VIA_VIRTUAL (base_binfo))
792 decl = build_lang_field_decl (FIELD_DECL, NULL_TREE, basetype);
793 DECL_ARTIFICIAL (decl) = 1;
794 DECL_FIELD_CONTEXT (decl) = DECL_CLASS_CONTEXT (decl) = rec;
795 DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
796 DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
797 TREE_CHAIN (decl) = base_decls;
802 /* Brain damage for backwards compatibility. For no good reason,
803 the old layout_basetypes made every base at least as large as
804 the alignment for the bases up to that point, gratuitously
805 wasting space. So we do the same thing here. */
806 base_align = MAX (base_align, DECL_ALIGN (decl));
808 = size_int (MAX (TREE_INT_CST_LOW (DECL_SIZE (decl)),
811 else if (DECL_SIZE (decl) == integer_zero_node)
815 /* Reverse the list of fields so we allocate the bases in the proper
817 base_decls = nreverse (base_decls);
819 /* In the presence of empty base classes, we run the risk of allocating
820 two objects of the same class on top of one another. Avoid that. */
821 if (flag_new_abi && saw_empty)
822 for (decl = base_decls; decl; decl = TREE_CHAIN (decl))
824 if (DECL_SIZE (decl) == integer_zero_node)
826 /* First step through the following bases until we find
827 an overlap or a non-empty base. */
828 for (nextdecl = TREE_CHAIN (decl); nextdecl;
829 nextdecl = TREE_CHAIN (nextdecl))
831 if (avoid_overlap (decl, nextdecl)
832 || DECL_SIZE (nextdecl) != integer_zero_node)
836 /* If we're still looking, also check against the first
838 for (nextdecl = TYPE_FIELDS (rec);
839 nextdecl && TREE_CODE (nextdecl) != FIELD_DECL;
840 nextdecl = TREE_CHAIN (nextdecl))
842 avoid_overlap (decl, nextdecl);
850 /* Returns list of virtual base class pointers in a FIELD_DECL chain. */
853 build_vbase_pointer_fields (rec)
856 /* Chain to hold all the new FIELD_DECLs which point at virtual
858 tree vbase_decls = NULL_TREE;
859 tree binfos = TYPE_BINFO_BASETYPES (rec);
860 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
864 /* Handle basetypes almost like fields, but record their
865 offsets differently. */
867 for (i = 0; i < n_baseclasses; i++)
869 register tree base_binfo = TREE_VEC_ELT (binfos, i);
870 register tree basetype = BINFO_TYPE (base_binfo);
872 if (TYPE_SIZE (basetype) == 0)
873 /* This error is now reported in xref_tag, thus giving better
874 location information. */
877 /* All basetypes are recorded in the association list of the
880 if (TREE_VIA_VIRTUAL (base_binfo))
885 /* The offset for a virtual base class is only used in computing
886 virtual function tables and for initializing virtual base
887 pointers. It is built once `get_vbase_types' is called. */
889 /* If this basetype can come from another vbase pointer
890 without an additional indirection, we will share
891 that pointer. If an indirection is involved, we
892 make our own pointer. */
893 for (j = 0; j < n_baseclasses; j++)
895 tree other_base_binfo = TREE_VEC_ELT (binfos, j);
896 if (! TREE_VIA_VIRTUAL (other_base_binfo)
897 && binfo_member (basetype,
898 CLASSTYPE_VBASECLASSES (BINFO_TYPE
903 FORMAT_VBASE_NAME (name, basetype);
904 decl = build_lang_field_decl (FIELD_DECL, get_identifier (name),
905 build_pointer_type (basetype));
906 /* If you change any of the below, take a look at all the
907 other VFIELD_BASEs and VTABLE_BASEs in the code, and change
909 DECL_ASSEMBLER_NAME (decl) = get_identifier (VTABLE_BASE);
910 DECL_VIRTUAL_P (decl) = 1;
911 DECL_ARTIFICIAL (decl) = 1;
912 DECL_FIELD_CONTEXT (decl) = rec;
913 DECL_CLASS_CONTEXT (decl) = rec;
914 DECL_FCONTEXT (decl) = basetype;
915 DECL_SAVED_INSNS (decl) = NULL_RTX;
916 DECL_FIELD_SIZE (decl) = 0;
917 DECL_ALIGN (decl) = TYPE_ALIGN (ptr_type_node);
918 TREE_CHAIN (decl) = vbase_decls;
919 BINFO_VPTR_FIELD (base_binfo) = decl;
923 /* The space this decl occupies has already been accounted for. */
931 /* Hashing of lists so that we don't make duplicates.
932 The entry point is `list_hash_canon'. */
934 /* Each hash table slot is a bucket containing a chain
935 of these structures. */
939 struct list_hash *next; /* Next structure in the bucket. */
940 int hashcode; /* Hash code of this list. */
941 tree list; /* The list recorded here. */
944 /* Now here is the hash table. When recording a list, it is added
945 to the slot whose index is the hash code mod the table size.
946 Note that the hash table is used for several kinds of lists.
947 While all these live in the same table, they are completely independent,
948 and the hash code is computed differently for each of these. */
950 #define TYPE_HASH_SIZE 59
951 static struct list_hash *list_hash_table[TYPE_HASH_SIZE];
953 /* Compute a hash code for a list (chain of TREE_LIST nodes
954 with goodies in the TREE_PURPOSE, TREE_VALUE, and bits of the
955 TREE_COMMON slots), by adding the hash codes of the individual entries. */
958 list_hash (purpose, value, chain)
959 tree purpose, value, chain;
961 register int hashcode = 0;
964 hashcode += TYPE_HASH (chain);
967 hashcode += TYPE_HASH (value);
971 hashcode += TYPE_HASH (purpose);
977 /* Look in the type hash table for a type isomorphic to TYPE.
978 If one is found, return it. Otherwise return 0. */
981 list_hash_lookup (hashcode, via_public, via_protected, via_virtual,
982 purpose, value, chain)
983 int hashcode, via_public, via_virtual, via_protected;
984 tree purpose, value, chain;
986 register struct list_hash *h;
988 for (h = list_hash_table[hashcode % TYPE_HASH_SIZE]; h; h = h->next)
989 if (h->hashcode == hashcode
990 && TREE_VIA_VIRTUAL (h->list) == via_virtual
991 && TREE_VIA_PUBLIC (h->list) == via_public
992 && TREE_VIA_PROTECTED (h->list) == via_protected
993 && TREE_PURPOSE (h->list) == purpose
994 && TREE_VALUE (h->list) == value
995 && TREE_CHAIN (h->list) == chain)
1000 /* Add an entry to the list-hash-table
1001 for a list TYPE whose hash code is HASHCODE. */
1004 list_hash_add (hashcode, list)
1008 register struct list_hash *h;
1010 h = (struct list_hash *) obstack_alloc (&class_obstack, sizeof (struct list_hash));
1011 h->hashcode = hashcode;
1013 h->next = list_hash_table[hashcode % TYPE_HASH_SIZE];
1014 list_hash_table[hashcode % TYPE_HASH_SIZE] = h;
1017 /* Given TYPE, and HASHCODE its hash code, return the canonical
1018 object for an identical list if one already exists.
1019 Otherwise, return TYPE, and record it as the canonical object
1020 if it is a permanent object.
1022 To use this function, first create a list of the sort you want.
1023 Then compute its hash code from the fields of the list that
1024 make it different from other similar lists.
1025 Then call this function and use the value.
1026 This function frees the list you pass in if it is a duplicate. */
1028 /* Set to 1 to debug without canonicalization. Never set by program. */
1030 static int debug_no_list_hash = 0;
1033 hash_tree_cons (via_public, via_virtual, via_protected, purpose, value, chain)
1034 int via_public, via_virtual, via_protected;
1035 tree purpose, value, chain;
1037 struct obstack *ambient_obstack = current_obstack;
1041 if (! debug_no_list_hash)
1043 hashcode = list_hash (purpose, value, chain);
1044 t = list_hash_lookup (hashcode, via_public, via_protected, via_virtual,
1045 purpose, value, chain);
1050 current_obstack = &class_obstack;
1052 t = tree_cons (purpose, value, chain);
1053 TREE_VIA_PUBLIC (t) = via_public;
1054 TREE_VIA_PROTECTED (t) = via_protected;
1055 TREE_VIA_VIRTUAL (t) = via_virtual;
1057 /* If this is a new list, record it for later reuse. */
1058 if (! debug_no_list_hash)
1059 list_hash_add (hashcode, t);
1061 current_obstack = ambient_obstack;
1065 /* Constructor for hashed lists. */
1068 hash_tree_chain (value, chain)
1071 return hash_tree_cons (0, 0, 0, NULL_TREE, value, chain);
1074 /* Similar, but used for concatenating two lists. */
1077 hash_chainon (list1, list2)
1084 if (TREE_CHAIN (list1) == NULL_TREE)
1085 return hash_tree_chain (TREE_VALUE (list1), list2);
1086 return hash_tree_chain (TREE_VALUE (list1),
1087 hash_chainon (TREE_CHAIN (list1), list2));
1091 get_identifier_list (value)
1094 tree list = IDENTIFIER_AS_LIST (value);
1095 if (list != NULL_TREE
1096 && (TREE_CODE (list) != TREE_LIST
1097 || TREE_VALUE (list) != value))
1099 else if (IDENTIFIER_HAS_TYPE_VALUE (value)
1100 && TREE_CODE (IDENTIFIER_TYPE_VALUE (value)) == RECORD_TYPE
1101 && IDENTIFIER_TYPE_VALUE (value)
1102 == TYPE_MAIN_VARIANT (IDENTIFIER_TYPE_VALUE (value)))
1104 tree type = IDENTIFIER_TYPE_VALUE (value);
1106 if (TYPE_PTRMEMFUNC_P (type))
1108 else if (type == current_class_type)
1109 /* Don't mess up the constructor name. */
1110 list = tree_cons (NULL_TREE, value, NULL_TREE);
1113 if (! CLASSTYPE_ID_AS_LIST (type))
1114 CLASSTYPE_ID_AS_LIST (type)
1115 = perm_tree_cons (NULL_TREE, TYPE_IDENTIFIER (type), NULL_TREE);
1116 list = CLASSTYPE_ID_AS_LIST (type);
1123 get_decl_list (value)
1126 tree list = NULL_TREE;
1128 if (TREE_CODE (value) == IDENTIFIER_NODE)
1129 list = get_identifier_list (value);
1130 else if (TREE_CODE (value) == RECORD_TYPE
1131 && TYPE_LANG_SPECIFIC (value)
1132 && value == TYPE_MAIN_VARIANT (value))
1133 list = CLASSTYPE_AS_LIST (value);
1135 if (list != NULL_TREE)
1137 my_friendly_assert (TREE_CHAIN (list) == NULL_TREE, 301);
1141 return build_decl_list (NULL_TREE, value);
1144 /* Build an association between TYPE and some parameters:
1146 OFFSET is the offset added to `this' to convert it to a pointer
1149 BINFO is the base binfo to use, if we are deriving from one. This
1150 is necessary, as we want specialized parent binfos from base
1151 classes, so that the VTABLE_NAMEs of bases are for the most derived
1152 type, instead of the simple type.
1154 VTABLE is the virtual function table with which to initialize
1155 sub-objects of type TYPE.
1157 VIRTUALS are the virtual functions sitting in VTABLE. */
1160 make_binfo (offset, binfo, vtable, virtuals)
1162 tree vtable, virtuals;
1164 tree new_binfo = make_tree_vec (7);
1167 if (TREE_CODE (binfo) == TREE_VEC)
1168 type = BINFO_TYPE (binfo);
1172 binfo = CLASS_TYPE_P (type) ? TYPE_BINFO (binfo) : NULL_TREE;
1175 TREE_TYPE (new_binfo) = TYPE_MAIN_VARIANT (type);
1176 BINFO_OFFSET (new_binfo) = offset;
1177 BINFO_VTABLE (new_binfo) = vtable;
1178 BINFO_VIRTUALS (new_binfo) = virtuals;
1179 BINFO_VPTR_FIELD (new_binfo) = NULL_TREE;
1181 if (binfo && BINFO_BASETYPES (binfo) != NULL_TREE)
1182 BINFO_BASETYPES (new_binfo) = copy_node (BINFO_BASETYPES (binfo));
1186 /* Return the binfo value for ELEM in TYPE. */
1189 binfo_value (elem, type)
1193 if (get_base_distance (elem, type, 0, (tree *)0) == -2)
1194 compiler_error ("base class `%s' ambiguous in binfo_value",
1195 TYPE_NAME_STRING (elem));
1197 return TYPE_BINFO (type);
1198 if (TREE_CODE (elem) == RECORD_TYPE && TYPE_BINFO (elem) == type)
1200 return get_binfo (elem, type, 0);
1203 /* Return a reversed copy of the BINFO-chain given by PATH. (If the
1204 BINFO_INHERITANCE_CHAIN points from base classes to derived
1205 classes, it will instead point from derived classes to base
1206 classes.) Returns the first node in the reversed chain. */
1212 register tree prev = NULL_TREE, cur;
1213 push_expression_obstack ();
1214 for (cur = path; cur; cur = BINFO_INHERITANCE_CHAIN (cur))
1216 tree r = copy_node (cur);
1217 BINFO_INHERITANCE_CHAIN (r) = prev;
1228 unsigned HOST_WIDE_INT n;
1231 fprintf (stderr, "type \"%s\"; offset = %ld\n",
1232 TYPE_NAME_STRING (BINFO_TYPE (elem)),
1233 (long) TREE_INT_CST_LOW (BINFO_OFFSET (elem)));
1234 fprintf (stderr, "vtable type:\n");
1235 debug_tree (BINFO_TYPE (elem));
1236 if (BINFO_VTABLE (elem))
1237 fprintf (stderr, "vtable decl \"%s\"\n", IDENTIFIER_POINTER (DECL_NAME (BINFO_VTABLE (elem))));
1239 fprintf (stderr, "no vtable decl yet\n");
1240 fprintf (stderr, "virtuals:\n");
1241 virtuals = BINFO_VIRTUALS (elem);
1243 n = skip_rtti_stuff (&virtuals);
1247 tree fndecl = TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals)), 0);
1248 fprintf (stderr, "%s [%ld =? %ld]\n",
1249 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl)),
1250 (long) n, (long) TREE_INT_CST_LOW (DECL_VINDEX (fndecl)));
1252 virtuals = TREE_CHAIN (virtuals);
1256 /* Initialize an CPLUS_BINDING node that does not live on an obstack. */
1260 struct tree_binding* node;
1262 static struct tree_binding* source;
1265 extern struct obstack permanent_obstack;
1266 push_obstacks (&permanent_obstack, &permanent_obstack);
1267 source = (struct tree_binding*)make_node (CPLUS_BINDING);
1271 TREE_PERMANENT ((tree)node) = 0;
1280 if (TREE_CODE (t) == FUNCTION_DECL)
1282 else if (TREE_CODE (t) == OVERLOAD)
1284 for (i=0; t; t = OVL_CHAIN (t))
1289 my_friendly_abort (359);
1294 is_overloaded_fn (x)
1297 /* XXX A baselink is also considered an overloaded function.
1298 As is a placeholder from push_class_decls.
1299 As is an expression like X::f. */
1300 if (TREE_CODE (x) == TREE_LIST)
1302 if (TREE_PURPOSE (x) == error_mark_node)
1305 my_friendly_assert (TREE_CODE (x) == TREE_LIST, 981121);
1307 my_friendly_assert (TREE_CODE (TREE_PURPOSE (x)) == TREE_VEC
1308 || TREE_CODE (TREE_PURPOSE (x)) == IDENTIFIER_NODE,
1312 return (TREE_CODE (x) == FUNCTION_DECL
1313 || TREE_CODE (x) == TEMPLATE_ID_EXPR
1314 || DECL_FUNCTION_TEMPLATE_P (x)
1315 || TREE_CODE (x) == OVERLOAD);
1319 really_overloaded_fn (x)
1322 /* A baselink is also considered an overloaded function.
1323 This might also be an ambiguous class member. */
1324 if (TREE_CODE (x) == TREE_LIST)
1326 return (TREE_CODE (x) == OVERLOAD
1327 && (TREE_CHAIN (x) != NULL_TREE
1328 || DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (x))));
1335 my_friendly_assert (is_overloaded_fn (from), 9);
1336 /* A baselink is also considered an overloaded function. */
1337 if (TREE_CODE (from) == TREE_LIST)
1338 from = TREE_VALUE (from);
1339 return OVL_CURRENT (from);
1342 /* Returns nonzero if T is a ->* or .* expression that refers to a
1349 return (TREE_CODE (t) == OFFSET_REF
1350 && TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (t, 1))));
1353 /* Return a new OVL node, concatenating it with the old one. */
1356 ovl_cons (decl, chain)
1360 tree result = make_node (OVERLOAD);
1361 TREE_TYPE (result) = unknown_type_node;
1362 OVL_FUNCTION (result) = decl;
1363 TREE_CHAIN (result) = chain;
1368 /* Same as ovl_cons, but on the scratch_obstack. */
1371 scratch_ovl_cons (value, chain)
1375 register struct obstack *ambient_obstack = current_obstack;
1376 extern struct obstack *expression_obstack;
1377 current_obstack = expression_obstack;
1378 node = ovl_cons (value, chain);
1379 current_obstack = ambient_obstack;
1383 /* Build a new overloaded function. If this is the first one,
1384 just return it; otherwise, ovl_cons the _DECLs */
1387 build_overload (decl, chain)
1391 if (! chain && TREE_CODE (decl) != TEMPLATE_DECL)
1393 if (chain && TREE_CODE (chain) != OVERLOAD)
1394 chain = ovl_cons (chain, NULL_TREE);
1395 return ovl_cons (decl, chain);
1398 /* True if fn is in ovl. */
1401 ovl_member (fn, ovl)
1405 if (ovl == NULL_TREE)
1407 if (TREE_CODE (ovl) != OVERLOAD)
1408 return decls_match (ovl, fn);
1409 for (; ovl; ovl = OVL_CHAIN (ovl))
1410 if (decls_match (OVL_FUNCTION (ovl), fn))
1416 is_aggr_type_2 (t1, t2)
1419 if (TREE_CODE (t1) != TREE_CODE (t2))
1421 return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
1424 #define PRINT_RING_SIZE 4
1427 lang_printable_name (decl, v)
1431 static tree decl_ring[PRINT_RING_SIZE];
1432 static char *print_ring[PRINT_RING_SIZE];
1433 static int ring_counter;
1436 /* Only cache functions. */
1438 || TREE_CODE (decl) != FUNCTION_DECL
1439 || DECL_LANG_SPECIFIC (decl) == 0)
1440 return lang_decl_name (decl, v);
1442 /* See if this print name is lying around. */
1443 for (i = 0; i < PRINT_RING_SIZE; i++)
1444 if (decl_ring[i] == decl)
1445 /* yes, so return it. */
1446 return print_ring[i];
1448 if (++ring_counter == PRINT_RING_SIZE)
1451 if (current_function_decl != NULL_TREE)
1453 if (decl_ring[ring_counter] == current_function_decl)
1455 if (ring_counter == PRINT_RING_SIZE)
1457 if (decl_ring[ring_counter] == current_function_decl)
1458 my_friendly_abort (106);
1461 if (print_ring[ring_counter])
1462 free (print_ring[ring_counter]);
1464 print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v));
1465 decl_ring[ring_counter] = decl;
1466 return print_ring[ring_counter];
1469 /* Build the FUNCTION_TYPE or METHOD_TYPE which may throw exceptions
1470 listed in RAISES. */
1473 build_exception_variant (type, raises)
1477 tree v = TYPE_MAIN_VARIANT (type);
1478 int type_quals = TYPE_QUALS (type);
1480 for (; v; v = TYPE_NEXT_VARIANT (v))
1485 if (TYPE_QUALS (v) != type_quals)
1488 for (t = TYPE_RAISES_EXCEPTIONS (v), u = raises;
1489 t != NULL_TREE && u != NULL_TREE;
1490 t = TREE_CHAIN (t), u = TREE_CHAIN (v))
1491 if (((TREE_VALUE (t) != NULL_TREE)
1492 != (TREE_VALUE (u) != NULL_TREE))
1493 || !same_type_p (TREE_VALUE (t), TREE_VALUE (u)))
1497 /* There's a memory leak here; RAISES is not freed. */
1501 /* Need to build a new variant. */
1502 v = build_type_copy (type);
1504 if (raises && ! TREE_PERMANENT (raises))
1506 push_obstacks_nochange ();
1507 end_temporary_allocation ();
1508 raises = copy_list (raises);
1512 TYPE_RAISES_EXCEPTIONS (v) = raises;
1516 /* Given a TEMPLATE_TEMPLATE_PARM node T, create a new one together with its
1517 lang_specific field and its corresponding TEMPLATE_DECL node */
1520 copy_template_template_parm (t)
1523 tree template = TYPE_NAME (t);
1526 /* Make sure these end up on the permanent_obstack. */
1527 push_obstacks_nochange ();
1528 end_temporary_allocation ();
1530 t2 = make_lang_type (TEMPLATE_TEMPLATE_PARM);
1531 template = copy_node (template);
1532 copy_lang_decl (template);
1536 TREE_TYPE (template) = t2;
1537 TYPE_NAME (t2) = template;
1538 TYPE_STUB_DECL (t2) = template;
1540 /* No need to copy these */
1541 TYPE_FIELDS (t2) = TYPE_FIELDS (t);
1542 TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t2)
1543 = TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t);
1547 /* Walk through the tree structure T, applying func. If func ever returns
1548 non-null, return that value. */
1551 search_tree (t, func)
1553 tree (*func) PROTO((tree));
1555 #define TRY(ARG) if (tmp=search_tree (ARG, func), tmp != NULL_TREE) return tmp
1562 if (tmp = func (t), tmp != NULL_TREE)
1565 switch (TREE_CODE (t))
1570 case IDENTIFIER_NODE:
1577 case NAMESPACE_DECL:
1581 TRY (TREE_TYPE (t));
1585 TRY (TREE_TYPE (t));
1586 TRY (TREE_CHAIN (t));
1590 TRY (TREE_PURPOSE (t));
1591 TRY (TREE_VALUE (t));
1592 TRY (TREE_CHAIN (t));
1596 TRY (OVL_FUNCTION (t));
1597 TRY (OVL_CHAIN (t));
1602 int len = TREE_VEC_LENGTH (t);
1606 TRY (TREE_VEC_ELT (t, len));
1617 TRY (TREE_TYPE (t));
1622 case AGGR_INIT_EXPR:
1624 TRY (TREE_OPERAND (t, 0));
1625 TRY (TREE_OPERAND (t, 1));
1626 TRY (TREE_OPERAND (t, 2));
1633 case TRUNC_DIV_EXPR:
1634 case TRUNC_MOD_EXPR:
1642 case BIT_ANDTC_EXPR:
1643 case TRUTH_ANDIF_EXPR:
1644 case TRUTH_ORIF_EXPR:
1652 case FLOOR_DIV_EXPR:
1653 case ROUND_DIV_EXPR:
1655 case FLOOR_MOD_EXPR:
1656 case ROUND_MOD_EXPR:
1658 case PREDECREMENT_EXPR:
1659 case PREINCREMENT_EXPR:
1660 case POSTDECREMENT_EXPR:
1661 case POSTINCREMENT_EXPR:
1664 case TRY_CATCH_EXPR:
1665 case WITH_CLEANUP_EXPR:
1667 TRY (TREE_OPERAND (t, 0));
1668 TRY (TREE_OPERAND (t, 1));
1677 case TRUTH_NOT_EXPR:
1679 case NON_LVALUE_EXPR:
1681 case CLEANUP_POINT_EXPR:
1685 TRY (TREE_OPERAND (t, 0));
1690 case REINTERPRET_CAST_EXPR:
1691 case CONST_CAST_EXPR:
1692 case STATIC_CAST_EXPR:
1693 case DYNAMIC_CAST_EXPR:
1700 TRY (TREE_REALPART (t));
1701 TRY (TREE_IMAGPART (t));
1705 TRY (CONSTRUCTOR_ELTS (t));
1708 case TEMPLATE_TEMPLATE_PARM:
1709 case TEMPLATE_PARM_INDEX:
1710 case TEMPLATE_TYPE_PARM:
1727 case REFERENCE_TYPE:
1728 TRY (TREE_TYPE (t));
1733 TRY (TREE_TYPE (t));
1734 TRY (TYPE_ARG_TYPES (t));
1738 TRY (TREE_TYPE (t));
1739 TRY (TYPE_DOMAIN (t));
1743 TRY (TYPE_MAX_VALUE (t));
1747 TRY (TREE_TYPE (t));
1748 TRY (TYPE_OFFSET_BASETYPE (t));
1752 if (TYPE_PTRMEMFUNC_P (t))
1753 TRY (TYPE_PTRMEMFUNC_FN_TYPE (t));
1756 /* This list is incomplete, but should suffice for now.
1757 It is very important that `sorry' not call
1758 `report_error_function'. That could cause an infinite loop. */
1760 sorry ("initializer contains unrecognized tree code");
1761 return error_mark_node;
1770 /* Passed to search_tree. Checks for the use of types with no linkage. */
1773 no_linkage_helper (t)
1777 && (IS_AGGR_TYPE (t) || TREE_CODE (t) == ENUMERAL_TYPE)
1778 && (decl_function_context (TYPE_MAIN_DECL (t))
1779 || ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))))
1784 /* Check if the type T depends on a type with no linkage and if so, return
1788 no_linkage_check (t)
1791 t = search_tree (t, no_linkage_helper);
1792 if (t != error_mark_node)
1798 /* Subroutine of copy_to_permanent
1800 Assuming T is a node build bottom-up, make it all exist on
1801 permanent obstack, if it is not permanent already. */
1806 tree (*func) PROTO((tree));
1813 if (tmp = func (t), tmp != NULL_TREE)
1816 switch (TREE_CODE (t))
1819 return error_mark_node;
1824 /* Rather than aborting, return error_mark_node. This allows us
1825 to report a sensible error message on code like this:
1827 void g() { int i; f<i>(7); }
1831 void g() { const int i = 7; f<i>(7); }
1833 however, we must actually return the constant initializer. */
1834 tmp = decl_constant_value (t);
1836 return mapcar (tmp, func);
1838 return error_mark_node;
1842 tree chain = TREE_CHAIN (t);
1844 TREE_CHAIN (t) = mapcar (chain, func);
1845 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1846 DECL_INITIAL (t) = mapcar (DECL_INITIAL (t), func);
1847 DECL_SIZE (t) = mapcar (DECL_SIZE (t), func);
1853 tree chain = TREE_CHAIN (t);
1855 TREE_PURPOSE (t) = mapcar (TREE_PURPOSE (t), func);
1856 TREE_VALUE (t) = mapcar (TREE_VALUE (t), func);
1857 TREE_CHAIN (t) = mapcar (chain, func);
1863 tree chain = OVL_CHAIN (t);
1865 OVL_FUNCTION (t) = mapcar (OVL_FUNCTION (t), func);
1866 OVL_CHAIN (t) = mapcar (chain, func);
1872 int len = TREE_VEC_LENGTH (t);
1876 TREE_VEC_ELT (t, len) = mapcar (TREE_VEC_ELT (t, len), func);
1883 return copy_node (t);
1887 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1888 PTRMEM_CST_MEMBER (t) = mapcar (PTRMEM_CST_MEMBER (t), func);
1893 case AGGR_INIT_EXPR:
1895 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1896 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1897 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1902 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1909 case TRUNC_DIV_EXPR:
1910 case TRUNC_MOD_EXPR:
1918 case BIT_ANDTC_EXPR:
1919 case TRUTH_ANDIF_EXPR:
1920 case TRUTH_ORIF_EXPR:
1928 case FLOOR_DIV_EXPR:
1929 case ROUND_DIV_EXPR:
1931 case FLOOR_MOD_EXPR:
1932 case ROUND_MOD_EXPR:
1934 case PREDECREMENT_EXPR:
1935 case PREINCREMENT_EXPR:
1936 case POSTDECREMENT_EXPR:
1937 case POSTINCREMENT_EXPR:
1940 case TRY_CATCH_EXPR:
1941 case WITH_CLEANUP_EXPR:
1943 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1944 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1949 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1950 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1951 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1953 /* tree.def says that operand two is RTL, but
1954 make_call_declarator puts trees in there. */
1955 if (TREE_OPERAND (t, 2)
1956 && TREE_CODE (TREE_OPERAND (t, 2)) == TREE_LIST)
1957 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1959 TREE_OPERAND (t, 2) = NULL_TREE;
1967 case TRUTH_NOT_EXPR:
1970 case CLEANUP_POINT_EXPR:
1972 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1973 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1977 tmp = build_pointer_type (mapcar (TREE_TYPE (t), func));
1978 return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1979 case REFERENCE_TYPE:
1980 tmp = build_reference_type (mapcar (TREE_TYPE (t), func));
1981 return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1983 tmp = build_function_type (mapcar (TREE_TYPE (t), func),
1984 mapcar (TYPE_ARG_TYPES (t), func));
1985 return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1987 tmp = build_cplus_array_type (mapcar (TREE_TYPE (t), func),
1988 mapcar (TYPE_DOMAIN (t), func));
1989 return cp_build_qualified_type (tmp, CP_TYPE_QUALS (t));
1991 tmp = build_index_type (mapcar (TYPE_MAX_VALUE (t), func));
1992 return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1994 tmp = build_offset_type (mapcar (TYPE_OFFSET_BASETYPE (t), func),
1995 mapcar (TREE_TYPE (t), func));
1996 return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1998 tmp = build_cplus_method_type
1999 (mapcar (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), func),
2000 mapcar (TREE_TYPE (t), func),
2001 mapcar (TREE_CHAIN (TYPE_ARG_TYPES (t)), func));
2002 return cp_build_qualified_type (tmp, TYPE_QUALS (t));
2006 TREE_REALPART (t) = mapcar (TREE_REALPART (t), func);
2007 TREE_IMAGPART (t) = mapcar (TREE_REALPART (t), func);
2012 CONSTRUCTOR_ELTS (t) = mapcar (CONSTRUCTOR_ELTS (t), func);
2015 case TEMPLATE_TEMPLATE_PARM:
2016 return copy_template_template_parm (t);
2020 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
2021 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
2022 TREE_OPERAND (t, 2) = NULL_TREE;
2027 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
2028 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
2029 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
2034 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
2038 if (TYPE_PTRMEMFUNC_P (t))
2039 return build_ptrmemfunc_type
2040 (mapcar (TYPE_PTRMEMFUNC_FN_TYPE (t), func));
2041 /* else fall through */
2043 /* This list is incomplete, but should suffice for now.
2044 It is very important that `sorry' not call
2045 `report_error_function'. That could cause an infinite loop. */
2047 sorry ("initializer contains unrecognized tree code");
2048 return error_mark_node;
2051 my_friendly_abort (107);
2060 if (TREE_PERMANENT (t))
2063 /* Support `void f () { extern int i; A<&i> a; }' */
2064 if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == FUNCTION_DECL)
2069 /* copy_rtx won't make a new SYMBOL_REF, so call make_decl_rtl again. */
2071 make_decl_rtl (t, NULL_PTR, 1);
2078 /* Assuming T is a node built bottom-up, make it all exist on
2079 permanent obstack, if it is not permanent already. */
2082 copy_to_permanent (t)
2085 if (t == NULL_TREE || TREE_PERMANENT (t))
2088 push_obstacks_nochange ();
2089 end_temporary_allocation ();
2091 t = mapcar (t, perm_manip);
2098 #ifdef GATHER_STATISTICS
2099 extern int depth_reached;
2103 print_lang_statistics ()
2105 extern struct obstack decl_obstack;
2106 print_obstack_statistics ("class_obstack", &class_obstack);
2107 print_obstack_statistics ("decl_obstack", &decl_obstack);
2108 print_search_statistics ();
2109 print_class_statistics ();
2110 #ifdef GATHER_STATISTICS
2111 fprintf (stderr, "maximum template instantiation depth reached: %d\n",
2116 /* This is used by the `assert' macro. It is provided in libgcc.a,
2117 which `cc' doesn't know how to link. Note that the C++ front-end
2118 no longer actually uses the `assert' macro (instead, it calls
2119 my_friendly_assert). But all of the back-end files still need this. */
2122 __eprintf (string, expression, line, filename)
2125 const char *expression;
2127 const char *filename;
2135 fprintf (stderr, string, expression, line, filename);
2140 /* Return, as an INTEGER_CST node, the number of elements for TYPE
2141 (which is an ARRAY_TYPE). This counts only elements of the top
2145 array_type_nelts_top (type)
2148 return fold (build (PLUS_EXPR, sizetype,
2149 array_type_nelts (type),
2153 /* Return, as an INTEGER_CST node, the number of elements for TYPE
2154 (which is an ARRAY_TYPE). This one is a recursive count of all
2155 ARRAY_TYPEs that are clumped together. */
2158 array_type_nelts_total (type)
2161 tree sz = array_type_nelts_top (type);
2162 type = TREE_TYPE (type);
2163 while (TREE_CODE (type) == ARRAY_TYPE)
2165 tree n = array_type_nelts_top (type);
2166 sz = fold (build (MULT_EXPR, sizetype, sz, n));
2167 type = TREE_TYPE (type);
2177 if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
2179 else if (TREE_CODE (t) == TARGET_EXPR)
2181 if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR)
2183 mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0));
2184 return build_cplus_new
2185 (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1)));
2188 TREE_OPERAND (t, 0) = build (VAR_DECL, TREE_TYPE (t));
2189 layout_decl (TREE_OPERAND (t, 0), 0);
2192 else if (TREE_CODE (t) == CALL_EXPR)
2193 mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
2198 /* Actually, we'll just clean out the target exprs for the moment. */
2201 break_out_target_exprs (t)
2204 return mapcar (t, bot_manip);
2207 /* Obstack used for allocating nodes in template function and variable
2210 /* Similar to `build_nt', except we build
2211 on the permanent_obstack, regardless. */
2214 build_min_nt VPROTO((enum tree_code code, ...))
2217 enum tree_code code;
2219 register struct obstack *ambient_obstack = expression_obstack;
2222 register int length;
2228 code = va_arg (p, enum tree_code);
2231 expression_obstack = &permanent_obstack;
2233 t = make_node (code);
2234 length = tree_code_length[(int) code];
2235 TREE_COMPLEXITY (t) = lineno;
2237 for (i = 0; i < length; i++)
2239 tree x = va_arg (p, tree);
2240 TREE_OPERAND (t, i) = copy_to_permanent (x);
2244 expression_obstack = ambient_obstack;
2248 /* Similar to `build', except we build
2249 on the permanent_obstack, regardless. */
2252 build_min VPROTO((enum tree_code code, tree tt, ...))
2255 enum tree_code code;
2258 register struct obstack *ambient_obstack = expression_obstack;
2261 register int length;
2267 code = va_arg (p, enum tree_code);
2268 tt = va_arg (p, tree);
2271 expression_obstack = &permanent_obstack;
2273 t = make_node (code);
2274 length = tree_code_length[(int) code];
2275 TREE_TYPE (t) = copy_to_permanent (tt);
2276 TREE_COMPLEXITY (t) = lineno;
2278 for (i = 0; i < length; i++)
2280 tree x = va_arg (p, tree);
2281 TREE_OPERAND (t, i) = copy_to_permanent (x);
2285 expression_obstack = ambient_obstack;
2289 /* Same as `tree_cons' but make a permanent object. */
2292 min_tree_cons (purpose, value, chain)
2293 tree purpose, value, chain;
2296 register struct obstack *ambient_obstack = current_obstack;
2297 current_obstack = &permanent_obstack;
2299 node = tree_cons (copy_to_permanent (purpose),
2300 copy_to_permanent (value), chain);
2301 current_obstack = ambient_obstack;
2309 if (TREE_CODE (t) == TYPE_DECL)
2311 if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
2312 return TYPE_STUB_DECL (t);
2314 my_friendly_abort (42);
2316 /* Stop compiler from complaining control reaches end of non-void function. */
2321 can_free (obstack, t)
2322 struct obstack *obstack;
2327 if (TREE_CODE (t) == TREE_VEC)
2328 size = (TREE_VEC_LENGTH (t)-1) * sizeof (tree) + sizeof (struct tree_vec);
2330 my_friendly_abort (42);
2332 #define ROUND(x) ((x + obstack_alignment_mask (obstack)) \
2333 & ~ obstack_alignment_mask (obstack))
2334 if ((char *)t + ROUND (size) == obstack_next_free (obstack))
2341 /* Return first vector element whose BINFO_TYPE is ELEM.
2342 Return 0 if ELEM is not in VEC. VEC may be NULL_TREE. */
2345 vec_binfo_member (elem, vec)
2351 for (i = 0; i < TREE_VEC_LENGTH (vec); ++i)
2352 if (same_type_p (elem, BINFO_TYPE (TREE_VEC_ELT (vec, i))))
2353 return TREE_VEC_ELT (vec, i);
2358 /* Kludge around the fact that DECL_CONTEXT for virtual functions returns
2359 the wrong thing for decl_function_context. Hopefully the uses in the
2360 backend won't matter, since we don't need a static chain for local class
2364 hack_decl_function_context (decl)
2367 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
2368 return decl_function_context (TYPE_MAIN_DECL (DECL_CLASS_CONTEXT (decl)));
2369 return decl_function_context (decl);
2372 /* Return truthvalue of whether T1 is the same tree structure as T2.
2373 Return 1 if they are the same.
2374 Return 0 if they are understandably different.
2375 Return -1 if either contains tree structure not understood by
2379 cp_tree_equal (t1, t2)
2382 register enum tree_code code1, code2;
2387 if (t1 == 0 || t2 == 0)
2390 code1 = TREE_CODE (t1);
2391 code2 = TREE_CODE (t2);
2393 if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR)
2395 if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR)
2396 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2398 return cp_tree_equal (TREE_OPERAND (t1, 0), t2);
2400 else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR
2401 || code2 == NON_LVALUE_EXPR)
2402 return cp_tree_equal (t1, TREE_OPERAND (t2, 0));
2410 return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
2411 && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2);
2414 return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2417 return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2418 && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2419 TREE_STRING_LENGTH (t1));
2422 /* We need to do this when determining whether or not two
2423 non-type pointer to member function template arguments
2425 if (!(same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))
2426 /* The first operand is RTL. */
2427 && TREE_OPERAND (t1, 0) == TREE_OPERAND (t2, 0)))
2429 return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2432 cmp = cp_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2));
2435 cmp = cp_tree_equal (TREE_VALUE (t1), TREE_VALUE (t2));
2438 return cp_tree_equal (TREE_CHAIN (t1), TREE_CHAIN (t2));
2441 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2444 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2447 return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2450 /* Special case: if either target is an unallocated VAR_DECL,
2451 it means that it's going to be unified with whatever the
2452 TARGET_EXPR is really supposed to initialize, so treat it
2453 as being equivalent to anything. */
2454 if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
2455 && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
2456 && DECL_RTL (TREE_OPERAND (t1, 0)) == 0)
2457 || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
2458 && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
2459 && DECL_RTL (TREE_OPERAND (t2, 0)) == 0))
2462 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2465 return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2467 case WITH_CLEANUP_EXPR:
2468 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2471 return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
2474 if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
2475 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2484 case TEMPLATE_PARM_INDEX:
2485 return TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2)
2486 && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2);
2490 if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
2492 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
2493 return same_type_p (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2497 /* Two pointer-to-members are the same if they point to the same
2498 field or function in the same class. */
2499 return (PTRMEM_CST_MEMBER (t1) == PTRMEM_CST_MEMBER (t2)
2500 && same_type_p (PTRMEM_CST_CLASS (t1), PTRMEM_CST_CLASS (t2)));
2506 switch (TREE_CODE_CLASS (code1))
2516 for (i=0; i<tree_code_length[(int) code1]; ++i)
2518 cmp = cp_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
2528 /* Similar to make_tree_vec, but build on the momentary_obstack.
2529 Thus, these vectors are really and truly temporary. */
2536 push_expression_obstack ();
2537 node = make_tree_vec (len);
2542 /* Build a wrapper around some pointer PTR so we can use it as a tree. */
2545 build_ptr_wrapper (ptr)
2548 tree t = make_node (WRAPPER);
2549 WRAPPER_PTR (t) = ptr;
2553 /* Same, but on the expression_obstack. */
2556 build_expr_ptr_wrapper (ptr)
2560 push_expression_obstack ();
2561 t = build_ptr_wrapper (ptr);
2566 /* Build a wrapper around some integer I so we can use it as a tree. */
2569 build_int_wrapper (i)
2572 tree t = make_node (WRAPPER);
2573 WRAPPER_INT (t) = i;
2578 build_srcloc (file, line)
2584 /* Make sure that we put these on the permanent obstack; up in
2585 add_pending_template, we pass this return value into perm_tree_cons,
2586 which also puts it on the permanent_obstack. However, this wasn't
2587 explicitly doing the same. */
2588 register struct obstack *ambient_obstack = current_obstack;
2589 current_obstack = &permanent_obstack;
2591 t = make_node (SRCLOC);
2592 SRCLOC_FILE (t) = file;
2593 SRCLOC_LINE (t) = line;
2595 current_obstack = ambient_obstack;
2601 build_srcloc_here ()
2603 return build_srcloc (input_filename, lineno);
2607 push_expression_obstack ()
2609 push_obstacks_nochange ();
2610 current_obstack = expression_obstack;
2613 /* The type of ARG when used as an lvalue. */
2619 tree type = TREE_TYPE (arg);
2620 if (TREE_CODE (arg) == OVERLOAD)
2621 type = unknown_type_node;
2625 /* The type of ARG for printing error messages; denote lvalues with
2632 tree type = TREE_TYPE (arg);
2633 if (TREE_CODE (type) == ARRAY_TYPE)
2635 else if (real_lvalue_p (arg))
2636 type = build_reference_type (lvalue_type (arg));
2637 else if (IS_AGGR_TYPE (type))
2638 type = lvalue_type (arg);
2643 /* Does FUNCTION use a variable-length argument list? */
2646 varargs_function_p (function)
2649 tree parm = TYPE_ARG_TYPES (TREE_TYPE (function));
2650 for (; parm; parm = TREE_CHAIN (parm))
2651 if (TREE_VALUE (parm) == void_type_node)
2656 /* Returns 1 if decl is a member of a class. */
2662 tree ctx = DECL_CONTEXT (decl);
2663 return (ctx && TREE_CODE_CLASS (TREE_CODE (ctx)) == 't');
2666 /* Create a placeholder for member access where we don't actually have an
2667 object that the access is against. */
2670 build_dummy_object (type)
2673 tree decl = build1 (NOP_EXPR, build_pointer_type (type), error_mark_node);
2674 return build_indirect_ref (decl, NULL_PTR);
2677 /* We've gotten a reference to a member of TYPE. Return *this if appropriate,
2678 or a dummy object otherwise. If BINFOP is non-0, it is filled with the
2679 binfo path from current_class_type to TYPE, or 0. */
2682 maybe_dummy_object (type, binfop)
2688 if (current_class_type
2689 && get_base_distance (type, current_class_type, 0, binfop) != -1)
2690 context = current_class_type;
2693 /* Reference from a nested class member function. */
2696 *binfop = TYPE_BINFO (type);
2699 if (current_class_ref && context == current_class_type)
2700 decl = current_class_ref;
2702 decl = build_dummy_object (context);
2707 /* Returns 1 if OB is a placeholder object, or a pointer to one. */
2710 is_dummy_object (ob)
2713 if (TREE_CODE (ob) == INDIRECT_REF)
2714 ob = TREE_OPERAND (ob, 0);
2715 return (TREE_CODE (ob) == NOP_EXPR
2716 && TREE_OPERAND (ob, 0) == error_mark_node);
2719 /* Returns 1 iff type T is a POD type, as defined in [basic.types]. */
2727 while (TREE_CODE (t) == ARRAY_TYPE)
2730 if (! IS_AGGR_TYPE (t))
2733 if (CLASSTYPE_NON_AGGREGATE (t)
2734 || TYPE_HAS_COMPLEX_ASSIGN_REF (t)
2735 || TYPE_HAS_DESTRUCTOR (t))
2738 for (f = TYPE_FIELDS (t); f; f = TREE_CHAIN (f))
2740 if (TREE_CODE (f) != FIELD_DECL)
2743 if (TREE_CODE (TREE_TYPE (f)) == REFERENCE_TYPE
2744 || TYPE_PTRMEMFUNC_P (TREE_TYPE (f))
2745 || TYPE_PTRMEM_P (TREE_TYPE (f)))