cp-tree.h (flag_new_abi): Move.
[gcc.git] / gcc / cp / tree.c
1 /* Language-dependent node constructors for parse phase of GNU compiler.
2 Copyright (C) 1987, 88, 92-98, 1999 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 #include "ggc.h"
31 #include "insn-config.h"
32 #include "integrate.h"
33
34 static tree bot_manip PROTO((tree *, int *, void *));
35 static tree bot_replace PROTO((tree *, int *, void *));
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, tree, tree, tree));
40 static cp_lvalue_kind lvalue_p_1 PROTO((tree, int));
41 static tree no_linkage_helper PROTO((tree *, int *, void *));
42 static tree build_srcloc PROTO((char *, int));
43 static void mark_list_hash PROTO ((void *));
44 static int statement_code_p PROTO((enum tree_code));
45 static tree mark_local_for_remap_r PROTO((tree *, int *, void *));
46 static tree cp_unsave_r PROTO ((tree *, int *, void *));
47 static void cp_unsave PROTO((tree *));
48 static tree build_target_expr PROTO((tree, tree));
49
50 /* If REF is an lvalue, returns the kind of lvalue that REF is.
51 Otherwise, returns clk_none. If TREAT_CLASS_RVALUES_AS_LVALUES is
52 non-zero, rvalues of class type are considered lvalues. */
53
54 static cp_lvalue_kind
55 lvalue_p_1 (ref, treat_class_rvalues_as_lvalues)
56 tree ref;
57 int treat_class_rvalues_as_lvalues;
58 {
59 cp_lvalue_kind op1_lvalue_kind = clk_none;
60 cp_lvalue_kind op2_lvalue_kind = clk_none;
61
62 if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
63 return clk_ordinary;
64
65 if (ref == current_class_ptr && flag_this_is_variable <= 0)
66 return clk_none;
67
68 switch (TREE_CODE (ref))
69 {
70 /* preincrements and predecrements are valid lvals, provided
71 what they refer to are valid lvals. */
72 case PREINCREMENT_EXPR:
73 case PREDECREMENT_EXPR:
74 case SAVE_EXPR:
75 case UNSAVE_EXPR:
76 case TRY_CATCH_EXPR:
77 case WITH_CLEANUP_EXPR:
78 case REALPART_EXPR:
79 case IMAGPART_EXPR:
80 case NOP_EXPR:
81 return lvalue_p_1 (TREE_OPERAND (ref, 0),
82 treat_class_rvalues_as_lvalues);
83
84 case COMPONENT_REF:
85 op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 0),
86 treat_class_rvalues_as_lvalues);
87 if (op1_lvalue_kind
88 /* The "field" can be a FUNCTION_DECL or an OVERLOAD in some
89 situations. */
90 && TREE_CODE (TREE_OPERAND (ref, 1)) == FIELD_DECL
91 && DECL_C_BIT_FIELD (TREE_OPERAND (ref, 1)))
92 {
93 /* Clear the ordinary bit. If this object was a class
94 rvalue we want to preserve that information. */
95 op1_lvalue_kind &= ~clk_ordinary;
96 /* The lvalue is for a btifield. */
97 op1_lvalue_kind |= clk_bitfield;
98 }
99 return op1_lvalue_kind;
100
101 case STRING_CST:
102 return clk_ordinary;
103
104 case VAR_DECL:
105 if (TREE_READONLY (ref) && ! TREE_STATIC (ref)
106 && DECL_LANG_SPECIFIC (ref)
107 && DECL_IN_AGGR_P (ref))
108 return clk_none;
109 case INDIRECT_REF:
110 case ARRAY_REF:
111 case PARM_DECL:
112 case RESULT_DECL:
113 if (TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
114 return clk_ordinary;
115 break;
116
117 /* A currently unresolved scope ref. */
118 case SCOPE_REF:
119 my_friendly_abort (103);
120 case OFFSET_REF:
121 if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL)
122 return clk_ordinary;
123 /* Fall through. */
124 case MAX_EXPR:
125 case MIN_EXPR:
126 op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 0),
127 treat_class_rvalues_as_lvalues);
128 op2_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 1),
129 treat_class_rvalues_as_lvalues);
130 break;
131
132 case COND_EXPR:
133 op1_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 1),
134 treat_class_rvalues_as_lvalues);
135 op2_lvalue_kind = lvalue_p_1 (TREE_OPERAND (ref, 2),
136 treat_class_rvalues_as_lvalues);
137 break;
138
139 case MODIFY_EXPR:
140 return clk_ordinary;
141
142 case COMPOUND_EXPR:
143 return lvalue_p_1 (TREE_OPERAND (ref, 1),
144 treat_class_rvalues_as_lvalues);
145
146 case TARGET_EXPR:
147 return treat_class_rvalues_as_lvalues ? clk_class : clk_none;
148
149 case CALL_EXPR:
150 case VA_ARG_EXPR:
151 return ((treat_class_rvalues_as_lvalues
152 && IS_AGGR_TYPE (TREE_TYPE (ref)))
153 ? clk_class : clk_none);
154
155 case FUNCTION_DECL:
156 /* All functions (except non-static-member functions) are
157 lvalues. */
158 return (DECL_NONSTATIC_MEMBER_FUNCTION_P (ref)
159 ? clk_none : clk_ordinary);
160
161 default:
162 break;
163 }
164
165 /* If one operand is not an lvalue at all, then this expression is
166 not an lvalue. */
167 if (!op1_lvalue_kind || !op2_lvalue_kind)
168 return clk_none;
169
170 /* Otherwise, it's an lvalue, and it has all the odd properties
171 contributed by either operand. */
172 op1_lvalue_kind = op1_lvalue_kind | op2_lvalue_kind;
173 /* It's not an ordinary lvalue if it involves either a bit-field or
174 a class rvalue. */
175 if ((op1_lvalue_kind & ~clk_ordinary) != clk_none)
176 op1_lvalue_kind &= ~clk_ordinary;
177 return op1_lvalue_kind;
178 }
179
180 /* If REF is an lvalue, returns the kind of lvalue that REF is.
181 Otherwise, returns clk_none. Lvalues can be assigned, unless they
182 have TREE_READONLY, or unless they are FUNCTION_DECLs. Lvalues can
183 have their address taken, unless they have DECL_REGISTER. */
184
185 cp_lvalue_kind
186 real_lvalue_p (ref)
187 tree ref;
188 {
189 return lvalue_p_1 (ref, /*treat_class_rvalues_as_lvalues=*/0);
190 }
191
192 /* This differs from real_lvalue_p in that class rvalues are
193 considered lvalues. */
194
195 int
196 lvalue_p (ref)
197 tree ref;
198 {
199 return
200 (lvalue_p_1 (ref, /*treat_class_rvalues_as_lvalues=*/1) != clk_none);
201 }
202
203 /* Return nonzero if REF is an lvalue valid for this language;
204 otherwise, print an error message and return zero. */
205
206 int
207 lvalue_or_else (ref, string)
208 tree ref;
209 const char *string;
210 {
211 int win = lvalue_p (ref);
212 if (! win)
213 error ("non-lvalue in %s", string);
214 return win;
215 }
216
217 /* Build a TARGET_EXPR, initializing the DECL with the VALUE. */
218
219 static tree
220 build_target_expr (decl, value)
221 tree decl;
222 tree value;
223 {
224 tree t;
225
226 t = build (TARGET_EXPR, TREE_TYPE (decl), decl, value,
227 maybe_build_cleanup (decl), NULL_TREE);
228 /* We always set TREE_SIDE_EFFECTS so that expand_expr does not
229 ignore the TARGET_EXPR. If there really turn out to be no
230 side-effects, then the optimizer should be able to get rid of
231 whatever code is generated anyhow. */
232 TREE_SIDE_EFFECTS (t) = 1;
233
234 return t;
235 }
236
237 /* INIT is a CALL_EXPR which needs info about its target.
238 TYPE is the type that this initialization should appear to have.
239
240 Build an encapsulation of the initialization to perform
241 and return it so that it can be processed by language-independent
242 and language-specific expression expanders. */
243
244 tree
245 build_cplus_new (type, init)
246 tree type;
247 tree init;
248 {
249 tree fn;
250 tree slot;
251 tree rval;
252
253 /* Make sure that we're not trying to create an instance of an
254 abstract class. */
255 abstract_virtuals_error (NULL_TREE, type);
256
257 if (TREE_CODE (init) != CALL_EXPR && TREE_CODE (init) != AGGR_INIT_EXPR)
258 return convert (type, init);
259
260 slot = build (VAR_DECL, type);
261 DECL_ARTIFICIAL (slot) = 1;
262 DECL_CONTEXT (slot) = current_function_decl;
263 layout_decl (slot, 0);
264
265 /* We split the CALL_EXPR into its function and its arguments here.
266 Then, in expand_expr, we put them back together. The reason for
267 this is that this expression might be a default argument
268 expression. In that case, we need a new temporary every time the
269 expression is used. That's what break_out_target_exprs does; it
270 replaces every AGGR_INIT_EXPR with a copy that uses a fresh
271 temporary slot. Then, expand_expr builds up a call-expression
272 using the new slot. */
273 fn = TREE_OPERAND (init, 0);
274 rval = build (AGGR_INIT_EXPR, type, fn, TREE_OPERAND (init, 1), slot);
275 TREE_SIDE_EFFECTS (rval) = 1;
276 AGGR_INIT_VIA_CTOR_P (rval)
277 = (TREE_CODE (fn) == ADDR_EXPR
278 && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
279 && DECL_CONSTRUCTOR_P (TREE_OPERAND (fn, 0)));
280 rval = build_target_expr (slot, rval);
281
282 return rval;
283 }
284
285 /* Buidl a TARGET_EXPR using INIT to initialize a new temporary of the
286 indicated TYPE. */
287
288 tree
289 build_target_expr_with_type (init, type)
290 tree init;
291 tree type;
292 {
293 tree slot;
294 tree rval;
295
296 slot = build (VAR_DECL, type);
297 DECL_ARTIFICIAL (slot) = 1;
298 DECL_CONTEXT (slot) = current_function_decl;
299 layout_decl (slot, 0);
300 rval = build_target_expr (slot, init);
301
302 return rval;
303 }
304
305 /* Like build_target_expr_with_type, but use the type of INIT. */
306
307 tree
308 get_target_expr (init)
309 tree init;
310 {
311 return build_target_expr_with_type (init, TREE_TYPE (init));
312 }
313
314 /* Recursively search EXP for CALL_EXPRs that need cleanups and replace
315 these CALL_EXPRs with tree nodes that will perform the cleanups. */
316
317 tree
318 break_out_cleanups (exp)
319 tree exp;
320 {
321 tree tmp = exp;
322
323 if (TREE_CODE (tmp) == CALL_EXPR
324 && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (tmp)))
325 return build_cplus_new (TREE_TYPE (tmp), tmp);
326
327 while (TREE_CODE (tmp) == NOP_EXPR
328 || TREE_CODE (tmp) == CONVERT_EXPR
329 || TREE_CODE (tmp) == NON_LVALUE_EXPR)
330 {
331 if (TREE_CODE (TREE_OPERAND (tmp, 0)) == CALL_EXPR
332 && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (TREE_OPERAND (tmp, 0))))
333 {
334 TREE_OPERAND (tmp, 0)
335 = build_cplus_new (TREE_TYPE (TREE_OPERAND (tmp, 0)),
336 TREE_OPERAND (tmp, 0));
337 break;
338 }
339 else
340 tmp = TREE_OPERAND (tmp, 0);
341 }
342 return exp;
343 }
344
345 /* Recursively perform a preorder search EXP for CALL_EXPRs, making
346 copies where they are found. Returns a deep copy all nodes transitively
347 containing CALL_EXPRs. */
348
349 tree
350 break_out_calls (exp)
351 tree exp;
352 {
353 register tree t1, t2 = NULL_TREE;
354 register enum tree_code code;
355 register int changed = 0;
356 register int i;
357
358 if (exp == NULL_TREE)
359 return exp;
360
361 code = TREE_CODE (exp);
362
363 if (code == CALL_EXPR)
364 return copy_node (exp);
365
366 /* Don't try and defeat a save_expr, as it should only be done once. */
367 if (code == SAVE_EXPR)
368 return exp;
369
370 switch (TREE_CODE_CLASS (code))
371 {
372 default:
373 abort ();
374
375 case 'c': /* a constant */
376 case 't': /* a type node */
377 case 'x': /* something random, like an identifier or an ERROR_MARK. */
378 return exp;
379
380 case 'd': /* A decl node */
381 #if 0 /* This is bogus. jason 9/21/94 */
382
383 t1 = break_out_calls (DECL_INITIAL (exp));
384 if (t1 != DECL_INITIAL (exp))
385 {
386 exp = copy_node (exp);
387 DECL_INITIAL (exp) = t1;
388 }
389 #endif
390 return exp;
391
392 case 'b': /* A block node */
393 {
394 /* Don't know how to handle these correctly yet. Must do a
395 break_out_calls on all DECL_INITIAL values for local variables,
396 and also break_out_calls on all sub-blocks and sub-statements. */
397 abort ();
398 }
399 return exp;
400
401 case 'e': /* an expression */
402 case 'r': /* a reference */
403 case 's': /* an expression with side effects */
404 for (i = tree_code_length[(int) code] - 1; i >= 0; i--)
405 {
406 t1 = break_out_calls (TREE_OPERAND (exp, i));
407 if (t1 != TREE_OPERAND (exp, i))
408 {
409 exp = copy_node (exp);
410 TREE_OPERAND (exp, i) = t1;
411 }
412 }
413 return exp;
414
415 case '<': /* a comparison expression */
416 case '2': /* a binary arithmetic expression */
417 t2 = break_out_calls (TREE_OPERAND (exp, 1));
418 if (t2 != TREE_OPERAND (exp, 1))
419 changed = 1;
420 case '1': /* a unary arithmetic expression */
421 t1 = break_out_calls (TREE_OPERAND (exp, 0));
422 if (t1 != TREE_OPERAND (exp, 0))
423 changed = 1;
424 if (changed)
425 {
426 if (tree_code_length[(int) code] == 1)
427 return build1 (code, TREE_TYPE (exp), t1);
428 else
429 return build (code, TREE_TYPE (exp), t1, t2);
430 }
431 return exp;
432 }
433
434 }
435 \f
436 extern struct obstack permanent_obstack;
437
438 /* Here is how primitive or already-canonicalized types' hash
439 codes are made. MUST BE CONSISTENT WITH tree.c !!! */
440 #define TYPE_HASH(TYPE) ((HOST_WIDE_INT) (TYPE) & 0777777)
441
442 /* Construct, lay out and return the type of methods belonging to class
443 BASETYPE and whose arguments are described by ARGTYPES and whose values
444 are described by RETTYPE. If each type exists already, reuse it. */
445
446 tree
447 build_cplus_method_type (basetype, rettype, argtypes)
448 tree basetype, rettype, argtypes;
449 {
450 register tree t;
451 tree ptype;
452 int hashcode;
453
454 /* Make a node of the sort we want. */
455 t = make_node (METHOD_TYPE);
456
457 TYPE_METHOD_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype);
458 TREE_TYPE (t) = rettype;
459 ptype = build_pointer_type (basetype);
460
461 /* The actual arglist for this function includes a "hidden" argument
462 which is "this". Put it into the list of argument types. Make
463 sure that the new argument list is allocated on the same obstack
464 as the type. */
465 argtypes = tree_cons (NULL_TREE, ptype, argtypes);
466 TYPE_ARG_TYPES (t) = argtypes;
467 TREE_SIDE_EFFECTS (argtypes) = 1; /* Mark first argtype as "artificial". */
468
469 /* If we already have such a type, use the old one and free this one.
470 Note that it also frees up the above cons cell if found. */
471 hashcode = TYPE_HASH (basetype) + TYPE_HASH (rettype) +
472 type_hash_list (argtypes);
473
474 t = type_hash_canon (hashcode, t);
475
476 if (TYPE_SIZE (t) == 0)
477 layout_type (t);
478
479 return t;
480 }
481
482 static tree
483 build_cplus_array_type_1 (elt_type, index_type)
484 tree elt_type;
485 tree index_type;
486 {
487 tree t;
488
489 if (elt_type == error_mark_node || index_type == error_mark_node)
490 return error_mark_node;
491
492 if (processing_template_decl
493 || uses_template_parms (elt_type)
494 || uses_template_parms (index_type))
495 {
496 t = make_node (ARRAY_TYPE);
497 TREE_TYPE (t) = elt_type;
498 TYPE_DOMAIN (t) = index_type;
499 }
500 else
501 t = build_array_type (elt_type, index_type);
502
503 /* Push these needs up so that initialization takes place
504 more easily. */
505 TYPE_NEEDS_CONSTRUCTING (t)
506 = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (elt_type));
507 TYPE_NEEDS_DESTRUCTOR (t)
508 = TYPE_NEEDS_DESTRUCTOR (TYPE_MAIN_VARIANT (elt_type));
509 return t;
510 }
511
512 tree
513 build_cplus_array_type (elt_type, index_type)
514 tree elt_type;
515 tree index_type;
516 {
517 tree t;
518 int type_quals = CP_TYPE_QUALS (elt_type);
519
520 elt_type = TYPE_MAIN_VARIANT (elt_type);
521
522 t = build_cplus_array_type_1 (elt_type, index_type);
523
524 if (type_quals != TYPE_UNQUALIFIED)
525 t = cp_build_qualified_type (t, type_quals);
526
527 return t;
528 }
529 \f
530 /* Make a variant of TYPE, qualified with the TYPE_QUALS. Handles
531 arrays correctly. In particular, if TYPE is an array of T's, and
532 TYPE_QUALS is non-empty, returns an array of qualified T's. If
533 at attempt is made to qualify a type illegally, and COMPLAIN is
534 non-zero, an error is issued. If COMPLAIN is zero, error_mark_node
535 is returned. */
536
537 tree
538 cp_build_qualified_type_real (type, type_quals, complain)
539 tree type;
540 int type_quals;
541 int complain;
542 {
543 tree result;
544
545 if (type == error_mark_node)
546 return type;
547
548 if (type_quals == TYPE_QUALS (type))
549 return type;
550
551 /* A restrict-qualified pointer type must be a pointer (or reference)
552 to object or incomplete type. */
553 if ((type_quals & TYPE_QUAL_RESTRICT)
554 && TREE_CODE (type) != TEMPLATE_TYPE_PARM
555 && (!POINTER_TYPE_P (type)
556 || TYPE_PTRMEM_P (type)
557 || TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE))
558 {
559 if (complain)
560 cp_error ("`%T' cannot be `restrict'-qualified", type);
561 else
562 return error_mark_node;
563
564 type_quals &= ~TYPE_QUAL_RESTRICT;
565 }
566
567 if (type_quals != TYPE_UNQUALIFIED
568 && TREE_CODE (type) == FUNCTION_TYPE)
569 {
570 if (complain)
571 cp_error ("`%T' cannot be `const'-, `volatile'-, or `restrict'-qualified", type);
572 else
573 return error_mark_node;
574 type_quals = TYPE_UNQUALIFIED;
575 }
576 else if (TREE_CODE (type) == ARRAY_TYPE)
577 {
578 /* In C++, the qualification really applies to the array element
579 type. Obtain the appropriately qualified element type. */
580 tree t;
581 tree element_type
582 = cp_build_qualified_type_real (TREE_TYPE (type),
583 type_quals,
584 complain);
585
586 if (element_type == error_mark_node)
587 return error_mark_node;
588
589 /* See if we already have an identically qualified type. */
590 for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
591 if (CP_TYPE_QUALS (t) == type_quals)
592 break;
593
594 /* If we didn't already have it, create it now. */
595 if (!t)
596 {
597 /* Make a new array type, just like the old one, but with the
598 appropriately qualified element type. */
599 t = build_type_copy (type);
600 TREE_TYPE (t) = element_type;
601 }
602
603 /* Even if we already had this variant, we update
604 TYPE_NEEDS_CONSTRUCTING and TYPE_NEEDS_DESTRUCTOR in case
605 they changed since the variant was originally created.
606
607 This seems hokey; if there is some way to use a previous
608 variant *without* coming through here,
609 TYPE_NEEDS_CONSTRUCTING will never be updated. */
610 TYPE_NEEDS_CONSTRUCTING (t)
611 = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (element_type));
612 TYPE_NEEDS_DESTRUCTOR (t)
613 = TYPE_NEEDS_DESTRUCTOR (TYPE_MAIN_VARIANT (element_type));
614 return t;
615 }
616 else if (TYPE_PTRMEMFUNC_P (type))
617 {
618 /* For a pointer-to-member type, we can't just return a
619 cv-qualified version of the RECORD_TYPE. If we do, we
620 haven't change the field that contains the actual pointer to
621 a method, and so TYPE_PTRMEMFUNC_FN_TYPE will be wrong. */
622 tree t;
623
624 t = TYPE_PTRMEMFUNC_FN_TYPE (type);
625 t = cp_build_qualified_type_real (t, type_quals, complain);
626 return build_ptrmemfunc_type (t);
627 }
628
629 /* Retrieve (or create) the appropriately qualified variant. */
630 result = build_qualified_type (type, type_quals);
631
632 /* If this was a pointer-to-method type, and we just made a copy,
633 then we need to clear the cached associated
634 pointer-to-member-function type; it is not valid for the new
635 type. */
636 if (result != type
637 && TREE_CODE (type) == POINTER_TYPE
638 && TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE)
639 TYPE_SET_PTRMEMFUNC_TYPE (result, NULL_TREE);
640
641 return result;
642 }
643
644 /* Returns the canonical version of TYPE. In other words, if TYPE is
645 a typedef, returns the underlying type. The cv-qualification of
646 the type returned matches the type input; they will always be
647 compatible types. */
648
649 tree
650 canonical_type_variant (t)
651 tree t;
652 {
653 return cp_build_qualified_type (TYPE_MAIN_VARIANT (t), CP_TYPE_QUALS (t));
654 }
655 \f
656 /* Makes new binfos for the indirect bases under BINFO, and updates
657 BINFO_OFFSET for them and their bases. */
658
659 void
660 unshare_base_binfos (binfo)
661 tree binfo;
662 {
663 tree binfos = BINFO_BASETYPES (binfo);
664 tree new_binfo;
665 int j;
666
667 if (binfos == NULL_TREE)
668 return;
669
670 /* Now unshare the structure beneath BINFO. */
671 for (j = TREE_VEC_LENGTH (binfos)-1;
672 j >= 0; j--)
673 {
674 tree base_binfo = TREE_VEC_ELT (binfos, j);
675 new_binfo = TREE_VEC_ELT (binfos, j)
676 = make_binfo (BINFO_OFFSET (base_binfo),
677 base_binfo,
678 BINFO_VTABLE (base_binfo),
679 BINFO_VIRTUALS (base_binfo));
680 TREE_VIA_PUBLIC (new_binfo) = TREE_VIA_PUBLIC (base_binfo);
681 TREE_VIA_PROTECTED (new_binfo) = TREE_VIA_PROTECTED (base_binfo);
682 TREE_VIA_VIRTUAL (new_binfo) = TREE_VIA_VIRTUAL (base_binfo);
683 BINFO_INHERITANCE_CHAIN (new_binfo) = binfo;
684 unshare_base_binfos (new_binfo);
685 }
686 }
687
688 \f
689 /* Hashing of lists so that we don't make duplicates.
690 The entry point is `list_hash_canon'. */
691
692 /* Each hash table slot is a bucket containing a chain
693 of these structures. */
694
695 struct list_hash
696 {
697 struct list_hash *next; /* Next structure in the bucket. */
698 int hashcode; /* Hash code of this list. */
699 tree list; /* The list recorded here. */
700 };
701
702 /* Now here is the hash table. When recording a list, it is added
703 to the slot whose index is the hash code mod the table size.
704 Note that the hash table is used for several kinds of lists.
705 While all these live in the same table, they are completely independent,
706 and the hash code is computed differently for each of these. */
707
708 #define TYPE_HASH_SIZE 59
709 static struct list_hash *list_hash_table[TYPE_HASH_SIZE];
710
711 /* Compute a hash code for a list (chain of TREE_LIST nodes
712 with goodies in the TREE_PURPOSE, TREE_VALUE, and bits of the
713 TREE_COMMON slots), by adding the hash codes of the individual entries. */
714
715 static int
716 list_hash (purpose, value, chain)
717 tree purpose, value, chain;
718 {
719 register int hashcode = 0;
720
721 if (chain)
722 hashcode += TYPE_HASH (chain);
723
724 if (value)
725 hashcode += TYPE_HASH (value);
726 else
727 hashcode += 1007;
728 if (purpose)
729 hashcode += TYPE_HASH (purpose);
730 else
731 hashcode += 1009;
732 return hashcode;
733 }
734
735 /* Look in the type hash table for a type isomorphic to TYPE.
736 If one is found, return it. Otherwise return 0. */
737
738 static tree
739 list_hash_lookup (hashcode, purpose, value, chain)
740 int hashcode;
741 tree purpose, value, chain;
742 {
743 register struct list_hash *h;
744
745 for (h = list_hash_table[hashcode % TYPE_HASH_SIZE]; h; h = h->next)
746 if (h->hashcode == hashcode
747 && TREE_PURPOSE (h->list) == purpose
748 && TREE_VALUE (h->list) == value
749 && TREE_CHAIN (h->list) == chain)
750 return h->list;
751 return 0;
752 }
753
754 /* Add an entry to the list-hash-table
755 for a list TYPE whose hash code is HASHCODE. */
756
757 static void
758 list_hash_add (hashcode, list)
759 int hashcode;
760 tree list;
761 {
762 register struct list_hash *h;
763
764 h = (struct list_hash *) obstack_alloc (&permanent_obstack, sizeof (struct list_hash));
765 h->hashcode = hashcode;
766 h->list = list;
767 h->next = list_hash_table[hashcode % TYPE_HASH_SIZE];
768 list_hash_table[hashcode % TYPE_HASH_SIZE] = h;
769 }
770
771 /* Given list components PURPOSE, VALUE, AND CHAIN, return the canonical
772 object for an identical list if one already exists. Otherwise, build a
773 new one, and record it as the canonical object. */
774
775 /* Set to 1 to debug without canonicalization. Never set by program. */
776
777 static int debug_no_list_hash = 0;
778
779 tree
780 hash_tree_cons (purpose, value, chain)
781 tree purpose, value, chain;
782 {
783 tree t;
784 int hashcode = 0;
785
786 if (! debug_no_list_hash)
787 {
788 hashcode = list_hash (purpose, value, chain);
789 t = list_hash_lookup (hashcode, purpose, value, chain);
790 if (t)
791 return t;
792 }
793
794 t = tree_cons (purpose, value, chain);
795
796 /* If this is a new list, record it for later reuse. */
797 if (! debug_no_list_hash)
798 list_hash_add (hashcode, t);
799
800 return t;
801 }
802
803 /* Constructor for hashed lists. */
804
805 tree
806 hash_tree_chain (value, chain)
807 tree value, chain;
808 {
809 return hash_tree_cons (NULL_TREE, value, chain);
810 }
811
812 /* Similar, but used for concatenating two lists. */
813
814 tree
815 hash_chainon (list1, list2)
816 tree list1, list2;
817 {
818 if (list2 == 0)
819 return list1;
820 if (list1 == 0)
821 return list2;
822 if (TREE_CHAIN (list1) == NULL_TREE)
823 return hash_tree_chain (TREE_VALUE (list1), list2);
824 return hash_tree_chain (TREE_VALUE (list1),
825 hash_chainon (TREE_CHAIN (list1), list2));
826 }
827 \f
828 /* Build an association between TYPE and some parameters:
829
830 OFFSET is the offset added to `this' to convert it to a pointer
831 of type `TYPE *'
832
833 BINFO is the base binfo to use, if we are deriving from one. This
834 is necessary, as we want specialized parent binfos from base
835 classes, so that the VTABLE_NAMEs of bases are for the most derived
836 type, instead of the simple type.
837
838 VTABLE is the virtual function table with which to initialize
839 sub-objects of type TYPE.
840
841 VIRTUALS are the virtual functions sitting in VTABLE. */
842
843 tree
844 make_binfo (offset, binfo, vtable, virtuals)
845 tree offset, binfo;
846 tree vtable, virtuals;
847 {
848 tree new_binfo = make_tree_vec (7);
849 tree type;
850
851 if (TREE_CODE (binfo) == TREE_VEC)
852 type = BINFO_TYPE (binfo);
853 else
854 {
855 type = binfo;
856 binfo = CLASS_TYPE_P (type) ? TYPE_BINFO (binfo) : NULL_TREE;
857 }
858
859 TREE_TYPE (new_binfo) = TYPE_MAIN_VARIANT (type);
860 BINFO_OFFSET (new_binfo) = offset;
861 BINFO_VTABLE (new_binfo) = vtable;
862 BINFO_VIRTUALS (new_binfo) = virtuals;
863
864 if (binfo && BINFO_BASETYPES (binfo) != NULL_TREE)
865 BINFO_BASETYPES (new_binfo) = copy_node (BINFO_BASETYPES (binfo));
866 return new_binfo;
867 }
868
869 /* Return the binfo value for ELEM in TYPE. */
870
871 tree
872 binfo_value (elem, type)
873 tree elem;
874 tree type;
875 {
876 if (get_base_distance (elem, type, 0, (tree *)0) == -2)
877 compiler_error ("base class `%s' ambiguous in binfo_value",
878 TYPE_NAME_STRING (elem));
879 if (elem == type)
880 return TYPE_BINFO (type);
881 if (TREE_CODE (elem) == RECORD_TYPE && TYPE_BINFO (elem) == type)
882 return type;
883 return get_binfo (elem, type, 0);
884 }
885
886 /* Return a reversed copy of the BINFO-chain given by PATH. (If the
887 BINFO_INHERITANCE_CHAIN points from base classes to derived
888 classes, it will instead point from derived classes to base
889 classes.) Returns the first node in the reversed chain. */
890
891 tree
892 reverse_path (path)
893 tree path;
894 {
895 register tree prev = NULL_TREE, cur;
896 for (cur = path; cur; cur = BINFO_INHERITANCE_CHAIN (cur))
897 {
898 tree r = copy_node (cur);
899 BINFO_INHERITANCE_CHAIN (r) = prev;
900 prev = r;
901 }
902 return prev;
903 }
904
905 void
906 debug_binfo (elem)
907 tree elem;
908 {
909 unsigned HOST_WIDE_INT n;
910 tree virtuals;
911
912 fprintf (stderr, "type \"%s\"; offset = %ld\n",
913 TYPE_NAME_STRING (BINFO_TYPE (elem)),
914 (long) TREE_INT_CST_LOW (BINFO_OFFSET (elem)));
915 fprintf (stderr, "vtable type:\n");
916 debug_tree (BINFO_TYPE (elem));
917 if (BINFO_VTABLE (elem))
918 fprintf (stderr, "vtable decl \"%s\"\n", IDENTIFIER_POINTER (DECL_NAME (BINFO_VTABLE (elem))));
919 else
920 fprintf (stderr, "no vtable decl yet\n");
921 fprintf (stderr, "virtuals:\n");
922 virtuals = skip_rtti_stuff (elem, BINFO_TYPE (elem), &n);
923
924 while (virtuals)
925 {
926 tree fndecl = TREE_VALUE (virtuals);
927 fprintf (stderr, "%s [%ld =? %ld]\n",
928 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl)),
929 (long) n, (long) TREE_INT_CST_LOW (DECL_VINDEX (fndecl)));
930 ++n;
931 virtuals = TREE_CHAIN (virtuals);
932 }
933 }
934
935 int
936 count_functions (t)
937 tree t;
938 {
939 int i;
940 if (TREE_CODE (t) == FUNCTION_DECL)
941 return 1;
942 else if (TREE_CODE (t) == OVERLOAD)
943 {
944 for (i=0; t; t = OVL_CHAIN (t))
945 i++;
946 return i;
947 }
948
949 my_friendly_abort (359);
950 return 0;
951 }
952
953 int
954 is_overloaded_fn (x)
955 tree x;
956 {
957 /* A baselink is also considered an overloaded function. */
958 if (TREE_CODE (x) == OFFSET_REF)
959 x = TREE_OPERAND (x, 1);
960 if (BASELINK_P (x))
961 x = TREE_VALUE (x);
962 return (TREE_CODE (x) == FUNCTION_DECL
963 || TREE_CODE (x) == TEMPLATE_ID_EXPR
964 || DECL_FUNCTION_TEMPLATE_P (x)
965 || TREE_CODE (x) == OVERLOAD);
966 }
967
968 int
969 really_overloaded_fn (x)
970 tree x;
971 {
972 /* A baselink is also considered an overloaded function. */
973 if (TREE_CODE (x) == OFFSET_REF)
974 x = TREE_OPERAND (x, 1);
975 if (BASELINK_P (x))
976 x = TREE_VALUE (x);
977 return (TREE_CODE (x) == OVERLOAD
978 && (TREE_CHAIN (x) != NULL_TREE
979 || DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (x))));
980 }
981
982 tree
983 get_first_fn (from)
984 tree from;
985 {
986 my_friendly_assert (is_overloaded_fn (from), 9);
987 /* A baselink is also considered an overloaded function. */
988 if (BASELINK_P (from))
989 from = TREE_VALUE (from);
990 return OVL_CURRENT (from);
991 }
992
993 /* Returns nonzero if T is a ->* or .* expression that refers to a
994 member function. */
995
996 int
997 bound_pmf_p (t)
998 tree t;
999 {
1000 return (TREE_CODE (t) == OFFSET_REF
1001 && TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (t, 1))));
1002 }
1003
1004 /* Return a new OVL node, concatenating it with the old one. */
1005
1006 tree
1007 ovl_cons (decl, chain)
1008 tree decl;
1009 tree chain;
1010 {
1011 tree result = make_node (OVERLOAD);
1012 TREE_TYPE (result) = unknown_type_node;
1013 OVL_FUNCTION (result) = decl;
1014 TREE_CHAIN (result) = chain;
1015
1016 return result;
1017 }
1018
1019 /* Build a new overloaded function. If this is the first one,
1020 just return it; otherwise, ovl_cons the _DECLs */
1021
1022 tree
1023 build_overload (decl, chain)
1024 tree decl;
1025 tree chain;
1026 {
1027 if (! chain && TREE_CODE (decl) != TEMPLATE_DECL)
1028 return decl;
1029 if (chain && TREE_CODE (chain) != OVERLOAD)
1030 chain = ovl_cons (chain, NULL_TREE);
1031 return ovl_cons (decl, chain);
1032 }
1033
1034 /* True if fn is in ovl. */
1035
1036 int
1037 ovl_member (fn, ovl)
1038 tree fn;
1039 tree ovl;
1040 {
1041 if (ovl == NULL_TREE)
1042 return 0;
1043 if (TREE_CODE (ovl) != OVERLOAD)
1044 return ovl == fn;
1045 for (; ovl; ovl = OVL_CHAIN (ovl))
1046 if (OVL_FUNCTION (ovl) == fn)
1047 return 1;
1048 return 0;
1049 }
1050
1051 int
1052 is_aggr_type_2 (t1, t2)
1053 tree t1, t2;
1054 {
1055 if (TREE_CODE (t1) != TREE_CODE (t2))
1056 return 0;
1057 return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
1058 }
1059
1060 /* Returns non-zero if CODE is the code for a statement. */
1061
1062 static int
1063 statement_code_p (code)
1064 enum tree_code code;
1065 {
1066 switch (code)
1067 {
1068 case EXPR_STMT:
1069 case COMPOUND_STMT:
1070 case DECL_STMT:
1071 case IF_STMT:
1072 case FOR_STMT:
1073 case WHILE_STMT:
1074 case DO_STMT:
1075 case RETURN_STMT:
1076 case BREAK_STMT:
1077 case CONTINUE_STMT:
1078 case SWITCH_STMT:
1079 case GOTO_STMT:
1080 case LABEL_STMT:
1081 case ASM_STMT:
1082 case SUBOBJECT:
1083 case CLEANUP_STMT:
1084 case START_CATCH_STMT:
1085 case CTOR_STMT:
1086 case SCOPE_STMT:
1087 case CTOR_INITIALIZER:
1088 case CASE_LABEL:
1089 case RETURN_INIT:
1090 case TRY_BLOCK:
1091 case HANDLER:
1092 return 1;
1093
1094 default:
1095 return 0;
1096 }
1097 }
1098 \f
1099 #define PRINT_RING_SIZE 4
1100
1101 const char *
1102 lang_printable_name (decl, v)
1103 tree decl;
1104 int v;
1105 {
1106 static tree decl_ring[PRINT_RING_SIZE];
1107 static char *print_ring[PRINT_RING_SIZE];
1108 static int ring_counter;
1109 int i;
1110
1111 /* Only cache functions. */
1112 if (v < 2
1113 || TREE_CODE (decl) != FUNCTION_DECL
1114 || DECL_LANG_SPECIFIC (decl) == 0)
1115 return lang_decl_name (decl, v);
1116
1117 /* See if this print name is lying around. */
1118 for (i = 0; i < PRINT_RING_SIZE; i++)
1119 if (decl_ring[i] == decl)
1120 /* yes, so return it. */
1121 return print_ring[i];
1122
1123 if (++ring_counter == PRINT_RING_SIZE)
1124 ring_counter = 0;
1125
1126 if (current_function_decl != NULL_TREE)
1127 {
1128 if (decl_ring[ring_counter] == current_function_decl)
1129 ring_counter += 1;
1130 if (ring_counter == PRINT_RING_SIZE)
1131 ring_counter = 0;
1132 if (decl_ring[ring_counter] == current_function_decl)
1133 my_friendly_abort (106);
1134 }
1135
1136 if (print_ring[ring_counter])
1137 free (print_ring[ring_counter]);
1138
1139 print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v));
1140 decl_ring[ring_counter] = decl;
1141 return print_ring[ring_counter];
1142 }
1143 \f
1144 /* Build the FUNCTION_TYPE or METHOD_TYPE which may throw exceptions
1145 listed in RAISES. */
1146
1147 tree
1148 build_exception_variant (type, raises)
1149 tree type;
1150 tree raises;
1151 {
1152 tree v = TYPE_MAIN_VARIANT (type);
1153 int type_quals = TYPE_QUALS (type);
1154
1155 for (; v; v = TYPE_NEXT_VARIANT (v))
1156 if (TYPE_QUALS (v) == type_quals
1157 && comp_except_specs (raises, TYPE_RAISES_EXCEPTIONS (v), 1))
1158 return v;
1159
1160 /* Need to build a new variant. */
1161 v = build_type_copy (type);
1162 TYPE_RAISES_EXCEPTIONS (v) = raises;
1163 return v;
1164 }
1165
1166 /* Given a TEMPLATE_TEMPLATE_PARM node T, create a new one together with its
1167 lang_specific field and its corresponding TEMPLATE_DECL node */
1168
1169 tree
1170 copy_template_template_parm (t)
1171 tree t;
1172 {
1173 tree template = TYPE_NAME (t);
1174 tree t2;
1175
1176 t2 = make_aggr_type (TEMPLATE_TEMPLATE_PARM);
1177 template = copy_node (template);
1178 copy_lang_decl (template);
1179
1180 TREE_TYPE (template) = t2;
1181 TYPE_NAME (t2) = template;
1182 TYPE_STUB_DECL (t2) = template;
1183
1184 /* No need to copy these */
1185 TYPE_FIELDS (t2) = TYPE_FIELDS (t);
1186 TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t2)
1187 = TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (t);
1188 return t2;
1189 }
1190
1191 /* Apply FUNC to all the sub-trees of TP in a pre-order traversal.
1192 FUNC is called with the DATA and the address of each sub-tree. If
1193 FUNC returns a non-NULL value, the traversal is aborted, and the
1194 value returned by FUNC is returned. */
1195
1196 tree
1197 walk_tree (tp, func, data)
1198 tree *tp;
1199 walk_tree_fn func;
1200 void *data;
1201 {
1202 enum tree_code code;
1203 int walk_subtrees;
1204 tree result;
1205
1206 #define WALK_SUBTREE(NODE) \
1207 do \
1208 { \
1209 result = walk_tree (&(NODE), func, data); \
1210 if (result) \
1211 return result; \
1212 } \
1213 while (0)
1214
1215 /* Skip empty subtrees. */
1216 if (!*tp)
1217 return NULL_TREE;
1218
1219 /* Call the function. */
1220 walk_subtrees = 1;
1221 result = (*func) (tp, &walk_subtrees, data);
1222
1223 /* If we found something, return it. */
1224 if (result)
1225 return result;
1226
1227 /* Even if we didn't, FUNC may have decided that there was nothing
1228 interesting below this point in the tree. */
1229 if (!walk_subtrees)
1230 return NULL_TREE;
1231
1232 code = TREE_CODE (*tp);
1233
1234 /* Handle common cases up front. */
1235 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1236 || TREE_CODE_CLASS (code) == 'r'
1237 || TREE_CODE_CLASS (code) == 's')
1238 {
1239 int i, len;
1240
1241 /* Walk over all the sub-trees of this operand. */
1242 len = first_rtl_op (code);
1243 /* TARGET_EXPRs are peculiar: operands 1 and 3 can be the same.
1244 But, we only want to walk once. */
1245 if (code == TARGET_EXPR
1246 && TREE_OPERAND (*tp, 3) == TREE_OPERAND (*tp, 1))
1247 --len;
1248 /* Go through the subtrees. We need to do this in forward order so
1249 that the scope of a FOR_EXPR is handled properly. */
1250 for (i = 0; i < len; ++i)
1251 WALK_SUBTREE (TREE_OPERAND (*tp, i));
1252
1253 /* For statements, we also walk the chain so that we cover the
1254 entire statement tree. */
1255 if (statement_code_p (code))
1256 {
1257 if (code == DECL_STMT
1258 && DECL_STMT_DECL (*tp)
1259 && TREE_CODE_CLASS (TREE_CODE (DECL_STMT_DECL (*tp))) == 'd')
1260 {
1261 /* Walk the DECL_INITIAL and DECL_SIZE. We don't want to walk
1262 into declarations that are just mentioned, rather than
1263 declared; they don't really belong to this part of the tree.
1264 And, we can see cycles: the initializer for a declaration can
1265 refer to the declaration itself. */
1266 WALK_SUBTREE (DECL_INITIAL (DECL_STMT_DECL (*tp)));
1267 WALK_SUBTREE (DECL_SIZE (DECL_STMT_DECL (*tp)));
1268 }
1269
1270 WALK_SUBTREE (TREE_CHAIN (*tp));
1271 }
1272
1273 /* We didn't find what we were looking for. */
1274 return NULL_TREE;
1275 }
1276 else if (TREE_CODE_CLASS (code) == 'd')
1277 {
1278 WALK_SUBTREE (TREE_TYPE (*tp));
1279
1280 /* We didn't find what we were looking for. */
1281 return NULL_TREE;
1282 }
1283
1284 /* Not one of the easy cases. We must explicitly go through the
1285 children. */
1286 switch (code)
1287 {
1288 case ERROR_MARK:
1289 case IDENTIFIER_NODE:
1290 case INTEGER_CST:
1291 case REAL_CST:
1292 case STRING_CST:
1293 case DEFAULT_ARG:
1294 case TEMPLATE_TEMPLATE_PARM:
1295 case TEMPLATE_PARM_INDEX:
1296 case TEMPLATE_TYPE_PARM:
1297 case REAL_TYPE:
1298 case COMPLEX_TYPE:
1299 case VOID_TYPE:
1300 case BOOLEAN_TYPE:
1301 case TYPENAME_TYPE:
1302 case UNION_TYPE:
1303 case ENUMERAL_TYPE:
1304 case TYPEOF_TYPE:
1305 case BLOCK:
1306 /* None of thse have subtrees other than those already walked
1307 above. */
1308 break;
1309
1310 case PTRMEM_CST:
1311 WALK_SUBTREE (TREE_TYPE (*tp));
1312 break;
1313
1314 case POINTER_TYPE:
1315 case REFERENCE_TYPE:
1316 WALK_SUBTREE (TREE_TYPE (*tp));
1317 break;
1318
1319 case TREE_LIST:
1320 WALK_SUBTREE (TREE_PURPOSE (*tp));
1321 WALK_SUBTREE (TREE_VALUE (*tp));
1322 WALK_SUBTREE (TREE_CHAIN (*tp));
1323 break;
1324
1325 case OVERLOAD:
1326 WALK_SUBTREE (OVL_FUNCTION (*tp));
1327 WALK_SUBTREE (OVL_CHAIN (*tp));
1328 break;
1329
1330 case TREE_VEC:
1331 {
1332 int len = TREE_VEC_LENGTH (*tp);
1333 while (len--)
1334 WALK_SUBTREE (TREE_VEC_ELT (*tp, len));
1335 }
1336 break;
1337
1338 case COMPLEX_CST:
1339 WALK_SUBTREE (TREE_REALPART (*tp));
1340 WALK_SUBTREE (TREE_IMAGPART (*tp));
1341 break;
1342
1343 case CONSTRUCTOR:
1344 WALK_SUBTREE (CONSTRUCTOR_ELTS (*tp));
1345 break;
1346
1347 case METHOD_TYPE:
1348 WALK_SUBTREE (TYPE_METHOD_BASETYPE (*tp));
1349 /* Fall through. */
1350
1351 case FUNCTION_TYPE:
1352 WALK_SUBTREE (TREE_TYPE (*tp));
1353 WALK_SUBTREE (TYPE_ARG_TYPES (*tp));
1354 break;
1355
1356 case ARRAY_TYPE:
1357 WALK_SUBTREE (TREE_TYPE (*tp));
1358 WALK_SUBTREE (TYPE_DOMAIN (*tp));
1359 break;
1360
1361 case INTEGER_TYPE:
1362 WALK_SUBTREE (TYPE_MIN_VALUE (*tp));
1363 WALK_SUBTREE (TYPE_MAX_VALUE (*tp));
1364 break;
1365
1366 case OFFSET_TYPE:
1367 WALK_SUBTREE (TREE_TYPE (*tp));
1368 WALK_SUBTREE (TYPE_OFFSET_BASETYPE (*tp));
1369 break;
1370
1371 case RECORD_TYPE:
1372 if (TYPE_PTRMEMFUNC_P (*tp))
1373 WALK_SUBTREE (TYPE_PTRMEMFUNC_FN_TYPE (*tp));
1374 break;
1375
1376 default:
1377 my_friendly_abort (19990803);
1378 }
1379
1380 /* We didn't find what we were looking for. */
1381 return NULL_TREE;
1382
1383 #undef WALK_SUBTREE
1384 }
1385
1386 /* Passed to walk_tree. Checks for the use of types with no linkage. */
1387
1388 static tree
1389 no_linkage_helper (tp, walk_subtrees, data)
1390 tree *tp;
1391 int *walk_subtrees ATTRIBUTE_UNUSED;
1392 void *data ATTRIBUTE_UNUSED;
1393 {
1394 tree t = *tp;
1395
1396 if (TYPE_P (t)
1397 && (IS_AGGR_TYPE (t) || TREE_CODE (t) == ENUMERAL_TYPE)
1398 && (decl_function_context (TYPE_MAIN_DECL (t))
1399 || ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))))
1400 return t;
1401 return NULL_TREE;
1402 }
1403
1404 /* Check if the type T depends on a type with no linkage and if so, return
1405 it. */
1406
1407 tree
1408 no_linkage_check (t)
1409 tree t;
1410 {
1411 /* There's no point in checking linkage on template functions; we
1412 can't know their complete types. */
1413 if (processing_template_decl)
1414 return NULL_TREE;
1415
1416 t = walk_tree (&t, no_linkage_helper, NULL);
1417 if (t != error_mark_node)
1418 return t;
1419 return NULL_TREE;
1420 }
1421
1422 /* Passed to walk_tree. Copies the node pointed to, if appropriate. */
1423
1424 tree
1425 copy_tree_r (tp, walk_subtrees, data)
1426 tree *tp;
1427 int *walk_subtrees;
1428 void *data ATTRIBUTE_UNUSED;
1429 {
1430 enum tree_code code = TREE_CODE (*tp);
1431
1432 /* We make copies of most nodes. */
1433 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1434 || TREE_CODE_CLASS (code) == 'r'
1435 || TREE_CODE_CLASS (code) == 'c'
1436 || TREE_CODE_CLASS (code) == 's'
1437 || code == PARM_DECL
1438 || code == TREE_LIST
1439 || code == TREE_VEC
1440 || code == OVERLOAD)
1441 {
1442 /* Because the chain gets clobbered when we make a copy, we save it
1443 here. */
1444 tree chain = TREE_CHAIN (*tp);
1445
1446 /* Copy the node. */
1447 *tp = copy_node (*tp);
1448
1449 /* Now, restore the chain, if appropriate. That will cause
1450 walk_tree to walk into the chain as well. */
1451 if (code == PARM_DECL || code == TREE_LIST || code == OVERLOAD
1452 || statement_code_p (code))
1453 TREE_CHAIN (*tp) = chain;
1454
1455 /* For now, we don't update BLOCKs when we make copies. So, we
1456 have to nullify all scope-statements. */
1457 if (TREE_CODE (*tp) == SCOPE_STMT)
1458 SCOPE_STMT_BLOCK (*tp) = NULL_TREE;
1459 }
1460 else if (code == TEMPLATE_TEMPLATE_PARM)
1461 /* These must be copied specially. */
1462 *tp = copy_template_template_parm (*tp);
1463 else if (TREE_CODE_CLASS (code) == 't')
1464 /* There's no need to copy types, or anything beneath them. */
1465 *walk_subtrees = 0;
1466
1467 return NULL_TREE;
1468 }
1469
1470 #ifdef GATHER_STATISTICS
1471 extern int depth_reached;
1472 #endif
1473
1474 void
1475 print_lang_statistics ()
1476 {
1477 print_search_statistics ();
1478 print_class_statistics ();
1479 #ifdef GATHER_STATISTICS
1480 fprintf (stderr, "maximum template instantiation depth reached: %d\n",
1481 depth_reached);
1482 #endif
1483 }
1484
1485 /* This is used by the `assert' macro. It is provided in libgcc.a,
1486 which `cc' doesn't know how to link. Note that the C++ front-end
1487 no longer actually uses the `assert' macro (instead, it calls
1488 my_friendly_assert). But all of the back-end files still need this. */
1489
1490 void
1491 __eprintf (string, expression, line, filename)
1492 const char *string;
1493 const char *expression;
1494 unsigned line;
1495 const char *filename;
1496 {
1497 fprintf (stderr, string, expression, line, filename);
1498 fflush (stderr);
1499 abort ();
1500 }
1501
1502 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1503 (which is an ARRAY_TYPE). This counts only elements of the top
1504 array. */
1505
1506 tree
1507 array_type_nelts_top (type)
1508 tree type;
1509 {
1510 return fold (build (PLUS_EXPR, sizetype,
1511 array_type_nelts (type),
1512 integer_one_node));
1513 }
1514
1515 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1516 (which is an ARRAY_TYPE). This one is a recursive count of all
1517 ARRAY_TYPEs that are clumped together. */
1518
1519 tree
1520 array_type_nelts_total (type)
1521 tree type;
1522 {
1523 tree sz = array_type_nelts_top (type);
1524 type = TREE_TYPE (type);
1525 while (TREE_CODE (type) == ARRAY_TYPE)
1526 {
1527 tree n = array_type_nelts_top (type);
1528 sz = fold (build (MULT_EXPR, sizetype, sz, n));
1529 type = TREE_TYPE (type);
1530 }
1531 return sz;
1532 }
1533
1534 /* Called from break_out_target_exprs via mapcar. */
1535
1536 static tree
1537 bot_manip (tp, walk_subtrees, data)
1538 tree *tp;
1539 int *walk_subtrees;
1540 void *data;
1541 {
1542 splay_tree target_remap = ((splay_tree) data);
1543 tree t = *tp;
1544
1545 if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
1546 {
1547 /* There can't be any TARGET_EXPRs below this point. */
1548 *walk_subtrees = 0;
1549 return NULL_TREE;
1550 }
1551 else if (TREE_CODE (t) == TARGET_EXPR)
1552 {
1553 tree u;
1554
1555 if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR)
1556 {
1557 mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0));
1558 u = build_cplus_new
1559 (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1)));
1560 }
1561 else
1562 {
1563 u = copy_node (t);
1564 TREE_OPERAND (u, 0) = build (VAR_DECL, TREE_TYPE (t));
1565 layout_decl (TREE_OPERAND (u, 0), 0);
1566 }
1567
1568 /* Map the old variable to the new one. */
1569 splay_tree_insert (target_remap,
1570 (splay_tree_key) TREE_OPERAND (t, 0),
1571 (splay_tree_value) TREE_OPERAND (u, 0));
1572
1573 /* Replace the old expression with the new version. */
1574 *tp = u;
1575 /* We don't have to go below this point; the recursive call to
1576 break_out_target_exprs will have handled anything below this
1577 point. */
1578 *walk_subtrees = 0;
1579 return NULL_TREE;
1580 }
1581 else if (TREE_CODE (t) == CALL_EXPR)
1582 mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
1583
1584 /* Make a copy of this node. */
1585 return copy_tree_r (tp, walk_subtrees, NULL);
1586 }
1587
1588 /* Replace all remapped VAR_DECLs in T with their new equivalents.
1589 DATA is really a splay-tree mapping old variables to new
1590 variables. */
1591
1592 static tree
1593 bot_replace (t, walk_subtrees, data)
1594 tree *t;
1595 int *walk_subtrees ATTRIBUTE_UNUSED;
1596 void *data;
1597 {
1598 splay_tree target_remap = ((splay_tree) data);
1599
1600 if (TREE_CODE (*t) == VAR_DECL)
1601 {
1602 splay_tree_node n = splay_tree_lookup (target_remap,
1603 (splay_tree_key) *t);
1604 if (n)
1605 *t = (tree) n->value;
1606 }
1607
1608 return NULL_TREE;
1609 }
1610
1611 /* When we parse a default argument expression, we may create
1612 temporary variables via TARGET_EXPRs. When we actually use the
1613 default-argument expression, we make a copy of the expression, but
1614 we must replace the temporaries with appropriate local versions. */
1615
1616 tree
1617 break_out_target_exprs (t)
1618 tree t;
1619 {
1620 static int target_remap_count;
1621 static splay_tree target_remap;
1622
1623 if (!target_remap_count++)
1624 target_remap = splay_tree_new (splay_tree_compare_pointers,
1625 /*splay_tree_delete_key_fn=*/NULL,
1626 /*splay_tree_delete_value_fn=*/NULL);
1627 walk_tree (&t, bot_manip, target_remap);
1628 walk_tree (&t, bot_replace, target_remap);
1629
1630 if (!--target_remap_count)
1631 {
1632 splay_tree_delete (target_remap);
1633 target_remap = NULL;
1634 }
1635
1636 return t;
1637 }
1638
1639 /* Obstack used for allocating nodes in template function and variable
1640 definitions. */
1641
1642 /* Similar to `build_nt', except that we set TREE_COMPLEXITY to be the
1643 current line number. */
1644
1645 tree
1646 build_min_nt VPROTO((enum tree_code code, ...))
1647 {
1648 #ifndef ANSI_PROTOTYPES
1649 enum tree_code code;
1650 #endif
1651 va_list p;
1652 register tree t;
1653 register int length;
1654 register int i;
1655
1656 VA_START (p, code);
1657
1658 #ifndef ANSI_PROTOTYPES
1659 code = va_arg (p, enum tree_code);
1660 #endif
1661
1662 t = make_node (code);
1663 length = tree_code_length[(int) code];
1664 TREE_COMPLEXITY (t) = lineno;
1665
1666 for (i = 0; i < length; i++)
1667 {
1668 tree x = va_arg (p, tree);
1669 TREE_OPERAND (t, i) = x;
1670 }
1671
1672 va_end (p);
1673 return t;
1674 }
1675
1676 /* Similar to `build', except we set TREE_COMPLEXITY to the current
1677 line-number. */
1678
1679 tree
1680 build_min VPROTO((enum tree_code code, tree tt, ...))
1681 {
1682 #ifndef ANSI_PROTOTYPES
1683 enum tree_code code;
1684 tree tt;
1685 #endif
1686 va_list p;
1687 register tree t;
1688 register int length;
1689 register int i;
1690
1691 VA_START (p, tt);
1692
1693 #ifndef ANSI_PROTOTYPES
1694 code = va_arg (p, enum tree_code);
1695 tt = va_arg (p, tree);
1696 #endif
1697
1698 t = make_node (code);
1699 length = tree_code_length[(int) code];
1700 TREE_TYPE (t) = tt;
1701 TREE_COMPLEXITY (t) = lineno;
1702
1703 for (i = 0; i < length; i++)
1704 {
1705 tree x = va_arg (p, tree);
1706 TREE_OPERAND (t, i) = x;
1707 }
1708
1709 va_end (p);
1710 return t;
1711 }
1712
1713 tree
1714 get_type_decl (t)
1715 tree t;
1716 {
1717 if (TREE_CODE (t) == TYPE_DECL)
1718 return t;
1719 if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
1720 return TYPE_STUB_DECL (t);
1721
1722 my_friendly_abort (42);
1723
1724 /* Stop compiler from complaining control reaches end of non-void function. */
1725 return 0;
1726 }
1727
1728 int
1729 can_free (obstack, t)
1730 struct obstack *obstack;
1731 tree t;
1732 {
1733 int size = 0;
1734
1735 if (TREE_CODE (t) == TREE_VEC)
1736 size = (TREE_VEC_LENGTH (t)-1) * sizeof (tree) + sizeof (struct tree_vec);
1737 else
1738 my_friendly_abort (42);
1739
1740 #define ROUND(x) ((x + obstack_alignment_mask (obstack)) \
1741 & ~ obstack_alignment_mask (obstack))
1742 if ((char *)t + ROUND (size) == obstack_next_free (obstack))
1743 return 1;
1744 #undef ROUND
1745
1746 return 0;
1747 }
1748
1749 /* Return first vector element whose BINFO_TYPE is ELEM.
1750 Return 0 if ELEM is not in VEC. VEC may be NULL_TREE. */
1751
1752 tree
1753 vec_binfo_member (elem, vec)
1754 tree elem, vec;
1755 {
1756 int i;
1757
1758 if (vec)
1759 for (i = 0; i < TREE_VEC_LENGTH (vec); ++i)
1760 if (same_type_p (elem, BINFO_TYPE (TREE_VEC_ELT (vec, i))))
1761 return TREE_VEC_ELT (vec, i);
1762
1763 return NULL_TREE;
1764 }
1765
1766 /* Kludge around the fact that DECL_CONTEXT for virtual functions returns
1767 the wrong thing for decl_function_context. Hopefully the uses in the
1768 backend won't matter, since we don't need a static chain for local class
1769 methods. FIXME! */
1770
1771 tree
1772 hack_decl_function_context (decl)
1773 tree decl;
1774 {
1775 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
1776 return decl_function_context (TYPE_MAIN_DECL (DECL_CLASS_CONTEXT (decl)));
1777 return decl_function_context (decl);
1778 }
1779
1780 /* Returns the namespace that contains DECL, whether directly or
1781 indirectly. */
1782
1783 tree
1784 decl_namespace_context (decl)
1785 tree decl;
1786 {
1787 while (1)
1788 {
1789 if (TREE_CODE (decl) == NAMESPACE_DECL)
1790 return decl;
1791 else if (TYPE_P (decl))
1792 decl = CP_DECL_CONTEXT (TYPE_MAIN_DECL (decl));
1793 else
1794 decl = CP_DECL_CONTEXT (decl);
1795 }
1796 }
1797
1798 /* Return truthvalue of whether T1 is the same tree structure as T2.
1799 Return 1 if they are the same.
1800 Return 0 if they are understandably different.
1801 Return -1 if either contains tree structure not understood by
1802 this function. */
1803
1804 int
1805 cp_tree_equal (t1, t2)
1806 tree t1, t2;
1807 {
1808 register enum tree_code code1, code2;
1809 int cmp;
1810
1811 if (t1 == t2)
1812 return 1;
1813 if (t1 == 0 || t2 == 0)
1814 return 0;
1815
1816 code1 = TREE_CODE (t1);
1817 code2 = TREE_CODE (t2);
1818
1819 if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR)
1820 {
1821 if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR)
1822 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1823 else
1824 return cp_tree_equal (TREE_OPERAND (t1, 0), t2);
1825 }
1826 else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR
1827 || code2 == NON_LVALUE_EXPR)
1828 return cp_tree_equal (t1, TREE_OPERAND (t2, 0));
1829
1830 if (code1 != code2)
1831 return 0;
1832
1833 switch (code1)
1834 {
1835 case INTEGER_CST:
1836 return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
1837 && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2);
1838
1839 case REAL_CST:
1840 return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
1841
1842 case STRING_CST:
1843 return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
1844 && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1845 TREE_STRING_LENGTH (t1));
1846
1847 case CONSTRUCTOR:
1848 /* We need to do this when determining whether or not two
1849 non-type pointer to member function template arguments
1850 are the same. */
1851 if (!(same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))
1852 /* The first operand is RTL. */
1853 && TREE_OPERAND (t1, 0) == TREE_OPERAND (t2, 0)))
1854 return 0;
1855 return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
1856
1857 case TREE_LIST:
1858 cmp = cp_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2));
1859 if (cmp <= 0)
1860 return cmp;
1861 cmp = cp_tree_equal (TREE_VALUE (t1), TREE_VALUE (t2));
1862 if (cmp <= 0)
1863 return cmp;
1864 return cp_tree_equal (TREE_CHAIN (t1), TREE_CHAIN (t2));
1865
1866 case SAVE_EXPR:
1867 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1868
1869 case CALL_EXPR:
1870 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1871 if (cmp <= 0)
1872 return cmp;
1873 return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
1874
1875 case TARGET_EXPR:
1876 /* Special case: if either target is an unallocated VAR_DECL,
1877 it means that it's going to be unified with whatever the
1878 TARGET_EXPR is really supposed to initialize, so treat it
1879 as being equivalent to anything. */
1880 if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
1881 && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
1882 && DECL_RTL (TREE_OPERAND (t1, 0)) == 0)
1883 || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
1884 && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
1885 && DECL_RTL (TREE_OPERAND (t2, 0)) == 0))
1886 cmp = 1;
1887 else
1888 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1889 if (cmp <= 0)
1890 return cmp;
1891 return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
1892
1893 case WITH_CLEANUP_EXPR:
1894 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1895 if (cmp <= 0)
1896 return cmp;
1897 return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
1898
1899 case COMPONENT_REF:
1900 if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
1901 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1902 return 0;
1903
1904 case VAR_DECL:
1905 case PARM_DECL:
1906 case CONST_DECL:
1907 case FUNCTION_DECL:
1908 return 0;
1909
1910 case TEMPLATE_PARM_INDEX:
1911 return TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2)
1912 && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2);
1913
1914 case SIZEOF_EXPR:
1915 case ALIGNOF_EXPR:
1916 if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
1917 return 0;
1918 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
1919 return same_type_p (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1920 break;
1921
1922 case PTRMEM_CST:
1923 /* Two pointer-to-members are the same if they point to the same
1924 field or function in the same class. */
1925 return (PTRMEM_CST_MEMBER (t1) == PTRMEM_CST_MEMBER (t2)
1926 && same_type_p (PTRMEM_CST_CLASS (t1), PTRMEM_CST_CLASS (t2)));
1927
1928 default:
1929 break;
1930 }
1931
1932 switch (TREE_CODE_CLASS (code1))
1933 {
1934 int i;
1935 case '1':
1936 case '2':
1937 case '<':
1938 case 'e':
1939 case 'r':
1940 case 's':
1941 cmp = 1;
1942 for (i=0; i<tree_code_length[(int) code1]; ++i)
1943 {
1944 cmp = cp_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
1945 if (cmp <= 0)
1946 return cmp;
1947 }
1948 return cmp;
1949 }
1950
1951 return -1;
1952 }
1953
1954 /* Build a wrapper around some pointer PTR so we can use it as a tree. */
1955
1956 tree
1957 build_ptr_wrapper (ptr)
1958 void *ptr;
1959 {
1960 tree t = make_node (WRAPPER);
1961 WRAPPER_PTR (t) = ptr;
1962 return t;
1963 }
1964
1965 /* Same, but on the expression_obstack. */
1966
1967 tree
1968 build_expr_ptr_wrapper (ptr)
1969 void *ptr;
1970 {
1971 return build_ptr_wrapper (ptr);
1972 }
1973
1974 /* Build a wrapper around some integer I so we can use it as a tree. */
1975
1976 tree
1977 build_int_wrapper (i)
1978 int i;
1979 {
1980 tree t = make_node (WRAPPER);
1981 WRAPPER_INT (t) = i;
1982 return t;
1983 }
1984
1985 static tree
1986 build_srcloc (file, line)
1987 char *file;
1988 int line;
1989 {
1990 tree t;
1991
1992 t = make_node (SRCLOC);
1993 SRCLOC_FILE (t) = file;
1994 SRCLOC_LINE (t) = line;
1995
1996 return t;
1997 }
1998
1999 tree
2000 build_srcloc_here ()
2001 {
2002 return build_srcloc (input_filename, lineno);
2003 }
2004
2005 /* The type of ARG when used as an lvalue. */
2006
2007 tree
2008 lvalue_type (arg)
2009 tree arg;
2010 {
2011 tree type = TREE_TYPE (arg);
2012 if (TREE_CODE (arg) == OVERLOAD)
2013 type = unknown_type_node;
2014 return type;
2015 }
2016
2017 /* The type of ARG for printing error messages; denote lvalues with
2018 reference types. */
2019
2020 tree
2021 error_type (arg)
2022 tree arg;
2023 {
2024 tree type = TREE_TYPE (arg);
2025 if (TREE_CODE (type) == ARRAY_TYPE)
2026 ;
2027 else if (real_lvalue_p (arg))
2028 type = build_reference_type (lvalue_type (arg));
2029 else if (IS_AGGR_TYPE (type))
2030 type = lvalue_type (arg);
2031
2032 return type;
2033 }
2034
2035 /* Does FUNCTION use a variable-length argument list? */
2036
2037 int
2038 varargs_function_p (function)
2039 tree function;
2040 {
2041 tree parm = TYPE_ARG_TYPES (TREE_TYPE (function));
2042 for (; parm; parm = TREE_CHAIN (parm))
2043 if (TREE_VALUE (parm) == void_type_node)
2044 return 0;
2045 return 1;
2046 }
2047
2048 /* Returns 1 if decl is a member of a class. */
2049
2050 int
2051 member_p (decl)
2052 tree decl;
2053 {
2054 tree ctx = DECL_CONTEXT (decl);
2055 return (ctx && TREE_CODE_CLASS (TREE_CODE (ctx)) == 't');
2056 }
2057
2058 /* Create a placeholder for member access where we don't actually have an
2059 object that the access is against. */
2060
2061 tree
2062 build_dummy_object (type)
2063 tree type;
2064 {
2065 tree decl = build1 (NOP_EXPR, build_pointer_type (type), void_zero_node);
2066 return build_indirect_ref (decl, NULL_PTR);
2067 }
2068
2069 /* We've gotten a reference to a member of TYPE. Return *this if appropriate,
2070 or a dummy object otherwise. If BINFOP is non-0, it is filled with the
2071 binfo path from current_class_type to TYPE, or 0. */
2072
2073 tree
2074 maybe_dummy_object (type, binfop)
2075 tree type;
2076 tree *binfop;
2077 {
2078 tree decl, context;
2079
2080 if (current_class_type
2081 && get_base_distance (type, current_class_type, 0, binfop) != -1)
2082 context = current_class_type;
2083 else
2084 {
2085 /* Reference from a nested class member function. */
2086 context = type;
2087 if (binfop)
2088 *binfop = TYPE_BINFO (type);
2089 }
2090
2091 if (current_class_ref && context == current_class_type)
2092 decl = current_class_ref;
2093 else
2094 decl = build_dummy_object (context);
2095
2096 return decl;
2097 }
2098
2099 /* Returns 1 if OB is a placeholder object, or a pointer to one. */
2100
2101 int
2102 is_dummy_object (ob)
2103 tree ob;
2104 {
2105 if (TREE_CODE (ob) == INDIRECT_REF)
2106 ob = TREE_OPERAND (ob, 0);
2107 return (TREE_CODE (ob) == NOP_EXPR
2108 && TREE_OPERAND (ob, 0) == void_zero_node);
2109 }
2110
2111 /* Returns 1 iff type T is a POD type, as defined in [basic.types]. */
2112
2113 int
2114 pod_type_p (t)
2115 tree t;
2116 {
2117 while (TREE_CODE (t) == ARRAY_TYPE)
2118 t = TREE_TYPE (t);
2119
2120 if (INTEGRAL_TYPE_P (t))
2121 return 1; /* integral, character or enumeral type */
2122 if (FLOAT_TYPE_P (t))
2123 return 1;
2124 if (TYPE_PTR_P (t))
2125 return 1; /* pointer to non-member */
2126 if (TYPE_PTRMEM_P (t))
2127 return 1; /* pointer to member object */
2128 if (TYPE_PTRMEMFUNC_P (t))
2129 return 1; /* pointer to member function */
2130
2131 if (! CLASS_TYPE_P (t))
2132 return 0; /* other non-class type (reference or function) */
2133 if (CLASSTYPE_NON_POD_P (t))
2134 return 0;
2135 return 1;
2136 }
2137
2138 /* Return a 1 if ATTR_NAME and ATTR_ARGS denote a valid C++-specific
2139 attribute for either declaration DECL or type TYPE and 0 otherwise.
2140 Plugged into valid_lang_attribute. */
2141
2142 int
2143 cp_valid_lang_attribute (attr_name, attr_args, decl, type)
2144 tree attr_name;
2145 tree attr_args ATTRIBUTE_UNUSED;
2146 tree decl ATTRIBUTE_UNUSED;
2147 tree type ATTRIBUTE_UNUSED;
2148 {
2149 if (is_attribute_p ("com_interface", attr_name))
2150 {
2151 if (! flag_vtable_thunks)
2152 {
2153 error ("`com_interface' only supported with -fvtable-thunks");
2154 return 0;
2155 }
2156
2157 if (attr_args != NULL_TREE
2158 || decl != NULL_TREE
2159 || ! CLASS_TYPE_P (type)
2160 || type != TYPE_MAIN_VARIANT (type))
2161 {
2162 warning ("`com_interface' attribute can only be applied to class definitions");
2163 return 0;
2164 }
2165
2166 CLASSTYPE_COM_INTERFACE (type) = 1;
2167 return 1;
2168 }
2169 else if (is_attribute_p ("init_priority", attr_name))
2170 {
2171 tree initp_expr = (attr_args ? TREE_VALUE (attr_args): NULL_TREE);
2172 int pri;
2173
2174 if (initp_expr)
2175 STRIP_NOPS (initp_expr);
2176
2177 if (!initp_expr || TREE_CODE (initp_expr) != INTEGER_CST)
2178 {
2179 error ("requested init_priority is not an integer constant");
2180 return 0;
2181 }
2182
2183 pri = TREE_INT_CST_LOW (initp_expr);
2184
2185 while (TREE_CODE (type) == ARRAY_TYPE)
2186 type = TREE_TYPE (type);
2187
2188 if (decl == NULL_TREE
2189 || TREE_CODE (decl) != VAR_DECL
2190 || ! TREE_STATIC (decl)
2191 || DECL_EXTERNAL (decl)
2192 || (TREE_CODE (type) != RECORD_TYPE
2193 && TREE_CODE (type) != UNION_TYPE)
2194 /* Static objects in functions are initialized the
2195 first time control passes through that
2196 function. This is not precise enough to pin down an
2197 init_priority value, so don't allow it. */
2198 || current_function_decl)
2199 {
2200 error ("can only use init_priority attribute on file-scope definitions of objects of class type");
2201 return 0;
2202 }
2203
2204 if (pri > MAX_INIT_PRIORITY || pri <= 0)
2205 {
2206 error ("requested init_priority is out of range");
2207 return 0;
2208 }
2209
2210 /* Check for init_priorities that are reserved for
2211 language and runtime support implementations.*/
2212 if (pri <= MAX_RESERVED_INIT_PRIORITY)
2213 {
2214 warning
2215 ("requested init_priority is reserved for internal use");
2216 }
2217
2218 DECL_INIT_PRIORITY (decl) = pri;
2219 return 1;
2220 }
2221
2222 return 0;
2223 }
2224
2225 /* Return a new PTRMEM_CST of the indicated TYPE. The MEMBER is the
2226 thing pointed to by the constant. */
2227
2228 tree
2229 make_ptrmem_cst (type, member)
2230 tree type;
2231 tree member;
2232 {
2233 tree ptrmem_cst = make_node (PTRMEM_CST);
2234 /* If would seem a great convenience if make_node would set
2235 TREE_CONSTANT for things of class `c', but it does not. */
2236 TREE_CONSTANT (ptrmem_cst) = 1;
2237 TREE_TYPE (ptrmem_cst) = type;
2238 PTRMEM_CST_MEMBER (ptrmem_cst) = member;
2239 return ptrmem_cst;
2240 }
2241
2242 /* Mark ARG (which is really a list_hash_table **) for GC. */
2243
2244 static void
2245 mark_list_hash (arg)
2246 void *arg;
2247 {
2248 struct list_hash *lh;
2249
2250 for (lh = * ((struct list_hash **) arg); lh; lh = lh->next)
2251 ggc_mark_tree (lh->list);
2252 }
2253
2254 /* Initialize tree.c. */
2255
2256 void
2257 init_tree ()
2258 {
2259 make_lang_type_fn = cp_make_lang_type;
2260 lang_unsave = cp_unsave;
2261 ggc_add_root (list_hash_table,
2262 sizeof (list_hash_table) / sizeof (struct list_hash *),
2263 sizeof (struct list_hash *),
2264 mark_list_hash);
2265 }
2266
2267 /* The SAVE_EXPR pointed to by TP is being copied. If ST contains
2268 information indicating to what new SAVE_EXPR this one should be
2269 mapped, use that one. Otherwise, create a new node and enter it in
2270 ST. FN is the function into which the copy will be placed. */
2271
2272 void
2273 remap_save_expr (tp, st, fn, walk_subtrees)
2274 tree *tp;
2275 splay_tree st;
2276 tree fn;
2277 int *walk_subtrees;
2278 {
2279 splay_tree_node n;
2280
2281 /* See if we already encountered this SAVE_EXPR. */
2282 n = splay_tree_lookup (st, (splay_tree_key) *tp);
2283
2284 /* If we didn't already remap this SAVE_EXPR, do so now. */
2285 if (!n)
2286 {
2287 tree t = copy_node (*tp);
2288
2289 /* The SAVE_EXPR is now part of the function into which we
2290 are inlining this body. */
2291 SAVE_EXPR_CONTEXT (t) = fn;
2292 /* And we haven't evaluated it yet. */
2293 SAVE_EXPR_RTL (t) = NULL_RTX;
2294 /* Remember this SAVE_EXPR. */
2295 n = splay_tree_insert (st,
2296 (splay_tree_key) *tp,
2297 (splay_tree_value) t);
2298 }
2299 else
2300 /* We've already walked into this SAVE_EXPR, so we needn't do it
2301 again. */
2302 *walk_subtrees = 0;
2303
2304 /* Replace this SAVE_EXPR with the copy. */
2305 *tp = (tree) n->value;
2306 }
2307
2308 /* Called via walk_tree. If *TP points to a DECL_STMT for a local
2309 declaration, copies the declaration and enters it in the splay_tree
2310 pointed to by DATA (which is really a `splay_tree *'). */
2311
2312 static tree
2313 mark_local_for_remap_r (tp, walk_subtrees, data)
2314 tree *tp;
2315 int *walk_subtrees ATTRIBUTE_UNUSED;
2316 void *data;
2317 {
2318 tree t = *tp;
2319 splay_tree st = (splay_tree) data;
2320
2321 if ((TREE_CODE (t) == DECL_STMT
2322 && nonstatic_local_decl_p (DECL_STMT_DECL (t)))
2323 || TREE_CODE (t) == LABEL_STMT)
2324 {
2325 tree decl;
2326 tree copy;
2327
2328 /* Figure out what's being declared. */
2329 decl = (TREE_CODE (t) == DECL_STMT
2330 ? DECL_STMT_DECL (t) : LABEL_STMT_LABEL (t));
2331
2332 /* Make a copy. */
2333 copy = copy_decl_for_inlining (decl,
2334 DECL_CONTEXT (decl),
2335 DECL_CONTEXT (decl));
2336
2337 /* Remember the copy. */
2338 splay_tree_insert (st,
2339 (splay_tree_key) decl,
2340 (splay_tree_value) copy);
2341 }
2342
2343 return NULL_TREE;
2344 }
2345
2346 /* Called via walk_tree when an expression is unsaved. Using the
2347 splay_tree pointed to by ST (which is really a `splay_tree *'),
2348 remaps all local declarations to appropriate replacements. */
2349
2350 static tree
2351 cp_unsave_r (tp, walk_subtrees, data)
2352 tree *tp;
2353 int *walk_subtrees;
2354 void *data;
2355 {
2356 splay_tree st = (splay_tree) data;
2357 splay_tree_node n;
2358
2359 /* Only a local declaration (variable or label). */
2360 if (nonstatic_local_decl_p (*tp))
2361 {
2362 /* Lookup the declaration. */
2363 n = splay_tree_lookup (st, (splay_tree_key) *tp);
2364
2365 /* If it's there, remap it. */
2366 if (n)
2367 *tp = (tree) n->value;
2368 }
2369 else if (TREE_CODE (*tp) == SAVE_EXPR)
2370 remap_save_expr (tp, st, current_function_decl, walk_subtrees);
2371 else
2372 {
2373 copy_tree_r (tp, walk_subtrees, NULL);
2374
2375 /* Do whatever unsaving is required. */
2376 unsave_expr_1 (*tp);
2377 }
2378
2379 /* Keep iterating. */
2380 return NULL_TREE;
2381 }
2382
2383 /* Called by unsave_expr_now whenever an expression (*TP) needs to be
2384 unsaved. */
2385
2386 static void
2387 cp_unsave (tp)
2388 tree *tp;
2389 {
2390 splay_tree st;
2391
2392 /* Create a splay-tree to map old local variable declarations to new
2393 ones. */
2394 st = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
2395
2396 /* Walk the tree once figuring out what needs to be remapped. */
2397 walk_tree (tp, mark_local_for_remap_r, st);
2398
2399 /* Walk the tree again, copying, remapping, and unsaving. */
2400 walk_tree (tp, cp_unsave_r, st);
2401
2402 /* Clean up. */
2403 splay_tree_delete (st);
2404 }