OSDN Git Service

* decl.c (build_target_expr): Set TREE_SIDE_EFFECTS on the
[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-98, 1999 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 #include "ggc.h"
31
32 static tree bot_manip PROTO((tree));
33 static tree build_cplus_array_type_1 PROTO((tree, tree));
34 static void list_hash_add PROTO((int, tree));
35 static int list_hash PROTO((tree, tree, tree));
36 static tree list_hash_lookup PROTO((int, tree, tree, tree));
37 static void propagate_binfo_offsets PROTO((tree, tree));
38 static int avoid_overlap PROTO((tree, tree));
39 static cp_lvalue_kind lvalue_p_1 PROTO((tree, int));
40 static tree no_linkage_helper PROTO((tree));
41 static tree build_srcloc PROTO((char *, int));
42 static void mark_list_hash PROTO ((void *));
43
44 #define CEIL(x,y) (((x) + (y) - 1) / (y))
45
46 /* If REF is an lvalue, returns the kind of lvalue that REF is.
47    Otherwise, returns clk_none.  If TREAT_CLASS_RVALUES_AS_LVALUES is
48    non-zero, rvalues of class type are considered lvalues.  */
49
50 static cp_lvalue_kind
51 lvalue_p_1 (ref, treat_class_rvalues_as_lvalues)
52      tree ref;
53      int treat_class_rvalues_as_lvalues;
54 {
55   cp_lvalue_kind op1_lvalue_kind = clk_none;
56   cp_lvalue_kind op2_lvalue_kind = clk_none;
57
58   if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
59     return clk_ordinary;
60
61   if (ref == current_class_ptr && flag_this_is_variable <= 0)
62     return clk_none;
63
64   switch (TREE_CODE (ref))
65     {
66       /* preincrements and predecrements are valid lvals, provided
67          what they refer to are valid lvals.  */
68     case PREINCREMENT_EXPR:
69     case PREDECREMENT_EXPR:
70     case SAVE_EXPR:
71     case UNSAVE_EXPR:
72     case TRY_CATCH_EXPR:
73     case WITH_CLEANUP_EXPR:
74     case REALPART_EXPR:
75     case IMAGPART_EXPR:
76     case NOP_EXPR:
77       return lvalue_p_1 (TREE_OPERAND (ref, 0),
78                          treat_class_rvalues_as_lvalues);
79
80     case COMPONENT_REF:
81       op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 0),
82                                     treat_class_rvalues_as_lvalues);
83       if (op1_lvalue_kind 
84           /* The "field" can be a FUNCTION_DECL or an OVERLOAD in some
85              situations.  */
86           && TREE_CODE (TREE_OPERAND (ref, 1)) == FIELD_DECL
87           && DECL_BIT_FIELD (TREE_OPERAND (ref, 1)))
88         {
89           /* Clear the ordinary bit.  If this object was a class
90              rvalue we want to preserve that information.  */
91           op1_lvalue_kind &= ~clk_ordinary;
92           /* The lvalue is for a btifield.  */
93           op1_lvalue_kind |= clk_bitfield;
94         }
95       return op1_lvalue_kind;
96
97     case STRING_CST:
98       return clk_ordinary;
99
100     case VAR_DECL:
101       if (TREE_READONLY (ref) && ! TREE_STATIC (ref)
102           && DECL_LANG_SPECIFIC (ref)
103           && DECL_IN_AGGR_P (ref))
104         return clk_none;
105     case INDIRECT_REF:
106     case ARRAY_REF:
107     case PARM_DECL:
108     case RESULT_DECL:
109       if (TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
110         return clk_ordinary;
111       break;
112
113       /* A currently unresolved scope ref.  */
114     case SCOPE_REF:
115       my_friendly_abort (103);
116     case OFFSET_REF:
117       if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL)
118         return clk_ordinary;
119       /* Fall through.  */
120     case MAX_EXPR:
121     case MIN_EXPR:
122       op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 0),
123                                     treat_class_rvalues_as_lvalues);
124       op2_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 1),
125                                     treat_class_rvalues_as_lvalues);
126       break;
127
128     case COND_EXPR:
129       op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 1),
130                                     treat_class_rvalues_as_lvalues);
131       op2_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 2),
132                                     treat_class_rvalues_as_lvalues);
133       break;
134
135     case MODIFY_EXPR:
136       return clk_ordinary;
137
138     case COMPOUND_EXPR:
139       return lvalue_p_1 (TREE_OPERAND (ref, 1),
140                          treat_class_rvalues_as_lvalues);
141
142     case TARGET_EXPR:
143       return treat_class_rvalues_as_lvalues ? clk_class : clk_none;
144
145     case CALL_EXPR:
146       return ((treat_class_rvalues_as_lvalues
147                && IS_AGGR_TYPE (TREE_TYPE (ref)))
148               ? clk_class : clk_none);
149
150     case FUNCTION_DECL:
151       /* All functions (except non-static-member functions) are
152          lvalues.  */
153       return (DECL_NONSTATIC_MEMBER_FUNCTION_P (ref) 
154               ? clk_none : clk_ordinary);
155
156     default:
157       break;
158     }
159
160   /* If one operand is not an lvalue at all, then this expression is
161      not an lvalue.  */
162   if (!op1_lvalue_kind || !op2_lvalue_kind)
163     return clk_none;
164
165   /* Otherwise, it's an lvalue, and it has all the odd properties
166      contributed by either operand.  */
167   op1_lvalue_kind = op1_lvalue_kind | op2_lvalue_kind;
168   /* It's not an ordinary lvalue if it involves either a bit-field or
169      a class rvalue.  */
170   if ((op1_lvalue_kind & ~clk_ordinary) != clk_none)
171     op1_lvalue_kind &= ~clk_ordinary;
172   return op1_lvalue_kind;
173 }
174
175 /* If REF is an lvalue, returns the kind of lvalue that REF is.
176    Otherwise, returns clk_none.  Lvalues can be assigned, unless they
177    have TREE_READONLY, or unless they are FUNCTION_DECLs.  Lvalues can
178    have their address taken, unless they have DECL_REGISTER.  */
179
180 cp_lvalue_kind
181 real_lvalue_p (ref)
182      tree ref;
183 {
184   return lvalue_p_1 (ref, /*treat_class_rvalues_as_lvalues=*/0);
185 }
186
187 /* This differs from real_lvalue_p in that class rvalues are
188    considered lvalues.  */
189
190 int
191 lvalue_p (ref)
192      tree ref;
193 {
194   return 
195     (lvalue_p_1 (ref, /*treat_class_rvalues_as_lvalues=*/1) != clk_none);
196 }
197
198 /* Return nonzero if REF is an lvalue valid for this language;
199    otherwise, print an error message and return zero.  */
200
201 int
202 lvalue_or_else (ref, string)
203      tree ref;
204      const char *string;
205 {
206   int win = lvalue_p (ref);
207   if (! win)
208     error ("non-lvalue in %s", string);
209   return win;
210 }
211
212 /* INIT is a CALL_EXPR which needs info about its target.
213    TYPE is the type that this initialization should appear to have.
214
215    Build an encapsulation of the initialization to perform
216    and return it so that it can be processed by language-independent
217    and language-specific expression expanders.  */
218
219 tree
220 build_cplus_new (type, init)
221      tree type;
222      tree init;
223 {
224   tree fn;
225   tree slot;
226   tree rval;
227
228   /* Make sure that we're not trying to create an instance of an
229      abstract class.  */
230   abstract_virtuals_error (NULL_TREE, type);
231
232   if (TREE_CODE (init) != CALL_EXPR && TREE_CODE (init) != AGGR_INIT_EXPR)
233     return convert (type, init);
234
235   slot = build (VAR_DECL, type);
236   DECL_ARTIFICIAL (slot) = 1;
237   layout_decl (slot, 0);
238
239   /* We split the CALL_EXPR into its function and its arguments here.
240      Then, in expand_expr, we put them back together.  The reason for
241      this is that this expression might be a default argument
242      expression.  In that case, we need a new temporary every time the
243      expression is used.  That's what break_out_target_exprs does; it
244      replaces every AGGR_INIT_EXPR with a copy that uses a fresh
245      temporary slot.  Then, expand_expr builds up a call-expression
246      using the new slot.  */
247   fn = TREE_OPERAND (init, 0);
248   rval = build (AGGR_INIT_EXPR, type, fn, TREE_OPERAND (init, 1), slot);
249   TREE_SIDE_EFFECTS (rval) = 1;
250   AGGR_INIT_VIA_CTOR_P (rval) 
251     = (TREE_CODE (fn) == ADDR_EXPR
252        && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
253        && DECL_CONSTRUCTOR_P (TREE_OPERAND (fn, 0)));
254   rval = build_target_expr (slot, rval);
255
256   return rval;
257 }
258
259 /* Encapsulate the expression INIT in a TARGET_EXPR.  */
260
261 tree
262 get_target_expr (init)
263      tree init;
264 {
265   tree slot;
266   tree rval;
267
268   slot = build (VAR_DECL, TREE_TYPE (init));
269   DECL_ARTIFICIAL (slot) = 1;
270   layout_decl (slot, 0);
271   rval = build_target_expr (slot, init);
272
273   return rval;
274 }
275
276 /* Recursively search EXP for CALL_EXPRs that need cleanups and replace
277    these CALL_EXPRs with tree nodes that will perform the cleanups.  */
278
279 tree
280 break_out_cleanups (exp)
281      tree exp;
282 {
283   tree tmp = exp;
284
285   if (TREE_CODE (tmp) == CALL_EXPR
286       && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (tmp)))
287     return build_cplus_new (TREE_TYPE (tmp), tmp);
288
289   while (TREE_CODE (tmp) == NOP_EXPR
290          || TREE_CODE (tmp) == CONVERT_EXPR
291          || TREE_CODE (tmp) == NON_LVALUE_EXPR)
292     {
293       if (TREE_CODE (TREE_OPERAND (tmp, 0)) == CALL_EXPR
294           && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (TREE_OPERAND (tmp, 0))))
295         {
296           TREE_OPERAND (tmp, 0)
297             = build_cplus_new (TREE_TYPE (TREE_OPERAND (tmp, 0)),
298                                TREE_OPERAND (tmp, 0));
299           break;
300         }
301       else
302         tmp = TREE_OPERAND (tmp, 0);
303     }
304   return exp;
305 }
306
307 /* Recursively perform a preorder search EXP for CALL_EXPRs, making
308    copies where they are found.  Returns a deep copy all nodes transitively
309    containing CALL_EXPRs.  */
310
311 tree
312 break_out_calls (exp)
313      tree exp;
314 {
315   register tree t1, t2 = NULL_TREE;
316   register enum tree_code code;
317   register int changed = 0;
318   register int i;
319
320   if (exp == NULL_TREE)
321     return exp;
322
323   code = TREE_CODE (exp);
324
325   if (code == CALL_EXPR)
326     return copy_node (exp);
327
328   /* Don't try and defeat a save_expr, as it should only be done once.  */
329     if (code == SAVE_EXPR)
330        return exp;
331
332   switch (TREE_CODE_CLASS (code))
333     {
334     default:
335       abort ();
336
337     case 'c':  /* a constant */
338     case 't':  /* a type node */
339     case 'x':  /* something random, like an identifier or an ERROR_MARK.  */
340       return exp;
341
342     case 'd':  /* A decl node */
343 #if 0                               /* This is bogus.  jason 9/21/94 */
344
345       t1 = break_out_calls (DECL_INITIAL (exp));
346       if (t1 != DECL_INITIAL (exp))
347         {
348           exp = copy_node (exp);
349           DECL_INITIAL (exp) = t1;
350         }
351 #endif
352       return exp;
353
354     case 'b':  /* A block node */
355       {
356         /* Don't know how to handle these correctly yet.   Must do a
357            break_out_calls on all DECL_INITIAL values for local variables,
358            and also break_out_calls on all sub-blocks and sub-statements.  */
359         abort ();
360       }
361       return exp;
362
363     case 'e':  /* an expression */
364     case 'r':  /* a reference */
365     case 's':  /* an expression with side effects */
366       for (i = tree_code_length[(int) code] - 1; i >= 0; i--)
367         {
368           t1 = break_out_calls (TREE_OPERAND (exp, i));
369           if (t1 != TREE_OPERAND (exp, i))
370             {
371               exp = copy_node (exp);
372               TREE_OPERAND (exp, i) = t1;
373             }
374         }
375       return exp;
376
377     case '<':  /* a comparison expression */
378     case '2':  /* a binary arithmetic expression */
379       t2 = break_out_calls (TREE_OPERAND (exp, 1));
380       if (t2 != TREE_OPERAND (exp, 1))
381         changed = 1;
382     case '1':  /* a unary arithmetic expression */
383       t1 = break_out_calls (TREE_OPERAND (exp, 0));
384       if (t1 != TREE_OPERAND (exp, 0))
385         changed = 1;
386       if (changed)
387         {
388           if (tree_code_length[(int) code] == 1)
389             return build1 (code, TREE_TYPE (exp), t1);
390           else
391             return build (code, TREE_TYPE (exp), t1, t2);
392         }
393       return exp;
394     }
395
396 }
397 \f
398 extern struct obstack *current_obstack;
399 extern struct obstack permanent_obstack, class_obstack;
400 extern struct obstack *saveable_obstack;
401 extern struct obstack *expression_obstack;
402
403 /* Here is how primitive or already-canonicalized types' hash
404    codes are made.  MUST BE CONSISTENT WITH tree.c !!! */
405 #define TYPE_HASH(TYPE) ((HOST_WIDE_INT) (TYPE) & 0777777)
406
407 /* Construct, lay out and return the type of methods belonging to class
408    BASETYPE and whose arguments are described by ARGTYPES and whose values
409    are described by RETTYPE.  If each type exists already, reuse it.  */
410
411 tree
412 build_cplus_method_type (basetype, rettype, argtypes)
413      tree basetype, rettype, argtypes;
414 {
415   register tree t;
416   tree ptype;
417   int hashcode;
418
419   /* Make a node of the sort we want.  */
420   t = make_node (METHOD_TYPE);
421
422   TYPE_METHOD_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype);
423   TREE_TYPE (t) = rettype;
424   ptype = build_pointer_type (basetype);
425
426   /* The actual arglist for this function includes a "hidden" argument
427      which is "this".  Put it into the list of argument types.  Make
428      sure that the new argument list is allocated on the same obstack
429      as the type.  */
430   push_obstacks (TYPE_OBSTACK (t), TYPE_OBSTACK (t));
431   argtypes = tree_cons (NULL_TREE, ptype, argtypes);
432   TYPE_ARG_TYPES (t) = argtypes;
433   TREE_SIDE_EFFECTS (argtypes) = 1;  /* Mark first argtype as "artificial".  */
434   pop_obstacks ();
435
436   /* If we already have such a type, use the old one and free this one.
437      Note that it also frees up the above cons cell if found.  */
438   hashcode = TYPE_HASH (basetype) + TYPE_HASH (rettype) +
439     type_hash_list (argtypes);
440
441   t = type_hash_canon (hashcode, t);
442
443   if (TYPE_SIZE (t) == 0)
444     layout_type (t);
445
446   return t;
447 }
448
449 static tree
450 build_cplus_array_type_1 (elt_type, index_type)
451      tree elt_type;
452      tree index_type;
453 {
454   tree t;
455
456   if (elt_type == error_mark_node || index_type == error_mark_node)
457     return error_mark_node;
458
459   if (processing_template_decl 
460       || uses_template_parms (elt_type) 
461       || uses_template_parms (index_type))
462     {
463       t = make_node (ARRAY_TYPE);
464       TREE_TYPE (t) = elt_type;
465       TYPE_DOMAIN (t) = index_type;
466     }
467   else
468     t = build_array_type (elt_type, index_type);
469
470   /* Push these needs up so that initialization takes place
471      more easily.  */
472   TYPE_NEEDS_CONSTRUCTING (t) 
473     = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (elt_type));
474   TYPE_NEEDS_DESTRUCTOR (t) 
475     = TYPE_NEEDS_DESTRUCTOR (TYPE_MAIN_VARIANT (elt_type));
476   return t;
477 }
478
479 tree
480 build_cplus_array_type (elt_type, index_type)
481      tree elt_type;
482      tree index_type;
483 {
484   tree t;
485   int type_quals = CP_TYPE_QUALS (elt_type);
486
487   elt_type = TYPE_MAIN_VARIANT (elt_type);
488
489   t = build_cplus_array_type_1 (elt_type, index_type);
490
491   if (type_quals != TYPE_UNQUALIFIED)
492     t = cp_build_qualified_type (t, type_quals);
493
494   return t;
495 }
496 \f
497 /* Make a variant of TYPE, qualified with the TYPE_QUALS.  Handles
498    arrays correctly.  In particular, if TYPE is an array of T's, and
499    TYPE_QUALS is non-empty, returns an array of qualified T's.  If
500    at attempt is made to qualify a type illegally, and COMPLAIN is
501    non-zero, an error is issued.  If COMPLAIN is zero, error_mark_node
502    is returned.  */
503
504 tree
505 cp_build_qualified_type_real (type, type_quals, complain)
506      tree type;
507      int type_quals;
508      int complain;
509 {
510   tree result;
511
512   if (type == error_mark_node)
513     return type;
514
515   if (type_quals == TYPE_QUALS (type))
516     return type;
517
518   /* A restrict-qualified pointer type must be a pointer (or reference)
519      to object or incomplete type.  */
520   if ((type_quals & TYPE_QUAL_RESTRICT)
521       && TREE_CODE (type) != TEMPLATE_TYPE_PARM
522       && (!POINTER_TYPE_P (type)
523           || TYPE_PTRMEM_P (type)
524           || TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE))
525     {
526       if (complain)
527         cp_error ("`%T' cannot be `restrict'-qualified", type);
528       else
529         return error_mark_node;
530
531       type_quals &= ~TYPE_QUAL_RESTRICT;
532     }
533
534   if (type_quals != TYPE_UNQUALIFIED
535       && TREE_CODE (type) == FUNCTION_TYPE)
536     {
537       if (complain)
538         cp_error ("`%T' cannot be `const'-, `volatile'-, or `restrict'-qualified", type);
539       else
540         return error_mark_node;
541       type_quals = TYPE_UNQUALIFIED;
542     }
543   else if (TREE_CODE (type) == ARRAY_TYPE)
544     {
545       /* In C++, the qualification really applies to the array element
546          type.  Obtain the appropriately qualified element type.  */
547       tree t;
548       tree element_type 
549         = cp_build_qualified_type_real (TREE_TYPE (type), 
550                                         type_quals,
551                                         complain);
552
553       if (element_type == error_mark_node)
554         return error_mark_node;
555
556       /* See if we already have an identically qualified type.  */
557       for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
558         if (CP_TYPE_QUALS (t) == type_quals)
559           break;
560
561       /* If we didn't already have it, create it now.  */
562       if (!t)
563         {
564           /* Make a new array type, just like the old one, but with the
565              appropriately qualified element type.  */
566           t = build_type_copy (type);
567           TREE_TYPE (t) = element_type;
568         }
569
570       /* Even if we already had this variant, we update
571          TYPE_NEEDS_CONSTRUCTING and TYPE_NEEDS_DESTRUCTOR in case
572          they changed since the variant was originally created.  
573          
574          This seems hokey; if there is some way to use a previous
575          variant *without* coming through here,
576          TYPE_NEEDS_CONSTRUCTING will never be updated.  */
577       TYPE_NEEDS_CONSTRUCTING (t) 
578         = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (element_type));
579       TYPE_NEEDS_DESTRUCTOR (t) 
580         = TYPE_NEEDS_DESTRUCTOR (TYPE_MAIN_VARIANT (element_type));
581       return t;
582     }
583   else if (TYPE_PTRMEMFUNC_P (type))
584     {
585       /* For a pointer-to-member type, we can't just return a
586          cv-qualified version of the RECORD_TYPE.  If we do, we
587          haven't change the field that contains the actual pointer to
588          a method, and so TYPE_PTRMEMFUNC_FN_TYPE will be wrong.  */
589       tree t;
590
591       t = TYPE_PTRMEMFUNC_FN_TYPE (type);
592       t = cp_build_qualified_type_real (t, type_quals, complain);
593       return build_ptrmemfunc_type (t);
594     }
595
596   /* Retrieve (or create) the appropriately qualified variant.  */
597   result = build_qualified_type (type, type_quals);
598
599   /* If this was a pointer-to-method type, and we just made a copy,
600      then we need to clear the cached associated
601      pointer-to-member-function type; it is not valid for the new
602      type.  */
603   if (result != type 
604       && TREE_CODE (type) == POINTER_TYPE
605       && TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE)
606     TYPE_SET_PTRMEMFUNC_TYPE (result, NULL_TREE);
607
608   return result;
609 }
610
611 /* Returns the canonical version of TYPE.  In other words, if TYPE is
612    a typedef, returns the underlying type.  The cv-qualification of
613    the type returned matches the type input; they will always be
614    compatible types.  */
615
616 tree
617 canonical_type_variant (t)
618      tree t;
619 {
620   return cp_build_qualified_type (TYPE_MAIN_VARIANT (t), CP_TYPE_QUALS (t));
621 }
622 \f
623 /* Add OFFSET to all base types of T.
624
625    OFFSET, which is a type offset, is number of bytes.
626
627    Note that we don't have to worry about having two paths to the
628    same base type, since this type owns its association list.  */
629
630 static void
631 propagate_binfo_offsets (binfo, offset)
632      tree binfo;
633      tree offset;
634 {
635   tree binfos = BINFO_BASETYPES (binfo);
636   int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
637
638   for (i = 0; i < n_baselinks; /* note increment is done in the loop.  */)
639     {
640       tree base_binfo = TREE_VEC_ELT (binfos, i);
641
642       if (TREE_VIA_VIRTUAL (base_binfo))
643         i += 1;
644       else
645         {
646           int j;
647           tree delta = NULL_TREE;
648
649           for (j = i+1; j < n_baselinks; j++)
650             if (! TREE_VIA_VIRTUAL (TREE_VEC_ELT (binfos, j)))
651               {
652                 /* The next basetype offset must take into account the space
653                    between the classes, not just the size of each class.  */
654                 delta = size_binop (MINUS_EXPR,
655                                     BINFO_OFFSET (TREE_VEC_ELT (binfos, j)),
656                                     BINFO_OFFSET (base_binfo));
657                 break;
658               }
659
660 #if 0
661           if (BINFO_OFFSET_ZEROP (base_binfo))
662             BINFO_OFFSET (base_binfo) = offset;
663           else
664             BINFO_OFFSET (base_binfo)
665               = size_binop (PLUS_EXPR, BINFO_OFFSET (base_binfo), offset);
666 #else
667           BINFO_OFFSET (base_binfo) = offset;
668 #endif
669
670           propagate_binfo_offsets (base_binfo, offset);
671
672           /* Go to our next class that counts for offset propagation.  */
673           i = j;
674           if (i < n_baselinks)
675             offset = size_binop (PLUS_EXPR, offset, delta);
676         }
677     }
678 }
679
680 /* Makes new binfos for the indirect bases under BINFO, and updates
681    BINFO_OFFSET for them and their bases.  */
682
683 void
684 unshare_base_binfos (binfo)
685      tree binfo;
686 {
687   tree binfos = BINFO_BASETYPES (binfo);
688   tree new_binfo;
689   int j;
690
691   if (binfos == NULL_TREE)
692     return;
693
694   /* Now unshare the structure beneath BINFO.  */
695   for (j = TREE_VEC_LENGTH (binfos)-1;
696        j >= 0; j--)
697     {
698       tree base_binfo = TREE_VEC_ELT (binfos, j);
699       new_binfo = TREE_VEC_ELT (binfos, j)
700         = make_binfo (BINFO_OFFSET (base_binfo),
701                       base_binfo,
702                       BINFO_VTABLE (base_binfo),
703                       BINFO_VIRTUALS (base_binfo));
704       TREE_VIA_PUBLIC (new_binfo) = TREE_VIA_PUBLIC (base_binfo);
705       TREE_VIA_PROTECTED (new_binfo) = TREE_VIA_PROTECTED (base_binfo);
706       TREE_VIA_VIRTUAL (new_binfo) = TREE_VIA_VIRTUAL (base_binfo);
707       BINFO_INHERITANCE_CHAIN (new_binfo) = binfo;
708       unshare_base_binfos (new_binfo);
709     }
710 }
711
712 /* Finish the work of layout_record, now taking virtual bases into account.
713    Also compute the actual offsets that our base classes will have.
714    This must be performed after the fields are laid out, since virtual
715    baseclasses must lay down at the end of the record.
716
717    Returns the maximum number of virtual functions any of the
718    baseclasses provide.  */
719
720 int
721 layout_basetypes (rec, max)
722      tree rec;
723      int max;
724 {
725   tree binfos = TYPE_BINFO_BASETYPES (rec);
726   int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
727
728   tree vbase_types;
729
730   unsigned int record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
731   unsigned int desired_align;
732
733   /* Record size so far is CONST_SIZE bits, where CONST_SIZE is an integer.  */
734   register unsigned int const_size = 0;
735   unsigned int nonvirtual_const_size;
736
737 #ifdef STRUCTURE_SIZE_BOUNDARY
738   /* Packed structures don't need to have minimum size.  */
739   if (! TYPE_PACKED (rec))
740     record_align = MAX (record_align, STRUCTURE_SIZE_BOUNDARY);
741 #endif
742
743   /* Get all the virtual base types that this type uses.  The
744      TREE_VALUE slot holds the virtual baseclass type.  Note that
745      get_vbase_types makes copies of the virtual base BINFOs, so that
746      the vbase_types are unshared.  */
747   vbase_types = CLASSTYPE_VBASECLASSES (rec);
748
749   my_friendly_assert (TREE_CODE (TYPE_SIZE (rec)) == INTEGER_CST, 19970302);
750   const_size = TREE_INT_CST_LOW (TYPE_SIZE (rec));
751
752   nonvirtual_const_size = const_size;
753
754   while (vbase_types)
755     {
756       tree basetype = BINFO_TYPE (vbase_types);
757       tree offset;
758
759       desired_align = TYPE_ALIGN (basetype);
760       record_align = MAX (record_align, desired_align);
761
762       if (const_size == 0)
763         offset = integer_zero_node;
764       else
765         {
766           /* Give each virtual base type the alignment it wants.  */
767           const_size = CEIL (const_size, desired_align) * desired_align;
768           offset = size_int (CEIL (const_size, BITS_PER_UNIT));
769         }
770
771       if (CLASSTYPE_VSIZE (basetype) > max)
772         max = CLASSTYPE_VSIZE (basetype);
773       BINFO_OFFSET (vbase_types) = offset;
774
775       /* Every virtual baseclass takes a least a UNIT, so that we can
776          take it's address and get something different for each base.  */
777       const_size += MAX (BITS_PER_UNIT,
778                          TREE_INT_CST_LOW (CLASSTYPE_SIZE (basetype)));
779
780       vbase_types = TREE_CHAIN (vbase_types);
781     }
782
783   if (const_size)
784     {
785       /* Because a virtual base might take a single byte above,
786          we have to re-adjust the total size to make sure it is
787          a multiple of the alignment.  */
788       /* Give the whole object the alignment it wants.  */
789       const_size = CEIL (const_size, record_align) * record_align;
790     }
791
792   /* Set the alignment in the complete type.  We don't set CLASSTYPE_ALIGN
793    here, as that is for this class, without any virtual base classes.  */
794   TYPE_ALIGN (rec) = record_align;
795   if (const_size != nonvirtual_const_size)
796     {
797       TYPE_SIZE (rec) = size_int (const_size);
798       TYPE_SIZE_UNIT (rec) = size_binop (FLOOR_DIV_EXPR, TYPE_SIZE (rec),
799                                          size_int (BITS_PER_UNIT));
800     }
801
802   /* Now propagate offset information throughout the lattice.  */
803   for (i = 0; i < n_baseclasses; i++)
804     {
805       register tree base_binfo = TREE_VEC_ELT (binfos, i);
806       register tree basetype = BINFO_TYPE (base_binfo);
807       tree field = TYPE_FIELDS (rec);
808
809       if (TREE_VIA_VIRTUAL (base_binfo))
810         continue;
811
812       my_friendly_assert (TREE_TYPE (field) == basetype, 23897);
813
814       if (get_base_distance (basetype, rec, 0, (tree*)0) == -2)
815         cp_warning ("direct base `%T' inaccessible in `%T' due to ambiguity",
816                     basetype, rec);
817
818       BINFO_OFFSET (base_binfo)
819         = size_int (CEIL (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)),
820                           BITS_PER_UNIT));
821       propagate_binfo_offsets (base_binfo, BINFO_OFFSET (base_binfo));
822       TYPE_FIELDS (rec) = TREE_CHAIN (field);
823     }
824
825   for (vbase_types = CLASSTYPE_VBASECLASSES (rec); vbase_types;
826        vbase_types = TREE_CHAIN (vbase_types))
827     {
828       BINFO_INHERITANCE_CHAIN (vbase_types) = TYPE_BINFO (rec);
829       unshare_base_binfos (vbase_types);
830       propagate_binfo_offsets (vbase_types, BINFO_OFFSET (vbase_types));
831
832       if (extra_warnings)
833         {
834           tree basetype = BINFO_TYPE (vbase_types);
835           if (get_base_distance (basetype, rec, 0, (tree*)0) == -2)
836             cp_warning ("virtual base `%T' inaccessible in `%T' due to ambiguity",
837                         basetype, rec);
838         }
839     }
840
841   return max;
842 }
843
844 /* If the empty base field in DECL overlaps with a base of the same type in
845    NEWDECL, which is either another base field or the first data field of
846    the class, pad the base just before NEWDECL and return 1.  Otherwise,
847    return 0.  */
848
849 static int
850 avoid_overlap (decl, newdecl)
851      tree decl, newdecl;
852 {
853   tree field;
854
855   if (newdecl == NULL_TREE
856       || ! types_overlap_p (TREE_TYPE (decl), TREE_TYPE (newdecl)))
857     return 0;
858
859   for (field = decl; TREE_CHAIN (field) && TREE_CHAIN (field) != newdecl;
860        field = TREE_CHAIN (field))
861     ;
862
863   DECL_SIZE (field) = integer_one_node;
864
865   return 1;
866 }
867
868 /* Returns a list of fields to stand in for the base class subobjects
869    of REC.  These fields are later removed by layout_basetypes.  */
870
871 tree
872 build_base_fields (rec)
873      tree rec;
874 {
875   /* Chain to hold all the new FIELD_DECLs which stand in for base class
876      subobjects.  */
877   tree base_decls = NULL_TREE;
878   tree binfos = TYPE_BINFO_BASETYPES (rec);
879   int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
880   tree decl, nextdecl;
881   int i, saw_empty = 0;
882   unsigned int base_align = 0;
883
884   for (i = 0; i < n_baseclasses; ++i)
885     {
886       register tree base_binfo = TREE_VEC_ELT (binfos, i);
887       register tree basetype = BINFO_TYPE (base_binfo);
888
889       if (TYPE_SIZE (basetype) == 0)
890         /* This error is now reported in xref_tag, thus giving better
891            location information.  */
892         continue;
893
894       if (TREE_VIA_VIRTUAL (base_binfo))
895         continue;
896
897       decl = build_lang_decl (FIELD_DECL, NULL_TREE, basetype);
898       DECL_ARTIFICIAL (decl) = 1;
899       DECL_FIELD_CONTEXT (decl) = DECL_CLASS_CONTEXT (decl) = rec;
900       DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
901       DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
902       TREE_CHAIN (decl) = base_decls;
903       base_decls = decl;
904
905       if (! flag_new_abi)
906         {
907           /* Brain damage for backwards compatibility.  For no good reason,
908              the old layout_basetypes made every base at least as large as
909              the alignment for the bases up to that point, gratuitously
910              wasting space.  So we do the same thing here.  */
911           base_align = MAX (base_align, DECL_ALIGN (decl));
912           DECL_SIZE (decl)
913             = size_int (MAX (TREE_INT_CST_LOW (DECL_SIZE (decl)),
914                              (int) base_align));
915         }
916       else if (DECL_SIZE (decl) == integer_zero_node)
917         saw_empty = 1;
918     }
919
920   /* Reverse the list of fields so we allocate the bases in the proper
921      order.  */
922   base_decls = nreverse (base_decls);
923
924   /* In the presence of empty base classes, we run the risk of allocating
925      two objects of the same class on top of one another.  Avoid that.  */
926   if (flag_new_abi && saw_empty)
927     for (decl = base_decls; decl; decl = TREE_CHAIN (decl))
928       {
929         if (DECL_SIZE (decl) == integer_zero_node)
930           {
931             /* First step through the following bases until we find
932                an overlap or a non-empty base.  */
933             for (nextdecl = TREE_CHAIN (decl); nextdecl;
934                  nextdecl = TREE_CHAIN (nextdecl))
935               {
936                 if (avoid_overlap (decl, nextdecl)
937                     || DECL_SIZE (nextdecl) != integer_zero_node)
938                   goto nextbase;
939               }
940
941             /* If we're still looking, also check against the first
942                field.  */
943             for (nextdecl = TYPE_FIELDS (rec);
944                  nextdecl && TREE_CODE (nextdecl) != FIELD_DECL;
945                  nextdecl = TREE_CHAIN (nextdecl))
946               /* keep looking */;
947             avoid_overlap (decl, nextdecl);
948           }
949       nextbase:;
950       }
951
952   return base_decls;
953 }
954
955 /* Returns list of virtual base class pointers in a FIELD_DECL chain.  */
956
957 tree
958 build_vbase_pointer_fields (rec)
959      tree rec;
960 {
961   /* Chain to hold all the new FIELD_DECLs which point at virtual
962      base classes.  */
963   tree vbase_decls = NULL_TREE;
964   tree binfos = TYPE_BINFO_BASETYPES (rec);
965   int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
966   tree decl;
967   int i;
968
969   /* Handle basetypes almost like fields, but record their
970      offsets differently.  */
971
972   for (i = 0; i < n_baseclasses; i++)
973     {
974       register tree base_binfo = TREE_VEC_ELT (binfos, i);
975       register tree basetype = BINFO_TYPE (base_binfo);
976
977       if (TYPE_SIZE (basetype) == 0)
978         /* This error is now reported in xref_tag, thus giving better
979            location information.  */
980         continue;
981
982       /* All basetypes are recorded in the association list of the
983          derived type.  */
984
985       if (TREE_VIA_VIRTUAL (base_binfo))
986         {
987           int j;
988           const char *name;
989
990           /* The offset for a virtual base class is only used in computing
991              virtual function tables and for initializing virtual base
992              pointers.  It is built once `get_vbase_types' is called.  */
993
994           /* If this basetype can come from another vbase pointer
995              without an additional indirection, we will share
996              that pointer.  If an indirection is involved, we
997              make our own pointer.  */
998           for (j = 0; j < n_baseclasses; j++)
999             {
1000               tree other_base_binfo = TREE_VEC_ELT (binfos, j);
1001               if (! TREE_VIA_VIRTUAL (other_base_binfo)
1002                   && binfo_member (basetype,
1003                                    CLASSTYPE_VBASECLASSES (BINFO_TYPE
1004                                                            (other_base_binfo))
1005                                    ))
1006                 goto got_it;
1007             }
1008           FORMAT_VBASE_NAME (name, basetype);
1009           decl = build_lang_decl (FIELD_DECL, get_identifier (name),
1010                                   build_pointer_type (basetype));
1011           /* If you change any of the below, take a look at all the
1012              other VFIELD_BASEs and VTABLE_BASEs in the code, and change
1013              them too.  */
1014           DECL_ASSEMBLER_NAME (decl) = get_identifier (VTABLE_BASE);
1015           DECL_VIRTUAL_P (decl) = 1;
1016           DECL_ARTIFICIAL (decl) = 1;
1017           DECL_FIELD_CONTEXT (decl) = rec;
1018           DECL_CLASS_CONTEXT (decl) = rec;
1019           DECL_FCONTEXT (decl) = basetype;
1020           DECL_SAVED_INSNS (decl) = 0;
1021           DECL_FIELD_SIZE (decl) = 0;
1022           DECL_ALIGN (decl) = TYPE_ALIGN (ptr_type_node);
1023           TREE_CHAIN (decl) = vbase_decls;
1024           BINFO_VPTR_FIELD (base_binfo) = decl;
1025           vbase_decls = decl;
1026
1027         got_it:
1028           /* The space this decl occupies has already been accounted for.  */
1029           ;
1030         }
1031     }
1032
1033   return vbase_decls;
1034 }
1035 \f
1036 /* Hashing of lists so that we don't make duplicates.
1037    The entry point is `list_hash_canon'.  */
1038
1039 /* Each hash table slot is a bucket containing a chain
1040    of these structures.  */
1041
1042 struct list_hash
1043 {
1044   struct list_hash *next;       /* Next structure in the bucket.  */
1045   int hashcode;                 /* Hash code of this list.  */
1046   tree list;                    /* The list recorded here.  */
1047 };
1048
1049 /* Now here is the hash table.  When recording a list, it is added
1050    to the slot whose index is the hash code mod the table size.
1051    Note that the hash table is used for several kinds of lists.
1052    While all these live in the same table, they are completely independent,
1053    and the hash code is computed differently for each of these.  */
1054
1055 #define TYPE_HASH_SIZE 59
1056 static struct list_hash *list_hash_table[TYPE_HASH_SIZE];
1057
1058 /* Compute a hash code for a list (chain of TREE_LIST nodes
1059    with goodies in the TREE_PURPOSE, TREE_VALUE, and bits of the
1060    TREE_COMMON slots), by adding the hash codes of the individual entries.  */
1061
1062 static int
1063 list_hash (purpose, value, chain)
1064      tree purpose, value, chain;
1065 {
1066   register int hashcode = 0;
1067
1068   if (chain)
1069     hashcode += TYPE_HASH (chain);
1070
1071   if (value)
1072     hashcode += TYPE_HASH (value);
1073   else
1074     hashcode += 1007;
1075   if (purpose)
1076     hashcode += TYPE_HASH (purpose);
1077   else
1078     hashcode += 1009;
1079   return hashcode;
1080 }
1081
1082 /* Look in the type hash table for a type isomorphic to TYPE.
1083    If one is found, return it.  Otherwise return 0.  */
1084
1085 static tree
1086 list_hash_lookup (hashcode, purpose, value, chain)
1087      int hashcode;
1088      tree purpose, value, chain;
1089 {
1090   register struct list_hash *h;
1091
1092   for (h = list_hash_table[hashcode % TYPE_HASH_SIZE]; h; h = h->next)
1093     if (h->hashcode == hashcode
1094         && TREE_PURPOSE (h->list) == purpose
1095         && TREE_VALUE (h->list) == value
1096         && TREE_CHAIN (h->list) == chain)
1097       return h->list;
1098   return 0;
1099 }
1100
1101 /* Add an entry to the list-hash-table
1102    for a list TYPE whose hash code is HASHCODE.  */
1103
1104 static void
1105 list_hash_add (hashcode, list)
1106      int hashcode;
1107      tree list;
1108 {
1109   register struct list_hash *h;
1110
1111   h = (struct list_hash *) obstack_alloc (&class_obstack, sizeof (struct list_hash));
1112   h->hashcode = hashcode;
1113   h->list = list;
1114   h->next = list_hash_table[hashcode % TYPE_HASH_SIZE];
1115   list_hash_table[hashcode % TYPE_HASH_SIZE] = h;
1116 }
1117
1118 /* Given list components PURPOSE, VALUE, AND CHAIN, return the canonical
1119    object for an identical list if one already exists.  Otherwise, build a
1120    new one, and record it as the canonical object.  */
1121
1122 /* Set to 1 to debug without canonicalization.  Never set by program.  */
1123
1124 static int debug_no_list_hash = 0;
1125
1126 tree
1127 hash_tree_cons (purpose, value, chain)
1128      tree purpose, value, chain;
1129 {
1130   struct obstack *ambient_obstack = current_obstack;
1131   tree t;
1132   int hashcode = 0;
1133
1134   if (! debug_no_list_hash)
1135     {
1136       hashcode = list_hash (purpose, value, chain);
1137       t = list_hash_lookup (hashcode, purpose, value, chain);
1138       if (t)
1139         return t;
1140     }
1141
1142   current_obstack = &class_obstack;
1143
1144   t = tree_cons (purpose, value, chain);
1145
1146   /* If this is a new list, record it for later reuse.  */
1147   if (! debug_no_list_hash)
1148     list_hash_add (hashcode, t);
1149
1150   current_obstack = ambient_obstack;
1151   return t;
1152 }
1153
1154 /* Constructor for hashed lists.  */
1155
1156 tree
1157 hash_tree_chain (value, chain)
1158      tree value, chain;
1159 {
1160   return hash_tree_cons (NULL_TREE, value, chain);
1161 }
1162
1163 /* Similar, but used for concatenating two lists.  */
1164
1165 tree
1166 hash_chainon (list1, list2)
1167      tree list1, list2;
1168 {
1169   if (list2 == 0)
1170     return list1;
1171   if (list1 == 0)
1172     return list2;
1173   if (TREE_CHAIN (list1) == NULL_TREE)
1174     return hash_tree_chain (TREE_VALUE (list1), list2);
1175   return hash_tree_chain (TREE_VALUE (list1),
1176                           hash_chainon (TREE_CHAIN (list1), list2));
1177 }
1178 \f
1179 /* Build an association between TYPE and some parameters:
1180
1181    OFFSET is the offset added to `this' to convert it to a pointer
1182    of type `TYPE *'
1183
1184    BINFO is the base binfo to use, if we are deriving from one.  This
1185    is necessary, as we want specialized parent binfos from base
1186    classes, so that the VTABLE_NAMEs of bases are for the most derived
1187    type, instead of the simple type.
1188
1189    VTABLE is the virtual function table with which to initialize
1190    sub-objects of type TYPE.
1191
1192    VIRTUALS are the virtual functions sitting in VTABLE.  */
1193
1194 tree
1195 make_binfo (offset, binfo, vtable, virtuals)
1196      tree offset, binfo;
1197      tree vtable, virtuals;
1198 {
1199   tree new_binfo = make_tree_vec (7);
1200   tree type;
1201
1202   if (TREE_CODE (binfo) == TREE_VEC)
1203     type = BINFO_TYPE (binfo);
1204   else
1205     {
1206       type = binfo;
1207       binfo = CLASS_TYPE_P (type) ? TYPE_BINFO (binfo) : NULL_TREE;
1208     }
1209
1210   TREE_TYPE (new_binfo) = TYPE_MAIN_VARIANT (type);
1211   BINFO_OFFSET (new_binfo) = offset;
1212   BINFO_VTABLE (new_binfo) = vtable;
1213   BINFO_VIRTUALS (new_binfo) = virtuals;
1214   BINFO_VPTR_FIELD (new_binfo) = NULL_TREE;
1215
1216   if (binfo && BINFO_BASETYPES (binfo) != NULL_TREE)
1217     BINFO_BASETYPES (new_binfo) = copy_node (BINFO_BASETYPES (binfo));      
1218   return new_binfo;
1219 }
1220
1221 /* Return the binfo value for ELEM in TYPE.  */
1222
1223 tree
1224 binfo_value (elem, type)
1225      tree elem;
1226      tree type;
1227 {
1228   if (get_base_distance (elem, type, 0, (tree *)0) == -2)
1229     compiler_error ("base class `%s' ambiguous in binfo_value",
1230                     TYPE_NAME_STRING (elem));
1231   if (elem == type)
1232     return TYPE_BINFO (type);
1233   if (TREE_CODE (elem) == RECORD_TYPE && TYPE_BINFO (elem) == type)
1234     return type;
1235   return get_binfo (elem, type, 0);
1236 }
1237
1238 /* Return a reversed copy of the BINFO-chain given by PATH.  (If the 
1239    BINFO_INHERITANCE_CHAIN points from base classes to derived
1240    classes, it will instead point from derived classes to base
1241    classes.)  Returns the first node in the reversed chain.  */
1242
1243 tree
1244 reverse_path (path)
1245      tree path;
1246 {
1247   register tree prev = NULL_TREE, cur;
1248   push_expression_obstack ();
1249   for (cur = path; cur; cur = BINFO_INHERITANCE_CHAIN (cur))
1250     {
1251       tree r = copy_node (cur);
1252       BINFO_INHERITANCE_CHAIN (r) = prev;
1253       prev = r;
1254     }
1255   pop_obstacks ();
1256   return prev;
1257 }
1258
1259 void
1260 debug_binfo (elem)
1261      tree elem;
1262 {
1263   unsigned HOST_WIDE_INT n;
1264   tree virtuals;
1265
1266   fprintf (stderr, "type \"%s\"; offset = %ld\n",
1267            TYPE_NAME_STRING (BINFO_TYPE (elem)),
1268            (long) TREE_INT_CST_LOW (BINFO_OFFSET (elem)));
1269   fprintf (stderr, "vtable type:\n");
1270   debug_tree (BINFO_TYPE (elem));
1271   if (BINFO_VTABLE (elem))
1272     fprintf (stderr, "vtable decl \"%s\"\n", IDENTIFIER_POINTER (DECL_NAME (BINFO_VTABLE (elem))));
1273   else
1274     fprintf (stderr, "no vtable decl yet\n");
1275   fprintf (stderr, "virtuals:\n");
1276   virtuals = BINFO_VIRTUALS (elem);
1277
1278   n = skip_rtti_stuff (&virtuals, BINFO_TYPE (elem));
1279
1280   while (virtuals)
1281     {
1282       tree fndecl = TREE_VALUE (virtuals);
1283       fprintf (stderr, "%s [%ld =? %ld]\n",
1284                IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl)),
1285                (long) n, (long) TREE_INT_CST_LOW (DECL_VINDEX (fndecl)));
1286       ++n;
1287       virtuals = TREE_CHAIN (virtuals);
1288     }
1289 }
1290
1291 int
1292 count_functions (t)
1293      tree t;
1294 {
1295   int i;
1296   if (TREE_CODE (t) == FUNCTION_DECL)
1297     return 1;
1298   else if (TREE_CODE (t) == OVERLOAD)
1299     {
1300       for (i=0; t; t = OVL_CHAIN (t))
1301         i++;
1302       return i;
1303     }
1304
1305   my_friendly_abort (359);
1306   return 0;
1307 }
1308
1309 int
1310 is_overloaded_fn (x)
1311      tree x;
1312 {
1313   /* A baselink is also considered an overloaded function.  */
1314   if (TREE_CODE (x) == OFFSET_REF)
1315     x = TREE_OPERAND (x, 1);
1316   if (BASELINK_P (x))
1317     x = TREE_VALUE (x);
1318   return (TREE_CODE (x) == FUNCTION_DECL
1319           || TREE_CODE (x) == TEMPLATE_ID_EXPR
1320           || DECL_FUNCTION_TEMPLATE_P (x)
1321           || TREE_CODE (x) == OVERLOAD);
1322 }
1323
1324 int
1325 really_overloaded_fn (x)
1326      tree x;
1327 {     
1328   /* A baselink is also considered an overloaded function.  */
1329   if (TREE_CODE (x) == OFFSET_REF)
1330     x = TREE_OPERAND (x, 1);
1331   if (BASELINK_P (x))
1332     x = TREE_VALUE (x);
1333   return (TREE_CODE (x) == OVERLOAD 
1334           && (TREE_CHAIN (x) != NULL_TREE
1335               || DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (x))));
1336 }
1337
1338 tree
1339 get_first_fn (from)
1340      tree from;
1341 {
1342   my_friendly_assert (is_overloaded_fn (from), 9);
1343   /* A baselink is also considered an overloaded function. */
1344   if (BASELINK_P (from))
1345     from = TREE_VALUE (from);
1346   return OVL_CURRENT (from);
1347 }
1348
1349 /* Returns nonzero if T is a ->* or .* expression that refers to a
1350    member function.  */
1351
1352 int
1353 bound_pmf_p (t)
1354      tree t;
1355 {
1356   return (TREE_CODE (t) == OFFSET_REF
1357           && TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (t, 1))));
1358 }
1359
1360 /* Return a new OVL node, concatenating it with the old one. */
1361
1362 tree
1363 ovl_cons (decl, chain)
1364      tree decl;
1365      tree chain;
1366 {
1367   tree result = make_node (OVERLOAD);
1368   TREE_TYPE (result) = unknown_type_node;
1369   OVL_FUNCTION (result) = decl;
1370   TREE_CHAIN (result) = chain;
1371   
1372   return result;
1373 }
1374
1375 /* Same as ovl_cons, but on the scratch_obstack. */
1376
1377 tree
1378 scratch_ovl_cons (value, chain)
1379      tree value, chain;
1380 {
1381   register tree node;
1382   register struct obstack *ambient_obstack = current_obstack;
1383   extern struct obstack *expression_obstack;
1384   current_obstack = expression_obstack;
1385   node = ovl_cons (value, chain);
1386   current_obstack = ambient_obstack;
1387   return node;
1388 }
1389
1390 /* Build a new overloaded function. If this is the first one,
1391    just return it; otherwise, ovl_cons the _DECLs */
1392
1393 tree
1394 build_overload (decl, chain)
1395      tree decl;
1396      tree chain;
1397 {
1398   if (! chain && TREE_CODE (decl) != TEMPLATE_DECL)
1399     return decl;
1400   if (chain && TREE_CODE (chain) != OVERLOAD)
1401     chain = ovl_cons (chain, NULL_TREE);
1402   return ovl_cons (decl, chain);
1403 }
1404
1405 /* True if fn is in ovl. */
1406
1407 int
1408 ovl_member (fn, ovl)
1409      tree fn;
1410      tree ovl;
1411 {
1412   if (ovl == NULL_TREE)
1413     return 0;
1414   if (TREE_CODE (ovl) != OVERLOAD)
1415     return ovl == fn;
1416   for (; ovl; ovl = OVL_CHAIN (ovl))
1417     if (OVL_FUNCTION (ovl) == fn)
1418       return 1;
1419   return 0;
1420 }
1421
1422 int
1423 is_aggr_type_2 (t1, t2)
1424      tree t1, t2;
1425 {
1426   if (TREE_CODE (t1) != TREE_CODE (t2))
1427     return 0;
1428   return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
1429 }
1430 \f
1431 #define PRINT_RING_SIZE 4
1432
1433 const char *
1434 lang_printable_name (decl, v)
1435      tree decl;
1436      int v;
1437 {
1438   static tree decl_ring[PRINT_RING_SIZE];
1439   static char *print_ring[PRINT_RING_SIZE];
1440   static int ring_counter;
1441   int i;
1442
1443   /* Only cache functions.  */
1444   if (v < 2
1445       || TREE_CODE (decl) != FUNCTION_DECL
1446       || DECL_LANG_SPECIFIC (decl) == 0)
1447     return lang_decl_name (decl, v);
1448
1449   /* See if this print name is lying around.  */
1450   for (i = 0; i < PRINT_RING_SIZE; i++)
1451     if (decl_ring[i] == decl)
1452       /* yes, so return it.  */
1453       return print_ring[i];
1454
1455   if (++ring_counter == PRINT_RING_SIZE)
1456     ring_counter = 0;
1457
1458   if (current_function_decl != NULL_TREE)
1459     {
1460       if (decl_ring[ring_counter] == current_function_decl)
1461         ring_counter += 1;
1462       if (ring_counter == PRINT_RING_SIZE)
1463         ring_counter = 0;
1464       if (decl_ring[ring_counter] == current_function_decl)
1465         my_friendly_abort (106);
1466     }
1467
1468   if (print_ring[ring_counter])
1469     free (print_ring[ring_counter]);
1470
1471   print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v));
1472   decl_ring[ring_counter] = decl;
1473   return print_ring[ring_counter];
1474 }
1475 \f
1476 /* Build the FUNCTION_TYPE or METHOD_TYPE which may throw exceptions
1477    listed in RAISES.  */
1478
1479 tree
1480 build_exception_variant (type, raises)
1481      tree type;
1482      tree raises;
1483 {
1484   tree v = TYPE_MAIN_VARIANT (type);
1485   int type_quals = TYPE_QUALS (type);
1486
1487   for (; v; v = TYPE_NEXT_VARIANT (v))
1488     if (TYPE_QUALS (v) == type_quals
1489         && comp_except_specs (raises, TYPE_RAISES_EXCEPTIONS (v), 1))
1490       return v;
1491
1492   /* Need to build a new variant.  */
1493   v = build_type_copy (type);
1494   TYPE_RAISES_EXCEPTIONS (v) = raises;
1495   return v;
1496 }
1497
1498 /* Given a TEMPLATE_TEMPLATE_PARM node T, create a new one together with its 
1499    lang_specific field and its corresponding TEMPLATE_DECL node */
1500
1501 tree
1502 copy_template_template_parm (t)
1503      tree t;
1504 {
1505   tree template = TYPE_NAME (t);
1506   tree t2;
1507
1508   /* Make sure these end up on the permanent_obstack.  */
1509   push_permanent_obstack ();
1510   
1511   t2 = make_lang_type (TEMPLATE_TEMPLATE_PARM);
1512   template = copy_node (template);
1513   copy_lang_decl (template);
1514
1515   pop_obstacks ();
1516
1517   TREE_TYPE (template) = t2;
1518   TYPE_NAME (t2) = template;
1519   TYPE_STUB_DECL (t2) = template;
1520
1521   /* No need to copy these */
1522   TYPE_FIELDS (t2) = TYPE_FIELDS (t);
1523   TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t2) 
1524     = TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t);
1525   return t2;
1526 }
1527
1528 /* Walk through the tree structure T, applying func.  If func ever returns
1529    non-null, return that value.  */
1530
1531 tree
1532 search_tree (t, func)
1533      tree t;
1534      tree (*func) PROTO((tree));
1535 {
1536 #define TRY(ARG) if (tmp=search_tree (ARG, func), tmp != NULL_TREE) return tmp
1537
1538   tree tmp;
1539   enum tree_code code; 
1540
1541   if (t == NULL_TREE)
1542     return t;
1543   
1544   tmp = func (t);
1545   if (tmp)
1546     return tmp;
1547
1548   /* Handle some common cases up front.  */
1549   code = TREE_CODE (t);
1550   if (TREE_CODE_CLASS (code) == '1')
1551     {
1552       TRY (TREE_OPERAND (t, 0));
1553       return NULL_TREE;
1554     }
1555   else if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<')
1556     {
1557       TRY (TREE_OPERAND (t, 0));
1558       TRY (TREE_OPERAND (t, 1));
1559       return NULL_TREE;
1560     }
1561
1562   switch (code)
1563     {
1564     case ERROR_MARK:
1565       break;
1566
1567     case IDENTIFIER_NODE:
1568       break;
1569
1570     case VAR_DECL:
1571     case FUNCTION_DECL:
1572     case CONST_DECL:
1573     case TEMPLATE_DECL:
1574     case NAMESPACE_DECL:
1575       break;
1576
1577     case TYPE_DECL:
1578       TRY (TREE_TYPE (t));
1579       break;
1580
1581     case PARM_DECL:
1582       TRY (TREE_TYPE (t));
1583       TRY (TREE_CHAIN (t));
1584       break;
1585
1586     case TREE_LIST:
1587       TRY (TREE_PURPOSE (t));
1588       TRY (TREE_VALUE (t));
1589       TRY (TREE_CHAIN (t));
1590       break;
1591
1592     case OVERLOAD:
1593       TRY (OVL_FUNCTION (t));
1594       TRY (OVL_CHAIN (t));
1595       break;
1596
1597     case TREE_VEC:
1598       {
1599         int len = TREE_VEC_LENGTH (t);
1600
1601         t = copy_node (t);
1602         while (len--)
1603           TRY (TREE_VEC_ELT (t, len));
1604       }
1605       break;
1606
1607     case INTEGER_CST:
1608     case REAL_CST:
1609     case STRING_CST:
1610     case DEFAULT_ARG:
1611       break;
1612
1613     case PTRMEM_CST:
1614       TRY (TREE_TYPE (t));
1615       break;
1616
1617     case COND_EXPR:
1618     case TARGET_EXPR:
1619     case AGGR_INIT_EXPR:
1620     case NEW_EXPR:
1621       TRY (TREE_OPERAND (t, 0));
1622       TRY (TREE_OPERAND (t, 1));
1623       TRY (TREE_OPERAND (t, 2));
1624       break;
1625
1626     case TRUTH_AND_EXPR:
1627     case TRUTH_OR_EXPR:
1628     case TRUTH_XOR_EXPR:
1629     case TRUTH_ANDIF_EXPR:
1630     case TRUTH_ORIF_EXPR:
1631     case PREDECREMENT_EXPR:
1632     case PREINCREMENT_EXPR:
1633     case POSTDECREMENT_EXPR:
1634     case POSTINCREMENT_EXPR:
1635     case ARRAY_REF:
1636     case SCOPE_REF:
1637     case TRY_CATCH_EXPR:
1638     case WITH_CLEANUP_EXPR:
1639     case CALL_EXPR:
1640     case COMPOUND_EXPR:
1641     case MODIFY_EXPR:
1642     case INIT_EXPR:
1643     case OFFSET_REF:
1644       TRY (TREE_OPERAND (t, 0));
1645       TRY (TREE_OPERAND (t, 1));
1646       break;
1647
1648     case SAVE_EXPR:
1649     case ADDR_EXPR:
1650     case INDIRECT_REF:
1651     case TRUTH_NOT_EXPR:
1652     case COMPONENT_REF:
1653     case CLEANUP_POINT_EXPR:
1654     case LOOKUP_EXPR:
1655     case THROW_EXPR:
1656     case EXIT_EXPR:
1657     case LOOP_EXPR:
1658     case BIT_FIELD_REF:
1659       TRY (TREE_OPERAND (t, 0));
1660       break;
1661
1662     case MODOP_EXPR:
1663     case ARROW_EXPR:
1664     case DOTSTAR_EXPR:
1665     case TYPEID_EXPR:
1666     case PSEUDO_DTOR_EXPR:
1667       break;
1668
1669     case COMPLEX_CST:
1670       TRY (TREE_REALPART (t));
1671       TRY (TREE_IMAGPART (t));
1672       break;
1673
1674     case CONSTRUCTOR:
1675       TRY (CONSTRUCTOR_ELTS (t));
1676       break;
1677
1678     case TEMPLATE_TEMPLATE_PARM:
1679     case TEMPLATE_PARM_INDEX:
1680     case TEMPLATE_TYPE_PARM:
1681       break;
1682
1683     case BIND_EXPR:
1684     case STMT_EXPR:
1685       break;
1686
1687     case REAL_TYPE:
1688     case COMPLEX_TYPE:
1689     case VOID_TYPE:
1690     case BOOLEAN_TYPE:
1691     case TYPENAME_TYPE:
1692     case UNION_TYPE:
1693     case ENUMERAL_TYPE:
1694     case TYPEOF_TYPE:
1695       break;
1696
1697     case POINTER_TYPE:
1698     case REFERENCE_TYPE:
1699       TRY (TREE_TYPE (t));
1700       break;
1701
1702     case FUNCTION_TYPE:
1703     case METHOD_TYPE:
1704       TRY (TREE_TYPE (t));
1705       TRY (TYPE_ARG_TYPES (t));
1706       break;
1707
1708     case ARRAY_TYPE:
1709       TRY (TREE_TYPE (t));
1710       TRY (TYPE_DOMAIN (t));
1711       break;
1712
1713     case INTEGER_TYPE:
1714       TRY (TYPE_MAX_VALUE (t));
1715       break;
1716
1717     case OFFSET_TYPE:
1718       TRY (TREE_TYPE (t));
1719       TRY (TYPE_OFFSET_BASETYPE (t));
1720       break;
1721
1722     case RECORD_TYPE:
1723       if (TYPE_PTRMEMFUNC_P (t))
1724         TRY (TYPE_PTRMEMFUNC_FN_TYPE (t));
1725       break;
1726       
1727     default:
1728       my_friendly_abort (19990803);
1729     }
1730
1731   return NULL_TREE;
1732
1733 #undef TRY
1734 }
1735
1736 /* Passed to search_tree.  Checks for the use of types with no linkage.  */
1737
1738 static tree
1739 no_linkage_helper (t)
1740      tree t;
1741 {
1742   if (TYPE_P (t)
1743       && (IS_AGGR_TYPE (t) || TREE_CODE (t) == ENUMERAL_TYPE)
1744       && (decl_function_context (TYPE_MAIN_DECL (t))
1745           || ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))))
1746     return t;
1747   return NULL_TREE;
1748 }
1749
1750 /* Check if the type T depends on a type with no linkage and if so, return
1751    it.  */
1752
1753 tree
1754 no_linkage_check (t)
1755      tree t;
1756 {
1757   /* There's no point in checking linkage on template functions; we
1758      can't know their complete types.  */
1759   if (processing_template_decl)
1760     return NULL_TREE;
1761
1762   t = search_tree (t, no_linkage_helper);
1763   if (t != error_mark_node)
1764     return t;
1765   return NULL_TREE;
1766 }
1767
1768
1769 /* Make copies of all the nodes below T.  If FUNC is non-NULL, call it
1770    for each node.  */
1771
1772 tree
1773 mapcar (t, func)
1774      tree t;
1775      tree (*func) PROTO((tree));
1776 {
1777   tree tmp;
1778   enum tree_code code; 
1779
1780   if (t == NULL_TREE)
1781     return t;
1782
1783   if (func) 
1784     {
1785       tmp = func (t);
1786       if (tmp)
1787         return tmp;
1788     }
1789
1790   /* Handle some common cases up front.  */
1791   code = TREE_CODE (t);
1792   if (TREE_CODE_CLASS (code) == '1')
1793     {
1794       t = copy_node (t);
1795       TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1796       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1797       return t;
1798     }
1799   else if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<')
1800     {
1801       t = copy_node (t);
1802       TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1803       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1804       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1805       return t;
1806     }
1807
1808   switch (TREE_CODE (t))
1809     {
1810     case ERROR_MARK:
1811       return error_mark_node;
1812
1813     case VAR_DECL:
1814     case FUNCTION_DECL:
1815     case CONST_DECL:
1816       /* Rather than aborting, return error_mark_node.  This allows us
1817          to report a sensible error message on code like this:
1818
1819          void g() { int i; f<i>(7); } 
1820
1821          In a case like:
1822
1823            void g() { const int i = 7; f<i>(7); }
1824
1825          however, we must actually return the constant initializer.  */
1826       if (TREE_READONLY_DECL_P (t))
1827         {
1828           tmp = decl_constant_value (t);
1829           if (tmp != t)
1830             return mapcar (tmp, func);
1831         }
1832       return error_mark_node;
1833
1834     case PARM_DECL:
1835       {
1836         tree chain = TREE_CHAIN (t);
1837         t = copy_node (t);
1838         TREE_CHAIN (t) = mapcar (chain, func);
1839         TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1840         DECL_INITIAL (t) = mapcar (DECL_INITIAL (t), func);
1841         DECL_SIZE (t) = mapcar (DECL_SIZE (t), func);
1842         return t;
1843       }
1844
1845     case TREE_LIST:
1846       {
1847         tree chain = TREE_CHAIN (t);
1848         t = copy_node (t);
1849         TREE_PURPOSE (t) = mapcar (TREE_PURPOSE (t), func);
1850         TREE_VALUE (t) = mapcar (TREE_VALUE (t), func);
1851         TREE_CHAIN (t) = mapcar (chain, func);
1852         return t;
1853       }
1854
1855     case OVERLOAD:
1856       {
1857         tree chain = OVL_CHAIN (t);
1858         t = copy_node (t);
1859         OVL_FUNCTION (t) = mapcar (OVL_FUNCTION (t), func);
1860         OVL_CHAIN (t) = mapcar (chain, func);
1861         return t;
1862       }
1863
1864     case TREE_VEC:
1865       {
1866         int len = TREE_VEC_LENGTH (t);
1867
1868         t = copy_node (t);
1869         while (len--)
1870           TREE_VEC_ELT (t, len) = mapcar (TREE_VEC_ELT (t, len), func);
1871         return t;
1872       }
1873
1874     case INTEGER_CST:
1875     case REAL_CST:
1876     case STRING_CST:
1877       return copy_node (t);
1878
1879     case PTRMEM_CST:
1880       t = copy_node (t);
1881       TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1882       PTRMEM_CST_MEMBER (t) = mapcar (PTRMEM_CST_MEMBER (t), func);
1883       return t;
1884
1885     case COND_EXPR:
1886     case TARGET_EXPR:
1887     case AGGR_INIT_EXPR:
1888       t = copy_node (t);
1889       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1890       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1891       TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1892       return t;
1893
1894     case TRUTH_AND_EXPR:
1895     case TRUTH_OR_EXPR:
1896     case TRUTH_XOR_EXPR:
1897     case TRUTH_ANDIF_EXPR:
1898     case TRUTH_ORIF_EXPR:
1899     case PREDECREMENT_EXPR:
1900     case PREINCREMENT_EXPR:
1901     case POSTDECREMENT_EXPR:
1902     case POSTINCREMENT_EXPR:
1903     case ARRAY_REF:
1904     case SCOPE_REF:
1905     case TRY_CATCH_EXPR:
1906     case WITH_CLEANUP_EXPR:
1907     case COMPOUND_EXPR:
1908     case MODIFY_EXPR:
1909     case INIT_EXPR:
1910     case OFFSET_REF:
1911       t = copy_node (t);
1912       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1913       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1914       return t;
1915
1916     case CALL_EXPR:
1917       t = copy_node (t);
1918       TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1919       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1920       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1921       TREE_OPERAND (t, 2) = NULL_TREE;
1922       return t;
1923
1924     case SAVE_EXPR:
1925     case ADDR_EXPR:
1926     case INDIRECT_REF:
1927     case TRUTH_NOT_EXPR:
1928     case COMPONENT_REF:
1929     case CLEANUP_POINT_EXPR:
1930     case THROW_EXPR:
1931     case STMT_EXPR:
1932       t = copy_node (t);
1933       TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1934       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1935       return t;
1936
1937     case POINTER_TYPE:
1938       tmp = build_pointer_type (mapcar (TREE_TYPE (t), func));
1939       return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1940     case REFERENCE_TYPE:
1941       tmp = build_reference_type (mapcar (TREE_TYPE (t), func));
1942       return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1943     case FUNCTION_TYPE:
1944       tmp = build_function_type (mapcar (TREE_TYPE (t), func),
1945                                  mapcar (TYPE_ARG_TYPES (t), func));
1946       return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1947     case ARRAY_TYPE:
1948       tmp = build_cplus_array_type (mapcar (TREE_TYPE (t), func),
1949                                     mapcar (TYPE_DOMAIN (t), func));
1950       return cp_build_qualified_type (tmp, CP_TYPE_QUALS (t));
1951     case INTEGER_TYPE:
1952       tmp = build_index_type (mapcar (TYPE_MAX_VALUE (t), func));
1953       return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1954     case OFFSET_TYPE:
1955       tmp = build_offset_type (mapcar (TYPE_OFFSET_BASETYPE (t), func),
1956                                mapcar (TREE_TYPE (t), func));
1957       return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1958     case METHOD_TYPE:
1959       tmp = build_cplus_method_type
1960         (mapcar (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), func),
1961          mapcar (TREE_TYPE (t), func),
1962          mapcar (TREE_CHAIN (TYPE_ARG_TYPES (t)), func));
1963       return cp_build_qualified_type (tmp, TYPE_QUALS (t));
1964
1965     case COMPLEX_CST:
1966       t = copy_node (t);
1967       TREE_REALPART (t) = mapcar (TREE_REALPART (t), func);
1968       TREE_IMAGPART (t) = mapcar (TREE_REALPART (t), func);
1969       return t;
1970
1971     case CONSTRUCTOR:
1972       t = copy_node (t);
1973       CONSTRUCTOR_ELTS (t) = mapcar (CONSTRUCTOR_ELTS (t), func);
1974       return t;
1975
1976     case TEMPLATE_TEMPLATE_PARM:
1977       return copy_template_template_parm (t);
1978
1979     case BIND_EXPR:
1980       t = copy_node (t);
1981       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1982       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1983       TREE_OPERAND (t, 2) = NULL_TREE;
1984       return t;
1985
1986     case NEW_EXPR:
1987       t = copy_node (t);
1988       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1989       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1990       TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1991       return t;
1992
1993     case BIT_FIELD_REF:
1994       t = copy_node (t);
1995       TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1996       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1997       TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1998       TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1999       return t;
2000       
2001     case LOOKUP_EXPR:
2002     case EXIT_EXPR:
2003     case LOOP_EXPR:
2004       t = copy_node (t);
2005       TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
2006       return t;
2007
2008     case RTL_EXPR:
2009       t = copy_node (t);
2010       TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
2011       return t;
2012
2013     case RECORD_TYPE:
2014       if (TYPE_PTRMEMFUNC_P (t))
2015         return build_ptrmemfunc_type
2016           (mapcar (TYPE_PTRMEMFUNC_FN_TYPE (t), func));
2017       /* else fall through */
2018
2019     default:
2020       my_friendly_abort (19990815);
2021     }
2022   my_friendly_abort (107);
2023   /* NOTREACHED */
2024   return NULL_TREE;
2025 }
2026
2027 #ifdef GATHER_STATISTICS
2028 extern int depth_reached;
2029 #endif
2030
2031 void
2032 print_lang_statistics ()
2033 {
2034   extern struct obstack decl_obstack;
2035   print_obstack_statistics ("class_obstack", &class_obstack);
2036   print_obstack_statistics ("decl_obstack", &decl_obstack);
2037   print_search_statistics ();
2038   print_class_statistics ();
2039 #ifdef GATHER_STATISTICS
2040   fprintf (stderr, "maximum template instantiation depth reached: %d\n",
2041            depth_reached);
2042 #endif
2043 }
2044
2045 /* This is used by the `assert' macro.  It is provided in libgcc.a,
2046    which `cc' doesn't know how to link.  Note that the C++ front-end
2047    no longer actually uses the `assert' macro (instead, it calls
2048    my_friendly_assert).  But all of the back-end files still need this.  */
2049
2050 void
2051 __eprintf (string, expression, line, filename)
2052      const char *string;
2053      const char *expression;
2054      unsigned line;
2055      const char *filename;
2056 {
2057   fprintf (stderr, string, expression, line, filename);
2058   fflush (stderr);
2059   abort ();
2060 }
2061
2062 /* Return, as an INTEGER_CST node, the number of elements for TYPE
2063    (which is an ARRAY_TYPE).  This counts only elements of the top
2064    array.  */
2065
2066 tree
2067 array_type_nelts_top (type)
2068      tree type;
2069 {
2070   return fold (build (PLUS_EXPR, sizetype,
2071                       array_type_nelts (type),
2072                       integer_one_node));
2073 }
2074
2075 /* Return, as an INTEGER_CST node, the number of elements for TYPE
2076    (which is an ARRAY_TYPE).  This one is a recursive count of all
2077    ARRAY_TYPEs that are clumped together.  */
2078
2079 tree
2080 array_type_nelts_total (type)
2081      tree type;
2082 {
2083   tree sz = array_type_nelts_top (type);
2084   type = TREE_TYPE (type);
2085   while (TREE_CODE (type) == ARRAY_TYPE)
2086     {
2087       tree n = array_type_nelts_top (type);
2088       sz = fold (build (MULT_EXPR, sizetype, sz, n));
2089       type = TREE_TYPE (type);
2090     }
2091   return sz;
2092 }
2093
2094 static
2095 tree
2096 bot_manip (t)
2097      tree t;
2098 {
2099   if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
2100     return t;
2101   else if (TREE_CODE (t) == TARGET_EXPR)
2102     {
2103       if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR)
2104         {
2105           mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0));
2106           return build_cplus_new
2107             (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1)));
2108         }
2109       t = copy_node (t);
2110       TREE_OPERAND (t, 0) = build (VAR_DECL, TREE_TYPE (t));
2111       layout_decl (TREE_OPERAND (t, 0), 0);
2112       return t;
2113     }
2114   else if (TREE_CODE (t) == CALL_EXPR)
2115     mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
2116
2117   return NULL_TREE;
2118 }
2119   
2120 /* Actually, we'll just clean out the target exprs for the moment.  */
2121
2122 tree
2123 break_out_target_exprs (t)
2124      tree t;
2125 {
2126   return mapcar (t, bot_manip);
2127 }
2128
2129 /* Obstack used for allocating nodes in template function and variable
2130    definitions.  */
2131
2132 /* Similar to `build_nt', except we build
2133    on the permanent_obstack, regardless.  */
2134
2135 tree
2136 build_min_nt VPROTO((enum tree_code code, ...))
2137 {
2138 #ifndef ANSI_PROTOTYPES
2139   enum tree_code code;
2140 #endif
2141   register struct obstack *ambient_obstack = expression_obstack;
2142   va_list p;
2143   register tree t;
2144   register int length;
2145   register int i;
2146
2147   VA_START (p, code);
2148
2149 #ifndef ANSI_PROTOTYPES
2150   code = va_arg (p, enum tree_code);
2151 #endif
2152
2153   expression_obstack = &permanent_obstack;
2154
2155   t = make_node (code);
2156   length = tree_code_length[(int) code];
2157   TREE_COMPLEXITY (t) = lineno;
2158
2159   for (i = 0; i < length; i++)
2160     {
2161       tree x = va_arg (p, tree);
2162       TREE_OPERAND (t, i) = x;
2163     }
2164
2165   va_end (p);
2166   expression_obstack = ambient_obstack;
2167   return t;
2168 }
2169
2170 /* Similar to `build', except we build
2171    on the permanent_obstack, regardless.  */
2172
2173 tree
2174 build_min VPROTO((enum tree_code code, tree tt, ...))
2175 {
2176 #ifndef ANSI_PROTOTYPES
2177   enum tree_code code;
2178   tree tt;
2179 #endif
2180   register struct obstack *ambient_obstack = expression_obstack;
2181   va_list p;
2182   register tree t;
2183   register int length;
2184   register int i;
2185
2186   VA_START (p, tt);
2187
2188 #ifndef ANSI_PROTOTYPES
2189   code = va_arg (p, enum tree_code);
2190   tt = va_arg (p, tree);
2191 #endif
2192
2193   expression_obstack = &permanent_obstack;
2194
2195   t = make_node (code);
2196   length = tree_code_length[(int) code];
2197   TREE_TYPE (t) = tt;
2198   TREE_COMPLEXITY (t) = lineno;
2199
2200   for (i = 0; i < length; i++)
2201     {
2202       tree x = va_arg (p, tree);
2203       TREE_OPERAND (t, i) = x;
2204     }
2205
2206   va_end (p);
2207   expression_obstack = ambient_obstack;
2208   return t;
2209 }
2210
2211 /* Same as `tree_cons' but make a permanent object.  */
2212
2213 tree
2214 min_tree_cons (purpose, value, chain)
2215      tree purpose, value, chain;
2216 {
2217   register tree node;
2218   register struct obstack *ambient_obstack = current_obstack;
2219   current_obstack = &permanent_obstack;
2220
2221   node = tree_cons (purpose, value, chain);
2222
2223   current_obstack = ambient_obstack;
2224   return node;
2225 }
2226
2227 tree
2228 get_type_decl (t)
2229      tree t;
2230 {
2231   if (TREE_CODE (t) == TYPE_DECL)
2232     return t;
2233   if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
2234     return TYPE_STUB_DECL (t);
2235   
2236   my_friendly_abort (42);
2237
2238   /* Stop compiler from complaining control reaches end of non-void function.  */
2239   return 0;
2240 }
2241
2242 int
2243 can_free (obstack, t)
2244      struct obstack *obstack;
2245      tree t;
2246 {
2247   int size = 0;
2248
2249   if (TREE_CODE (t) == TREE_VEC)
2250     size = (TREE_VEC_LENGTH (t)-1) * sizeof (tree) + sizeof (struct tree_vec);
2251   else
2252     my_friendly_abort (42);
2253
2254 #define ROUND(x) ((x + obstack_alignment_mask (obstack)) \
2255                   & ~ obstack_alignment_mask (obstack))
2256   if ((char *)t + ROUND (size) == obstack_next_free (obstack))
2257     return 1;
2258 #undef ROUND
2259
2260   return 0;
2261 }
2262
2263 /* Return first vector element whose BINFO_TYPE is ELEM.
2264    Return 0 if ELEM is not in VEC.  VEC may be NULL_TREE.  */
2265
2266 tree
2267 vec_binfo_member (elem, vec)
2268      tree elem, vec;
2269 {
2270   int i;
2271
2272   if (vec)
2273     for (i = 0; i < TREE_VEC_LENGTH (vec); ++i)
2274       if (same_type_p (elem, BINFO_TYPE (TREE_VEC_ELT (vec, i))))
2275         return TREE_VEC_ELT (vec, i);
2276
2277   return NULL_TREE;
2278 }
2279
2280 /* Kludge around the fact that DECL_CONTEXT for virtual functions returns
2281    the wrong thing for decl_function_context.  Hopefully the uses in the
2282    backend won't matter, since we don't need a static chain for local class
2283    methods.  FIXME!  */
2284
2285 tree
2286 hack_decl_function_context (decl)
2287      tree decl;
2288 {
2289   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
2290     return decl_function_context (TYPE_MAIN_DECL (DECL_CLASS_CONTEXT (decl)));
2291   return decl_function_context (decl);
2292 }
2293
2294 /* Returns the namespace that contains DECL, whether directly or
2295    indirectly.  */
2296
2297 tree
2298 decl_namespace_context (decl)
2299      tree decl;
2300 {
2301   while (1)
2302     {
2303       if (TREE_CODE (decl) == NAMESPACE_DECL)
2304         return decl;
2305       else if (TYPE_P (decl))
2306         decl = CP_DECL_CONTEXT (TYPE_MAIN_DECL (decl));
2307       else
2308         decl = CP_DECL_CONTEXT (decl);
2309     }
2310 }
2311
2312 /* Return truthvalue of whether T1 is the same tree structure as T2.
2313    Return 1 if they are the same.
2314    Return 0 if they are understandably different.
2315    Return -1 if either contains tree structure not understood by
2316    this function.  */
2317
2318 int
2319 cp_tree_equal (t1, t2)
2320      tree t1, t2;
2321 {
2322   register enum tree_code code1, code2;
2323   int cmp;
2324
2325   if (t1 == t2)
2326     return 1;
2327   if (t1 == 0 || t2 == 0)
2328     return 0;
2329
2330   code1 = TREE_CODE (t1);
2331   code2 = TREE_CODE (t2);
2332
2333   if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR)
2334     {
2335       if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR)
2336         return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2337       else
2338         return cp_tree_equal (TREE_OPERAND (t1, 0), t2);
2339     }
2340   else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR
2341            || code2 == NON_LVALUE_EXPR)
2342     return cp_tree_equal (t1, TREE_OPERAND (t2, 0));
2343
2344   if (code1 != code2)
2345     return 0;
2346
2347   switch (code1)
2348     {
2349     case INTEGER_CST:
2350       return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
2351         && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2);
2352
2353     case REAL_CST:
2354       return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2355
2356     case STRING_CST:
2357       return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2358         && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2359                   TREE_STRING_LENGTH (t1));
2360
2361     case CONSTRUCTOR:
2362       /* We need to do this when determining whether or not two
2363          non-type pointer to member function template arguments
2364          are the same.  */
2365       if (!(same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))
2366             /* The first operand is RTL.  */
2367             && TREE_OPERAND (t1, 0) == TREE_OPERAND (t2, 0)))
2368         return 0;
2369       return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2370
2371     case TREE_LIST:
2372       cmp = cp_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2));
2373       if (cmp <= 0)
2374         return cmp;
2375       cmp = cp_tree_equal (TREE_VALUE (t1), TREE_VALUE (t2));
2376       if (cmp <= 0)
2377         return cmp;
2378       return cp_tree_equal (TREE_CHAIN (t1), TREE_CHAIN (t2));
2379
2380     case SAVE_EXPR:
2381       return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2382
2383     case CALL_EXPR:
2384       cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2385       if (cmp <= 0)
2386         return cmp;
2387       return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2388
2389     case TARGET_EXPR:
2390       /* Special case: if either target is an unallocated VAR_DECL,
2391          it means that it's going to be unified with whatever the
2392          TARGET_EXPR is really supposed to initialize, so treat it
2393          as being equivalent to anything.  */
2394       if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
2395            && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
2396            && DECL_RTL (TREE_OPERAND (t1, 0)) == 0)
2397           || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
2398               && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
2399               && DECL_RTL (TREE_OPERAND (t2, 0)) == 0))
2400         cmp = 1;
2401       else
2402         cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2403       if (cmp <= 0)
2404         return cmp;
2405       return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2406
2407     case WITH_CLEANUP_EXPR:
2408       cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2409       if (cmp <= 0)
2410         return cmp;
2411       return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
2412
2413     case COMPONENT_REF:
2414       if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
2415         return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2416       return 0;
2417
2418     case VAR_DECL:
2419     case PARM_DECL:
2420     case CONST_DECL:
2421     case FUNCTION_DECL:
2422       return 0;
2423
2424     case TEMPLATE_PARM_INDEX:
2425       return TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2)
2426         && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2);
2427
2428     case SIZEOF_EXPR:
2429     case ALIGNOF_EXPR:
2430       if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
2431         return 0;
2432       if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
2433         return same_type_p (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2434       break;
2435
2436     case PTRMEM_CST:
2437       /* Two pointer-to-members are the same if they point to the same
2438          field or function in the same class.  */
2439       return (PTRMEM_CST_MEMBER (t1) == PTRMEM_CST_MEMBER (t2)
2440               && same_type_p (PTRMEM_CST_CLASS (t1), PTRMEM_CST_CLASS (t2)));
2441
2442     default:
2443       break;
2444     }
2445
2446   switch (TREE_CODE_CLASS (code1))
2447     {
2448       int i;
2449     case '1':
2450     case '2':
2451     case '<':
2452     case 'e':
2453     case 'r':
2454     case 's':
2455       cmp = 1;
2456       for (i=0; i<tree_code_length[(int) code1]; ++i)
2457         {
2458           cmp = cp_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
2459           if (cmp <= 0)
2460             return cmp;
2461         }
2462       return cmp;
2463     }
2464
2465   return -1;
2466 }
2467
2468 /* Similar to make_tree_vec, but build on the momentary_obstack.
2469    Thus, these vectors are really and truly temporary.  */
2470
2471 tree
2472 make_temp_vec (len)
2473      int len;
2474 {
2475   register tree node;
2476   push_expression_obstack ();
2477   node = make_tree_vec (len);
2478   pop_obstacks ();
2479   return node;
2480 }
2481
2482 /* Build a wrapper around some pointer PTR so we can use it as a tree.  */
2483
2484 tree
2485 build_ptr_wrapper (ptr)
2486      void *ptr;
2487 {
2488   tree t = make_node (WRAPPER);
2489   WRAPPER_PTR (t) = ptr;
2490   return t;
2491 }
2492
2493 /* Same, but on the expression_obstack.  */
2494
2495 tree
2496 build_expr_ptr_wrapper (ptr)
2497      void *ptr;
2498 {
2499   tree t;
2500   push_expression_obstack ();
2501   t = build_ptr_wrapper (ptr);
2502   pop_obstacks ();
2503   return t;
2504 }
2505
2506 /* Build a wrapper around some integer I so we can use it as a tree.  */
2507
2508 tree
2509 build_int_wrapper (i)
2510      int i;
2511 {
2512   tree t = make_node (WRAPPER);
2513   WRAPPER_INT (t) = i;
2514   return t;
2515 }
2516
2517 static tree
2518 build_srcloc (file, line)
2519      char *file;
2520      int line;
2521 {
2522   tree t;
2523
2524   t = make_node (SRCLOC);
2525   SRCLOC_FILE (t) = file;
2526   SRCLOC_LINE (t) = line;
2527
2528   return t;
2529 }
2530
2531 tree
2532 build_srcloc_here ()
2533 {
2534   return build_srcloc (input_filename, lineno);
2535 }
2536
2537 void
2538 push_expression_obstack ()
2539 {
2540   push_obstacks_nochange ();
2541   current_obstack = expression_obstack;
2542 }
2543
2544 /* Begin allocating on the permanent obstack.  When you're done
2545    allocating there, call pop_obstacks to return to the previous set
2546    of obstacks.  */
2547
2548 void
2549 push_permanent_obstack ()
2550 {
2551   push_obstacks_nochange ();
2552   end_temporary_allocation ();
2553 }
2554
2555 /* The type of ARG when used as an lvalue.  */
2556
2557 tree
2558 lvalue_type (arg)
2559      tree arg;
2560 {
2561   tree type = TREE_TYPE (arg);
2562   if (TREE_CODE (arg) == OVERLOAD)
2563     type = unknown_type_node;
2564   return type;
2565 }
2566
2567 /* The type of ARG for printing error messages; denote lvalues with
2568    reference types.  */
2569
2570 tree
2571 error_type (arg)
2572      tree arg;
2573 {
2574   tree type = TREE_TYPE (arg);
2575   if (TREE_CODE (type) == ARRAY_TYPE)
2576     ;
2577   else if (real_lvalue_p (arg))
2578     type = build_reference_type (lvalue_type (arg));
2579   else if (IS_AGGR_TYPE (type))
2580     type = lvalue_type (arg);
2581
2582   return type;
2583 }
2584
2585 /* Does FUNCTION use a variable-length argument list?  */
2586
2587 int
2588 varargs_function_p (function)
2589      tree function;
2590 {
2591   tree parm = TYPE_ARG_TYPES (TREE_TYPE (function));
2592   for (; parm; parm = TREE_CHAIN (parm))
2593     if (TREE_VALUE (parm) == void_type_node)
2594       return 0;
2595   return 1;
2596 }
2597
2598 /* Returns 1 if decl is a member of a class.  */
2599
2600 int
2601 member_p (decl)
2602      tree decl;
2603 {
2604   tree ctx = DECL_CONTEXT (decl);
2605   return (ctx && TREE_CODE_CLASS (TREE_CODE (ctx)) == 't');
2606 }
2607
2608 /* Create a placeholder for member access where we don't actually have an
2609    object that the access is against.  */
2610
2611 tree
2612 build_dummy_object (type)
2613      tree type;
2614 {
2615   tree decl = build1 (NOP_EXPR, build_pointer_type (type), void_zero_node);
2616   return build_indirect_ref (decl, NULL_PTR);
2617 }
2618
2619 /* We've gotten a reference to a member of TYPE.  Return *this if appropriate,
2620    or a dummy object otherwise.  If BINFOP is non-0, it is filled with the
2621    binfo path from current_class_type to TYPE, or 0.  */
2622
2623 tree
2624 maybe_dummy_object (type, binfop)
2625      tree type;
2626      tree *binfop;
2627 {
2628   tree decl, context;
2629
2630   if (current_class_type
2631       && get_base_distance (type, current_class_type, 0, binfop) != -1)
2632     context = current_class_type;
2633   else
2634     {
2635       /* Reference from a nested class member function.  */
2636       context = type;
2637       if (binfop)
2638         *binfop = TYPE_BINFO (type);
2639     }
2640
2641   if (current_class_ref && context == current_class_type)
2642     decl = current_class_ref;
2643   else
2644     decl = build_dummy_object (context);
2645
2646   return decl;
2647 }
2648
2649 /* Returns 1 if OB is a placeholder object, or a pointer to one.  */
2650
2651 int
2652 is_dummy_object (ob)
2653      tree ob;
2654 {
2655   if (TREE_CODE (ob) == INDIRECT_REF)
2656     ob = TREE_OPERAND (ob, 0);
2657   return (TREE_CODE (ob) == NOP_EXPR
2658           && TREE_OPERAND (ob, 0) == void_zero_node);
2659 }
2660
2661 /* Returns 1 iff type T is a POD type, as defined in [basic.types].  */
2662
2663 int
2664 pod_type_p (t)
2665      tree t;
2666 {
2667   while (TREE_CODE (t) == ARRAY_TYPE)
2668     t = TREE_TYPE (t);
2669
2670   if (INTEGRAL_TYPE_P (t))
2671     return 1;  /* integral, character or enumeral type */
2672   if (FLOAT_TYPE_P (t))
2673     return 1;
2674   if (TYPE_PTR_P (t))
2675     return 1; /* pointer to non-member */
2676   if (TYPE_PTRMEM_P (t))
2677     return 1; /* pointer to member object */
2678   if (TYPE_PTRMEMFUNC_P (t))
2679     return 1; /* pointer to member function */
2680   
2681   if (! CLASS_TYPE_P (t))
2682     return 0; /* other non-class type (reference or function) */
2683   if (CLASSTYPE_NON_POD_P (t))
2684     return 0;
2685   return 1;
2686 }
2687
2688 /* Return a 1 if ATTR_NAME and ATTR_ARGS denote a valid C++-specific
2689    attribute for either declaration DECL or type TYPE and 0 otherwise.
2690    Plugged into valid_lang_attribute.  */
2691
2692 int
2693 cp_valid_lang_attribute (attr_name, attr_args, decl, type)
2694   tree attr_name;
2695   tree attr_args ATTRIBUTE_UNUSED;
2696   tree decl ATTRIBUTE_UNUSED;
2697   tree type ATTRIBUTE_UNUSED;
2698 {
2699   if (is_attribute_p ("com_interface", attr_name))
2700     {
2701       if (! flag_vtable_thunks)
2702         {
2703           error ("`com_interface' only supported with -fvtable-thunks");
2704           return 0;
2705         }
2706
2707       if (attr_args != NULL_TREE
2708           || decl != NULL_TREE
2709           || ! CLASS_TYPE_P (type)
2710           || type != TYPE_MAIN_VARIANT (type))
2711         {
2712           warning ("`com_interface' attribute can only be applied to class definitions");
2713           return 0;
2714         }
2715
2716       CLASSTYPE_COM_INTERFACE (type) = 1;
2717       return 1;
2718     }
2719   else if (is_attribute_p ("init_priority", attr_name))
2720     {
2721       tree initp_expr = (attr_args ? TREE_VALUE (attr_args): NULL_TREE);
2722       int pri;
2723
2724       if (initp_expr)
2725         STRIP_NOPS (initp_expr);
2726           
2727       if (!initp_expr || TREE_CODE (initp_expr) != INTEGER_CST)
2728         {
2729           error ("requested init_priority is not an integer constant");
2730           return 0;
2731         }
2732
2733       pri = TREE_INT_CST_LOW (initp_expr);
2734         
2735       while (TREE_CODE (type) == ARRAY_TYPE)
2736         type = TREE_TYPE (type);
2737
2738       if (decl == NULL_TREE
2739           || TREE_CODE (decl) != VAR_DECL
2740           || ! TREE_STATIC (decl)
2741           || DECL_EXTERNAL (decl)
2742           || (TREE_CODE (type) != RECORD_TYPE
2743               && TREE_CODE (type) != UNION_TYPE)
2744           /* Static objects in functions are initialized the
2745              first time control passes through that
2746              function. This is not precise enough to pin down an
2747              init_priority value, so don't allow it. */
2748           || current_function_decl) 
2749         {
2750           error ("can only use init_priority attribute on file-scope definitions of objects of class type");
2751           return 0;
2752         }
2753
2754       if (pri > MAX_INIT_PRIORITY || pri <= 0)
2755         {
2756           error ("requested init_priority is out of range");
2757           return 0;
2758         }
2759
2760       /* Check for init_priorities that are reserved for
2761          language and runtime support implementations.*/
2762       if (pri <= MAX_RESERVED_INIT_PRIORITY)
2763         {
2764           warning 
2765             ("requested init_priority is reserved for internal use");
2766         }
2767
2768       DECL_INIT_PRIORITY (decl) = pri;
2769       return 1;
2770     }
2771
2772   return 0;
2773 }
2774
2775 /* Return a new PTRMEM_CST of the indicated TYPE.  The MEMBER is the
2776    thing pointed to by the constant.  */
2777
2778 tree
2779 make_ptrmem_cst (type, member)
2780      tree type;
2781      tree member;
2782 {
2783   tree ptrmem_cst = make_node (PTRMEM_CST);
2784   /* If would seem a great convenience if make_node would set
2785      TREE_CONSTANT for things of class `c', but it does not.  */
2786   TREE_CONSTANT (ptrmem_cst) = 1;
2787   TREE_TYPE (ptrmem_cst) = type;
2788   PTRMEM_CST_MEMBER (ptrmem_cst) = member;
2789   return ptrmem_cst;
2790 }
2791
2792 /* Mark ARG (which is really a list_hash_table **) for GC.  */
2793
2794 static void
2795 mark_list_hash (arg)
2796      void *arg;
2797 {
2798   struct list_hash *lh;
2799
2800   for (lh = * ((struct list_hash **) arg); lh; lh = lh->next)
2801     ggc_mark_tree (lh->list);
2802 }
2803
2804 /* Initialize tree.c.  */
2805
2806 void
2807 init_tree ()
2808 {
2809   lang_unsave_expr_now = cplus_unsave_expr_now;
2810   ggc_add_root (list_hash_table, 
2811                 sizeof (list_hash_table) / sizeof (struct list_hash *),
2812                 sizeof (struct list_hash *),
2813                 mark_list_hash);
2814 }
2815
2816 /* The C++ version of unsave_expr_now.
2817    See gcc/tree.c:unsave_expr_now for comments. */
2818
2819 void
2820 cplus_unsave_expr_now (expr)
2821      tree expr;
2822 {
2823   if (expr == NULL)
2824     return;
2825
2826   else if (TREE_CODE (expr) == AGGR_INIT_EXPR)
2827     {
2828       unsave_expr_now (TREE_OPERAND (expr,0));
2829       if (TREE_OPERAND (expr, 1)
2830           && TREE_CODE (TREE_OPERAND (expr, 1)) == TREE_LIST)
2831         {
2832           tree exp = TREE_OPERAND (expr, 1);
2833           while (exp)
2834             {
2835               unsave_expr_now (TREE_VALUE (exp));
2836               exp = TREE_CHAIN (exp);
2837             }
2838         }
2839       unsave_expr_now (TREE_OPERAND (expr,2));
2840       return;
2841     }
2842
2843   else
2844     return;
2845 }
2846