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