]> gcc.gnu.org Git - gcc.git/blob - gcc/cp/search.c
search.c (expand_upcast_fixups): Tweak to match 1998-10-07 change to vtable types.
[gcc.git] / gcc / cp / search.c
1 /* Breadth-first and depth-first routines for
2 searching multiple-inheritance lattice for GNU C++.
3 Copyright (C) 1987, 89, 92-96, 1997 Free Software Foundation, Inc.
4 Contributed by Michael Tiemann (tiemann@cygnus.com)
5
6 This file is part of GNU CC.
7
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 /* High-level class interface. */
24
25 #include "config.h"
26 #include "system.h"
27 #include "tree.h"
28 #include "cp-tree.h"
29 #include "obstack.h"
30 #include "flags.h"
31 #include "rtl.h"
32 #include "output.h"
33 #include "toplev.h"
34
35 #define obstack_chunk_alloc xmalloc
36 #define obstack_chunk_free free
37
38 extern struct obstack *current_obstack;
39 extern tree abort_fndecl;
40
41 #include "stack.h"
42
43 /* Obstack used for remembering decision points of breadth-first. */
44
45 static struct obstack search_obstack;
46
47 /* Methods for pushing and popping objects to and from obstacks. */
48
49 struct stack_level *
50 push_stack_level (obstack, tp, size)
51 struct obstack *obstack;
52 char *tp; /* Sony NewsOS 5.0 compiler doesn't like void * here. */
53 int size;
54 {
55 struct stack_level *stack;
56 obstack_grow (obstack, tp, size);
57 stack = (struct stack_level *) ((char*)obstack_next_free (obstack) - size);
58 obstack_finish (obstack);
59 stack->obstack = obstack;
60 stack->first = (tree *) obstack_base (obstack);
61 stack->limit = obstack_room (obstack) / sizeof (tree *);
62 return stack;
63 }
64
65 struct stack_level *
66 pop_stack_level (stack)
67 struct stack_level *stack;
68 {
69 struct stack_level *tem = stack;
70 struct obstack *obstack = tem->obstack;
71 stack = tem->prev;
72 obstack_free (obstack, tem);
73 return stack;
74 }
75
76 #define search_level stack_level
77 static struct search_level *search_stack;
78
79 static tree get_abstract_virtuals_1 PROTO((tree, int, tree));
80 static tree get_vbase_1 PROTO((tree, tree, unsigned int *));
81 static tree convert_pointer_to_vbase PROTO((tree, tree));
82 static tree lookup_field_1 PROTO((tree, tree));
83 static tree convert_pointer_to_single_level PROTO((tree, tree));
84 static int lookup_fnfields_1 PROTO((tree, tree));
85 static int lookup_fnfields_here PROTO((tree, tree));
86 static int is_subobject_of_p PROTO((tree, tree));
87 static int hides PROTO((tree, tree));
88 static tree virtual_context PROTO((tree, tree, tree));
89 static tree get_template_base_recursive
90 PROTO((tree, tree, tree, int));
91 static void dfs_walk PROTO((tree, void (*) (tree), int (*) (tree)));
92 static void dfs_check_overlap PROTO((tree));
93 static int dfs_no_overlap_yet PROTO((tree));
94 static void envelope_add_decl PROTO((tree, tree, tree *));
95 static int get_base_distance_recursive
96 PROTO((tree, int, int, int, int *, tree *, tree,
97 int, int *, int, int));
98 static void expand_upcast_fixups
99 PROTO((tree, tree, tree, tree, tree, tree, tree *));
100 static void fixup_virtual_upcast_offsets
101 PROTO((tree, tree, int, int, tree, tree, tree, tree,
102 tree *));
103 static int markedp PROTO((tree));
104 static int unmarkedp PROTO((tree));
105 static int marked_vtable_pathp PROTO((tree));
106 static int unmarked_vtable_pathp PROTO((tree));
107 static int marked_new_vtablep PROTO((tree));
108 static int unmarked_new_vtablep PROTO((tree));
109 static int dfs_debug_unmarkedp PROTO((tree));
110 static void dfs_debug_mark PROTO((tree));
111 static void dfs_find_vbases PROTO((tree));
112 static void dfs_clear_vbase_slots PROTO((tree));
113 static void dfs_unmark PROTO((tree));
114 static void dfs_init_vbase_pointers PROTO((tree));
115 static void dfs_get_vbase_types PROTO((tree));
116 static void dfs_pushdecls PROTO((tree));
117 static void dfs_compress_decls PROTO((tree));
118 static void dfs_unuse_fields PROTO((tree));
119 static void add_conversions PROTO((tree));
120 static tree get_virtuals_named_this PROTO((tree));
121 static tree get_virtual_destructor PROTO((tree, int));
122 static int tree_has_any_destructor_p PROTO((tree, int));
123 static int covariant_return_p PROTO((tree, tree));
124 static struct search_level *push_search_level
125 PROTO((struct stack_level *, struct obstack *));
126 static struct search_level *pop_search_level
127 PROTO((struct stack_level *));
128 static HOST_WIDE_INT breadth_first_search
129 PROTO((tree, int (*) (tree, int), int (*) (tree, int)));
130
131 static tree vbase_types;
132 static tree vbase_decl_ptr_intermediate, vbase_decl_ptr;
133 static tree vbase_init_result;
134
135 /* Allocate a level of searching. */
136
137 static struct search_level *
138 push_search_level (stack, obstack)
139 struct stack_level *stack;
140 struct obstack *obstack;
141 {
142 struct search_level tem;
143
144 tem.prev = stack;
145 return push_stack_level (obstack, (char *)&tem, sizeof (tem));
146 }
147
148 /* Discard a level of search allocation. */
149
150 static struct search_level *
151 pop_search_level (obstack)
152 struct stack_level *obstack;
153 {
154 register struct search_level *stack = pop_stack_level (obstack);
155
156 return stack;
157 }
158 \f
159 static tree _vptr_name;
160
161 /* Variables for gathering statistics. */
162 #ifdef GATHER_STATISTICS
163 static int n_fields_searched;
164 static int n_calls_lookup_field, n_calls_lookup_field_1;
165 static int n_calls_lookup_fnfields, n_calls_lookup_fnfields_1;
166 static int n_calls_get_base_type;
167 static int n_outer_fields_searched;
168 static int n_contexts_saved;
169 #endif /* GATHER_STATISTICS */
170
171 /* This list is used by push_class_decls to know what decls need to
172 be pushed into class scope. */
173 static tree closed_envelopes = NULL_TREE;
174 \f
175 /* Get a virtual binfo that is found inside BINFO's hierarchy that is
176 the same type as the type given in PARENT. To be optimal, we want
177 the first one that is found by going through the least number of
178 virtual bases.
179
180 This uses a clever algorithm that updates *depth when we find the vbase,
181 and cuts off other paths of search when they reach that depth. */
182
183 static tree
184 get_vbase_1 (parent, binfo, depth)
185 tree parent, binfo;
186 unsigned int *depth;
187 {
188 tree binfos;
189 int i, n_baselinks;
190 tree rval = NULL_TREE;
191
192 if (BINFO_TYPE (binfo) == parent && TREE_VIA_VIRTUAL (binfo))
193 {
194 *depth = 0;
195 return binfo;
196 }
197
198 *depth = *depth - 1;
199
200 binfos = BINFO_BASETYPES (binfo);
201 n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
202
203 /* Process base types. */
204 for (i = 0; i < n_baselinks; i++)
205 {
206 tree base_binfo = TREE_VEC_ELT (binfos, i);
207 tree nrval;
208
209 if (*depth == 0)
210 break;
211
212 nrval = get_vbase_1 (parent, base_binfo, depth);
213 if (nrval)
214 rval = nrval;
215 }
216 *depth = *depth+1;
217 return rval;
218 }
219
220 /* Return the shortest path to vbase PARENT within BINFO, ignoring
221 access and ambiguity. */
222
223 tree
224 get_vbase (parent, binfo)
225 tree parent;
226 tree binfo;
227 {
228 unsigned int d = (unsigned int)-1;
229 return get_vbase_1 (parent, binfo, &d);
230 }
231
232 /* Convert EXPR to a virtual base class of type TYPE. We know that
233 EXPR is a non-null POINTER_TYPE to RECORD_TYPE. We also know that
234 the type of what expr points to has a virtual base of type TYPE. */
235
236 static tree
237 convert_pointer_to_vbase (type, expr)
238 tree type;
239 tree expr;
240 {
241 tree vb = get_vbase (type, TYPE_BINFO (TREE_TYPE (TREE_TYPE (expr))));
242 return convert_pointer_to_real (vb, expr);
243 }
244
245 /* Check whether the type given in BINFO is derived from PARENT. If
246 it isn't, return 0. If it is, but the derivation is MI-ambiguous
247 AND protect != 0, emit an error message and return error_mark_node.
248
249 Otherwise, if TYPE is derived from PARENT, return the actual base
250 information, unless a one of the protection violations below
251 occurs, in which case emit an error message and return error_mark_node.
252
253 If PROTECT is 1, then check if access to a public field of PARENT
254 would be private. Also check for ambiguity. */
255
256 tree
257 get_binfo (parent, binfo, protect)
258 register tree parent, binfo;
259 int protect;
260 {
261 tree type = NULL_TREE;
262 int dist;
263 tree rval = NULL_TREE;
264
265 if (TREE_CODE (parent) == TREE_VEC)
266 parent = BINFO_TYPE (parent);
267 else if (! IS_AGGR_TYPE_CODE (TREE_CODE (parent)))
268 my_friendly_abort (89);
269
270 if (TREE_CODE (binfo) == TREE_VEC)
271 type = BINFO_TYPE (binfo);
272 else if (IS_AGGR_TYPE_CODE (TREE_CODE (binfo)))
273 type = binfo;
274 else
275 my_friendly_abort (90);
276
277 dist = get_base_distance (parent, binfo, protect, &rval);
278
279 if (dist == -3)
280 {
281 cp_error ("fields of `%T' are inaccessible in `%T' due to private inheritance",
282 parent, type);
283 return error_mark_node;
284 }
285 else if (dist == -2 && protect)
286 {
287 cp_error ("type `%T' is ambiguous base class for type `%T'", parent,
288 type);
289 return error_mark_node;
290 }
291
292 return rval;
293 }
294
295 /* This is the newer depth first get_base_distance routine. */
296
297 static int
298 get_base_distance_recursive (binfo, depth, is_private, rval,
299 rval_private_ptr, new_binfo_ptr, parent,
300 protect, via_virtual_ptr, via_virtual,
301 current_scope_in_chain)
302 tree binfo;
303 int depth, is_private, rval;
304 int *rval_private_ptr;
305 tree *new_binfo_ptr, parent;
306 int protect, *via_virtual_ptr, via_virtual;
307 int current_scope_in_chain;
308 {
309 tree binfos;
310 int i, n_baselinks;
311
312 if (protect
313 && !current_scope_in_chain
314 && is_friend (BINFO_TYPE (binfo), current_scope ()))
315 current_scope_in_chain = 1;
316
317 if (BINFO_TYPE (binfo) == parent || binfo == parent)
318 {
319 int better = 0;
320
321 if (rval == -1)
322 /* This is the first time we've found parent. */
323 better = 1;
324 else if (tree_int_cst_equal (BINFO_OFFSET (*new_binfo_ptr),
325 BINFO_OFFSET (binfo))
326 && *via_virtual_ptr && via_virtual)
327 {
328 /* A new path to the same vbase. If this one has better
329 access or is shorter, take it. */
330
331 if (protect)
332 better = *rval_private_ptr - is_private;
333 if (better == 0)
334 better = rval - depth;
335 }
336 else
337 {
338 /* Ambiguous base class. */
339 rval = depth = -2;
340
341 /* If we get an ambiguity between virtual and non-virtual base
342 class, return the non-virtual in case we are ignoring
343 ambiguity. */
344 better = *via_virtual_ptr - via_virtual;
345 }
346
347 if (better > 0)
348 {
349 rval = depth;
350 *rval_private_ptr = is_private;
351 *new_binfo_ptr = binfo;
352 *via_virtual_ptr = via_virtual;
353 }
354
355 return rval;
356 }
357
358 binfos = BINFO_BASETYPES (binfo);
359 n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
360 depth += 1;
361
362 /* Process base types. */
363 for (i = 0; i < n_baselinks; i++)
364 {
365 tree base_binfo = TREE_VEC_ELT (binfos, i);
366
367 int via_private
368 = (protect
369 && (is_private
370 || (!TREE_VIA_PUBLIC (base_binfo)
371 && !(TREE_VIA_PROTECTED (base_binfo)
372 && current_scope_in_chain)
373 && !is_friend (BINFO_TYPE (binfo), current_scope ()))));
374 int this_virtual = via_virtual || TREE_VIA_VIRTUAL (base_binfo);
375
376 rval = get_base_distance_recursive (base_binfo, depth, via_private,
377 rval, rval_private_ptr,
378 new_binfo_ptr, parent,
379 protect, via_virtual_ptr,
380 this_virtual,
381 current_scope_in_chain);
382
383 /* If we've found a non-virtual, ambiguous base class, we don't need
384 to keep searching. */
385 if (rval == -2 && *via_virtual_ptr == 0)
386 return rval;
387 }
388
389 return rval;
390 }
391
392 /* Return the number of levels between type PARENT and the type given
393 in BINFO, following the leftmost path to PARENT not found along a
394 virtual path, if there are no real PARENTs (all come from virtual
395 base classes), then follow the shortest public path to PARENT.
396
397 Return -1 if TYPE is not derived from PARENT.
398 Return -2 if PARENT is an ambiguous base class of TYPE, and PROTECT is
399 non-negative.
400 Return -3 if PARENT is private to TYPE, and PROTECT is non-zero.
401
402 If PATH_PTR is non-NULL, then also build the list of types
403 from PARENT to TYPE, with TREE_VIA_VIRTUAL and TREE_VIA_PUBLIC
404 set.
405
406 PARENT can also be a binfo, in which case that exact parent is found
407 and no other. convert_pointer_to_real uses this functionality.
408
409 If BINFO is a binfo, its BINFO_INHERITANCE_CHAIN will be left alone. */
410
411 int
412 get_base_distance (parent, binfo, protect, path_ptr)
413 register tree parent, binfo;
414 int protect;
415 tree *path_ptr;
416 {
417 int rval;
418 int rval_private = 0;
419 tree type = NULL_TREE;
420 tree new_binfo = NULL_TREE;
421 int via_virtual;
422 int watch_access = protect;
423
424 /* Should we be completing types here? */
425 if (TREE_CODE (parent) != TREE_VEC)
426 parent = complete_type (TYPE_MAIN_VARIANT (parent));
427 else
428 complete_type (TREE_TYPE (parent));
429
430 if (TREE_CODE (binfo) == TREE_VEC)
431 type = BINFO_TYPE (binfo);
432 else if (IS_AGGR_TYPE_CODE (TREE_CODE (binfo)))
433 {
434 type = complete_type (binfo);
435 binfo = TYPE_BINFO (type);
436
437 if (path_ptr)
438 my_friendly_assert (BINFO_INHERITANCE_CHAIN (binfo) == NULL_TREE,
439 980827);
440 }
441 else
442 my_friendly_abort (92);
443
444 if (parent == type || parent == binfo)
445 {
446 /* If the distance is 0, then we don't really need
447 a path pointer, but we shouldn't let garbage go back. */
448 if (path_ptr)
449 *path_ptr = binfo;
450 return 0;
451 }
452
453 if (path_ptr)
454 watch_access = 1;
455
456 rval = get_base_distance_recursive (binfo, 0, 0, -1,
457 &rval_private, &new_binfo, parent,
458 watch_access, &via_virtual, 0,
459 0);
460
461 /* Access restrictions don't count if we found an ambiguous basetype. */
462 if (rval == -2 && protect >= 0)
463 rval_private = 0;
464
465 if (rval && protect && rval_private)
466 return -3;
467
468 /* If they gave us the real vbase binfo, which isn't in the main binfo
469 tree, deal with it. This happens when we are called from
470 expand_upcast_fixups. */
471 if (rval == -1 && TREE_CODE (parent) == TREE_VEC
472 && parent == binfo_member (BINFO_TYPE (parent),
473 CLASSTYPE_VBASECLASSES (type)))
474 {
475 my_friendly_assert (BINFO_INHERITANCE_CHAIN (parent) == binfo, 980827);
476 new_binfo = parent;
477 rval = 1;
478 }
479
480 if (path_ptr)
481 *path_ptr = new_binfo;
482 return rval;
483 }
484
485 /* Search for a member with name NAME in a multiple inheritance lattice
486 specified by TYPE. If it does not exist, return NULL_TREE.
487 If the member is ambiguously referenced, return `error_mark_node'.
488 Otherwise, return the FIELD_DECL. */
489
490 /* Do a 1-level search for NAME as a member of TYPE. The caller must
491 figure out whether it can access this field. (Since it is only one
492 level, this is reasonable.) */
493
494 static tree
495 lookup_field_1 (type, name)
496 tree type, name;
497 {
498 register tree field;
499
500 if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
501 || TREE_CODE (type) == TEMPLATE_TEMPLATE_PARM)
502 /* The TYPE_FIELDS of a TEMPLATE_TYPE_PARM are not fields at all;
503 instead TYPE_FIELDS is the TEMPLATE_PARM_INDEX. (Miraculously,
504 the code often worked even when we treated the index as a list
505 of fields!) */
506 return NULL_TREE;
507
508 field = TYPE_FIELDS (type);
509
510 #ifdef GATHER_STATISTICS
511 n_calls_lookup_field_1++;
512 #endif /* GATHER_STATISTICS */
513 while (field)
514 {
515 #ifdef GATHER_STATISTICS
516 n_fields_searched++;
517 #endif /* GATHER_STATISTICS */
518 my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (field)) == 'd', 0);
519 if (DECL_NAME (field) == NULL_TREE
520 && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
521 {
522 tree temp = lookup_field_1 (TREE_TYPE (field), name);
523 if (temp)
524 return temp;
525 }
526 if (DECL_NAME (field) == name)
527 {
528 if ((TREE_CODE(field) == VAR_DECL || TREE_CODE(field) == CONST_DECL)
529 && DECL_ASSEMBLER_NAME (field) != NULL)
530 GNU_xref_ref(current_function_decl,
531 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (field)));
532 return field;
533 }
534 field = TREE_CHAIN (field);
535 }
536 /* Not found. */
537 if (name == _vptr_name)
538 {
539 /* Give the user what s/he thinks s/he wants. */
540 if (TYPE_VIRTUAL_P (type))
541 return CLASSTYPE_VFIELD (type);
542 }
543 return NULL_TREE;
544 }
545
546 /* There are a number of cases we need to be aware of here:
547 current_class_type current_function_decl
548 global NULL NULL
549 fn-local NULL SET
550 class-local SET NULL
551 class->fn SET SET
552 fn->class SET SET
553
554 Those last two make life interesting. If we're in a function which is
555 itself inside a class, we need decls to go into the fn's decls (our
556 second case below). But if we're in a class and the class itself is
557 inside a function, we need decls to go into the decls for the class. To
558 achieve this last goal, we must see if, when both current_class_ptr and
559 current_function_decl are set, the class was declared inside that
560 function. If so, we know to put the decls into the class's scope. */
561
562 tree
563 current_scope ()
564 {
565 if (current_function_decl == NULL_TREE)
566 return current_class_type;
567 if (current_class_type == NULL_TREE)
568 return current_function_decl;
569 if (DECL_CLASS_CONTEXT (current_function_decl) == current_class_type)
570 return current_function_decl;
571
572 return current_class_type;
573 }
574
575 /* Compute the access of FIELD. This is done by computing
576 the access available to each type in BASETYPES (which comes
577 as a list of [via_public/basetype] in reverse order, namely base
578 class before derived class). The first one which defines a
579 access defines the access for the field. Otherwise, the
580 access of the field is that which occurs normally.
581
582 Uses global variables CURRENT_CLASS_TYPE and
583 CURRENT_FUNCTION_DECL to use friend relationships
584 if necessary.
585
586 This will be static when lookup_fnfield comes into this file.
587
588 access_public_node means that the field can be accessed by the current lexical
589 scope.
590
591 access_protected_node means that the field cannot be accessed by the current
592 lexical scope because it is protected.
593
594 access_private_node means that the field cannot be accessed by the current
595 lexical scope because it is private. */
596
597 #if 0
598 #define PUBLIC_RETURN return (DECL_PUBLIC (field) = 1), access_public_node
599 #define PROTECTED_RETURN return (DECL_PROTECTED (field) = 1), access_protected_node
600 #define PRIVATE_RETURN return (DECL_PRIVATE (field) = 1), access_private_node
601 #else
602 #define PUBLIC_RETURN return access_public_node
603 #define PROTECTED_RETURN return access_protected_node
604 #define PRIVATE_RETURN return access_private_node
605 #endif
606
607 #if 0
608 /* Disabled with DECL_PUBLIC &c. */
609 static tree previous_scope = NULL_TREE;
610 #endif
611
612 tree
613 compute_access (basetype_path, field)
614 tree basetype_path, field;
615 {
616 tree access;
617 tree types;
618 tree context;
619 int protected_ok, via_protected;
620 extern int flag_access_control;
621 #if 1
622 /* Replaces static decl above. */
623 tree previous_scope;
624 #endif
625 int static_mem
626 = ((TREE_CODE (field) == FUNCTION_DECL && DECL_STATIC_FUNCTION_P (field))
627 || (TREE_CODE (field) != FUNCTION_DECL && TREE_STATIC (field)));
628
629 if (! flag_access_control)
630 return access_public_node;
631
632 /* The field lives in the current class. */
633 if (BINFO_TYPE (basetype_path) == current_class_type)
634 return access_public_node;
635
636 #if 0
637 /* Disabled until pushing function scope clears these out. If ever. */
638 /* Make these special cases fast. */
639 if (current_scope () == previous_scope)
640 {
641 if (DECL_PUBLIC (field))
642 return access_public_node;
643 if (DECL_PROTECTED (field))
644 return access_protected_node;
645 if (DECL_PRIVATE (field))
646 return access_private_node;
647 }
648 #endif
649
650 /* We don't currently support access control on nested types. */
651 if (TREE_CODE (field) == TYPE_DECL)
652 return access_public_node;
653
654 previous_scope = current_scope ();
655
656 context = DECL_REAL_CONTEXT (field);
657
658 /* Fields coming from nested anonymous unions have their DECL_CLASS_CONTEXT
659 slot set to the union type rather than the record type containing
660 the anonymous union. */
661 if (context && ANON_UNION_TYPE_P (context)
662 && TREE_CODE (field) == FIELD_DECL)
663 context = TYPE_CONTEXT (context);
664
665 /* Virtual function tables are never private. But we should know that
666 we are looking for this, and not even try to hide it. */
667 if (DECL_NAME (field) && VFIELD_NAME_P (DECL_NAME (field)) == 1)
668 PUBLIC_RETURN;
669
670 /* Member found immediately within object. */
671 if (BINFO_INHERITANCE_CHAIN (basetype_path) == NULL_TREE)
672 {
673 /* Are we (or an enclosing scope) friends with the class that has
674 FIELD? */
675 if (is_friend (context, previous_scope))
676 PUBLIC_RETURN;
677
678 /* If it's private, it's private, you letch. */
679 if (TREE_PRIVATE (field))
680 PRIVATE_RETURN;
681
682 /* ARM $11.5. Member functions of a derived class can access the
683 non-static protected members of a base class only through a
684 pointer to the derived class, a reference to it, or an object
685 of it. Also any subsequently derived classes also have
686 access. */
687 else if (TREE_PROTECTED (field))
688 {
689 if (current_class_type
690 && (static_mem || DECL_CONSTRUCTOR_P (field))
691 && ACCESSIBLY_DERIVED_FROM_P (context, current_class_type))
692 PUBLIC_RETURN;
693 else
694 PROTECTED_RETURN;
695 }
696 else
697 PUBLIC_RETURN;
698 }
699
700 /* must reverse more than one element */
701 basetype_path = reverse_path (basetype_path);
702 types = basetype_path;
703 via_protected = 0;
704 access = access_default_node;
705 protected_ok = static_mem && current_class_type
706 && ACCESSIBLY_DERIVED_FROM_P (BINFO_TYPE (types), current_class_type);
707
708 while (1)
709 {
710 tree member;
711 tree binfo = types;
712 tree type = BINFO_TYPE (binfo);
713 int private_ok = 0;
714
715 /* Friends of a class can see protected members of its bases.
716 Note that classes are their own friends. */
717 if (is_friend (type, previous_scope))
718 {
719 protected_ok = 1;
720 private_ok = 1;
721 }
722
723 member = purpose_member (type, DECL_ACCESS (field));
724 if (member)
725 {
726 access = TREE_VALUE (member);
727 break;
728 }
729
730 types = BINFO_INHERITANCE_CHAIN (types);
731
732 /* If the next type was VIA_PROTECTED, then fields of all remaining
733 classes past that one are *at least* protected. */
734 if (types)
735 {
736 if (TREE_VIA_PROTECTED (types))
737 via_protected = 1;
738 else if (! TREE_VIA_PUBLIC (types) && ! private_ok)
739 {
740 access = access_private_node;
741 break;
742 }
743 }
744 else
745 break;
746 }
747
748 /* No special visibilities apply. Use normal rules. */
749
750 if (access == access_default_node)
751 {
752 if (is_friend (context, previous_scope))
753 access = access_public_node;
754 else if (TREE_PRIVATE (field))
755 access = access_private_node;
756 else if (TREE_PROTECTED (field))
757 access = access_protected_node;
758 else
759 access = access_public_node;
760 }
761
762 if (access == access_public_node && via_protected)
763 access = access_protected_node;
764
765 if (access == access_protected_node && protected_ok)
766 access = access_public_node;
767
768 #if 0
769 if (access == access_public_node)
770 DECL_PUBLIC (field) = 1;
771 else if (access == access_protected_node)
772 DECL_PROTECTED (field) = 1;
773 else if (access == access_private_node)
774 DECL_PRIVATE (field) = 1;
775 else my_friendly_abort (96);
776 #endif
777 return access;
778 }
779
780 /* Routine to see if the sub-object denoted by the binfo PARENT can be
781 found as a base class and sub-object of the object denoted by
782 BINFO. This routine relies upon binfos not being shared, except
783 for binfos for virtual bases. */
784
785 static int
786 is_subobject_of_p (parent, binfo)
787 tree parent, binfo;
788 {
789 tree binfos = BINFO_BASETYPES (binfo);
790 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
791
792 if (parent == binfo)
793 return 1;
794
795 /* Process and/or queue base types. */
796 for (i = 0; i < n_baselinks; i++)
797 {
798 tree base_binfo = TREE_VEC_ELT (binfos, i);
799 if (TREE_VIA_VIRTUAL (base_binfo))
800 base_binfo = TYPE_BINFO (BINFO_TYPE (base_binfo));
801 if (is_subobject_of_p (parent, base_binfo))
802 return 1;
803 }
804 return 0;
805 }
806
807 /* See if a one FIELD_DECL hides another. This routine is meant to
808 correspond to ANSI working paper Sept 17, 1992 10p4. The two
809 binfos given are the binfos corresponding to the particular places
810 the FIELD_DECLs are found. This routine relies upon binfos not
811 being shared, except for virtual bases. */
812
813 static int
814 hides (hider_binfo, hidee_binfo)
815 tree hider_binfo, hidee_binfo;
816 {
817 /* hider hides hidee, if hider has hidee as a base class and
818 the instance of hidee is a sub-object of hider. The first
819 part is always true is the second part is true.
820
821 When hider and hidee are the same (two ways to get to the exact
822 same member) we consider either one as hiding the other. */
823 return is_subobject_of_p (hidee_binfo, hider_binfo);
824 }
825
826 /* Very similar to lookup_fnfields_1 but it ensures that at least one
827 function was declared inside the class given by TYPE. It really should
828 only return functions that match the given TYPE. */
829
830 static int
831 lookup_fnfields_here (type, name)
832 tree type, name;
833 {
834 int idx = lookup_fnfields_1 (type, name);
835 tree fndecls;
836
837 /* ctors and dtors are always only in the right class. */
838 if (idx <= 1)
839 return idx;
840 fndecls = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), idx);
841 while (fndecls)
842 {
843 if (TYPE_MAIN_VARIANT (DECL_CLASS_CONTEXT (OVL_CURRENT (fndecls)))
844 == TYPE_MAIN_VARIANT (type))
845 return idx;
846 fndecls = OVL_CHAIN (fndecls);
847 }
848 return -1;
849 }
850
851 /* Look for a field named NAME in an inheritance lattice dominated by
852 XBASETYPE. PROTECT is zero if we can avoid computing access
853 information, otherwise it is 1. WANT_TYPE is 1 when we should only
854 return TYPE_DECLs, if no TYPE_DECL can be found return NULL_TREE.
855
856 It was not clear what should happen if WANT_TYPE is set, and an
857 ambiguity is found. At least one use (lookup_name) to not see
858 the error. */
859
860 tree
861 lookup_field (xbasetype, name, protect, want_type)
862 register tree xbasetype, name;
863 int protect, want_type;
864 {
865 int head = 0, tail = 0;
866 tree rval, rval_binfo = NULL_TREE, rval_binfo_h = NULL_TREE;
867 tree type = NULL_TREE, basetype_chain, basetype_path = NULL_TREE;
868 tree this_v = access_default_node;
869 tree entry, binfo, binfo_h;
870 tree own_access = access_default_node;
871 int vbase_name_p = VBASE_NAME_P (name);
872
873 /* rval_binfo is the binfo associated with the found member, note,
874 this can be set with useful information, even when rval is not
875 set, because it must deal with ALL members, not just non-function
876 members. It is used for ambiguity checking and the hidden
877 checks. Whereas rval is only set if a proper (not hidden)
878 non-function member is found. */
879
880 /* rval_binfo_h and binfo_h are binfo values used when we perform the
881 hiding checks, as virtual base classes may not be shared. The strategy
882 is we always go into the binfo hierarchy owned by TYPE_BINFO of
883 virtual base classes, as we cross virtual base class lines. This way
884 we know that binfo of a virtual base class will always == itself when
885 found along any line. (mrs) */
886
887 char *errstr = 0;
888
889 #if 0
890 /* We cannot search for constructor/destructor names like this. */
891 /* This can't go here, but where should it go? */
892 /* If we are looking for a constructor in a templated type, use the
893 unspecialized name, as that is how we store it. */
894 if (IDENTIFIER_TEMPLATE (name))
895 name = constructor_name (name);
896 #endif
897
898 if (xbasetype == current_class_type && TYPE_BEING_DEFINED (xbasetype)
899 && IDENTIFIER_CLASS_VALUE (name))
900 {
901 tree field = IDENTIFIER_CLASS_VALUE (name);
902 if (TREE_CODE (field) != FUNCTION_DECL
903 && ! (want_type && TREE_CODE (field) != TYPE_DECL))
904 return field;
905 }
906
907 if (TREE_CODE (xbasetype) == TREE_VEC)
908 {
909 type = BINFO_TYPE (xbasetype);
910 basetype_path = xbasetype;
911 }
912 else if (IS_AGGR_TYPE_CODE (TREE_CODE (xbasetype)))
913 {
914 type = xbasetype;
915 basetype_path = TYPE_BINFO (type);
916 my_friendly_assert (BINFO_INHERITANCE_CHAIN (basetype_path) == NULL_TREE,
917 980827);
918 }
919 else
920 my_friendly_abort (97);
921
922 complete_type (type);
923
924 #ifdef GATHER_STATISTICS
925 n_calls_lookup_field++;
926 #endif /* GATHER_STATISTICS */
927
928 rval = lookup_field_1 (type, name);
929
930 if (rval || lookup_fnfields_here (type, name) >= 0)
931 {
932 if (rval)
933 {
934 if (want_type)
935 {
936 if (TREE_CODE (rval) != TYPE_DECL)
937 {
938 rval = purpose_member (name, CLASSTYPE_TAGS (type));
939 if (rval)
940 rval = TYPE_MAIN_DECL (TREE_VALUE (rval));
941 }
942 }
943 else
944 {
945 if (TREE_CODE (rval) == TYPE_DECL
946 && lookup_fnfields_here (type, name) >= 0)
947 rval = NULL_TREE;
948 }
949 }
950
951 if (protect && rval)
952 {
953 if (TREE_PRIVATE (rval) | TREE_PROTECTED (rval))
954 this_v = compute_access (basetype_path, rval);
955 if (TREE_CODE (rval) == CONST_DECL)
956 {
957 if (this_v == access_private_node)
958 errstr = "enum `%D' is a private value of class `%T'";
959 else if (this_v == access_protected_node)
960 errstr = "enum `%D' is a protected value of class `%T'";
961 }
962 else
963 {
964 if (this_v == access_private_node)
965 errstr = "member `%D' is a private member of class `%T'";
966 else if (this_v == access_protected_node)
967 errstr = "member `%D' is a protected member of class `%T'";
968 }
969 }
970
971 rval_binfo = basetype_path;
972 goto out;
973 }
974
975 basetype_chain = build_expr_list (NULL_TREE, basetype_path);
976
977 /* The ambiguity check relies upon breadth first searching. */
978
979 search_stack = push_search_level (search_stack, &search_obstack);
980 binfo = basetype_path;
981 binfo_h = binfo;
982
983 while (1)
984 {
985 tree binfos = BINFO_BASETYPES (binfo);
986 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
987 tree nval;
988
989 /* Process and/or queue base types. */
990 for (i = 0; i < n_baselinks; i++)
991 {
992 tree base_binfo = TREE_VEC_ELT (binfos, i);
993 if (BINFO_FIELDS_MARKED (base_binfo) == 0)
994 {
995 tree btypes;
996
997 SET_BINFO_FIELDS_MARKED (base_binfo);
998 btypes = scratch_tree_cons (NULL_TREE, base_binfo, basetype_chain);
999 if (TREE_VIA_VIRTUAL (base_binfo))
1000 btypes = scratch_tree_cons (NULL_TREE,
1001 TYPE_BINFO (BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (binfo_h), i))),
1002 btypes);
1003 else
1004 btypes = scratch_tree_cons (NULL_TREE,
1005 TREE_VEC_ELT (BINFO_BASETYPES (binfo_h), i),
1006 btypes);
1007 obstack_ptr_grow (&search_obstack, btypes);
1008 tail += 1;
1009 if (tail >= search_stack->limit)
1010 my_friendly_abort (98);
1011 }
1012 }
1013
1014 /* Process head of queue, if one exists. */
1015 if (head >= tail)
1016 break;
1017
1018 basetype_chain = search_stack->first[head++];
1019 binfo_h = TREE_VALUE (basetype_chain);
1020 basetype_chain = TREE_CHAIN (basetype_chain);
1021 basetype_path = TREE_VALUE (basetype_chain);
1022 if (TREE_CHAIN (basetype_chain))
1023 my_friendly_assert
1024 ((BINFO_INHERITANCE_CHAIN (basetype_path)
1025 == TREE_VALUE (TREE_CHAIN (basetype_chain)))
1026 /* We only approximate base info for partial instantiations. */
1027 || current_template_parms,
1028 980827);
1029 else
1030 my_friendly_assert (BINFO_INHERITANCE_CHAIN (basetype_path)
1031 == NULL_TREE, 980827);
1032
1033 binfo = basetype_path;
1034 type = BINFO_TYPE (binfo);
1035
1036 /* See if we can find NAME in TYPE. If RVAL is nonzero,
1037 and we do find NAME in TYPE, verify that such a second
1038 sighting is in fact valid. */
1039
1040 nval = lookup_field_1 (type, name);
1041
1042 if (nval || lookup_fnfields_here (type, name)>=0)
1043 {
1044 if (nval && nval == rval && SHARED_MEMBER_P (nval))
1045 {
1046 /* This is ok, the member found is the same [class.ambig] */
1047 }
1048 else if (rval_binfo && hides (rval_binfo_h, binfo_h))
1049 {
1050 /* This is ok, the member found is in rval_binfo, not
1051 here (binfo). */
1052 }
1053 else if (rval_binfo==NULL_TREE || hides (binfo_h, rval_binfo_h))
1054 {
1055 /* This is ok, the member found is here (binfo), not in
1056 rval_binfo. */
1057 if (nval)
1058 {
1059 rval = nval;
1060 if (protect)
1061 this_v = compute_access (basetype_path, rval);
1062 /* These may look ambiguous, but they really are not. */
1063 if (vbase_name_p)
1064 break;
1065 }
1066 else
1067 {
1068 /* Undo finding it before, as something else hides it. */
1069 rval = NULL_TREE;
1070 }
1071 rval_binfo = binfo;
1072 rval_binfo_h = binfo_h;
1073 }
1074 else
1075 {
1076 /* This is ambiguous. */
1077 errstr = "request for member `%D' is ambiguous";
1078 protect += 2;
1079 break;
1080 }
1081 }
1082 }
1083 {
1084 tree *tp = search_stack->first;
1085 tree *search_tail = tp + tail;
1086
1087 if (rval_binfo)
1088 {
1089 type = BINFO_TYPE (rval_binfo);
1090
1091 if (rval)
1092 {
1093 if (want_type)
1094 {
1095 if (TREE_CODE (rval) != TYPE_DECL)
1096 {
1097 rval = purpose_member (name, CLASSTYPE_TAGS (type));
1098 if (rval)
1099 rval = TYPE_MAIN_DECL (TREE_VALUE (rval));
1100 }
1101 }
1102 else
1103 {
1104 if (TREE_CODE (rval) == TYPE_DECL
1105 && lookup_fnfields_here (type, name) >= 0)
1106 rval = NULL_TREE;
1107 }
1108 }
1109 }
1110
1111 if (rval == NULL_TREE)
1112 errstr = 0;
1113
1114 /* If this FIELD_DECL defines its own access level, deal with that. */
1115 if (rval && errstr == 0
1116 && (protect & 1)
1117 && DECL_LANG_SPECIFIC (rval)
1118 && DECL_ACCESS (rval))
1119 {
1120 while (tp < search_tail)
1121 {
1122 /* If is possible for one of the derived types on the path to
1123 have defined special access for this field. Look for such
1124 declarations and report an error if a conflict is found. */
1125 tree new_v = NULL_TREE;
1126
1127 if (this_v != access_default_node)
1128 new_v = compute_access (TREE_VALUE (TREE_CHAIN (*tp)), rval);
1129 if (this_v != access_default_node && new_v != this_v)
1130 {
1131 errstr = "conflicting access to member `%D'";
1132 this_v = access_default_node;
1133 }
1134 own_access = new_v;
1135 CLEAR_BINFO_FIELDS_MARKED (TREE_VALUE (TREE_CHAIN (*tp)));
1136 tp += 1;
1137 }
1138 }
1139 else
1140 {
1141 while (tp < search_tail)
1142 {
1143 CLEAR_BINFO_FIELDS_MARKED (TREE_VALUE (TREE_CHAIN (*tp)));
1144 tp += 1;
1145 }
1146 }
1147 }
1148 search_stack = pop_search_level (search_stack);
1149
1150 if (errstr == 0)
1151 {
1152 if (own_access == access_private_node)
1153 errstr = "member `%D' declared private";
1154 else if (own_access == access_protected_node)
1155 errstr = "member `%D' declared protected";
1156 else if (this_v == access_private_node)
1157 errstr = TREE_PRIVATE (rval)
1158 ? "member `%D' is private"
1159 : "member `%D' is from private base class";
1160 else if (this_v == access_protected_node)
1161 errstr = TREE_PROTECTED (rval)
1162 ? "member `%D' is protected"
1163 : "member `%D' is from protected base class";
1164 }
1165
1166 out:
1167 if (protect == 2)
1168 {
1169 /* If we are not interested in ambiguities, don't report them,
1170 just return NULL_TREE. */
1171 rval = NULL_TREE;
1172 protect = 0;
1173 }
1174
1175 if (errstr && protect)
1176 {
1177 cp_error (errstr, name, type);
1178 rval = error_mark_node;
1179 }
1180
1181 /* Do implicit typename stuff. */
1182 if (rval && TREE_CODE (rval) == TYPE_DECL
1183 && processing_template_decl
1184 && ! currently_open_class (BINFO_TYPE (rval_binfo))
1185 && uses_template_parms (type))
1186 {
1187 binfo = rval_binfo;
1188 for (; ; binfo = BINFO_INHERITANCE_CHAIN (binfo))
1189 if (BINFO_INHERITANCE_CHAIN (binfo) == NULL_TREE
1190 || (BINFO_TYPE (BINFO_INHERITANCE_CHAIN (binfo))
1191 == current_class_type))
1192 break;
1193
1194 entry = make_typename_type (BINFO_TYPE (binfo), name);
1195 TREE_TYPE (entry) = TREE_TYPE (rval);
1196 rval = TYPE_MAIN_DECL (entry);
1197 }
1198
1199 return rval;
1200 }
1201
1202 /* Try to find NAME inside a nested class. */
1203
1204 tree
1205 lookup_nested_field (name, complain)
1206 tree name;
1207 int complain;
1208 {
1209 register tree t;
1210
1211 tree id = NULL_TREE;
1212 if (TYPE_MAIN_DECL (current_class_type))
1213 {
1214 /* Climb our way up the nested ladder, seeing if we're trying to
1215 modify a field in an enclosing class. If so, we should only
1216 be able to modify if it's static. */
1217 for (t = TYPE_MAIN_DECL (current_class_type);
1218 t && DECL_CONTEXT (t);
1219 t = TYPE_MAIN_DECL (DECL_CONTEXT (t)))
1220 {
1221 if (TREE_CODE (DECL_CONTEXT (t)) != RECORD_TYPE)
1222 break;
1223
1224 /* N.B.: lookup_field will do the access checking for us */
1225 id = lookup_field (DECL_CONTEXT (t), name, complain, 0);
1226 if (id == error_mark_node)
1227 {
1228 id = NULL_TREE;
1229 continue;
1230 }
1231
1232 if (id != NULL_TREE)
1233 {
1234 if (TREE_CODE (id) == FIELD_DECL
1235 && ! TREE_STATIC (id)
1236 && TREE_TYPE (id) != error_mark_node)
1237 {
1238 if (complain)
1239 {
1240 /* At parse time, we don't want to give this error, since
1241 we won't have enough state to make this kind of
1242 decision properly. But there are times (e.g., with
1243 enums in nested classes) when we do need to call
1244 this fn at parse time. So, in those cases, we pass
1245 complain as a 0 and just return a NULL_TREE. */
1246 cp_error ("assignment to non-static member `%D' of enclosing class `%T'",
1247 id, DECL_CONTEXT (t));
1248 /* Mark this for do_identifier(). It would otherwise
1249 claim that the variable was undeclared. */
1250 TREE_TYPE (id) = error_mark_node;
1251 }
1252 else
1253 {
1254 id = NULL_TREE;
1255 continue;
1256 }
1257 }
1258 break;
1259 }
1260 }
1261 }
1262
1263 return id;
1264 }
1265
1266 /* TYPE is a class type. Return the index of the fields within
1267 the method vector with name NAME, or -1 is no such field exists. */
1268
1269 static int
1270 lookup_fnfields_1 (type, name)
1271 tree type, name;
1272 {
1273 register tree method_vec = CLASSTYPE_METHOD_VEC (type);
1274
1275 if (method_vec != 0)
1276 {
1277 register tree *methods = &TREE_VEC_ELT (method_vec, 0);
1278 register tree *end = TREE_VEC_END (method_vec);
1279
1280 #ifdef GATHER_STATISTICS
1281 n_calls_lookup_fnfields_1++;
1282 #endif /* GATHER_STATISTICS */
1283
1284 /* Constructors are first... */
1285 if (*methods && name == ctor_identifier)
1286 return 0;
1287
1288 /* and destructors are second. */
1289 if (*++methods && name == dtor_identifier)
1290 return 1;
1291
1292 while (++methods != end && *methods)
1293 {
1294 #ifdef GATHER_STATISTICS
1295 n_outer_fields_searched++;
1296 #endif /* GATHER_STATISTICS */
1297 if (DECL_NAME (OVL_CURRENT (*methods)) == name)
1298 break;
1299 }
1300
1301 /* If we didn't find it, it might have been a template
1302 conversion operator. (Note that we don't look for this case
1303 above so that we will always find specializations first.) */
1304 if ((methods == end || !*methods)
1305 && IDENTIFIER_TYPENAME_P (name))
1306 {
1307 methods = &TREE_VEC_ELT (method_vec, 0) + 1;
1308
1309 while (++methods != end && *methods)
1310 {
1311 tree method_name = DECL_NAME (OVL_CURRENT (*methods));
1312
1313 if (!IDENTIFIER_TYPENAME_P (method_name))
1314 {
1315 /* Since all conversion operators come first, we know
1316 there is no such operator. */
1317 methods = end;
1318 break;
1319 }
1320 else if (TREE_CODE (OVL_CURRENT (*methods)) == TEMPLATE_DECL)
1321 break;
1322 }
1323 }
1324
1325 if (methods != end && *methods)
1326 return methods - &TREE_VEC_ELT (method_vec, 0);
1327 }
1328
1329 return -1;
1330 }
1331
1332 /* Starting from BASETYPE, return a TREE_BASELINK-like object
1333 which gives the following information (in a list):
1334
1335 TREE_TYPE: list of basetypes needed to get to...
1336 TREE_VALUE: list of all functions in a given type
1337 which have name NAME.
1338
1339 No access information is computed by this function,
1340 other then to adorn the list of basetypes with
1341 TREE_VIA_PUBLIC.
1342
1343 If there are two ways to find a name (two members), if COMPLAIN is
1344 non-zero, then error_mark_node is returned, and an error message is
1345 printed, otherwise, just an error_mark_node is returned.
1346
1347 As a special case, is COMPLAIN is -1, we don't complain, and we
1348 don't return error_mark_node, but rather the complete list of
1349 virtuals. This is used by get_virtuals_named_this. */
1350
1351 tree
1352 lookup_fnfields (basetype_path, name, complain)
1353 tree basetype_path, name;
1354 int complain;
1355 {
1356 int head = 0, tail = 0;
1357 tree type, rval, rval_binfo = NULL_TREE, rvals = NULL_TREE;
1358 tree rval_binfo_h = NULL_TREE, binfo, basetype_chain, binfo_h;
1359 int idx, find_all = 0;
1360
1361 /* rval_binfo is the binfo associated with the found member, note,
1362 this can be set with useful information, even when rval is not
1363 set, because it must deal with ALL members, not just function
1364 members. It is used for ambiguity checking and the hidden
1365 checks. Whereas rval is only set if a proper (not hidden)
1366 function member is found. */
1367
1368 /* rval_binfo_h and binfo_h are binfo values used when we perform the
1369 hiding checks, as virtual base classes may not be shared. The strategy
1370 is we always go into the binfo hierarchy owned by TYPE_BINFO of
1371 virtual base classes, as we cross virtual base class lines. This way
1372 we know that binfo of a virtual base class will always == itself when
1373 found along any line. (mrs) */
1374
1375 /* For now, don't try this. */
1376 int protect = complain;
1377
1378 char *errstr = 0;
1379
1380 if (complain == -1)
1381 {
1382 find_all = 1;
1383 protect = complain = 0;
1384 }
1385
1386 #if 0
1387 /* We cannot search for constructor/destructor names like this. */
1388 /* This can't go here, but where should it go? */
1389 /* If we are looking for a constructor in a templated type, use the
1390 unspecialized name, as that is how we store it. */
1391 if (IDENTIFIER_TEMPLATE (name))
1392 name = constructor_name (name);
1393 #endif
1394
1395 binfo = basetype_path;
1396 binfo_h = binfo;
1397 type = complete_type (BINFO_TYPE (basetype_path));
1398
1399 #ifdef GATHER_STATISTICS
1400 n_calls_lookup_fnfields++;
1401 #endif /* GATHER_STATISTICS */
1402
1403 idx = lookup_fnfields_here (type, name);
1404 if (idx >= 0 || lookup_field_1 (type, name))
1405 {
1406 rval_binfo = basetype_path;
1407 rval_binfo_h = rval_binfo;
1408 }
1409
1410 if (idx >= 0)
1411 {
1412 rval = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), idx);
1413 rvals = scratch_tree_cons (basetype_path, rval, rvals);
1414 if (BINFO_BASETYPES (binfo) && CLASSTYPE_BASELINK_VEC (type))
1415 TREE_TYPE (rvals) = TREE_VEC_ELT (CLASSTYPE_BASELINK_VEC (type), idx);
1416
1417 return rvals;
1418 }
1419 rval = NULL_TREE;
1420
1421 if (name == ctor_identifier || name == dtor_identifier)
1422 {
1423 /* Don't allow lookups of constructors and destructors to go
1424 deeper than the first place we look. */
1425 return NULL_TREE;
1426 }
1427
1428 if (basetype_path == TYPE_BINFO (type))
1429 {
1430 basetype_chain = CLASSTYPE_BINFO_AS_LIST (type);
1431 my_friendly_assert (BINFO_INHERITANCE_CHAIN (basetype_path) == NULL_TREE,
1432 980827);
1433 }
1434 else
1435 basetype_chain = build_expr_list (NULL_TREE, basetype_path);
1436
1437 /* The ambiguity check relies upon breadth first searching. */
1438
1439 search_stack = push_search_level (search_stack, &search_obstack);
1440 binfo = basetype_path;
1441 binfo_h = binfo;
1442
1443 while (1)
1444 {
1445 tree binfos = BINFO_BASETYPES (binfo);
1446 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
1447 int idx;
1448
1449 /* Process and/or queue base types. */
1450 for (i = 0; i < n_baselinks; i++)
1451 {
1452 tree base_binfo = TREE_VEC_ELT (binfos, i);
1453 if (BINFO_FIELDS_MARKED (base_binfo) == 0)
1454 {
1455 tree btypes;
1456
1457 SET_BINFO_FIELDS_MARKED (base_binfo);
1458 btypes = scratch_tree_cons (NULL_TREE, base_binfo, basetype_chain);
1459 if (TREE_VIA_VIRTUAL (base_binfo))
1460 btypes = scratch_tree_cons (NULL_TREE,
1461 TYPE_BINFO (BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (binfo_h), i))),
1462 btypes);
1463 else
1464 btypes = scratch_tree_cons (NULL_TREE,
1465 TREE_VEC_ELT (BINFO_BASETYPES (binfo_h), i),
1466 btypes);
1467 obstack_ptr_grow (&search_obstack, btypes);
1468 tail += 1;
1469 if (tail >= search_stack->limit)
1470 my_friendly_abort (99);
1471 }
1472 }
1473
1474 /* Process head of queue, if one exists. */
1475 if (head >= tail)
1476 break;
1477
1478 basetype_chain = search_stack->first[head++];
1479 binfo_h = TREE_VALUE (basetype_chain);
1480 basetype_chain = TREE_CHAIN (basetype_chain);
1481 basetype_path = TREE_VALUE (basetype_chain);
1482 if (TREE_CHAIN (basetype_chain))
1483 my_friendly_assert
1484 ((BINFO_INHERITANCE_CHAIN (basetype_path)
1485 == TREE_VALUE (TREE_CHAIN (basetype_chain)))
1486 /* We only approximate base info for partial instantiations. */
1487 || current_template_parms,
1488 980827);
1489 else
1490 my_friendly_assert (BINFO_INHERITANCE_CHAIN (basetype_path)
1491 == NULL_TREE, 980827);
1492
1493 binfo = basetype_path;
1494 type = BINFO_TYPE (binfo);
1495
1496 /* See if we can find NAME in TYPE. If RVAL is nonzero,
1497 and we do find NAME in TYPE, verify that such a second
1498 sighting is in fact valid. */
1499
1500 idx = lookup_fnfields_here (type, name);
1501
1502 if (idx >= 0 || (lookup_field_1 (type, name)!=NULL_TREE && !find_all))
1503 {
1504 if (rval_binfo && !find_all && hides (rval_binfo_h, binfo_h))
1505 {
1506 /* This is ok, the member found is in rval_binfo, not
1507 here (binfo). */
1508 }
1509 else if (rval_binfo==NULL_TREE || find_all || hides (binfo_h, rval_binfo_h))
1510 {
1511 /* This is ok, the member found is here (binfo), not in
1512 rval_binfo. */
1513 if (idx >= 0)
1514 {
1515 rval = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), idx);
1516 /* Note, rvals can only be previously set if find_all is
1517 true. */
1518 rvals = scratch_tree_cons (basetype_path, rval, rvals);
1519 if (TYPE_BINFO_BASETYPES (type)
1520 && CLASSTYPE_BASELINK_VEC (type))
1521 TREE_TYPE (rvals) = TREE_VEC_ELT (CLASSTYPE_BASELINK_VEC (type), idx);
1522 }
1523 else
1524 {
1525 /* Undo finding it before, as something else hides it. */
1526 rval = NULL_TREE;
1527 rvals = NULL_TREE;
1528 }
1529 rval_binfo = binfo;
1530 rval_binfo_h = binfo_h;
1531 }
1532 else
1533 {
1534 /* This is ambiguous. */
1535 errstr = "request for method `%D' is ambiguous";
1536 rvals = error_mark_node;
1537 break;
1538 }
1539 }
1540 }
1541 {
1542 tree *tp = search_stack->first;
1543 tree *search_tail = tp + tail;
1544
1545 while (tp < search_tail)
1546 {
1547 CLEAR_BINFO_FIELDS_MARKED (TREE_VALUE (TREE_CHAIN (*tp)));
1548 tp += 1;
1549 }
1550 }
1551 search_stack = pop_search_level (search_stack);
1552
1553 if (errstr && protect)
1554 {
1555 cp_error (errstr, name);
1556 rvals = error_mark_node;
1557 }
1558
1559 return rvals;
1560 }
1561
1562 /* Look for a field or function named NAME in an inheritance lattice
1563 dominated by XBASETYPE. PROTECT is zero if we can avoid computing
1564 access information, otherwise it is 1. WANT_TYPE is 1 when we should
1565 only return TYPE_DECLs, if no TYPE_DECL can be found return NULL_TREE. */
1566
1567 tree
1568 lookup_member (xbasetype, name, protect, want_type)
1569 tree xbasetype, name;
1570 int protect, want_type;
1571 {
1572 tree ret, basetype_path;
1573
1574 if (TREE_CODE (xbasetype) == TREE_VEC)
1575 basetype_path = xbasetype;
1576 else if (IS_AGGR_TYPE_CODE (TREE_CODE (xbasetype)))
1577 {
1578 basetype_path = TYPE_BINFO (xbasetype);
1579 my_friendly_assert (BINFO_INHERITANCE_CHAIN (basetype_path)
1580 == NULL_TREE, 980827);
1581 }
1582 else
1583 my_friendly_abort (97);
1584
1585 ret = lookup_field (basetype_path, name, protect, want_type);
1586 if (! ret && ! want_type)
1587 ret = lookup_fnfields (basetype_path, name, protect);
1588 return ret;
1589 }
1590 \f
1591 /* BREADTH-FIRST SEARCH ROUTINES. */
1592
1593 /* Search a multiple inheritance hierarchy by breadth-first search.
1594
1595 BINFO is an aggregate type, possibly in a multiple-inheritance hierarchy.
1596 TESTFN is a function, which, if true, means that our condition has been met,
1597 and its return value should be returned.
1598 QFN, if non-NULL, is a predicate dictating whether the type should
1599 even be queued. */
1600
1601 static HOST_WIDE_INT
1602 breadth_first_search (binfo, testfn, qfn)
1603 tree binfo;
1604 int (*testfn) PROTO((tree, int));
1605 int (*qfn) PROTO((tree, int));
1606 {
1607 int head = 0, tail = 0;
1608 int rval = 0;
1609
1610 search_stack = push_search_level (search_stack, &search_obstack);
1611
1612 while (1)
1613 {
1614 tree binfos = BINFO_BASETYPES (binfo);
1615 int n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
1616 int i;
1617
1618 /* Process and/or queue base types. */
1619 for (i = 0; i < n_baselinks; i++)
1620 {
1621 tree base_binfo = TREE_VEC_ELT (binfos, i);
1622
1623 if (BINFO_MARKED (base_binfo) == 0
1624 && (qfn == 0 || (*qfn) (binfo, i)))
1625 {
1626 SET_BINFO_MARKED (base_binfo);
1627 obstack_ptr_grow (&search_obstack, binfo);
1628 obstack_ptr_grow (&search_obstack, (HOST_WIDE_INT) i);
1629 tail += 2;
1630 if (tail >= search_stack->limit)
1631 my_friendly_abort (100);
1632 }
1633 }
1634 /* Process head of queue, if one exists. */
1635 if (head >= tail)
1636 {
1637 rval = 0;
1638 break;
1639 }
1640
1641 binfo = search_stack->first[head++];
1642 i = (HOST_WIDE_INT) search_stack->first[head++];
1643 if ((rval = (*testfn) (binfo, i)))
1644 break;
1645 binfo = BINFO_BASETYPE (binfo, i);
1646 }
1647 {
1648 tree *tp = search_stack->first;
1649 tree *search_tail = tp + tail;
1650 while (tp < search_tail)
1651 {
1652 tree binfo = *tp++;
1653 int i = (HOST_WIDE_INT)(*tp++);
1654 CLEAR_BINFO_MARKED (BINFO_BASETYPE (binfo, i));
1655 }
1656 }
1657
1658 search_stack = pop_search_level (search_stack);
1659 return rval;
1660 }
1661
1662 /* Functions to use in breadth first searches. */
1663 typedef int (*pfi) PROTO((tree, int));
1664
1665 static tree declarator;
1666
1667 static tree
1668 get_virtuals_named_this (binfo)
1669 tree binfo;
1670 {
1671 tree fields;
1672
1673 fields = lookup_fnfields (binfo, declarator, -1);
1674 /* fields cannot be error_mark_node */
1675
1676 if (fields == 0)
1677 return 0;
1678
1679 /* Get to the function decls, and return the first virtual function
1680 with this name, if there is one. */
1681 while (fields)
1682 {
1683 tree fndecl;
1684
1685 for (fndecl = TREE_VALUE (fields); fndecl; fndecl = OVL_NEXT (fndecl))
1686 if (DECL_VINDEX (OVL_CURRENT (fndecl)))
1687 return fields;
1688 fields = next_baselink (fields);
1689 }
1690 return NULL_TREE;
1691 }
1692
1693 static tree
1694 get_virtual_destructor (binfo, i)
1695 tree binfo;
1696 int i;
1697 {
1698 tree type = BINFO_TYPE (binfo);
1699 if (i >= 0)
1700 type = BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (binfo), i));
1701 if (TYPE_HAS_DESTRUCTOR (type)
1702 && DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), 1)))
1703 return TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), 1);
1704 return 0;
1705 }
1706
1707 static int
1708 tree_has_any_destructor_p (binfo, i)
1709 tree binfo;
1710 int i;
1711 {
1712 tree type = BINFO_TYPE (binfo);
1713 if (i >= 0)
1714 type = BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (binfo), i));
1715 return TYPE_NEEDS_DESTRUCTOR (type);
1716 }
1717
1718 /* Returns > 0 if a function with type DRETTYPE overriding a function
1719 with type BRETTYPE is covariant, as defined in [class.virtual].
1720
1721 Returns 1 if trivial covariance, 2 if non-trivial (requiring runtime
1722 adjustment), or -1 if pedantically invalid covariance. */
1723
1724 static int
1725 covariant_return_p (brettype, drettype)
1726 tree brettype, drettype;
1727 {
1728 tree binfo;
1729
1730 if (TREE_CODE (brettype) == FUNCTION_DECL
1731 || TREE_CODE (brettype) == THUNK_DECL)
1732 {
1733 brettype = TREE_TYPE (TREE_TYPE (brettype));
1734 drettype = TREE_TYPE (TREE_TYPE (drettype));
1735 }
1736 else if (TREE_CODE (brettype) == METHOD_TYPE)
1737 {
1738 brettype = TREE_TYPE (brettype);
1739 drettype = TREE_TYPE (drettype);
1740 }
1741
1742 if (comptypes (brettype, drettype, 1))
1743 return 0;
1744
1745 if (! (TREE_CODE (brettype) == TREE_CODE (drettype)
1746 && (TREE_CODE (brettype) == POINTER_TYPE
1747 || TREE_CODE (brettype) == REFERENCE_TYPE)
1748 && TYPE_READONLY (brettype) == TYPE_READONLY (drettype)
1749 && TYPE_VOLATILE (brettype) == TYPE_VOLATILE (drettype)))
1750 return 0;
1751
1752 if (! can_convert (brettype, drettype))
1753 return 0;
1754
1755 brettype = TREE_TYPE (brettype);
1756 drettype = TREE_TYPE (drettype);
1757
1758 /* If not pedantic, allow any standard pointer conversion. */
1759 if (! IS_AGGR_TYPE (drettype) || ! IS_AGGR_TYPE (brettype))
1760 return -1;
1761
1762 binfo = get_binfo (brettype, drettype, 1);
1763
1764 /* If we get an error_mark_node from get_binfo, it already complained,
1765 so let's just succeed. */
1766 if (binfo == error_mark_node)
1767 return 1;
1768
1769 if (! BINFO_OFFSET_ZEROP (binfo) || TREE_VIA_VIRTUAL (binfo))
1770 return 2;
1771 return 1;
1772 }
1773
1774 /* Given a class type TYPE, and a function decl FNDECL, look for a
1775 virtual function in TYPE's hierarchy which FNDECL could match as a
1776 virtual function. It doesn't matter which one we find.
1777
1778 DTORP is nonzero if we are looking for a destructor. Destructors
1779 need special treatment because they do not match by name. */
1780
1781 tree
1782 get_matching_virtual (binfo, fndecl, dtorp)
1783 tree binfo, fndecl;
1784 int dtorp;
1785 {
1786 tree tmp = NULL_TREE;
1787 int i;
1788
1789 if (TREE_CODE (fndecl) == TEMPLATE_DECL)
1790 /* In [temp.mem] we have:
1791
1792 A specialization of a member function template does not
1793 override a virtual function from a base class. */
1794 return NULL_TREE;
1795
1796 /* Breadth first search routines start searching basetypes
1797 of TYPE, so we must perform first ply of search here. */
1798 if (dtorp)
1799 {
1800 if (tree_has_any_destructor_p (binfo, -1))
1801 tmp = get_virtual_destructor (binfo, -1);
1802
1803 if (tmp)
1804 return tmp;
1805
1806 tmp = (tree) breadth_first_search (binfo,
1807 (pfi) get_virtual_destructor,
1808 tree_has_any_destructor_p);
1809 return tmp;
1810 }
1811 else
1812 {
1813 tree drettype, dtypes, btypes, instptr_type;
1814 tree basetype = DECL_CLASS_CONTEXT (fndecl);
1815 tree baselink, best = NULL_TREE;
1816 tree name = DECL_ASSEMBLER_NAME (fndecl);
1817
1818 declarator = DECL_NAME (fndecl);
1819 if (IDENTIFIER_VIRTUAL_P (declarator) == 0)
1820 return NULL_TREE;
1821
1822 baselink = get_virtuals_named_this (binfo);
1823 if (baselink == NULL_TREE)
1824 return NULL_TREE;
1825
1826 drettype = TREE_TYPE (TREE_TYPE (fndecl));
1827 dtypes = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1828 if (DECL_STATIC_FUNCTION_P (fndecl))
1829 instptr_type = NULL_TREE;
1830 else
1831 instptr_type = TREE_TYPE (TREE_VALUE (dtypes));
1832
1833 for (; baselink; baselink = next_baselink (baselink))
1834 {
1835 tree tmps;
1836 for (tmps = TREE_VALUE (baselink); tmps; tmps = OVL_NEXT (tmps))
1837 {
1838 tmp = OVL_CURRENT (tmps);
1839 if (! DECL_VINDEX (tmp))
1840 continue;
1841
1842 btypes = TYPE_ARG_TYPES (TREE_TYPE (tmp));
1843 if (instptr_type == NULL_TREE)
1844 {
1845 if (compparms (TREE_CHAIN (btypes), dtypes, 3))
1846 /* Caller knows to give error in this case. */
1847 return tmp;
1848 return NULL_TREE;
1849 }
1850
1851 if ((TYPE_READONLY (TREE_TYPE (TREE_VALUE (btypes)))
1852 == TYPE_READONLY (instptr_type))
1853 && compparms (TREE_CHAIN (btypes), TREE_CHAIN (dtypes), 3))
1854 {
1855 tree brettype = TREE_TYPE (TREE_TYPE (tmp));
1856 if (comptypes (brettype, drettype, 1))
1857 /* OK */;
1858 else if ((i = covariant_return_p (brettype, drettype)))
1859 {
1860 if (i == 2)
1861 sorry ("adjusting pointers for covariant returns");
1862
1863 if (pedantic && i == -1)
1864 {
1865 cp_pedwarn_at ("invalid covariant return type for `%#D' (must be pointer or reference to class)", fndecl);
1866 cp_pedwarn_at (" overriding `%#D'", tmp);
1867 }
1868 }
1869 else if (IS_AGGR_TYPE_2 (brettype, drettype)
1870 && comptypes (brettype, drettype, 0))
1871 {
1872 error ("invalid covariant return type (must use pointer or reference)");
1873 cp_error_at (" overriding `%#D'", tmp);
1874 cp_error_at (" with `%#D'", fndecl);
1875 }
1876 else if (IDENTIFIER_ERROR_LOCUS (name) == NULL_TREE)
1877 {
1878 cp_error_at ("conflicting return type specified for virtual function `%#D'", fndecl);
1879 cp_error_at (" overriding definition as `%#D'", tmp);
1880 SET_IDENTIFIER_ERROR_LOCUS (name, basetype);
1881 }
1882 break;
1883 }
1884 }
1885 /* If not at the end */
1886 if (tmps)
1887 {
1888 best = tmp;
1889 break;
1890 }
1891 }
1892
1893 return best;
1894 }
1895 }
1896
1897 /* Return the list of virtual functions which are abstract in type
1898 TYPE that come from non virtual base classes. See
1899 expand_direct_vtbls_init for the style of search we do. */
1900
1901 static tree
1902 get_abstract_virtuals_1 (binfo, do_self, abstract_virtuals)
1903 tree binfo;
1904 int do_self;
1905 tree abstract_virtuals;
1906 {
1907 tree binfos = BINFO_BASETYPES (binfo);
1908 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
1909
1910 for (i = 0; i < n_baselinks; i++)
1911 {
1912 tree base_binfo = TREE_VEC_ELT (binfos, i);
1913 int is_not_base_vtable
1914 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo));
1915 if (! TREE_VIA_VIRTUAL (base_binfo))
1916 abstract_virtuals
1917 = get_abstract_virtuals_1 (base_binfo, is_not_base_vtable,
1918 abstract_virtuals);
1919 }
1920 /* Should we use something besides CLASSTYPE_VFIELDS? */
1921 if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
1922 {
1923 tree virtuals = BINFO_VIRTUALS (binfo);
1924
1925 skip_rtti_stuff (&virtuals);
1926
1927 while (virtuals)
1928 {
1929 tree base_pfn = FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals));
1930 tree base_fndecl = TREE_OPERAND (base_pfn, 0);
1931 if (DECL_ABSTRACT_VIRTUAL_P (base_fndecl))
1932 abstract_virtuals = tree_cons (NULL_TREE, base_fndecl, abstract_virtuals);
1933 virtuals = TREE_CHAIN (virtuals);
1934 }
1935 }
1936 return abstract_virtuals;
1937 }
1938
1939 /* Return the list of virtual functions which are abstract in type TYPE.
1940 This information is cached, and so must be built on a
1941 non-temporary obstack. */
1942
1943 tree
1944 get_abstract_virtuals (type)
1945 tree type;
1946 {
1947 tree vbases;
1948 tree abstract_virtuals = CLASSTYPE_ABSTRACT_VIRTUALS (type);
1949
1950 /* First get all from non-virtual bases. */
1951 abstract_virtuals
1952 = get_abstract_virtuals_1 (TYPE_BINFO (type), 1, abstract_virtuals);
1953
1954 for (vbases = CLASSTYPE_VBASECLASSES (type); vbases; vbases = TREE_CHAIN (vbases))
1955 {
1956 tree virtuals = BINFO_VIRTUALS (vbases);
1957
1958 skip_rtti_stuff (&virtuals);
1959
1960 while (virtuals)
1961 {
1962 tree base_pfn = FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals));
1963 tree base_fndecl = TREE_OPERAND (base_pfn, 0);
1964 if (DECL_ABSTRACT_VIRTUAL_P (base_fndecl))
1965 abstract_virtuals = tree_cons (NULL_TREE, base_fndecl, abstract_virtuals);
1966 virtuals = TREE_CHAIN (virtuals);
1967 }
1968 }
1969 return nreverse (abstract_virtuals);
1970 }
1971
1972 /* For the type TYPE, return a list of member functions available from
1973 base classes with name NAME. The TREE_VALUE of the list is a chain of
1974 member functions with name NAME. The TREE_PURPOSE of the list is a
1975 basetype, or a list of base types (in reverse order) which were
1976 traversed to reach the chain of member functions. If we reach a base
1977 type which provides a member function of name NAME, and which has at
1978 most one base type itself, then we can terminate the search. */
1979
1980 tree
1981 get_baselinks (type_as_binfo_list, type, name)
1982 tree type_as_binfo_list;
1983 tree type, name;
1984 {
1985 int head = 0, tail = 0, idx;
1986 tree rval = 0, nval = 0;
1987 tree basetypes = type_as_binfo_list;
1988 tree binfo = TYPE_BINFO (type);
1989
1990 search_stack = push_search_level (search_stack, &search_obstack);
1991
1992 while (1)
1993 {
1994 tree binfos = BINFO_BASETYPES (binfo);
1995 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
1996
1997 /* Process and/or queue base types. */
1998 for (i = 0; i < n_baselinks; i++)
1999 {
2000 tree base_binfo = TREE_VEC_ELT (binfos, i);
2001 tree btypes;
2002
2003 btypes = hash_tree_cons (TREE_VIA_PUBLIC (base_binfo),
2004 TREE_VIA_VIRTUAL (base_binfo),
2005 TREE_VIA_PROTECTED (base_binfo),
2006 NULL_TREE, base_binfo,
2007 basetypes);
2008 obstack_ptr_grow (&search_obstack, btypes);
2009 search_stack->first = (tree *)obstack_base (&search_obstack);
2010 tail += 1;
2011 }
2012
2013 dont_queue:
2014 /* Process head of queue, if one exists. */
2015 if (head >= tail)
2016 break;
2017
2018 basetypes = search_stack->first[head++];
2019 binfo = TREE_VALUE (basetypes);
2020 type = BINFO_TYPE (binfo);
2021 idx = lookup_fnfields_1 (type, name);
2022 if (idx >= 0)
2023 {
2024 nval = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), idx);
2025 rval = hash_tree_cons (0, 0, 0, basetypes, nval, rval);
2026 if (TYPE_BINFO_BASETYPES (type) == 0)
2027 goto dont_queue;
2028 else if (TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type)) == 1)
2029 {
2030 if (CLASSTYPE_BASELINK_VEC (type))
2031 TREE_TYPE (rval) = TREE_VEC_ELT (CLASSTYPE_BASELINK_VEC (type), idx);
2032 goto dont_queue;
2033 }
2034 }
2035 nval = NULL_TREE;
2036 }
2037
2038 search_stack = pop_search_level (search_stack);
2039 return rval;
2040 }
2041
2042 tree
2043 next_baselink (baselink)
2044 tree baselink;
2045 {
2046 tree tmp = TREE_TYPE (baselink);
2047 baselink = TREE_CHAIN (baselink);
2048 while (tmp)
2049 {
2050 /* @@ does not yet add previous base types. */
2051 baselink = tree_cons (TREE_PURPOSE (tmp), TREE_VALUE (tmp),
2052 baselink);
2053 TREE_TYPE (baselink) = TREE_TYPE (tmp);
2054 tmp = TREE_CHAIN (tmp);
2055 }
2056 return baselink;
2057 }
2058 \f
2059 /* DEPTH-FIRST SEARCH ROUTINES. */
2060
2061 /* This routine converts a pointer to be a pointer of an immediate
2062 base class. The normal convert_pointer_to routine would diagnose
2063 the conversion as ambiguous, under MI code that has the base class
2064 as an ambiguous base class. */
2065
2066 static tree
2067 convert_pointer_to_single_level (to_type, expr)
2068 tree to_type, expr;
2069 {
2070 tree binfo_of_derived;
2071 tree last;
2072
2073 binfo_of_derived = TYPE_BINFO (TREE_TYPE (TREE_TYPE (expr)));
2074 last = get_binfo (to_type, TREE_TYPE (TREE_TYPE (expr)), 0);
2075 my_friendly_assert (BINFO_INHERITANCE_CHAIN (last) == binfo_of_derived,
2076 980827);
2077 my_friendly_assert (BINFO_INHERITANCE_CHAIN (binfo_of_derived) == NULL_TREE,
2078 980827);
2079 return build_vbase_path (PLUS_EXPR, build_pointer_type (to_type), expr,
2080 last, 1);
2081 }
2082
2083 /* The main function which implements depth first search.
2084
2085 This routine has to remember the path it walked up, when
2086 dfs_init_vbase_pointers is the work function, as otherwise there
2087 would be no record. */
2088
2089 static void
2090 dfs_walk (binfo, fn, qfn)
2091 tree binfo;
2092 void (*fn) PROTO((tree));
2093 int (*qfn) PROTO((tree));
2094 {
2095 tree binfos = BINFO_BASETYPES (binfo);
2096 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2097
2098 for (i = 0; i < n_baselinks; i++)
2099 {
2100 tree base_binfo = TREE_VEC_ELT (binfos, i);
2101
2102 if (qfn == 0 || (*qfn)(base_binfo))
2103 {
2104 if (TREE_CODE (BINFO_TYPE (base_binfo)) == TEMPLATE_TYPE_PARM
2105 || TREE_CODE (BINFO_TYPE (base_binfo)) == TEMPLATE_TEMPLATE_PARM)
2106 /* Pass */;
2107 else if (fn == dfs_init_vbase_pointers)
2108 {
2109 /* When traversing an arbitrary MI hierarchy, we need to keep
2110 a record of the path we took to get down to the final base
2111 type, as otherwise there would be no record of it, and just
2112 trying to blindly convert at the bottom would be ambiguous.
2113
2114 The easiest way is to do the conversions one step at a time,
2115 as we know we want the immediate base class at each step.
2116
2117 The only special trick to converting one step at a time,
2118 is that when we hit the last virtual base class, we must
2119 use the SLOT value for it, and not use the normal convert
2120 routine. We use the last virtual base class, as in our
2121 implementation, we have pointers to all virtual base
2122 classes in the base object. */
2123
2124 tree saved_vbase_decl_ptr_intermediate
2125 = vbase_decl_ptr_intermediate;
2126
2127 if (TREE_VIA_VIRTUAL (base_binfo))
2128 {
2129 /* No need for the conversion here, as we know it is the
2130 right type. */
2131 vbase_decl_ptr_intermediate
2132 = CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (base_binfo));
2133 }
2134 else
2135 {
2136 vbase_decl_ptr_intermediate
2137 = convert_pointer_to_single_level (BINFO_TYPE (base_binfo),
2138 vbase_decl_ptr_intermediate);
2139 }
2140
2141 dfs_walk (base_binfo, fn, qfn);
2142
2143 vbase_decl_ptr_intermediate = saved_vbase_decl_ptr_intermediate;
2144 }
2145 else
2146 dfs_walk (base_binfo, fn, qfn);
2147 }
2148 }
2149
2150 fn (binfo);
2151 }
2152
2153 /* Like dfs_walk, but only walk until fn returns something, and return
2154 that. We also use the real vbase binfos instead of the placeholders
2155 in the normal binfo hierarchy. START is the most-derived type for this
2156 hierarchy, so that we can find the vbase binfos. */
2157
2158 static tree
2159 dfs_search (binfo, fn, start)
2160 tree binfo, start;
2161 tree (*fn) PROTO((tree));
2162 {
2163 tree binfos = BINFO_BASETYPES (binfo);
2164 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2165 tree retval;
2166
2167 for (i = 0; i < n_baselinks; i++)
2168 {
2169 tree base_binfo = TREE_VEC_ELT (binfos, i);
2170
2171 if (TREE_CODE (BINFO_TYPE (base_binfo)) == TEMPLATE_TYPE_PARM
2172 || TREE_CODE (BINFO_TYPE (base_binfo)) == TEMPLATE_TEMPLATE_PARM)
2173 /* Pass */;
2174 else
2175 {
2176 if (TREE_VIA_VIRTUAL (base_binfo) && start)
2177 base_binfo = binfo_member (BINFO_TYPE (base_binfo),
2178 CLASSTYPE_VBASECLASSES (start));
2179 retval = dfs_search (base_binfo, fn, start);
2180 if (retval)
2181 return retval;
2182 }
2183 }
2184
2185 return fn (binfo);
2186 }
2187
2188 static int markedp (binfo) tree binfo;
2189 { return BINFO_MARKED (binfo); }
2190 static int unmarkedp (binfo) tree binfo;
2191 { return BINFO_MARKED (binfo) == 0; }
2192
2193 #if 0
2194 static int bfs_markedp (binfo, i) tree binfo; int i;
2195 { return BINFO_MARKED (BINFO_BASETYPE (binfo, i)); }
2196 static int bfs_unmarkedp (binfo, i) tree binfo; int i;
2197 { return BINFO_MARKED (BINFO_BASETYPE (binfo, i)) == 0; }
2198 static int bfs_marked_vtable_pathp (binfo, i) tree binfo; int i;
2199 { return BINFO_VTABLE_PATH_MARKED (BINFO_BASETYPE (binfo, i)); }
2200 static int bfs_unmarked_vtable_pathp (binfo, i) tree binfo; int i;
2201 { return BINFO_VTABLE_PATH_MARKED (BINFO_BASETYPE (binfo, i)) == 0; }
2202 static int bfs_marked_new_vtablep (binfo, i) tree binfo; int i;
2203 { return BINFO_NEW_VTABLE_MARKED (BINFO_BASETYPE (binfo, i)); }
2204 static int bfs_unmarked_new_vtablep (binfo, i) tree binfo; int i;
2205 { return BINFO_NEW_VTABLE_MARKED (BINFO_BASETYPE (binfo, i)) == 0; }
2206 #endif
2207
2208 static int marked_vtable_pathp (binfo) tree binfo;
2209 { return BINFO_VTABLE_PATH_MARKED (binfo); }
2210 static int unmarked_vtable_pathp (binfo) tree binfo;
2211 { return BINFO_VTABLE_PATH_MARKED (binfo) == 0; }
2212 static int marked_new_vtablep (binfo) tree binfo;
2213 { return BINFO_NEW_VTABLE_MARKED (binfo); }
2214 static int unmarked_new_vtablep (binfo) tree binfo;
2215 { return BINFO_NEW_VTABLE_MARKED (binfo) == 0; }
2216 static int marked_pushdecls_p (binfo) tree binfo;
2217 { return BINFO_PUSHDECLS_MARKED (binfo); }
2218 static int unmarked_pushdecls_p (binfo) tree binfo;
2219 { return BINFO_PUSHDECLS_MARKED (binfo) == 0; }
2220
2221 #if 0
2222 static int dfs_search_slot_nonempty_p (binfo) tree binfo;
2223 { return CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (binfo)) != 0; }
2224 #endif
2225
2226 static int dfs_debug_unmarkedp (binfo) tree binfo;
2227 { return CLASSTYPE_DEBUG_REQUESTED (BINFO_TYPE (binfo)) == 0; }
2228
2229 /* The worker functions for `dfs_walk'. These do not need to
2230 test anything (vis a vis marking) if they are paired with
2231 a predicate function (above). */
2232
2233 #if 0
2234 static void
2235 dfs_mark (binfo) tree binfo;
2236 { SET_BINFO_MARKED (binfo); }
2237 #endif
2238
2239 static void
2240 dfs_unmark (binfo) tree binfo;
2241 { CLEAR_BINFO_MARKED (binfo); }
2242
2243 #if 0
2244 static void
2245 dfs_mark_vtable_path (binfo) tree binfo;
2246 { SET_BINFO_VTABLE_PATH_MARKED (binfo); }
2247
2248 static void
2249 dfs_unmark_vtable_path (binfo) tree binfo;
2250 { CLEAR_BINFO_VTABLE_PATH_MARKED (binfo); }
2251
2252 static void
2253 dfs_mark_new_vtable (binfo) tree binfo;
2254 { SET_BINFO_NEW_VTABLE_MARKED (binfo); }
2255
2256 static void
2257 dfs_unmark_new_vtable (binfo) tree binfo;
2258 { CLEAR_BINFO_NEW_VTABLE_MARKED (binfo); }
2259
2260 static void
2261 dfs_clear_search_slot (binfo) tree binfo;
2262 { CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (binfo)) = 0; }
2263 #endif
2264
2265 static void
2266 dfs_debug_mark (binfo)
2267 tree binfo;
2268 {
2269 tree t = BINFO_TYPE (binfo);
2270
2271 /* Use heuristic that if there are virtual functions,
2272 ignore until we see a non-inline virtual function. */
2273 tree methods = CLASSTYPE_METHOD_VEC (t);
2274
2275 CLASSTYPE_DEBUG_REQUESTED (t) = 1;
2276
2277 if (methods == 0)
2278 return;
2279
2280 /* If interface info is known, either we've already emitted the debug
2281 info or we don't need to. */
2282 if (CLASSTYPE_INTERFACE_KNOWN (t))
2283 return;
2284
2285 /* If debug info is requested from this context for this type, supply it.
2286 If debug info is requested from another context for this type,
2287 see if some third context can supply it. */
2288 if (current_function_decl == NULL_TREE
2289 || DECL_CLASS_CONTEXT (current_function_decl) != t)
2290 {
2291 if (TREE_VEC_ELT (methods, 1))
2292 methods = TREE_VEC_ELT (methods, 1);
2293 else if (TREE_VEC_ELT (methods, 0))
2294 methods = TREE_VEC_ELT (methods, 0);
2295 else
2296 methods = TREE_VEC_ELT (methods, 2);
2297 methods = OVL_CURRENT (methods);
2298 while (methods)
2299 {
2300 if (DECL_VINDEX (methods)
2301 && DECL_THIS_INLINE (methods) == 0
2302 && DECL_ABSTRACT_VIRTUAL_P (methods) == 0)
2303 {
2304 /* Somebody, somewhere is going to have to define this
2305 virtual function. When they do, they will provide
2306 the debugging info. */
2307 return;
2308 }
2309 methods = TREE_CHAIN (methods);
2310 }
2311 }
2312 /* We cannot rely on some alien method to solve our problems,
2313 so we must write out the debug info ourselves. */
2314 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = 0;
2315 rest_of_type_compilation (t, toplevel_bindings_p ());
2316 }
2317 \f
2318 /* Attach to the type of the virtual base class, the pointer to the
2319 virtual base class, given the global pointer vbase_decl_ptr.
2320
2321 We use the global vbase_types. ICK! */
2322
2323 static void
2324 dfs_find_vbases (binfo)
2325 tree binfo;
2326 {
2327 tree binfos = BINFO_BASETYPES (binfo);
2328 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2329
2330 for (i = n_baselinks-1; i >= 0; i--)
2331 {
2332 tree base_binfo = TREE_VEC_ELT (binfos, i);
2333
2334 if (TREE_VIA_VIRTUAL (base_binfo)
2335 && CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (base_binfo)) == 0)
2336 {
2337 tree vbase = BINFO_TYPE (base_binfo);
2338 tree binfo = binfo_member (vbase, vbase_types);
2339
2340 CLASSTYPE_SEARCH_SLOT (vbase)
2341 = build (PLUS_EXPR, build_pointer_type (vbase),
2342 vbase_decl_ptr, BINFO_OFFSET (binfo));
2343 }
2344 }
2345 SET_BINFO_VTABLE_PATH_MARKED (binfo);
2346 SET_BINFO_NEW_VTABLE_MARKED (binfo);
2347 }
2348
2349 static void
2350 dfs_init_vbase_pointers (binfo)
2351 tree binfo;
2352 {
2353 tree type = BINFO_TYPE (binfo);
2354 tree fields = TYPE_FIELDS (type);
2355 tree this_vbase_ptr;
2356
2357 CLEAR_BINFO_VTABLE_PATH_MARKED (binfo);
2358
2359 #if 0
2360 /* See finish_struct_1 for when we can enable this. */
2361 /* If we have a vtable pointer first, skip it. */
2362 if (VFIELD_NAME_P (DECL_NAME (fields)))
2363 fields = TREE_CHAIN (fields);
2364 #endif
2365
2366 if (fields == NULL_TREE
2367 || DECL_NAME (fields) == NULL_TREE
2368 || ! VBASE_NAME_P (DECL_NAME (fields)))
2369 return;
2370
2371 this_vbase_ptr = vbase_decl_ptr_intermediate;
2372
2373 if (build_pointer_type (type) != TYPE_MAIN_VARIANT (TREE_TYPE (this_vbase_ptr)))
2374 my_friendly_abort (125);
2375
2376 while (fields && DECL_NAME (fields)
2377 && VBASE_NAME_P (DECL_NAME (fields)))
2378 {
2379 tree ref = build (COMPONENT_REF, TREE_TYPE (fields),
2380 build_indirect_ref (this_vbase_ptr, NULL_PTR), fields);
2381 tree init = CLASSTYPE_SEARCH_SLOT (TREE_TYPE (TREE_TYPE (fields)));
2382 vbase_init_result = tree_cons (binfo_member (TREE_TYPE (TREE_TYPE (fields)),
2383 vbase_types),
2384 build_modify_expr (ref, NOP_EXPR, init),
2385 vbase_init_result);
2386 fields = TREE_CHAIN (fields);
2387 }
2388 }
2389
2390 /* Sometimes this needs to clear both VTABLE_PATH and NEW_VTABLE. Other
2391 times, just NEW_VTABLE, but optimizer should make both with equal
2392 efficiency (though it does not currently). */
2393
2394 static void
2395 dfs_clear_vbase_slots (binfo)
2396 tree binfo;
2397 {
2398 tree type = BINFO_TYPE (binfo);
2399 CLASSTYPE_SEARCH_SLOT (type) = 0;
2400 CLEAR_BINFO_VTABLE_PATH_MARKED (binfo);
2401 CLEAR_BINFO_NEW_VTABLE_MARKED (binfo);
2402 }
2403
2404 tree
2405 init_vbase_pointers (type, decl_ptr)
2406 tree type;
2407 tree decl_ptr;
2408 {
2409 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
2410 {
2411 int old_flag = flag_this_is_variable;
2412 tree binfo = TYPE_BINFO (type);
2413 flag_this_is_variable = -2;
2414 vbase_types = CLASSTYPE_VBASECLASSES (type);
2415 vbase_decl_ptr = vbase_decl_ptr_intermediate = decl_ptr;
2416 vbase_init_result = NULL_TREE;
2417 dfs_walk (binfo, dfs_find_vbases, unmarked_vtable_pathp);
2418 dfs_walk (binfo, dfs_init_vbase_pointers, marked_vtable_pathp);
2419 dfs_walk (binfo, dfs_clear_vbase_slots, marked_new_vtablep);
2420 flag_this_is_variable = old_flag;
2421 return vbase_init_result;
2422 }
2423 return 0;
2424 }
2425
2426 /* get the virtual context (the vbase that directly contains the
2427 DECL_CLASS_CONTEXT of the FNDECL) that the given FNDECL is declared in,
2428 or NULL_TREE if there is none.
2429
2430 FNDECL must come from a virtual table from a virtual base to ensure that
2431 there is only one possible DECL_CLASS_CONTEXT.
2432
2433 We know that if there is more than one place (binfo) the fndecl that the
2434 declared, they all refer to the same binfo. See get_class_offset_1 for
2435 the check that ensures this. */
2436
2437 static tree
2438 virtual_context (fndecl, t, vbase)
2439 tree fndecl, t, vbase;
2440 {
2441 tree path;
2442 if (get_base_distance (DECL_CLASS_CONTEXT (fndecl), t, 0, &path) < 0)
2443 {
2444 /* DECL_CLASS_CONTEXT can be ambiguous in t. */
2445 if (get_base_distance (DECL_CLASS_CONTEXT (fndecl), vbase, 0, &path) >= 0)
2446 {
2447 while (path)
2448 {
2449 /* Not sure if checking path == vbase is necessary here, but just in
2450 case it is. */
2451 if (TREE_VIA_VIRTUAL (path) || path == vbase)
2452 return binfo_member (BINFO_TYPE (path), CLASSTYPE_VBASECLASSES (t));
2453 path = BINFO_INHERITANCE_CHAIN (path);
2454 }
2455 }
2456 /* This shouldn't happen, I don't want errors! */
2457 warning ("recoverable compiler error, fixups for virtual function");
2458 return vbase;
2459 }
2460 while (path)
2461 {
2462 if (TREE_VIA_VIRTUAL (path))
2463 return binfo_member (BINFO_TYPE (path), CLASSTYPE_VBASECLASSES (t));
2464 path = BINFO_INHERITANCE_CHAIN (path);
2465 }
2466 return 0;
2467 }
2468
2469 /* Fixups upcast offsets for one vtable.
2470 Entries may stay within the VBASE given, or
2471 they may upcast into a direct base, or
2472 they may upcast into a different vbase.
2473
2474 We only need to do fixups in case 2 and 3. In case 2, we add in
2475 the virtual base offset to effect an upcast, in case 3, we add in
2476 the virtual base offset to effect an upcast, then subtract out the
2477 offset for the other virtual base, to effect a downcast into it.
2478
2479 This routine mirrors fixup_vtable_deltas in functionality, though
2480 this one is runtime based, and the other is compile time based.
2481 Conceivably that routine could be removed entirely, and all fixups
2482 done at runtime.
2483
2484 VBASE_OFFSETS is an association list of virtual bases that contains
2485 offset information for the virtual bases, so the offsets are only
2486 calculated once. The offsets are computed by where we think the
2487 vbase should be (as noted by the CLASSTYPE_SEARCH_SLOT) minus where
2488 the vbase really is. */
2489
2490 static void
2491 expand_upcast_fixups (binfo, addr, orig_addr, vbase, vbase_addr, t,
2492 vbase_offsets)
2493 tree binfo, addr, orig_addr, vbase, vbase_addr, t, *vbase_offsets;
2494 {
2495 tree virtuals = BINFO_VIRTUALS (binfo);
2496 tree vc;
2497 tree delta;
2498 unsigned HOST_WIDE_INT n;
2499
2500 delta = purpose_member (vbase, *vbase_offsets);
2501 if (! delta)
2502 {
2503 delta = CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (vbase));
2504 delta = build (MINUS_EXPR, ptrdiff_type_node, delta, vbase_addr);
2505 delta = save_expr (delta);
2506 delta = tree_cons (vbase, delta, *vbase_offsets);
2507 *vbase_offsets = delta;
2508 }
2509
2510 n = skip_rtti_stuff (&virtuals);
2511
2512 while (virtuals)
2513 {
2514 tree current_fndecl = TREE_VALUE (virtuals);
2515 current_fndecl = FNADDR_FROM_VTABLE_ENTRY (current_fndecl);
2516 current_fndecl = TREE_OPERAND (current_fndecl, 0);
2517 if (current_fndecl
2518 && current_fndecl != abort_fndecl
2519 && (vc=virtual_context (current_fndecl, t, vbase)) != vbase)
2520 {
2521 /* This may in fact need a runtime fixup. */
2522 tree idx = build_int_2 (n, 0);
2523 tree vtbl = BINFO_VTABLE (binfo);
2524 tree nvtbl = lookup_name (DECL_NAME (vtbl), 0);
2525 tree aref, ref, naref;
2526 tree old_delta, new_delta;
2527 tree init;
2528
2529 if (nvtbl == NULL_TREE
2530 || nvtbl == IDENTIFIER_GLOBAL_VALUE (DECL_NAME (vtbl)))
2531 {
2532 /* Dup it if it isn't in local scope yet. */
2533 nvtbl = build_decl
2534 (VAR_DECL, DECL_NAME (vtbl),
2535 TYPE_MAIN_VARIANT (TREE_TYPE (BINFO_VTABLE (binfo))));
2536 DECL_ALIGN (nvtbl) = MAX (TYPE_ALIGN (double_type_node),
2537 DECL_ALIGN (nvtbl));
2538 TREE_READONLY (nvtbl) = 0;
2539 DECL_ARTIFICIAL (nvtbl) = 1;
2540 nvtbl = pushdecl (nvtbl);
2541 init = NULL_TREE;
2542 cp_finish_decl (nvtbl, init, NULL_TREE, 0,
2543 LOOKUP_ONLYCONVERTING);
2544
2545 /* We don't set DECL_VIRTUAL_P and DECL_CONTEXT on nvtbl
2546 because they wouldn't be useful; everything that wants to
2547 look at the vtable will look at the decl for the normal
2548 vtable. Setting DECL_CONTEXT also screws up
2549 decl_function_context. */
2550
2551 init = build (MODIFY_EXPR, TREE_TYPE (nvtbl),
2552 nvtbl, vtbl);
2553 TREE_SIDE_EFFECTS (init) = 1;
2554 expand_expr_stmt (init);
2555 /* Update the vtable pointers as necessary. */
2556 ref = build_vfield_ref
2557 (build_indirect_ref (addr, NULL_PTR),
2558 DECL_CONTEXT (CLASSTYPE_VFIELD (BINFO_TYPE (binfo))));
2559 expand_expr_stmt
2560 (build_modify_expr (ref, NOP_EXPR, nvtbl));
2561 }
2562 assemble_external (vtbl);
2563 aref = build_array_ref (vtbl, idx);
2564 naref = build_array_ref (nvtbl, idx);
2565 old_delta = build_component_ref (aref, delta_identifier,
2566 NULL_TREE, 0);
2567 new_delta = build_component_ref (naref, delta_identifier,
2568 NULL_TREE, 0);
2569
2570 /* This is a upcast, so we have to add the offset for the
2571 virtual base. */
2572 old_delta = build_binary_op (PLUS_EXPR, old_delta,
2573 TREE_VALUE (delta), 0);
2574 if (vc)
2575 {
2576 /* If this is set, we need to subtract out the delta
2577 adjustments for the other virtual base that we
2578 downcast into. */
2579 tree vc_delta = purpose_member (vc, *vbase_offsets);
2580 if (! vc_delta)
2581 {
2582 tree vc_addr = convert_pointer_to_real (vc, orig_addr);
2583 vc_delta = CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (vc));
2584 vc_delta = build (MINUS_EXPR, ptrdiff_type_node,
2585 vc_delta, vc_addr);
2586 vc_delta = save_expr (vc_delta);
2587 *vbase_offsets = tree_cons (vc, vc_delta, *vbase_offsets);
2588 }
2589 else
2590 vc_delta = TREE_VALUE (vc_delta);
2591
2592 /* This is a downcast, so we have to subtract the offset
2593 for the virtual base. */
2594 old_delta = build_binary_op (MINUS_EXPR, old_delta, vc_delta, 0);
2595 }
2596
2597 TREE_READONLY (new_delta) = 0;
2598 TREE_TYPE (new_delta) =
2599 cp_build_type_variant (TREE_TYPE (new_delta), /*constp=*/0,
2600 TYPE_VOLATILE (TREE_TYPE (new_delta)));
2601 expand_expr_stmt (build_modify_expr (new_delta, NOP_EXPR,
2602 old_delta));
2603 }
2604 ++n;
2605 virtuals = TREE_CHAIN (virtuals);
2606 }
2607 }
2608
2609 /* Fixup upcast offsets for all direct vtables. Patterned after
2610 expand_direct_vtbls_init. */
2611
2612 static void
2613 fixup_virtual_upcast_offsets (real_binfo, binfo, init_self, can_elide, addr, orig_addr, type, vbase, vbase_offsets)
2614 tree real_binfo, binfo;
2615 int init_self, can_elide;
2616 tree addr, orig_addr, type, vbase, *vbase_offsets;
2617 {
2618 tree real_binfos = BINFO_BASETYPES (real_binfo);
2619 tree binfos = BINFO_BASETYPES (binfo);
2620 int i, n_baselinks = real_binfos ? TREE_VEC_LENGTH (real_binfos) : 0;
2621
2622 for (i = 0; i < n_baselinks; i++)
2623 {
2624 tree real_base_binfo = TREE_VEC_ELT (real_binfos, i);
2625 tree base_binfo = TREE_VEC_ELT (binfos, i);
2626 int is_not_base_vtable
2627 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (real_binfo));
2628 if (! TREE_VIA_VIRTUAL (real_base_binfo))
2629 fixup_virtual_upcast_offsets (real_base_binfo, base_binfo,
2630 is_not_base_vtable, can_elide, addr,
2631 orig_addr, type, vbase, vbase_offsets);
2632 }
2633 #if 0
2634 /* Before turning this on, make sure it is correct. */
2635 if (can_elide && ! BINFO_MODIFIED (binfo))
2636 return;
2637 #endif
2638 /* Should we use something besides CLASSTYPE_VFIELDS? */
2639 if (init_self && CLASSTYPE_VFIELDS (BINFO_TYPE (real_binfo)))
2640 {
2641 tree new_addr = convert_pointer_to_real (binfo, addr);
2642 expand_upcast_fixups (real_binfo, new_addr, orig_addr, vbase, addr,
2643 type, vbase_offsets);
2644 }
2645 }
2646
2647 /* Build a COMPOUND_EXPR which when expanded will generate the code
2648 needed to initialize all the virtual function table slots of all
2649 the virtual baseclasses. MAIN_BINFO is the binfo which determines
2650 the virtual baseclasses to use; TYPE is the type of the object to
2651 which the initialization applies. TRUE_EXP is the true object we
2652 are initializing, and DECL_PTR is the pointer to the sub-object we
2653 are initializing.
2654
2655 When USE_COMPUTED_OFFSETS is non-zero, we can assume that the
2656 object was laid out by a top-level constructor and the computed
2657 offsets are valid to store vtables. When zero, we must store new
2658 vtables through virtual baseclass pointers.
2659
2660 We setup and use the globals: vbase_decl_ptr, vbase_types
2661 ICK! */
2662
2663 void
2664 expand_indirect_vtbls_init (binfo, true_exp, decl_ptr)
2665 tree binfo;
2666 tree true_exp, decl_ptr;
2667 {
2668 tree type = BINFO_TYPE (binfo);
2669
2670 /* This function executes during the finish_function() segment,
2671 AFTER the auto variables and temporary stack space has been marked
2672 unused...If space is needed for the virtual function tables,
2673 some of them might fit within what the compiler now thinks
2674 are available stack slots... These values are actually initialized at
2675 the beginnning of the function, so when the automatics use their space,
2676 they will overwrite the values that are placed here. Marking all
2677 temporary space as unavailable prevents this from happening. */
2678
2679 mark_all_temps_used();
2680
2681 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
2682 {
2683 rtx fixup_insns = NULL_RTX;
2684 tree vbases = CLASSTYPE_VBASECLASSES (type);
2685 vbase_types = vbases;
2686 vbase_decl_ptr = true_exp ? build_unary_op (ADDR_EXPR, true_exp, 0) : decl_ptr;
2687
2688 dfs_walk (binfo, dfs_find_vbases, unmarked_new_vtablep);
2689
2690 /* Initialized with vtables of type TYPE. */
2691 for (; vbases; vbases = TREE_CHAIN (vbases))
2692 {
2693 tree addr;
2694
2695 addr = convert_pointer_to_vbase (TREE_TYPE (vbases), vbase_decl_ptr);
2696
2697 /* Do all vtables from this virtual base. */
2698 /* This assumes that virtual bases can never serve as parent
2699 binfos. (in the CLASSTYPE_VFIELD_PARENT sense) */
2700 expand_direct_vtbls_init (vbases, TYPE_BINFO (BINFO_TYPE (vbases)),
2701 1, 0, addr);
2702
2703 /* Now we adjust the offsets for virtual functions that
2704 cross virtual boundaries on an implicit upcast on vf call
2705 so that the layout of the most complete type is used,
2706 instead of assuming the layout of the virtual bases from
2707 our current type. */
2708
2709 if (flag_vtable_thunks)
2710 {
2711 /* We don't have dynamic thunks yet!
2712 So for now, just fail silently. */
2713 }
2714 else
2715 {
2716 tree vbase_offsets = NULL_TREE;
2717 push_to_sequence (fixup_insns);
2718 fixup_virtual_upcast_offsets (vbases,
2719 TYPE_BINFO (BINFO_TYPE (vbases)),
2720 1, 0, addr, vbase_decl_ptr,
2721 type, vbases, &vbase_offsets);
2722 fixup_insns = get_insns ();
2723 end_sequence ();
2724 }
2725 }
2726
2727 if (fixup_insns)
2728 {
2729 extern tree in_charge_identifier;
2730 tree in_charge_node = lookup_name (in_charge_identifier, 0);
2731 if (! in_charge_node)
2732 {
2733 warning ("recoverable internal compiler error, nobody's in charge!");
2734 in_charge_node = integer_zero_node;
2735 }
2736 in_charge_node = build_binary_op (EQ_EXPR, in_charge_node, integer_zero_node, 1);
2737 expand_start_cond (in_charge_node, 0);
2738 emit_insns (fixup_insns);
2739 expand_end_cond ();
2740 }
2741
2742 dfs_walk (binfo, dfs_clear_vbase_slots, marked_new_vtablep);
2743 }
2744 }
2745
2746 /* get virtual base class types.
2747 This adds type to the vbase_types list in reverse dfs order.
2748 Ordering is very important, so don't change it. */
2749
2750 static void
2751 dfs_get_vbase_types (binfo)
2752 tree binfo;
2753 {
2754 if (TREE_VIA_VIRTUAL (binfo) && ! BINFO_VBASE_MARKED (binfo))
2755 {
2756 tree new_vbase = make_binfo (integer_zero_node, binfo,
2757 BINFO_VTABLE (binfo),
2758 BINFO_VIRTUALS (binfo));
2759 TREE_CHAIN (new_vbase) = vbase_types;
2760 TREE_VIA_VIRTUAL (new_vbase) = 1;
2761 vbase_types = new_vbase;
2762 SET_BINFO_VBASE_MARKED (binfo);
2763 }
2764 SET_BINFO_MARKED (binfo);
2765 }
2766
2767 /* get a list of virtual base classes in dfs order. */
2768
2769 tree
2770 get_vbase_types (type)
2771 tree type;
2772 {
2773 tree vbases;
2774 tree binfo;
2775
2776 binfo = TYPE_BINFO (type);
2777 vbase_types = NULL_TREE;
2778 dfs_walk (binfo, dfs_get_vbase_types, unmarkedp);
2779 dfs_walk (binfo, dfs_unmark, markedp);
2780 /* Rely upon the reverse dfs ordering from dfs_get_vbase_types, and now
2781 reverse it so that we get normal dfs ordering. */
2782 vbase_types = nreverse (vbase_types);
2783
2784 /* unmark marked vbases */
2785 for (vbases = vbase_types; vbases; vbases = TREE_CHAIN (vbases))
2786 CLEAR_BINFO_VBASE_MARKED (vbases);
2787
2788 return vbase_types;
2789 }
2790 \f
2791 /* If we want debug info for a type TYPE, make sure all its base types
2792 are also marked as being potentially interesting. This avoids
2793 the problem of not writing any debug info for intermediate basetypes
2794 that have abstract virtual functions. Also mark member types. */
2795
2796 void
2797 note_debug_info_needed (type)
2798 tree type;
2799 {
2800 tree field;
2801
2802 if (current_template_parms)
2803 return;
2804
2805 if (TYPE_BEING_DEFINED (type))
2806 /* We can't go looking for the base types and fields just yet. */
2807 return;
2808
2809 /* We can't do the TYPE_DECL_SUPPRESS_DEBUG thing with DWARF, which
2810 does not support name references between translation units. Well, we
2811 could, but that would mean putting global labels in the debug output
2812 before each exported type and each of its functions and static data
2813 members. */
2814 if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG)
2815 return;
2816
2817 dfs_walk (TYPE_BINFO (type), dfs_debug_mark, dfs_debug_unmarkedp);
2818 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
2819 {
2820 tree ttype;
2821 if (TREE_CODE (field) == FIELD_DECL
2822 && IS_AGGR_TYPE (ttype = target_type (TREE_TYPE (field)))
2823 && dfs_debug_unmarkedp (TYPE_BINFO (ttype)))
2824 note_debug_info_needed (ttype);
2825 }
2826 }
2827 \f
2828 /* Subroutines of push_class_decls (). */
2829
2830 /* Add in a decl to the envelope. */
2831 static void
2832 envelope_add_decl (type, decl, values)
2833 tree type, decl, *values;
2834 {
2835 tree context, *tmp;
2836 tree name = DECL_NAME (decl);
2837 int dont_add = 0;
2838
2839 /* Yet Another Implicit Typename Kludge: Since we don't tsubst
2840 the members for partial instantiations, DECL_CONTEXT (decl) is wrong.
2841 But pretend it's right for this function. */
2842 if (processing_template_decl)
2843 type = DECL_REAL_CONTEXT (decl);
2844
2845 /* virtual base names are always unique. */
2846 if (VBASE_NAME_P (name))
2847 *values = NULL_TREE;
2848
2849 /* Possible ambiguity. If its defining type(s)
2850 is (are all) derived from us, no problem. */
2851 else if (*values && TREE_CODE (*values) != TREE_LIST)
2852 {
2853 tree value = *values;
2854 /* Only complain if we shadow something we can access. */
2855 if (warn_shadow && TREE_CODE (decl) == FUNCTION_DECL
2856 && ((DECL_LANG_SPECIFIC (*values)
2857 && DECL_CLASS_CONTEXT (value) == current_class_type)
2858 || ! TREE_PRIVATE (value)))
2859 /* Should figure out access control more accurately. */
2860 {
2861 cp_warning_at ("member `%#D' is shadowed", value);
2862 cp_warning_at ("by member function `%#D'", decl);
2863 warning ("in this context");
2864 }
2865
2866 context = DECL_REAL_CONTEXT (value);
2867
2868 if (context == type)
2869 {
2870 if (TREE_CODE (value) == TYPE_DECL
2871 && DECL_ARTIFICIAL (value))
2872 *values = NULL_TREE;
2873 else
2874 dont_add = 1;
2875 }
2876 else if (type == current_class_type
2877 || DERIVED_FROM_P (context, type))
2878 {
2879 /* Don't add in *values to list */
2880 *values = NULL_TREE;
2881 }
2882 else
2883 *values = build_tree_list (NULL_TREE, value);
2884 }
2885 else
2886 for (tmp = values; *tmp;)
2887 {
2888 tree value = TREE_VALUE (*tmp);
2889 my_friendly_assert (TREE_CODE (value) != TREE_LIST, 999);
2890 context = (TREE_CODE (value) == FUNCTION_DECL
2891 && DECL_VIRTUAL_P (value))
2892 ? DECL_CLASS_CONTEXT (value)
2893 : DECL_CONTEXT (value);
2894
2895 if (type == current_class_type
2896 || DERIVED_FROM_P (context, type))
2897 {
2898 /* remove *tmp from list */
2899 *tmp = TREE_CHAIN (*tmp);
2900 }
2901 else
2902 tmp = &TREE_CHAIN (*tmp);
2903 }
2904
2905 if (! dont_add)
2906 {
2907 /* Put the new contents in our envelope. */
2908 if (TREE_CODE (decl) == FUNCTION_DECL)
2909 {
2910 *values = tree_cons (name, decl, *values);
2911 TREE_NONLOCAL_FLAG (*values) = 1;
2912 TREE_TYPE (*values) = unknown_type_node;
2913 }
2914 else
2915 {
2916 if (*values)
2917 {
2918 *values = tree_cons (NULL_TREE, decl, *values);
2919 /* Mark this as a potentially ambiguous member. */
2920 /* Leaving TREE_TYPE blank is intentional.
2921 We cannot use `error_mark_node' (lookup_name)
2922 or `unknown_type_node' (all member functions use this). */
2923 TREE_NONLOCAL_FLAG (*values) = 1;
2924 }
2925 else
2926 *values = decl;
2927 }
2928 }
2929 }
2930
2931 /* Returns 1 iff BINFO is a base we shouldn't really be able to see into,
2932 because it (or one of the intermediate bases) depends on template parms. */
2933
2934 static int
2935 dependent_base_p (binfo)
2936 tree binfo;
2937 {
2938 for (; binfo; binfo = BINFO_INHERITANCE_CHAIN (binfo))
2939 {
2940 if (TREE_TYPE (binfo) == current_class_type)
2941 break;
2942 if (uses_template_parms (TREE_TYPE (binfo)))
2943 return 1;
2944 }
2945 return 0;
2946 }
2947
2948 /* Add the instance variables which this class contributed to the
2949 current class binding contour. When a redefinition occurs, if the
2950 redefinition is strictly within a single inheritance path, we just
2951 overwrite the old declaration with the new. If the fields are not
2952 within a single inheritance path, we must cons them.
2953
2954 In order to know what decls are new (stemming from the current
2955 invocation of push_class_decls) we enclose them in an "envelope",
2956 which is a TREE_LIST node where the TREE_PURPOSE slot contains the
2957 new decl (or possibly a list of competing ones), the TREE_VALUE slot
2958 points to the old value and the TREE_CHAIN slot chains together all
2959 envelopes which needs to be "opened" in push_class_decls. Opening an
2960 envelope means: push the old value onto the class_shadowed list,
2961 install the new one and if it's a TYPE_DECL do the same to the
2962 IDENTIFIER_TYPE_VALUE. Such an envelope is recognized by seeing that
2963 the TREE_PURPOSE slot is non-null, and that it is not an identifier.
2964 Because if it is, it could be a set of overloaded methods from an
2965 outer scope. */
2966
2967 static void
2968 dfs_pushdecls (binfo)
2969 tree binfo;
2970 {
2971 tree type = BINFO_TYPE (binfo);
2972 tree fields;
2973 tree method_vec;
2974 int dummy = 0;
2975
2976 /* Only record types if we're a template base. */
2977 if (processing_template_decl && type != current_class_type
2978 && dependent_base_p (binfo))
2979 dummy = 1;
2980
2981 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
2982 {
2983 if (dummy && TREE_CODE (fields) != TYPE_DECL)
2984 continue;
2985
2986 /* Unmark so that if we are in a constructor, and then find that
2987 this field was initialized by a base initializer,
2988 we can emit an error message. */
2989 if (TREE_CODE (fields) == FIELD_DECL)
2990 TREE_USED (fields) = 0;
2991
2992 /* Recurse into anonymous unions. */
2993 if (DECL_NAME (fields) == NULL_TREE
2994 && TREE_CODE (TREE_TYPE (fields)) == UNION_TYPE)
2995 {
2996 dfs_pushdecls (TYPE_BINFO (TREE_TYPE (fields)));
2997 continue;
2998 }
2999
3000 if (DECL_NAME (fields))
3001 {
3002 tree name = DECL_NAME (fields);
3003 tree class_value = IDENTIFIER_CLASS_VALUE (name);
3004
3005 /* If the class value is not an envelope of the kind described in
3006 the comment above, we create a new envelope. */
3007 if (class_value == NULL_TREE || TREE_CODE (class_value) != TREE_LIST
3008 || TREE_PURPOSE (class_value) == NULL_TREE
3009 || TREE_CODE (TREE_PURPOSE (class_value)) == IDENTIFIER_NODE)
3010 {
3011 /* See comment above for a description of envelopes. */
3012 closed_envelopes = tree_cons (NULL_TREE, class_value,
3013 closed_envelopes);
3014 IDENTIFIER_CLASS_VALUE (name) = closed_envelopes;
3015 class_value = IDENTIFIER_CLASS_VALUE (name);
3016 }
3017
3018 envelope_add_decl (type, fields, &TREE_PURPOSE (class_value));
3019 }
3020 }
3021
3022 method_vec = CLASSTYPE_METHOD_VEC (type);
3023 if (method_vec && ! dummy)
3024 {
3025 tree *methods;
3026 tree *end;
3027
3028 /* Farm out constructors and destructors. */
3029 end = TREE_VEC_END (method_vec);
3030
3031 for (methods = &TREE_VEC_ELT (method_vec, 2);
3032 *methods && methods != end;
3033 methods++)
3034 {
3035 /* This will cause lookup_name to return a pointer
3036 to the tree_list of possible methods of this name. */
3037 tree name;
3038 tree class_value;
3039
3040
3041 name = DECL_NAME (OVL_CURRENT (*methods));
3042 class_value = IDENTIFIER_CLASS_VALUE (name);
3043
3044 /* If the class value is not an envelope of the kind described in
3045 the comment above, we create a new envelope. */
3046 if (class_value == NULL_TREE || TREE_CODE (class_value) != TREE_LIST
3047 || TREE_PURPOSE (class_value) == NULL_TREE
3048 || TREE_CODE (TREE_PURPOSE (class_value)) == IDENTIFIER_NODE)
3049 {
3050 /* See comment above for a description of envelopes. */
3051 closed_envelopes = tree_cons (NULL_TREE, class_value,
3052 closed_envelopes);
3053 IDENTIFIER_CLASS_VALUE (name) = closed_envelopes;
3054 class_value = IDENTIFIER_CLASS_VALUE (name);
3055 }
3056
3057 /* Here we try to rule out possible ambiguities.
3058 If we can't do that, keep a TREE_LIST with possibly ambiguous
3059 decls in there. */
3060 maybe_push_cache_obstack ();
3061 /* Arbitrarily choose the first function in the list. This is OK
3062 because this is only used for initial lookup; anything that
3063 actually uses the function will look it up again. */
3064 envelope_add_decl (type, OVL_CURRENT (*methods),
3065 &TREE_PURPOSE (class_value));
3066 pop_obstacks ();
3067 }
3068 }
3069
3070 /* We can't just use BINFO_MARKED because envelope_add_decl uses
3071 DERIVED_FROM_P, which calls get_base_distance. */
3072 SET_BINFO_PUSHDECLS_MARKED (binfo);
3073 }
3074
3075 /* Consolidate unique (by name) member functions. */
3076
3077 static void
3078 dfs_compress_decls (binfo)
3079 tree binfo;
3080 {
3081 tree type = BINFO_TYPE (binfo);
3082 tree method_vec = CLASSTYPE_METHOD_VEC (type);
3083
3084 if (processing_template_decl && type != current_class_type
3085 && dependent_base_p (binfo))
3086 /* We only record types if we're a template base. */;
3087 else if (method_vec != 0)
3088 {
3089 /* Farm out constructors and destructors. */
3090 tree *methods;
3091 tree *end = TREE_VEC_END (method_vec);
3092
3093 for (methods = &TREE_VEC_ELT (method_vec, 2);
3094 methods != end && *methods; methods++)
3095 {
3096 /* This is known to be an envelope of the kind described before
3097 dfs_pushdecls. */
3098 tree class_value =
3099 IDENTIFIER_CLASS_VALUE (DECL_NAME (OVL_CURRENT (*methods)));
3100 tree tmp = TREE_PURPOSE (class_value);
3101
3102 /* This was replaced in scope by somebody else. Just leave it
3103 alone. */
3104 if (TREE_CODE (tmp) != TREE_LIST)
3105 continue;
3106
3107 if (TREE_CHAIN (tmp) == NULL_TREE
3108 && TREE_VALUE (tmp)
3109 && OVL_NEXT (TREE_VALUE (tmp)) == NULL_TREE)
3110 {
3111 TREE_PURPOSE (class_value) = TREE_VALUE (tmp);
3112 }
3113 }
3114 }
3115 CLEAR_BINFO_PUSHDECLS_MARKED (binfo);
3116 }
3117
3118 /* When entering the scope of a class, we cache all of the
3119 fields that that class provides within its inheritance
3120 lattice. Where ambiguities result, we mark them
3121 with `error_mark_node' so that if they are encountered
3122 without explicit qualification, we can emit an error
3123 message. */
3124
3125 void
3126 push_class_decls (type)
3127 tree type;
3128 {
3129 struct obstack *ambient_obstack = current_obstack;
3130 search_stack = push_search_level (search_stack, &search_obstack);
3131
3132 /* Push class fields into CLASS_VALUE scope, and mark. */
3133 dfs_walk (TYPE_BINFO (type), dfs_pushdecls, unmarked_pushdecls_p);
3134
3135 /* Compress fields which have only a single entry
3136 by a given name, and unmark. */
3137 dfs_walk (TYPE_BINFO (type), dfs_compress_decls, marked_pushdecls_p);
3138
3139 /* Open up all the closed envelopes and push the contained decls into
3140 class scope. */
3141 while (closed_envelopes)
3142 {
3143 tree new = TREE_PURPOSE (closed_envelopes);
3144 tree id;
3145
3146 /* This is messy because the class value may be a *_DECL, or a
3147 TREE_LIST of overloaded *_DECLs or even a TREE_LIST of ambiguous
3148 *_DECLs. The name is stored at different places in these three
3149 cases. */
3150 if (TREE_CODE (new) == TREE_LIST)
3151 {
3152 if (TREE_PURPOSE (new) != NULL_TREE)
3153 id = TREE_PURPOSE (new);
3154 else
3155 {
3156 tree node = TREE_VALUE (new);
3157
3158 if (TREE_CODE (node) == TYPE_DECL
3159 && DECL_ARTIFICIAL (node)
3160 && IS_AGGR_TYPE (TREE_TYPE (node))
3161 && CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (node)))
3162 {
3163 tree t = CLASSTYPE_TI_TEMPLATE (TREE_TYPE (node));
3164 tree n = new;
3165
3166 for (; n; n = TREE_CHAIN (n))
3167 {
3168 tree d = TREE_VALUE (n);
3169 if (TREE_CODE (d) == TYPE_DECL
3170 && DECL_ARTIFICIAL (node)
3171 && IS_AGGR_TYPE (TREE_TYPE (d))
3172 && CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (d))
3173 && CLASSTYPE_TI_TEMPLATE (TREE_TYPE (d)) == t)
3174 /* OK */;
3175 else
3176 break;
3177 }
3178
3179 if (n == NULL_TREE)
3180 new = t;
3181 }
3182 else while (TREE_CODE (node) == TREE_LIST)
3183 node = TREE_VALUE (node);
3184 id = DECL_NAME (node);
3185 }
3186 }
3187 else
3188 id = DECL_NAME (new);
3189
3190 /* Install the original class value in order to make
3191 pushdecl_class_level work correctly. */
3192 IDENTIFIER_CLASS_VALUE (id) = TREE_VALUE (closed_envelopes);
3193 if (TREE_CODE (new) == TREE_LIST)
3194 push_class_level_binding (id, new);
3195 else
3196 pushdecl_class_level (new);
3197 closed_envelopes = TREE_CHAIN (closed_envelopes);
3198 }
3199 current_obstack = ambient_obstack;
3200 }
3201
3202 /* Here's a subroutine we need because C lacks lambdas. */
3203
3204 static void
3205 dfs_unuse_fields (binfo)
3206 tree binfo;
3207 {
3208 tree type = TREE_TYPE (binfo);
3209 tree fields;
3210
3211 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
3212 {
3213 if (TREE_CODE (fields) != FIELD_DECL)
3214 continue;
3215
3216 TREE_USED (fields) = 0;
3217 if (DECL_NAME (fields) == NULL_TREE
3218 && TREE_CODE (TREE_TYPE (fields)) == UNION_TYPE)
3219 unuse_fields (TREE_TYPE (fields));
3220 }
3221 }
3222
3223 void
3224 unuse_fields (type)
3225 tree type;
3226 {
3227 dfs_walk (TYPE_BINFO (type), dfs_unuse_fields, unmarkedp);
3228 }
3229
3230 void
3231 pop_class_decls ()
3232 {
3233 /* We haven't pushed a search level when dealing with cached classes,
3234 so we'd better not try to pop it. */
3235 if (search_stack)
3236 search_stack = pop_search_level (search_stack);
3237 }
3238
3239 void
3240 print_search_statistics ()
3241 {
3242 #ifdef GATHER_STATISTICS
3243 fprintf (stderr, "%d fields searched in %d[%d] calls to lookup_field[_1]\n",
3244 n_fields_searched, n_calls_lookup_field, n_calls_lookup_field_1);
3245 fprintf (stderr, "%d fnfields searched in %d calls to lookup_fnfields\n",
3246 n_outer_fields_searched, n_calls_lookup_fnfields);
3247 fprintf (stderr, "%d calls to get_base_type\n", n_calls_get_base_type);
3248 #else /* GATHER_STATISTICS */
3249 fprintf (stderr, "no search statistics\n");
3250 #endif /* GATHER_STATISTICS */
3251 }
3252
3253 void
3254 init_search_processing ()
3255 {
3256 gcc_obstack_init (&search_obstack);
3257 _vptr_name = get_identifier ("_vptr");
3258 }
3259
3260 void
3261 reinit_search_statistics ()
3262 {
3263 #ifdef GATHER_STATISTICS
3264 n_fields_searched = 0;
3265 n_calls_lookup_field = 0, n_calls_lookup_field_1 = 0;
3266 n_calls_lookup_fnfields = 0, n_calls_lookup_fnfields_1 = 0;
3267 n_calls_get_base_type = 0;
3268 n_outer_fields_searched = 0;
3269 n_contexts_saved = 0;
3270 #endif /* GATHER_STATISTICS */
3271 }
3272
3273 #define scratch_tree_cons expr_tree_cons
3274
3275 static tree conversions;
3276 static void
3277 add_conversions (binfo)
3278 tree binfo;
3279 {
3280 int i;
3281 tree method_vec = CLASSTYPE_METHOD_VEC (BINFO_TYPE (binfo));
3282
3283 for (i = 2; i < TREE_VEC_LENGTH (method_vec); ++i)
3284 {
3285 tree tmp = TREE_VEC_ELT (method_vec, i);
3286
3287 if (!tmp
3288 || !IDENTIFIER_TYPENAME_P (DECL_NAME (OVL_CURRENT (tmp))))
3289 break;
3290 conversions = scratch_tree_cons (binfo, tmp, conversions);
3291 }
3292 SET_BINFO_MARKED (binfo);
3293 }
3294
3295 tree
3296 lookup_conversions (type)
3297 tree type;
3298 {
3299 conversions = NULL_TREE;
3300 if (TYPE_SIZE (type))
3301 {
3302 dfs_walk (TYPE_BINFO (type), add_conversions, unmarkedp);
3303 dfs_walk (TYPE_BINFO (type), dfs_unmark, markedp);
3304 }
3305 return conversions;
3306 }
3307
3308 /* Subroutine of get_template_base. */
3309
3310 static tree
3311 get_template_base_recursive (binfo, rval, template, via_virtual)
3312 tree binfo, template, rval;
3313 int via_virtual;
3314 {
3315 tree binfos;
3316 int i, n_baselinks;
3317 tree type = BINFO_TYPE (binfo);
3318
3319 if (CLASSTYPE_TEMPLATE_INFO (type)
3320 && CLASSTYPE_TI_TEMPLATE (type) == template)
3321 {
3322 if (rval == NULL_TREE || rval == type)
3323 return type;
3324 else
3325 return error_mark_node;
3326 }
3327
3328 binfos = BINFO_BASETYPES (binfo);
3329 n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
3330
3331 /* Process base types. */
3332 for (i = 0; i < n_baselinks; i++)
3333 {
3334 tree base_binfo = TREE_VEC_ELT (binfos, i);
3335
3336 /* Find any specific instance of a virtual base, when searching with
3337 a binfo... */
3338 if (BINFO_MARKED (base_binfo) == 0)
3339 {
3340 int this_virtual = via_virtual || TREE_VIA_VIRTUAL (base_binfo);
3341
3342 /* When searching for a non-virtual, we cannot mark
3343 virtually found binfos. */
3344 if (! this_virtual)
3345 SET_BINFO_MARKED (base_binfo);
3346
3347 rval = get_template_base_recursive
3348 (base_binfo, rval, template, this_virtual);
3349 if (rval == error_mark_node)
3350 return rval;
3351 }
3352 }
3353
3354 return rval;
3355 }
3356
3357 /* Given a class template TEMPLATE and a class type or binfo node BINFO,
3358 find the unique base type in BINFO that is an instance of TEMPLATE.
3359 If there are more than one, return error_mark_node. Used by unify. */
3360
3361 tree
3362 get_template_base (template, binfo)
3363 register tree template, binfo;
3364 {
3365 tree type = NULL_TREE, rval;
3366
3367 if (TREE_CODE (binfo) == TREE_VEC)
3368 type = BINFO_TYPE (binfo);
3369 else if (IS_AGGR_TYPE_CODE (TREE_CODE (binfo)))
3370 {
3371 type = complete_type (binfo);
3372 binfo = TYPE_BINFO (type);
3373 }
3374 else
3375 my_friendly_abort (92);
3376
3377 if (CLASSTYPE_TEMPLATE_INFO (type)
3378 && CLASSTYPE_TI_TEMPLATE (type) == template)
3379 return type;
3380
3381 rval = get_template_base_recursive (binfo, NULL_TREE, template, 0);
3382 dfs_walk (binfo, dfs_unmark, markedp);
3383
3384 return rval;
3385 }
3386
3387 /* Check whether the empty class indicated by EMPTY_BINFO is also present
3388 at offset 0 in COMPARE_TYPE, and set found_overlap if so. */
3389
3390 static tree compare_type;
3391 static int found_overlap;
3392 static void
3393 dfs_check_overlap (empty_binfo)
3394 tree empty_binfo;
3395 {
3396 tree binfo;
3397 for (binfo = TYPE_BINFO (compare_type); ; binfo = BINFO_BASETYPE (binfo, 0))
3398 {
3399 if (BINFO_TYPE (binfo) == BINFO_TYPE (empty_binfo))
3400 {
3401 found_overlap = 1;
3402 break;
3403 }
3404 else if (BINFO_BASETYPES (binfo) == NULL_TREE)
3405 break;
3406 }
3407 }
3408
3409 /* Trivial function to stop base traversal when we find something. */
3410
3411 static int
3412 dfs_no_overlap_yet (t)
3413 tree t ATTRIBUTE_UNUSED;
3414 {
3415 return found_overlap == 0;
3416 }
3417
3418 /* Returns nonzero if EMPTY_TYPE or any of its bases can also be found at
3419 offset 0 in NEXT_TYPE. Used in laying out empty base class subobjects. */
3420
3421 int
3422 types_overlap_p (empty_type, next_type)
3423 tree empty_type, next_type;
3424 {
3425 if (! IS_AGGR_TYPE (next_type))
3426 return 0;
3427 compare_type = next_type;
3428 found_overlap = 0;
3429 dfs_walk (TYPE_BINFO (empty_type), dfs_check_overlap, dfs_no_overlap_yet);
3430 return found_overlap;
3431 }
3432
3433 /* Passed to dfs_search by binfo_for_vtable; determine if bvtable comes
3434 from BINFO. */
3435
3436 static tree bvtable;
3437 static tree
3438 dfs_bfv_helper (binfo)
3439 tree binfo;
3440 {
3441 if (BINFO_VTABLE (binfo) == bvtable)
3442 return binfo;
3443 return NULL_TREE;
3444 }
3445
3446 /* Given a vtable VARS, determine which binfo it comes from. */
3447
3448 tree
3449 binfo_for_vtable (vars)
3450 tree vars;
3451 {
3452 bvtable = vars;
3453 return dfs_search (TYPE_BINFO (DECL_CONTEXT (vars)), dfs_bfv_helper,
3454 DECL_CONTEXT (vars));
3455 }
This page took 0.180316 seconds and 6 git commands to generate.