1 /* Breadth-first and depth-first routines for
2 searching multiple-inheritance lattice for GNU C++.
3 Copyright (C) 1987, 89, 92-97, 1998, 1999 Free Software Foundation, Inc.
4 Contributed by Michael Tiemann (tiemann@cygnus.com)
6 This file is part of GNU CC.
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)
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.
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. */
23 /* High-level class interface. */
36 #define obstack_chunk_alloc xmalloc
37 #define obstack_chunk_free free
39 extern struct obstack *current_obstack;
40 extern tree abort_fndecl;
44 /* Obstack used for remembering decision points of breadth-first. */
46 static struct obstack search_obstack;
48 /* Methods for pushing and popping objects to and from obstacks. */
51 push_stack_level (obstack, tp, size)
52 struct obstack *obstack;
53 char *tp; /* Sony NewsOS 5.0 compiler doesn't like void * here. */
56 struct stack_level *stack;
57 obstack_grow (obstack, tp, size);
58 stack = (struct stack_level *) ((char*)obstack_next_free (obstack) - size);
59 obstack_finish (obstack);
60 stack->obstack = obstack;
61 stack->first = (tree *) obstack_base (obstack);
62 stack->limit = obstack_room (obstack) / sizeof (tree *);
67 pop_stack_level (stack)
68 struct stack_level *stack;
70 struct stack_level *tem = stack;
71 struct obstack *obstack = tem->obstack;
73 obstack_free (obstack, tem);
77 #define search_level stack_level
78 static struct search_level *search_stack;
80 static tree get_abstract_virtuals_1 PROTO((tree, int, tree));
81 static tree next_baselink PROTO((tree));
82 static tree get_vbase_1 PROTO((tree, tree, unsigned int *));
83 static tree convert_pointer_to_vbase PROTO((tree, tree));
84 static tree lookup_field_1 PROTO((tree, tree));
85 static tree convert_pointer_to_single_level PROTO((tree, tree));
86 static int lookup_fnfields_here PROTO((tree, tree));
87 static int is_subobject_of_p PROTO((tree, tree));
88 static int hides PROTO((tree, tree));
89 static tree virtual_context PROTO((tree, tree, tree));
90 static tree dfs_check_overlap PROTO((tree, void *));
91 static tree dfs_no_overlap_yet PROTO((tree, void *));
92 static int get_base_distance_recursive
93 PROTO((tree, int, int, int, int *, tree *, tree,
94 int, int *, int, int));
95 static void expand_upcast_fixups
96 PROTO((tree, tree, tree, tree, tree, tree, tree *));
97 static void fixup_virtual_upcast_offsets
98 PROTO((tree, tree, int, int, tree, tree, tree, tree,
100 static tree unmarkedp PROTO((tree, void *));
101 static tree marked_vtable_pathp PROTO((tree, void *));
102 static tree unmarked_vtable_pathp PROTO((tree, void *));
103 static tree marked_new_vtablep PROTO((tree, void *));
104 static tree unmarked_new_vtablep PROTO((tree, void *));
105 static tree marked_pushdecls_p PROTO((tree, void *));
106 static tree unmarked_pushdecls_p PROTO((tree, void *));
107 static tree dfs_debug_unmarkedp PROTO((tree, void *));
108 static tree dfs_debug_mark PROTO((tree, void *));
109 static tree dfs_find_vbases PROTO((tree, void *));
110 static tree dfs_clear_vbase_slots PROTO((tree, void *));
111 static tree dfs_init_vbase_pointers PROTO((tree, void *));
112 static tree dfs_get_vbase_types PROTO((tree, void *));
113 static tree dfs_push_type_decls PROTO((tree, void *));
114 static tree dfs_push_decls PROTO((tree, void *));
115 static tree dfs_unuse_fields PROTO((tree, void *));
116 static tree add_conversions PROTO((tree, void *));
117 static tree get_virtuals_named_this PROTO((tree, tree));
118 static tree get_virtual_destructor PROTO((tree, void *));
119 static tree tree_has_any_destructor_p PROTO((tree, void *));
120 static int covariant_return_p PROTO((tree, tree));
121 static struct search_level *push_search_level
122 PROTO((struct stack_level *, struct obstack *));
123 static struct search_level *pop_search_level
124 PROTO((struct stack_level *));
126 PROTO((tree, tree (*) (tree, void *), tree (*) (tree, void *),
128 static tree lookup_field_queue_p PROTO((tree, void *));
129 static tree lookup_field_r PROTO((tree, void *));
130 static tree dfs_walk_real PROTO ((tree,
131 tree (*) (tree, void *),
132 tree (*) (tree, void *),
133 tree (*) (tree, void *),
135 static tree dfs_bfv_queue_p PROTO ((tree, void *));
136 static tree dfs_bfv_helper PROTO ((tree, void *));
137 static tree get_virtuals_named_this_r PROTO ((tree, void *));
138 static tree context_for_name_lookup PROTO ((tree));
139 static tree canonical_binfo PROTO ((tree));
140 static tree shared_marked_p PROTO ((tree, void *));
141 static tree shared_unmarked_p PROTO ((tree, void *));
142 static int dependent_base_p PROTO ((tree));
143 static tree dfs_accessible_queue_p PROTO ((tree, void *));
144 static tree dfs_accessible_p PROTO ((tree, void *));
145 static tree dfs_access_in_type PROTO ((tree, void *));
146 static tree access_in_type PROTO ((tree, tree));
147 static tree dfs_canonical_queue PROTO ((tree, void *));
148 static tree dfs_assert_unmarked_p PROTO ((tree, void *));
149 static void assert_canonical_unmarked PROTO ((tree));
150 static int protected_accessible_p PROTO ((tree, tree, tree, tree));
151 static int friend_accessible_p PROTO ((tree, tree, tree, tree));
152 static void setup_class_bindings PROTO ((tree, int));
153 static int template_self_reference_p PROTO ((tree, tree));
154 static void expand_direct_vtbls_init_thunks PROTO((tree, tree, int));
155 static void expand_indirect_vtbls_init_thunks PROTO((tree, tree, tree));
158 /* Allocate a level of searching. */
160 static struct search_level *
161 push_search_level (stack, obstack)
162 struct stack_level *stack;
163 struct obstack *obstack;
165 struct search_level tem;
168 return push_stack_level (obstack, (char *)&tem, sizeof (tem));
171 /* Discard a level of search allocation. */
173 static struct search_level *
174 pop_search_level (obstack)
175 struct stack_level *obstack;
177 register struct search_level *stack = pop_stack_level (obstack);
182 static tree _vptr_name;
184 /* Variables for gathering statistics. */
185 #ifdef GATHER_STATISTICS
186 static int n_fields_searched;
187 static int n_calls_lookup_field, n_calls_lookup_field_1;
188 static int n_calls_lookup_fnfields, n_calls_lookup_fnfields_1;
189 static int n_calls_get_base_type;
190 static int n_outer_fields_searched;
191 static int n_contexts_saved;
192 #endif /* GATHER_STATISTICS */
195 /* Get a virtual binfo that is found inside BINFO's hierarchy that is
196 the same type as the type given in PARENT. To be optimal, we want
197 the first one that is found by going through the least number of
200 This uses a clever algorithm that updates *depth when we find the vbase,
201 and cuts off other paths of search when they reach that depth. */
204 get_vbase_1 (parent, binfo, depth)
210 tree rval = NULL_TREE;
212 if (BINFO_TYPE (binfo) == parent && TREE_VIA_VIRTUAL (binfo))
220 binfos = BINFO_BASETYPES (binfo);
221 n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
223 /* Process base types. */
224 for (i = 0; i < n_baselinks; i++)
226 tree base_binfo = TREE_VEC_ELT (binfos, i);
232 nrval = get_vbase_1 (parent, base_binfo, depth);
240 /* Return the shortest path to vbase PARENT within BINFO, ignoring
241 access and ambiguity. */
244 get_vbase (parent, binfo)
248 unsigned int d = (unsigned int)-1;
249 return get_vbase_1 (parent, binfo, &d);
252 /* Convert EXPR to a virtual base class of type TYPE. We know that
253 EXPR is a non-null POINTER_TYPE to RECORD_TYPE. We also know that
254 the type of what expr points to has a virtual base of type TYPE. */
257 convert_pointer_to_vbase (type, expr)
261 tree vb = get_vbase (type, TYPE_BINFO (TREE_TYPE (TREE_TYPE (expr))));
262 return convert_pointer_to_real (vb, expr);
265 /* Check whether the type given in BINFO is derived from PARENT. If
266 it isn't, return 0. If it is, but the derivation is MI-ambiguous
267 AND protect != 0, emit an error message and return error_mark_node.
269 Otherwise, if TYPE is derived from PARENT, return the actual base
270 information, unless a one of the protection violations below
271 occurs, in which case emit an error message and return error_mark_node.
273 If PROTECT is 1, then check if access to a public field of PARENT
274 would be private. Also check for ambiguity. */
277 get_binfo (parent, binfo, protect)
278 register tree parent, binfo;
281 tree type = NULL_TREE;
283 tree rval = NULL_TREE;
285 if (TREE_CODE (parent) == TREE_VEC)
286 parent = BINFO_TYPE (parent);
287 else if (! IS_AGGR_TYPE_CODE (TREE_CODE (parent)))
288 my_friendly_abort (89);
290 if (TREE_CODE (binfo) == TREE_VEC)
291 type = BINFO_TYPE (binfo);
292 else if (IS_AGGR_TYPE_CODE (TREE_CODE (binfo)))
295 my_friendly_abort (90);
297 dist = get_base_distance (parent, binfo, protect, &rval);
301 cp_error ("fields of `%T' are inaccessible in `%T' due to private inheritance",
303 return error_mark_node;
305 else if (dist == -2 && protect)
307 cp_error ("type `%T' is ambiguous base class for type `%T'", parent,
309 return error_mark_node;
315 /* This is the newer depth first get_base_distance routine. */
318 get_base_distance_recursive (binfo, depth, is_private, rval,
319 rval_private_ptr, new_binfo_ptr, parent,
320 protect, via_virtual_ptr, via_virtual,
321 current_scope_in_chain)
323 int depth, is_private, rval;
324 int *rval_private_ptr;
325 tree *new_binfo_ptr, parent;
326 int protect, *via_virtual_ptr, via_virtual;
327 int current_scope_in_chain;
333 && !current_scope_in_chain
334 && is_friend (BINFO_TYPE (binfo), current_scope ()))
335 current_scope_in_chain = 1;
337 if (BINFO_TYPE (binfo) == parent || binfo == parent)
342 /* This is the first time we've found parent. */
344 else if (tree_int_cst_equal (BINFO_OFFSET (*new_binfo_ptr),
345 BINFO_OFFSET (binfo))
346 && *via_virtual_ptr && via_virtual)
348 /* A new path to the same vbase. If this one has better
349 access or is shorter, take it. */
352 better = *rval_private_ptr - is_private;
354 better = rval - depth;
358 /* Ambiguous base class. */
361 /* If we get an ambiguity between virtual and non-virtual base
362 class, return the non-virtual in case we are ignoring
364 better = *via_virtual_ptr - via_virtual;
370 *rval_private_ptr = is_private;
371 *new_binfo_ptr = binfo;
372 *via_virtual_ptr = via_virtual;
378 binfos = BINFO_BASETYPES (binfo);
379 n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
382 /* Process base types. */
383 for (i = 0; i < n_baselinks; i++)
385 tree base_binfo = TREE_VEC_ELT (binfos, i);
390 || (!TREE_VIA_PUBLIC (base_binfo)
391 && !(TREE_VIA_PROTECTED (base_binfo)
392 && current_scope_in_chain)
393 && !is_friend (BINFO_TYPE (binfo), current_scope ()))));
394 int this_virtual = via_virtual || TREE_VIA_VIRTUAL (base_binfo);
396 rval = get_base_distance_recursive (base_binfo, depth, via_private,
397 rval, rval_private_ptr,
398 new_binfo_ptr, parent,
399 protect, via_virtual_ptr,
401 current_scope_in_chain);
403 /* If we've found a non-virtual, ambiguous base class, we don't need
404 to keep searching. */
405 if (rval == -2 && *via_virtual_ptr == 0)
412 /* Return the number of levels between type PARENT and the type given
413 in BINFO, following the leftmost path to PARENT not found along a
414 virtual path, if there are no real PARENTs (all come from virtual
415 base classes), then follow the shortest public path to PARENT.
417 Return -1 if TYPE is not derived from PARENT.
418 Return -2 if PARENT is an ambiguous base class of TYPE, and PROTECT is
420 Return -3 if PARENT is private to TYPE, and PROTECT is non-zero.
422 If PATH_PTR is non-NULL, then also build the list of types
423 from PARENT to TYPE, with TREE_VIA_VIRTUAL and TREE_VIA_PUBLIC
426 PARENT can also be a binfo, in which case that exact parent is found
427 and no other. convert_pointer_to_real uses this functionality.
429 If BINFO is a binfo, its BINFO_INHERITANCE_CHAIN will be left alone. */
432 get_base_distance (parent, binfo, protect, path_ptr)
433 register tree parent, binfo;
438 int rval_private = 0;
439 tree type = NULL_TREE;
440 tree new_binfo = NULL_TREE;
442 int watch_access = protect;
444 /* Should we be completing types here? */
445 if (TREE_CODE (parent) != TREE_VEC)
446 parent = complete_type (TYPE_MAIN_VARIANT (parent));
448 complete_type (TREE_TYPE (parent));
450 if (TREE_CODE (binfo) == TREE_VEC)
451 type = BINFO_TYPE (binfo);
452 else if (IS_AGGR_TYPE_CODE (TREE_CODE (binfo)))
454 type = complete_type (binfo);
455 binfo = TYPE_BINFO (type);
458 my_friendly_assert (BINFO_INHERITANCE_CHAIN (binfo) == NULL_TREE,
462 my_friendly_abort (92);
464 if (parent == type || parent == binfo)
466 /* If the distance is 0, then we don't really need
467 a path pointer, but we shouldn't let garbage go back. */
476 rval = get_base_distance_recursive (binfo, 0, 0, -1,
477 &rval_private, &new_binfo, parent,
478 watch_access, &via_virtual, 0,
481 /* Access restrictions don't count if we found an ambiguous basetype. */
482 if (rval == -2 && protect >= 0)
485 if (rval && protect && rval_private)
488 /* If they gave us the real vbase binfo, which isn't in the main binfo
489 tree, deal with it. This happens when we are called from
490 expand_upcast_fixups. */
491 if (rval == -1 && TREE_CODE (parent) == TREE_VEC
492 && parent == binfo_member (BINFO_TYPE (parent),
493 CLASSTYPE_VBASECLASSES (type)))
495 my_friendly_assert (BINFO_INHERITANCE_CHAIN (parent) == binfo, 980827);
501 *path_ptr = new_binfo;
505 /* Search for a member with name NAME in a multiple inheritance lattice
506 specified by TYPE. If it does not exist, return NULL_TREE.
507 If the member is ambiguously referenced, return `error_mark_node'.
508 Otherwise, return the FIELD_DECL. */
510 /* Do a 1-level search for NAME as a member of TYPE. The caller must
511 figure out whether it can access this field. (Since it is only one
512 level, this is reasonable.) */
515 lookup_field_1 (type, name)
520 if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
521 || TREE_CODE (type) == TEMPLATE_TEMPLATE_PARM)
522 /* The TYPE_FIELDS of a TEMPLATE_TYPE_PARM are not fields at all;
523 instead TYPE_FIELDS is the TEMPLATE_PARM_INDEX. (Miraculously,
524 the code often worked even when we treated the index as a list
528 field = TYPE_FIELDS (type);
530 #ifdef GATHER_STATISTICS
531 n_calls_lookup_field_1++;
532 #endif /* GATHER_STATISTICS */
535 #ifdef GATHER_STATISTICS
537 #endif /* GATHER_STATISTICS */
538 my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (field)) == 'd', 0);
539 if (DECL_NAME (field) == NULL_TREE
540 && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
542 tree temp = lookup_field_1 (TREE_TYPE (field), name);
546 if (TREE_CODE (field) == USING_DECL)
547 /* For now, we're just treating member using declarations as
548 old ARM-style access declarations. Thus, there's no reason
549 to return a USING_DECL, and the rest of the compiler can't
550 handle it. Once the class is defined, these are purged
551 from TYPE_FIELDS anyhow; see handle_using_decl. */
553 else if (DECL_NAME (field) == name)
555 if ((TREE_CODE(field) == VAR_DECL || TREE_CODE(field) == CONST_DECL)
556 && DECL_ASSEMBLER_NAME (field) != NULL)
557 GNU_xref_ref(current_function_decl,
558 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (field)));
561 field = TREE_CHAIN (field);
564 if (name == _vptr_name)
566 /* Give the user what s/he thinks s/he wants. */
567 if (TYPE_VIRTUAL_P (type))
568 return CLASSTYPE_VFIELD (type);
573 /* There are a number of cases we need to be aware of here:
574 current_class_type current_function_decl
581 Those last two make life interesting. If we're in a function which is
582 itself inside a class, we need decls to go into the fn's decls (our
583 second case below). But if we're in a class and the class itself is
584 inside a function, we need decls to go into the decls for the class. To
585 achieve this last goal, we must see if, when both current_class_ptr and
586 current_function_decl are set, the class was declared inside that
587 function. If so, we know to put the decls into the class's scope. */
592 if (current_function_decl == NULL_TREE)
593 return current_class_type;
594 if (current_class_type == NULL_TREE)
595 return current_function_decl;
596 if (DECL_CLASS_CONTEXT (current_function_decl) == current_class_type)
597 return current_function_decl;
599 return current_class_type;
602 /* Return the scope of DECL, as appropriate when doing name-lookup. */
605 context_for_name_lookup (decl)
610 For the purposes of name lookup, after the anonymous union
611 definition, the members of the anonymous union are considered to
612 have been defined in the scope in which teh anonymous union is
614 tree context = DECL_REAL_CONTEXT (decl);
616 while (TYPE_P (context) && ANON_UNION_TYPE_P (context))
617 context = TYPE_CONTEXT (context);
619 context = global_namespace;
624 /* Return a canonical BINFO if BINFO is a virtual base, or just BINFO
628 canonical_binfo (binfo)
631 return (TREE_VIA_VIRTUAL (binfo)
632 ? TYPE_BINFO (BINFO_TYPE (binfo)) : binfo);
635 /* A queue function that simply ensures that we walk into the
636 canonical versions of virtual bases. */
639 dfs_canonical_queue (binfo, data)
641 void *data ATTRIBUTE_UNUSED;
643 return canonical_binfo (binfo);
646 /* Called via dfs_walk from assert_canonical_unmarked. */
649 dfs_assert_unmarked_p (binfo, data)
651 void *data ATTRIBUTE_UNUSED;
653 my_friendly_assert (!BINFO_MARKED (binfo), 0);
657 /* Asserts that all the nodes below BINFO (using the canonical
658 versions of virtual bases) are unmarked. */
661 assert_canonical_unmarked (binfo)
664 dfs_walk (binfo, dfs_assert_unmarked_p, dfs_canonical_queue, 0);
667 /* If BINFO is marked, return a canonical version of BINFO.
668 Otherwise, return NULL_TREE. */
671 shared_marked_p (binfo, data)
675 binfo = canonical_binfo (binfo);
676 return markedp (binfo, data) ? binfo : NULL_TREE;
679 /* If BINFO is not marked, return a canonical version of BINFO.
680 Otherwise, return NULL_TREE. */
683 shared_unmarked_p (binfo, data)
687 binfo = canonical_binfo (binfo);
688 return unmarkedp (binfo, data) ? binfo : NULL_TREE;
691 /* Called from access_in_type via dfs_walk. Calculate the access to
692 DATA (which is really a DECL) in BINFO. */
695 dfs_access_in_type (binfo, data)
699 tree decl = (tree) data;
700 tree type = BINFO_TYPE (binfo);
701 tree access = NULL_TREE;
703 if (context_for_name_lookup (decl) == type)
705 /* If we have desceneded to the scope of DECL, just note the
706 appropriate access. */
707 if (TREE_PRIVATE (decl))
708 access = access_private_node;
709 else if (TREE_PROTECTED (decl))
710 access = access_protected_node;
712 access = access_public_node;
716 /* First, check for an access-declaration that gives us more
717 access to the DECL. The CONST_DECL for an enumeration
718 constant will not have DECL_LANG_SPECIFIC, and thus no
720 if (DECL_LANG_SPECIFIC (decl))
722 access = purpose_member (type, DECL_ACCESS (decl));
724 access = TREE_VALUE (access);
733 /* Otherwise, scan our baseclasses, and pick the most favorable
735 binfos = BINFO_BASETYPES (binfo);
736 n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
737 for (i = 0; i < n_baselinks; ++i)
739 tree base_binfo = TREE_VEC_ELT (binfos, i);
740 tree base_access = TREE_CHAIN (canonical_binfo (base_binfo));
742 if (!base_access || base_access == access_private_node)
743 /* If it was not accessible in the base, or only
744 accessible as a private member, we can't access it
746 base_access = NULL_TREE;
747 else if (TREE_VIA_PROTECTED (base_binfo))
748 /* Public and protected members in the base are
750 base_access = access_protected_node;
751 else if (!TREE_VIA_PUBLIC (base_binfo))
752 /* Public and protected members in the base are
754 base_access = access_private_node;
756 /* See if the new access, via this base, gives more
757 access than our previous best access. */
759 (base_access == access_public_node
760 || (base_access == access_protected_node
761 && access != access_public_node)
762 || (base_access == access_private_node
765 access = base_access;
767 /* If the new access is public, we can't do better. */
768 if (access == access_public_node)
775 /* Note the access to DECL in TYPE. */
776 TREE_CHAIN (binfo) = access;
778 /* Mark TYPE as visited so that if we reach it again we do not
779 duplicate our efforts here. */
780 SET_BINFO_MARKED (binfo);
785 /* Return the access to DECL in TYPE. */
788 access_in_type (type, decl)
792 tree binfo = TYPE_BINFO (type);
794 /* We must take into account
798 If a name can be reached by several paths through a multiple
799 inheritance graph, the access is that of the path that gives
802 The algorithm we use is to make a post-order depth-first traversal
803 of the base-class hierarchy. As we come up the tree, we annotate
804 each node with the most lenient access. */
805 dfs_walk_real (binfo, 0, dfs_access_in_type, shared_unmarked_p, decl);
806 dfs_walk (binfo, dfs_unmark, shared_marked_p, 0);
807 assert_canonical_unmarked (binfo);
809 return TREE_CHAIN (binfo);
812 /* Called from dfs_accessible_p via dfs_walk. */
815 dfs_accessible_queue_p (binfo, data)
817 void *data ATTRIBUTE_UNUSED;
819 if (BINFO_MARKED (binfo))
822 /* If this class is inherited via private or protected inheritance,
823 then we can't see it, unless we are a friend of the subclass. */
824 if (!TREE_VIA_PUBLIC (binfo)
825 && !is_friend (BINFO_TYPE (BINFO_INHERITANCE_CHAIN (binfo)),
829 return canonical_binfo (binfo);
832 /* Called from dfs_accessible_p via dfs_walk. */
835 dfs_accessible_p (binfo, data)
839 int protected_ok = data != 0;
842 /* We marked the binfos while computing the access in each type.
843 So, we unmark as we go now. */
844 SET_BINFO_MARKED (binfo);
846 access = TREE_CHAIN (binfo);
847 if (access == access_public_node
848 || (access == access_protected_node && protected_ok))
850 else if (access && is_friend (BINFO_TYPE (binfo), current_scope ()))
856 /* Returns non-zero if it is OK to access DECL when named in TYPE
857 through an object indiated by BINFO in the context of DERIVED. */
860 protected_accessible_p (type, decl, derived, binfo)
868 /* We're checking this clause from [class.access.base]
870 m as a member of N is protected, and the reference occurs in a
871 member or friend of class N, or in a member or friend of a
872 class P derived from N, where m as a member of P is private or
875 If DERIVED isn't derived from TYPE, then it certainly does not
877 if (!DERIVED_FROM_P (type, derived))
880 access = access_in_type (derived, decl);
881 if (same_type_p (derived, type))
883 if (access != access_private_node)
886 else if (access != access_private_node
887 && access != access_protected_node)
892 When a friend or a member function of a derived class references
893 a protected nonstatic member of a base class, an access check
894 applies in addition to those described earlier in clause
895 _class.access_.4) Except when forming a pointer to member
896 (_expr.unary.op_), the access must be through a pointer to,
897 reference to, or object of the derived class itself (or any class
898 derived from that class) (_expr.ref_). If the access is to form
899 a pointer to member, the nested-name-specifier shall name the
900 derived class (or any class derived from that class). */
901 if (DECL_NONSTATIC_MEMBER_P (decl))
903 /* We can tell through what the reference is occurring by
904 chasing BINFO up to the root. */
906 while (BINFO_INHERITANCE_CHAIN (t))
907 t = BINFO_INHERITANCE_CHAIN (t);
909 if (!DERIVED_FROM_P (derived, BINFO_TYPE (t)))
916 /* Returns non-zero if SCOPE is a friend of a type which would be able
917 to acces DECL, named in TYPE, through the object indicated by
921 friend_accessible_p (scope, type, decl, binfo)
927 tree befriending_classes;
933 if (TREE_CODE (scope) == FUNCTION_DECL
934 || DECL_FUNCTION_TEMPLATE_P (scope))
935 befriending_classes = DECL_BEFRIENDING_CLASSES (scope);
936 else if (TYPE_P (scope))
937 befriending_classes = CLASSTYPE_BEFRIENDING_CLASSES (scope);
941 for (t = befriending_classes; t; t = TREE_CHAIN (t))
942 if (protected_accessible_p (type, decl, TREE_VALUE (t), binfo))
945 if (TREE_CODE (scope) == FUNCTION_DECL
946 || DECL_FUNCTION_TEMPLATE_P (scope))
948 /* Perhaps this SCOPE is a member of a class which is a
950 if (friend_accessible_p (DECL_CLASS_CONTEXT (scope), type,
954 /* Or an instantiation of something which is a friend. */
955 if (DECL_TEMPLATE_INFO (scope))
956 return friend_accessible_p (DECL_TI_TEMPLATE (scope),
959 else if (CLASSTYPE_TEMPLATE_INFO (scope))
960 return friend_accessible_p (CLASSTYPE_TI_TEMPLATE (scope),
966 /* DECL is a declaration from a base class of TYPE, which was the
967 classs used to name DECL. Return non-zero if, in the current
968 context, DECL is accessible. If TYPE is actually a BINFO node,
969 then we can tell in what context the access is occurring by looking
970 at the most derived class along the path indicated by BINFO. */
973 accessible_p (type, decl)
981 /* Non-zero if it's OK to access DECL if it has protected
982 accessibility in TYPE. */
983 int protected_ok = 0;
985 /* If we're not checking access, everything is accessible. */
986 if (!flag_access_control)
989 /* If this declaration is in a block or namespace scope, there's no
991 if (!TYPE_P (context_for_name_lookup (decl)))
994 /* We don't do access control for types yet. */
995 if (TREE_CODE (decl) == TYPE_DECL)
1001 type = BINFO_TYPE (type);
1004 binfo = TYPE_BINFO (type);
1006 /* [class.access.base]
1008 A member m is accessible when named in class N if
1010 --m as a member of N is public, or
1012 --m as a member of N is private, and the reference occurs in a
1013 member or friend of class N, or
1015 --m as a member of N is protected, and the reference occurs in a
1016 member or friend of class N, or in a member or friend of a
1017 class P derived from N, where m as a member of P is private or
1020 --there exists a base class B of N that is accessible at the point
1021 of reference, and m is accessible when named in class B.
1023 We walk the base class hierarchy, checking these conditions. */
1025 /* Figure out where the reference is occurring. Check to see if
1026 DECL is private or protected in this scope, since that will
1027 determine whether protected access in TYPE allowed. */
1028 if (current_class_type)
1030 = protected_accessible_p (type, decl, current_class_type,
1033 /* Now, loop through the classes of which we are a friend. */
1035 protected_ok = friend_accessible_p (current_scope (),
1038 /* Standardize on the same that will access_in_type will use. We
1039 don't need to know what path was chosen from this point onwards. */
1040 binfo = TYPE_BINFO (type);
1042 /* Compute the accessibility of DECL in the class hierarchy
1043 dominated by type. */
1044 access_in_type (type, decl);
1045 /* Walk the hierarchy again, looking for a base class that allows
1047 t = dfs_walk (binfo, dfs_accessible_p,
1048 dfs_accessible_queue_p,
1049 protected_ok ? &protected_ok : 0);
1050 /* Clear any mark bits. Note that we have to walk the whole tree
1051 here, since we have aborted the previous walk from some point
1052 deep in the tree. */
1053 dfs_walk (binfo, dfs_unmark, dfs_canonical_queue, 0);
1054 assert_canonical_unmarked (binfo);
1056 return t != NULL_TREE;
1059 /* Routine to see if the sub-object denoted by the binfo PARENT can be
1060 found as a base class and sub-object of the object denoted by
1061 BINFO. This routine relies upon binfos not being shared, except
1062 for binfos for virtual bases. */
1065 is_subobject_of_p (parent, binfo)
1071 /* We want to canonicalize for comparison purposes. But, when we
1072 iterate through basetypes later, we want the binfos from the
1073 original hierarchy. That's why we have to calculate BINFOS
1074 first, and then canonicalize. */
1075 binfos = BINFO_BASETYPES (binfo);
1076 parent = canonical_binfo (parent);
1077 binfo = canonical_binfo (binfo);
1079 if (parent == binfo)
1082 n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
1084 /* Process and/or queue base types. */
1085 for (i = 0; i < n_baselinks; i++)
1087 tree base_binfo = TREE_VEC_ELT (binfos, i);
1088 if (!CLASS_TYPE_P (TREE_TYPE (base_binfo)))
1089 /* If we see a TEMPLATE_TYPE_PARM, or some such, as a base
1090 class there's no way to descend into it. */
1093 if (is_subobject_of_p (parent, base_binfo))
1099 /* See if a one FIELD_DECL hides another. This routine is meant to
1100 correspond to ANSI working paper Sept 17, 1992 10p4. The two
1101 binfos given are the binfos corresponding to the particular places
1102 the FIELD_DECLs are found. This routine relies upon binfos not
1103 being shared, except for virtual bases. */
1106 hides (hider_binfo, hidee_binfo)
1107 tree hider_binfo, hidee_binfo;
1109 /* hider hides hidee, if hider has hidee as a base class and
1110 the instance of hidee is a sub-object of hider. The first
1111 part is always true is the second part is true.
1113 When hider and hidee are the same (two ways to get to the exact
1114 same member) we consider either one as hiding the other. */
1115 return is_subobject_of_p (hidee_binfo, hider_binfo);
1118 /* Very similar to lookup_fnfields_1 but it ensures that at least one
1119 function was declared inside the class given by TYPE. It really should
1120 only return functions that match the given TYPE. */
1123 lookup_fnfields_here (type, name)
1126 int idx = lookup_fnfields_1 (type, name);
1129 /* ctors and dtors are always only in the right class. */
1132 fndecls = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), idx);
1135 if (TYPE_MAIN_VARIANT (DECL_CLASS_CONTEXT (OVL_CURRENT (fndecls)))
1136 == TYPE_MAIN_VARIANT (type))
1138 fndecls = OVL_CHAIN (fndecls);
1143 struct lookup_field_info {
1144 /* The type in which we're looking. */
1146 /* The name of the field for which we're looking. */
1148 /* If non-NULL, the current result of the lookup. */
1150 /* The path to RVAL. */
1152 /* If non-NULL, the lookup was ambiguous, and this is a list of the
1155 /* If non-zero, we are looking for types, not data members. */
1157 /* If non-zero, RVAL was found by looking through a dependent base. */
1158 int from_dep_base_p;
1159 /* If something went wrong, a message indicating what. */
1163 /* Returns non-zero if BINFO is not hidden by the value found by the
1164 lookup so far. If BINFO is hidden, then there's no need to look in
1165 it. DATA is really a struct lookup_field_info. Called from
1166 lookup_field via breadth_first_search. */
1169 lookup_field_queue_p (binfo, data)
1173 struct lookup_field_info *lfi = (struct lookup_field_info *) data;
1175 /* Don't look for constructors or destructors in base classes. */
1176 if (lfi->name == ctor_identifier || lfi->name == dtor_identifier)
1179 /* If this base class is hidden by the best-known value so far, we
1180 don't need to look. */
1181 if (!lfi->from_dep_base_p && lfi->rval_binfo
1182 && hides (lfi->rval_binfo, binfo))
1185 if (TREE_VIA_VIRTUAL (binfo))
1186 return binfo_member (BINFO_TYPE (binfo),
1187 CLASSTYPE_VBASECLASSES (lfi->type));
1192 /* Within the scope of a template class, you can refer to the
1193 particular to the current specialization with the name of the
1194 template itself. For example:
1196 template <typename T> struct S { S* sp; }
1198 Returns non-zero if DECL is such a declaration in a class TYPE. */
1201 template_self_reference_p (type, decl)
1205 return (CLASSTYPE_USE_TEMPLATE (type)
1206 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (type))
1207 && TREE_CODE (decl) == TYPE_DECL
1208 && DECL_ARTIFICIAL (decl)
1209 && DECL_NAME (decl) == constructor_name (type));
1212 /* DATA is really a struct lookup_field_info. Look for a field with
1213 the name indicated there in BINFO. If this function returns a
1214 non-NULL value it is the result of the lookup. Called from
1215 lookup_field via breadth_first_search. */
1218 lookup_field_r (binfo, data)
1222 struct lookup_field_info *lfi = (struct lookup_field_info *) data;
1223 tree type = BINFO_TYPE (binfo);
1224 tree nval = NULL_TREE;
1225 int from_dep_base_p;
1227 /* First, look for a function. There can't be a function and a data
1228 member with the same name, and if there's a function and a type
1229 with the same name, the type is hidden by the function. */
1230 if (!lfi->want_type)
1232 int idx = lookup_fnfields_here (type, lfi->name);
1234 nval = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), idx);
1238 /* Look for a data member or type. */
1239 nval = lookup_field_1 (type, lfi->name);
1241 /* If there is no declaration with the indicated name in this type,
1242 then there's nothing to do. */
1246 /* If we're looking up a type (as with an elaborated type specifier)
1247 we ignore all non-types we find. */
1248 if (lfi->want_type && TREE_CODE (nval) != TYPE_DECL)
1250 nval = purpose_member (lfi->name, CLASSTYPE_TAGS (type));
1252 nval = TYPE_MAIN_DECL (TREE_VALUE (nval));
1257 /* You must name a template base class with a template-id. */
1258 if (!same_type_p (type, lfi->type)
1259 && template_self_reference_p (type, nval))
1262 from_dep_base_p = dependent_base_p (binfo);
1263 if (lfi->from_dep_base_p && !from_dep_base_p)
1265 /* If the new declaration is not found via a dependent base, and
1266 the old one was, then we must prefer the new one. We weren't
1267 really supposed to be able to find the old one, so we don't
1268 want to be affected by a specialization. Consider:
1270 struct B { typedef int I; };
1271 template <typename T> struct D1 : virtual public B {};
1272 template <typename T> struct D :
1273 public D1, virtual pubic B { I i; };
1275 The `I' in `D<T>' is unambigousuly `B::I', regardless of how
1276 D1 is specialized. */
1277 lfi->from_dep_base_p = 0;
1278 lfi->rval = NULL_TREE;
1279 lfi->rval_binfo = NULL_TREE;
1280 lfi->ambiguous = NULL_TREE;
1283 else if (lfi->rval_binfo && !lfi->from_dep_base_p && from_dep_base_p)
1284 /* Similarly, if the old declaration was not found via a dependent
1285 base, and the new one is, ignore the new one. */
1288 /* If the lookup already found a match, and the new value doesn't
1289 hide the old one, we might have an ambiguity. */
1290 if (lfi->rval_binfo && !hides (binfo, lfi->rval_binfo))
1292 if (nval == lfi->rval && SHARED_MEMBER_P (nval))
1293 /* The two things are really the same. */
1295 else if (hides (lfi->rval_binfo, binfo))
1296 /* The previous value hides the new one. */
1300 /* We have a real ambiguity. We keep a chain of all the
1302 if (!lfi->ambiguous && lfi->rval)
1304 /* This is the first time we noticed an ambiguity. Add
1305 what we previously thought was a reasonable candidate
1307 lfi->ambiguous = scratch_tree_cons (NULL_TREE, lfi->rval,
1309 TREE_TYPE (lfi->ambiguous) = error_mark_node;
1312 /* Add the new value. */
1313 lfi->ambiguous = scratch_tree_cons (NULL_TREE, nval,
1315 TREE_TYPE (lfi->ambiguous) = error_mark_node;
1316 lfi->errstr = "request for member `%D' is ambiguous";
1321 /* If the thing we're looking for is a virtual base class, then
1322 we know we've got what we want at this point; there's no way
1323 to get an ambiguity. */
1324 if (VBASE_NAME_P (lfi->name))
1330 if (from_dep_base_p && TREE_CODE (nval) != TYPE_DECL
1331 /* We need to return a member template class so we can
1332 define partial specializations. Is there a better
1334 && !DECL_CLASS_TEMPLATE_P (nval))
1335 /* The thing we're looking for isn't a type, so the implicit
1336 typename extension doesn't apply, so we just pretend we
1337 didn't find anything. */
1341 lfi->from_dep_base_p = from_dep_base_p;
1342 lfi->rval_binfo = binfo;
1348 /* Look for a memer named NAME in an inheritance lattice dominated by
1349 XBASETYPE. PROTECT is 0 or two, we do not check access. If it is
1350 1, we enforce accessibility. If PROTECT is zero, then, for an
1351 ambiguous lookup, we return NULL. If PROTECT is 1, we issue an
1352 error message. If PROTECT is 2, we return a TREE_LIST whose
1353 TREEE_TYPE is error_mark_node and whose TREE_VALUEs are the list of
1354 ambiguous candidates.
1356 WANT_TYPE is 1 when we should only return TYPE_DECLs, if no
1357 TYPE_DECL can be found return NULL_TREE. */
1360 lookup_member (xbasetype, name, protect, want_type)
1361 register tree xbasetype, name;
1362 int protect, want_type;
1364 tree rval, rval_binfo = NULL_TREE;
1365 tree type = NULL_TREE, basetype_path = NULL_TREE;
1366 struct lookup_field_info lfi;
1368 /* rval_binfo is the binfo associated with the found member, note,
1369 this can be set with useful information, even when rval is not
1370 set, because it must deal with ALL members, not just non-function
1371 members. It is used for ambiguity checking and the hidden
1372 checks. Whereas rval is only set if a proper (not hidden)
1373 non-function member is found. */
1375 const char *errstr = 0;
1377 if (xbasetype == current_class_type && TYPE_BEING_DEFINED (xbasetype)
1378 && IDENTIFIER_CLASS_VALUE (name))
1380 tree field = IDENTIFIER_CLASS_VALUE (name);
1381 if (TREE_CODE (field) != FUNCTION_DECL
1382 && ! (want_type && TREE_CODE (field) != TYPE_DECL))
1383 /* We're in the scope of this class, and the value has already
1384 been looked up. Just return the cached value. */
1388 if (TREE_CODE (xbasetype) == TREE_VEC)
1390 type = BINFO_TYPE (xbasetype);
1391 basetype_path = xbasetype;
1393 else if (IS_AGGR_TYPE_CODE (TREE_CODE (xbasetype)))
1396 basetype_path = TYPE_BINFO (type);
1397 my_friendly_assert (BINFO_INHERITANCE_CHAIN (basetype_path) == NULL_TREE,
1401 my_friendly_abort (97);
1403 complete_type (type);
1405 #ifdef GATHER_STATISTICS
1406 n_calls_lookup_field++;
1407 #endif /* GATHER_STATISTICS */
1409 bzero ((PTR) &lfi, sizeof (lfi));
1412 lfi.want_type = want_type;
1413 bfs_walk (basetype_path, &lookup_field_r, &lookup_field_queue_p, &lfi);
1415 rval_binfo = lfi.rval_binfo;
1417 type = BINFO_TYPE (rval_binfo);
1418 errstr = lfi.errstr;
1420 /* If we are not interested in ambiguities, don't report them;
1421 just return NULL_TREE. */
1422 if (!protect && lfi.ambiguous)
1428 return lfi.ambiguous;
1435 In the case of overloaded function names, access control is
1436 applied to the function selected by overloaded resolution. */
1437 if (rval && protect && !is_overloaded_fn (rval)
1438 && !IS_SIGNATURE_POINTER (DECL_REAL_CONTEXT (rval))
1439 && !IS_SIGNATURE_REFERENCE (DECL_REAL_CONTEXT (rval))
1440 && !enforce_access (xbasetype, rval))
1441 return error_mark_node;
1443 if (errstr && protect)
1445 cp_error (errstr, name, type);
1447 print_candidates (lfi.ambiguous);
1448 rval = error_mark_node;
1451 /* If the thing we found was found via the implicit typename
1452 extension, build the typename type. */
1453 if (rval && lfi.from_dep_base_p && !DECL_CLASS_TEMPLATE_P (rval))
1454 rval = TYPE_STUB_DECL (build_typename_type (BINFO_TYPE (basetype_path),
1458 if (rval && is_overloaded_fn (rval))
1460 rval = scratch_tree_cons (basetype_path, rval, NULL_TREE);
1461 SET_BASELINK_P (rval);
1467 /* Like lookup_member, except that if we find a function member we
1468 return NULL_TREE. */
1471 lookup_field (xbasetype, name, protect, want_type)
1472 register tree xbasetype, name;
1473 int protect, want_type;
1475 tree rval = lookup_member (xbasetype, name, protect, want_type);
1477 /* Ignore functions. */
1478 if (rval && TREE_CODE (rval) == TREE_LIST)
1484 /* Like lookup_member, except that if we find a non-function member we
1485 return NULL_TREE. */
1488 lookup_fnfields (xbasetype, name, protect)
1489 register tree xbasetype, name;
1492 tree rval = lookup_member (xbasetype, name, protect, /*want_type=*/0);
1494 /* Ignore non-functions. */
1495 if (rval && TREE_CODE (rval) != TREE_LIST)
1501 /* TYPE is a class type. Return the index of the fields within
1502 the method vector with name NAME, or -1 is no such field exists. */
1505 lookup_fnfields_1 (type, name)
1508 register tree method_vec
1509 = CLASS_TYPE_P (type) ? CLASSTYPE_METHOD_VEC (type) : NULL_TREE;
1511 if (method_vec != 0)
1513 register tree *methods = &TREE_VEC_ELT (method_vec, 0);
1514 register tree *end = TREE_VEC_END (method_vec);
1516 #ifdef GATHER_STATISTICS
1517 n_calls_lookup_fnfields_1++;
1518 #endif /* GATHER_STATISTICS */
1520 /* Constructors are first... */
1521 if (*methods && name == ctor_identifier)
1524 /* and destructors are second. */
1525 if (*++methods && name == dtor_identifier)
1528 while (++methods != end && *methods)
1530 #ifdef GATHER_STATISTICS
1531 n_outer_fields_searched++;
1532 #endif /* GATHER_STATISTICS */
1533 if (DECL_NAME (OVL_CURRENT (*methods)) == name)
1537 /* If we didn't find it, it might have been a template
1538 conversion operator. (Note that we don't look for this case
1539 above so that we will always find specializations first.) */
1540 if ((methods == end || !*methods)
1541 && IDENTIFIER_TYPENAME_P (name))
1543 methods = &TREE_VEC_ELT (method_vec, 0) + 1;
1545 while (++methods != end && *methods)
1547 tree method_name = DECL_NAME (OVL_CURRENT (*methods));
1549 if (!IDENTIFIER_TYPENAME_P (method_name))
1551 /* Since all conversion operators come first, we know
1552 there is no such operator. */
1556 else if (TREE_CODE (OVL_CURRENT (*methods)) == TEMPLATE_DECL)
1561 if (methods != end && *methods)
1562 return methods - &TREE_VEC_ELT (method_vec, 0);
1568 /* Walk the class hierarchy dominated by TYPE. FN is called for each
1569 type in the hierarchy, in a breadth-first preorder traversal. .
1570 If it ever returns a non-NULL value, that value is immediately
1571 returned and the walk is terminated. At each node FN, is passed a
1572 BINFO indicating the path from the curently visited base-class to
1573 TYPE. The TREE_CHAINs of the BINFOs may be used for scratch space;
1574 they are otherwise unused. Before each base-class is walked QFN is
1575 called. If the value returned is non-zero, the base-class is
1576 walked; otherwise it is not. If QFN is NULL, it is treated as a
1577 function which always returns 1. Both FN and QFN are passed the
1578 DATA whenever they are called. */
1581 bfs_walk (binfo, fn, qfn, data)
1583 tree (*fn) PROTO((tree, void *));
1584 tree (*qfn) PROTO((tree, void *));
1589 tree rval = NULL_TREE;
1590 /* An array of the base classes of BINFO. These will be built up in
1591 breadth-first order, except where QFN prunes the search. */
1592 varray_type bfs_bases;
1594 /* Start with enough room for ten base classes. That will be enough
1595 for most hierarchies. */
1596 VARRAY_TREE_INIT (bfs_bases, 10, "search_stack");
1598 /* Put the first type into the stack. */
1599 VARRAY_TREE (bfs_bases, 0) = binfo;
1602 for (head = 0; head < tail; ++head)
1608 /* Pull the next type out of the queue. */
1609 binfo = VARRAY_TREE (bfs_bases, head);
1611 /* If this is the one we're looking for, we're done. */
1612 rval = (*fn) (binfo, data);
1616 /* Queue up the base types. */
1617 binfos = BINFO_BASETYPES (binfo);
1618 n_baselinks = binfos ? TREE_VEC_LENGTH (binfos): 0;
1619 for (i = 0; i < n_baselinks; i++)
1621 tree base_binfo = TREE_VEC_ELT (binfos, i);
1624 base_binfo = (*qfn) (base_binfo, data);
1628 if (tail == VARRAY_SIZE (bfs_bases))
1629 VARRAY_GROW (bfs_bases, 2 * VARRAY_SIZE (bfs_bases));
1630 VARRAY_TREE (bfs_bases, tail) = base_binfo;
1637 VARRAY_FREE (bfs_bases);
1642 /* Exactly like bfs_walk, except that a depth-first traversal is
1643 performed, and PREFN is called in preorder, while POSTFN is called
1647 dfs_walk_real (binfo, prefn, postfn, qfn, data)
1649 tree (*prefn) PROTO((tree, void *));
1650 tree (*postfn) PROTO((tree, void *));
1651 tree (*qfn) PROTO((tree, void *));
1657 tree rval = NULL_TREE;
1659 /* Call the pre-order walking function. */
1662 rval = (*prefn) (binfo, data);
1667 /* Process the basetypes. */
1668 binfos = BINFO_BASETYPES (binfo);
1669 n_baselinks = binfos ? TREE_VEC_LENGTH (binfos): 0;
1670 for (i = 0; i < n_baselinks; i++)
1672 tree base_binfo = TREE_VEC_ELT (binfos, i);
1675 base_binfo = (*qfn) (base_binfo, data);
1679 rval = dfs_walk_real (base_binfo, prefn, postfn, qfn, data);
1685 /* Call the post-order walking function. */
1687 rval = (*postfn) (binfo, data);
1692 /* Exactly like bfs_walk, except that a depth-first post-order traversal is
1696 dfs_walk (binfo, fn, qfn, data)
1698 tree (*fn) PROTO((tree, void *));
1699 tree (*qfn) PROTO((tree, void *));
1702 return dfs_walk_real (binfo, 0, fn, qfn, data);
1707 /* The name of the function we are looking for. */
1709 /* The overloaded functions we have found. */
1713 /* Called from get_virtuals_named_this via bfs_walk. */
1716 get_virtuals_named_this_r (binfo, data)
1720 struct gvnt_info *gvnti = (struct gvnt_info *) data;
1721 tree type = BINFO_TYPE (binfo);
1724 idx = lookup_fnfields_here (BINFO_TYPE (binfo), gvnti->name);
1727 = scratch_tree_cons (binfo,
1728 TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type),
1735 /* Return the virtual functions with the indicated NAME in the type
1736 indicated by BINFO. The result is a TREE_LIST whose TREE_PURPOSE
1737 indicates the base class from which the TREE_VALUE (an OVERLOAD or
1738 just a FUNCTION_DECL) originated. */
1741 get_virtuals_named_this (binfo, name)
1745 struct gvnt_info gvnti;
1749 gvnti.fields = NULL_TREE;
1751 bfs_walk (binfo, get_virtuals_named_this_r, 0, &gvnti);
1753 /* Get to the function decls, and return the first virtual function
1754 with this name, if there is one. */
1755 for (fields = gvnti.fields; fields; fields = next_baselink (fields))
1759 for (fndecl = TREE_VALUE (fields); fndecl; fndecl = OVL_NEXT (fndecl))
1760 if (DECL_VINDEX (OVL_CURRENT (fndecl)))
1767 get_virtual_destructor (binfo, data)
1769 void *data ATTRIBUTE_UNUSED;
1771 tree type = BINFO_TYPE (binfo);
1772 if (TYPE_HAS_DESTRUCTOR (type)
1773 && DECL_VINDEX (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), 1)))
1774 return TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), 1);
1779 tree_has_any_destructor_p (binfo, data)
1781 void *data ATTRIBUTE_UNUSED;
1783 tree type = BINFO_TYPE (binfo);
1784 return TYPE_NEEDS_DESTRUCTOR (type) ? binfo : NULL_TREE;
1787 /* Returns > 0 if a function with type DRETTYPE overriding a function
1788 with type BRETTYPE is covariant, as defined in [class.virtual].
1790 Returns 1 if trivial covariance, 2 if non-trivial (requiring runtime
1791 adjustment), or -1 if pedantically invalid covariance. */
1794 covariant_return_p (brettype, drettype)
1795 tree brettype, drettype;
1799 if (TREE_CODE (brettype) == FUNCTION_DECL
1800 || TREE_CODE (brettype) == THUNK_DECL)
1802 brettype = TREE_TYPE (TREE_TYPE (brettype));
1803 drettype = TREE_TYPE (TREE_TYPE (drettype));
1805 else if (TREE_CODE (brettype) == METHOD_TYPE)
1807 brettype = TREE_TYPE (brettype);
1808 drettype = TREE_TYPE (drettype);
1811 if (same_type_p (brettype, drettype))
1814 if (! (TREE_CODE (brettype) == TREE_CODE (drettype)
1815 && (TREE_CODE (brettype) == POINTER_TYPE
1816 || TREE_CODE (brettype) == REFERENCE_TYPE)
1817 && TYPE_QUALS (brettype) == TYPE_QUALS (drettype)))
1820 if (! can_convert (brettype, drettype))
1823 brettype = TREE_TYPE (brettype);
1824 drettype = TREE_TYPE (drettype);
1826 /* If not pedantic, allow any standard pointer conversion. */
1827 if (! IS_AGGR_TYPE (drettype) || ! IS_AGGR_TYPE (brettype))
1830 binfo = get_binfo (brettype, drettype, 1);
1832 /* If we get an error_mark_node from get_binfo, it already complained,
1833 so let's just succeed. */
1834 if (binfo == error_mark_node)
1837 if (! BINFO_OFFSET_ZEROP (binfo) || TREE_VIA_VIRTUAL (binfo))
1842 /* Given a class type TYPE, and a function decl FNDECL, look for a
1843 virtual function in TYPE's hierarchy which FNDECL could match as a
1844 virtual function. It doesn't matter which one we find.
1846 DTORP is nonzero if we are looking for a destructor. Destructors
1847 need special treatment because they do not match by name. */
1850 get_matching_virtual (binfo, fndecl, dtorp)
1854 tree tmp = NULL_TREE;
1857 if (TREE_CODE (fndecl) == TEMPLATE_DECL)
1858 /* In [temp.mem] we have:
1860 A specialization of a member function template does not
1861 override a virtual function from a base class. */
1864 /* Breadth first search routines start searching basetypes
1865 of TYPE, so we must perform first ply of search here. */
1867 return bfs_walk (binfo, get_virtual_destructor,
1868 tree_has_any_destructor_p, 0);
1871 tree drettype, dtypes, btypes, instptr_type;
1872 tree basetype = DECL_CLASS_CONTEXT (fndecl);
1873 tree baselink, best = NULL_TREE;
1874 tree name = DECL_ASSEMBLER_NAME (fndecl);
1875 tree declarator = DECL_NAME (fndecl);
1876 if (IDENTIFIER_VIRTUAL_P (declarator) == 0)
1879 baselink = get_virtuals_named_this (binfo, declarator);
1880 if (baselink == NULL_TREE)
1883 drettype = TREE_TYPE (TREE_TYPE (fndecl));
1884 dtypes = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1885 if (DECL_STATIC_FUNCTION_P (fndecl))
1886 instptr_type = NULL_TREE;
1888 instptr_type = TREE_TYPE (TREE_VALUE (dtypes));
1890 for (; baselink; baselink = next_baselink (baselink))
1893 for (tmps = TREE_VALUE (baselink); tmps; tmps = OVL_NEXT (tmps))
1895 tmp = OVL_CURRENT (tmps);
1896 if (! DECL_VINDEX (tmp))
1899 btypes = TYPE_ARG_TYPES (TREE_TYPE (tmp));
1900 if (instptr_type == NULL_TREE)
1902 if (compparms (TREE_CHAIN (btypes), dtypes))
1903 /* Caller knows to give error in this case. */
1908 if (/* The first parameter is the `this' parameter,
1909 which has POINTER_TYPE, and we can therefore
1910 safely use TYPE_QUALS, rather than
1912 (TYPE_QUALS (TREE_TYPE (TREE_VALUE (btypes)))
1913 == TYPE_QUALS (instptr_type))
1914 && compparms (TREE_CHAIN (btypes), TREE_CHAIN (dtypes)))
1916 tree brettype = TREE_TYPE (TREE_TYPE (tmp));
1917 if (same_type_p (brettype, drettype))
1919 else if ((i = covariant_return_p (brettype, drettype)))
1922 sorry ("adjusting pointers for covariant returns");
1924 if (pedantic && i == -1)
1926 cp_pedwarn_at ("invalid covariant return type for `%#D' (must be pointer or reference to class)", fndecl);
1927 cp_pedwarn_at (" overriding `%#D'", tmp);
1930 else if (IS_AGGR_TYPE_2 (brettype, drettype)
1931 && same_or_base_type_p (brettype, drettype))
1933 error ("invalid covariant return type (must use pointer or reference)");
1934 cp_error_at (" overriding `%#D'", tmp);
1935 cp_error_at (" with `%#D'", fndecl);
1937 else if (IDENTIFIER_ERROR_LOCUS (name) == NULL_TREE)
1939 cp_error_at ("conflicting return type specified for virtual function `%#D'", fndecl);
1940 cp_error_at (" overriding definition as `%#D'", tmp);
1941 SET_IDENTIFIER_ERROR_LOCUS (name, basetype);
1944 /* FNDECL overrides this function. We continue to
1945 check all the other functions in order to catch
1946 errors; it might be that in some other baseclass
1947 a virtual function was declared with the same
1948 parameter types, but a different return type. */
1958 /* Return the list of virtual functions which are abstract in type
1959 TYPE that come from non virtual base classes. See
1960 expand_direct_vtbls_init for the style of search we do. */
1963 get_abstract_virtuals_1 (binfo, do_self, abstract_virtuals)
1966 tree abstract_virtuals;
1968 tree binfos = BINFO_BASETYPES (binfo);
1969 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
1971 for (i = 0; i < n_baselinks; i++)
1973 tree base_binfo = TREE_VEC_ELT (binfos, i);
1974 int is_not_base_vtable
1975 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo));
1976 if (! TREE_VIA_VIRTUAL (base_binfo))
1978 = get_abstract_virtuals_1 (base_binfo, is_not_base_vtable,
1981 /* Should we use something besides CLASSTYPE_VFIELDS? */
1982 if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
1984 tree virtuals = BINFO_VIRTUALS (binfo);
1986 skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
1990 tree base_pfn = FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals));
1991 tree base_fndecl = TREE_OPERAND (base_pfn, 0);
1992 if (DECL_ABSTRACT_VIRTUAL_P (base_fndecl))
1993 abstract_virtuals = tree_cons (NULL_TREE, base_fndecl, abstract_virtuals);
1994 virtuals = TREE_CHAIN (virtuals);
1997 return abstract_virtuals;
2000 /* Return the list of virtual functions which are abstract in type TYPE.
2001 This information is cached, and so must be built on a
2002 non-temporary obstack. */
2005 get_abstract_virtuals (type)
2009 tree abstract_virtuals = NULL;
2011 /* First get all from non-virtual bases. */
2013 = get_abstract_virtuals_1 (TYPE_BINFO (type), 1, abstract_virtuals);
2015 for (vbases = CLASSTYPE_VBASECLASSES (type); vbases; vbases = TREE_CHAIN (vbases))
2017 tree virtuals = BINFO_VIRTUALS (vbases);
2019 skip_rtti_stuff (&virtuals, type);
2023 tree base_pfn = FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals));
2024 tree base_fndecl = TREE_OPERAND (base_pfn, 0);
2025 if (DECL_NEEDS_FINAL_OVERRIDER_P (base_fndecl))
2026 cp_error ("`%#D' needs a final overrider", base_fndecl);
2027 else if (DECL_ABSTRACT_VIRTUAL_P (base_fndecl))
2028 abstract_virtuals = tree_cons (NULL_TREE, base_fndecl, abstract_virtuals);
2029 virtuals = TREE_CHAIN (virtuals);
2032 return nreverse (abstract_virtuals);
2036 next_baselink (baselink)
2039 tree tmp = TREE_TYPE (baselink);
2040 baselink = TREE_CHAIN (baselink);
2043 /* @@ does not yet add previous base types. */
2044 baselink = tree_cons (TREE_PURPOSE (tmp), TREE_VALUE (tmp),
2046 TREE_TYPE (baselink) = TREE_TYPE (tmp);
2047 tmp = TREE_CHAIN (tmp);
2052 /* DEPTH-FIRST SEARCH ROUTINES. */
2054 /* This routine converts a pointer to be a pointer of an immediate
2055 base class. The normal convert_pointer_to routine would diagnose
2056 the conversion as ambiguous, under MI code that has the base class
2057 as an ambiguous base class. */
2060 convert_pointer_to_single_level (to_type, expr)
2064 tree binfo_of_derived;
2067 derived = TREE_TYPE (TREE_TYPE (expr));
2068 binfo_of_derived = TYPE_BINFO (derived);
2069 my_friendly_assert (BINFO_INHERITANCE_CHAIN (binfo_of_derived) == NULL_TREE,
2071 for (i = CLASSTYPE_N_BASECLASSES (derived) - 1; i >= 0; --i)
2073 tree binfo = BINFO_BASETYPE (binfo_of_derived, i);
2074 my_friendly_assert (BINFO_INHERITANCE_CHAIN (binfo) == binfo_of_derived,
2076 if (same_type_p (BINFO_TYPE (binfo), to_type))
2077 return build_vbase_path (PLUS_EXPR,
2078 build_pointer_type (to_type),
2082 my_friendly_abort (19990607);
2088 tree markedp (binfo, data)
2090 void *data ATTRIBUTE_UNUSED;
2092 return BINFO_MARKED (binfo) ? binfo : NULL_TREE;
2096 unmarkedp (binfo, data)
2098 void *data ATTRIBUTE_UNUSED;
2100 return !BINFO_MARKED (binfo) ? binfo : NULL_TREE;
2104 marked_vtable_pathp (binfo, data)
2106 void *data ATTRIBUTE_UNUSED;
2108 return BINFO_VTABLE_PATH_MARKED (binfo) ? binfo : NULL_TREE;
2112 unmarked_vtable_pathp (binfo, data)
2114 void *data ATTRIBUTE_UNUSED;
2116 return !BINFO_VTABLE_PATH_MARKED (binfo) ? binfo : NULL_TREE;
2120 marked_new_vtablep (binfo, data)
2122 void *data ATTRIBUTE_UNUSED;
2124 return BINFO_NEW_VTABLE_MARKED (binfo) ? binfo : NULL_TREE;
2128 unmarked_new_vtablep (binfo, data)
2130 void *data ATTRIBUTE_UNUSED;
2132 return !BINFO_NEW_VTABLE_MARKED (binfo) ? binfo : NULL_TREE;
2136 marked_pushdecls_p (binfo, data)
2138 void *data ATTRIBUTE_UNUSED;
2140 return (CLASS_TYPE_P (BINFO_TYPE (binfo))
2141 && BINFO_PUSHDECLS_MARKED (binfo)) ? binfo : NULL_TREE;
2145 unmarked_pushdecls_p (binfo, data)
2147 void *data ATTRIBUTE_UNUSED;
2149 return (CLASS_TYPE_P (BINFO_TYPE (binfo))
2150 && !BINFO_PUSHDECLS_MARKED (binfo)) ? binfo : NULL_TREE;
2154 static int dfs_search_slot_nonempty_p (binfo) tree binfo;
2155 { return CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (binfo)) != 0; }
2159 dfs_debug_unmarkedp (binfo, data)
2161 void *data ATTRIBUTE_UNUSED;
2163 return (!CLASSTYPE_DEBUG_REQUESTED (BINFO_TYPE (binfo))
2164 ? binfo : NULL_TREE);
2167 /* The worker functions for `dfs_walk'. These do not need to
2168 test anything (vis a vis marking) if they are paired with
2169 a predicate function (above). */
2173 dfs_mark (binfo) tree binfo;
2174 { SET_BINFO_MARKED (binfo); }
2178 dfs_unmark (binfo, data)
2180 void *data ATTRIBUTE_UNUSED;
2182 CLEAR_BINFO_MARKED (binfo);
2188 dfs_mark_vtable_path (binfo) tree binfo;
2189 { SET_BINFO_VTABLE_PATH_MARKED (binfo); }
2192 dfs_unmark_vtable_path (binfo) tree binfo;
2193 { CLEAR_BINFO_VTABLE_PATH_MARKED (binfo); }
2196 dfs_mark_new_vtable (binfo) tree binfo;
2197 { SET_BINFO_NEW_VTABLE_MARKED (binfo); }
2200 dfs_unmark_new_vtable (binfo) tree binfo;
2201 { CLEAR_BINFO_NEW_VTABLE_MARKED (binfo); }
2204 dfs_clear_search_slot (binfo) tree binfo;
2205 { CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (binfo)) = 0; }
2209 dfs_debug_mark (binfo, data)
2211 void *data ATTRIBUTE_UNUSED;
2213 tree t = BINFO_TYPE (binfo);
2215 /* Use heuristic that if there are virtual functions,
2216 ignore until we see a non-inline virtual function. */
2217 tree methods = CLASSTYPE_METHOD_VEC (t);
2219 CLASSTYPE_DEBUG_REQUESTED (t) = 1;
2224 /* If interface info is known, either we've already emitted the debug
2225 info or we don't need to. */
2226 if (CLASSTYPE_INTERFACE_KNOWN (t))
2229 /* If debug info is requested from this context for this type, supply it.
2230 If debug info is requested from another context for this type,
2231 see if some third context can supply it. */
2232 if (current_function_decl == NULL_TREE
2233 || DECL_CLASS_CONTEXT (current_function_decl) != t)
2235 if (TREE_VEC_ELT (methods, 1))
2236 methods = TREE_VEC_ELT (methods, 1);
2237 else if (TREE_VEC_ELT (methods, 0))
2238 methods = TREE_VEC_ELT (methods, 0);
2240 methods = TREE_VEC_ELT (methods, 2);
2241 methods = OVL_CURRENT (methods);
2244 if (DECL_VINDEX (methods)
2245 && DECL_THIS_INLINE (methods) == 0
2246 && DECL_ABSTRACT_VIRTUAL_P (methods) == 0)
2248 /* Somebody, somewhere is going to have to define this
2249 virtual function. When they do, they will provide
2250 the debugging info. */
2253 methods = TREE_CHAIN (methods);
2256 /* We cannot rely on some alien method to solve our problems,
2257 so we must write out the debug info ourselves. */
2258 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = 0;
2259 rest_of_type_compilation (t, toplevel_bindings_p ());
2271 /* Attach to the type of the virtual base class, the pointer to the
2272 virtual base class. */
2275 dfs_find_vbases (binfo, data)
2279 struct vbase_info *vi = (struct vbase_info *) data;
2280 tree binfos = BINFO_BASETYPES (binfo);
2281 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2283 for (i = n_baselinks-1; i >= 0; i--)
2285 tree base_binfo = TREE_VEC_ELT (binfos, i);
2287 if (TREE_VIA_VIRTUAL (base_binfo)
2288 && CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (base_binfo)) == 0)
2290 tree vbase = BINFO_TYPE (base_binfo);
2291 tree binfo = binfo_member (vbase, vi->vbase_types);
2293 CLASSTYPE_SEARCH_SLOT (vbase)
2294 = build (PLUS_EXPR, build_pointer_type (vbase),
2295 vi->decl_ptr, BINFO_OFFSET (binfo));
2298 SET_BINFO_VTABLE_PATH_MARKED (binfo);
2299 SET_BINFO_NEW_VTABLE_MARKED (binfo);
2305 dfs_init_vbase_pointers (binfo, data)
2309 struct vbase_info *vi = (struct vbase_info *) data;
2310 tree type = BINFO_TYPE (binfo);
2311 tree fields = TYPE_FIELDS (type);
2312 tree this_vbase_ptr;
2314 CLEAR_BINFO_VTABLE_PATH_MARKED (binfo);
2317 /* See finish_struct_1 for when we can enable this. */
2318 /* If we have a vtable pointer first, skip it. */
2319 if (VFIELD_NAME_P (DECL_NAME (fields)))
2320 fields = TREE_CHAIN (fields);
2323 if (BINFO_INHERITANCE_CHAIN (binfo))
2325 this_vbase_ptr = TREE_CHAIN (BINFO_INHERITANCE_CHAIN (binfo));
2326 if (TREE_VIA_VIRTUAL (binfo))
2327 this_vbase_ptr = CLASSTYPE_SEARCH_SLOT (type);
2329 this_vbase_ptr = convert_pointer_to_single_level (type,
2331 TREE_CHAIN (binfo) = this_vbase_ptr;
2334 this_vbase_ptr = TREE_CHAIN (binfo);
2336 if (fields == NULL_TREE
2337 || DECL_NAME (fields) == NULL_TREE
2338 || ! VBASE_NAME_P (DECL_NAME (fields)))
2341 if (build_pointer_type (type)
2342 != TYPE_MAIN_VARIANT (TREE_TYPE (this_vbase_ptr)))
2343 my_friendly_abort (125);
2345 while (fields && DECL_NAME (fields) && VBASE_NAME_P (DECL_NAME (fields)))
2347 tree ref = build (COMPONENT_REF, TREE_TYPE (fields),
2348 build_indirect_ref (this_vbase_ptr, NULL_PTR), fields);
2349 tree init = CLASSTYPE_SEARCH_SLOT (TREE_TYPE (TREE_TYPE (fields)));
2350 vi->inits = tree_cons (binfo_member (TREE_TYPE (TREE_TYPE (fields)),
2352 build_modify_expr (ref, NOP_EXPR, init),
2354 fields = TREE_CHAIN (fields);
2360 /* Sometimes this needs to clear both VTABLE_PATH and NEW_VTABLE. Other
2361 times, just NEW_VTABLE, but optimizer should make both with equal
2362 efficiency (though it does not currently). */
2365 dfs_clear_vbase_slots (binfo, data)
2367 void *data ATTRIBUTE_UNUSED;
2369 tree type = BINFO_TYPE (binfo);
2370 CLASSTYPE_SEARCH_SLOT (type) = 0;
2371 CLEAR_BINFO_VTABLE_PATH_MARKED (binfo);
2372 CLEAR_BINFO_NEW_VTABLE_MARKED (binfo);
2377 init_vbase_pointers (type, decl_ptr)
2381 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
2383 struct vbase_info vi;
2384 int old_flag = flag_this_is_variable;
2385 tree binfo = TYPE_BINFO (type);
2386 flag_this_is_variable = -2;
2388 /* Find all the virtual base classes, marking them for later
2390 vi.decl_ptr = decl_ptr;
2391 vi.vbase_types = CLASSTYPE_VBASECLASSES (type);
2392 vi.inits = NULL_TREE;
2394 dfs_walk (binfo, dfs_find_vbases, unmarked_vtable_pathp, &vi);
2396 /* Build up a list of the initializers. */
2397 TREE_CHAIN (binfo) = decl_ptr;
2398 dfs_walk_real (binfo,
2399 dfs_init_vbase_pointers, 0,
2400 marked_vtable_pathp,
2403 dfs_walk (binfo, dfs_clear_vbase_slots, marked_new_vtablep, 0);
2404 flag_this_is_variable = old_flag;
2410 /* get the virtual context (the vbase that directly contains the
2411 DECL_CLASS_CONTEXT of the FNDECL) that the given FNDECL is declared in,
2412 or NULL_TREE if there is none.
2414 FNDECL must come from a virtual table from a virtual base to ensure that
2415 there is only one possible DECL_CLASS_CONTEXT.
2417 We know that if there is more than one place (binfo) the fndecl that the
2418 declared, they all refer to the same binfo. See get_class_offset_1 for
2419 the check that ensures this. */
2422 virtual_context (fndecl, t, vbase)
2423 tree fndecl, t, vbase;
2426 if (get_base_distance (DECL_CLASS_CONTEXT (fndecl), t, 0, &path) < 0)
2428 /* DECL_CLASS_CONTEXT can be ambiguous in t. */
2429 if (get_base_distance (DECL_CLASS_CONTEXT (fndecl), vbase, 0, &path) >= 0)
2433 /* Not sure if checking path == vbase is necessary here, but just in
2435 if (TREE_VIA_VIRTUAL (path) || path == vbase)
2436 return binfo_member (BINFO_TYPE (path), CLASSTYPE_VBASECLASSES (t));
2437 path = BINFO_INHERITANCE_CHAIN (path);
2440 /* This shouldn't happen, I don't want errors! */
2441 warning ("recoverable compiler error, fixups for virtual function");
2446 if (TREE_VIA_VIRTUAL (path))
2447 return binfo_member (BINFO_TYPE (path), CLASSTYPE_VBASECLASSES (t));
2448 path = BINFO_INHERITANCE_CHAIN (path);
2453 /* Fixups upcast offsets for one vtable.
2454 Entries may stay within the VBASE given, or
2455 they may upcast into a direct base, or
2456 they may upcast into a different vbase.
2458 We only need to do fixups in case 2 and 3. In case 2, we add in
2459 the virtual base offset to effect an upcast, in case 3, we add in
2460 the virtual base offset to effect an upcast, then subtract out the
2461 offset for the other virtual base, to effect a downcast into it.
2463 This routine mirrors fixup_vtable_deltas in functionality, though
2464 this one is runtime based, and the other is compile time based.
2465 Conceivably that routine could be removed entirely, and all fixups
2468 VBASE_OFFSETS is an association list of virtual bases that contains
2469 offset information for the virtual bases, so the offsets are only
2470 calculated once. The offsets are computed by where we think the
2471 vbase should be (as noted by the CLASSTYPE_SEARCH_SLOT) minus where
2472 the vbase really is. */
2475 expand_upcast_fixups (binfo, addr, orig_addr, vbase, vbase_addr, t,
2477 tree binfo, addr, orig_addr, vbase, vbase_addr, t, *vbase_offsets;
2479 tree virtuals = BINFO_VIRTUALS (binfo);
2482 unsigned HOST_WIDE_INT n;
2484 delta = purpose_member (vbase, *vbase_offsets);
2487 delta = CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (vbase));
2488 delta = build (MINUS_EXPR, ptrdiff_type_node, delta, vbase_addr);
2489 delta = save_expr (delta);
2490 delta = tree_cons (vbase, delta, *vbase_offsets);
2491 *vbase_offsets = delta;
2494 n = skip_rtti_stuff (&virtuals, t);
2498 tree current_fndecl = TREE_VALUE (virtuals);
2499 current_fndecl = FNADDR_FROM_VTABLE_ENTRY (current_fndecl);
2500 current_fndecl = TREE_OPERAND (current_fndecl, 0);
2502 && current_fndecl != abort_fndecl
2503 && (vc=virtual_context (current_fndecl, t, vbase)) != vbase)
2505 /* This may in fact need a runtime fixup. */
2506 tree idx = build_int_2 (n, 0);
2507 tree vtbl = BINFO_VTABLE (binfo);
2508 tree nvtbl = lookup_name (DECL_NAME (vtbl), 0);
2509 tree aref, ref, naref;
2510 tree old_delta, new_delta;
2513 if (nvtbl == NULL_TREE
2514 || nvtbl == IDENTIFIER_GLOBAL_VALUE (DECL_NAME (vtbl)))
2516 /* Dup it if it isn't in local scope yet. */
2518 (VAR_DECL, DECL_NAME (vtbl),
2519 TYPE_MAIN_VARIANT (TREE_TYPE (vtbl)));
2520 DECL_ALIGN (nvtbl) = MAX (TYPE_ALIGN (double_type_node),
2521 DECL_ALIGN (nvtbl));
2522 TREE_READONLY (nvtbl) = 0;
2523 DECL_ARTIFICIAL (nvtbl) = 1;
2524 nvtbl = pushdecl (nvtbl);
2526 cp_finish_decl (nvtbl, init, NULL_TREE, 0,
2527 LOOKUP_ONLYCONVERTING);
2529 /* We don't set DECL_VIRTUAL_P and DECL_CONTEXT on nvtbl
2530 because they wouldn't be useful; everything that wants to
2531 look at the vtable will look at the decl for the normal
2532 vtable. Setting DECL_CONTEXT also screws up
2533 decl_function_context. */
2535 init = build (MODIFY_EXPR, TREE_TYPE (nvtbl),
2537 TREE_SIDE_EFFECTS (init) = 1;
2538 expand_expr_stmt (init);
2539 /* Update the vtable pointers as necessary. */
2540 ref = build_vfield_ref
2541 (build_indirect_ref (addr, NULL_PTR),
2542 DECL_CONTEXT (CLASSTYPE_VFIELD (BINFO_TYPE (binfo))));
2544 (build_modify_expr (ref, NOP_EXPR, nvtbl));
2546 assemble_external (vtbl);
2547 aref = build_array_ref (vtbl, idx);
2548 naref = build_array_ref (nvtbl, idx);
2549 old_delta = build_component_ref (aref, delta_identifier,
2551 new_delta = build_component_ref (naref, delta_identifier,
2554 /* This is a upcast, so we have to add the offset for the
2556 old_delta = build_binary_op (PLUS_EXPR, old_delta,
2557 TREE_VALUE (delta));
2560 /* If this is set, we need to subtract out the delta
2561 adjustments for the other virtual base that we
2563 tree vc_delta = purpose_member (vc, *vbase_offsets);
2566 tree vc_addr = convert_pointer_to_real (vc, orig_addr);
2567 vc_delta = CLASSTYPE_SEARCH_SLOT (BINFO_TYPE (vc));
2568 vc_delta = build (MINUS_EXPR, ptrdiff_type_node,
2570 vc_delta = save_expr (vc_delta);
2571 *vbase_offsets = tree_cons (vc, vc_delta, *vbase_offsets);
2574 vc_delta = TREE_VALUE (vc_delta);
2576 /* This is a downcast, so we have to subtract the offset
2577 for the virtual base. */
2578 old_delta = build_binary_op (MINUS_EXPR, old_delta, vc_delta);
2581 TREE_READONLY (new_delta) = 0;
2582 TREE_TYPE (new_delta) =
2583 cp_build_qualified_type (TREE_TYPE (new_delta),
2584 CP_TYPE_QUALS (TREE_TYPE (new_delta))
2585 & ~TYPE_QUAL_CONST);
2586 expand_expr_stmt (build_modify_expr (new_delta, NOP_EXPR,
2590 virtuals = TREE_CHAIN (virtuals);
2594 /* Fixup upcast offsets for all direct vtables. Patterned after
2595 expand_direct_vtbls_init. */
2598 fixup_virtual_upcast_offsets (real_binfo, binfo, init_self, can_elide, addr, orig_addr, type, vbase, vbase_offsets)
2599 tree real_binfo, binfo;
2600 int init_self, can_elide;
2601 tree addr, orig_addr, type, vbase, *vbase_offsets;
2603 tree real_binfos = BINFO_BASETYPES (real_binfo);
2604 tree binfos = BINFO_BASETYPES (binfo);
2605 int i, n_baselinks = real_binfos ? TREE_VEC_LENGTH (real_binfos) : 0;
2607 for (i = 0; i < n_baselinks; i++)
2609 tree real_base_binfo = TREE_VEC_ELT (real_binfos, i);
2610 tree base_binfo = TREE_VEC_ELT (binfos, i);
2611 int is_not_base_vtable
2612 = i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (real_binfo));
2613 if (! TREE_VIA_VIRTUAL (real_base_binfo))
2614 fixup_virtual_upcast_offsets (real_base_binfo, base_binfo,
2615 is_not_base_vtable, can_elide, addr,
2616 orig_addr, type, vbase, vbase_offsets);
2619 /* Before turning this on, make sure it is correct. */
2620 if (can_elide && ! BINFO_MODIFIED (binfo))
2623 /* Should we use something besides CLASSTYPE_VFIELDS? */
2624 if (init_self && CLASSTYPE_VFIELDS (BINFO_TYPE (real_binfo)))
2626 tree new_addr = convert_pointer_to_real (binfo, addr);
2627 expand_upcast_fixups (real_binfo, new_addr, orig_addr, vbase, addr,
2628 type, vbase_offsets);
2632 /* Emit initialization of vfields of BASE, where the complete object
2633 is pointed to by decl_ptr. DO_SELF indicates we have to do our own
2634 vfield, otherwise only proceed to our own direct non-virtual bases. */
2637 expand_direct_vtbls_init_thunks (base, decl_ptr, do_self)
2638 tree base, decl_ptr;
2642 tree type = BINFO_TYPE (base);
2643 tree binfos = BINFO_BASETYPES (base);
2644 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
2645 tree vlist = lookup_name (vlist_identifier, 0);
2646 int in_dtor = DECL_DESTRUCTOR_FOR_PVBASE_P (current_function_decl);
2648 my_friendly_assert (vlist != NULL_TREE, 990320);
2651 /* In the destructor, we find the vfield pointers for the bases in
2652 reverse order, before we find our own vfield pointer. */
2653 for (i = n_baselinks - 1; i >= 0; i--)
2655 tree base_binfo = TREE_VEC_ELT (binfos, i);
2656 int is_not_base_vtable
2657 = i != CLASSTYPE_VFIELD_PARENT (type);
2658 if (! TREE_VIA_VIRTUAL (base_binfo))
2659 expand_direct_vtbls_init_thunks (base_binfo, decl_ptr,
2660 is_not_base_vtable);
2663 if (do_self && CLASSTYPE_VFIELDS (type))
2665 addr = build_vbase_path (PLUS_EXPR, build_pointer_type (type),
2667 addr = build_indirect_ref (addr, "vptr");
2668 addr = build_vfield_ref (addr, type);
2670 /* In a destructor, we decrease the vlist before we retrieve the
2671 value. In a constructor, we increase the vlist after we
2672 retrieve the value. */
2675 expr = build_binary_op (MINUS_EXPR, vlist, integer_one_node);
2676 expr = build_modify_expr (vlist, NOP_EXPR, expr);
2677 expand_expr_stmt (expr);
2680 /* Store the next vptr into the vbase's vptr. */
2681 expr = build_indirect_ref (vlist, "__vlist");
2682 expr = convert_force (TREE_TYPE (addr), expr, 0);
2683 expr = build_modify_expr (addr, NOP_EXPR, expr);
2684 expand_expr_stmt (expr);
2686 /* Advance the vlist. */
2689 expr = build_binary_op (PLUS_EXPR, vlist, integer_one_node);
2690 expr = build_modify_expr (vlist, NOP_EXPR, expr);
2691 expand_expr_stmt (expr);
2696 for (i = 0; i < n_baselinks; i++)
2698 tree base_binfo = TREE_VEC_ELT (binfos, i);
2699 int is_not_base_vtable = i != CLASSTYPE_VFIELD_PARENT (type);
2700 if (! TREE_VIA_VIRTUAL (base_binfo))
2701 expand_direct_vtbls_init_thunks (base_binfo, decl_ptr,
2702 is_not_base_vtable);
2706 /* Like expand_indirect_vtbls_init below, but based on the vtable list
2707 passed to the constructor. */
2710 expand_indirect_vtbls_init_thunks (binfo, true_exp, decl_ptr)
2712 tree true_exp, decl_ptr;
2714 tree type = BINFO_TYPE (binfo);
2715 tree vbases = CLASSTYPE_VBASECLASSES (type);
2716 struct vbase_info vi;
2718 vi.decl_ptr = (true_exp ? build_unary_op (ADDR_EXPR, true_exp, 0)
2720 vi.vbase_types = vbases;
2722 dfs_walk (binfo, dfs_find_vbases, unmarked_new_vtablep, &vi);
2724 /* Initialized with vtables of type TYPE. */
2725 for (; vbases; vbases = TREE_CHAIN (vbases))
2729 if (!CLASSTYPE_VFIELD (BINFO_TYPE (vbases)))
2730 /* This vbase doesn't have a vptr of its own. */
2734 addr = convert_pointer_to_vbase (TREE_TYPE (vbases), decl_ptr);
2735 expand_direct_vtbls_init_thunks (TYPE_BINFO (BINFO_TYPE (vbases)),
2740 dfs_walk (binfo, dfs_clear_vbase_slots, marked_new_vtablep, 0);
2743 /* Build a COMPOUND_EXPR which when expanded will generate the code
2744 needed to initialize all the virtual function table slots of all
2745 the virtual baseclasses. MAIN_BINFO is the binfo which determines
2746 the virtual baseclasses to use; TYPE is the type of the object to
2747 which the initialization applies. TRUE_EXP is the true object we
2748 are initializing, and DECL_PTR is the pointer to the sub-object we
2751 When USE_COMPUTED_OFFSETS is non-zero, we can assume that the
2752 object was laid out by a top-level constructor and the computed
2753 offsets are valid to store vtables. When zero, we must store new
2754 vtables through virtual baseclass pointers. */
2757 expand_indirect_vtbls_init (binfo, true_exp, decl_ptr)
2759 tree true_exp, decl_ptr;
2761 tree type = BINFO_TYPE (binfo);
2763 /* This function executes during the finish_function() segment,
2764 AFTER the auto variables and temporary stack space has been marked
2765 unused...If space is needed for the virtual function tables,
2766 some of them might fit within what the compiler now thinks
2767 are available stack slots... These values are actually initialized at
2768 the beginnning of the function, so when the automatics use their space,
2769 they will overwrite the values that are placed here. Marking all
2770 temporary space as unavailable prevents this from happening. */
2772 mark_all_temps_used();
2774 if (TYPE_USES_PVBASES (type))
2776 expand_indirect_vtbls_init_thunks (binfo, true_exp, decl_ptr);
2780 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
2782 rtx fixup_insns = NULL_RTX;
2783 tree vbases = CLASSTYPE_VBASECLASSES (type);
2784 struct vbase_info vi;
2785 vi.decl_ptr = (true_exp ? build_unary_op (ADDR_EXPR, true_exp, 0)
2787 vi.vbase_types = vbases;
2789 dfs_walk (binfo, dfs_find_vbases, unmarked_new_vtablep, &vi);
2791 /* Initialized with vtables of type TYPE. */
2792 for (; vbases; vbases = TREE_CHAIN (vbases))
2796 addr = convert_pointer_to_vbase (TREE_TYPE (vbases), vi.decl_ptr);
2798 /* Do all vtables from this virtual base. */
2799 /* This assumes that virtual bases can never serve as parent
2800 binfos. (in the CLASSTYPE_VFIELD_PARENT sense) */
2801 expand_direct_vtbls_init (vbases, TYPE_BINFO (BINFO_TYPE (vbases)),
2804 /* Now we adjust the offsets for virtual functions that
2805 cross virtual boundaries on an implicit upcast on vf call
2806 so that the layout of the most complete type is used,
2807 instead of assuming the layout of the virtual bases from
2808 our current type. */
2810 if (flag_vtable_thunks)
2812 /* We don't have dynamic thunks yet!
2813 So for now, just fail silently. */
2817 tree vbase_offsets = NULL_TREE;
2818 push_to_sequence (fixup_insns);
2819 fixup_virtual_upcast_offsets (vbases,
2820 TYPE_BINFO (BINFO_TYPE (vbases)),
2821 1, 0, addr, vi.decl_ptr,
2822 type, vbases, &vbase_offsets);
2823 fixup_insns = get_insns ();
2830 extern tree in_charge_identifier;
2831 tree in_charge_node = lookup_name (in_charge_identifier, 0);
2832 if (! in_charge_node)
2834 warning ("recoverable internal compiler error, nobody's in charge!");
2835 in_charge_node = integer_zero_node;
2837 in_charge_node = build_binary_op (EQ_EXPR, in_charge_node, integer_zero_node);
2838 expand_start_cond (in_charge_node, 0);
2839 emit_insns (fixup_insns);
2843 dfs_walk (binfo, dfs_clear_vbase_slots, marked_new_vtablep, 0);
2847 /* get virtual base class types.
2848 This adds type to the vbase_types list in reverse dfs order.
2849 Ordering is very important, so don't change it. */
2852 dfs_get_vbase_types (binfo, data)
2856 tree *vbase_types = (tree *) data;
2858 if (TREE_VIA_VIRTUAL (binfo) && ! BINFO_VBASE_MARKED (binfo))
2860 tree new_vbase = make_binfo (integer_zero_node, binfo,
2861 BINFO_VTABLE (binfo),
2862 BINFO_VIRTUALS (binfo));
2863 TREE_CHAIN (new_vbase) = *vbase_types;
2864 TREE_VIA_VIRTUAL (new_vbase) = 1;
2865 *vbase_types = new_vbase;
2866 SET_BINFO_VBASE_MARKED (binfo);
2868 SET_BINFO_MARKED (binfo);
2872 /* Return a list of binfos for the virtual base classes for TYPE, in
2873 depth-first search order. The list is freshly allocated, so
2874 no modification is made to the current binfo hierarchy. */
2877 get_vbase_types (type)
2884 binfo = TYPE_BINFO (type);
2885 vbase_types = NULL_TREE;
2886 dfs_walk (binfo, dfs_get_vbase_types, unmarkedp, &vbase_types);
2887 dfs_walk (binfo, dfs_unmark, markedp, 0);
2888 /* Rely upon the reverse dfs ordering from dfs_get_vbase_types, and now
2889 reverse it so that we get normal dfs ordering. */
2890 vbase_types = nreverse (vbase_types);
2892 /* unmark marked vbases */
2893 for (vbases = vbase_types; vbases; vbases = TREE_CHAIN (vbases))
2894 CLEAR_BINFO_VBASE_MARKED (vbases);
2899 /* If we want debug info for a type TYPE, make sure all its base types
2900 are also marked as being potentially interesting. This avoids
2901 the problem of not writing any debug info for intermediate basetypes
2902 that have abstract virtual functions. Also mark member types. */
2905 note_debug_info_needed (type)
2910 if (current_template_parms)
2913 if (TYPE_BEING_DEFINED (type))
2914 /* We can't go looking for the base types and fields just yet. */
2917 /* We can't do the TYPE_DECL_SUPPRESS_DEBUG thing with DWARF, which
2918 does not support name references between translation units. Well, we
2919 could, but that would mean putting global labels in the debug output
2920 before each exported type and each of its functions and static data
2922 if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG)
2925 dfs_walk (TYPE_BINFO (type), dfs_debug_mark, dfs_debug_unmarkedp, 0);
2926 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
2929 if (TREE_CODE (field) == FIELD_DECL
2930 && IS_AGGR_TYPE (ttype = target_type (TREE_TYPE (field)))
2931 && dfs_debug_unmarkedp (TYPE_BINFO (ttype), 0))
2932 note_debug_info_needed (ttype);
2936 /* Subroutines of push_class_decls (). */
2938 /* Returns 1 iff BINFO is a base we shouldn't really be able to see into,
2939 because it (or one of the intermediate bases) depends on template parms. */
2942 dependent_base_p (binfo)
2945 for (; binfo; binfo = BINFO_INHERITANCE_CHAIN (binfo))
2947 if (currently_open_class (TREE_TYPE (binfo)))
2949 if (uses_template_parms (TREE_TYPE (binfo)))
2956 setup_class_bindings (name, type_binding_p)
2960 tree type_binding = NULL_TREE;
2963 /* If we've already done the lookup for this declaration, we're
2965 if (IDENTIFIER_CLASS_VALUE (name))
2968 /* First, deal with the type binding. */
2971 type_binding = lookup_member (current_class_type, name,
2974 if (TREE_CODE (type_binding) == TREE_LIST
2975 && TREE_TYPE (type_binding) == error_mark_node)
2976 /* NAME is ambiguous. */
2977 push_class_level_binding (name, type_binding);
2979 pushdecl_class_level (type_binding);
2982 /* Now, do the value binding. */
2983 value_binding = lookup_member (current_class_type, name,
2988 && (TREE_CODE (value_binding) == TYPE_DECL
2989 || (TREE_CODE (value_binding) == TREE_LIST
2990 && TREE_TYPE (value_binding) == error_mark_node
2991 && (TREE_CODE (TREE_VALUE (value_binding))
2993 /* We found a type-binding, even when looking for a non-type
2994 binding. This means that we already processed this binding
2996 my_friendly_assert (type_binding_p, 19990401);
2999 if (TREE_CODE (value_binding) == TREE_LIST
3000 && TREE_TYPE (value_binding) == error_mark_node)
3001 /* NAME is ambiguous. */
3002 push_class_level_binding (name, value_binding);
3005 if (BASELINK_P (value_binding))
3006 /* NAME is some overloaded functions. */
3007 value_binding = TREE_VALUE (value_binding);
3008 pushdecl_class_level (value_binding);
3013 /* Push class-level declarations for any names appearing in BINFO that
3017 dfs_push_type_decls (binfo, data)
3019 void *data ATTRIBUTE_UNUSED;
3024 type = BINFO_TYPE (binfo);
3025 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
3026 if (DECL_NAME (fields) && TREE_CODE (fields) == TYPE_DECL
3027 && !(!same_type_p (type, current_class_type)
3028 && template_self_reference_p (type, fields)))
3029 setup_class_bindings (DECL_NAME (fields), /*type_binding_p=*/1);
3031 /* We can't just use BINFO_MARKED because envelope_add_decl uses
3032 DERIVED_FROM_P, which calls get_base_distance. */
3033 SET_BINFO_PUSHDECLS_MARKED (binfo);
3038 /* Push class-level declarations for any names appearing in BINFO that
3039 are not TYPE_DECLS. */
3042 dfs_push_decls (binfo, data)
3050 type = BINFO_TYPE (binfo);
3051 dep_base_p = (processing_template_decl && type != current_class_type
3052 && dependent_base_p (binfo));
3056 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
3057 if (DECL_NAME (fields)
3058 && TREE_CODE (fields) != TYPE_DECL
3059 && TREE_CODE (fields) != USING_DECL)
3060 setup_class_bindings (DECL_NAME (fields), /*type_binding_p=*/0);
3061 else if (TREE_CODE (fields) == FIELD_DECL
3062 && ANON_UNION_TYPE_P (TREE_TYPE (fields)))
3063 dfs_push_decls (TYPE_BINFO (TREE_TYPE (fields)), data);
3065 method_vec = (CLASS_TYPE_P (type)
3066 ? CLASSTYPE_METHOD_VEC (type) : NULL_TREE);
3072 /* Farm out constructors and destructors. */
3073 end = TREE_VEC_END (method_vec);
3075 for (methods = &TREE_VEC_ELT (method_vec, 2);
3076 *methods && methods != end;
3078 setup_class_bindings (DECL_NAME (OVL_CURRENT (*methods)),
3079 /*type_binding_p=*/0);
3083 CLEAR_BINFO_PUSHDECLS_MARKED (binfo);
3088 /* When entering the scope of a class, we cache all of the
3089 fields that that class provides within its inheritance
3090 lattice. Where ambiguities result, we mark them
3091 with `error_mark_node' so that if they are encountered
3092 without explicit qualification, we can emit an error
3096 push_class_decls (type)
3099 struct obstack *ambient_obstack = current_obstack;
3100 search_stack = push_search_level (search_stack, &search_obstack);
3102 /* Build up all the relevant bindings and such on the cache
3103 obstack. That way no memory is wasted when we throw away the
3105 push_cache_obstack ();
3107 /* Enter type declarations and mark. */
3108 dfs_walk (TYPE_BINFO (type), dfs_push_type_decls, unmarked_pushdecls_p, 0);
3110 /* Enter non-type declarations and unmark. */
3111 dfs_walk (TYPE_BINFO (type), dfs_push_decls, marked_pushdecls_p, 0);
3113 /* Undo the call to push_cache_obstack above. */
3116 current_obstack = ambient_obstack;
3119 /* Here's a subroutine we need because C lacks lambdas. */
3122 dfs_unuse_fields (binfo, data)
3124 void *data ATTRIBUTE_UNUSED;
3126 tree type = TREE_TYPE (binfo);
3129 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
3131 if (TREE_CODE (fields) != FIELD_DECL)
3134 TREE_USED (fields) = 0;
3135 if (DECL_NAME (fields) == NULL_TREE
3136 && TREE_CODE (TREE_TYPE (fields)) == UNION_TYPE)
3137 unuse_fields (TREE_TYPE (fields));
3147 dfs_walk (TYPE_BINFO (type), dfs_unuse_fields, unmarkedp, 0);
3153 /* We haven't pushed a search level when dealing with cached classes,
3154 so we'd better not try to pop it. */
3156 search_stack = pop_search_level (search_stack);
3160 print_search_statistics ()
3162 #ifdef GATHER_STATISTICS
3163 fprintf (stderr, "%d fields searched in %d[%d] calls to lookup_field[_1]\n",
3164 n_fields_searched, n_calls_lookup_field, n_calls_lookup_field_1);
3165 fprintf (stderr, "%d fnfields searched in %d calls to lookup_fnfields\n",
3166 n_outer_fields_searched, n_calls_lookup_fnfields);
3167 fprintf (stderr, "%d calls to get_base_type\n", n_calls_get_base_type);
3168 #else /* GATHER_STATISTICS */
3169 fprintf (stderr, "no search statistics\n");
3170 #endif /* GATHER_STATISTICS */
3174 init_search_processing ()
3176 gcc_obstack_init (&search_obstack);
3177 _vptr_name = get_identifier ("_vptr");
3181 reinit_search_statistics ()
3183 #ifdef GATHER_STATISTICS
3184 n_fields_searched = 0;
3185 n_calls_lookup_field = 0, n_calls_lookup_field_1 = 0;
3186 n_calls_lookup_fnfields = 0, n_calls_lookup_fnfields_1 = 0;
3187 n_calls_get_base_type = 0;
3188 n_outer_fields_searched = 0;
3189 n_contexts_saved = 0;
3190 #endif /* GATHER_STATISTICS */
3193 #define scratch_tree_cons expr_tree_cons
3196 add_conversions (binfo, data)
3201 tree method_vec = CLASSTYPE_METHOD_VEC (BINFO_TYPE (binfo));
3202 tree *conversions = (tree *) data;
3204 for (i = 2; i < TREE_VEC_LENGTH (method_vec); ++i)
3206 tree tmp = TREE_VEC_ELT (method_vec, i);
3209 if (!tmp || ! DECL_CONV_FN_P (OVL_CURRENT (tmp)))
3212 name = DECL_NAME (OVL_CURRENT (tmp));
3214 /* Make sure we don't already have this conversion. */
3215 if (! IDENTIFIER_MARKED (name))
3217 *conversions = scratch_tree_cons (binfo, tmp, *conversions);
3218 IDENTIFIER_MARKED (name) = 1;
3225 lookup_conversions (type)
3229 tree conversions = NULL_TREE;
3231 if (TYPE_SIZE (type))
3232 bfs_walk (TYPE_BINFO (type), add_conversions, 0, &conversions);
3234 for (t = conversions; t; t = TREE_CHAIN (t))
3235 IDENTIFIER_MARKED (DECL_NAME (OVL_CURRENT (TREE_VALUE (t)))) = 0;
3246 /* Check whether the empty class indicated by EMPTY_BINFO is also present
3247 at offset 0 in COMPARE_TYPE, and set found_overlap if so. */
3250 dfs_check_overlap (empty_binfo, data)
3254 struct overlap_info *oi = (struct overlap_info *) data;
3256 for (binfo = TYPE_BINFO (oi->compare_type);
3258 binfo = BINFO_BASETYPE (binfo, 0))
3260 if (BINFO_TYPE (binfo) == BINFO_TYPE (empty_binfo))
3262 oi->found_overlap = 1;
3265 else if (BINFO_BASETYPES (binfo) == NULL_TREE)
3272 /* Trivial function to stop base traversal when we find something. */
3275 dfs_no_overlap_yet (binfo, data)
3279 struct overlap_info *oi = (struct overlap_info *) data;
3280 return !oi->found_overlap ? binfo : NULL_TREE;
3283 /* Returns nonzero if EMPTY_TYPE or any of its bases can also be found at
3284 offset 0 in NEXT_TYPE. Used in laying out empty base class subobjects. */
3287 types_overlap_p (empty_type, next_type)
3288 tree empty_type, next_type;
3290 struct overlap_info oi;
3292 if (! IS_AGGR_TYPE (next_type))
3294 oi.compare_type = next_type;
3295 oi.found_overlap = 0;
3296 dfs_walk (TYPE_BINFO (empty_type), dfs_check_overlap,
3297 dfs_no_overlap_yet, &oi);
3298 return oi.found_overlap;
3307 dfs_bfv_queue_p (binfo, data)
3311 struct bfv_info *bfvi = (struct bfv_info *) data;
3313 /* Use the real virtual base class objects, not the placeholders in
3314 the usual hierarchy. */
3315 if (TREE_VIA_VIRTUAL (binfo))
3316 return binfo_member (BINFO_TYPE (binfo), bfvi->vbases);
3321 /* Passed to dfs_walk_real by binfo_for_vtable; determine if bvtable
3322 comes from BINFO. */
3325 dfs_bfv_helper (binfo, data)
3329 struct bfv_info *bfvi = (struct bfv_info *) data;
3331 if (BINFO_VTABLE (binfo) == bfvi->var)
3336 /* Given a vtable VAR, determine which binfo it comes from. */
3339 binfo_for_vtable (var)
3343 struct bfv_info bfvi;
3345 type = DECL_CONTEXT (var);
3346 bfvi.vbases = CLASSTYPE_VBASECLASSES (type);
3348 return dfs_walk_real (TYPE_BINFO (type),
3349 0, dfs_bfv_helper, dfs_bfv_queue_p, &bfvi);