OSDN Git Service

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