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