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