OSDN Git Service

revert part of the last checkin
[pf3gnuchains/gcc-fork.git] / gcc / cp / tree.c
1 /* Language-dependent node constructors for parse phase of GNU compiler.
2    Copyright (C) 1987, 88, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
3    Hacked by Michael Tiemann (tiemann@cygnus.com)
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, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "obstack.h"
25 #include "tree.h"
26 #include "cp-tree.h"
27 #include "flags.h"
28 #include "rtl.h"
29 #include "toplev.h"
30
31 #ifdef __STDC__
32 #include <stdarg.h>
33 #else
34 #include <varargs.h>
35 #endif
36
37 extern void compiler_error ();
38
39 static tree get_identifier_list PROTO((tree));
40 static tree bot_manip PROTO((tree));
41 static tree perm_manip PROTO((tree));
42 static tree build_cplus_array_type_1 PROTO((tree, tree));
43 static void list_hash_add PROTO((int, tree));
44 static int list_hash PROTO((tree, tree, tree));
45 static tree list_hash_lookup PROTO((int, int, int, int, tree, tree,
46                                     tree));
47 static void propagate_binfo_offsets PROTO((tree, tree));
48 static void unshare_base_binfos PROTO((tree));
49 static int avoid_overlap PROTO((tree, tree));
50
51 #define CEIL(x,y) (((x) + (y) - 1) / (y))
52
53 /* Return nonzero if REF is an lvalue valid for this language.
54    Lvalues can be assigned, unless they have TREE_READONLY.
55    Lvalues can have their address taken, unless they have DECL_REGISTER.  */
56
57 int
58 real_lvalue_p (ref)
59      tree ref;
60 {
61   if (! language_lvalue_valid (ref))
62     return 0;
63   
64   if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
65     return 1;
66
67   if (ref == current_class_ptr && flag_this_is_variable <= 0)
68     return 0;
69
70   switch (TREE_CODE (ref))
71     {
72       /* preincrements and predecrements are valid lvals, provided
73          what they refer to are valid lvals.  */
74     case PREINCREMENT_EXPR:
75     case PREDECREMENT_EXPR:
76     case COMPONENT_REF:
77     case SAVE_EXPR:
78     case UNSAVE_EXPR:
79     case TRY_CATCH_EXPR:
80     case WITH_CLEANUP_EXPR:
81       return real_lvalue_p (TREE_OPERAND (ref, 0));
82
83     case STRING_CST:
84       return 1;
85
86     case VAR_DECL:
87       if (TREE_READONLY (ref) && ! TREE_STATIC (ref)
88           && DECL_LANG_SPECIFIC (ref)
89           && DECL_IN_AGGR_P (ref))
90         return 0;
91     case INDIRECT_REF:
92     case ARRAY_REF:
93     case PARM_DECL:
94     case RESULT_DECL:
95     case ERROR_MARK:
96       if (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE
97           && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
98         return 1;
99       break;
100
101       /* A currently unresolved scope ref.  */
102     case SCOPE_REF:
103       my_friendly_abort (103);
104     case OFFSET_REF:
105       if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL)
106         return 1;
107       return real_lvalue_p (TREE_OPERAND (ref, 0))
108         && real_lvalue_p (TREE_OPERAND (ref, 1));
109       break;
110
111     case COND_EXPR:
112       return (real_lvalue_p (TREE_OPERAND (ref, 1))
113               && real_lvalue_p (TREE_OPERAND (ref, 2)));
114
115     case MODIFY_EXPR:
116       return 1;
117
118     case COMPOUND_EXPR:
119       return real_lvalue_p (TREE_OPERAND (ref, 1));
120
121     case MAX_EXPR:
122     case MIN_EXPR:
123       return (real_lvalue_p (TREE_OPERAND (ref, 0))
124               && real_lvalue_p (TREE_OPERAND (ref, 1)));
125
126     default:
127       break;
128     }
129
130   return 0;
131 }
132
133 /* This differs from real_lvalue_p in that class rvalues are considered
134    lvalues.  */
135 int
136 lvalue_p (ref)
137      tree ref;
138 {
139   if (! language_lvalue_valid (ref))
140     return 0;
141   
142   if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
143     return 1;
144
145   if (ref == current_class_ptr && flag_this_is_variable <= 0)
146     return 0;
147
148   switch (TREE_CODE (ref))
149     {
150       /* preincrements and predecrements are valid lvals, provided
151          what they refer to are valid lvals.  */
152     case PREINCREMENT_EXPR:
153     case PREDECREMENT_EXPR:
154     case REALPART_EXPR:
155     case IMAGPART_EXPR:
156     case COMPONENT_REF:
157     case SAVE_EXPR:
158     case UNSAVE_EXPR:
159     case TRY_CATCH_EXPR:
160     case WITH_CLEANUP_EXPR:
161       return lvalue_p (TREE_OPERAND (ref, 0));
162
163     case STRING_CST:
164       return 1;
165
166     case VAR_DECL:
167       if (TREE_READONLY (ref) && ! TREE_STATIC (ref)
168           && DECL_LANG_SPECIFIC (ref)
169           && DECL_IN_AGGR_P (ref))
170         return 0;
171     case INDIRECT_REF:
172     case ARRAY_REF:
173     case PARM_DECL:
174     case RESULT_DECL:
175     case ERROR_MARK:
176       if (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE
177           && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
178         return 1;
179       break;
180
181     case TARGET_EXPR:
182       return 1;
183
184     case CALL_EXPR:
185       if (IS_AGGR_TYPE (TREE_TYPE (ref)))
186         return 1;
187       break;
188
189       /* A currently unresolved scope ref.  */
190     case SCOPE_REF:
191       my_friendly_abort (103);
192     case OFFSET_REF:
193       if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL)
194         return 1;
195       return lvalue_p (TREE_OPERAND (ref, 0))
196         && lvalue_p (TREE_OPERAND (ref, 1));
197       break;
198
199     case COND_EXPR:
200       return (lvalue_p (TREE_OPERAND (ref, 1))
201               && lvalue_p (TREE_OPERAND (ref, 2)));
202
203     case MODIFY_EXPR:
204       return 1;
205
206     case COMPOUND_EXPR:
207       return lvalue_p (TREE_OPERAND (ref, 1));
208
209     case MAX_EXPR:
210     case MIN_EXPR:
211       return (lvalue_p (TREE_OPERAND (ref, 0))
212               && lvalue_p (TREE_OPERAND (ref, 1)));
213
214     default:
215       break;
216     }
217
218   return 0;
219 }
220
221 /* Return nonzero if REF is an lvalue valid for this language;
222    otherwise, print an error message and return zero.  */
223
224 int
225 lvalue_or_else (ref, string)
226      tree ref;
227      char *string;
228 {
229   int win = lvalue_p (ref);
230   if (! win)
231     error ("non-lvalue in %s", string);
232   return win;
233 }
234
235 /* INIT is a CALL_EXPR which needs info about its target.
236    TYPE is the type that this initialization should appear to have.
237
238    Build an encapsulation of the initialization to perform
239    and return it so that it can be processed by language-independent
240    and language-specific expression expanders.  */
241
242 tree
243 build_cplus_new (type, init)
244      tree type;
245      tree init;
246 {
247   tree slot;
248   tree rval;
249
250   if (TREE_CODE (init) != CALL_EXPR && TREE_CODE (init) != AGGR_INIT_EXPR)
251     return init;
252
253   slot = build (VAR_DECL, type);
254   DECL_ARTIFICIAL (slot) = 1;
255   layout_decl (slot, 0);
256   rval = build (AGGR_INIT_EXPR, type,
257                 TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), slot);
258   TREE_SIDE_EFFECTS (rval) = 1;
259   rval = build (TARGET_EXPR, type, slot, rval, NULL_TREE, NULL_TREE);
260   TREE_SIDE_EFFECTS (rval) = 1;
261
262   return rval;
263 }
264
265 /* Encapsulate the expression INIT in a TARGET_EXPR.  */
266
267 tree
268 get_target_expr (init)
269      tree init;
270 {
271   tree slot;
272   tree rval;
273
274   slot = build (VAR_DECL, TREE_TYPE (init));
275   DECL_ARTIFICIAL (slot) = 1;
276   layout_decl (slot, 0);
277   rval = build (TARGET_EXPR, TREE_TYPE (init), slot, init,
278                 NULL_TREE, NULL_TREE);
279   TREE_SIDE_EFFECTS (rval) = 1;
280
281   return rval;
282 }
283
284 /* Recursively search EXP for CALL_EXPRs that need cleanups and replace
285    these CALL_EXPRs with tree nodes that will perform the cleanups.  */
286
287 tree
288 break_out_cleanups (exp)
289      tree exp;
290 {
291   tree tmp = exp;
292
293   if (TREE_CODE (tmp) == CALL_EXPR
294       && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (tmp)))
295     return build_cplus_new (TREE_TYPE (tmp), tmp);
296
297   while (TREE_CODE (tmp) == NOP_EXPR
298          || TREE_CODE (tmp) == CONVERT_EXPR
299          || TREE_CODE (tmp) == NON_LVALUE_EXPR)
300     {
301       if (TREE_CODE (TREE_OPERAND (tmp, 0)) == CALL_EXPR
302           && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (TREE_OPERAND (tmp, 0))))
303         {
304           TREE_OPERAND (tmp, 0)
305             = build_cplus_new (TREE_TYPE (TREE_OPERAND (tmp, 0)),
306                                TREE_OPERAND (tmp, 0));
307           break;
308         }
309       else
310         tmp = TREE_OPERAND (tmp, 0);
311     }
312   return exp;
313 }
314
315 /* Recursively perform a preorder search EXP for CALL_EXPRs, making
316    copies where they are found.  Returns a deep copy all nodes transitively
317    containing CALL_EXPRs.  */
318
319 tree
320 break_out_calls (exp)
321      tree exp;
322 {
323   register tree t1, t2 = NULL_TREE;
324   register enum tree_code code;
325   register int changed = 0;
326   register int i;
327
328   if (exp == NULL_TREE)
329     return exp;
330
331   code = TREE_CODE (exp);
332
333   if (code == CALL_EXPR)
334     return copy_node (exp);
335
336   /* Don't try and defeat a save_expr, as it should only be done once.  */
337     if (code == SAVE_EXPR)
338        return exp;
339
340   switch (TREE_CODE_CLASS (code))
341     {
342     default:
343       abort ();
344
345     case 'c':  /* a constant */
346     case 't':  /* a type node */
347     case 'x':  /* something random, like an identifier or an ERROR_MARK.  */
348       return exp;
349
350     case 'd':  /* A decl node */
351 #if 0                               /* This is bogus.  jason 9/21/94 */
352
353       t1 = break_out_calls (DECL_INITIAL (exp));
354       if (t1 != DECL_INITIAL (exp))
355         {
356           exp = copy_node (exp);
357           DECL_INITIAL (exp) = t1;
358         }
359 #endif
360       return exp;
361
362     case 'b':  /* A block node */
363       {
364         /* Don't know how to handle these correctly yet.   Must do a
365            break_out_calls on all DECL_INITIAL values for local variables,
366            and also break_out_calls on all sub-blocks and sub-statements.  */
367         abort ();
368       }
369       return exp;
370
371     case 'e':  /* an expression */
372     case 'r':  /* a reference */
373     case 's':  /* an expression with side effects */
374       for (i = tree_code_length[(int) code] - 1; i >= 0; i--)
375         {
376           t1 = break_out_calls (TREE_OPERAND (exp, i));
377           if (t1 != TREE_OPERAND (exp, i))
378             {
379               exp = copy_node (exp);
380               TREE_OPERAND (exp, i) = t1;
381             }
382         }
383       return exp;
384
385     case '<':  /* a comparison expression */
386     case '2':  /* a binary arithmetic expression */
387       t2 = break_out_calls (TREE_OPERAND (exp, 1));
388       if (t2 != TREE_OPERAND (exp, 1))
389         changed = 1;
390     case '1':  /* a unary arithmetic expression */
391       t1 = break_out_calls (TREE_OPERAND (exp, 0));
392       if (t1 != TREE_OPERAND (exp, 0))
393         changed = 1;
394       if (changed)
395         {
396           if (tree_code_length[(int) code] == 1)
397             return build1 (code, TREE_TYPE (exp), t1);
398           else
399             return build (code, TREE_TYPE (exp), t1, t2);
400         }
401       return exp;
402     }
403
404 }
405 \f
406 extern struct obstack *current_obstack;
407 extern struct obstack permanent_obstack, class_obstack;
408 extern struct obstack *saveable_obstack;
409 extern struct obstack *expression_obstack;
410
411 /* Here is how primitive or already-canonicalized types' hash
412    codes are made.  MUST BE CONSISTENT WITH tree.c !!! */
413 #define TYPE_HASH(TYPE) ((HOST_WIDE_INT) (TYPE) & 0777777)
414
415 /* Construct, lay out and return the type of methods belonging to class
416    BASETYPE and whose arguments are described by ARGTYPES and whose values
417    are described by RETTYPE.  If each type exists already, reuse it.  */
418
419 tree
420 build_cplus_method_type (basetype, rettype, argtypes)
421      tree basetype, rettype, argtypes;
422 {
423   register tree t;
424   tree ptype;
425   int hashcode;
426
427   /* Make a node of the sort we want.  */
428   t = make_node (METHOD_TYPE);
429
430   TYPE_METHOD_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype);
431   TREE_TYPE (t) = rettype;
432   if (IS_SIGNATURE (basetype))
433     ptype = build_signature_pointer_type (TYPE_MAIN_VARIANT (basetype),
434                                           TYPE_READONLY (basetype),
435                                           TYPE_VOLATILE (basetype));
436   else
437     ptype = build_pointer_type (basetype);
438
439   /* The actual arglist for this function includes a "hidden" argument
440      which is "this".  Put it into the list of argument types.  */
441
442   argtypes = tree_cons (NULL_TREE, ptype, argtypes);
443   TYPE_ARG_TYPES (t) = argtypes;
444   TREE_SIDE_EFFECTS (argtypes) = 1;  /* Mark first argtype as "artificial".  */
445
446   /* If we already have such a type, use the old one and free this one.
447      Note that it also frees up the above cons cell if found.  */
448   hashcode = TYPE_HASH (basetype) + TYPE_HASH (rettype) + type_hash_list (argtypes);
449   t = type_hash_canon (hashcode, t);
450
451   if (TYPE_SIZE (t) == 0)
452     layout_type (t);
453
454   return t;
455 }
456
457 static tree
458 build_cplus_array_type_1 (elt_type, index_type)
459      tree elt_type;
460      tree index_type;
461 {
462   register struct obstack *ambient_obstack = current_obstack;
463   register struct obstack *ambient_saveable_obstack = saveable_obstack;
464   tree t;
465
466   /* We need a new one.  If both ELT_TYPE and INDEX_TYPE are permanent,
467      make this permanent too.  */
468   if (TREE_PERMANENT (elt_type)
469       && (index_type == 0 || TREE_PERMANENT (index_type)))
470     {
471       current_obstack = &permanent_obstack;
472       saveable_obstack = &permanent_obstack;
473     }
474
475   if (processing_template_decl
476       || uses_template_parms (index_type))
477     {
478       t = make_node (ARRAY_TYPE);
479       TREE_TYPE (t) = elt_type;
480       TYPE_DOMAIN (t) = index_type;
481     }
482   else
483     t = build_array_type (elt_type, index_type);
484
485   /* Push these needs up so that initialization takes place
486      more easily.  */
487   TYPE_NEEDS_CONSTRUCTING (t) = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (elt_type));
488   TYPE_NEEDS_DESTRUCTOR (t) = TYPE_NEEDS_DESTRUCTOR (TYPE_MAIN_VARIANT (elt_type));
489   current_obstack = ambient_obstack;
490   saveable_obstack = ambient_saveable_obstack;
491   return t;
492 }
493
494 tree
495 build_cplus_array_type (elt_type, index_type)
496      tree elt_type;
497      tree index_type;
498 {
499   tree t;
500   int constp = TYPE_READONLY (elt_type);
501   int volatilep = TYPE_VOLATILE (elt_type);
502   elt_type = TYPE_MAIN_VARIANT (elt_type);
503
504   t = build_cplus_array_type_1 (elt_type, index_type);
505
506   if (constp || volatilep)
507     t = cp_build_type_variant (t, constp, volatilep);
508
509   return t;
510 }
511 \f
512 /* Make a variant type in the proper way for C/C++, propagating qualifiers
513    down to the element type of an array.  */
514
515 tree
516 cp_build_type_variant (type, constp, volatilep)
517      tree type;
518      int constp, volatilep;
519 {
520   if (type == error_mark_node)
521     return type;
522   
523   if (TREE_CODE (type) == ARRAY_TYPE)
524     {
525       tree real_main_variant = TYPE_MAIN_VARIANT (type);
526
527       push_obstacks (TYPE_OBSTACK (real_main_variant),
528                      TYPE_OBSTACK (real_main_variant));
529       type = build_cplus_array_type_1 (cp_build_type_variant
530                                        (TREE_TYPE (type), constp, volatilep),
531                                        TYPE_DOMAIN (type));
532
533       /* TYPE must be on same obstack as REAL_MAIN_VARIANT.  If not,
534          make a copy.  (TYPE might have come from the hash table and
535          REAL_MAIN_VARIANT might be in some function's obstack.)  */
536
537       if (TYPE_OBSTACK (type) != TYPE_OBSTACK (real_main_variant))
538         {
539           type = copy_node (type);
540           TYPE_POINTER_TO (type) = TYPE_REFERENCE_TO (type) = 0;
541         }
542
543       TYPE_MAIN_VARIANT (type) = real_main_variant;
544       pop_obstacks ();
545       return type;
546     }
547   return build_type_variant (type, constp, volatilep);
548 }
549 \f
550 /* Add OFFSET to all base types of T.
551
552    OFFSET, which is a type offset, is number of bytes.
553
554    Note that we don't have to worry about having two paths to the
555    same base type, since this type owns its association list.  */
556
557 static void
558 propagate_binfo_offsets (binfo, offset)
559      tree binfo;
560      tree offset;
561 {
562   tree binfos = BINFO_BASETYPES (binfo);
563   int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
564
565   for (i = 0; i < n_baselinks; /* note increment is done in the loop.  */)
566     {
567       tree base_binfo = TREE_VEC_ELT (binfos, i);
568
569       if (TREE_VIA_VIRTUAL (base_binfo))
570         i += 1;
571       else
572         {
573           int j;
574           tree delta = NULL_TREE;
575
576           for (j = i+1; j < n_baselinks; j++)
577             if (! TREE_VIA_VIRTUAL (TREE_VEC_ELT (binfos, j)))
578               {
579                 /* The next basetype offset must take into account the space
580                    between the classes, not just the size of each class.  */
581                 delta = size_binop (MINUS_EXPR,
582                                     BINFO_OFFSET (TREE_VEC_ELT (binfos, j)),
583                                     BINFO_OFFSET (base_binfo));
584                 break;
585               }
586
587 #if 0
588           if (BINFO_OFFSET_ZEROP (base_binfo))
589             BINFO_OFFSET (base_binfo) = offset;
590           else
591             BINFO_OFFSET (base_binfo)
592               = size_binop (PLUS_EXPR, BINFO_OFFSET (base_binfo), offset);
593 #else
594           BINFO_OFFSET (base_binfo) = offset;
595 #endif
596
597           unshare_base_binfos (base_binfo);
598
599           /* Go to our next class that counts for offset propagation.  */
600           i = j;
601           if (i < n_baselinks)
602             offset = size_binop (PLUS_EXPR, offset, delta);
603         }
604     }
605 }
606
607 /* Makes new binfos for the indirect bases under BASE_BINFO, and updates
608    BINFO_OFFSET for them and their bases.  */
609
610 static void
611 unshare_base_binfos (base_binfo)
612      tree base_binfo;
613 {
614   if (BINFO_BASETYPES (base_binfo))
615     {
616       tree base_binfos = BINFO_BASETYPES (base_binfo);
617       tree chain = NULL_TREE;
618       int j;
619
620       /* Now unshare the structure beneath BASE_BINFO.  */
621       for (j = TREE_VEC_LENGTH (base_binfos)-1;
622            j >= 0; j--)
623         {
624           tree base_base_binfo = TREE_VEC_ELT (base_binfos, j);
625           if (! TREE_VIA_VIRTUAL (base_base_binfo))
626             TREE_VEC_ELT (base_binfos, j)
627               = make_binfo (BINFO_OFFSET (base_base_binfo),
628                             base_base_binfo,
629                             BINFO_VTABLE (base_base_binfo),
630                             BINFO_VIRTUALS (base_base_binfo),
631                             chain);
632           chain = TREE_VEC_ELT (base_binfos, j);
633           TREE_VIA_PUBLIC (chain) = TREE_VIA_PUBLIC (base_base_binfo);
634           TREE_VIA_PROTECTED (chain) = TREE_VIA_PROTECTED (base_base_binfo);
635           BINFO_INHERITANCE_CHAIN (chain) = base_binfo;
636         }
637
638       /* Completely unshare potentially shared data, and
639          update what is ours.  */
640       propagate_binfo_offsets (base_binfo, BINFO_OFFSET (base_binfo));
641     }
642 }
643
644 /* Finish the work of layout_record, now taking virtual bases into account.
645    Also compute the actual offsets that our base classes will have.
646    This must be performed after the fields are laid out, since virtual
647    baseclasses must lay down at the end of the record.
648
649    Returns the maximum number of virtual functions any of the
650    baseclasses provide.  */
651
652 int
653 layout_basetypes (rec, max)
654      tree rec;
655      int max;
656 {
657   tree binfos = TYPE_BINFO_BASETYPES (rec);
658   int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
659
660   /* Get all the virtual base types that this type uses.
661      The TREE_VALUE slot holds the virtual baseclass type.  */
662   tree vbase_types = get_vbase_types (rec);
663
664   unsigned int record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
665   unsigned int desired_align;
666
667   /* Record size so far is CONST_SIZE bits, where CONST_SIZE is an integer.  */
668   register unsigned int const_size = 0;
669   unsigned int nonvirtual_const_size;
670
671 #ifdef STRUCTURE_SIZE_BOUNDARY
672   /* Packed structures don't need to have minimum size.  */
673   if (! TYPE_PACKED (rec))
674     record_align = MAX (record_align, STRUCTURE_SIZE_BOUNDARY);
675 #endif
676
677   CLASSTYPE_VBASECLASSES (rec) = vbase_types;
678
679   my_friendly_assert (TREE_CODE (TYPE_SIZE (rec)) == INTEGER_CST, 19970302);
680   const_size = TREE_INT_CST_LOW (TYPE_SIZE (rec));
681
682   nonvirtual_const_size = const_size;
683
684   while (vbase_types)
685     {
686       tree basetype = BINFO_TYPE (vbase_types);
687       tree offset;
688
689       desired_align = TYPE_ALIGN (basetype);
690       record_align = MAX (record_align, desired_align);
691
692       if (const_size == 0)
693         offset = integer_zero_node;
694       else
695         {
696           /* Give each virtual base type the alignment it wants.  */
697           const_size = CEIL (const_size, desired_align) * desired_align;
698           offset = size_int (CEIL (const_size, BITS_PER_UNIT));
699         }
700
701       if (CLASSTYPE_VSIZE (basetype) > max)
702         max = CLASSTYPE_VSIZE (basetype);
703       BINFO_OFFSET (vbase_types) = offset;
704
705       /* Every virtual baseclass takes a least a UNIT, so that we can
706          take it's address and get something different for each base.  */
707       const_size += MAX (BITS_PER_UNIT,
708                          TREE_INT_CST_LOW (CLASSTYPE_SIZE (basetype)));
709
710       vbase_types = TREE_CHAIN (vbase_types);
711     }
712
713   if (const_size)
714     {
715       /* Because a virtual base might take a single byte above,
716          we have to re-adjust the total size to make sure it is
717          a multiple of the alignment.  */
718       /* Give the whole object the alignment it wants.  */
719       const_size = CEIL (const_size, record_align) * record_align;
720     }
721
722   /* Set the alignment in the complete type.  We don't set CLASSTYPE_ALIGN
723    here, as that is for this class, without any virtual base classes.  */
724   TYPE_ALIGN (rec) = record_align;
725   if (const_size != nonvirtual_const_size)
726     {
727       TYPE_SIZE (rec) = size_int (const_size);
728       TYPE_SIZE_UNIT (rec) = size_binop (FLOOR_DIV_EXPR, TYPE_SIZE (rec),
729                                          size_int (BITS_PER_UNIT));
730     }
731
732   /* Now propagate offset information throughout the lattice.  */
733   for (i = 0; i < n_baseclasses; i++)
734     {
735       register tree base_binfo = TREE_VEC_ELT (binfos, i);
736       register tree basetype = BINFO_TYPE (base_binfo);
737       tree field = TYPE_FIELDS (rec);
738
739       if (TREE_VIA_VIRTUAL (base_binfo))
740         continue;
741
742       my_friendly_assert (TREE_TYPE (field) == basetype, 23897);
743       BINFO_OFFSET (base_binfo)
744         = size_int (CEIL (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)),
745                           BITS_PER_UNIT));
746       unshare_base_binfos (base_binfo);
747       TYPE_FIELDS (rec) = TREE_CHAIN (field);
748     }
749
750   for (vbase_types = CLASSTYPE_VBASECLASSES (rec); vbase_types;
751        vbase_types = TREE_CHAIN (vbase_types))
752     {
753       BINFO_INHERITANCE_CHAIN (vbase_types) = TYPE_BINFO (rec);
754       unshare_base_binfos (vbase_types);
755     }
756
757   return max;
758 }
759
760 /* If the empty base field in DECL overlaps with a base of the same type in
761    NEWDECL, which is either another base field or the first data field of
762    the class, pad the base just before NEWDECL and return 1.  Otherwise,
763    return 0.  */
764
765 static int
766 avoid_overlap (decl, newdecl)
767      tree decl, newdecl;
768 {
769   tree field;
770
771   if (newdecl == NULL_TREE
772       || ! types_overlap_p (TREE_TYPE (decl), TREE_TYPE (newdecl)))
773     return 0;
774
775   for (field = decl; TREE_CHAIN (field) && TREE_CHAIN (field) != newdecl;
776        field = TREE_CHAIN (field))
777     ;
778
779   DECL_SIZE (field) = integer_one_node;
780
781   return 1;
782 }
783
784 /* Returns a list of fields to stand in for the base class subobjects
785    of REC.  These fields are later removed by layout_basetypes.  */
786
787 tree
788 build_base_fields (rec)
789      tree rec;
790 {
791   /* Chain to hold all the new FIELD_DECLs which stand in for base class
792      subobjects.  */
793   tree base_decls = NULL_TREE;
794   tree binfos = TYPE_BINFO_BASETYPES (rec);
795   int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
796   tree decl, nextdecl;
797   int i, saw_empty = 0;
798   unsigned int base_align = 0;
799
800   for (i = 0; i < n_baseclasses; ++i)
801     {
802       register tree base_binfo = TREE_VEC_ELT (binfos, i);
803       register tree basetype = BINFO_TYPE (base_binfo);
804
805       if (TYPE_SIZE (basetype) == 0)
806         /* This error is now reported in xref_tag, thus giving better
807            location information.  */
808         continue;
809
810       if (TREE_VIA_VIRTUAL (base_binfo))
811         continue;
812
813       decl = build_lang_field_decl (FIELD_DECL, NULL_TREE, basetype);
814       DECL_ARTIFICIAL (decl) = 1;
815       DECL_FIELD_CONTEXT (decl) = DECL_CLASS_CONTEXT (decl) = rec;
816       DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
817       DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
818       TREE_CHAIN (decl) = base_decls;
819       base_decls = decl;
820
821       if (! flag_new_abi)
822         {
823           /* Brain damage for backwards compatibility.  For no good reason,
824              the old layout_basetypes made every base at least as large as
825              the alignment for the bases up to that point, gratuitously
826              wasting space.  So we do the same thing here.  */
827           base_align = MAX (base_align, DECL_ALIGN (decl));
828           DECL_SIZE (decl)
829             = size_int (MAX (TREE_INT_CST_LOW (DECL_SIZE (decl)),
830                              base_align));
831         }
832       else if (DECL_SIZE (decl) == integer_zero_node)
833         saw_empty = 1;
834     }
835
836   /* Reverse the list of fields so we allocate the bases in the proper
837      order.  */
838   base_decls = nreverse (base_decls);
839
840   /* In the presence of empty base classes, we run the risk of allocating
841      two objects of the same class on top of one another.  Avoid that.  */
842   if (flag_new_abi && saw_empty)
843     for (decl = base_decls; decl; decl = TREE_CHAIN (decl))
844       {
845         if (DECL_SIZE (decl) == integer_zero_node)
846           {
847             /* First step through the following bases until we find
848                an overlap or a non-empty base.  */
849             for (nextdecl = TREE_CHAIN (decl); nextdecl;
850                  nextdecl = TREE_CHAIN (nextdecl))
851               {
852                 if (avoid_overlap (decl, nextdecl)
853                     || DECL_SIZE (nextdecl) != integer_zero_node)
854                   goto nextbase;
855               }
856
857             /* If we're still looking, also check against the first
858                field.  */
859             for (nextdecl = TYPE_FIELDS (rec);
860                  nextdecl && TREE_CODE (nextdecl) != FIELD_DECL;
861                  nextdecl = TREE_CHAIN (nextdecl))
862               /* keep looking */;
863             avoid_overlap (decl, nextdecl);
864           }
865       nextbase:;
866       }
867
868   return base_decls;
869 }
870
871 /* Returns list of virtual base class pointers in a FIELD_DECL chain.  */
872
873 tree
874 build_vbase_pointer_fields (rec)
875      tree rec;
876 {
877   /* Chain to hold all the new FIELD_DECLs which point at virtual
878      base classes.  */
879   tree vbase_decls = NULL_TREE;
880   tree binfos = TYPE_BINFO_BASETYPES (rec);
881   int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
882   tree decl;
883   int i;
884
885   /* Handle basetypes almost like fields, but record their
886      offsets differently.  */
887
888   for (i = 0; i < n_baseclasses; i++)
889     {
890       register tree base_binfo = TREE_VEC_ELT (binfos, i);
891       register tree basetype = BINFO_TYPE (base_binfo);
892
893       if (TYPE_SIZE (basetype) == 0)
894         /* This error is now reported in xref_tag, thus giving better
895            location information.  */
896         continue;
897
898       /* All basetypes are recorded in the association list of the
899          derived type.  */
900
901       if (TREE_VIA_VIRTUAL (base_binfo))
902         {
903           int j;
904           char *name = (char *)alloca (TYPE_NAME_LENGTH (basetype)
905                                        + sizeof (VBASE_NAME) + 1);
906
907           /* The offset for a virtual base class is only used in computing
908              virtual function tables and for initializing virtual base
909              pointers.  It is built once `get_vbase_types' is called.  */
910
911           /* If this basetype can come from another vbase pointer
912              without an additional indirection, we will share
913              that pointer.  If an indirection is involved, we
914              make our own pointer.  */
915           for (j = 0; j < n_baseclasses; j++)
916             {
917               tree other_base_binfo = TREE_VEC_ELT (binfos, j);
918               if (! TREE_VIA_VIRTUAL (other_base_binfo)
919                   && binfo_member (basetype,
920                                    CLASSTYPE_VBASECLASSES (BINFO_TYPE
921                                                            (other_base_binfo))
922                                    ))
923                 goto got_it;
924             }
925           sprintf (name, VBASE_NAME_FORMAT, TYPE_NAME_STRING (basetype));
926           decl = build_lang_field_decl (FIELD_DECL, get_identifier (name),
927                                         build_pointer_type (basetype));
928           /* If you change any of the below, take a look at all the
929              other VFIELD_BASEs and VTABLE_BASEs in the code, and change
930              them too.  */
931           DECL_ASSEMBLER_NAME (decl) = get_identifier (VTABLE_BASE);
932           DECL_VIRTUAL_P (decl) = 1;
933           DECL_ARTIFICIAL (decl) = 1;
934           DECL_FIELD_CONTEXT (decl) = rec;
935           DECL_CLASS_CONTEXT (decl) = rec;
936           DECL_FCONTEXT (decl) = basetype;
937           DECL_SAVED_INSNS (decl) = NULL_RTX;
938           DECL_FIELD_SIZE (decl) = 0;
939           DECL_ALIGN (decl) = TYPE_ALIGN (ptr_type_node);
940           TREE_CHAIN (decl) = vbase_decls;
941           BINFO_VPTR_FIELD (base_binfo) = decl;
942           vbase_decls = decl;
943
944         got_it:
945           /* The space this decl occupies has already been accounted for.  */
946           ;
947         }
948     }
949
950   return vbase_decls;
951 }
952 \f
953 /* Hashing of lists so that we don't make duplicates.
954    The entry point is `list_hash_canon'.  */
955
956 /* Each hash table slot is a bucket containing a chain
957    of these structures.  */
958
959 struct list_hash
960 {
961   struct list_hash *next;       /* Next structure in the bucket.  */
962   int hashcode;                 /* Hash code of this list.  */
963   tree list;                    /* The list recorded here.  */
964 };
965
966 /* Now here is the hash table.  When recording a list, it is added
967    to the slot whose index is the hash code mod the table size.
968    Note that the hash table is used for several kinds of lists.
969    While all these live in the same table, they are completely independent,
970    and the hash code is computed differently for each of these.  */
971
972 #define TYPE_HASH_SIZE 59
973 static struct list_hash *list_hash_table[TYPE_HASH_SIZE];
974
975 /* Compute a hash code for a list (chain of TREE_LIST nodes
976    with goodies in the TREE_PURPOSE, TREE_VALUE, and bits of the
977    TREE_COMMON slots), by adding the hash codes of the individual entries.  */
978
979 static int
980 list_hash (purpose, value, chain)
981      tree purpose, value, chain;
982 {
983   register int hashcode = 0;
984
985   if (chain)
986     hashcode += TYPE_HASH (chain);
987
988   if (value)
989     hashcode += TYPE_HASH (value);
990   else
991     hashcode += 1007;
992   if (purpose)
993     hashcode += TYPE_HASH (purpose);
994   else
995     hashcode += 1009;
996   return hashcode;
997 }
998
999 /* Look in the type hash table for a type isomorphic to TYPE.
1000    If one is found, return it.  Otherwise return 0.  */
1001
1002 static tree
1003 list_hash_lookup (hashcode, via_public, via_protected, via_virtual,
1004                   purpose, value, chain)
1005      int hashcode, via_public, via_virtual, via_protected;
1006      tree purpose, value, chain;
1007 {
1008   register struct list_hash *h;
1009
1010   for (h = list_hash_table[hashcode % TYPE_HASH_SIZE]; h; h = h->next)
1011     if (h->hashcode == hashcode
1012         && TREE_VIA_VIRTUAL (h->list) == via_virtual
1013         && TREE_VIA_PUBLIC (h->list) == via_public
1014         && TREE_VIA_PROTECTED (h->list) == via_protected
1015         && TREE_PURPOSE (h->list) == purpose
1016         && TREE_VALUE (h->list) == value
1017         && TREE_CHAIN (h->list) == chain)
1018       return h->list;
1019   return 0;
1020 }
1021
1022 /* Add an entry to the list-hash-table
1023    for a list TYPE whose hash code is HASHCODE.  */
1024
1025 static void
1026 list_hash_add (hashcode, list)
1027      int hashcode;
1028      tree list;
1029 {
1030   register struct list_hash *h;
1031
1032   h = (struct list_hash *) obstack_alloc (&class_obstack, sizeof (struct list_hash));
1033   h->hashcode = hashcode;
1034   h->list = list;
1035   h->next = list_hash_table[hashcode % TYPE_HASH_SIZE];
1036   list_hash_table[hashcode % TYPE_HASH_SIZE] = h;
1037 }
1038
1039 /* Given TYPE, and HASHCODE its hash code, return the canonical
1040    object for an identical list if one already exists.
1041    Otherwise, return TYPE, and record it as the canonical object
1042    if it is a permanent object.
1043
1044    To use this function, first create a list of the sort you want.
1045    Then compute its hash code from the fields of the list that
1046    make it different from other similar lists.
1047    Then call this function and use the value.
1048    This function frees the list you pass in if it is a duplicate.  */
1049
1050 /* Set to 1 to debug without canonicalization.  Never set by program.  */
1051
1052 static int debug_no_list_hash = 0;
1053
1054 tree
1055 hash_tree_cons (via_public, via_virtual, via_protected, purpose, value, chain)
1056      int via_public, via_virtual, via_protected;
1057      tree purpose, value, chain;
1058 {
1059   struct obstack *ambient_obstack = current_obstack;
1060   tree t;
1061   int hashcode = 0;
1062
1063   if (! debug_no_list_hash)
1064     {
1065       hashcode = list_hash (purpose, value, chain);
1066       t = list_hash_lookup (hashcode, via_public, via_protected, via_virtual,
1067                             purpose, value, chain);
1068       if (t)
1069         return t;
1070     }
1071
1072   current_obstack = &class_obstack;
1073
1074   t = tree_cons (purpose, value, chain);
1075   TREE_VIA_PUBLIC (t) = via_public;
1076   TREE_VIA_PROTECTED (t) = via_protected;
1077   TREE_VIA_VIRTUAL (t) = via_virtual;
1078
1079   /* If this is a new list, record it for later reuse.  */
1080   if (! debug_no_list_hash)
1081     list_hash_add (hashcode, t);
1082
1083   current_obstack = ambient_obstack;
1084   return t;
1085 }
1086
1087 /* Constructor for hashed lists.  */
1088
1089 tree
1090 hash_tree_chain (value, chain)
1091      tree value, chain;
1092 {
1093   return hash_tree_cons (0, 0, 0, NULL_TREE, value, chain);
1094 }
1095
1096 /* Similar, but used for concatenating two lists.  */
1097
1098 tree
1099 hash_chainon (list1, list2)
1100      tree list1, list2;
1101 {
1102   if (list2 == 0)
1103     return list1;
1104   if (list1 == 0)
1105     return list2;
1106   if (TREE_CHAIN (list1) == NULL_TREE)
1107     return hash_tree_chain (TREE_VALUE (list1), list2);
1108   return hash_tree_chain (TREE_VALUE (list1),
1109                           hash_chainon (TREE_CHAIN (list1), list2));
1110 }
1111
1112 static tree
1113 get_identifier_list (value)
1114      tree value;
1115 {
1116   tree list = IDENTIFIER_AS_LIST (value);
1117   if (list != NULL_TREE
1118       && (TREE_CODE (list) != TREE_LIST
1119           || TREE_VALUE (list) != value))
1120     list = NULL_TREE;
1121   else if (IDENTIFIER_HAS_TYPE_VALUE (value)
1122            && TREE_CODE (IDENTIFIER_TYPE_VALUE (value)) == RECORD_TYPE
1123            && IDENTIFIER_TYPE_VALUE (value)
1124               == TYPE_MAIN_VARIANT (IDENTIFIER_TYPE_VALUE (value)))
1125     {
1126       tree type = IDENTIFIER_TYPE_VALUE (value);
1127
1128       if (TYPE_PTRMEMFUNC_P (type))
1129         list = NULL_TREE;
1130       else if (type == current_class_type)
1131         /* Don't mess up the constructor name.  */
1132         list = tree_cons (NULL_TREE, value, NULL_TREE);
1133       else
1134         {
1135           if (! CLASSTYPE_ID_AS_LIST (type))
1136             CLASSTYPE_ID_AS_LIST (type)
1137               = perm_tree_cons (NULL_TREE, TYPE_IDENTIFIER (type), NULL_TREE);
1138           list = CLASSTYPE_ID_AS_LIST (type);
1139         }
1140     }
1141   return list;
1142 }
1143
1144 tree
1145 get_decl_list (value)
1146      tree value;
1147 {
1148   tree list = NULL_TREE;
1149
1150   if (TREE_CODE (value) == IDENTIFIER_NODE)
1151     list = get_identifier_list (value);
1152   else if (TREE_CODE (value) == RECORD_TYPE
1153            && TYPE_LANG_SPECIFIC (value)
1154            && value == TYPE_MAIN_VARIANT (value))
1155     list = CLASSTYPE_AS_LIST (value);
1156
1157   if (list != NULL_TREE)
1158     {
1159       my_friendly_assert (TREE_CHAIN (list) == NULL_TREE, 301);
1160       return list;
1161     }
1162
1163   return build_decl_list (NULL_TREE, value);
1164 }
1165 \f
1166 /* Build an association between TYPE and some parameters:
1167
1168    OFFSET is the offset added to `this' to convert it to a pointer
1169    of type `TYPE *'
1170
1171    BINFO is the base binfo to use, if we are deriving from one.  This
1172    is necessary, as we want specialized parent binfos from base
1173    classes, so that the VTABLE_NAMEs of bases are for the most derived
1174    type, instead of the simple type.
1175
1176    VTABLE is the virtual function table with which to initialize
1177    sub-objects of type TYPE.
1178
1179    VIRTUALS are the virtual functions sitting in VTABLE.
1180
1181    CHAIN are more associations we must retain.  */
1182
1183 tree
1184 make_binfo (offset, binfo, vtable, virtuals, chain)
1185      tree offset, binfo;
1186      tree vtable, virtuals;
1187      tree chain;
1188 {
1189   tree new_binfo = make_tree_vec (6);
1190   tree type;
1191
1192   if (TREE_CODE (binfo) == TREE_VEC)
1193     type = BINFO_TYPE (binfo);
1194   else
1195     {
1196       type = binfo;
1197       binfo = TYPE_BINFO (binfo);
1198     }
1199
1200   TREE_CHAIN (new_binfo) = chain;
1201   if (chain)
1202     TREE_USED (new_binfo) = TREE_USED (chain);
1203
1204   TREE_TYPE (new_binfo) = TYPE_MAIN_VARIANT (type);
1205   BINFO_OFFSET (new_binfo) = offset;
1206   BINFO_VTABLE (new_binfo) = vtable;
1207   BINFO_VIRTUALS (new_binfo) = virtuals;
1208   BINFO_VPTR_FIELD (new_binfo) = NULL_TREE;
1209
1210   if (binfo && BINFO_BASETYPES (binfo) != NULL_TREE)
1211     BINFO_BASETYPES (new_binfo) = copy_node (BINFO_BASETYPES (binfo));      
1212   return new_binfo;
1213 }
1214
1215 /* Return the binfo value for ELEM in TYPE.  */
1216
1217 tree
1218 binfo_value (elem, type)
1219      tree elem;
1220      tree type;
1221 {
1222   if (get_base_distance (elem, type, 0, (tree *)0) == -2)
1223     compiler_error ("base class `%s' ambiguous in binfo_value",
1224                     TYPE_NAME_STRING (elem));
1225   if (elem == type)
1226     return TYPE_BINFO (type);
1227   if (TREE_CODE (elem) == RECORD_TYPE && TYPE_BINFO (elem) == type)
1228     return type;
1229   return get_binfo (elem, type, 0);
1230 }
1231
1232 tree
1233 reverse_path (path)
1234      tree path;
1235 {
1236   register tree prev = 0, tmp, next;
1237   for (tmp = path; tmp; tmp = next)
1238     {
1239       next = BINFO_INHERITANCE_CHAIN (tmp);
1240       BINFO_INHERITANCE_CHAIN (tmp) = prev;
1241       prev = tmp;
1242     }
1243   return prev;
1244 }
1245
1246 void
1247 debug_binfo (elem)
1248      tree elem;
1249 {
1250   unsigned HOST_WIDE_INT n;
1251   tree virtuals;
1252
1253   fprintf (stderr, "type \"%s\"; offset = %ld\n",
1254            TYPE_NAME_STRING (BINFO_TYPE (elem)),
1255            (long) TREE_INT_CST_LOW (BINFO_OFFSET (elem)));
1256   fprintf (stderr, "vtable type:\n");
1257   debug_tree (BINFO_TYPE (elem));
1258   if (BINFO_VTABLE (elem))
1259     fprintf (stderr, "vtable decl \"%s\"\n", IDENTIFIER_POINTER (DECL_NAME (BINFO_VTABLE (elem))));
1260   else
1261     fprintf (stderr, "no vtable decl yet\n");
1262   fprintf (stderr, "virtuals:\n");
1263   virtuals = BINFO_VIRTUALS (elem);
1264
1265   n = skip_rtti_stuff (&virtuals);
1266
1267   while (virtuals)
1268     {
1269       tree fndecl = TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals)), 0);
1270       fprintf (stderr, "%s [%ld =? %ld]\n",
1271                IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl)),
1272                (long) n, (long) TREE_INT_CST_LOW (DECL_VINDEX (fndecl)));
1273       ++n;
1274       virtuals = TREE_CHAIN (virtuals);
1275     }
1276 }
1277
1278 /* Initialize an CPLUS_BINDING node that does not live on an obstack. */
1279
1280 tree
1281 binding_init (node)
1282      struct tree_binding* node;
1283 {
1284   static struct tree_binding* source;
1285   if (!source)
1286     {
1287       extern struct obstack permanent_obstack;
1288       push_obstacks (&permanent_obstack, &permanent_obstack);
1289       source = (struct tree_binding*)make_node (CPLUS_BINDING);
1290       pop_obstacks ();
1291     }
1292   *node = *source;
1293   TREE_PERMANENT ((tree)node) = 0;
1294   return (tree)node;
1295 }
1296
1297 int
1298 count_functions (t)
1299      tree t;
1300 {
1301   int i;
1302   if (TREE_CODE (t) == FUNCTION_DECL)
1303     return 1;
1304   else if (TREE_CODE (t) == OVERLOAD)
1305     {
1306       for (i=0; t; t = OVL_CHAIN (t))
1307         i++;
1308       return i;
1309     }
1310
1311   my_friendly_abort (359);
1312   return 0;
1313 }
1314
1315 int
1316 is_overloaded_fn (x)
1317      tree x;
1318 {
1319   /* XXX A baselink is also considered an overloaded function.
1320      As is a placeholder from push_class_decls.  */
1321   if (TREE_CODE (x) == TREE_LIST)
1322     {
1323       my_friendly_assert (TREE_CODE (TREE_PURPOSE (x)) == TREE_VEC
1324                           || TREE_CODE (TREE_PURPOSE (x)) == IDENTIFIER_NODE,
1325                           388);
1326       x = TREE_VALUE (x);
1327     }
1328   return (TREE_CODE (x) == FUNCTION_DECL
1329           || TREE_CODE (x) == TEMPLATE_ID_EXPR
1330           || DECL_FUNCTION_TEMPLATE_P (x)
1331           || TREE_CODE (x) == OVERLOAD);
1332 }
1333
1334 int
1335 really_overloaded_fn (x)
1336      tree x;
1337 {     
1338   /* A baselink is also considered an overloaded function.
1339      This might also be an ambiguous class member. */
1340   if (TREE_CODE (x) == TREE_LIST)
1341     x = TREE_VALUE (x);
1342   return (TREE_CODE (x) == OVERLOAD 
1343           && (TREE_CHAIN (x) != NULL_TREE
1344               || DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (x))));
1345 }
1346
1347 tree
1348 get_first_fn (from)
1349      tree from;
1350 {
1351   my_friendly_assert (is_overloaded_fn (from), 9);
1352   /* A baselink is also considered an overloaded function. */
1353   if (TREE_CODE (from) == TREE_LIST)
1354     from = TREE_VALUE (from);
1355   return OVL_CURRENT (from);
1356 }
1357
1358 /* Return a new OVL node, concatenating it with the old one. */
1359
1360 tree
1361 ovl_cons (decl, chain)
1362      tree decl;
1363      tree chain;
1364 {
1365   tree result = make_node (OVERLOAD);
1366   TREE_TYPE (result) = unknown_type_node;
1367   OVL_FUNCTION (result) = decl;
1368   TREE_CHAIN (result) = chain;
1369   
1370   return result;
1371 }
1372
1373 /* Same as ovl_cons, but on the scratch_obstack. */
1374
1375 tree
1376 scratch_ovl_cons (value, chain)
1377      tree value, chain;
1378 {
1379   register tree node;
1380   register struct obstack *ambient_obstack = current_obstack;
1381   extern struct obstack *expression_obstack;
1382   current_obstack = expression_obstack;
1383   node = ovl_cons (value, chain);
1384   current_obstack = ambient_obstack;
1385   return node;
1386 }
1387
1388 /* Build a new overloaded function. If this is the first one,
1389    just return it; otherwise, ovl_cons the _DECLs */
1390
1391 tree
1392 build_overload (decl, chain)
1393      tree decl;
1394      tree chain;
1395 {
1396   if (!chain)
1397     return decl;
1398   if (TREE_CODE (chain) != OVERLOAD)
1399     chain = ovl_cons (chain, NULL_TREE);
1400   return ovl_cons (decl, chain);
1401 }
1402
1403 /* True if fn is in ovl. */
1404
1405 int
1406 ovl_member (fn, ovl)
1407      tree fn;
1408      tree ovl;
1409 {
1410   if (fn == ovl)
1411     return 1;
1412   if (!ovl || TREE_CODE (ovl) != OVERLOAD)
1413     return 0;
1414   for (; ovl; ovl = OVL_CHAIN (ovl))
1415     if (OVL_FUNCTION (ovl) == fn)
1416       return 1;
1417   return 0;
1418 }
1419
1420 int
1421 is_aggr_type_2 (t1, t2)
1422      tree t1, t2;
1423 {
1424   if (TREE_CODE (t1) != TREE_CODE (t2))
1425     return 0;
1426   return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
1427 }
1428 \f
1429 #define PRINT_RING_SIZE 4
1430
1431 char *
1432 lang_printable_name (decl, v)
1433      tree decl;
1434      int v;
1435 {
1436   static tree decl_ring[PRINT_RING_SIZE];
1437   static char *print_ring[PRINT_RING_SIZE];
1438   static int ring_counter;
1439   int i;
1440
1441   /* Only cache functions.  */
1442   if (v < 2
1443       || TREE_CODE (decl) != FUNCTION_DECL
1444       || DECL_LANG_SPECIFIC (decl) == 0)
1445     return lang_decl_name (decl, v);
1446
1447   /* See if this print name is lying around.  */
1448   for (i = 0; i < PRINT_RING_SIZE; i++)
1449     if (decl_ring[i] == decl)
1450       /* yes, so return it.  */
1451       return print_ring[i];
1452
1453   if (++ring_counter == PRINT_RING_SIZE)
1454     ring_counter = 0;
1455
1456   if (current_function_decl != NULL_TREE)
1457     {
1458       if (decl_ring[ring_counter] == current_function_decl)
1459         ring_counter += 1;
1460       if (ring_counter == PRINT_RING_SIZE)
1461         ring_counter = 0;
1462       if (decl_ring[ring_counter] == current_function_decl)
1463         my_friendly_abort (106);
1464     }
1465
1466   if (print_ring[ring_counter])
1467     free (print_ring[ring_counter]);
1468
1469   print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v));
1470   decl_ring[ring_counter] = decl;
1471   return print_ring[ring_counter];
1472 }
1473 \f
1474 /* Build the FUNCTION_TYPE or METHOD_TYPE which may throw exceptions
1475    listed in RAISES.  */
1476
1477 tree
1478 build_exception_variant (type, raises)
1479      tree type;
1480      tree raises;
1481 {
1482   tree v = TYPE_MAIN_VARIANT (type);
1483   int constp = TYPE_READONLY (type);
1484   int volatilep = TYPE_VOLATILE (type);
1485
1486   for (; v; v = TYPE_NEXT_VARIANT (v))
1487     {
1488       if (TYPE_READONLY (v) != constp
1489           || TYPE_VOLATILE (v) != volatilep)
1490         continue;
1491
1492       /* @@ This should do set equality, not exact match.  */
1493       if (simple_cst_list_equal (TYPE_RAISES_EXCEPTIONS (v), raises))
1494         /* List of exceptions raised matches previously found list.
1495
1496            @@ Nice to free up storage used in consing up the
1497            @@ list of exceptions raised.  */
1498         return v;
1499     }
1500
1501   /* Need to build a new variant.  */
1502   v = build_type_copy (type);
1503
1504   if (raises && ! TREE_PERMANENT (raises))
1505     {
1506       push_obstacks_nochange ();
1507       end_temporary_allocation ();
1508       raises = copy_list (raises);
1509       pop_obstacks ();
1510     }
1511
1512   TYPE_RAISES_EXCEPTIONS (v) = raises;
1513   return v;
1514 }
1515
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 */
1518
1519 tree
1520 copy_template_template_parm (t)
1521      tree t;
1522 {
1523   tree template = TYPE_NAME (t);
1524   tree t2 = make_lang_type (TEMPLATE_TEMPLATE_PARM);
1525   template = copy_node (template);
1526   copy_lang_decl (template);
1527   TREE_TYPE (template) = t2;
1528   TYPE_NAME (t2) = template;
1529   TYPE_STUB_DECL (t2) = template;
1530
1531   /* No need to copy these */
1532   TYPE_FIELDS (t2) = TYPE_FIELDS (t);
1533   CLASSTYPE_TEMPLATE_INFO (t2) = CLASSTYPE_TEMPLATE_INFO (t);
1534   return t2;
1535 }
1536
1537 /* Subroutine of copy_to_permanent
1538
1539    Assuming T is a node build bottom-up, make it all exist on
1540    permanent obstack, if it is not permanent already.  */
1541
1542 tree
1543 mapcar (t, func)
1544      tree t;
1545      tree (*func) PROTO((tree));
1546 {
1547   tree tmp;
1548
1549   if (t == NULL_TREE)
1550     return t;
1551
1552   if (tmp = func (t), tmp != NULL_TREE)
1553     return tmp;
1554
1555   switch (TREE_CODE (t))
1556     {
1557     case ERROR_MARK:
1558       return error_mark_node;
1559
1560     case VAR_DECL:
1561     case FUNCTION_DECL:
1562     case CONST_DECL:
1563       /* Rather than aborting, return error_mark_node.  This allows us
1564          to report a sensible error message on code like this:
1565
1566          void g() { int i; f<i>(7); } 
1567
1568          In a case like:
1569
1570            void g() { const int i = 7; f<i>(7); }
1571
1572          however, we must actually return the constant initializer.  */
1573       tmp = decl_constant_value (t);
1574       if (tmp != t)
1575         return mapcar (tmp, func);
1576       else
1577         return error_mark_node;
1578
1579     case PARM_DECL:
1580       {
1581         tree chain = TREE_CHAIN (t);
1582         t = copy_node (t);
1583         TREE_CHAIN (t) = mapcar (chain, func);
1584         TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1585         DECL_INITIAL (t) = mapcar (DECL_INITIAL (t), func);
1586         DECL_SIZE (t) = mapcar (DECL_SIZE (t), func);
1587         return t;
1588       }
1589
1590     case TREE_LIST:
1591       {
1592         tree chain = TREE_CHAIN (t);
1593         t = copy_node (t);
1594         TREE_PURPOSE (t) = mapcar (TREE_PURPOSE (t), func);
1595         TREE_VALUE (t) = mapcar (TREE_VALUE (t), func);
1596         TREE_CHAIN (t) = mapcar (chain, func);
1597         return t;
1598       }
1599
1600     case OVERLOAD:
1601       {
1602         tree chain = OVL_CHAIN (t);
1603         t = copy_node (t);
1604         OVL_FUNCTION (t) = mapcar (OVL_FUNCTION (t), func);
1605         OVL_CHAIN (t) = mapcar (chain, func);
1606         return t;
1607       }
1608
1609     case TREE_VEC:
1610       {
1611         int len = TREE_VEC_LENGTH (t);
1612
1613         t = copy_node (t);
1614         while (len--)
1615           TREE_VEC_ELT (t, len) = mapcar (TREE_VEC_ELT (t, len), func);
1616         return t;
1617       }
1618
1619     case INTEGER_CST:
1620     case REAL_CST:
1621     case STRING_CST:
1622       return copy_node (t);
1623
1624     case COND_EXPR:
1625     case TARGET_EXPR:
1626     case AGGR_INIT_EXPR:
1627       t = copy_node (t);
1628       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1629       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1630       TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1631       return t;
1632
1633     case SAVE_EXPR:
1634       t = copy_node (t);
1635       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1636       return t;
1637
1638     case MODIFY_EXPR:
1639     case PLUS_EXPR:
1640     case MINUS_EXPR:
1641     case MULT_EXPR:
1642     case TRUNC_DIV_EXPR:
1643     case TRUNC_MOD_EXPR:
1644     case MIN_EXPR:
1645     case MAX_EXPR:
1646     case LSHIFT_EXPR:
1647     case RSHIFT_EXPR:
1648     case BIT_IOR_EXPR:
1649     case BIT_XOR_EXPR:
1650     case BIT_AND_EXPR:
1651     case BIT_ANDTC_EXPR:
1652     case TRUTH_ANDIF_EXPR:
1653     case TRUTH_ORIF_EXPR:
1654     case LT_EXPR:
1655     case LE_EXPR:
1656     case GT_EXPR:
1657     case GE_EXPR:
1658     case EQ_EXPR:
1659     case NE_EXPR:
1660     case CEIL_DIV_EXPR:
1661     case FLOOR_DIV_EXPR:
1662     case ROUND_DIV_EXPR:
1663     case CEIL_MOD_EXPR:
1664     case FLOOR_MOD_EXPR:
1665     case ROUND_MOD_EXPR:
1666     case COMPOUND_EXPR:
1667     case PREDECREMENT_EXPR:
1668     case PREINCREMENT_EXPR:
1669     case POSTDECREMENT_EXPR:
1670     case POSTINCREMENT_EXPR:
1671     case ARRAY_REF:
1672     case SCOPE_REF:
1673     case TRY_CATCH_EXPR:
1674     case WITH_CLEANUP_EXPR:
1675       t = copy_node (t);
1676       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1677       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1678       return t;
1679
1680     case CALL_EXPR:
1681       t = copy_node (t);
1682       TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1683       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1684       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1685
1686       /* tree.def says that operand two is RTL, but
1687          build_call_declarator puts trees in there.  */
1688       if (TREE_OPERAND (t, 2)
1689           && TREE_CODE (TREE_OPERAND (t, 2)) == TREE_LIST)
1690         TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1691       else
1692         TREE_OPERAND (t, 2) = NULL_TREE;
1693       return t;
1694
1695     case CONVERT_EXPR:
1696     case ADDR_EXPR:
1697     case INDIRECT_REF:
1698     case NEGATE_EXPR:
1699     case BIT_NOT_EXPR:
1700     case TRUTH_NOT_EXPR:
1701     case NOP_EXPR:
1702     case COMPONENT_REF:
1703     case CLEANUP_POINT_EXPR:
1704       t = copy_node (t);
1705       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1706       return t;
1707
1708     case POINTER_TYPE:
1709       tmp = build_pointer_type (mapcar (TREE_TYPE (t), func));
1710       return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1711     case REFERENCE_TYPE:
1712       tmp = build_reference_type (mapcar (TREE_TYPE (t), func));
1713       return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1714     case FUNCTION_TYPE:
1715       tmp = build_function_type (mapcar (TREE_TYPE (t), func),
1716                                  mapcar (TYPE_ARG_TYPES (t), func));
1717       return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1718     case ARRAY_TYPE:
1719       tmp = build_cplus_array_type (mapcar (TREE_TYPE (t), func),
1720                                     mapcar (TYPE_DOMAIN (t), func));
1721       return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1722     case INTEGER_TYPE:
1723       tmp = build_index_type (mapcar (TYPE_MAX_VALUE (t), func));
1724       return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1725     case OFFSET_TYPE:
1726       tmp = build_offset_type (mapcar (TYPE_OFFSET_BASETYPE (t), func),
1727                                mapcar (TREE_TYPE (t), func));
1728       return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1729     case METHOD_TYPE:
1730       tmp = build_cplus_method_type
1731         (mapcar (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), func),
1732          mapcar (TREE_TYPE (t), func),
1733          mapcar (TREE_CHAIN (TYPE_ARG_TYPES (t)), func));
1734       return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1735
1736     case COMPLEX_CST:
1737       t = copy_node (t);
1738       TREE_REALPART (t) = mapcar (TREE_REALPART (t), func);
1739       TREE_IMAGPART (t) = mapcar (TREE_REALPART (t), func);
1740       return t;
1741
1742     case CONSTRUCTOR:
1743       t = copy_node (t);
1744       CONSTRUCTOR_ELTS (t) = mapcar (CONSTRUCTOR_ELTS (t), func);
1745       return t;
1746
1747     case TEMPLATE_TEMPLATE_PARM:
1748       return copy_template_template_parm (t);
1749
1750     case BIND_EXPR:
1751       t = copy_node (t);
1752       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1753       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1754       TREE_OPERAND (t, 2) = NULL_TREE;
1755       return t;
1756
1757     case NEW_EXPR:
1758       t = copy_node (t);
1759       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1760       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1761       TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1762       return t;
1763
1764     case RECORD_TYPE:
1765       if (TYPE_PTRMEMFUNC_P (t))
1766         return build_ptrmemfunc_type
1767           (mapcar (TYPE_PTRMEMFUNC_FN_TYPE (t), func));
1768       /* else fall through */
1769       
1770       /*  This list is incomplete, but should suffice for now.
1771           It is very important that `sorry' not call
1772           `report_error_function'.  That could cause an infinite loop.  */
1773     default:
1774       sorry ("initializer contains unrecognized tree code");
1775       return error_mark_node;
1776
1777     }
1778   my_friendly_abort (107);
1779   /* NOTREACHED */
1780   return NULL_TREE;
1781 }
1782
1783 static tree
1784 perm_manip (t)
1785      tree t;
1786 {
1787   if (TREE_PERMANENT (t))
1788     return t;
1789
1790   /* Support `void f () { extern int i; A<&i> a; }' */
1791   if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == FUNCTION_DECL)
1792       && TREE_PUBLIC (t))
1793     {
1794       t = copy_node (t);
1795
1796       /* copy_rtx won't make a new SYMBOL_REF, so call make_decl_rtl again.  */
1797       DECL_RTL (t) = 0;
1798       make_decl_rtl (t, NULL_PTR, 1);
1799
1800       return t;
1801     }
1802   return NULL_TREE;
1803 }
1804
1805 /* Assuming T is a node built bottom-up, make it all exist on
1806    permanent obstack, if it is not permanent already.  */
1807
1808 tree
1809 copy_to_permanent (t)
1810      tree t;
1811 {
1812   if (t == NULL_TREE || TREE_PERMANENT (t))
1813     return t;
1814
1815   push_obstacks_nochange ();
1816   end_temporary_allocation ();
1817
1818   t = mapcar (t, perm_manip);
1819
1820   pop_obstacks ();
1821
1822   return t;
1823 }
1824
1825 #ifdef GATHER_STATISTICS
1826 extern int depth_reached;
1827 #endif
1828
1829 void
1830 print_lang_statistics ()
1831 {
1832   extern struct obstack decl_obstack;
1833   print_obstack_statistics ("class_obstack", &class_obstack);
1834   print_obstack_statistics ("decl_obstack", &decl_obstack);
1835   print_search_statistics ();
1836   print_class_statistics ();
1837 #ifdef GATHER_STATISTICS
1838   fprintf (stderr, "maximum template instantiation depth reached: %d\n",
1839            depth_reached);
1840 #endif
1841 }
1842
1843 /* This is used by the `assert' macro.  It is provided in libgcc.a,
1844    which `cc' doesn't know how to link.  Note that the C++ front-end
1845    no longer actually uses the `assert' macro (instead, it calls
1846    my_friendly_assert).  But all of the back-end files still need this.  */
1847
1848 void
1849 __eprintf (string, expression, line, filename)
1850 #ifdef __STDC__
1851      const char *string;
1852      const char *expression;
1853      unsigned line;
1854      const char *filename;
1855 #else
1856      char *string;
1857      char *expression;
1858      unsigned line;
1859      char *filename;
1860 #endif
1861 {
1862   fprintf (stderr, string, expression, line, filename);
1863   fflush (stderr);
1864   abort ();
1865 }
1866
1867 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1868    (which is an ARRAY_TYPE).  This counts only elements of the top
1869    array.  */
1870
1871 tree
1872 array_type_nelts_top (type)
1873      tree type;
1874 {
1875   return fold (build (PLUS_EXPR, sizetype,
1876                       array_type_nelts (type),
1877                       integer_one_node));
1878 }
1879
1880 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1881    (which is an ARRAY_TYPE).  This one is a recursive count of all
1882    ARRAY_TYPEs that are clumped together.  */
1883
1884 tree
1885 array_type_nelts_total (type)
1886      tree type;
1887 {
1888   tree sz = array_type_nelts_top (type);
1889   type = TREE_TYPE (type);
1890   while (TREE_CODE (type) == ARRAY_TYPE)
1891     {
1892       tree n = array_type_nelts_top (type);
1893       sz = fold (build (MULT_EXPR, sizetype, sz, n));
1894       type = TREE_TYPE (type);
1895     }
1896   return sz;
1897 }
1898
1899 static
1900 tree
1901 bot_manip (t)
1902      tree t;
1903 {
1904   if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
1905     return t;
1906   else if (TREE_CODE (t) == TARGET_EXPR)
1907     {
1908       if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR)
1909         {
1910           mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0));
1911           return build_cplus_new
1912             (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1)));
1913         }
1914       t = copy_node (t);
1915       TREE_OPERAND (t, 0) = build (VAR_DECL, TREE_TYPE (t));
1916       layout_decl (TREE_OPERAND (t, 0), 0);
1917       return t;
1918     }
1919   else if (TREE_CODE (t) == CALL_EXPR)
1920     mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
1921
1922   return NULL_TREE;
1923 }
1924   
1925 /* Actually, we'll just clean out the target exprs for the moment.  */
1926
1927 tree
1928 break_out_target_exprs (t)
1929      tree t;
1930 {
1931   return mapcar (t, bot_manip);
1932 }
1933
1934 /* Obstack used for allocating nodes in template function and variable
1935    definitions.  */
1936
1937 /* Similar to `build_nt', except we build
1938    on the permanent_obstack, regardless.  */
1939
1940 tree
1941 build_min_nt VPROTO((enum tree_code code, ...))
1942 {
1943 #ifndef __STDC__
1944   enum tree_code code;
1945 #endif
1946   register struct obstack *ambient_obstack = expression_obstack;
1947   va_list p;
1948   register tree t;
1949   register int length;
1950   register int i;
1951
1952   VA_START (p, code);
1953
1954 #ifndef __STDC__
1955   code = va_arg (p, enum tree_code);
1956 #endif
1957
1958   expression_obstack = &permanent_obstack;
1959
1960   t = make_node (code);
1961   length = tree_code_length[(int) code];
1962   TREE_COMPLEXITY (t) = lineno;
1963
1964   for (i = 0; i < length; i++)
1965     {
1966       tree x = va_arg (p, tree);
1967       TREE_OPERAND (t, i) = copy_to_permanent (x);
1968     }
1969
1970   va_end (p);
1971   expression_obstack = ambient_obstack;
1972   return t;
1973 }
1974
1975 /* Similar to `build', except we build
1976    on the permanent_obstack, regardless.  */
1977
1978 tree
1979 build_min VPROTO((enum tree_code code, tree tt, ...))
1980 {
1981 #ifndef __STDC__
1982   enum tree_code code;
1983   tree tt;
1984 #endif
1985   register struct obstack *ambient_obstack = expression_obstack;
1986   va_list p;
1987   register tree t;
1988   register int length;
1989   register int i;
1990
1991   VA_START (p, tt);
1992
1993 #ifndef __STDC__
1994   code = va_arg (p, enum tree_code);
1995   tt = va_arg (p, tree);
1996 #endif
1997
1998   expression_obstack = &permanent_obstack;
1999
2000   t = make_node (code);
2001   length = tree_code_length[(int) code];
2002   TREE_TYPE (t) = tt;
2003   TREE_COMPLEXITY (t) = lineno;
2004
2005   for (i = 0; i < length; i++)
2006     {
2007       tree x = va_arg (p, tree);
2008       TREE_OPERAND (t, i) = copy_to_permanent (x);
2009     }
2010
2011   va_end (p);
2012   expression_obstack = ambient_obstack;
2013   return t;
2014 }
2015
2016 /* Same as `tree_cons' but make a permanent object.  */
2017
2018 tree
2019 min_tree_cons (purpose, value, chain)
2020      tree purpose, value, chain;
2021 {
2022   register tree node;
2023   register struct obstack *ambient_obstack = current_obstack;
2024   current_obstack = &permanent_obstack;
2025
2026   node = tree_cons (copy_to_permanent (purpose),
2027                     copy_to_permanent (value), chain);
2028   current_obstack = ambient_obstack;
2029   return node;
2030 }
2031
2032 tree
2033 get_type_decl (t)
2034      tree t;
2035 {
2036   if (TREE_CODE (t) == TYPE_DECL)
2037     return t;
2038   if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
2039     return TYPE_STUB_DECL (t);
2040   
2041   my_friendly_abort (42);
2042
2043   /* Stop compiler from complaining control reaches end of non-void function.  */
2044   return 0;
2045 }
2046
2047 int
2048 can_free (obstack, t)
2049      struct obstack *obstack;
2050      tree t;
2051 {
2052   int size = 0;
2053
2054   if (TREE_CODE (t) == TREE_VEC)
2055     size = (TREE_VEC_LENGTH (t)-1) * sizeof (tree) + sizeof (struct tree_vec);
2056   else
2057     my_friendly_abort (42);
2058
2059 #define ROUND(x) ((x + obstack_alignment_mask (obstack)) \
2060                   & ~ obstack_alignment_mask (obstack))
2061   if ((char *)t + ROUND (size) == obstack_next_free (obstack))
2062     return 1;
2063 #undef ROUND
2064
2065   return 0;
2066 }
2067
2068 /* Return first vector element whose BINFO_TYPE is ELEM.
2069    Return 0 if ELEM is not in VEC.  VEC may be NULL_TREE.  */
2070
2071 tree
2072 vec_binfo_member (elem, vec)
2073      tree elem, vec;
2074 {
2075   int i;
2076
2077   if (vec)
2078     for (i = 0; i < TREE_VEC_LENGTH (vec); ++i)
2079       if (comptypes (elem, BINFO_TYPE (TREE_VEC_ELT (vec, i)), 1))
2080         return TREE_VEC_ELT (vec, i);
2081
2082   return NULL_TREE;
2083 }
2084
2085 /* Kludge around the fact that DECL_CONTEXT for virtual functions returns
2086    the wrong thing for decl_function_context.  Hopefully the uses in the
2087    backend won't matter, since we don't need a static chain for local class
2088    methods.  FIXME!  */
2089
2090 tree
2091 hack_decl_function_context (decl)
2092      tree decl;
2093 {
2094   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
2095     return decl_function_context (TYPE_MAIN_DECL (DECL_CLASS_CONTEXT (decl)));
2096   return decl_function_context (decl);
2097 }
2098
2099 /* Return truthvalue of whether T1 is the same tree structure as T2.
2100    Return 1 if they are the same.
2101    Return 0 if they are understandably different.
2102    Return -1 if either contains tree structure not understood by
2103    this function.  */
2104
2105 int
2106 cp_tree_equal (t1, t2)
2107      tree t1, t2;
2108 {
2109   register enum tree_code code1, code2;
2110   int cmp;
2111
2112   if (t1 == t2)
2113     return 1;
2114   if (t1 == 0 || t2 == 0)
2115     return 0;
2116
2117   code1 = TREE_CODE (t1);
2118   code2 = TREE_CODE (t2);
2119
2120   if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR)
2121     {
2122       if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR)
2123         return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2124       else
2125         return cp_tree_equal (TREE_OPERAND (t1, 0), t2);
2126     }
2127   else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR
2128            || code2 == NON_LVALUE_EXPR)
2129     return cp_tree_equal (t1, TREE_OPERAND (t2, 0));
2130
2131   if (code1 != code2)
2132     return 0;
2133
2134   switch (code1)
2135     {
2136     case INTEGER_CST:
2137       return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
2138         && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2);
2139
2140     case REAL_CST:
2141       return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2142
2143     case STRING_CST:
2144       return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2145         && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2146                   TREE_STRING_LENGTH (t1));
2147
2148     case CONSTRUCTOR:
2149       /* We need to do this when determining whether or not two
2150          non-type pointer to member function template arguments
2151          are the same.  */
2152       if (!(comptypes (TREE_TYPE (t1), TREE_TYPE (t2), 1)
2153             /* The first operand is RTL.  */
2154             && TREE_OPERAND (t1, 0) == TREE_OPERAND (t2, 0)))
2155         return 0;
2156       return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2157
2158     case TREE_LIST:
2159       cmp = cp_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2));
2160       if (cmp <= 0)
2161         return cmp;
2162       cmp = cp_tree_equal (TREE_VALUE (t1), TREE_VALUE (t2));
2163       if (cmp <= 0)
2164         return cmp;
2165       return cp_tree_equal (TREE_CHAIN (t1), TREE_CHAIN (t2));
2166
2167     case SAVE_EXPR:
2168       return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2169
2170     case CALL_EXPR:
2171       cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2172       if (cmp <= 0)
2173         return cmp;
2174       return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2175
2176     case TARGET_EXPR:
2177       /* Special case: if either target is an unallocated VAR_DECL,
2178          it means that it's going to be unified with whatever the
2179          TARGET_EXPR is really supposed to initialize, so treat it
2180          as being equivalent to anything.  */
2181       if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
2182            && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
2183            && DECL_RTL (TREE_OPERAND (t1, 0)) == 0)
2184           || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
2185               && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
2186               && DECL_RTL (TREE_OPERAND (t2, 0)) == 0))
2187         cmp = 1;
2188       else
2189         cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2190       if (cmp <= 0)
2191         return cmp;
2192       return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2193
2194     case WITH_CLEANUP_EXPR:
2195       cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2196       if (cmp <= 0)
2197         return cmp;
2198       return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
2199
2200     case COMPONENT_REF:
2201       if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
2202         return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2203       return 0;
2204
2205     case VAR_DECL:
2206     case PARM_DECL:
2207     case CONST_DECL:
2208     case FUNCTION_DECL:
2209       return 0;
2210
2211     case TEMPLATE_PARM_INDEX:
2212       return TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2)
2213         && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2);
2214
2215     case SIZEOF_EXPR:
2216     case ALIGNOF_EXPR:
2217       if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
2218         return 0;
2219       if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
2220         return comptypes (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0), 1);
2221       break;
2222
2223     default:
2224       break;
2225     }
2226
2227   switch (TREE_CODE_CLASS (code1))
2228     {
2229       int i;
2230     case '1':
2231     case '2':
2232     case '<':
2233     case 'e':
2234     case 'r':
2235     case 's':
2236       cmp = 1;
2237       for (i=0; i<tree_code_length[(int) code1]; ++i)
2238         {
2239           cmp = cp_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
2240           if (cmp <= 0)
2241             return cmp;
2242         }
2243       return cmp;
2244     }
2245
2246   return -1;
2247 }
2248
2249 /* Similar to make_tree_vec, but build on a temporary obstack.  */
2250
2251 tree
2252 make_temp_vec (len)
2253      int len;
2254 {
2255   register tree node;
2256   register struct obstack *ambient_obstack = current_obstack;
2257   current_obstack = expression_obstack;
2258   node = make_tree_vec (len);
2259   current_obstack = ambient_obstack;
2260   return node;
2261 }
2262
2263 /* Build a wrapper around some pointer PTR so we can use it as a tree.  */
2264
2265 tree
2266 build_ptr_wrapper (ptr)
2267      void *ptr;
2268 {
2269   tree t = make_node (WRAPPER);
2270   WRAPPER_PTR (t) = ptr;
2271   return t;
2272 }
2273
2274 /* Same, but on the expression_obstack.  */
2275
2276 tree
2277 build_expr_ptr_wrapper (ptr)
2278      void *ptr;
2279 {
2280   tree t;
2281   push_expression_obstack ();
2282   t = build_ptr_wrapper (ptr);
2283   pop_obstacks ();
2284   return t;
2285 }
2286
2287 /* Build a wrapper around some integer I so we can use it as a tree.  */
2288
2289 tree
2290 build_int_wrapper (i)
2291      int i;
2292 {
2293   tree t = make_node (WRAPPER);
2294   WRAPPER_INT (t) = i;
2295   return t;
2296 }
2297
2298 tree
2299 build_srcloc (file, line)
2300      char *file;
2301      int line;
2302 {
2303   tree t;
2304
2305   /* Make sure that we put these on the permanent obstack; up in
2306      add_pending_template, we pass this return value into perm_tree_cons,
2307      which also puts it on the permanent_obstack.  However, this wasn't
2308      explicitly doing the same.  */
2309   register struct obstack *ambient_obstack = current_obstack;
2310   current_obstack = &permanent_obstack;
2311
2312   t = make_node (SRCLOC);
2313   SRCLOC_FILE (t) = file;
2314   SRCLOC_LINE (t) = line;
2315
2316   current_obstack = ambient_obstack;
2317
2318   return t;
2319 }
2320
2321 tree
2322 build_srcloc_here ()
2323 {
2324   return build_srcloc (input_filename, lineno);
2325 }
2326
2327 void
2328 push_expression_obstack ()
2329 {
2330   push_obstacks_nochange ();
2331   current_obstack = expression_obstack;
2332 }
2333
2334 /* The type of ARG when used as an lvalue.  */
2335
2336 tree
2337 lvalue_type (arg)
2338      tree arg;
2339 {
2340   tree type = TREE_TYPE (arg);
2341   if (TREE_CODE (arg) == OVERLOAD)
2342     type = unknown_type_node;
2343   return cp_build_type_variant
2344     (type, TREE_READONLY (arg), TREE_THIS_VOLATILE (arg));
2345 }
2346
2347 /* The type of ARG for printing error messages; denote lvalues with
2348    reference types.  */
2349
2350 tree
2351 error_type (arg)
2352      tree arg;
2353 {
2354   tree type = TREE_TYPE (arg);
2355   if (TREE_CODE (type) == ARRAY_TYPE)
2356     ;
2357   else if (real_lvalue_p (arg))
2358     type = build_reference_type (lvalue_type (arg));
2359   else if (IS_AGGR_TYPE (type))
2360     type = lvalue_type (arg);
2361
2362   return type;
2363 }
2364
2365 /* Does FUNCTION use a variable-length argument list?  */
2366
2367 int
2368 varargs_function_p (function)
2369      tree function;
2370 {
2371   tree parm = TYPE_ARG_TYPES (TREE_TYPE (function));
2372   for (; parm; parm = TREE_CHAIN (parm))
2373     if (TREE_VALUE (parm) == void_type_node)
2374       return 0;
2375   return 1;
2376 }
2377
2378 /* Returns 1 if decl is a member of a class.  */
2379
2380 int
2381 member_p (decl)
2382      tree decl;
2383 {
2384   tree ctx = DECL_CONTEXT (decl);
2385   return (ctx && TREE_CODE_CLASS (TREE_CODE (ctx)) == 't');
2386 }