OSDN Git Service

Make DECL_CONTEXT mean the class in which a member function was
[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, 2000 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 PARAMS ((tree *, int *, void *));
35 static tree bot_replace PARAMS ((tree *, int *, void *));
36 static tree build_cplus_array_type_1 PARAMS ((tree, tree));
37 static void list_hash_add PARAMS ((int, tree));
38 static int list_hash PARAMS ((tree, tree, tree));
39 static tree list_hash_lookup PARAMS ((int, tree, tree, tree));
40 static cp_lvalue_kind lvalue_p_1 PARAMS ((tree, int));
41 static tree no_linkage_helper PARAMS ((tree *, int *, void *));
42 static tree build_srcloc PARAMS ((char *, int));
43 static void mark_list_hash PARAMS ((void *));
44 static int statement_code_p PARAMS ((enum tree_code));
45 static tree mark_local_for_remap_r PARAMS ((tree *, int *, void *));
46 static tree cp_unsave_r PARAMS ((tree *, int *, void *));
47 static void cp_unsave PARAMS ((tree *));
48 static tree build_target_expr PARAMS ((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 TREE_LIST whose TREE_VALUE nodes along the
887    BINFO_INHERITANCE_CHAIN for BINFO, but in the opposite order.  In
888    other words, while the BINFO_INHERITANCE_CHAIN goes from base
889    classes to derived classes, the reversed path goes from derived
890    classes to base classes.  */
891
892 tree
893 reverse_path (binfo)
894      tree binfo;
895 {
896   tree reversed_path;
897
898   reversed_path = NULL_TREE;
899   while (binfo) 
900     {
901       reversed_path = tree_cons (NULL_TREE, binfo, reversed_path);
902       binfo = BINFO_INHERITANCE_CHAIN (binfo);
903     }
904
905   return reversed_path;
906 }
907
908 void
909 debug_binfo (elem)
910      tree elem;
911 {
912   unsigned HOST_WIDE_INT n;
913   tree virtuals;
914
915   fprintf (stderr, "type \"%s\"; offset = %ld\n",
916            TYPE_NAME_STRING (BINFO_TYPE (elem)),
917            (long) TREE_INT_CST_LOW (BINFO_OFFSET (elem)));
918   fprintf (stderr, "vtable type:\n");
919   debug_tree (BINFO_TYPE (elem));
920   if (BINFO_VTABLE (elem))
921     fprintf (stderr, "vtable decl \"%s\"\n", IDENTIFIER_POINTER (DECL_NAME (BINFO_VTABLE (elem))));
922   else
923     fprintf (stderr, "no vtable decl yet\n");
924   fprintf (stderr, "virtuals:\n");
925   virtuals = skip_rtti_stuff (elem, BINFO_TYPE (elem), &n);
926
927   while (virtuals)
928     {
929       tree fndecl = TREE_VALUE (virtuals);
930       fprintf (stderr, "%s [%ld =? %ld]\n",
931                IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl)),
932                (long) n, (long) TREE_INT_CST_LOW (DECL_VINDEX (fndecl)));
933       ++n;
934       virtuals = TREE_CHAIN (virtuals);
935     }
936 }
937
938 int
939 count_functions (t)
940      tree t;
941 {
942   int i;
943   if (TREE_CODE (t) == FUNCTION_DECL)
944     return 1;
945   else if (TREE_CODE (t) == OVERLOAD)
946     {
947       for (i=0; t; t = OVL_CHAIN (t))
948         i++;
949       return i;
950     }
951
952   my_friendly_abort (359);
953   return 0;
954 }
955
956 int
957 is_overloaded_fn (x)
958      tree x;
959 {
960   /* A baselink is also considered an overloaded function.  */
961   if (TREE_CODE (x) == OFFSET_REF)
962     x = TREE_OPERAND (x, 1);
963   if (BASELINK_P (x))
964     x = TREE_VALUE (x);
965   return (TREE_CODE (x) == FUNCTION_DECL
966           || TREE_CODE (x) == TEMPLATE_ID_EXPR
967           || DECL_FUNCTION_TEMPLATE_P (x)
968           || TREE_CODE (x) == OVERLOAD);
969 }
970
971 int
972 really_overloaded_fn (x)
973      tree x;
974 {     
975   /* A baselink is also considered an overloaded function.  */
976   if (TREE_CODE (x) == OFFSET_REF)
977     x = TREE_OPERAND (x, 1);
978   if (BASELINK_P (x))
979     x = TREE_VALUE (x);
980   return (TREE_CODE (x) == OVERLOAD 
981           && (TREE_CHAIN (x) != NULL_TREE
982               || DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (x))));
983 }
984
985 tree
986 get_first_fn (from)
987      tree from;
988 {
989   my_friendly_assert (is_overloaded_fn (from), 9);
990   /* A baselink is also considered an overloaded function. */
991   if (BASELINK_P (from))
992     from = TREE_VALUE (from);
993   return OVL_CURRENT (from);
994 }
995
996 /* Returns nonzero if T is a ->* or .* expression that refers to a
997    member function.  */
998
999 int
1000 bound_pmf_p (t)
1001      tree t;
1002 {
1003   return (TREE_CODE (t) == OFFSET_REF
1004           && TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (t, 1))));
1005 }
1006
1007 /* Return a new OVL node, concatenating it with the old one. */
1008
1009 tree
1010 ovl_cons (decl, chain)
1011      tree decl;
1012      tree chain;
1013 {
1014   tree result = make_node (OVERLOAD);
1015   TREE_TYPE (result) = unknown_type_node;
1016   OVL_FUNCTION (result) = decl;
1017   TREE_CHAIN (result) = chain;
1018   
1019   return result;
1020 }
1021
1022 /* Build a new overloaded function. If this is the first one,
1023    just return it; otherwise, ovl_cons the _DECLs */
1024
1025 tree
1026 build_overload (decl, chain)
1027      tree decl;
1028      tree chain;
1029 {
1030   if (! chain && TREE_CODE (decl) != TEMPLATE_DECL)
1031     return decl;
1032   if (chain && TREE_CODE (chain) != OVERLOAD)
1033     chain = ovl_cons (chain, NULL_TREE);
1034   return ovl_cons (decl, chain);
1035 }
1036
1037 /* True if fn is in ovl. */
1038
1039 int
1040 ovl_member (fn, ovl)
1041      tree fn;
1042      tree ovl;
1043 {
1044   if (ovl == NULL_TREE)
1045     return 0;
1046   if (TREE_CODE (ovl) != OVERLOAD)
1047     return ovl == fn;
1048   for (; ovl; ovl = OVL_CHAIN (ovl))
1049     if (OVL_FUNCTION (ovl) == fn)
1050       return 1;
1051   return 0;
1052 }
1053
1054 int
1055 is_aggr_type_2 (t1, t2)
1056      tree t1, t2;
1057 {
1058   if (TREE_CODE (t1) != TREE_CODE (t2))
1059     return 0;
1060   return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
1061 }
1062
1063 /* Returns non-zero if CODE is the code for a statement.  */
1064
1065 static int
1066 statement_code_p (code)
1067      enum tree_code code;
1068 {
1069   switch (code)
1070     {
1071     case EXPR_STMT:
1072     case COMPOUND_STMT:
1073     case DECL_STMT:
1074     case IF_STMT:
1075     case FOR_STMT:
1076     case WHILE_STMT:
1077     case DO_STMT:
1078     case RETURN_STMT:
1079     case BREAK_STMT:
1080     case CONTINUE_STMT:
1081     case SWITCH_STMT:
1082     case GOTO_STMT:
1083     case LABEL_STMT:
1084     case ASM_STMT:
1085     case SUBOBJECT:
1086     case CLEANUP_STMT:
1087     case START_CATCH_STMT:
1088     case CTOR_STMT:
1089     case SCOPE_STMT:
1090     case CTOR_INITIALIZER:
1091     case CASE_LABEL:
1092     case RETURN_INIT:
1093     case TRY_BLOCK:
1094     case HANDLER:
1095       return 1;
1096
1097     default:
1098       return 0;
1099     }
1100 }
1101 \f
1102 #define PRINT_RING_SIZE 4
1103
1104 const char *
1105 lang_printable_name (decl, v)
1106      tree decl;
1107      int v;
1108 {
1109   static tree decl_ring[PRINT_RING_SIZE];
1110   static char *print_ring[PRINT_RING_SIZE];
1111   static int ring_counter;
1112   int i;
1113
1114   /* Only cache functions.  */
1115   if (v < 2
1116       || TREE_CODE (decl) != FUNCTION_DECL
1117       || DECL_LANG_SPECIFIC (decl) == 0)
1118     return lang_decl_name (decl, v);
1119
1120   /* See if this print name is lying around.  */
1121   for (i = 0; i < PRINT_RING_SIZE; i++)
1122     if (decl_ring[i] == decl)
1123       /* yes, so return it.  */
1124       return print_ring[i];
1125
1126   if (++ring_counter == PRINT_RING_SIZE)
1127     ring_counter = 0;
1128
1129   if (current_function_decl != NULL_TREE)
1130     {
1131       if (decl_ring[ring_counter] == current_function_decl)
1132         ring_counter += 1;
1133       if (ring_counter == PRINT_RING_SIZE)
1134         ring_counter = 0;
1135       if (decl_ring[ring_counter] == current_function_decl)
1136         my_friendly_abort (106);
1137     }
1138
1139   if (print_ring[ring_counter])
1140     free (print_ring[ring_counter]);
1141
1142   print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v));
1143   decl_ring[ring_counter] = decl;
1144   return print_ring[ring_counter];
1145 }
1146 \f
1147 /* Build the FUNCTION_TYPE or METHOD_TYPE which may throw exceptions
1148    listed in RAISES.  */
1149
1150 tree
1151 build_exception_variant (type, raises)
1152      tree type;
1153      tree raises;
1154 {
1155   tree v = TYPE_MAIN_VARIANT (type);
1156   int type_quals = TYPE_QUALS (type);
1157
1158   for (; v; v = TYPE_NEXT_VARIANT (v))
1159     if (TYPE_QUALS (v) == type_quals
1160         && comp_except_specs (raises, TYPE_RAISES_EXCEPTIONS (v), 1))
1161       return v;
1162
1163   /* Need to build a new variant.  */
1164   v = build_type_copy (type);
1165   TYPE_RAISES_EXCEPTIONS (v) = raises;
1166   return v;
1167 }
1168
1169 /* Given a TEMPLATE_TEMPLATE_PARM node T, create a new one together with its 
1170    lang_specific field and its corresponding TEMPLATE_DECL node */
1171
1172 tree
1173 copy_template_template_parm (t)
1174      tree t;
1175 {
1176   tree template = TYPE_NAME (t);
1177   tree t2;
1178
1179   t2 = make_aggr_type (TEMPLATE_TEMPLATE_PARM);
1180   template = copy_node (template);
1181   copy_lang_decl (template);
1182
1183   TREE_TYPE (template) = t2;
1184   TYPE_NAME (t2) = template;
1185   TYPE_STUB_DECL (t2) = template;
1186
1187   /* No need to copy these */
1188   TYPE_FIELDS (t2) = TYPE_FIELDS (t);
1189   TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t2) 
1190     = TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t);
1191   return t2;
1192 }
1193
1194 /* Apply FUNC to all the sub-trees of TP in a pre-order traversal.
1195    FUNC is called with the DATA and the address of each sub-tree.  If
1196    FUNC returns a non-NULL value, the traversal is aborted, and the
1197    value returned by FUNC is returned.  */
1198
1199 tree 
1200 walk_tree (tp, func, data)
1201      tree *tp;
1202      walk_tree_fn func;
1203      void *data;
1204 {
1205   enum tree_code code;
1206   int walk_subtrees;
1207   tree result;
1208   
1209 #define WALK_SUBTREE(NODE)                      \
1210   do                                            \
1211     {                                           \
1212       result = walk_tree (&(NODE), func, data); \
1213       if (result)                               \
1214         return result;                          \
1215     }                                           \
1216   while (0)
1217
1218   /* Skip empty subtrees.  */
1219   if (!*tp)
1220     return NULL_TREE;
1221
1222   /* Call the function.  */
1223   walk_subtrees = 1;
1224   result = (*func) (tp, &walk_subtrees, data);
1225
1226   /* If we found something, return it.  */
1227   if (result)
1228     return result;
1229
1230   /* Even if we didn't, FUNC may have decided that there was nothing
1231      interesting below this point in the tree.  */
1232   if (!walk_subtrees)
1233     return NULL_TREE;
1234
1235   code = TREE_CODE (*tp);
1236
1237   /* Handle common cases up front.  */
1238   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1239       || TREE_CODE_CLASS (code) == 'r'
1240       || TREE_CODE_CLASS (code) == 's')
1241     {
1242       int i, len;
1243
1244       /* Walk over all the sub-trees of this operand.  */
1245       len = first_rtl_op (code);
1246       /* TARGET_EXPRs are peculiar: operands 1 and 3 can be the same.
1247          But, we only want to walk once.  */
1248       if (code == TARGET_EXPR
1249           && TREE_OPERAND (*tp, 3) == TREE_OPERAND (*tp, 1))
1250         --len;
1251       /* Go through the subtrees.  We need to do this in forward order so
1252          that the scope of a FOR_EXPR is handled properly.  */
1253       for (i = 0; i < len; ++i)
1254         WALK_SUBTREE (TREE_OPERAND (*tp, i));
1255
1256       /* For statements, we also walk the chain so that we cover the
1257          entire statement tree.  */
1258       if (statement_code_p (code))
1259         {
1260           if (code == DECL_STMT 
1261               && DECL_STMT_DECL (*tp) 
1262               && TREE_CODE_CLASS (TREE_CODE (DECL_STMT_DECL (*tp))) == 'd')
1263             {
1264               /* Walk the DECL_INITIAL and DECL_SIZE.  We don't want to walk
1265                  into declarations that are just mentioned, rather than
1266                  declared; they don't really belong to this part of the tree.
1267                  And, we can see cycles: the initializer for a declaration can
1268                  refer to the declaration itself.  */
1269               WALK_SUBTREE (DECL_INITIAL (DECL_STMT_DECL (*tp)));
1270               WALK_SUBTREE (DECL_SIZE (DECL_STMT_DECL (*tp)));
1271             }
1272
1273           WALK_SUBTREE (TREE_CHAIN (*tp));
1274         }
1275
1276       /* We didn't find what we were looking for.  */
1277       return NULL_TREE;
1278     }
1279   else if (TREE_CODE_CLASS (code) == 'd')
1280     {
1281       WALK_SUBTREE (TREE_TYPE (*tp));
1282
1283       /* We didn't find what we were looking for.  */
1284       return NULL_TREE;
1285     }
1286
1287   /* Not one of the easy cases.  We must explicitly go through the
1288      children.  */
1289   switch (code)
1290     {
1291     case ERROR_MARK:
1292     case IDENTIFIER_NODE:
1293     case INTEGER_CST:
1294     case REAL_CST:
1295     case STRING_CST:
1296     case DEFAULT_ARG:
1297     case TEMPLATE_TEMPLATE_PARM:
1298     case TEMPLATE_PARM_INDEX:
1299     case TEMPLATE_TYPE_PARM:
1300     case REAL_TYPE:
1301     case COMPLEX_TYPE:
1302     case VOID_TYPE:
1303     case BOOLEAN_TYPE:
1304     case TYPENAME_TYPE:
1305     case UNION_TYPE:
1306     case ENUMERAL_TYPE:
1307     case TYPEOF_TYPE:
1308     case BLOCK:
1309       /* None of thse have subtrees other than those already walked
1310          above.  */
1311       break;
1312
1313     case PTRMEM_CST:
1314       WALK_SUBTREE (TREE_TYPE (*tp));
1315       break;
1316
1317     case POINTER_TYPE:
1318     case REFERENCE_TYPE:
1319       WALK_SUBTREE (TREE_TYPE (*tp));
1320       break;
1321
1322     case TREE_LIST:
1323       WALK_SUBTREE (TREE_PURPOSE (*tp));
1324       WALK_SUBTREE (TREE_VALUE (*tp));
1325       WALK_SUBTREE (TREE_CHAIN (*tp));
1326       break;
1327
1328     case OVERLOAD:
1329       WALK_SUBTREE (OVL_FUNCTION (*tp));
1330       WALK_SUBTREE (OVL_CHAIN (*tp));
1331       break;
1332
1333     case TREE_VEC:
1334       {
1335         int len = TREE_VEC_LENGTH (*tp);
1336         while (len--)
1337           WALK_SUBTREE (TREE_VEC_ELT (*tp, len));
1338       }
1339       break;
1340
1341     case COMPLEX_CST:
1342       WALK_SUBTREE (TREE_REALPART (*tp));
1343       WALK_SUBTREE (TREE_IMAGPART (*tp));
1344       break;
1345
1346     case CONSTRUCTOR:
1347       WALK_SUBTREE (CONSTRUCTOR_ELTS (*tp));
1348       break;
1349
1350     case METHOD_TYPE:
1351       WALK_SUBTREE (TYPE_METHOD_BASETYPE (*tp));
1352       /* Fall through.  */
1353
1354     case FUNCTION_TYPE:
1355       WALK_SUBTREE (TREE_TYPE (*tp));
1356       WALK_SUBTREE (TYPE_ARG_TYPES (*tp));
1357       break;
1358
1359     case ARRAY_TYPE:
1360       WALK_SUBTREE (TREE_TYPE (*tp));
1361       WALK_SUBTREE (TYPE_DOMAIN (*tp));
1362       break;
1363
1364     case INTEGER_TYPE:
1365       WALK_SUBTREE (TYPE_MIN_VALUE (*tp));
1366       WALK_SUBTREE (TYPE_MAX_VALUE (*tp));
1367       break;
1368
1369     case OFFSET_TYPE:
1370       WALK_SUBTREE (TREE_TYPE (*tp));
1371       WALK_SUBTREE (TYPE_OFFSET_BASETYPE (*tp));
1372       break;
1373
1374     case RECORD_TYPE:
1375       if (TYPE_PTRMEMFUNC_P (*tp))
1376         WALK_SUBTREE (TYPE_PTRMEMFUNC_FN_TYPE (*tp));
1377       break;
1378
1379     default:
1380       my_friendly_abort (19990803);
1381     }
1382
1383   /* We didn't find what we were looking for.  */
1384   return NULL_TREE;
1385
1386 #undef WALK_SUBTREE
1387 }
1388
1389 /* Passed to walk_tree.  Checks for the use of types with no linkage.  */
1390
1391 static tree
1392 no_linkage_helper (tp, walk_subtrees, data)
1393      tree *tp;
1394      int *walk_subtrees ATTRIBUTE_UNUSED;
1395      void *data ATTRIBUTE_UNUSED;
1396 {
1397   tree t = *tp;
1398
1399   if (TYPE_P (t)
1400       && (IS_AGGR_TYPE (t) || TREE_CODE (t) == ENUMERAL_TYPE)
1401       && (decl_function_context (TYPE_MAIN_DECL (t))
1402           || ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))))
1403     return t;
1404   return NULL_TREE;
1405 }
1406
1407 /* Check if the type T depends on a type with no linkage and if so, return
1408    it.  */
1409
1410 tree
1411 no_linkage_check (t)
1412      tree t;
1413 {
1414   /* There's no point in checking linkage on template functions; we
1415      can't know their complete types.  */
1416   if (processing_template_decl)
1417     return NULL_TREE;
1418
1419   t = walk_tree (&t, no_linkage_helper, NULL);
1420   if (t != error_mark_node)
1421     return t;
1422   return NULL_TREE;
1423 }
1424
1425 /* Passed to walk_tree.  Copies the node pointed to, if appropriate.  */
1426
1427 tree
1428 copy_tree_r (tp, walk_subtrees, data)
1429      tree *tp;
1430      int *walk_subtrees;
1431      void *data ATTRIBUTE_UNUSED;
1432 {
1433   enum tree_code code = TREE_CODE (*tp);
1434
1435   /* We make copies of most nodes.  */
1436   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1437       || TREE_CODE_CLASS (code) == 'r'
1438       || TREE_CODE_CLASS (code) == 'c'
1439       || TREE_CODE_CLASS (code) == 's'
1440       || code == PARM_DECL
1441       || code == TREE_LIST
1442       || code == TREE_VEC
1443       || code == OVERLOAD)
1444     {
1445       /* Because the chain gets clobbered when we make a copy, we save it
1446          here.  */
1447       tree chain = TREE_CHAIN (*tp);
1448
1449       /* Copy the node.  */
1450       *tp = copy_node (*tp);
1451
1452       /* Now, restore the chain, if appropriate.  That will cause
1453          walk_tree to walk into the chain as well.  */
1454       if (code == PARM_DECL || code == TREE_LIST || code == OVERLOAD
1455           || statement_code_p (code))
1456         TREE_CHAIN (*tp) = chain;
1457
1458       /* For now, we don't update BLOCKs when we make copies.  So, we
1459          have to nullify all scope-statements.  */
1460       if (TREE_CODE (*tp) == SCOPE_STMT)
1461         SCOPE_STMT_BLOCK (*tp) = NULL_TREE;
1462     }
1463   else if (code == TEMPLATE_TEMPLATE_PARM)
1464     /* These must be copied specially.  */
1465     *tp = copy_template_template_parm (*tp);
1466   else if (TREE_CODE_CLASS (code) == 't')
1467     /* There's no need to copy types, or anything beneath them.  */
1468     *walk_subtrees = 0;
1469
1470   return NULL_TREE;
1471 }
1472
1473 #ifdef GATHER_STATISTICS
1474 extern int depth_reached;
1475 #endif
1476
1477 void
1478 print_lang_statistics ()
1479 {
1480   print_search_statistics ();
1481   print_class_statistics ();
1482 #ifdef GATHER_STATISTICS
1483   fprintf (stderr, "maximum template instantiation depth reached: %d\n",
1484            depth_reached);
1485 #endif
1486 }
1487
1488 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1489    (which is an ARRAY_TYPE).  This counts only elements of the top
1490    array.  */
1491
1492 tree
1493 array_type_nelts_top (type)
1494      tree type;
1495 {
1496   return fold (build (PLUS_EXPR, sizetype,
1497                       array_type_nelts (type),
1498                       integer_one_node));
1499 }
1500
1501 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1502    (which is an ARRAY_TYPE).  This one is a recursive count of all
1503    ARRAY_TYPEs that are clumped together.  */
1504
1505 tree
1506 array_type_nelts_total (type)
1507      tree type;
1508 {
1509   tree sz = array_type_nelts_top (type);
1510   type = TREE_TYPE (type);
1511   while (TREE_CODE (type) == ARRAY_TYPE)
1512     {
1513       tree n = array_type_nelts_top (type);
1514       sz = fold (build (MULT_EXPR, sizetype, sz, n));
1515       type = TREE_TYPE (type);
1516     }
1517   return sz;
1518 }
1519
1520 /* Called from break_out_target_exprs via mapcar.  */
1521
1522 static tree
1523 bot_manip (tp, walk_subtrees, data)
1524      tree *tp;
1525      int *walk_subtrees;
1526      void *data;
1527 {
1528   splay_tree target_remap = ((splay_tree) data);
1529   tree t = *tp;
1530
1531   if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
1532     {
1533       /* There can't be any TARGET_EXPRs below this point.  */
1534       *walk_subtrees = 0;
1535       return NULL_TREE;
1536     }
1537   else if (TREE_CODE (t) == TARGET_EXPR)
1538     {
1539       tree u;
1540
1541       if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR)
1542         {
1543           mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0));
1544           u = build_cplus_new
1545             (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1)));
1546         }
1547       else 
1548         {
1549           tree var;
1550
1551           u = copy_node (t);
1552           var = build (VAR_DECL, TREE_TYPE (t));
1553           DECL_CONTEXT (var) = current_function_decl;
1554           layout_decl (var, 0);
1555           TREE_OPERAND (u, 0) = var;
1556         }
1557
1558       /* Map the old variable to the new one.  */
1559       splay_tree_insert (target_remap, 
1560                          (splay_tree_key) TREE_OPERAND (t, 0), 
1561                          (splay_tree_value) TREE_OPERAND (u, 0));
1562
1563       /* Replace the old expression with the new version.  */
1564       *tp = u;
1565       /* We don't have to go below this point; the recursive call to
1566          break_out_target_exprs will have handled anything below this
1567          point.  */
1568       *walk_subtrees = 0;
1569       return NULL_TREE;
1570     }
1571   else if (TREE_CODE (t) == CALL_EXPR)
1572     mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
1573
1574   /* Make a copy of this node.  */
1575   return copy_tree_r (tp, walk_subtrees, NULL);
1576 }
1577   
1578 /* Replace all remapped VAR_DECLs in T with their new equivalents.
1579    DATA is really a splay-tree mapping old variables to new
1580    variables.  */
1581
1582 static tree
1583 bot_replace (t, walk_subtrees, data)
1584      tree *t;
1585      int *walk_subtrees ATTRIBUTE_UNUSED;
1586      void *data;
1587 {
1588   splay_tree target_remap = ((splay_tree) data);
1589
1590   if (TREE_CODE (*t) == VAR_DECL)
1591     {
1592       splay_tree_node n = splay_tree_lookup (target_remap,
1593                                              (splay_tree_key) *t);
1594       if (n)
1595         *t = (tree) n->value;
1596     }
1597
1598   return NULL_TREE;
1599 }
1600         
1601 /* When we parse a default argument expression, we may create
1602    temporary variables via TARGET_EXPRs.  When we actually use the
1603    default-argument expression, we make a copy of the expression, but
1604    we must replace the temporaries with appropriate local versions.  */
1605
1606 tree
1607 break_out_target_exprs (t)
1608      tree t;
1609 {
1610   static int target_remap_count;
1611   static splay_tree target_remap;
1612
1613   if (!target_remap_count++)
1614     target_remap = splay_tree_new (splay_tree_compare_pointers, 
1615                                    /*splay_tree_delete_key_fn=*/NULL, 
1616                                    /*splay_tree_delete_value_fn=*/NULL);
1617   walk_tree (&t, bot_manip, target_remap);
1618   walk_tree (&t, bot_replace, target_remap);
1619
1620   if (!--target_remap_count)
1621     {
1622       splay_tree_delete (target_remap);
1623       target_remap = NULL;
1624     }
1625
1626   return t;
1627 }
1628
1629 /* Obstack used for allocating nodes in template function and variable
1630    definitions.  */
1631
1632 /* Similar to `build_nt', except that we set TREE_COMPLEXITY to be the
1633    current line number.  */
1634
1635 tree
1636 build_min_nt VPARAMS ((enum tree_code code, ...))
1637 {
1638 #ifndef ANSI_PROTOTYPES
1639   enum tree_code code;
1640 #endif
1641   va_list p;
1642   register tree t;
1643   register int length;
1644   register int i;
1645
1646   VA_START (p, code);
1647
1648 #ifndef ANSI_PROTOTYPES
1649   code = va_arg (p, enum tree_code);
1650 #endif
1651
1652   t = make_node (code);
1653   length = tree_code_length[(int) code];
1654   TREE_COMPLEXITY (t) = lineno;
1655
1656   for (i = 0; i < length; i++)
1657     {
1658       tree x = va_arg (p, tree);
1659       TREE_OPERAND (t, i) = x;
1660     }
1661
1662   va_end (p);
1663   return t;
1664 }
1665
1666 /* Similar to `build', except we set TREE_COMPLEXITY to the current
1667    line-number.  */
1668
1669 tree
1670 build_min VPARAMS ((enum tree_code code, tree tt, ...))
1671 {
1672 #ifndef ANSI_PROTOTYPES
1673   enum tree_code code;
1674   tree tt;
1675 #endif
1676   va_list p;
1677   register tree t;
1678   register int length;
1679   register int i;
1680
1681   VA_START (p, tt);
1682
1683 #ifndef ANSI_PROTOTYPES
1684   code = va_arg (p, enum tree_code);
1685   tt = va_arg (p, tree);
1686 #endif
1687
1688   t = make_node (code);
1689   length = tree_code_length[(int) code];
1690   TREE_TYPE (t) = tt;
1691   TREE_COMPLEXITY (t) = lineno;
1692
1693   for (i = 0; i < length; i++)
1694     {
1695       tree x = va_arg (p, tree);
1696       TREE_OPERAND (t, i) = x;
1697     }
1698
1699   va_end (p);
1700   return t;
1701 }
1702
1703 /* Returns an INTEGER_CST (of type `int') corresponding to I.
1704    Multiple calls with the same value of I may or may not yield the
1705    same node; therefore, callers should never modify the node
1706    returned.  */
1707
1708 tree
1709 build_shared_int_cst (i)
1710      int i;
1711 {
1712   static tree cache[256];
1713
1714   if (i >= 256)
1715     return build_int_2 (i, 0);
1716   
1717   if (!cache[i])
1718     cache[i] = build_int_2 (i, 0);
1719   
1720   return cache[i];
1721 }
1722
1723 tree
1724 get_type_decl (t)
1725      tree t;
1726 {
1727   if (TREE_CODE (t) == TYPE_DECL)
1728     return t;
1729   if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
1730     return TYPE_STUB_DECL (t);
1731   
1732   my_friendly_abort (42);
1733
1734   /* Stop compiler from complaining control reaches end of non-void function.  */
1735   return 0;
1736 }
1737
1738 int
1739 can_free (obstack, t)
1740      struct obstack *obstack;
1741      tree t;
1742 {
1743   int size = 0;
1744
1745   if (TREE_CODE (t) == TREE_VEC)
1746     size = (TREE_VEC_LENGTH (t)-1) * sizeof (tree) + sizeof (struct tree_vec);
1747   else
1748     my_friendly_abort (42);
1749
1750 #define ROUND(x) ((x + obstack_alignment_mask (obstack)) \
1751                   & ~ obstack_alignment_mask (obstack))
1752   if ((char *)t + ROUND (size) == obstack_next_free (obstack))
1753     return 1;
1754 #undef ROUND
1755
1756   return 0;
1757 }
1758
1759 /* Return first vector element whose BINFO_TYPE is ELEM.
1760    Return 0 if ELEM is not in VEC.  VEC may be NULL_TREE.  */
1761
1762 tree
1763 vec_binfo_member (elem, vec)
1764      tree elem, vec;
1765 {
1766   int i;
1767
1768   if (vec)
1769     for (i = 0; i < TREE_VEC_LENGTH (vec); ++i)
1770       if (same_type_p (elem, BINFO_TYPE (TREE_VEC_ELT (vec, i))))
1771         return TREE_VEC_ELT (vec, i);
1772
1773   return NULL_TREE;
1774 }
1775
1776 /* Returns the namespace that contains DECL, whether directly or
1777    indirectly.  */
1778
1779 tree
1780 decl_namespace_context (decl)
1781      tree decl;
1782 {
1783   while (1)
1784     {
1785       if (TREE_CODE (decl) == NAMESPACE_DECL)
1786         return decl;
1787       else if (TYPE_P (decl))
1788         decl = CP_DECL_CONTEXT (TYPE_MAIN_DECL (decl));
1789       else
1790         decl = CP_DECL_CONTEXT (decl);
1791     }
1792 }
1793
1794 /* Return truthvalue of whether T1 is the same tree structure as T2.
1795    Return 1 if they are the same.
1796    Return 0 if they are understandably different.
1797    Return -1 if either contains tree structure not understood by
1798    this function.  */
1799
1800 int
1801 cp_tree_equal (t1, t2)
1802      tree t1, t2;
1803 {
1804   register enum tree_code code1, code2;
1805   int cmp;
1806
1807   if (t1 == t2)
1808     return 1;
1809   if (t1 == 0 || t2 == 0)
1810     return 0;
1811
1812   code1 = TREE_CODE (t1);
1813   code2 = TREE_CODE (t2);
1814
1815   if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR)
1816     {
1817       if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR)
1818         return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1819       else
1820         return cp_tree_equal (TREE_OPERAND (t1, 0), t2);
1821     }
1822   else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR
1823            || code2 == NON_LVALUE_EXPR)
1824     return cp_tree_equal (t1, TREE_OPERAND (t2, 0));
1825
1826   if (code1 != code2)
1827     return 0;
1828
1829   switch (code1)
1830     {
1831     case INTEGER_CST:
1832       return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
1833         && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2);
1834
1835     case REAL_CST:
1836       return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
1837
1838     case STRING_CST:
1839       return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
1840         && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1841                   TREE_STRING_LENGTH (t1));
1842
1843     case CONSTRUCTOR:
1844       /* We need to do this when determining whether or not two
1845          non-type pointer to member function template arguments
1846          are the same.  */
1847       if (!(same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))
1848             /* The first operand is RTL.  */
1849             && TREE_OPERAND (t1, 0) == TREE_OPERAND (t2, 0)))
1850         return 0;
1851       return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
1852
1853     case TREE_LIST:
1854       cmp = cp_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2));
1855       if (cmp <= 0)
1856         return cmp;
1857       cmp = cp_tree_equal (TREE_VALUE (t1), TREE_VALUE (t2));
1858       if (cmp <= 0)
1859         return cmp;
1860       return cp_tree_equal (TREE_CHAIN (t1), TREE_CHAIN (t2));
1861
1862     case SAVE_EXPR:
1863       return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1864
1865     case CALL_EXPR:
1866       cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1867       if (cmp <= 0)
1868         return cmp;
1869       return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
1870
1871     case TARGET_EXPR:
1872       /* Special case: if either target is an unallocated VAR_DECL,
1873          it means that it's going to be unified with whatever the
1874          TARGET_EXPR is really supposed to initialize, so treat it
1875          as being equivalent to anything.  */
1876       if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
1877            && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
1878            && DECL_RTL (TREE_OPERAND (t1, 0)) == 0)
1879           || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
1880               && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
1881               && DECL_RTL (TREE_OPERAND (t2, 0)) == 0))
1882         cmp = 1;
1883       else
1884         cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1885       if (cmp <= 0)
1886         return cmp;
1887       return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
1888
1889     case WITH_CLEANUP_EXPR:
1890       cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1891       if (cmp <= 0)
1892         return cmp;
1893       return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
1894
1895     case COMPONENT_REF:
1896       if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
1897         return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1898       return 0;
1899
1900     case VAR_DECL:
1901     case PARM_DECL:
1902     case CONST_DECL:
1903     case FUNCTION_DECL:
1904       return 0;
1905
1906     case TEMPLATE_PARM_INDEX:
1907       return TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2)
1908         && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2);
1909
1910     case SIZEOF_EXPR:
1911     case ALIGNOF_EXPR:
1912       if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
1913         return 0;
1914       if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
1915         return same_type_p (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1916       break;
1917
1918     case PTRMEM_CST:
1919       /* Two pointer-to-members are the same if they point to the same
1920          field or function in the same class.  */
1921       return (PTRMEM_CST_MEMBER (t1) == PTRMEM_CST_MEMBER (t2)
1922               && same_type_p (PTRMEM_CST_CLASS (t1), PTRMEM_CST_CLASS (t2)));
1923
1924     default:
1925       break;
1926     }
1927
1928   switch (TREE_CODE_CLASS (code1))
1929     {
1930       int i;
1931     case '1':
1932     case '2':
1933     case '<':
1934     case 'e':
1935     case 'r':
1936     case 's':
1937       cmp = 1;
1938       for (i=0; i<tree_code_length[(int) code1]; ++i)
1939         {
1940           cmp = cp_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
1941           if (cmp <= 0)
1942             return cmp;
1943         }
1944       return cmp;
1945     }
1946
1947   return -1;
1948 }
1949
1950 /* Build a wrapper around some pointer PTR so we can use it as a tree.  */
1951
1952 tree
1953 build_ptr_wrapper (ptr)
1954      void *ptr;
1955 {
1956   tree t = make_node (WRAPPER);
1957   WRAPPER_PTR (t) = ptr;
1958   return t;
1959 }
1960
1961 /* Same, but on the expression_obstack.  */
1962
1963 tree
1964 build_expr_ptr_wrapper (ptr)
1965      void *ptr;
1966 {
1967   return build_ptr_wrapper (ptr);
1968 }
1969
1970 /* Build a wrapper around some integer I so we can use it as a tree.  */
1971
1972 tree
1973 build_int_wrapper (i)
1974      int i;
1975 {
1976   tree t = make_node (WRAPPER);
1977   WRAPPER_INT (t) = i;
1978   return t;
1979 }
1980
1981 static tree
1982 build_srcloc (file, line)
1983      char *file;
1984      int line;
1985 {
1986   tree t;
1987
1988   t = make_node (SRCLOC);
1989   SRCLOC_FILE (t) = file;
1990   SRCLOC_LINE (t) = line;
1991
1992   return t;
1993 }
1994
1995 tree
1996 build_srcloc_here ()
1997 {
1998   return build_srcloc (input_filename, lineno);
1999 }
2000
2001 /* The type of ARG when used as an lvalue.  */
2002
2003 tree
2004 lvalue_type (arg)
2005      tree arg;
2006 {
2007   tree type = TREE_TYPE (arg);
2008   if (TREE_CODE (arg) == OVERLOAD)
2009     type = unknown_type_node;
2010   return type;
2011 }
2012
2013 /* The type of ARG for printing error messages; denote lvalues with
2014    reference types.  */
2015
2016 tree
2017 error_type (arg)
2018      tree arg;
2019 {
2020   tree type = TREE_TYPE (arg);
2021   if (TREE_CODE (type) == ARRAY_TYPE)
2022     ;
2023   else if (real_lvalue_p (arg))
2024     type = build_reference_type (lvalue_type (arg));
2025   else if (IS_AGGR_TYPE (type))
2026     type = lvalue_type (arg);
2027
2028   return type;
2029 }
2030
2031 /* Does FUNCTION use a variable-length argument list?  */
2032
2033 int
2034 varargs_function_p (function)
2035      tree function;
2036 {
2037   tree parm = TYPE_ARG_TYPES (TREE_TYPE (function));
2038   for (; parm; parm = TREE_CHAIN (parm))
2039     if (TREE_VALUE (parm) == void_type_node)
2040       return 0;
2041   return 1;
2042 }
2043
2044 /* Returns 1 if decl is a member of a class.  */
2045
2046 int
2047 member_p (decl)
2048      tree decl;
2049 {
2050   tree ctx = DECL_CONTEXT (decl);
2051   return (ctx && TREE_CODE_CLASS (TREE_CODE (ctx)) == 't');
2052 }
2053
2054 /* Create a placeholder for member access where we don't actually have an
2055    object that the access is against.  */
2056
2057 tree
2058 build_dummy_object (type)
2059      tree type;
2060 {
2061   tree decl = build1 (NOP_EXPR, build_pointer_type (type), void_zero_node);
2062   return build_indirect_ref (decl, NULL_PTR);
2063 }
2064
2065 /* We've gotten a reference to a member of TYPE.  Return *this if appropriate,
2066    or a dummy object otherwise.  If BINFOP is non-0, it is filled with the
2067    binfo path from current_class_type to TYPE, or 0.  */
2068
2069 tree
2070 maybe_dummy_object (type, binfop)
2071      tree type;
2072      tree *binfop;
2073 {
2074   tree decl, context;
2075
2076   if (current_class_type
2077       && get_base_distance (type, current_class_type, 0, binfop) != -1)
2078     context = current_class_type;
2079   else
2080     {
2081       /* Reference from a nested class member function.  */
2082       context = type;
2083       if (binfop)
2084         *binfop = TYPE_BINFO (type);
2085     }
2086
2087   if (current_class_ref && context == current_class_type)
2088     decl = current_class_ref;
2089   else
2090     decl = build_dummy_object (context);
2091
2092   return decl;
2093 }
2094
2095 /* Returns 1 if OB is a placeholder object, or a pointer to one.  */
2096
2097 int
2098 is_dummy_object (ob)
2099      tree ob;
2100 {
2101   if (TREE_CODE (ob) == INDIRECT_REF)
2102     ob = TREE_OPERAND (ob, 0);
2103   return (TREE_CODE (ob) == NOP_EXPR
2104           && TREE_OPERAND (ob, 0) == void_zero_node);
2105 }
2106
2107 /* Returns 1 iff type T is a POD type, as defined in [basic.types].  */
2108
2109 int
2110 pod_type_p (t)
2111      tree t;
2112 {
2113   while (TREE_CODE (t) == ARRAY_TYPE)
2114     t = TREE_TYPE (t);
2115
2116   if (INTEGRAL_TYPE_P (t))
2117     return 1;  /* integral, character or enumeral type */
2118   if (FLOAT_TYPE_P (t))
2119     return 1;
2120   if (TYPE_PTR_P (t))
2121     return 1; /* pointer to non-member */
2122   if (TYPE_PTRMEM_P (t))
2123     return 1; /* pointer to member object */
2124   if (TYPE_PTRMEMFUNC_P (t))
2125     return 1; /* pointer to member function */
2126   
2127   if (! CLASS_TYPE_P (t))
2128     return 0; /* other non-class type (reference or function) */
2129   if (CLASSTYPE_NON_POD_P (t))
2130     return 0;
2131   return 1;
2132 }
2133
2134 /* Return a 1 if ATTR_NAME and ATTR_ARGS denote a valid C++-specific
2135    attribute for either declaration DECL or type TYPE and 0 otherwise.
2136    Plugged into valid_lang_attribute.  */
2137
2138 int
2139 cp_valid_lang_attribute (attr_name, attr_args, decl, type)
2140   tree attr_name;
2141   tree attr_args ATTRIBUTE_UNUSED;
2142   tree decl ATTRIBUTE_UNUSED;
2143   tree type ATTRIBUTE_UNUSED;
2144 {
2145   if (is_attribute_p ("com_interface", attr_name))
2146     {
2147       if (! flag_vtable_thunks)
2148         {
2149           error ("`com_interface' only supported with -fvtable-thunks");
2150           return 0;
2151         }
2152
2153       if (attr_args != NULL_TREE
2154           || decl != NULL_TREE
2155           || ! CLASS_TYPE_P (type)
2156           || type != TYPE_MAIN_VARIANT (type))
2157         {
2158           warning ("`com_interface' attribute can only be applied to class definitions");
2159           return 0;
2160         }
2161
2162       CLASSTYPE_COM_INTERFACE (type) = 1;
2163       return 1;
2164     }
2165   else if (is_attribute_p ("init_priority", attr_name))
2166     {
2167       tree initp_expr = (attr_args ? TREE_VALUE (attr_args): NULL_TREE);
2168       int pri;
2169
2170       if (initp_expr)
2171         STRIP_NOPS (initp_expr);
2172           
2173       if (!initp_expr || TREE_CODE (initp_expr) != INTEGER_CST)
2174         {
2175           error ("requested init_priority is not an integer constant");
2176           return 0;
2177         }
2178
2179       pri = TREE_INT_CST_LOW (initp_expr);
2180         
2181       while (TREE_CODE (type) == ARRAY_TYPE)
2182         type = TREE_TYPE (type);
2183
2184       if (decl == NULL_TREE
2185           || TREE_CODE (decl) != VAR_DECL
2186           || ! TREE_STATIC (decl)
2187           || DECL_EXTERNAL (decl)
2188           || (TREE_CODE (type) != RECORD_TYPE
2189               && TREE_CODE (type) != UNION_TYPE)
2190           /* Static objects in functions are initialized the
2191              first time control passes through that
2192              function. This is not precise enough to pin down an
2193              init_priority value, so don't allow it. */
2194           || current_function_decl) 
2195         {
2196           error ("can only use init_priority attribute on file-scope definitions of objects of class type");
2197           return 0;
2198         }
2199
2200       if (pri > MAX_INIT_PRIORITY || pri <= 0)
2201         {
2202           error ("requested init_priority is out of range");
2203           return 0;
2204         }
2205
2206       /* Check for init_priorities that are reserved for
2207          language and runtime support implementations.*/
2208       if (pri <= MAX_RESERVED_INIT_PRIORITY)
2209         {
2210           warning 
2211             ("requested init_priority is reserved for internal use");
2212         }
2213
2214       DECL_INIT_PRIORITY (decl) = pri;
2215       return 1;
2216     }
2217
2218   return 0;
2219 }
2220
2221 /* Return a new PTRMEM_CST of the indicated TYPE.  The MEMBER is the
2222    thing pointed to by the constant.  */
2223
2224 tree
2225 make_ptrmem_cst (type, member)
2226      tree type;
2227      tree member;
2228 {
2229   tree ptrmem_cst = make_node (PTRMEM_CST);
2230   /* If would seem a great convenience if make_node would set
2231      TREE_CONSTANT for things of class `c', but it does not.  */
2232   TREE_CONSTANT (ptrmem_cst) = 1;
2233   TREE_TYPE (ptrmem_cst) = type;
2234   PTRMEM_CST_MEMBER (ptrmem_cst) = member;
2235   return ptrmem_cst;
2236 }
2237
2238 /* Mark ARG (which is really a list_hash_table **) for GC.  */
2239
2240 static void
2241 mark_list_hash (arg)
2242      void *arg;
2243 {
2244   struct list_hash *lh;
2245
2246   for (lh = * ((struct list_hash **) arg); lh; lh = lh->next)
2247     ggc_mark_tree (lh->list);
2248 }
2249
2250 /* Initialize tree.c.  */
2251
2252 void
2253 init_tree ()
2254 {
2255   make_lang_type_fn = cp_make_lang_type;
2256   lang_unsave = cp_unsave;
2257   ggc_add_root (list_hash_table, 
2258                 sizeof (list_hash_table) / sizeof (struct list_hash *),
2259                 sizeof (struct list_hash *),
2260                 mark_list_hash);
2261 }
2262
2263 /* The SAVE_EXPR pointed to by TP is being copied.  If ST contains
2264    information indicating to what new SAVE_EXPR this one should be
2265    mapped, use that one.  Otherwise, create a new node and enter it in
2266    ST.  FN is the function into which the copy will be placed.  */
2267
2268 void
2269 remap_save_expr (tp, st, fn, walk_subtrees)
2270      tree *tp;
2271      splay_tree st;
2272      tree fn;
2273      int *walk_subtrees;
2274 {
2275   splay_tree_node n;
2276
2277   /* See if we already encountered this SAVE_EXPR.  */
2278   n = splay_tree_lookup (st, (splay_tree_key) *tp);
2279       
2280   /* If we didn't already remap this SAVE_EXPR, do so now.  */
2281   if (!n)
2282     {
2283       tree t = copy_node (*tp);
2284
2285       /* The SAVE_EXPR is now part of the function into which we
2286          are inlining this body.  */
2287       SAVE_EXPR_CONTEXT (t) = fn;
2288       /* And we haven't evaluated it yet.  */
2289       SAVE_EXPR_RTL (t) = NULL_RTX;
2290       /* Remember this SAVE_EXPR.  */
2291       n = splay_tree_insert (st,
2292                              (splay_tree_key) *tp,
2293                              (splay_tree_value) t);
2294     }
2295   else
2296     /* We've already walked into this SAVE_EXPR, so we needn't do it
2297        again.  */
2298     *walk_subtrees = 0;
2299
2300   /* Replace this SAVE_EXPR with the copy.  */
2301   *tp = (tree) n->value;
2302 }
2303
2304 /* Called via walk_tree.  If *TP points to a DECL_STMT for a local
2305    declaration, copies the declaration and enters it in the splay_tree
2306    pointed to by DATA (which is really a `splay_tree *').  */
2307
2308 static tree
2309 mark_local_for_remap_r (tp, walk_subtrees, data)
2310      tree *tp;
2311      int *walk_subtrees ATTRIBUTE_UNUSED;
2312      void *data;
2313 {
2314   tree t = *tp;
2315   splay_tree st = (splay_tree) data;
2316
2317   if ((TREE_CODE (t) == DECL_STMT
2318        && nonstatic_local_decl_p (DECL_STMT_DECL (t)))
2319       || TREE_CODE (t) == LABEL_STMT)
2320     {
2321       tree decl;
2322       tree copy;
2323
2324       /* Figure out what's being declared.  */
2325       decl = (TREE_CODE (t) == DECL_STMT
2326               ? DECL_STMT_DECL (t) : LABEL_STMT_LABEL (t));
2327       
2328       /* Make a copy.  */
2329       copy = copy_decl_for_inlining (decl, 
2330                                      DECL_CONTEXT (decl), 
2331                                      DECL_CONTEXT (decl));
2332
2333       /* Remember the copy.  */
2334       splay_tree_insert (st,
2335                          (splay_tree_key) decl, 
2336                          (splay_tree_value) copy);
2337     }
2338
2339   return NULL_TREE;
2340 }
2341
2342 /* Called via walk_tree when an expression is unsaved.  Using the
2343    splay_tree pointed to by ST (which is really a `splay_tree *'),
2344    remaps all local declarations to appropriate replacements.  */
2345
2346 static tree
2347 cp_unsave_r (tp, walk_subtrees, data)
2348      tree *tp;
2349      int *walk_subtrees;
2350      void *data;
2351 {
2352   splay_tree st = (splay_tree) data;
2353   splay_tree_node n;
2354
2355   /* Only a local declaration (variable or label).  */
2356   if (nonstatic_local_decl_p (*tp))
2357     {
2358       /* Lookup the declaration.  */
2359       n = splay_tree_lookup (st, (splay_tree_key) *tp);
2360       
2361       /* If it's there, remap it.  */
2362       if (n)
2363         *tp = (tree) n->value;
2364     }
2365   else if (TREE_CODE (*tp) == SAVE_EXPR)
2366     remap_save_expr (tp, st, current_function_decl, walk_subtrees);
2367   else
2368     {
2369       copy_tree_r (tp, walk_subtrees, NULL);
2370
2371       /* Do whatever unsaving is required.  */
2372       unsave_expr_1 (*tp);
2373     }
2374
2375   /* Keep iterating.  */
2376   return NULL_TREE;
2377 }
2378
2379 /* Called by unsave_expr_now whenever an expression (*TP) needs to be
2380    unsaved.  */
2381
2382 static void
2383 cp_unsave (tp)
2384      tree *tp;
2385 {
2386   splay_tree st;
2387
2388   /* Create a splay-tree to map old local variable declarations to new
2389      ones.  */
2390   st = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
2391
2392   /* Walk the tree once figuring out what needs to be remapped.  */
2393   walk_tree (tp, mark_local_for_remap_r, st);
2394
2395   /* Walk the tree again, copying, remapping, and unsaving.  */
2396   walk_tree (tp, cp_unsave_r, st);
2397
2398   /* Clean up.  */
2399   splay_tree_delete (st);
2400 }