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