89th Cygnus<->FSF quick merge
[gcc.git] / gcc / cp / tree.c
1 /* Language-dependent node constructors for parse phase of GNU compiler.
2 Copyright (C) 1987, 88, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 #include "config.h"
23 #include <stdio.h>
24 #include "obstack.h"
25 #include "tree.h"
26 #include "cp-tree.h"
27 #include "flags.h"
28 #include "rtl.h"
29 #ifdef __STDC__
30 #include <stdarg.h>
31 #else
32 #include <varargs.h>
33 #endif
34
35 #define CEIL(x,y) (((x) + (y) - 1) / (y))
36
37 /* Return nonzero if REF is an lvalue valid for this language.
38 Lvalues can be assigned, unless they have TREE_READONLY.
39 Lvalues can have their address taken, unless they have DECL_REGISTER. */
40
41 int
42 real_lvalue_p (ref)
43 tree ref;
44 {
45 if (! language_lvalue_valid (ref))
46 return 0;
47
48 if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
49 return 1;
50
51 if (ref == current_class_ptr && flag_this_is_variable <= 0)
52 return 0;
53
54 switch (TREE_CODE (ref))
55 {
56 /* preincrements and predecrements are valid lvals, provided
57 what they refer to are valid lvals. */
58 case PREINCREMENT_EXPR:
59 case PREDECREMENT_EXPR:
60 case COMPONENT_REF:
61 case SAVE_EXPR:
62 return real_lvalue_p (TREE_OPERAND (ref, 0));
63
64 case STRING_CST:
65 return 1;
66
67 case VAR_DECL:
68 if (TREE_READONLY (ref) && ! TREE_STATIC (ref)
69 && DECL_LANG_SPECIFIC (ref)
70 && DECL_IN_AGGR_P (ref))
71 return 0;
72 case INDIRECT_REF:
73 case ARRAY_REF:
74 case PARM_DECL:
75 case RESULT_DECL:
76 case ERROR_MARK:
77 if (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE
78 && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
79 return 1;
80 break;
81
82 /* A currently unresolved scope ref. */
83 case SCOPE_REF:
84 my_friendly_abort (103);
85 case OFFSET_REF:
86 if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL)
87 return 1;
88 return real_lvalue_p (TREE_OPERAND (ref, 0))
89 && real_lvalue_p (TREE_OPERAND (ref, 1));
90 break;
91
92 case COND_EXPR:
93 return (real_lvalue_p (TREE_OPERAND (ref, 1))
94 && real_lvalue_p (TREE_OPERAND (ref, 2)));
95
96 case MODIFY_EXPR:
97 return 1;
98
99 case COMPOUND_EXPR:
100 return real_lvalue_p (TREE_OPERAND (ref, 1));
101
102 case MAX_EXPR:
103 case MIN_EXPR:
104 return (real_lvalue_p (TREE_OPERAND (ref, 0))
105 && real_lvalue_p (TREE_OPERAND (ref, 1)));
106 }
107
108 return 0;
109 }
110
111 int
112 lvalue_p (ref)
113 tree ref;
114 {
115 if (! language_lvalue_valid (ref))
116 return 0;
117
118 if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
119 return 1;
120
121 if (ref == current_class_ptr && flag_this_is_variable <= 0)
122 return 0;
123
124 switch (TREE_CODE (ref))
125 {
126 /* preincrements and predecrements are valid lvals, provided
127 what they refer to are valid lvals. */
128 case PREINCREMENT_EXPR:
129 case PREDECREMENT_EXPR:
130 case COMPONENT_REF:
131 case SAVE_EXPR:
132 return lvalue_p (TREE_OPERAND (ref, 0));
133
134 case STRING_CST:
135 return 1;
136
137 case VAR_DECL:
138 if (TREE_READONLY (ref) && ! TREE_STATIC (ref)
139 && DECL_LANG_SPECIFIC (ref)
140 && DECL_IN_AGGR_P (ref))
141 return 0;
142 case INDIRECT_REF:
143 case ARRAY_REF:
144 case PARM_DECL:
145 case RESULT_DECL:
146 case ERROR_MARK:
147 if (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE
148 && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
149 return 1;
150 break;
151
152 case TARGET_EXPR:
153 return 1;
154
155 case CALL_EXPR:
156 if (IS_AGGR_TYPE (TREE_TYPE (ref)))
157 return 1;
158 break;
159
160 /* A currently unresolved scope ref. */
161 case SCOPE_REF:
162 my_friendly_abort (103);
163 case OFFSET_REF:
164 if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL)
165 return 1;
166 return lvalue_p (TREE_OPERAND (ref, 0))
167 && lvalue_p (TREE_OPERAND (ref, 1));
168 break;
169
170 case COND_EXPR:
171 return (lvalue_p (TREE_OPERAND (ref, 1))
172 && lvalue_p (TREE_OPERAND (ref, 2)));
173
174 case MODIFY_EXPR:
175 return 1;
176
177 case COMPOUND_EXPR:
178 return lvalue_p (TREE_OPERAND (ref, 1));
179
180 case MAX_EXPR:
181 case MIN_EXPR:
182 return (lvalue_p (TREE_OPERAND (ref, 0))
183 && lvalue_p (TREE_OPERAND (ref, 1)));
184 }
185
186 return 0;
187 }
188
189 /* Return nonzero if REF is an lvalue valid for this language;
190 otherwise, print an error message and return zero. */
191
192 int
193 lvalue_or_else (ref, string)
194 tree ref;
195 char *string;
196 {
197 int win = lvalue_p (ref);
198 if (! win)
199 error ("non-lvalue in %s", string);
200 return win;
201 }
202
203 /* INIT is a CALL_EXPR which needs info about its target.
204 TYPE is the type that this initialization should appear to have.
205
206 Build an encapsulation of the initialization to perform
207 and return it so that it can be processed by language-independent
208 and language-specific expression expanders. */
209
210 tree
211 build_cplus_new (type, init)
212 tree type;
213 tree init;
214 {
215 tree slot;
216 tree rval;
217
218 if (TREE_CODE (init) == TARGET_EXPR || init == error_mark_node)
219 return init;
220
221 slot = build (VAR_DECL, type);
222 layout_decl (slot, 0);
223 rval = build (NEW_EXPR, type,
224 TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), slot);
225 TREE_SIDE_EFFECTS (rval) = 1;
226 TREE_ADDRESSABLE (rval) = 1;
227 rval = build (TARGET_EXPR, type, slot, rval, NULL_TREE, NULL_TREE);
228 TREE_SIDE_EFFECTS (rval) = 1;
229 TREE_ADDRESSABLE (rval) = 1;
230
231 return rval;
232 }
233
234 /* Recursively search EXP for CALL_EXPRs that need cleanups and replace
235 these CALL_EXPRs with tree nodes that will perform the cleanups. */
236
237 tree
238 break_out_cleanups (exp)
239 tree exp;
240 {
241 tree tmp = exp;
242
243 if (TREE_CODE (tmp) == CALL_EXPR
244 && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (tmp)))
245 return build_cplus_new (TREE_TYPE (tmp), tmp);
246
247 while (TREE_CODE (tmp) == NOP_EXPR
248 || TREE_CODE (tmp) == CONVERT_EXPR
249 || TREE_CODE (tmp) == NON_LVALUE_EXPR)
250 {
251 if (TREE_CODE (TREE_OPERAND (tmp, 0)) == CALL_EXPR
252 && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (TREE_OPERAND (tmp, 0))))
253 {
254 TREE_OPERAND (tmp, 0)
255 = build_cplus_new (TREE_TYPE (TREE_OPERAND (tmp, 0)),
256 TREE_OPERAND (tmp, 0));
257 break;
258 }
259 else
260 tmp = TREE_OPERAND (tmp, 0);
261 }
262 return exp;
263 }
264
265 /* Recursively perform a preorder search EXP for CALL_EXPRs, making
266 copies where they are found. Returns a deep copy all nodes transitively
267 containing CALL_EXPRs. */
268
269 tree
270 break_out_calls (exp)
271 tree exp;
272 {
273 register tree t1, t2;
274 register enum tree_code code;
275 register int changed = 0;
276 register int i;
277
278 if (exp == NULL_TREE)
279 return exp;
280
281 code = TREE_CODE (exp);
282
283 if (code == CALL_EXPR)
284 return copy_node (exp);
285
286 /* Don't try and defeat a save_expr, as it should only be done once. */
287 if (code == SAVE_EXPR)
288 return exp;
289
290 switch (TREE_CODE_CLASS (code))
291 {
292 default:
293 abort ();
294
295 case 'c': /* a constant */
296 case 't': /* a type node */
297 case 'x': /* something random, like an identifier or an ERROR_MARK. */
298 return exp;
299
300 case 'd': /* A decl node */
301 #if 0 /* This is bogus. jason 9/21/94 */
302
303 t1 = break_out_calls (DECL_INITIAL (exp));
304 if (t1 != DECL_INITIAL (exp))
305 {
306 exp = copy_node (exp);
307 DECL_INITIAL (exp) = t1;
308 }
309 #endif
310 return exp;
311
312 case 'b': /* A block node */
313 {
314 /* Don't know how to handle these correctly yet. Must do a
315 break_out_calls on all DECL_INITIAL values for local variables,
316 and also break_out_calls on all sub-blocks and sub-statements. */
317 abort ();
318 }
319 return exp;
320
321 case 'e': /* an expression */
322 case 'r': /* a reference */
323 case 's': /* an expression with side effects */
324 for (i = tree_code_length[(int) code] - 1; i >= 0; i--)
325 {
326 t1 = break_out_calls (TREE_OPERAND (exp, i));
327 if (t1 != TREE_OPERAND (exp, i))
328 {
329 exp = copy_node (exp);
330 TREE_OPERAND (exp, i) = t1;
331 }
332 }
333 return exp;
334
335 case '<': /* a comparison expression */
336 case '2': /* a binary arithmetic expression */
337 t2 = break_out_calls (TREE_OPERAND (exp, 1));
338 if (t2 != TREE_OPERAND (exp, 1))
339 changed = 1;
340 case '1': /* a unary arithmetic expression */
341 t1 = break_out_calls (TREE_OPERAND (exp, 0));
342 if (t1 != TREE_OPERAND (exp, 0))
343 changed = 1;
344 if (changed)
345 {
346 if (tree_code_length[(int) code] == 1)
347 return build1 (code, TREE_TYPE (exp), t1);
348 else
349 return build (code, TREE_TYPE (exp), t1, t2);
350 }
351 return exp;
352 }
353
354 }
355 \f
356 extern struct obstack *current_obstack;
357 extern struct obstack permanent_obstack, class_obstack;
358 extern struct obstack *saveable_obstack;
359 extern struct obstack *expression_obstack;
360
361 /* Here is how primitive or already-canonicalized types' hash
362 codes are made. MUST BE CONSISTENT WITH tree.c !!! */
363 #define TYPE_HASH(TYPE) ((HOST_WIDE_INT) (TYPE) & 0777777)
364
365 /* Construct, lay out and return the type of methods belonging to class
366 BASETYPE and whose arguments are described by ARGTYPES and whose values
367 are described by RETTYPE. If each type exists already, reuse it. */
368
369 tree
370 build_cplus_method_type (basetype, rettype, argtypes)
371 tree basetype, rettype, argtypes;
372 {
373 register tree t;
374 tree ptype;
375 int hashcode;
376
377 /* Make a node of the sort we want. */
378 t = make_node (METHOD_TYPE);
379
380 TYPE_METHOD_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype);
381 TREE_TYPE (t) = rettype;
382 if (IS_SIGNATURE (basetype))
383 ptype = build_signature_pointer_type (TYPE_MAIN_VARIANT (basetype),
384 TYPE_READONLY (basetype),
385 TYPE_VOLATILE (basetype));
386 else
387 ptype = build_pointer_type (basetype);
388
389 /* The actual arglist for this function includes a "hidden" argument
390 which is "this". Put it into the list of argument types. */
391
392 argtypes = tree_cons (NULL_TREE, ptype, argtypes);
393 TYPE_ARG_TYPES (t) = argtypes;
394 TREE_SIDE_EFFECTS (argtypes) = 1; /* Mark first argtype as "artificial". */
395
396 /* If we already have such a type, use the old one and free this one.
397 Note that it also frees up the above cons cell if found. */
398 hashcode = TYPE_HASH (basetype) + TYPE_HASH (rettype) + type_hash_list (argtypes);
399 t = type_hash_canon (hashcode, t);
400
401 if (TYPE_SIZE (t) == 0)
402 layout_type (t);
403
404 return t;
405 }
406
407 tree
408 build_cplus_array_type_1 (elt_type, index_type)
409 tree elt_type;
410 tree index_type;
411 {
412 register struct obstack *ambient_obstack = current_obstack;
413 register struct obstack *ambient_saveable_obstack = saveable_obstack;
414 tree t;
415
416 /* We need a new one. If both ELT_TYPE and INDEX_TYPE are permanent,
417 make this permanent too. */
418 if (TREE_PERMANENT (elt_type)
419 && (index_type == 0 || TREE_PERMANENT (index_type)))
420 {
421 current_obstack = &permanent_obstack;
422 saveable_obstack = &permanent_obstack;
423 }
424
425 if (processing_template_decl)
426 {
427 t = make_node (ARRAY_TYPE);
428 TREE_TYPE (t) = elt_type;
429 TYPE_DOMAIN (t) = index_type;
430 }
431 else
432 t = build_array_type (elt_type, index_type);
433
434 /* Push these needs up so that initialization takes place
435 more easily. */
436 TYPE_NEEDS_CONSTRUCTING (t) = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (elt_type));
437 TYPE_NEEDS_DESTRUCTOR (t) = TYPE_NEEDS_DESTRUCTOR (TYPE_MAIN_VARIANT (elt_type));
438 current_obstack = ambient_obstack;
439 saveable_obstack = ambient_saveable_obstack;
440 return t;
441 }
442
443 tree
444 build_cplus_array_type (elt_type, index_type)
445 tree elt_type;
446 tree index_type;
447 {
448 tree t;
449 int constp = TYPE_READONLY (elt_type);
450 int volatilep = TYPE_VOLATILE (elt_type);
451 elt_type = TYPE_MAIN_VARIANT (elt_type);
452
453 t = build_cplus_array_type_1 (elt_type, index_type);
454
455 if (constp || volatilep)
456 t = cp_build_type_variant (t, constp, volatilep);
457
458 return t;
459 }
460 \f
461 /* Make a variant type in the proper way for C/C++, propagating qualifiers
462 down to the element type of an array. */
463
464 tree
465 cp_build_type_variant (type, constp, volatilep)
466 tree type;
467 int constp, volatilep;
468 {
469 if (type == error_mark_node)
470 return type;
471
472 if (TREE_CODE (type) == ARRAY_TYPE)
473 {
474 tree real_main_variant = TYPE_MAIN_VARIANT (type);
475
476 push_obstacks (TYPE_OBSTACK (real_main_variant),
477 TYPE_OBSTACK (real_main_variant));
478 type = build_cplus_array_type_1 (cp_build_type_variant
479 (TREE_TYPE (type), constp, volatilep),
480 TYPE_DOMAIN (type));
481
482 /* TYPE must be on same obstack as REAL_MAIN_VARIANT. If not,
483 make a copy. (TYPE might have come from the hash table and
484 REAL_MAIN_VARIANT might be in some function's obstack.) */
485
486 if (TYPE_OBSTACK (type) != TYPE_OBSTACK (real_main_variant))
487 {
488 type = copy_node (type);
489 TYPE_POINTER_TO (type) = TYPE_REFERENCE_TO (type) = 0;
490 }
491
492 TYPE_MAIN_VARIANT (type) = real_main_variant;
493 pop_obstacks ();
494 return type;
495 }
496 return build_type_variant (type, constp, volatilep);
497 }
498 \f
499 /* Add OFFSET to all base types of T.
500
501 OFFSET, which is a type offset, is number of bytes.
502
503 Note that we don't have to worry about having two paths to the
504 same base type, since this type owns its association list. */
505
506 void
507 propagate_binfo_offsets (binfo, offset)
508 tree binfo;
509 tree offset;
510 {
511 tree binfos = BINFO_BASETYPES (binfo);
512 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
513
514 for (i = 0; i < n_baselinks; /* note increment is done in the loop. */)
515 {
516 tree base_binfo = TREE_VEC_ELT (binfos, i);
517
518 if (TREE_VIA_VIRTUAL (base_binfo))
519 i += 1;
520 else
521 {
522 int j;
523 tree base_binfos = BINFO_BASETYPES (base_binfo);
524 tree delta;
525
526 for (j = i+1; j < n_baselinks; j++)
527 if (! TREE_VIA_VIRTUAL (TREE_VEC_ELT (binfos, j)))
528 {
529 /* The next basetype offset must take into account the space
530 between the classes, not just the size of each class. */
531 delta = size_binop (MINUS_EXPR,
532 BINFO_OFFSET (TREE_VEC_ELT (binfos, j)),
533 BINFO_OFFSET (base_binfo));
534 break;
535 }
536
537 #if 0
538 if (BINFO_OFFSET_ZEROP (base_binfo))
539 BINFO_OFFSET (base_binfo) = offset;
540 else
541 BINFO_OFFSET (base_binfo)
542 = size_binop (PLUS_EXPR, BINFO_OFFSET (base_binfo), offset);
543 #else
544 BINFO_OFFSET (base_binfo) = offset;
545 #endif
546 if (base_binfos)
547 {
548 int k;
549 tree chain = NULL_TREE;
550
551 /* Now unshare the structure beneath BASE_BINFO. */
552 for (k = TREE_VEC_LENGTH (base_binfos)-1;
553 k >= 0; k--)
554 {
555 tree base_base_binfo = TREE_VEC_ELT (base_binfos, k);
556 if (! TREE_VIA_VIRTUAL (base_base_binfo))
557 TREE_VEC_ELT (base_binfos, k)
558 = make_binfo (BINFO_OFFSET (base_base_binfo),
559 base_base_binfo,
560 BINFO_VTABLE (base_base_binfo),
561 BINFO_VIRTUALS (base_base_binfo),
562 chain);
563 chain = TREE_VEC_ELT (base_binfos, k);
564 TREE_VIA_PUBLIC (chain) = TREE_VIA_PUBLIC (base_base_binfo);
565 TREE_VIA_PROTECTED (chain) = TREE_VIA_PROTECTED (base_base_binfo);
566 BINFO_INHERITANCE_CHAIN (chain) = base_binfo;
567 }
568 /* Now propagate the offset to the base types. */
569 propagate_binfo_offsets (base_binfo, offset);
570 }
571
572 /* Go to our next class that counts for offset propagation. */
573 i = j;
574 if (i < n_baselinks)
575 offset = size_binop (PLUS_EXPR, offset, delta);
576 }
577 }
578 }
579
580 /* Compute the actual offsets that our virtual base classes
581 will have *for this type*. This must be performed after
582 the fields are laid out, since virtual baseclasses must
583 lay down at the end of the record.
584
585 Returns the maximum number of virtual functions any of the virtual
586 baseclasses provide. */
587
588 int
589 layout_vbasetypes (rec, max)
590 tree rec;
591 int max;
592 {
593 /* Get all the virtual base types that this type uses.
594 The TREE_VALUE slot holds the virtual baseclass type. */
595 tree vbase_types = get_vbase_types (rec);
596
597 #ifdef STRUCTURE_SIZE_BOUNDARY
598 unsigned record_align = MAX (STRUCTURE_SIZE_BOUNDARY, TYPE_ALIGN (rec));
599 #else
600 unsigned record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
601 #endif
602 int desired_align;
603
604 /* Record size so far is CONST_SIZE + VAR_SIZE bits,
605 where CONST_SIZE is an integer
606 and VAR_SIZE is a tree expression.
607 If VAR_SIZE is null, the size is just CONST_SIZE.
608 Naturally we try to avoid using VAR_SIZE. */
609 register unsigned const_size = 0;
610 register tree var_size = 0;
611 int nonvirtual_const_size;
612
613 CLASSTYPE_VBASECLASSES (rec) = vbase_types;
614
615 if (TREE_CODE (TYPE_SIZE (rec)) == INTEGER_CST)
616 const_size = TREE_INT_CST_LOW (TYPE_SIZE (rec));
617 else
618 var_size = TYPE_SIZE (rec);
619
620 nonvirtual_const_size = const_size;
621
622 while (vbase_types)
623 {
624 tree basetype = BINFO_TYPE (vbase_types);
625 tree offset;
626
627 desired_align = TYPE_ALIGN (basetype);
628 record_align = MAX (record_align, desired_align);
629
630 if (const_size == 0)
631 offset = integer_zero_node;
632 else
633 {
634 /* Give each virtual base type the alignment it wants. */
635 const_size = CEIL (const_size, TYPE_ALIGN (basetype))
636 * TYPE_ALIGN (basetype);
637 offset = size_int (CEIL (const_size, BITS_PER_UNIT));
638 }
639
640 if (CLASSTYPE_VSIZE (basetype) > max)
641 max = CLASSTYPE_VSIZE (basetype);
642 BINFO_OFFSET (vbase_types) = offset;
643
644 if (TREE_CODE (TYPE_SIZE (basetype)) == INTEGER_CST)
645 {
646 /* Every virtual baseclass takes a least a UNIT, so that we can
647 take it's address and get something different for each base. */
648 const_size += MAX (BITS_PER_UNIT,
649 TREE_INT_CST_LOW (TYPE_SIZE (basetype))
650 - TREE_INT_CST_LOW (CLASSTYPE_VBASE_SIZE (basetype)));
651 }
652 else if (var_size == 0)
653 var_size = TYPE_SIZE (basetype);
654 else
655 var_size = size_binop (PLUS_EXPR, var_size, TYPE_SIZE (basetype));
656
657 vbase_types = TREE_CHAIN (vbase_types);
658 }
659
660 if (const_size)
661 {
662 /* Because a virtual base might take a single byte above,
663 we have to re-adjust the total size to make sure it it
664 a multiple of the alignment. */
665 /* Give the whole object the alignment it wants. */
666 const_size = CEIL (const_size, record_align) * record_align;
667 }
668
669 /* Set the alignment in the complete type. We don't set CLASSTYPE_ALIGN
670 here, as that is for this class, without any virtual base classes. */
671 TYPE_ALIGN (rec) = record_align;
672 if (const_size != nonvirtual_const_size)
673 {
674 CLASSTYPE_VBASE_SIZE (rec)
675 = size_int (const_size - nonvirtual_const_size);
676 TYPE_SIZE (rec) = size_int (const_size);
677 }
678
679 /* Now propagate offset information throughout the lattice
680 under the vbase type. */
681 for (vbase_types = CLASSTYPE_VBASECLASSES (rec); vbase_types;
682 vbase_types = TREE_CHAIN (vbase_types))
683 {
684 tree base_binfos = BINFO_BASETYPES (vbase_types);
685
686 BINFO_INHERITANCE_CHAIN (vbase_types) = TYPE_BINFO (rec);
687
688 if (base_binfos)
689 {
690 tree chain = NULL_TREE;
691 int j;
692 /* Now unshare the structure beneath BASE_BINFO. */
693
694 for (j = TREE_VEC_LENGTH (base_binfos)-1;
695 j >= 0; j--)
696 {
697 tree base_base_binfo = TREE_VEC_ELT (base_binfos, j);
698 if (! TREE_VIA_VIRTUAL (base_base_binfo))
699 TREE_VEC_ELT (base_binfos, j)
700 = make_binfo (BINFO_OFFSET (base_base_binfo),
701 base_base_binfo,
702 BINFO_VTABLE (base_base_binfo),
703 BINFO_VIRTUALS (base_base_binfo),
704 chain);
705 chain = TREE_VEC_ELT (base_binfos, j);
706 TREE_VIA_PUBLIC (chain) = TREE_VIA_PUBLIC (base_base_binfo);
707 TREE_VIA_PROTECTED (chain) = TREE_VIA_PROTECTED (base_base_binfo);
708 BINFO_INHERITANCE_CHAIN (chain) = vbase_types;
709 }
710
711 propagate_binfo_offsets (vbase_types, BINFO_OFFSET (vbase_types));
712 }
713 }
714
715 return max;
716 }
717
718 /* Lay out the base types of a record type, REC.
719 Tentatively set the size and alignment of REC
720 according to the base types alone.
721
722 Offsets for immediate nonvirtual baseclasses are also computed here.
723
724 TYPE_BINFO (REC) should be NULL_TREE on entry, and this routine
725 creates a list of base_binfos in TYPE_BINFO (REC) from BINFOS.
726
727 Returns list of virtual base classes in a FIELD_DECL chain. */
728
729 tree
730 layout_basetypes (rec, binfos)
731 tree rec, binfos;
732 {
733 /* Chain to hold all the new FIELD_DECLs which point at virtual
734 base classes. */
735 tree vbase_decls = NULL_TREE;
736
737 #ifdef STRUCTURE_SIZE_BOUNDARY
738 unsigned record_align = MAX (STRUCTURE_SIZE_BOUNDARY, TYPE_ALIGN (rec));
739 #else
740 unsigned record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
741 #endif
742
743 /* Record size so far is CONST_SIZE + VAR_SIZE bits, where CONST_SIZE is
744 an integer and VAR_SIZE is a tree expression. If VAR_SIZE is null,
745 the size is just CONST_SIZE. Naturally we try to avoid using
746 VAR_SIZE. And so far, we've been successful. */
747 #if 0
748 register tree var_size = 0;
749 #endif
750
751 register unsigned const_size = 0;
752 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
753
754 /* Handle basetypes almost like fields, but record their
755 offsets differently. */
756
757 for (i = 0; i < n_baseclasses; i++)
758 {
759 int inc, desired_align, int_vbase_size;
760 register tree base_binfo = TREE_VEC_ELT (binfos, i);
761 register tree basetype = BINFO_TYPE (base_binfo);
762 tree decl, offset;
763
764 if (TYPE_SIZE (basetype) == 0)
765 {
766 #if 0
767 /* This error is now reported in xref_tag, thus giving better
768 location information. */
769 error_with_aggr_type (base_binfo,
770 "base class `%s' has incomplete type");
771
772 TREE_VIA_PUBLIC (base_binfo) = 1;
773 TREE_VIA_PROTECTED (base_binfo) = 0;
774 TREE_VIA_VIRTUAL (base_binfo) = 0;
775
776 /* Should handle this better so that
777
778 class A;
779 class B: private A { virtual void F(); };
780
781 does not dump core when compiled. */
782 my_friendly_abort (121);
783 #endif
784 continue;
785 }
786
787 /* All basetypes are recorded in the association list of the
788 derived type. */
789
790 if (TREE_VIA_VIRTUAL (base_binfo))
791 {
792 int j;
793 char *name = (char *)alloca (TYPE_NAME_LENGTH (basetype)
794 + sizeof (VBASE_NAME) + 1);
795
796 /* The offset for a virtual base class is only used in computing
797 virtual function tables and for initializing virtual base
798 pointers. It is built once `get_vbase_types' is called. */
799
800 /* If this basetype can come from another vbase pointer
801 without an additional indirection, we will share
802 that pointer. If an indirection is involved, we
803 make our own pointer. */
804 for (j = 0; j < n_baseclasses; j++)
805 {
806 tree other_base_binfo = TREE_VEC_ELT (binfos, j);
807 if (! TREE_VIA_VIRTUAL (other_base_binfo)
808 && binfo_member (basetype,
809 CLASSTYPE_VBASECLASSES (BINFO_TYPE (other_base_binfo))))
810 goto got_it;
811 }
812 sprintf (name, VBASE_NAME_FORMAT, TYPE_NAME_STRING (basetype));
813 decl = build_lang_field_decl (FIELD_DECL, get_identifier (name),
814 build_pointer_type (basetype));
815 /* If you change any of the below, take a look at all the
816 other VFIELD_BASEs and VTABLE_BASEs in the code, and change
817 them too. */
818 DECL_ASSEMBLER_NAME (decl) = get_identifier (VTABLE_BASE);
819 DECL_VIRTUAL_P (decl) = 1;
820 DECL_FIELD_CONTEXT (decl) = rec;
821 DECL_CLASS_CONTEXT (decl) = rec;
822 DECL_FCONTEXT (decl) = basetype;
823 DECL_SAVED_INSNS (decl) = NULL_RTX;
824 DECL_FIELD_SIZE (decl) = 0;
825 DECL_ALIGN (decl) = TYPE_ALIGN (ptr_type_node);
826 TREE_CHAIN (decl) = vbase_decls;
827 BINFO_VPTR_FIELD (base_binfo) = decl;
828 vbase_decls = decl;
829
830 if (warn_nonvdtor && TYPE_HAS_DESTRUCTOR (basetype)
831 && DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1)) == NULL_TREE)
832 {
833 warning_with_decl (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1),
834 "destructor `%s' non-virtual");
835 warning ("in inheritance relationship `%s: virtual %s'",
836 TYPE_NAME_STRING (rec),
837 TYPE_NAME_STRING (basetype));
838 }
839 got_it:
840 /* The space this decl occupies has already been accounted for. */
841 continue;
842 }
843
844 if (const_size == 0)
845 offset = integer_zero_node;
846 else
847 {
848 /* Give each base type the alignment it wants. */
849 const_size = CEIL (const_size, TYPE_ALIGN (basetype))
850 * TYPE_ALIGN (basetype);
851 offset = size_int ((const_size + BITS_PER_UNIT - 1) / BITS_PER_UNIT);
852
853 #if 0
854 /* bpk: Disabled this check until someone is willing to
855 claim it as theirs and explain exactly what circumstances
856 warrant the warning. */
857 if (warn_nonvdtor && TYPE_HAS_DESTRUCTOR (basetype)
858 && DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1)) == NULL_TREE)
859 {
860 warning_with_decl (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1),
861 "destructor `%s' non-virtual");
862 warning ("in inheritance relationship `%s:%s %s'",
863 TYPE_NAME_STRING (rec),
864 TREE_VIA_VIRTUAL (base_binfo) ? " virtual" : "",
865 TYPE_NAME_STRING (basetype));
866 }
867 #endif
868 }
869 BINFO_OFFSET (base_binfo) = offset;
870 if (CLASSTYPE_VSIZE (basetype))
871 {
872 BINFO_VTABLE (base_binfo) = TYPE_BINFO_VTABLE (basetype);
873 BINFO_VIRTUALS (base_binfo) = TYPE_BINFO_VIRTUALS (basetype);
874 }
875 TREE_CHAIN (base_binfo) = TYPE_BINFO (rec);
876 TYPE_BINFO (rec) = base_binfo;
877
878 /* Add only the amount of storage not present in
879 the virtual baseclasses. */
880
881 int_vbase_size = TREE_INT_CST_LOW (CLASSTYPE_VBASE_SIZE (basetype));
882 if (TREE_INT_CST_LOW (TYPE_SIZE (basetype)) > int_vbase_size)
883 {
884 inc = MAX (record_align,
885 (TREE_INT_CST_LOW (TYPE_SIZE (basetype))
886 - int_vbase_size));
887
888 /* Record must have at least as much alignment as any field. */
889 desired_align = TYPE_ALIGN (basetype);
890 record_align = MAX (record_align, desired_align);
891
892 const_size += inc;
893 }
894 }
895
896 if (const_size)
897 CLASSTYPE_SIZE (rec) = size_int (const_size);
898 else
899 CLASSTYPE_SIZE (rec) = integer_zero_node;
900 CLASSTYPE_ALIGN (rec) = record_align;
901
902 return vbase_decls;
903 }
904 \f
905 /* Hashing of lists so that we don't make duplicates.
906 The entry point is `list_hash_canon'. */
907
908 /* Each hash table slot is a bucket containing a chain
909 of these structures. */
910
911 struct list_hash
912 {
913 struct list_hash *next; /* Next structure in the bucket. */
914 int hashcode; /* Hash code of this list. */
915 tree list; /* The list recorded here. */
916 };
917
918 /* Now here is the hash table. When recording a list, it is added
919 to the slot whose index is the hash code mod the table size.
920 Note that the hash table is used for several kinds of lists.
921 While all these live in the same table, they are completely independent,
922 and the hash code is computed differently for each of these. */
923
924 #define TYPE_HASH_SIZE 59
925 struct list_hash *list_hash_table[TYPE_HASH_SIZE];
926
927 /* Compute a hash code for a list (chain of TREE_LIST nodes
928 with goodies in the TREE_PURPOSE, TREE_VALUE, and bits of the
929 TREE_COMMON slots), by adding the hash codes of the individual entries. */
930
931 int
932 list_hash (list)
933 tree list;
934 {
935 register int hashcode = 0;
936
937 if (TREE_CHAIN (list))
938 hashcode += TYPE_HASH (TREE_CHAIN (list));
939
940 if (TREE_VALUE (list))
941 hashcode += TYPE_HASH (TREE_VALUE (list));
942 else
943 hashcode += 1007;
944 if (TREE_PURPOSE (list))
945 hashcode += TYPE_HASH (TREE_PURPOSE (list));
946 else
947 hashcode += 1009;
948 return hashcode;
949 }
950
951 /* Look in the type hash table for a type isomorphic to TYPE.
952 If one is found, return it. Otherwise return 0. */
953
954 tree
955 list_hash_lookup (hashcode, list)
956 int hashcode;
957 tree list;
958 {
959 register struct list_hash *h;
960 for (h = list_hash_table[hashcode % TYPE_HASH_SIZE]; h; h = h->next)
961 if (h->hashcode == hashcode
962 && TREE_VIA_VIRTUAL (h->list) == TREE_VIA_VIRTUAL (list)
963 && TREE_VIA_PUBLIC (h->list) == TREE_VIA_PUBLIC (list)
964 && TREE_VIA_PROTECTED (h->list) == TREE_VIA_PROTECTED (list)
965 && TREE_PURPOSE (h->list) == TREE_PURPOSE (list)
966 && TREE_VALUE (h->list) == TREE_VALUE (list)
967 && TREE_CHAIN (h->list) == TREE_CHAIN (list))
968 {
969 my_friendly_assert (TREE_TYPE (h->list) == TREE_TYPE (list), 299);
970 return h->list;
971 }
972 return 0;
973 }
974
975 /* Add an entry to the list-hash-table
976 for a list TYPE whose hash code is HASHCODE. */
977
978 void
979 list_hash_add (hashcode, list)
980 int hashcode;
981 tree list;
982 {
983 register struct list_hash *h;
984
985 h = (struct list_hash *) obstack_alloc (&class_obstack, sizeof (struct list_hash));
986 h->hashcode = hashcode;
987 h->list = list;
988 h->next = list_hash_table[hashcode % TYPE_HASH_SIZE];
989 list_hash_table[hashcode % TYPE_HASH_SIZE] = h;
990 }
991
992 /* Given TYPE, and HASHCODE its hash code, return the canonical
993 object for an identical list if one already exists.
994 Otherwise, return TYPE, and record it as the canonical object
995 if it is a permanent object.
996
997 To use this function, first create a list of the sort you want.
998 Then compute its hash code from the fields of the list that
999 make it different from other similar lists.
1000 Then call this function and use the value.
1001 This function frees the list you pass in if it is a duplicate. */
1002
1003 /* Set to 1 to debug without canonicalization. Never set by program. */
1004
1005 static int debug_no_list_hash = 0;
1006
1007 tree
1008 list_hash_canon (hashcode, list)
1009 int hashcode;
1010 tree list;
1011 {
1012 tree t1;
1013
1014 if (debug_no_list_hash)
1015 return list;
1016
1017 t1 = list_hash_lookup (hashcode, list);
1018 if (t1 != 0)
1019 {
1020 obstack_free (&class_obstack, list);
1021 return t1;
1022 }
1023
1024 /* If this is a new list, record it for later reuse. */
1025 list_hash_add (hashcode, list);
1026
1027 return list;
1028 }
1029
1030 tree
1031 hash_tree_cons (via_public, via_virtual, via_protected, purpose, value, chain)
1032 int via_public, via_virtual, via_protected;
1033 tree purpose, value, chain;
1034 {
1035 struct obstack *ambient_obstack = current_obstack;
1036 tree t;
1037 int hashcode;
1038
1039 current_obstack = &class_obstack;
1040 t = tree_cons (purpose, value, chain);
1041 TREE_VIA_PUBLIC (t) = via_public;
1042 TREE_VIA_PROTECTED (t) = via_protected;
1043 TREE_VIA_VIRTUAL (t) = via_virtual;
1044 hashcode = list_hash (t);
1045 t = list_hash_canon (hashcode, t);
1046 current_obstack = ambient_obstack;
1047 return t;
1048 }
1049
1050 /* Constructor for hashed lists. */
1051
1052 tree
1053 hash_tree_chain (value, chain)
1054 tree value, chain;
1055 {
1056 struct obstack *ambient_obstack = current_obstack;
1057 tree t;
1058 int hashcode;
1059
1060 current_obstack = &class_obstack;
1061 t = tree_cons (NULL_TREE, value, chain);
1062 hashcode = list_hash (t);
1063 t = list_hash_canon (hashcode, t);
1064 current_obstack = ambient_obstack;
1065 return t;
1066 }
1067
1068 /* Similar, but used for concatenating two lists. */
1069
1070 tree
1071 hash_chainon (list1, list2)
1072 tree list1, list2;
1073 {
1074 if (list2 == 0)
1075 return list1;
1076 if (list1 == 0)
1077 return list2;
1078 if (TREE_CHAIN (list1) == NULL_TREE)
1079 return hash_tree_chain (TREE_VALUE (list1), list2);
1080 return hash_tree_chain (TREE_VALUE (list1),
1081 hash_chainon (TREE_CHAIN (list1), list2));
1082 }
1083
1084 static tree
1085 get_identifier_list (value)
1086 tree value;
1087 {
1088 tree list = IDENTIFIER_AS_LIST (value);
1089 if (list != NULL_TREE
1090 && (TREE_CODE (list) != TREE_LIST
1091 || TREE_VALUE (list) != value))
1092 list = NULL_TREE;
1093 else if (IDENTIFIER_HAS_TYPE_VALUE (value)
1094 && TREE_CODE (IDENTIFIER_TYPE_VALUE (value)) == RECORD_TYPE
1095 && IDENTIFIER_TYPE_VALUE (value)
1096 == TYPE_MAIN_VARIANT (IDENTIFIER_TYPE_VALUE (value)))
1097 {
1098 tree type = IDENTIFIER_TYPE_VALUE (value);
1099
1100 if (TYPE_PTRMEMFUNC_P (type))
1101 list = NULL_TREE;
1102 else if (type == current_class_type)
1103 /* Don't mess up the constructor name. */
1104 list = tree_cons (NULL_TREE, value, NULL_TREE);
1105 else
1106 {
1107 if (! CLASSTYPE_ID_AS_LIST (type))
1108 CLASSTYPE_ID_AS_LIST (type)
1109 = perm_tree_cons (NULL_TREE, TYPE_IDENTIFIER (type), NULL_TREE);
1110 list = CLASSTYPE_ID_AS_LIST (type);
1111 }
1112 }
1113 return list;
1114 }
1115
1116 tree
1117 get_decl_list (value)
1118 tree value;
1119 {
1120 tree list = NULL_TREE;
1121
1122 if (TREE_CODE (value) == IDENTIFIER_NODE)
1123 list = get_identifier_list (value);
1124 else if (TREE_CODE (value) == RECORD_TYPE
1125 && TYPE_LANG_SPECIFIC (value)
1126 && value == TYPE_MAIN_VARIANT (value))
1127 list = CLASSTYPE_AS_LIST (value);
1128
1129 if (list != NULL_TREE)
1130 {
1131 my_friendly_assert (TREE_CHAIN (list) == NULL_TREE, 301);
1132 return list;
1133 }
1134
1135 return build_decl_list (NULL_TREE, value);
1136 }
1137 \f
1138 /* Build an association between TYPE and some parameters:
1139
1140 OFFSET is the offset added to `this' to convert it to a pointer
1141 of type `TYPE *'
1142
1143 BINFO is the base binfo to use, if we are deriving from one. This
1144 is necessary, as we want specialized parent binfos from base
1145 classes, so that the VTABLE_NAMEs of bases are for the most derived
1146 type, instead of of the simple type.
1147
1148 VTABLE is the virtual function table with which to initialize
1149 sub-objects of type TYPE.
1150
1151 VIRTUALS are the virtual functions sitting in VTABLE.
1152
1153 CHAIN are more associations we must retain. */
1154
1155 tree
1156 make_binfo (offset, binfo, vtable, virtuals, chain)
1157 tree offset, binfo;
1158 tree vtable, virtuals;
1159 tree chain;
1160 {
1161 tree new_binfo = make_tree_vec (6);
1162 tree type;
1163
1164 if (TREE_CODE (binfo) == TREE_VEC)
1165 type = BINFO_TYPE (binfo);
1166 else
1167 {
1168 type = binfo;
1169 binfo = TYPE_BINFO (binfo);
1170 }
1171
1172 TREE_CHAIN (new_binfo) = chain;
1173 if (chain)
1174 TREE_USED (new_binfo) = TREE_USED (chain);
1175
1176 TREE_TYPE (new_binfo) = TYPE_MAIN_VARIANT (type);
1177 BINFO_OFFSET (new_binfo) = offset;
1178 BINFO_VTABLE (new_binfo) = vtable;
1179 BINFO_VIRTUALS (new_binfo) = virtuals;
1180 BINFO_VPTR_FIELD (new_binfo) = NULL_TREE;
1181
1182 if (binfo && BINFO_BASETYPES (binfo) != NULL_TREE)
1183 BINFO_BASETYPES (new_binfo) = copy_node (BINFO_BASETYPES (binfo));
1184 return new_binfo;
1185 }
1186
1187 /* Return the binfo value for ELEM in TYPE. */
1188
1189 tree
1190 binfo_value (elem, type)
1191 tree elem;
1192 tree type;
1193 {
1194 if (get_base_distance (elem, type, 0, (tree *)0) == -2)
1195 compiler_error ("base class `%s' ambiguous in binfo_value",
1196 TYPE_NAME_STRING (elem));
1197 if (elem == type)
1198 return TYPE_BINFO (type);
1199 if (TREE_CODE (elem) == RECORD_TYPE && TYPE_BINFO (elem) == type)
1200 return type;
1201 return get_binfo (elem, type, 0);
1202 }
1203
1204 tree
1205 reverse_path (path)
1206 tree path;
1207 {
1208 register tree prev = 0, tmp, next;
1209 for (tmp = path; tmp; tmp = next)
1210 {
1211 next = BINFO_INHERITANCE_CHAIN (tmp);
1212 BINFO_INHERITANCE_CHAIN (tmp) = prev;
1213 prev = tmp;
1214 }
1215 return prev;
1216 }
1217
1218 void
1219 debug_binfo (elem)
1220 tree elem;
1221 {
1222 unsigned HOST_WIDE_INT n;
1223 tree virtuals;
1224
1225 fprintf (stderr, "type \"%s\"; offset = %d\n",
1226 TYPE_NAME_STRING (BINFO_TYPE (elem)),
1227 TREE_INT_CST_LOW (BINFO_OFFSET (elem)));
1228 fprintf (stderr, "vtable type:\n");
1229 debug_tree (BINFO_TYPE (elem));
1230 if (BINFO_VTABLE (elem))
1231 fprintf (stderr, "vtable decl \"%s\"\n", IDENTIFIER_POINTER (DECL_NAME (BINFO_VTABLE (elem))));
1232 else
1233 fprintf (stderr, "no vtable decl yet\n");
1234 fprintf (stderr, "virtuals:\n");
1235 virtuals = BINFO_VIRTUALS (elem);
1236
1237 n = skip_rtti_stuff (&virtuals);
1238
1239 while (virtuals)
1240 {
1241 tree fndecl = TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals)), 0);
1242 fprintf (stderr, "%s [%d =? %d]\n",
1243 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl)),
1244 n, TREE_INT_CST_LOW (DECL_VINDEX (fndecl)));
1245 ++n;
1246 virtuals = TREE_CHAIN (virtuals);
1247 }
1248 }
1249
1250 /* Return the length of a chain of nodes chained through DECL_CHAIN.
1251 We expect a null pointer to mark the end of the chain.
1252 This is the Lisp primitive `length'. */
1253
1254 int
1255 decl_list_length (t)
1256 tree t;
1257 {
1258 register tree tail;
1259 register int len = 0;
1260
1261 my_friendly_assert (TREE_CODE (t) == FUNCTION_DECL
1262 || TREE_CODE (t) == TEMPLATE_DECL, 300);
1263 for (tail = t; tail; tail = DECL_CHAIN (tail))
1264 len++;
1265
1266 return len;
1267 }
1268
1269 int
1270 count_functions (t)
1271 tree t;
1272 {
1273 if (TREE_CODE (t) == FUNCTION_DECL)
1274 return 1;
1275 else if (TREE_CODE (t) == TREE_LIST)
1276 return decl_list_length (TREE_VALUE (t));
1277
1278 my_friendly_abort (359);
1279 return 0;
1280 }
1281
1282 int
1283 is_overloaded_fn (x)
1284 tree x;
1285 {
1286 if (TREE_CODE (x) == FUNCTION_DECL)
1287 return 1;
1288
1289 if (TREE_CODE (x) == TREE_LIST
1290 && (TREE_CODE (TREE_VALUE (x)) == FUNCTION_DECL
1291 || TREE_CODE (TREE_VALUE (x)) == TEMPLATE_DECL))
1292 return 1;
1293
1294 return 0;
1295 }
1296
1297 int
1298 really_overloaded_fn (x)
1299 tree x;
1300 {
1301 if (TREE_CODE (x) == TREE_LIST
1302 && (TREE_CODE (TREE_VALUE (x)) == FUNCTION_DECL
1303 || TREE_CODE (TREE_VALUE (x)) == TEMPLATE_DECL))
1304 return 1;
1305
1306 return 0;
1307 }
1308
1309 tree
1310 get_first_fn (from)
1311 tree from;
1312 {
1313 if (TREE_CODE (from) == FUNCTION_DECL)
1314 return from;
1315
1316 my_friendly_assert (TREE_CODE (from) == TREE_LIST, 9);
1317
1318 return TREE_VALUE (from);
1319 }
1320
1321 tree
1322 fnaddr_from_vtable_entry (entry)
1323 tree entry;
1324 {
1325 if (flag_vtable_thunks)
1326 {
1327 tree func = entry;
1328 if (TREE_CODE (func) == ADDR_EXPR)
1329 func = TREE_OPERAND (func, 0);
1330 if (TREE_CODE (func) == THUNK_DECL)
1331 return DECL_INITIAL (func);
1332 else
1333 return entry;
1334 }
1335 else
1336 return TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (entry))));
1337 }
1338
1339 tree
1340 function_arg_chain (t)
1341 tree t;
1342 {
1343 return TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (t)));
1344 }
1345
1346 int
1347 promotes_to_aggr_type (t, code)
1348 tree t;
1349 enum tree_code code;
1350 {
1351 if (TREE_CODE (t) == code)
1352 t = TREE_TYPE (t);
1353 return IS_AGGR_TYPE (t);
1354 }
1355
1356 int
1357 is_aggr_type_2 (t1, t2)
1358 tree t1, t2;
1359 {
1360 if (TREE_CODE (t1) != TREE_CODE (t2))
1361 return 0;
1362 return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
1363 }
1364
1365 /* Give message using types TYPE1 and TYPE2 as arguments.
1366 PFN is the function which will print the message;
1367 S is the format string for PFN to use. */
1368
1369 void
1370 message_2_types (pfn, s, type1, type2)
1371 void (*pfn) ();
1372 char *s;
1373 tree type1, type2;
1374 {
1375 tree name1 = TYPE_NAME (type1);
1376 tree name2 = TYPE_NAME (type2);
1377 if (TREE_CODE (name1) == TYPE_DECL)
1378 name1 = DECL_NAME (name1);
1379 if (TREE_CODE (name2) == TYPE_DECL)
1380 name2 = DECL_NAME (name2);
1381 (*pfn) (s, IDENTIFIER_POINTER (name1), IDENTIFIER_POINTER (name2));
1382 }
1383 \f
1384 #define PRINT_RING_SIZE 4
1385
1386 char *
1387 lang_printable_name (decl)
1388 tree decl;
1389 {
1390 static tree decl_ring[PRINT_RING_SIZE];
1391 static char *print_ring[PRINT_RING_SIZE];
1392 static int ring_counter;
1393 int i;
1394
1395 /* Only cache functions. */
1396 if (TREE_CODE (decl) != FUNCTION_DECL
1397 || DECL_LANG_SPECIFIC (decl) == 0)
1398 return decl_as_string (decl, 1);
1399
1400 /* See if this print name is lying around. */
1401 for (i = 0; i < PRINT_RING_SIZE; i++)
1402 if (decl_ring[i] == decl)
1403 /* yes, so return it. */
1404 return print_ring[i];
1405
1406 if (++ring_counter == PRINT_RING_SIZE)
1407 ring_counter = 0;
1408
1409 if (current_function_decl != NULL_TREE)
1410 {
1411 if (decl_ring[ring_counter] == current_function_decl)
1412 ring_counter += 1;
1413 if (ring_counter == PRINT_RING_SIZE)
1414 ring_counter = 0;
1415 if (decl_ring[ring_counter] == current_function_decl)
1416 my_friendly_abort (106);
1417 }
1418
1419 if (print_ring[ring_counter])
1420 free (print_ring[ring_counter]);
1421
1422 {
1423 int print_ret_type_p
1424 = (!DECL_CONSTRUCTOR_P (decl)
1425 && !DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl)));
1426
1427 char *name = (char *)decl_as_string (decl, print_ret_type_p);
1428 print_ring[ring_counter] = (char *)malloc (strlen (name) + 1);
1429 strcpy (print_ring[ring_counter], name);
1430 decl_ring[ring_counter] = decl;
1431 }
1432 return print_ring[ring_counter];
1433 }
1434 \f
1435 /* Build the FUNCTION_TYPE or METHOD_TYPE which may throw exceptions
1436 listed in RAISES. */
1437
1438 tree
1439 build_exception_variant (type, raises)
1440 tree type;
1441 tree raises;
1442 {
1443 tree v = TYPE_MAIN_VARIANT (type);
1444 int constp = TYPE_READONLY (type);
1445 int volatilep = TYPE_VOLATILE (type);
1446
1447 for (; v; v = TYPE_NEXT_VARIANT (v))
1448 {
1449 if (TYPE_READONLY (v) != constp
1450 || TYPE_VOLATILE (v) != volatilep)
1451 continue;
1452
1453 /* @@ This should do set equality, not exact match. */
1454 if (simple_cst_list_equal (TYPE_RAISES_EXCEPTIONS (v), raises))
1455 /* List of exceptions raised matches previously found list.
1456
1457 @@ Nice to free up storage used in consing up the
1458 @@ list of exceptions raised. */
1459 return v;
1460 }
1461
1462 /* Need to build a new variant. */
1463 v = build_type_copy (type);
1464
1465 if (raises && ! TREE_PERMANENT (raises))
1466 {
1467 push_obstacks_nochange ();
1468 end_temporary_allocation ();
1469 raises = copy_list (raises);
1470 pop_obstacks ();
1471 }
1472
1473 TYPE_RAISES_EXCEPTIONS (v) = raises;
1474 return v;
1475 }
1476
1477 /* Subroutine of copy_to_permanent
1478
1479 Assuming T is a node build bottom-up, make it all exist on
1480 permanent obstack, if it is not permanent already. */
1481
1482 tree
1483 mapcar (t, func)
1484 tree t;
1485 tree (*func)();
1486 {
1487 tree tmp;
1488
1489 if (t == NULL_TREE)
1490 return t;
1491
1492 if (tmp = func (t), tmp != NULL_TREE)
1493 return tmp;
1494
1495 switch (TREE_CODE (t))
1496 {
1497 case ERROR_MARK:
1498 return error_mark_node;
1499
1500 case VAR_DECL:
1501 case FUNCTION_DECL:
1502 case CONST_DECL:
1503 break;
1504
1505 case PARM_DECL:
1506 {
1507 tree chain = TREE_CHAIN (t);
1508 t = copy_node (t);
1509 TREE_CHAIN (t) = mapcar (chain, func);
1510 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1511 DECL_INITIAL (t) = mapcar (DECL_INITIAL (t), func);
1512 DECL_SIZE (t) = mapcar (DECL_SIZE (t), func);
1513 return t;
1514 }
1515
1516 case TREE_LIST:
1517 {
1518 tree chain = TREE_CHAIN (t);
1519 t = copy_node (t);
1520 TREE_PURPOSE (t) = mapcar (TREE_PURPOSE (t), func);
1521 TREE_VALUE (t) = mapcar (TREE_VALUE (t), func);
1522 TREE_CHAIN (t) = mapcar (chain, func);
1523 return t;
1524 }
1525
1526 case TREE_VEC:
1527 {
1528 int len = TREE_VEC_LENGTH (t);
1529
1530 t = copy_node (t);
1531 while (len--)
1532 TREE_VEC_ELT (t, len) = mapcar (TREE_VEC_ELT (t, len), func);
1533 return t;
1534 }
1535
1536 case INTEGER_CST:
1537 case REAL_CST:
1538 case STRING_CST:
1539 return copy_node (t);
1540
1541 case COND_EXPR:
1542 case TARGET_EXPR:
1543 case NEW_EXPR:
1544 t = copy_node (t);
1545 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1546 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1547 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1548 return t;
1549
1550 case SAVE_EXPR:
1551 t = copy_node (t);
1552 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1553 return t;
1554
1555 case MODIFY_EXPR:
1556 case PLUS_EXPR:
1557 case MINUS_EXPR:
1558 case MULT_EXPR:
1559 case TRUNC_DIV_EXPR:
1560 case TRUNC_MOD_EXPR:
1561 case MIN_EXPR:
1562 case MAX_EXPR:
1563 case LSHIFT_EXPR:
1564 case RSHIFT_EXPR:
1565 case BIT_IOR_EXPR:
1566 case BIT_XOR_EXPR:
1567 case BIT_AND_EXPR:
1568 case BIT_ANDTC_EXPR:
1569 case TRUTH_ANDIF_EXPR:
1570 case TRUTH_ORIF_EXPR:
1571 case LT_EXPR:
1572 case LE_EXPR:
1573 case GT_EXPR:
1574 case GE_EXPR:
1575 case EQ_EXPR:
1576 case NE_EXPR:
1577 case CEIL_DIV_EXPR:
1578 case FLOOR_DIV_EXPR:
1579 case ROUND_DIV_EXPR:
1580 case CEIL_MOD_EXPR:
1581 case FLOOR_MOD_EXPR:
1582 case ROUND_MOD_EXPR:
1583 case COMPOUND_EXPR:
1584 case PREDECREMENT_EXPR:
1585 case PREINCREMENT_EXPR:
1586 case POSTDECREMENT_EXPR:
1587 case POSTINCREMENT_EXPR:
1588 case CALL_EXPR:
1589 case ARRAY_REF:
1590 case SCOPE_REF:
1591 t = copy_node (t);
1592 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1593 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1594 return t;
1595
1596 case CONVERT_EXPR:
1597 case ADDR_EXPR:
1598 case INDIRECT_REF:
1599 case NEGATE_EXPR:
1600 case BIT_NOT_EXPR:
1601 case TRUTH_NOT_EXPR:
1602 case NOP_EXPR:
1603 case COMPONENT_REF:
1604 t = copy_node (t);
1605 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1606 return t;
1607
1608 case POINTER_TYPE:
1609 tmp = build_pointer_type (mapcar (TREE_TYPE (t), func));
1610 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1611 case REFERENCE_TYPE:
1612 tmp = build_reference_type (mapcar (TREE_TYPE (t), func));
1613 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1614 case FUNCTION_TYPE:
1615 tmp = build_function_type (mapcar (TREE_TYPE (t), func),
1616 mapcar (TYPE_ARG_TYPES (t), func));
1617 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1618 case ARRAY_TYPE:
1619 tmp = build_cplus_array_type (mapcar (TREE_TYPE (t), func),
1620 mapcar (TYPE_DOMAIN (t), func));
1621 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1622 case INTEGER_TYPE:
1623 tmp = build_index_type (mapcar (TYPE_MAX_VALUE (t), func));
1624 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1625 case OFFSET_TYPE:
1626 tmp = build_offset_type (mapcar (TYPE_OFFSET_BASETYPE (t), func),
1627 mapcar (TREE_TYPE (t), func));
1628 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1629 case METHOD_TYPE:
1630 tmp = build_cplus_method_type
1631 (mapcar (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), func),
1632 mapcar (TREE_TYPE (t), func),
1633 mapcar (TREE_CHAIN (TYPE_ARG_TYPES (t)), func));
1634 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1635
1636 case CONSTRUCTOR:
1637 t = copy_node (t);
1638 CONSTRUCTOR_ELTS (t) = mapcar (CONSTRUCTOR_ELTS (t), func);
1639 return t;
1640
1641 case RECORD_TYPE:
1642 if (TYPE_PTRMEMFUNC_P (t))
1643 return build_ptrmemfunc_type
1644 (mapcar (TYPE_PTRMEMFUNC_FN_TYPE (t), func));
1645 /* else fall through */
1646
1647 /* This list is incomplete, but should suffice for now.
1648 It is very important that `sorry' not call
1649 `report_error_function'. That could cause an infinite loop. */
1650 default:
1651 sorry ("initializer contains unrecognized tree code");
1652 return error_mark_node;
1653
1654 }
1655 my_friendly_abort (107);
1656 /* NOTREACHED */
1657 return NULL_TREE;
1658 }
1659
1660 static tree
1661 perm_manip (t)
1662 tree t;
1663 {
1664 if (TREE_PERMANENT (t))
1665 return t;
1666 /* Support `void f () { extern int i; A<&i> a; }' */
1667 if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == FUNCTION_DECL)
1668 && TREE_PUBLIC (t))
1669 return copy_node (t);
1670 return NULL_TREE;
1671 }
1672
1673 /* Assuming T is a node built bottom-up, make it all exist on
1674 permanent obstack, if it is not permanent already. */
1675
1676 tree
1677 copy_to_permanent (t)
1678 tree t;
1679 {
1680 register struct obstack *ambient_obstack = current_obstack;
1681 register struct obstack *ambient_saveable_obstack = saveable_obstack;
1682 register struct obstack *ambient_expression_obstack = expression_obstack;
1683
1684 if (t == NULL_TREE || TREE_PERMANENT (t))
1685 return t;
1686
1687 saveable_obstack = &permanent_obstack;
1688 current_obstack = saveable_obstack;
1689 expression_obstack = saveable_obstack;
1690
1691 t = mapcar (t, perm_manip);
1692
1693 current_obstack = ambient_obstack;
1694 saveable_obstack = ambient_saveable_obstack;
1695 expression_obstack = ambient_expression_obstack;
1696
1697 return t;
1698 }
1699
1700 #ifdef GATHER_STATISTICS
1701 extern int depth_reached;
1702 #endif
1703
1704 void
1705 print_lang_statistics ()
1706 {
1707 extern struct obstack maybepermanent_obstack, decl_obstack;
1708 print_obstack_statistics ("class_obstack", &class_obstack);
1709 print_obstack_statistics ("decl_obstack", &decl_obstack);
1710 print_obstack_statistics ("permanent_obstack", &permanent_obstack);
1711 print_obstack_statistics ("maybepermanent_obstack", &maybepermanent_obstack);
1712 print_search_statistics ();
1713 print_class_statistics ();
1714 #ifdef GATHER_STATISTICS
1715 fprintf (stderr, "maximum template instantiation depth reached: %d\n",
1716 depth_reached);
1717 #endif
1718 }
1719
1720 /* This is used by the `assert' macro. It is provided in libgcc.a,
1721 which `cc' doesn't know how to link. Note that the C++ front-end
1722 no longer actually uses the `assert' macro (instead, it calls
1723 my_friendly_assert). But all of the back-end files still need this. */
1724
1725 void
1726 __eprintf (string, expression, line, filename)
1727 #ifdef __STDC__
1728 const char *string;
1729 const char *expression;
1730 unsigned line;
1731 const char *filename;
1732 #else
1733 char *string;
1734 char *expression;
1735 unsigned line;
1736 char *filename;
1737 #endif
1738 {
1739 fprintf (stderr, string, expression, line, filename);
1740 fflush (stderr);
1741 abort ();
1742 }
1743
1744 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1745 (which is an ARRAY_TYPE). This counts only elements of the top
1746 array. */
1747
1748 tree
1749 array_type_nelts_top (type)
1750 tree type;
1751 {
1752 return fold (build (PLUS_EXPR, sizetype,
1753 array_type_nelts (type),
1754 integer_one_node));
1755 }
1756
1757 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1758 (which is an ARRAY_TYPE). This one is a recursive count of all
1759 ARRAY_TYPEs that are clumped together. */
1760
1761 tree
1762 array_type_nelts_total (type)
1763 tree type;
1764 {
1765 tree sz = array_type_nelts_top (type);
1766 type = TREE_TYPE (type);
1767 while (TREE_CODE (type) == ARRAY_TYPE)
1768 {
1769 tree n = array_type_nelts_top (type);
1770 sz = fold (build (MULT_EXPR, sizetype, sz, n));
1771 type = TREE_TYPE (type);
1772 }
1773 return sz;
1774 }
1775
1776 static
1777 tree
1778 bot_manip (t)
1779 tree t;
1780 {
1781 if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
1782 return t;
1783 else if (TREE_CODE (t) == TARGET_EXPR)
1784 {
1785 if (TREE_CODE (TREE_OPERAND (t, 1)) == NEW_EXPR)
1786 {
1787 mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0));
1788 return build_cplus_new
1789 (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1)));
1790 }
1791 t = copy_node (t);
1792 TREE_OPERAND (t, 0) = build (VAR_DECL, TREE_TYPE (t));
1793 layout_decl (TREE_OPERAND (t, 0), 0);
1794 return t;
1795 }
1796 else if (TREE_CODE (t) == CALL_EXPR)
1797 mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
1798
1799 return NULL_TREE;
1800 }
1801
1802 /* Actually, we'll just clean out the target exprs for the moment. */
1803
1804 tree
1805 break_out_target_exprs (t)
1806 tree t;
1807 {
1808 return mapcar (t, bot_manip);
1809 }
1810
1811 /* Obstack used for allocating nodes in template function and variable
1812 definitions. */
1813
1814 extern struct obstack *expression_obstack;
1815
1816 /* Similar to `build_nt', except we build
1817 on the permanent_obstack, regardless. */
1818
1819 tree
1820 build_min_nt VPROTO((enum tree_code code, ...))
1821 {
1822 #ifndef __STDC__
1823 enum tree_code code;
1824 #endif
1825 register struct obstack *ambient_obstack = expression_obstack;
1826 va_list p;
1827 register tree t;
1828 register int length;
1829 register int i;
1830
1831 VA_START (p, code);
1832
1833 #ifndef __STDC__
1834 code = va_arg (p, enum tree_code);
1835 #endif
1836
1837 expression_obstack = &permanent_obstack;
1838
1839 t = make_node (code);
1840 length = tree_code_length[(int) code];
1841 TREE_COMPLEXITY (t) = lineno;
1842
1843 for (i = 0; i < length; i++)
1844 {
1845 tree x = va_arg (p, tree);
1846 TREE_OPERAND (t, i) = copy_to_permanent (x);
1847 }
1848
1849 va_end (p);
1850 expression_obstack = ambient_obstack;
1851 return t;
1852 }
1853
1854 /* Similar to `build', except we build
1855 on the permanent_obstack, regardless. */
1856
1857 tree
1858 build_min VPROTO((enum tree_code code, tree tt, ...))
1859 {
1860 #ifndef __STDC__
1861 enum tree_code code;
1862 tree tt;
1863 #endif
1864 register struct obstack *ambient_obstack = expression_obstack;
1865 va_list p;
1866 register tree t;
1867 register int length;
1868 register int i;
1869
1870 VA_START (p, tt);
1871
1872 #ifndef __STDC__
1873 code = va_arg (p, enum tree_code);
1874 tt = va_arg (p, tree);
1875 #endif
1876
1877 expression_obstack = &permanent_obstack;
1878
1879 t = make_node (code);
1880 length = tree_code_length[(int) code];
1881 TREE_TYPE (t) = tt;
1882 TREE_COMPLEXITY (t) = lineno;
1883
1884 for (i = 0; i < length; i++)
1885 {
1886 tree x = va_arg (p, tree);
1887 TREE_OPERAND (t, i) = copy_to_permanent (x);
1888 }
1889
1890 va_end (p);
1891 expression_obstack = ambient_obstack;
1892 return t;
1893 }
1894
1895 /* Same as `tree_cons' but make a permanent object. */
1896
1897 tree
1898 min_tree_cons (purpose, value, chain)
1899 tree purpose, value, chain;
1900 {
1901 register tree node;
1902 register struct obstack *ambient_obstack = current_obstack;
1903 current_obstack = &permanent_obstack;
1904
1905 node = tree_cons (copy_to_permanent (purpose),
1906 copy_to_permanent (value), chain);
1907 current_obstack = ambient_obstack;
1908 return node;
1909 }
1910
1911 tree
1912 get_type_decl (t)
1913 tree t;
1914 {
1915 if (TREE_CODE (t) == IDENTIFIER_NODE)
1916 return identifier_typedecl_value (t);
1917 if (TREE_CODE (t) == TYPE_DECL)
1918 return t;
1919 if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
1920 return TYPE_STUB_DECL (t);
1921
1922 my_friendly_abort (42);
1923 }
1924
1925 int
1926 can_free (obstack, t)
1927 struct obstack *obstack;
1928 tree t;
1929 {
1930 int size;
1931
1932 if (TREE_CODE (t) == TREE_VEC)
1933 size = (TREE_VEC_LENGTH (t)-1) * sizeof (tree) + sizeof (struct tree_vec);
1934 else
1935 my_friendly_abort (42);
1936
1937 #define ROUND(x) ((x + obstack_alignment_mask (obstack)) \
1938 & ~ obstack_alignment_mask (obstack))
1939 if ((char *)t + ROUND (size) == obstack_next_free (obstack))
1940 return 1;
1941 #undef ROUND
1942
1943 return 0;
1944 }
1945
1946 /* Return first vector element whose BINFO_TYPE is ELEM.
1947 Return 0 if ELEM is not in VEC. VEC may be NULL_TREE. */
1948
1949 tree
1950 vec_binfo_member (elem, vec)
1951 tree elem, vec;
1952 {
1953 int i;
1954
1955 if (vec)
1956 for (i = 0; i < TREE_VEC_LENGTH (vec); ++i)
1957 if (comptypes (elem, BINFO_TYPE (TREE_VEC_ELT (vec, i)), 1))
1958 return TREE_VEC_ELT (vec, i);
1959
1960 return NULL_TREE;
1961 }
1962
1963 /* Kludge around the fact that DECL_CONTEXT for virtual functions returns
1964 the wrong thing for decl_function_context. Hopefully the uses in the
1965 backend won't matter, since we don't need a static chain for local class
1966 methods. FIXME! */
1967
1968 tree
1969 hack_decl_function_context (decl)
1970 tree decl;
1971 {
1972 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
1973 return decl_function_context (TYPE_MAIN_DECL (DECL_CLASS_CONTEXT (decl)));
1974 return decl_function_context (decl);
1975 }
1976
1977 /* Return truthvalue of whether T1 is the same tree structure as T2.
1978 Return 1 if they are the same.
1979 Return 0 if they are understandably different.
1980 Return -1 if either contains tree structure not understood by
1981 this function. */
1982
1983 int
1984 cp_tree_equal (t1, t2)
1985 tree t1, t2;
1986 {
1987 register enum tree_code code1, code2;
1988 int cmp;
1989
1990 if (t1 == t2)
1991 return 1;
1992 if (t1 == 0 || t2 == 0)
1993 return 0;
1994
1995 code1 = TREE_CODE (t1);
1996 code2 = TREE_CODE (t2);
1997
1998 if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR)
1999 if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR)
2000 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2001 else
2002 return cp_tree_equal (TREE_OPERAND (t1, 0), t2);
2003 else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR
2004 || code2 == NON_LVALUE_EXPR)
2005 return cp_tree_equal (t1, TREE_OPERAND (t2, 0));
2006
2007 if (code1 != code2)
2008 return 0;
2009
2010 switch (code1)
2011 {
2012 case INTEGER_CST:
2013 return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
2014 && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2);
2015
2016 case REAL_CST:
2017 return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2018
2019 case STRING_CST:
2020 return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2021 && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2022 TREE_STRING_LENGTH (t1));
2023
2024 case CONSTRUCTOR:
2025 abort ();
2026
2027 case SAVE_EXPR:
2028 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2029
2030 case CALL_EXPR:
2031 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2032 if (cmp <= 0)
2033 return cmp;
2034 return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2035
2036 case TARGET_EXPR:
2037 /* Special case: if either target is an unallocated VAR_DECL,
2038 it means that it's going to be unified with whatever the
2039 TARGET_EXPR is really supposed to initialize, so treat it
2040 as being equivalent to anything. */
2041 if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
2042 && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
2043 && DECL_RTL (TREE_OPERAND (t1, 0)) == 0)
2044 || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
2045 && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
2046 && DECL_RTL (TREE_OPERAND (t2, 0)) == 0))
2047 cmp = 1;
2048 else
2049 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2050 if (cmp <= 0)
2051 return cmp;
2052 return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2053
2054 case WITH_CLEANUP_EXPR:
2055 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2056 if (cmp <= 0)
2057 return cmp;
2058 return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
2059
2060 case COMPONENT_REF:
2061 if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
2062 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2063 return 0;
2064
2065 case VAR_DECL:
2066 case PARM_DECL:
2067 case CONST_DECL:
2068 case FUNCTION_DECL:
2069 return 0;
2070
2071 case TEMPLATE_CONST_PARM:
2072 return TEMPLATE_CONST_IDX (t1) == TEMPLATE_CONST_IDX (t2);
2073
2074 case SIZEOF_EXPR:
2075 if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
2076 return 0;
2077 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
2078 return comptypes (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0), 1);
2079 break;
2080 }
2081
2082 switch (TREE_CODE_CLASS (code1))
2083 {
2084 int i;
2085 case '1':
2086 case '2':
2087 case '<':
2088 case 'e':
2089 case 'r':
2090 case 's':
2091 cmp = 1;
2092 for (i=0; i<tree_code_length[(int) code1]; ++i)
2093 {
2094 cmp = cp_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
2095 if (cmp <= 0)
2096 return cmp;
2097 }
2098 return cmp;
2099 }
2100
2101 return -1;
2102 }
2103
2104 /* Similar to make_tree_vec, but build on a temporary obstack. */
2105
2106 tree
2107 make_temp_vec (len)
2108 int len;
2109 {
2110 register tree node;
2111 push_obstacks_nochange ();
2112 resume_temporary_allocation ();
2113 node = make_tree_vec (len);
2114 pop_obstacks ();
2115 return node;
2116 }
2117
2118 /* The type of ARG when used as an lvalue. */
2119
2120 tree
2121 lvalue_type (arg)
2122 tree arg;
2123 {
2124 return cp_build_type_variant
2125 (TREE_TYPE (arg), TREE_READONLY (arg), TREE_THIS_VOLATILE (arg));
2126 }
2127
2128 /* The type of ARG for printing error messages; denote lvalues with
2129 reference types. */
2130
2131 tree
2132 error_type (arg)
2133 tree arg;
2134 {
2135 tree type = TREE_TYPE (arg);
2136 if (TREE_CODE (type) == ARRAY_TYPE)
2137 ;
2138 else if (real_lvalue_p (arg))
2139 type = build_reference_type (lvalue_type (arg));
2140 else if (IS_AGGR_TYPE (type))
2141 type = lvalue_type (arg);
2142
2143 return type;
2144 }