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