OSDN Git Service

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