xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/cp/search.c (revision b83ebeba7f767758d2778bb0f9d7a76534253621)
1 /* Breadth-first and depth-first routines for
2    searching multiple-inheritance lattice for GNU C++.
3    Copyright (C) 1987-2013 Free Software Foundation, Inc.
4    Contributed by Michael Tiemann (tiemann@cygnus.com)
5 
6 This file is part of GCC.
7 
8 GCC 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 3, or (at your option)
11 any later version.
12 
13 GCC 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 GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21 
22 /* High-level class interface.  */
23 
24 #include "config.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include "tm.h"
28 #include "tree.h"
29 #include "cp-tree.h"
30 #include "intl.h"
31 #include "flags.h"
32 #include "toplev.h"
33 #include "target.h"
34 
35 static int is_subobject_of_p (tree, tree);
36 static tree dfs_lookup_base (tree, void *);
37 static tree dfs_dcast_hint_pre (tree, void *);
38 static tree dfs_dcast_hint_post (tree, void *);
39 static tree dfs_debug_mark (tree, void *);
40 static tree dfs_walk_once_r (tree, tree (*pre_fn) (tree, void *),
41 			     tree (*post_fn) (tree, void *), void *data);
42 static void dfs_unmark_r (tree);
43 static int check_hidden_convs (tree, int, int, tree, tree, tree);
44 static tree split_conversions (tree, tree, tree, tree);
45 static int lookup_conversions_r (tree, int, int,
46 				 tree, tree, tree, tree, tree *, tree *);
47 static int look_for_overrides_r (tree, tree);
48 static tree lookup_field_r (tree, void *);
49 static tree dfs_accessible_post (tree, void *);
50 static tree dfs_walk_once_accessible_r (tree, bool, bool,
51 					tree (*pre_fn) (tree, void *),
52 					tree (*post_fn) (tree, void *),
53 					void *data);
54 static tree dfs_walk_once_accessible (tree, bool,
55 				      tree (*pre_fn) (tree, void *),
56 				      tree (*post_fn) (tree, void *),
57 				      void *data);
58 static tree dfs_access_in_type (tree, void *);
59 static access_kind access_in_type (tree, tree);
60 static int protected_accessible_p (tree, tree, tree);
61 static int friend_accessible_p (tree, tree, tree);
62 static tree dfs_get_pure_virtuals (tree, void *);
63 
64 
65 /* Variables for gathering statistics.  */
66 static int n_fields_searched;
67 static int n_calls_lookup_field, n_calls_lookup_field_1;
68 static int n_calls_lookup_fnfields, n_calls_lookup_fnfields_1;
69 static int n_calls_get_base_type;
70 static int n_outer_fields_searched;
71 static int n_contexts_saved;
72 
73 
74 /* Data for lookup_base and its workers.  */
75 
76 struct lookup_base_data_s
77 {
78   tree t;		/* type being searched.  */
79   tree base;		/* The base type we're looking for.  */
80   tree binfo;		/* Found binfo.  */
81   bool via_virtual;	/* Found via a virtual path.  */
82   bool ambiguous;	/* Found multiply ambiguous */
83   bool repeated_base;	/* Whether there are repeated bases in the
84 			    hierarchy.  */
85   bool want_any;	/* Whether we want any matching binfo.  */
86 };
87 
88 /* Worker function for lookup_base.  See if we've found the desired
89    base and update DATA_ (a pointer to LOOKUP_BASE_DATA_S).  */
90 
91 static tree
92 dfs_lookup_base (tree binfo, void *data_)
93 {
94   struct lookup_base_data_s *data = (struct lookup_base_data_s *) data_;
95 
96   if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), data->base))
97     {
98       if (!data->binfo)
99 	{
100 	  data->binfo = binfo;
101 	  data->via_virtual
102 	    = binfo_via_virtual (data->binfo, data->t) != NULL_TREE;
103 
104 	  if (!data->repeated_base)
105 	    /* If there are no repeated bases, we can stop now.  */
106 	    return binfo;
107 
108 	  if (data->want_any && !data->via_virtual)
109 	    /* If this is a non-virtual base, then we can't do
110 	       better.  */
111 	    return binfo;
112 
113 	  return dfs_skip_bases;
114 	}
115       else
116 	{
117 	  gcc_assert (binfo != data->binfo);
118 
119 	  /* We've found more than one matching binfo.  */
120 	  if (!data->want_any)
121 	    {
122 	      /* This is immediately ambiguous.  */
123 	      data->binfo = NULL_TREE;
124 	      data->ambiguous = true;
125 	      return error_mark_node;
126 	    }
127 
128 	  /* Prefer one via a non-virtual path.  */
129 	  if (!binfo_via_virtual (binfo, data->t))
130 	    {
131 	      data->binfo = binfo;
132 	      data->via_virtual = false;
133 	      return binfo;
134 	    }
135 
136 	  /* There must be repeated bases, otherwise we'd have stopped
137 	     on the first base we found.  */
138 	  return dfs_skip_bases;
139 	}
140     }
141 
142   return NULL_TREE;
143 }
144 
145 /* Returns true if type BASE is accessible in T.  (BASE is known to be
146    a (possibly non-proper) base class of T.)  If CONSIDER_LOCAL_P is
147    true, consider any special access of the current scope, or access
148    bestowed by friendship.  */
149 
150 bool
151 accessible_base_p (tree t, tree base, bool consider_local_p)
152 {
153   tree decl;
154 
155   /* [class.access.base]
156 
157      A base class is said to be accessible if an invented public
158      member of the base class is accessible.
159 
160      If BASE is a non-proper base, this condition is trivially
161      true.  */
162   if (same_type_p (t, base))
163     return true;
164   /* Rather than inventing a public member, we use the implicit
165      public typedef created in the scope of every class.  */
166   decl = TYPE_FIELDS (base);
167   while (!DECL_SELF_REFERENCE_P (decl))
168     decl = DECL_CHAIN (decl);
169   while (ANON_AGGR_TYPE_P (t))
170     t = TYPE_CONTEXT (t);
171   return accessible_p (t, decl, consider_local_p);
172 }
173 
174 /* Lookup BASE in the hierarchy dominated by T.  Do access checking as
175    ACCESS specifies.  Return the binfo we discover.  If KIND_PTR is
176    non-NULL, fill with information about what kind of base we
177    discovered.
178 
179    If the base is inaccessible, or ambiguous, then error_mark_node is
180    returned.  If the tf_error bit of COMPLAIN is not set, no error
181    is issued.  */
182 
183 tree
184 lookup_base (tree t, tree base, base_access access,
185 	     base_kind *kind_ptr, tsubst_flags_t complain)
186 {
187   tree binfo;
188   tree t_binfo;
189   base_kind bk;
190 
191   /* "Nothing" is definitely not derived from Base.  */
192   if (t == NULL_TREE)
193     {
194       if (kind_ptr)
195 	*kind_ptr = bk_not_base;
196       return NULL_TREE;
197     }
198 
199   if (t == error_mark_node || base == error_mark_node)
200     {
201       if (kind_ptr)
202 	*kind_ptr = bk_not_base;
203       return error_mark_node;
204     }
205   gcc_assert (TYPE_P (base));
206 
207   if (!TYPE_P (t))
208     {
209       t_binfo = t;
210       t = BINFO_TYPE (t);
211     }
212   else
213     {
214       t = complete_type (TYPE_MAIN_VARIANT (t));
215       t_binfo = TYPE_BINFO (t);
216     }
217 
218   base = TYPE_MAIN_VARIANT (base);
219 
220   /* If BASE is incomplete, it can't be a base of T--and instantiating it
221      might cause an error.  */
222   if (t_binfo && CLASS_TYPE_P (base) && COMPLETE_OR_OPEN_TYPE_P (base))
223     {
224       struct lookup_base_data_s data;
225 
226       data.t = t;
227       data.base = base;
228       data.binfo = NULL_TREE;
229       data.ambiguous = data.via_virtual = false;
230       data.repeated_base = CLASSTYPE_REPEATED_BASE_P (t);
231       data.want_any = access == ba_any;
232 
233       dfs_walk_once (t_binfo, dfs_lookup_base, NULL, &data);
234       binfo = data.binfo;
235 
236       if (!binfo)
237 	bk = data.ambiguous ? bk_ambig : bk_not_base;
238       else if (binfo == t_binfo)
239 	bk = bk_same_type;
240       else if (data.via_virtual)
241 	bk = bk_via_virtual;
242       else
243 	bk = bk_proper_base;
244     }
245   else
246     {
247       binfo = NULL_TREE;
248       bk = bk_not_base;
249     }
250 
251   /* Check that the base is unambiguous and accessible.  */
252   if (access != ba_any)
253     switch (bk)
254       {
255       case bk_not_base:
256 	break;
257 
258       case bk_ambig:
259 	if (complain & tf_error)
260 	  error ("%qT is an ambiguous base of %qT", base, t);
261 	binfo = error_mark_node;
262 	break;
263 
264       default:
265 	if ((access & ba_check_bit)
266 	    /* If BASE is incomplete, then BASE and TYPE are probably
267 	       the same, in which case BASE is accessible.  If they
268 	       are not the same, then TYPE is invalid.  In that case,
269 	       there's no need to issue another error here, and
270 	       there's no implicit typedef to use in the code that
271 	       follows, so we skip the check.  */
272 	    && COMPLETE_TYPE_P (base)
273 	    && !accessible_base_p (t, base, !(access & ba_ignore_scope)))
274 	  {
275 	    if (complain & tf_error)
276 	      error ("%qT is an inaccessible base of %qT", base, t);
277 	    binfo = error_mark_node;
278 	    bk = bk_inaccessible;
279 	  }
280 	break;
281       }
282 
283   if (kind_ptr)
284     *kind_ptr = bk;
285 
286   return binfo;
287 }
288 
289 /* Data for dcast_base_hint walker.  */
290 
291 struct dcast_data_s
292 {
293   tree subtype;   /* The base type we're looking for.  */
294   int virt_depth; /* Number of virtual bases encountered from most
295 		     derived.  */
296   tree offset;    /* Best hint offset discovered so far.  */
297   bool repeated_base;  /* Whether there are repeated bases in the
298 			  hierarchy.  */
299 };
300 
301 /* Worker for dcast_base_hint.  Search for the base type being cast
302    from.  */
303 
304 static tree
305 dfs_dcast_hint_pre (tree binfo, void *data_)
306 {
307   struct dcast_data_s *data = (struct dcast_data_s *) data_;
308 
309   if (BINFO_VIRTUAL_P (binfo))
310     data->virt_depth++;
311 
312   if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), data->subtype))
313     {
314       if (data->virt_depth)
315 	{
316 	  data->offset = ssize_int (-1);
317 	  return data->offset;
318 	}
319       if (data->offset)
320 	data->offset = ssize_int (-3);
321       else
322 	data->offset = BINFO_OFFSET (binfo);
323 
324       return data->repeated_base ? dfs_skip_bases : data->offset;
325     }
326 
327   return NULL_TREE;
328 }
329 
330 /* Worker for dcast_base_hint.  Track the virtual depth.  */
331 
332 static tree
333 dfs_dcast_hint_post (tree binfo, void *data_)
334 {
335   struct dcast_data_s *data = (struct dcast_data_s *) data_;
336 
337   if (BINFO_VIRTUAL_P (binfo))
338     data->virt_depth--;
339 
340   return NULL_TREE;
341 }
342 
343 /* The dynamic cast runtime needs a hint about how the static SUBTYPE type
344    started from is related to the required TARGET type, in order to optimize
345    the inheritance graph search. This information is independent of the
346    current context, and ignores private paths, hence get_base_distance is
347    inappropriate. Return a TREE specifying the base offset, BOFF.
348    BOFF >= 0, there is only one public non-virtual SUBTYPE base at offset BOFF,
349       and there are no public virtual SUBTYPE bases.
350    BOFF == -1, SUBTYPE occurs as multiple public virtual or non-virtual bases.
351    BOFF == -2, SUBTYPE is not a public base.
352    BOFF == -3, SUBTYPE occurs as multiple public non-virtual bases.  */
353 
354 tree
355 dcast_base_hint (tree subtype, tree target)
356 {
357   struct dcast_data_s data;
358 
359   data.subtype = subtype;
360   data.virt_depth = 0;
361   data.offset = NULL_TREE;
362   data.repeated_base = CLASSTYPE_REPEATED_BASE_P (target);
363 
364   dfs_walk_once_accessible (TYPE_BINFO (target), /*friends=*/false,
365 			    dfs_dcast_hint_pre, dfs_dcast_hint_post, &data);
366   return data.offset ? data.offset : ssize_int (-2);
367 }
368 
369 /* Search for a member with name NAME in a multiple inheritance
370    lattice specified by TYPE.  If it does not exist, return NULL_TREE.
371    If the member is ambiguously referenced, return `error_mark_node'.
372    Otherwise, return a DECL with the indicated name.  If WANT_TYPE is
373    true, type declarations are preferred.  */
374 
375 /* Do a 1-level search for NAME as a member of TYPE.  The caller must
376    figure out whether it can access this field.  (Since it is only one
377    level, this is reasonable.)  */
378 
379 tree
380 lookup_field_1 (tree type, tree name, bool want_type)
381 {
382   tree field;
383 
384   gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
385 
386   if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
387       || TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM
388       || TREE_CODE (type) == TYPENAME_TYPE)
389     /* The TYPE_FIELDS of a TEMPLATE_TYPE_PARM and
390        BOUND_TEMPLATE_TEMPLATE_PARM are not fields at all;
391        instead TYPE_FIELDS is the TEMPLATE_PARM_INDEX.  (Miraculously,
392        the code often worked even when we treated the index as a list
393        of fields!)
394        The TYPE_FIELDS of TYPENAME_TYPE is its TYPENAME_TYPE_FULLNAME.  */
395     return NULL_TREE;
396 
397   if (CLASSTYPE_SORTED_FIELDS (type))
398     {
399       tree *fields = &CLASSTYPE_SORTED_FIELDS (type)->elts[0];
400       int lo = 0, hi = CLASSTYPE_SORTED_FIELDS (type)->len;
401       int i;
402 
403       while (lo < hi)
404 	{
405 	  i = (lo + hi) / 2;
406 
407 	  if (GATHER_STATISTICS)
408 	    n_fields_searched++;
409 
410 	  if (DECL_NAME (fields[i]) > name)
411 	    hi = i;
412 	  else if (DECL_NAME (fields[i]) < name)
413 	    lo = i + 1;
414 	  else
415 	    {
416 	      field = NULL_TREE;
417 
418 	      /* We might have a nested class and a field with the
419 		 same name; we sorted them appropriately via
420 		 field_decl_cmp, so just look for the first or last
421 		 field with this name.  */
422 	      if (want_type)
423 		{
424 		  do
425 		    field = fields[i--];
426 		  while (i >= lo && DECL_NAME (fields[i]) == name);
427 		  if (TREE_CODE (field) != TYPE_DECL
428 		      && !DECL_TYPE_TEMPLATE_P (field))
429 		    field = NULL_TREE;
430 		}
431 	      else
432 		{
433 		  do
434 		    field = fields[i++];
435 		  while (i < hi && DECL_NAME (fields[i]) == name);
436 		}
437 
438 	      if (field)
439 	      	{
440 	      	  field = strip_using_decl (field);
441 	      	  if (is_overloaded_fn (field))
442 	      	    field = NULL_TREE;
443 	      	}
444 
445 	      return field;
446 	    }
447 	}
448       return NULL_TREE;
449     }
450 
451   field = TYPE_FIELDS (type);
452 
453   if (GATHER_STATISTICS)
454     n_calls_lookup_field_1++;
455 
456   for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
457     {
458       tree decl = field;
459 
460       if (GATHER_STATISTICS)
461 	n_fields_searched++;
462 
463       gcc_assert (DECL_P (field));
464       if (DECL_NAME (field) == NULL_TREE
465 	  && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
466 	{
467 	  tree temp = lookup_field_1 (TREE_TYPE (field), name, want_type);
468 	  if (temp)
469 	    return temp;
470 	}
471 
472       if (TREE_CODE (decl) == USING_DECL
473 	  && DECL_NAME (decl) == name)
474 	{
475 	  decl = strip_using_decl (decl);
476 	  if (is_overloaded_fn (decl))
477 	    continue;
478 	}
479 
480       if (DECL_NAME (decl) == name
481 	  && (!want_type
482 	      || TREE_CODE (decl) == TYPE_DECL
483 	      || DECL_TYPE_TEMPLATE_P (decl)))
484 	return decl;
485     }
486   /* Not found.  */
487   if (name == vptr_identifier)
488     {
489       /* Give the user what s/he thinks s/he wants.  */
490       if (TYPE_POLYMORPHIC_P (type))
491 	return TYPE_VFIELD (type);
492     }
493   return NULL_TREE;
494 }
495 
496 /* Return the FUNCTION_DECL, RECORD_TYPE, UNION_TYPE, or
497    NAMESPACE_DECL corresponding to the innermost non-block scope.  */
498 
499 tree
500 current_scope (void)
501 {
502   /* There are a number of cases we need to be aware of here:
503 			 current_class_type	current_function_decl
504      global			NULL			NULL
505      fn-local			NULL			SET
506      class-local		SET			NULL
507      class->fn			SET			SET
508      fn->class			SET			SET
509 
510      Those last two make life interesting.  If we're in a function which is
511      itself inside a class, we need decls to go into the fn's decls (our
512      second case below).  But if we're in a class and the class itself is
513      inside a function, we need decls to go into the decls for the class.  To
514      achieve this last goal, we must see if, when both current_class_ptr and
515      current_function_decl are set, the class was declared inside that
516      function.  If so, we know to put the decls into the class's scope.  */
517   if (current_function_decl && current_class_type
518       && ((DECL_FUNCTION_MEMBER_P (current_function_decl)
519 	   && same_type_p (DECL_CONTEXT (current_function_decl),
520 			   current_class_type))
521 	  || (DECL_FRIEND_CONTEXT (current_function_decl)
522 	      && same_type_p (DECL_FRIEND_CONTEXT (current_function_decl),
523 			      current_class_type))))
524     return current_function_decl;
525   if (current_class_type)
526     return current_class_type;
527   if (current_function_decl)
528     return current_function_decl;
529   return current_namespace;
530 }
531 
532 /* Returns nonzero if we are currently in a function scope.  Note
533    that this function returns zero if we are within a local class, but
534    not within a member function body of the local class.  */
535 
536 int
537 at_function_scope_p (void)
538 {
539   tree cs = current_scope ();
540   /* Also check cfun to make sure that we're really compiling
541      this function (as opposed to having set current_function_decl
542      for access checking or some such).  */
543   return (cs && TREE_CODE (cs) == FUNCTION_DECL
544 	  && cfun && cfun->decl == current_function_decl);
545 }
546 
547 /* Returns true if the innermost active scope is a class scope.  */
548 
549 bool
550 at_class_scope_p (void)
551 {
552   tree cs = current_scope ();
553   return cs && TYPE_P (cs);
554 }
555 
556 /* Returns true if the innermost active scope is a namespace scope.  */
557 
558 bool
559 at_namespace_scope_p (void)
560 {
561   tree cs = current_scope ();
562   return cs && TREE_CODE (cs) == NAMESPACE_DECL;
563 }
564 
565 /* Return the scope of DECL, as appropriate when doing name-lookup.  */
566 
567 tree
568 context_for_name_lookup (tree decl)
569 {
570   /* [class.union]
571 
572      For the purposes of name lookup, after the anonymous union
573      definition, the members of the anonymous union are considered to
574      have been defined in the scope in which the anonymous union is
575      declared.  */
576   tree context = DECL_CONTEXT (decl);
577 
578   while (context && TYPE_P (context)
579 	 && (ANON_AGGR_TYPE_P (context) || UNSCOPED_ENUM_P (context)))
580     context = TYPE_CONTEXT (context);
581   if (!context)
582     context = global_namespace;
583 
584   return context;
585 }
586 
587 /* The accessibility routines use BINFO_ACCESS for scratch space
588    during the computation of the accessibility of some declaration.  */
589 
590 #define BINFO_ACCESS(NODE) \
591   ((access_kind) ((TREE_PUBLIC (NODE) << 1) | TREE_PRIVATE (NODE)))
592 
593 /* Set the access associated with NODE to ACCESS.  */
594 
595 #define SET_BINFO_ACCESS(NODE, ACCESS)			\
596   ((TREE_PUBLIC (NODE) = ((ACCESS) & 2) != 0),	\
597    (TREE_PRIVATE (NODE) = ((ACCESS) & 1) != 0))
598 
599 /* Called from access_in_type via dfs_walk.  Calculate the access to
600    DATA (which is really a DECL) in BINFO.  */
601 
602 static tree
603 dfs_access_in_type (tree binfo, void *data)
604 {
605   tree decl = (tree) data;
606   tree type = BINFO_TYPE (binfo);
607   access_kind access = ak_none;
608 
609   if (context_for_name_lookup (decl) == type)
610     {
611       /* If we have descended to the scope of DECL, just note the
612 	 appropriate access.  */
613       if (TREE_PRIVATE (decl))
614 	access = ak_private;
615       else if (TREE_PROTECTED (decl))
616 	access = ak_protected;
617       else
618 	access = ak_public;
619     }
620   else
621     {
622       /* First, check for an access-declaration that gives us more
623 	 access to the DECL.  */
624       if (DECL_LANG_SPECIFIC (decl) && !DECL_DISCRIMINATOR_P (decl))
625 	{
626 	  tree decl_access = purpose_member (type, DECL_ACCESS (decl));
627 
628 	  if (decl_access)
629 	    {
630 	      decl_access = TREE_VALUE (decl_access);
631 
632 	      if (decl_access == access_public_node)
633 		access = ak_public;
634 	      else if (decl_access == access_protected_node)
635 		access = ak_protected;
636 	      else if (decl_access == access_private_node)
637 		access = ak_private;
638 	      else
639 		gcc_unreachable ();
640 	    }
641 	}
642 
643       if (!access)
644 	{
645 	  int i;
646 	  tree base_binfo;
647 	  vec<tree, va_gc> *accesses;
648 
649 	  /* Otherwise, scan our baseclasses, and pick the most favorable
650 	     access.  */
651 	  accesses = BINFO_BASE_ACCESSES (binfo);
652 	  for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
653 	    {
654 	      tree base_access = (*accesses)[i];
655 	      access_kind base_access_now = BINFO_ACCESS (base_binfo);
656 
657 	      if (base_access_now == ak_none || base_access_now == ak_private)
658 		/* If it was not accessible in the base, or only
659 		   accessible as a private member, we can't access it
660 		   all.  */
661 		base_access_now = ak_none;
662 	      else if (base_access == access_protected_node)
663 		/* Public and protected members in the base become
664 		   protected here.  */
665 		base_access_now = ak_protected;
666 	      else if (base_access == access_private_node)
667 		/* Public and protected members in the base become
668 		   private here.  */
669 		base_access_now = ak_private;
670 
671 	      /* See if the new access, via this base, gives more
672 		 access than our previous best access.  */
673 	      if (base_access_now != ak_none
674 		  && (access == ak_none || base_access_now < access))
675 		{
676 		  access = base_access_now;
677 
678 		  /* If the new access is public, we can't do better.  */
679 		  if (access == ak_public)
680 		    break;
681 		}
682 	    }
683 	}
684     }
685 
686   /* Note the access to DECL in TYPE.  */
687   SET_BINFO_ACCESS (binfo, access);
688 
689   return NULL_TREE;
690 }
691 
692 /* Return the access to DECL in TYPE.  */
693 
694 static access_kind
695 access_in_type (tree type, tree decl)
696 {
697   tree binfo = TYPE_BINFO (type);
698 
699   /* We must take into account
700 
701        [class.paths]
702 
703        If a name can be reached by several paths through a multiple
704        inheritance graph, the access is that of the path that gives
705        most access.
706 
707     The algorithm we use is to make a post-order depth-first traversal
708     of the base-class hierarchy.  As we come up the tree, we annotate
709     each node with the most lenient access.  */
710   dfs_walk_once (binfo, NULL, dfs_access_in_type, decl);
711 
712   return BINFO_ACCESS (binfo);
713 }
714 
715 /* Returns nonzero if it is OK to access DECL through an object
716    indicated by BINFO in the context of DERIVED.  */
717 
718 static int
719 protected_accessible_p (tree decl, tree derived, tree binfo)
720 {
721   access_kind access;
722 
723   /* We're checking this clause from [class.access.base]
724 
725        m as a member of N is protected, and the reference occurs in a
726        member or friend of class N, or in a member or friend of a
727        class P derived from N, where m as a member of P is public, private
728        or protected.
729 
730     Here DERIVED is a possible P, DECL is m and BINFO_TYPE (binfo) is N.  */
731 
732   /* If DERIVED isn't derived from N, then it can't be a P.  */
733   if (!DERIVED_FROM_P (BINFO_TYPE (binfo), derived))
734     return 0;
735 
736   access = access_in_type (derived, decl);
737 
738   /* If m is inaccessible in DERIVED, then it's not a P.  */
739   if (access == ak_none)
740     return 0;
741 
742   /* [class.protected]
743 
744      When a friend or a member function of a derived class references
745      a protected nonstatic member of a base class, an access check
746      applies in addition to those described earlier in clause
747      _class.access_) Except when forming a pointer to member
748      (_expr.unary.op_), the access must be through a pointer to,
749      reference to, or object of the derived class itself (or any class
750      derived from that class) (_expr.ref_).  If the access is to form
751      a pointer to member, the nested-name-specifier shall name the
752      derived class (or any class derived from that class).  */
753   if (DECL_NONSTATIC_MEMBER_P (decl))
754     {
755       /* We can tell through what the reference is occurring by
756 	 chasing BINFO up to the root.  */
757       tree t = binfo;
758       while (BINFO_INHERITANCE_CHAIN (t))
759 	t = BINFO_INHERITANCE_CHAIN (t);
760 
761       if (!DERIVED_FROM_P (derived, BINFO_TYPE (t)))
762 	return 0;
763     }
764 
765   return 1;
766 }
767 
768 /* Returns nonzero if SCOPE is a friend of a type which would be able
769    to access DECL through the object indicated by BINFO.  */
770 
771 static int
772 friend_accessible_p (tree scope, tree decl, tree binfo)
773 {
774   tree befriending_classes;
775   tree t;
776 
777   if (!scope)
778     return 0;
779 
780   if (TREE_CODE (scope) == FUNCTION_DECL
781       || DECL_FUNCTION_TEMPLATE_P (scope))
782     befriending_classes = DECL_BEFRIENDING_CLASSES (scope);
783   else if (TYPE_P (scope))
784     befriending_classes = CLASSTYPE_BEFRIENDING_CLASSES (scope);
785   else
786     return 0;
787 
788   for (t = befriending_classes; t; t = TREE_CHAIN (t))
789     if (protected_accessible_p (decl, TREE_VALUE (t), binfo))
790       return 1;
791 
792   /* Nested classes have the same access as their enclosing types, as
793      per DR 45 (this is a change from the standard).  */
794   if (TYPE_P (scope))
795     for (t = TYPE_CONTEXT (scope); t && TYPE_P (t); t = TYPE_CONTEXT (t))
796       if (protected_accessible_p (decl, t, binfo))
797 	return 1;
798 
799   if (TREE_CODE (scope) == FUNCTION_DECL
800       || DECL_FUNCTION_TEMPLATE_P (scope))
801     {
802       /* Perhaps this SCOPE is a member of a class which is a
803 	 friend.  */
804       if (DECL_CLASS_SCOPE_P (scope)
805 	  && friend_accessible_p (DECL_CONTEXT (scope), decl, binfo))
806 	return 1;
807 
808       /* Or an instantiation of something which is a friend.  */
809       if (DECL_TEMPLATE_INFO (scope))
810 	{
811 	  int ret;
812 	  /* Increment processing_template_decl to make sure that
813 	     dependent_type_p works correctly.  */
814 	  ++processing_template_decl;
815 	  ret = friend_accessible_p (DECL_TI_TEMPLATE (scope), decl, binfo);
816 	  --processing_template_decl;
817 	  return ret;
818 	}
819     }
820 
821   return 0;
822 }
823 
824 /* Called via dfs_walk_once_accessible from accessible_p */
825 
826 static tree
827 dfs_accessible_post (tree binfo, void * /*data*/)
828 {
829   if (BINFO_ACCESS (binfo) != ak_none)
830     {
831       tree scope = current_scope ();
832       if (scope && TREE_CODE (scope) != NAMESPACE_DECL
833 	  && is_friend (BINFO_TYPE (binfo), scope))
834 	return binfo;
835     }
836 
837   return NULL_TREE;
838 }
839 
840 /* Like accessible_p below, but within a template returns true iff DECL is
841    accessible in TYPE to all possible instantiations of the template.  */
842 
843 int
844 accessible_in_template_p (tree type, tree decl)
845 {
846   int save_ptd = processing_template_decl;
847   processing_template_decl = 0;
848   int val = accessible_p (type, decl, false);
849   processing_template_decl = save_ptd;
850   return val;
851 }
852 
853 /* DECL is a declaration from a base class of TYPE, which was the
854    class used to name DECL.  Return nonzero if, in the current
855    context, DECL is accessible.  If TYPE is actually a BINFO node,
856    then we can tell in what context the access is occurring by looking
857    at the most derived class along the path indicated by BINFO.  If
858    CONSIDER_LOCAL is true, do consider special access the current
859    scope or friendship thereof we might have.  */
860 
861 int
862 accessible_p (tree type, tree decl, bool consider_local_p)
863 {
864   tree binfo;
865   tree scope;
866   access_kind access;
867 
868   /* Nonzero if it's OK to access DECL if it has protected
869      accessibility in TYPE.  */
870   int protected_ok = 0;
871 
872   /* If this declaration is in a block or namespace scope, there's no
873      access control.  */
874   if (!TYPE_P (context_for_name_lookup (decl)))
875     return 1;
876 
877   /* There is no need to perform access checks inside a thunk.  */
878   scope = current_scope ();
879   if (scope && DECL_THUNK_P (scope))
880     return 1;
881 
882   /* In a template declaration, we cannot be sure whether the
883      particular specialization that is instantiated will be a friend
884      or not.  Therefore, all access checks are deferred until
885      instantiation.  However, PROCESSING_TEMPLATE_DECL is set in the
886      parameter list for a template (because we may see dependent types
887      in default arguments for template parameters), and access
888      checking should be performed in the outermost parameter list.  */
889   if (processing_template_decl
890       && (!processing_template_parmlist || processing_template_decl > 1))
891     return 1;
892 
893   if (!TYPE_P (type))
894     {
895       binfo = type;
896       type = BINFO_TYPE (type);
897     }
898   else
899     binfo = TYPE_BINFO (type);
900 
901   /* [class.access.base]
902 
903      A member m is accessible when named in class N if
904 
905      --m as a member of N is public, or
906 
907      --m as a member of N is private, and the reference occurs in a
908        member or friend of class N, or
909 
910      --m as a member of N is protected, and the reference occurs in a
911        member or friend of class N, or in a member or friend of a
912        class P derived from N, where m as a member of P is private or
913        protected, or
914 
915      --there exists a base class B of N that is accessible at the point
916        of reference, and m is accessible when named in class B.
917 
918     We walk the base class hierarchy, checking these conditions.  */
919 
920   if (consider_local_p)
921     {
922       /* Figure out where the reference is occurring.  Check to see if
923 	 DECL is private or protected in this scope, since that will
924 	 determine whether protected access is allowed.  */
925       if (current_class_type)
926 	protected_ok = protected_accessible_p (decl,
927 					       current_class_type, binfo);
928 
929       /* Now, loop through the classes of which we are a friend.  */
930       if (!protected_ok)
931 	protected_ok = friend_accessible_p (scope, decl, binfo);
932     }
933 
934   /* Standardize the binfo that access_in_type will use.  We don't
935      need to know what path was chosen from this point onwards.  */
936   binfo = TYPE_BINFO (type);
937 
938   /* Compute the accessibility of DECL in the class hierarchy
939      dominated by type.  */
940   access = access_in_type (type, decl);
941   if (access == ak_public
942       || (access == ak_protected && protected_ok))
943     return 1;
944 
945   if (!consider_local_p)
946     return 0;
947 
948   /* Walk the hierarchy again, looking for a base class that allows
949      access.  */
950   return dfs_walk_once_accessible (binfo, /*friends=*/true,
951 				   NULL, dfs_accessible_post, NULL)
952     != NULL_TREE;
953 }
954 
955 struct lookup_field_info {
956   /* The type in which we're looking.  */
957   tree type;
958   /* The name of the field for which we're looking.  */
959   tree name;
960   /* If non-NULL, the current result of the lookup.  */
961   tree rval;
962   /* The path to RVAL.  */
963   tree rval_binfo;
964   /* If non-NULL, the lookup was ambiguous, and this is a list of the
965      candidates.  */
966   tree ambiguous;
967   /* If nonzero, we are looking for types, not data members.  */
968   int want_type;
969   /* If something went wrong, a message indicating what.  */
970   const char *errstr;
971 };
972 
973 /* Nonzero for a class member means that it is shared between all objects
974    of that class.
975 
976    [class.member.lookup]:If the resulting set of declarations are not all
977    from sub-objects of the same type, or the set has a  nonstatic  member
978    and  includes members from distinct sub-objects, there is an ambiguity
979    and the program is ill-formed.
980 
981    This function checks that T contains no nonstatic members.  */
982 
983 int
984 shared_member_p (tree t)
985 {
986   if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == TYPE_DECL \
987       || TREE_CODE (t) == CONST_DECL)
988     return 1;
989   if (is_overloaded_fn (t))
990     {
991       t = get_fns (t);
992       for (; t; t = OVL_NEXT (t))
993 	{
994 	  tree fn = OVL_CURRENT (t);
995 	  if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
996 	    return 0;
997 	}
998       return 1;
999     }
1000   return 0;
1001 }
1002 
1003 /* Routine to see if the sub-object denoted by the binfo PARENT can be
1004    found as a base class and sub-object of the object denoted by
1005    BINFO.  */
1006 
1007 static int
1008 is_subobject_of_p (tree parent, tree binfo)
1009 {
1010   tree probe;
1011 
1012   for (probe = parent; probe; probe = BINFO_INHERITANCE_CHAIN (probe))
1013     {
1014       if (probe == binfo)
1015 	return 1;
1016       if (BINFO_VIRTUAL_P (probe))
1017 	return (binfo_for_vbase (BINFO_TYPE (probe), BINFO_TYPE (binfo))
1018 		!= NULL_TREE);
1019     }
1020   return 0;
1021 }
1022 
1023 /* DATA is really a struct lookup_field_info.  Look for a field with
1024    the name indicated there in BINFO.  If this function returns a
1025    non-NULL value it is the result of the lookup.  Called from
1026    lookup_field via breadth_first_search.  */
1027 
1028 static tree
1029 lookup_field_r (tree binfo, void *data)
1030 {
1031   struct lookup_field_info *lfi = (struct lookup_field_info *) data;
1032   tree type = BINFO_TYPE (binfo);
1033   tree nval = NULL_TREE;
1034 
1035   /* If this is a dependent base, don't look in it.  */
1036   if (BINFO_DEPENDENT_BASE_P (binfo))
1037     return NULL_TREE;
1038 
1039   /* If this base class is hidden by the best-known value so far, we
1040      don't need to look.  */
1041   if (lfi->rval_binfo && BINFO_INHERITANCE_CHAIN (binfo) == lfi->rval_binfo
1042       && !BINFO_VIRTUAL_P (binfo))
1043     return dfs_skip_bases;
1044 
1045   /* First, look for a function.  There can't be a function and a data
1046      member with the same name, and if there's a function and a type
1047      with the same name, the type is hidden by the function.  */
1048   if (!lfi->want_type)
1049     nval = lookup_fnfields_slot (type, lfi->name);
1050 
1051   if (!nval)
1052     /* Look for a data member or type.  */
1053     nval = lookup_field_1 (type, lfi->name, lfi->want_type);
1054 
1055   /* If there is no declaration with the indicated name in this type,
1056      then there's nothing to do.  */
1057   if (!nval)
1058     goto done;
1059 
1060   /* If we're looking up a type (as with an elaborated type specifier)
1061      we ignore all non-types we find.  */
1062   if (lfi->want_type && TREE_CODE (nval) != TYPE_DECL
1063       && !DECL_TYPE_TEMPLATE_P (nval))
1064     {
1065       if (lfi->name == TYPE_IDENTIFIER (type))
1066 	{
1067 	  /* If the aggregate has no user defined constructors, we allow
1068 	     it to have fields with the same name as the enclosing type.
1069 	     If we are looking for that name, find the corresponding
1070 	     TYPE_DECL.  */
1071 	  for (nval = TREE_CHAIN (nval); nval; nval = TREE_CHAIN (nval))
1072 	    if (DECL_NAME (nval) == lfi->name
1073 		&& TREE_CODE (nval) == TYPE_DECL)
1074 	      break;
1075 	}
1076       else
1077 	nval = NULL_TREE;
1078       if (!nval && CLASSTYPE_NESTED_UTDS (type) != NULL)
1079 	{
1080 	  binding_entry e = binding_table_find (CLASSTYPE_NESTED_UTDS (type),
1081 						lfi->name);
1082 	  if (e != NULL)
1083 	    nval = TYPE_MAIN_DECL (e->type);
1084 	  else
1085 	    goto done;
1086 	}
1087     }
1088 
1089   /* If the lookup already found a match, and the new value doesn't
1090      hide the old one, we might have an ambiguity.  */
1091   if (lfi->rval_binfo
1092       && !is_subobject_of_p (lfi->rval_binfo, binfo))
1093 
1094     {
1095       if (nval == lfi->rval && shared_member_p (nval))
1096 	/* The two things are really the same.  */
1097 	;
1098       else if (is_subobject_of_p (binfo, lfi->rval_binfo))
1099 	/* The previous value hides the new one.  */
1100 	;
1101       else
1102 	{
1103 	  /* We have a real ambiguity.  We keep a chain of all the
1104 	     candidates.  */
1105 	  if (!lfi->ambiguous && lfi->rval)
1106 	    {
1107 	      /* This is the first time we noticed an ambiguity.  Add
1108 		 what we previously thought was a reasonable candidate
1109 		 to the list.  */
1110 	      lfi->ambiguous = tree_cons (NULL_TREE, lfi->rval, NULL_TREE);
1111 	      TREE_TYPE (lfi->ambiguous) = error_mark_node;
1112 	    }
1113 
1114 	  /* Add the new value.  */
1115 	  lfi->ambiguous = tree_cons (NULL_TREE, nval, lfi->ambiguous);
1116 	  TREE_TYPE (lfi->ambiguous) = error_mark_node;
1117 	  lfi->errstr = G_("request for member %qD is ambiguous");
1118 	}
1119     }
1120   else
1121     {
1122       lfi->rval = nval;
1123       lfi->rval_binfo = binfo;
1124     }
1125 
1126  done:
1127   /* Don't look for constructors or destructors in base classes.  */
1128   if (IDENTIFIER_CTOR_OR_DTOR_P (lfi->name))
1129     return dfs_skip_bases;
1130   return NULL_TREE;
1131 }
1132 
1133 /* Return a "baselink" with BASELINK_BINFO, BASELINK_ACCESS_BINFO,
1134    BASELINK_FUNCTIONS, and BASELINK_OPTYPE set to BINFO, ACCESS_BINFO,
1135    FUNCTIONS, and OPTYPE respectively.  */
1136 
1137 tree
1138 build_baselink (tree binfo, tree access_binfo, tree functions, tree optype)
1139 {
1140   tree baselink;
1141 
1142   gcc_assert (TREE_CODE (functions) == FUNCTION_DECL
1143 	      || TREE_CODE (functions) == TEMPLATE_DECL
1144 	      || TREE_CODE (functions) == TEMPLATE_ID_EXPR
1145 	      || TREE_CODE (functions) == OVERLOAD);
1146   gcc_assert (!optype || TYPE_P (optype));
1147   gcc_assert (TREE_TYPE (functions));
1148 
1149   baselink = make_node (BASELINK);
1150   TREE_TYPE (baselink) = TREE_TYPE (functions);
1151   BASELINK_BINFO (baselink) = binfo;
1152   BASELINK_ACCESS_BINFO (baselink) = access_binfo;
1153   BASELINK_FUNCTIONS (baselink) = functions;
1154   BASELINK_OPTYPE (baselink) = optype;
1155 
1156   return baselink;
1157 }
1158 
1159 /* Look for a member named NAME in an inheritance lattice dominated by
1160    XBASETYPE.  If PROTECT is 0 or two, we do not check access.  If it
1161    is 1, we enforce accessibility.  If PROTECT is zero, then, for an
1162    ambiguous lookup, we return NULL.  If PROTECT is 1, we issue error
1163    messages about inaccessible or ambiguous lookup.  If PROTECT is 2,
1164    we return a TREE_LIST whose TREE_TYPE is error_mark_node and whose
1165    TREE_VALUEs are the list of ambiguous candidates.
1166 
1167    WANT_TYPE is 1 when we should only return TYPE_DECLs.
1168 
1169    If nothing can be found return NULL_TREE and do not issue an error.  */
1170 
1171 tree
1172 lookup_member (tree xbasetype, tree name, int protect, bool want_type,
1173 	       tsubst_flags_t complain)
1174 {
1175   tree rval, rval_binfo = NULL_TREE;
1176   tree type = NULL_TREE, basetype_path = NULL_TREE;
1177   struct lookup_field_info lfi;
1178 
1179   /* rval_binfo is the binfo associated with the found member, note,
1180      this can be set with useful information, even when rval is not
1181      set, because it must deal with ALL members, not just non-function
1182      members.  It is used for ambiguity checking and the hidden
1183      checks.  Whereas rval is only set if a proper (not hidden)
1184      non-function member is found.  */
1185 
1186   const char *errstr = 0;
1187 
1188   if (name == error_mark_node
1189       || xbasetype == NULL_TREE
1190       || xbasetype == error_mark_node)
1191     return NULL_TREE;
1192 
1193   gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
1194 
1195   if (TREE_CODE (xbasetype) == TREE_BINFO)
1196     {
1197       type = BINFO_TYPE (xbasetype);
1198       basetype_path = xbasetype;
1199     }
1200   else
1201     {
1202       if (!RECORD_OR_UNION_CODE_P (TREE_CODE (xbasetype)))
1203 	return NULL_TREE;
1204       type = xbasetype;
1205       xbasetype = NULL_TREE;
1206     }
1207 
1208   type = complete_type (type);
1209   if (!basetype_path)
1210     basetype_path = TYPE_BINFO (type);
1211 
1212   if (!basetype_path)
1213     return NULL_TREE;
1214 
1215   if (GATHER_STATISTICS)
1216     n_calls_lookup_field++;
1217 
1218   memset (&lfi, 0, sizeof (lfi));
1219   lfi.type = type;
1220   lfi.name = name;
1221   lfi.want_type = want_type;
1222   dfs_walk_all (basetype_path, &lookup_field_r, NULL, &lfi);
1223   rval = lfi.rval;
1224   rval_binfo = lfi.rval_binfo;
1225   if (rval_binfo)
1226     type = BINFO_TYPE (rval_binfo);
1227   errstr = lfi.errstr;
1228 
1229   /* If we are not interested in ambiguities, don't report them;
1230      just return NULL_TREE.  */
1231   if (!protect && lfi.ambiguous)
1232     return NULL_TREE;
1233 
1234   if (protect == 2)
1235     {
1236       if (lfi.ambiguous)
1237 	return lfi.ambiguous;
1238       else
1239 	protect = 0;
1240     }
1241 
1242   /* [class.access]
1243 
1244      In the case of overloaded function names, access control is
1245      applied to the function selected by overloaded resolution.
1246 
1247      We cannot check here, even if RVAL is only a single non-static
1248      member function, since we do not know what the "this" pointer
1249      will be.  For:
1250 
1251         class A { protected: void f(); };
1252         class B : public A {
1253           void g(A *p) {
1254             f(); // OK
1255             p->f(); // Not OK.
1256           }
1257         };
1258 
1259     only the first call to "f" is valid.  However, if the function is
1260     static, we can check.  */
1261   if (rval && protect
1262       && !really_overloaded_fn (rval))
1263     {
1264       tree decl = is_overloaded_fn (rval) ? get_first_fn (rval) : rval;
1265       if (!DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
1266 	  && !perform_or_defer_access_check (basetype_path, decl, decl,
1267 					     complain))
1268 	rval = error_mark_node;
1269     }
1270 
1271   if (errstr && protect)
1272     {
1273       if (complain & tf_error)
1274 	{
1275 	  error (errstr, name, type);
1276 	  if (lfi.ambiguous)
1277 	    print_candidates (lfi.ambiguous);
1278 	}
1279       rval = error_mark_node;
1280     }
1281 
1282   if (rval && is_overloaded_fn (rval))
1283     rval = build_baselink (rval_binfo, basetype_path, rval,
1284 			   (IDENTIFIER_TYPENAME_P (name)
1285 			   ? TREE_TYPE (name): NULL_TREE));
1286   return rval;
1287 }
1288 
1289 /* Like lookup_member, except that if we find a function member we
1290    return NULL_TREE.  */
1291 
1292 tree
1293 lookup_field (tree xbasetype, tree name, int protect, bool want_type)
1294 {
1295   tree rval = lookup_member (xbasetype, name, protect, want_type,
1296 			     tf_warning_or_error);
1297 
1298   /* Ignore functions, but propagate the ambiguity list.  */
1299   if (!error_operand_p (rval)
1300       && (rval && BASELINK_P (rval)))
1301     return NULL_TREE;
1302 
1303   return rval;
1304 }
1305 
1306 /* Like lookup_member, except that if we find a non-function member we
1307    return NULL_TREE.  */
1308 
1309 tree
1310 lookup_fnfields (tree xbasetype, tree name, int protect)
1311 {
1312   tree rval = lookup_member (xbasetype, name, protect, /*want_type=*/false,
1313 			     tf_warning_or_error);
1314 
1315   /* Ignore non-functions, but propagate the ambiguity list.  */
1316   if (!error_operand_p (rval)
1317       && (rval && !BASELINK_P (rval)))
1318     return NULL_TREE;
1319 
1320   return rval;
1321 }
1322 
1323 /* Return the index in the CLASSTYPE_METHOD_VEC for CLASS_TYPE
1324    corresponding to "operator TYPE ()", or -1 if there is no such
1325    operator.  Only CLASS_TYPE itself is searched; this routine does
1326    not scan the base classes of CLASS_TYPE.  */
1327 
1328 static int
1329 lookup_conversion_operator (tree class_type, tree type)
1330 {
1331   int tpl_slot = -1;
1332 
1333   if (TYPE_HAS_CONVERSION (class_type))
1334     {
1335       int i;
1336       tree fn;
1337       vec<tree, va_gc> *methods = CLASSTYPE_METHOD_VEC (class_type);
1338 
1339       for (i = CLASSTYPE_FIRST_CONVERSION_SLOT;
1340 	   vec_safe_iterate (methods, i, &fn); ++i)
1341 	{
1342 	  /* All the conversion operators come near the beginning of
1343 	     the class.  Therefore, if FN is not a conversion
1344 	     operator, there is no matching conversion operator in
1345 	     CLASS_TYPE.  */
1346 	  fn = OVL_CURRENT (fn);
1347 	  if (!DECL_CONV_FN_P (fn))
1348 	    break;
1349 
1350 	  if (TREE_CODE (fn) == TEMPLATE_DECL)
1351 	    /* All the templated conversion functions are on the same
1352 	       slot, so remember it.  */
1353 	    tpl_slot = i;
1354 	  else if (same_type_p (DECL_CONV_FN_TYPE (fn), type))
1355 	    return i;
1356 	}
1357     }
1358 
1359   return tpl_slot;
1360 }
1361 
1362 /* TYPE is a class type. Return the index of the fields within
1363    the method vector with name NAME, or -1 if no such field exists.
1364    Does not lazily declare implicitly-declared member functions.  */
1365 
1366 static int
1367 lookup_fnfields_idx_nolazy (tree type, tree name)
1368 {
1369   vec<tree, va_gc> *method_vec;
1370   tree fn;
1371   tree tmp;
1372   size_t i;
1373 
1374   if (!CLASS_TYPE_P (type))
1375     return -1;
1376 
1377   method_vec = CLASSTYPE_METHOD_VEC (type);
1378   if (!method_vec)
1379     return -1;
1380 
1381   if (GATHER_STATISTICS)
1382     n_calls_lookup_fnfields_1++;
1383 
1384   /* Constructors are first...  */
1385   if (name == ctor_identifier)
1386     {
1387       fn = CLASSTYPE_CONSTRUCTORS (type);
1388       return fn ? CLASSTYPE_CONSTRUCTOR_SLOT : -1;
1389     }
1390   /* and destructors are second.  */
1391   if (name == dtor_identifier)
1392     {
1393       fn = CLASSTYPE_DESTRUCTORS (type);
1394       return fn ? CLASSTYPE_DESTRUCTOR_SLOT : -1;
1395     }
1396   if (IDENTIFIER_TYPENAME_P (name))
1397     return lookup_conversion_operator (type, TREE_TYPE (name));
1398 
1399   /* Skip the conversion operators.  */
1400   for (i = CLASSTYPE_FIRST_CONVERSION_SLOT;
1401        vec_safe_iterate (method_vec, i, &fn);
1402        ++i)
1403     if (!DECL_CONV_FN_P (OVL_CURRENT (fn)))
1404       break;
1405 
1406   /* If the type is complete, use binary search.  */
1407   if (COMPLETE_TYPE_P (type))
1408     {
1409       int lo;
1410       int hi;
1411 
1412       lo = i;
1413       hi = method_vec->length ();
1414       while (lo < hi)
1415 	{
1416 	  i = (lo + hi) / 2;
1417 
1418 	  if (GATHER_STATISTICS)
1419 	    n_outer_fields_searched++;
1420 
1421 	  tmp = (*method_vec)[i];
1422 	  tmp = DECL_NAME (OVL_CURRENT (tmp));
1423 	  if (tmp > name)
1424 	    hi = i;
1425 	  else if (tmp < name)
1426 	    lo = i + 1;
1427 	  else
1428 	    return i;
1429 	}
1430     }
1431   else
1432     for (; vec_safe_iterate (method_vec, i, &fn); ++i)
1433       {
1434 	if (GATHER_STATISTICS)
1435 	  n_outer_fields_searched++;
1436 	if (DECL_NAME (OVL_CURRENT (fn)) == name)
1437 	  return i;
1438       }
1439 
1440   return -1;
1441 }
1442 
1443 /* TYPE is a class type. Return the index of the fields within
1444    the method vector with name NAME, or -1 if no such field exists.  */
1445 
1446 int
1447 lookup_fnfields_1 (tree type, tree name)
1448 {
1449   if (!CLASS_TYPE_P (type))
1450     return -1;
1451 
1452   if (COMPLETE_TYPE_P (type))
1453     {
1454       if ((name == ctor_identifier
1455 	   || name == base_ctor_identifier
1456 	   || name == complete_ctor_identifier))
1457 	{
1458 	  if (CLASSTYPE_LAZY_DEFAULT_CTOR (type))
1459 	    lazily_declare_fn (sfk_constructor, type);
1460 	  if (CLASSTYPE_LAZY_COPY_CTOR (type))
1461 	    lazily_declare_fn (sfk_copy_constructor, type);
1462 	  if (CLASSTYPE_LAZY_MOVE_CTOR (type))
1463 	    lazily_declare_fn (sfk_move_constructor, type);
1464 	}
1465       else if (name == ansi_assopname (NOP_EXPR))
1466 	{
1467 	  if (CLASSTYPE_LAZY_COPY_ASSIGN (type))
1468 	    lazily_declare_fn (sfk_copy_assignment, type);
1469 	  if (CLASSTYPE_LAZY_MOVE_ASSIGN (type))
1470 	    lazily_declare_fn (sfk_move_assignment, type);
1471 	}
1472       else if ((name == dtor_identifier
1473 		|| name == base_dtor_identifier
1474 		|| name == complete_dtor_identifier
1475 		|| name == deleting_dtor_identifier)
1476 	       && CLASSTYPE_LAZY_DESTRUCTOR (type))
1477 	lazily_declare_fn (sfk_destructor, type);
1478     }
1479 
1480   return lookup_fnfields_idx_nolazy (type, name);
1481 }
1482 
1483 /* TYPE is a class type. Return the field within the method vector with
1484    name NAME, or NULL_TREE if no such field exists.  */
1485 
1486 tree
1487 lookup_fnfields_slot (tree type, tree name)
1488 {
1489   int ix = lookup_fnfields_1 (complete_type (type), name);
1490   if (ix < 0)
1491     return NULL_TREE;
1492   return (*CLASSTYPE_METHOD_VEC (type))[ix];
1493 }
1494 
1495 /* As above, but avoid lazily declaring functions.  */
1496 
1497 tree
1498 lookup_fnfields_slot_nolazy (tree type, tree name)
1499 {
1500   int ix = lookup_fnfields_idx_nolazy (complete_type (type), name);
1501   if (ix < 0)
1502     return NULL_TREE;
1503   return (*CLASSTYPE_METHOD_VEC (type))[ix];
1504 }
1505 
1506 /* Like lookup_fnfields_1, except that the name is extracted from
1507    FUNCTION, which is a FUNCTION_DECL or a TEMPLATE_DECL.  */
1508 
1509 int
1510 class_method_index_for_fn (tree class_type, tree function)
1511 {
1512   gcc_assert (TREE_CODE (function) == FUNCTION_DECL
1513 	      || DECL_FUNCTION_TEMPLATE_P (function));
1514 
1515   return lookup_fnfields_1 (class_type,
1516 			    DECL_CONSTRUCTOR_P (function) ? ctor_identifier :
1517 			    DECL_DESTRUCTOR_P (function) ? dtor_identifier :
1518 			    DECL_NAME (function));
1519 }
1520 
1521 
1522 /* DECL is the result of a qualified name lookup.  QUALIFYING_SCOPE is
1523    the class or namespace used to qualify the name.  CONTEXT_CLASS is
1524    the class corresponding to the object in which DECL will be used.
1525    Return a possibly modified version of DECL that takes into account
1526    the CONTEXT_CLASS.
1527 
1528    In particular, consider an expression like `B::m' in the context of
1529    a derived class `D'.  If `B::m' has been resolved to a BASELINK,
1530    then the most derived class indicated by the BASELINK_BINFO will be
1531    `B', not `D'.  This function makes that adjustment.  */
1532 
1533 tree
1534 adjust_result_of_qualified_name_lookup (tree decl,
1535 					tree qualifying_scope,
1536 					tree context_class)
1537 {
1538   if (context_class && context_class != error_mark_node
1539       && CLASS_TYPE_P (context_class)
1540       && CLASS_TYPE_P (qualifying_scope)
1541       && DERIVED_FROM_P (qualifying_scope, context_class)
1542       && BASELINK_P (decl))
1543     {
1544       tree base;
1545 
1546       /* Look for the QUALIFYING_SCOPE as a base of the CONTEXT_CLASS.
1547 	 Because we do not yet know which function will be chosen by
1548 	 overload resolution, we cannot yet check either accessibility
1549 	 or ambiguity -- in either case, the choice of a static member
1550 	 function might make the usage valid.  */
1551       base = lookup_base (context_class, qualifying_scope,
1552 			  ba_unique, NULL, tf_none);
1553       if (base && base != error_mark_node)
1554 	{
1555 	  BASELINK_ACCESS_BINFO (decl) = base;
1556 	  BASELINK_BINFO (decl)
1557 	    = lookup_base (base, BINFO_TYPE (BASELINK_BINFO (decl)),
1558 			   ba_unique, NULL, tf_none);
1559 	}
1560     }
1561 
1562   if (BASELINK_P (decl))
1563     BASELINK_QUALIFIED_P (decl) = true;
1564 
1565   return decl;
1566 }
1567 
1568 
1569 /* Walk the class hierarchy within BINFO, in a depth-first traversal.
1570    PRE_FN is called in preorder, while POST_FN is called in postorder.
1571    If PRE_FN returns DFS_SKIP_BASES, child binfos will not be
1572    walked.  If PRE_FN or POST_FN returns a different non-NULL value,
1573    that value is immediately returned and the walk is terminated.  One
1574    of PRE_FN and POST_FN can be NULL.  At each node, PRE_FN and
1575    POST_FN are passed the binfo to examine and the caller's DATA
1576    value.  All paths are walked, thus virtual and morally virtual
1577    binfos can be multiply walked.  */
1578 
1579 tree
1580 dfs_walk_all (tree binfo, tree (*pre_fn) (tree, void *),
1581 	      tree (*post_fn) (tree, void *), void *data)
1582 {
1583   tree rval;
1584   unsigned ix;
1585   tree base_binfo;
1586 
1587   /* Call the pre-order walking function.  */
1588   if (pre_fn)
1589     {
1590       rval = pre_fn (binfo, data);
1591       if (rval)
1592 	{
1593 	  if (rval == dfs_skip_bases)
1594 	    goto skip_bases;
1595 	  return rval;
1596 	}
1597     }
1598 
1599   /* Find the next child binfo to walk.  */
1600   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
1601     {
1602       rval = dfs_walk_all (base_binfo, pre_fn, post_fn, data);
1603       if (rval)
1604 	return rval;
1605     }
1606 
1607  skip_bases:
1608   /* Call the post-order walking function.  */
1609   if (post_fn)
1610     {
1611       rval = post_fn (binfo, data);
1612       gcc_assert (rval != dfs_skip_bases);
1613       return rval;
1614     }
1615 
1616   return NULL_TREE;
1617 }
1618 
1619 /* Worker for dfs_walk_once.  This behaves as dfs_walk_all, except
1620    that binfos are walked at most once.  */
1621 
1622 static tree
1623 dfs_walk_once_r (tree binfo, tree (*pre_fn) (tree, void *),
1624 		 tree (*post_fn) (tree, void *), void *data)
1625 {
1626   tree rval;
1627   unsigned ix;
1628   tree base_binfo;
1629 
1630   /* Call the pre-order walking function.  */
1631   if (pre_fn)
1632     {
1633       rval = pre_fn (binfo, data);
1634       if (rval)
1635 	{
1636 	  if (rval == dfs_skip_bases)
1637 	    goto skip_bases;
1638 
1639 	  return rval;
1640 	}
1641     }
1642 
1643   /* Find the next child binfo to walk.  */
1644   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
1645     {
1646       if (BINFO_VIRTUAL_P (base_binfo))
1647 	{
1648 	  if (BINFO_MARKED (base_binfo))
1649 	    continue;
1650 	  BINFO_MARKED (base_binfo) = 1;
1651 	}
1652 
1653       rval = dfs_walk_once_r (base_binfo, pre_fn, post_fn, data);
1654       if (rval)
1655 	return rval;
1656     }
1657 
1658  skip_bases:
1659   /* Call the post-order walking function.  */
1660   if (post_fn)
1661     {
1662       rval = post_fn (binfo, data);
1663       gcc_assert (rval != dfs_skip_bases);
1664       return rval;
1665     }
1666 
1667   return NULL_TREE;
1668 }
1669 
1670 /* Worker for dfs_walk_once. Recursively unmark the virtual base binfos of
1671    BINFO.  */
1672 
1673 static void
1674 dfs_unmark_r (tree binfo)
1675 {
1676   unsigned ix;
1677   tree base_binfo;
1678 
1679   /* Process the basetypes.  */
1680   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
1681     {
1682       if (BINFO_VIRTUAL_P (base_binfo))
1683 	{
1684 	  if (!BINFO_MARKED (base_binfo))
1685 	    continue;
1686 	  BINFO_MARKED (base_binfo) = 0;
1687 	}
1688       /* Only walk, if it can contain more virtual bases.  */
1689       if (CLASSTYPE_VBASECLASSES (BINFO_TYPE (base_binfo)))
1690 	dfs_unmark_r (base_binfo);
1691     }
1692 }
1693 
1694 /* Like dfs_walk_all, except that binfos are not multiply walked.  For
1695    non-diamond shaped hierarchies this is the same as dfs_walk_all.
1696    For diamond shaped hierarchies we must mark the virtual bases, to
1697    avoid multiple walks.  */
1698 
1699 tree
1700 dfs_walk_once (tree binfo, tree (*pre_fn) (tree, void *),
1701 	       tree (*post_fn) (tree, void *), void *data)
1702 {
1703   static int active = 0;  /* We must not be called recursively. */
1704   tree rval;
1705 
1706   gcc_assert (pre_fn || post_fn);
1707   gcc_assert (!active);
1708   active++;
1709 
1710   if (!CLASSTYPE_DIAMOND_SHAPED_P (BINFO_TYPE (binfo)))
1711     /* We are not diamond shaped, and therefore cannot encounter the
1712        same binfo twice.  */
1713     rval = dfs_walk_all (binfo, pre_fn, post_fn, data);
1714   else
1715     {
1716       rval = dfs_walk_once_r (binfo, pre_fn, post_fn, data);
1717       if (!BINFO_INHERITANCE_CHAIN (binfo))
1718 	{
1719 	  /* We are at the top of the hierarchy, and can use the
1720 	     CLASSTYPE_VBASECLASSES list for unmarking the virtual
1721 	     bases.  */
1722 	  vec<tree, va_gc> *vbases;
1723 	  unsigned ix;
1724 	  tree base_binfo;
1725 
1726 	  for (vbases = CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)), ix = 0;
1727 	       vec_safe_iterate (vbases, ix, &base_binfo); ix++)
1728 	    BINFO_MARKED (base_binfo) = 0;
1729 	}
1730       else
1731 	dfs_unmark_r (binfo);
1732     }
1733 
1734   active--;
1735 
1736   return rval;
1737 }
1738 
1739 /* Worker function for dfs_walk_once_accessible.  Behaves like
1740    dfs_walk_once_r, except (a) FRIENDS_P is true if special
1741    access given by the current context should be considered, (b) ONCE
1742    indicates whether bases should be marked during traversal.  */
1743 
1744 static tree
1745 dfs_walk_once_accessible_r (tree binfo, bool friends_p, bool once,
1746 			    tree (*pre_fn) (tree, void *),
1747 			    tree (*post_fn) (tree, void *), void *data)
1748 {
1749   tree rval = NULL_TREE;
1750   unsigned ix;
1751   tree base_binfo;
1752 
1753   /* Call the pre-order walking function.  */
1754   if (pre_fn)
1755     {
1756       rval = pre_fn (binfo, data);
1757       if (rval)
1758 	{
1759 	  if (rval == dfs_skip_bases)
1760 	    goto skip_bases;
1761 
1762 	  return rval;
1763 	}
1764     }
1765 
1766   /* Find the next child binfo to walk.  */
1767   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
1768     {
1769       bool mark = once && BINFO_VIRTUAL_P (base_binfo);
1770 
1771       if (mark && BINFO_MARKED (base_binfo))
1772 	continue;
1773 
1774       /* If the base is inherited via private or protected
1775 	 inheritance, then we can't see it, unless we are a friend of
1776 	 the current binfo.  */
1777       if (BINFO_BASE_ACCESS (binfo, ix) != access_public_node)
1778 	{
1779 	  tree scope;
1780 	  if (!friends_p)
1781 	    continue;
1782 	  scope = current_scope ();
1783 	  if (!scope
1784 	      || TREE_CODE (scope) == NAMESPACE_DECL
1785 	      || !is_friend (BINFO_TYPE (binfo), scope))
1786 	    continue;
1787 	}
1788 
1789       if (mark)
1790 	BINFO_MARKED (base_binfo) = 1;
1791 
1792       rval = dfs_walk_once_accessible_r (base_binfo, friends_p, once,
1793 					 pre_fn, post_fn, data);
1794       if (rval)
1795 	return rval;
1796     }
1797 
1798  skip_bases:
1799   /* Call the post-order walking function.  */
1800   if (post_fn)
1801     {
1802       rval = post_fn (binfo, data);
1803       gcc_assert (rval != dfs_skip_bases);
1804       return rval;
1805     }
1806 
1807   return NULL_TREE;
1808 }
1809 
1810 /* Like dfs_walk_once except that only accessible bases are walked.
1811    FRIENDS_P indicates whether friendship of the local context
1812    should be considered when determining accessibility.  */
1813 
1814 static tree
1815 dfs_walk_once_accessible (tree binfo, bool friends_p,
1816 			    tree (*pre_fn) (tree, void *),
1817 			    tree (*post_fn) (tree, void *), void *data)
1818 {
1819   bool diamond_shaped = CLASSTYPE_DIAMOND_SHAPED_P (BINFO_TYPE (binfo));
1820   tree rval = dfs_walk_once_accessible_r (binfo, friends_p, diamond_shaped,
1821 					  pre_fn, post_fn, data);
1822 
1823   if (diamond_shaped)
1824     {
1825       if (!BINFO_INHERITANCE_CHAIN (binfo))
1826 	{
1827 	  /* We are at the top of the hierarchy, and can use the
1828 	     CLASSTYPE_VBASECLASSES list for unmarking the virtual
1829 	     bases.  */
1830 	  vec<tree, va_gc> *vbases;
1831 	  unsigned ix;
1832 	  tree base_binfo;
1833 
1834 	  for (vbases = CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)), ix = 0;
1835 	       vec_safe_iterate (vbases, ix, &base_binfo); ix++)
1836 	    BINFO_MARKED (base_binfo) = 0;
1837 	}
1838       else
1839 	dfs_unmark_r (binfo);
1840     }
1841   return rval;
1842 }
1843 
1844 /* Check that virtual overrider OVERRIDER is acceptable for base function
1845    BASEFN. Issue diagnostic, and return zero, if unacceptable.  */
1846 
1847 static int
1848 check_final_overrider (tree overrider, tree basefn)
1849 {
1850   tree over_type = TREE_TYPE (overrider);
1851   tree base_type = TREE_TYPE (basefn);
1852   tree over_return = TREE_TYPE (over_type);
1853   tree base_return = TREE_TYPE (base_type);
1854   tree over_throw, base_throw;
1855 
1856   int fail = 0;
1857 
1858   if (DECL_INVALID_OVERRIDER_P (overrider))
1859     return 0;
1860 
1861   if (same_type_p (base_return, over_return))
1862     /* OK */;
1863   else if ((CLASS_TYPE_P (over_return) && CLASS_TYPE_P (base_return))
1864 	   || (TREE_CODE (base_return) == TREE_CODE (over_return)
1865 	       && POINTER_TYPE_P (base_return)))
1866     {
1867       /* Potentially covariant.  */
1868       unsigned base_quals, over_quals;
1869 
1870       fail = !POINTER_TYPE_P (base_return);
1871       if (!fail)
1872 	{
1873 	  fail = cp_type_quals (base_return) != cp_type_quals (over_return);
1874 
1875 	  base_return = TREE_TYPE (base_return);
1876 	  over_return = TREE_TYPE (over_return);
1877 	}
1878       base_quals = cp_type_quals (base_return);
1879       over_quals = cp_type_quals (over_return);
1880 
1881       if ((base_quals & over_quals) != over_quals)
1882 	fail = 1;
1883 
1884       if (CLASS_TYPE_P (base_return) && CLASS_TYPE_P (over_return))
1885 	{
1886 	  /* Strictly speaking, the standard requires the return type to be
1887 	     complete even if it only differs in cv-quals, but that seems
1888 	     like a bug in the wording.  */
1889 	  if (!same_type_ignoring_top_level_qualifiers_p (base_return,
1890 							  over_return))
1891 	    {
1892 	      tree binfo = lookup_base (over_return, base_return,
1893 					ba_check, NULL, tf_none);
1894 
1895 	      if (!binfo || binfo == error_mark_node)
1896 		fail = 1;
1897 	    }
1898 	}
1899       else if (!pedantic
1900 	       && can_convert (TREE_TYPE (base_type), TREE_TYPE (over_type),
1901 			       tf_warning_or_error))
1902 	/* GNU extension, allow trivial pointer conversions such as
1903 	   converting to void *, or qualification conversion.  */
1904 	{
1905 	  /* can_convert will permit user defined conversion from a
1906 	     (reference to) class type. We must reject them.  */
1907 	  over_return = non_reference (TREE_TYPE (over_type));
1908 	  if (CLASS_TYPE_P (over_return))
1909 	    fail = 2;
1910 	  else
1911 	    {
1912 	      warning (0, "deprecated covariant return type for %q+#D",
1913 			     overrider);
1914 	      warning (0, "  overriding %q+#D", basefn);
1915 	    }
1916 	}
1917       else
1918 	fail = 2;
1919     }
1920   else
1921     fail = 2;
1922   if (!fail)
1923     /* OK */;
1924   else
1925     {
1926       if (fail == 1)
1927 	{
1928 	  error ("invalid covariant return type for %q+#D", overrider);
1929 	  error ("  overriding %q+#D", basefn);
1930 	}
1931       else
1932 	{
1933 	  error ("conflicting return type specified for %q+#D", overrider);
1934 	  error ("  overriding %q+#D", basefn);
1935 	}
1936       DECL_INVALID_OVERRIDER_P (overrider) = 1;
1937       return 0;
1938     }
1939 
1940   /* Check throw specifier is at least as strict.  */
1941   maybe_instantiate_noexcept (basefn);
1942   maybe_instantiate_noexcept (overrider);
1943   base_throw = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (basefn));
1944   over_throw = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (overrider));
1945 
1946   if (!comp_except_specs (base_throw, over_throw, ce_derived))
1947     {
1948       error ("looser throw specifier for %q+#F", overrider);
1949       error ("  overriding %q+#F", basefn);
1950       DECL_INVALID_OVERRIDER_P (overrider) = 1;
1951       return 0;
1952     }
1953 
1954   /* Check for conflicting type attributes.  */
1955   if (!comp_type_attributes (over_type, base_type))
1956     {
1957       error ("conflicting type attributes specified for %q+#D", overrider);
1958       error ("  overriding %q+#D", basefn);
1959       DECL_INVALID_OVERRIDER_P (overrider) = 1;
1960       return 0;
1961     }
1962 
1963   if (DECL_DELETED_FN (basefn) != DECL_DELETED_FN (overrider))
1964     {
1965       if (DECL_DELETED_FN (overrider))
1966 	{
1967 	  error ("deleted function %q+D", overrider);
1968 	  error ("overriding non-deleted function %q+D", basefn);
1969 	  maybe_explain_implicit_delete (overrider);
1970 	}
1971       else
1972 	{
1973 	  error ("non-deleted function %q+D", overrider);
1974 	  error ("overriding deleted function %q+D", basefn);
1975 	}
1976       return 0;
1977     }
1978   if (DECL_FINAL_P (basefn))
1979     {
1980       error ("virtual function %q+D", overrider);
1981       error ("overriding final function %q+D", basefn);
1982       return 0;
1983     }
1984   return 1;
1985 }
1986 
1987 /* Given a class TYPE, and a function decl FNDECL, look for
1988    virtual functions in TYPE's hierarchy which FNDECL overrides.
1989    We do not look in TYPE itself, only its bases.
1990 
1991    Returns nonzero, if we find any. Set FNDECL's DECL_VIRTUAL_P, if we
1992    find that it overrides anything.
1993 
1994    We check that every function which is overridden, is correctly
1995    overridden.  */
1996 
1997 int
1998 look_for_overrides (tree type, tree fndecl)
1999 {
2000   tree binfo = TYPE_BINFO (type);
2001   tree base_binfo;
2002   int ix;
2003   int found = 0;
2004 
2005   /* A constructor for a class T does not override a function T
2006      in a base class.  */
2007   if (DECL_CONSTRUCTOR_P (fndecl))
2008     return 0;
2009 
2010   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
2011     {
2012       tree basetype = BINFO_TYPE (base_binfo);
2013 
2014       if (TYPE_POLYMORPHIC_P (basetype))
2015 	found += look_for_overrides_r (basetype, fndecl);
2016     }
2017   return found;
2018 }
2019 
2020 /* Look in TYPE for virtual functions with the same signature as
2021    FNDECL.  */
2022 
2023 tree
2024 look_for_overrides_here (tree type, tree fndecl)
2025 {
2026   int ix;
2027 
2028   /* If there are no methods in TYPE (meaning that only implicitly
2029      declared methods will ever be provided for TYPE), then there are
2030      no virtual functions.  */
2031   if (!CLASSTYPE_METHOD_VEC (type))
2032     return NULL_TREE;
2033 
2034   if (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fndecl))
2035     ix = CLASSTYPE_DESTRUCTOR_SLOT;
2036   else
2037     ix = lookup_fnfields_1 (type, DECL_NAME (fndecl));
2038   if (ix >= 0)
2039     {
2040       tree fns = (*CLASSTYPE_METHOD_VEC (type))[ix];
2041 
2042       for (; fns; fns = OVL_NEXT (fns))
2043 	{
2044 	  tree fn = OVL_CURRENT (fns);
2045 
2046 	  if (!DECL_VIRTUAL_P (fn))
2047 	    /* Not a virtual.  */;
2048 	  else if (DECL_CONTEXT (fn) != type)
2049 	    /* Introduced with a using declaration.  */;
2050 	  else if (DECL_STATIC_FUNCTION_P (fndecl))
2051 	    {
2052 	      tree btypes = TYPE_ARG_TYPES (TREE_TYPE (fn));
2053 	      tree dtypes = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
2054 	      if (compparms (TREE_CHAIN (btypes), dtypes))
2055 		return fn;
2056 	    }
2057 	  else if (same_signature_p (fndecl, fn))
2058 	    return fn;
2059 	}
2060     }
2061   return NULL_TREE;
2062 }
2063 
2064 /* Look in TYPE for virtual functions overridden by FNDECL. Check both
2065    TYPE itself and its bases.  */
2066 
2067 static int
2068 look_for_overrides_r (tree type, tree fndecl)
2069 {
2070   tree fn = look_for_overrides_here (type, fndecl);
2071   if (fn)
2072     {
2073       if (DECL_STATIC_FUNCTION_P (fndecl))
2074 	{
2075 	  /* A static member function cannot match an inherited
2076 	     virtual member function.  */
2077 	  error ("%q+#D cannot be declared", fndecl);
2078 	  error ("  since %q+#D declared in base class", fn);
2079 	}
2080       else
2081 	{
2082 	  /* It's definitely virtual, even if not explicitly set.  */
2083 	  DECL_VIRTUAL_P (fndecl) = 1;
2084 	  check_final_overrider (fndecl, fn);
2085 	}
2086       return 1;
2087     }
2088 
2089   /* We failed to find one declared in this class. Look in its bases.  */
2090   return look_for_overrides (type, fndecl);
2091 }
2092 
2093 /* Called via dfs_walk from dfs_get_pure_virtuals.  */
2094 
2095 static tree
2096 dfs_get_pure_virtuals (tree binfo, void *data)
2097 {
2098   tree type = (tree) data;
2099 
2100   /* We're not interested in primary base classes; the derived class
2101      of which they are a primary base will contain the information we
2102      need.  */
2103   if (!BINFO_PRIMARY_P (binfo))
2104     {
2105       tree virtuals;
2106 
2107       for (virtuals = BINFO_VIRTUALS (binfo);
2108 	   virtuals;
2109 	   virtuals = TREE_CHAIN (virtuals))
2110 	if (DECL_PURE_VIRTUAL_P (BV_FN (virtuals)))
2111 	  vec_safe_push (CLASSTYPE_PURE_VIRTUALS (type), BV_FN (virtuals));
2112     }
2113 
2114   return NULL_TREE;
2115 }
2116 
2117 /* Set CLASSTYPE_PURE_VIRTUALS for TYPE.  */
2118 
2119 void
2120 get_pure_virtuals (tree type)
2121 {
2122   /* Clear the CLASSTYPE_PURE_VIRTUALS list; whatever is already there
2123      is going to be overridden.  */
2124   CLASSTYPE_PURE_VIRTUALS (type) = NULL;
2125   /* Now, run through all the bases which are not primary bases, and
2126      collect the pure virtual functions.  We look at the vtable in
2127      each class to determine what pure virtual functions are present.
2128      (A primary base is not interesting because the derived class of
2129      which it is a primary base will contain vtable entries for the
2130      pure virtuals in the base class.  */
2131   dfs_walk_once (TYPE_BINFO (type), NULL, dfs_get_pure_virtuals, type);
2132 }
2133 
2134 /* Debug info for C++ classes can get very large; try to avoid
2135    emitting it everywhere.
2136 
2137    Note that this optimization wins even when the target supports
2138    BINCL (if only slightly), and reduces the amount of work for the
2139    linker.  */
2140 
2141 void
2142 maybe_suppress_debug_info (tree t)
2143 {
2144   if (write_symbols == NO_DEBUG)
2145     return;
2146 
2147   /* We might have set this earlier in cp_finish_decl.  */
2148   TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 0;
2149 
2150   /* Always emit the information for each class every time. */
2151   if (flag_emit_class_debug_always)
2152     return;
2153 
2154   /* If we already know how we're handling this class, handle debug info
2155      the same way.  */
2156   if (CLASSTYPE_INTERFACE_KNOWN (t))
2157     {
2158       if (CLASSTYPE_INTERFACE_ONLY (t))
2159 	TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
2160       /* else don't set it.  */
2161     }
2162   /* If the class has a vtable, write out the debug info along with
2163      the vtable.  */
2164   else if (TYPE_CONTAINS_VPTR_P (t))
2165     TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
2166 
2167   /* Otherwise, just emit the debug info normally.  */
2168 }
2169 
2170 /* Note that we want debugging information for a base class of a class
2171    whose vtable is being emitted.  Normally, this would happen because
2172    calling the constructor for a derived class implies calling the
2173    constructors for all bases, which involve initializing the
2174    appropriate vptr with the vtable for the base class; but in the
2175    presence of optimization, this initialization may be optimized
2176    away, so we tell finish_vtable_vardecl that we want the debugging
2177    information anyway.  */
2178 
2179 static tree
2180 dfs_debug_mark (tree binfo, void * /*data*/)
2181 {
2182   tree t = BINFO_TYPE (binfo);
2183 
2184   if (CLASSTYPE_DEBUG_REQUESTED (t))
2185     return dfs_skip_bases;
2186 
2187   CLASSTYPE_DEBUG_REQUESTED (t) = 1;
2188 
2189   return NULL_TREE;
2190 }
2191 
2192 /* Write out the debugging information for TYPE, whose vtable is being
2193    emitted.  Also walk through our bases and note that we want to
2194    write out information for them.  This avoids the problem of not
2195    writing any debug info for intermediate basetypes whose
2196    constructors, and thus the references to their vtables, and thus
2197    the vtables themselves, were optimized away.  */
2198 
2199 void
2200 note_debug_info_needed (tree type)
2201 {
2202   if (TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type)))
2203     {
2204       TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type)) = 0;
2205       rest_of_type_compilation (type, toplevel_bindings_p ());
2206     }
2207 
2208   dfs_walk_all (TYPE_BINFO (type), dfs_debug_mark, NULL, 0);
2209 }
2210 
2211 void
2212 print_search_statistics (void)
2213 {
2214   if (! GATHER_STATISTICS)
2215     {
2216       fprintf (stderr, "no search statistics\n");
2217       return;
2218     }
2219 
2220   fprintf (stderr, "%d fields searched in %d[%d] calls to lookup_field[_1]\n",
2221 	   n_fields_searched, n_calls_lookup_field, n_calls_lookup_field_1);
2222   fprintf (stderr, "%d fnfields searched in %d calls to lookup_fnfields\n",
2223 	   n_outer_fields_searched, n_calls_lookup_fnfields);
2224   fprintf (stderr, "%d calls to get_base_type\n", n_calls_get_base_type);
2225 }
2226 
2227 void
2228 reinit_search_statistics (void)
2229 {
2230   n_fields_searched = 0;
2231   n_calls_lookup_field = 0, n_calls_lookup_field_1 = 0;
2232   n_calls_lookup_fnfields = 0, n_calls_lookup_fnfields_1 = 0;
2233   n_calls_get_base_type = 0;
2234   n_outer_fields_searched = 0;
2235   n_contexts_saved = 0;
2236 }
2237 
2238 /* Helper for lookup_conversions_r.  TO_TYPE is the type converted to
2239    by a conversion op in base BINFO.  VIRTUAL_DEPTH is nonzero if
2240    BINFO is morally virtual, and VIRTUALNESS is nonzero if virtual
2241    bases have been encountered already in the tree walk.  PARENT_CONVS
2242    is the list of lists of conversion functions that could hide CONV
2243    and OTHER_CONVS is the list of lists of conversion functions that
2244    could hide or be hidden by CONV, should virtualness be involved in
2245    the hierarchy.  Merely checking the conversion op's name is not
2246    enough because two conversion operators to the same type can have
2247    different names.  Return nonzero if we are visible.  */
2248 
2249 static int
2250 check_hidden_convs (tree binfo, int virtual_depth, int virtualness,
2251 		    tree to_type, tree parent_convs, tree other_convs)
2252 {
2253   tree level, probe;
2254 
2255   /* See if we are hidden by a parent conversion.  */
2256   for (level = parent_convs; level; level = TREE_CHAIN (level))
2257     for (probe = TREE_VALUE (level); probe; probe = TREE_CHAIN (probe))
2258       if (same_type_p (to_type, TREE_TYPE (probe)))
2259 	return 0;
2260 
2261   if (virtual_depth || virtualness)
2262     {
2263      /* In a virtual hierarchy, we could be hidden, or could hide a
2264 	conversion function on the other_convs list.  */
2265       for (level = other_convs; level; level = TREE_CHAIN (level))
2266 	{
2267 	  int we_hide_them;
2268 	  int they_hide_us;
2269 	  tree *prev, other;
2270 
2271 	  if (!(virtual_depth || TREE_STATIC (level)))
2272 	    /* Neither is morally virtual, so cannot hide each other.  */
2273 	    continue;
2274 
2275 	  if (!TREE_VALUE (level))
2276 	    /* They evaporated away already.  */
2277 	    continue;
2278 
2279 	  they_hide_us = (virtual_depth
2280 			  && original_binfo (binfo, TREE_PURPOSE (level)));
2281 	  we_hide_them = (!they_hide_us && TREE_STATIC (level)
2282 			  && original_binfo (TREE_PURPOSE (level), binfo));
2283 
2284 	  if (!(we_hide_them || they_hide_us))
2285 	    /* Neither is within the other, so no hiding can occur.  */
2286 	    continue;
2287 
2288 	  for (prev = &TREE_VALUE (level), other = *prev; other;)
2289 	    {
2290 	      if (same_type_p (to_type, TREE_TYPE (other)))
2291 		{
2292 		  if (they_hide_us)
2293 		    /* We are hidden.  */
2294 		    return 0;
2295 
2296 		  if (we_hide_them)
2297 		    {
2298 		      /* We hide the other one.  */
2299 		      other = TREE_CHAIN (other);
2300 		      *prev = other;
2301 		      continue;
2302 		    }
2303 		}
2304 	      prev = &TREE_CHAIN (other);
2305 	      other = *prev;
2306 	    }
2307 	}
2308     }
2309   return 1;
2310 }
2311 
2312 /* Helper for lookup_conversions_r.  PARENT_CONVS is a list of lists
2313    of conversion functions, the first slot will be for the current
2314    binfo, if MY_CONVS is non-NULL.  CHILD_CONVS is the list of lists
2315    of conversion functions from children of the current binfo,
2316    concatenated with conversions from elsewhere in the hierarchy --
2317    that list begins with OTHER_CONVS.  Return a single list of lists
2318    containing only conversions from the current binfo and its
2319    children.  */
2320 
2321 static tree
2322 split_conversions (tree my_convs, tree parent_convs,
2323 		   tree child_convs, tree other_convs)
2324 {
2325   tree t;
2326   tree prev;
2327 
2328   /* Remove the original other_convs portion from child_convs.  */
2329   for (prev = NULL, t = child_convs;
2330        t != other_convs; prev = t, t = TREE_CHAIN (t))
2331     continue;
2332 
2333   if (prev)
2334     TREE_CHAIN (prev) = NULL_TREE;
2335   else
2336     child_convs = NULL_TREE;
2337 
2338   /* Attach the child convs to any we had at this level.  */
2339   if (my_convs)
2340     {
2341       my_convs = parent_convs;
2342       TREE_CHAIN (my_convs) = child_convs;
2343     }
2344   else
2345     my_convs = child_convs;
2346 
2347   return my_convs;
2348 }
2349 
2350 /* Worker for lookup_conversions.  Lookup conversion functions in
2351    BINFO and its children.  VIRTUAL_DEPTH is nonzero, if BINFO is in
2352    a morally virtual base, and VIRTUALNESS is nonzero, if we've
2353    encountered virtual bases already in the tree walk.  PARENT_CONVS &
2354    PARENT_TPL_CONVS are lists of list of conversions within parent
2355    binfos.  OTHER_CONVS and OTHER_TPL_CONVS are conversions found
2356    elsewhere in the tree.  Return the conversions found within this
2357    portion of the graph in CONVS and TPL_CONVS.  Return nonzero is we
2358    encountered virtualness.  We keep template and non-template
2359    conversions separate, to avoid unnecessary type comparisons.
2360 
2361    The located conversion functions are held in lists of lists.  The
2362    TREE_VALUE of the outer list is the list of conversion functions
2363    found in a particular binfo.  The TREE_PURPOSE of both the outer
2364    and inner lists is the binfo at which those conversions were
2365    found.  TREE_STATIC is set for those lists within of morally
2366    virtual binfos.  The TREE_VALUE of the inner list is the conversion
2367    function or overload itself.  The TREE_TYPE of each inner list node
2368    is the converted-to type.  */
2369 
2370 static int
2371 lookup_conversions_r (tree binfo,
2372 		      int virtual_depth, int virtualness,
2373 		      tree parent_convs, tree parent_tpl_convs,
2374 		      tree other_convs, tree other_tpl_convs,
2375 		      tree *convs, tree *tpl_convs)
2376 {
2377   int my_virtualness = 0;
2378   tree my_convs = NULL_TREE;
2379   tree my_tpl_convs = NULL_TREE;
2380   tree child_convs = NULL_TREE;
2381   tree child_tpl_convs = NULL_TREE;
2382   unsigned i;
2383   tree base_binfo;
2384   vec<tree, va_gc> *method_vec = CLASSTYPE_METHOD_VEC (BINFO_TYPE (binfo));
2385   tree conv;
2386 
2387   /* If we have no conversion operators, then don't look.  */
2388   if (!TYPE_HAS_CONVERSION (BINFO_TYPE (binfo)))
2389     {
2390       *convs = *tpl_convs = NULL_TREE;
2391 
2392       return 0;
2393     }
2394 
2395   if (BINFO_VIRTUAL_P (binfo))
2396     virtual_depth++;
2397 
2398   /* First, locate the unhidden ones at this level.  */
2399   for (i = CLASSTYPE_FIRST_CONVERSION_SLOT;
2400        vec_safe_iterate (method_vec, i, &conv);
2401        ++i)
2402     {
2403       tree cur = OVL_CURRENT (conv);
2404 
2405       if (!DECL_CONV_FN_P (cur))
2406 	break;
2407 
2408       if (TREE_CODE (cur) == TEMPLATE_DECL)
2409 	{
2410 	  /* Only template conversions can be overloaded, and we must
2411 	     flatten them out and check each one individually.  */
2412 	  tree tpls;
2413 
2414 	  for (tpls = conv; tpls; tpls = OVL_NEXT (tpls))
2415 	    {
2416 	      tree tpl = OVL_CURRENT (tpls);
2417 	      tree type = DECL_CONV_FN_TYPE (tpl);
2418 
2419 	      if (check_hidden_convs (binfo, virtual_depth, virtualness,
2420 				      type, parent_tpl_convs, other_tpl_convs))
2421 		{
2422 		  my_tpl_convs = tree_cons (binfo, tpl, my_tpl_convs);
2423 		  TREE_TYPE (my_tpl_convs) = type;
2424 		  if (virtual_depth)
2425 		    {
2426 		      TREE_STATIC (my_tpl_convs) = 1;
2427 		      my_virtualness = 1;
2428 		    }
2429 		}
2430 	    }
2431 	}
2432       else
2433 	{
2434 	  tree name = DECL_NAME (cur);
2435 
2436 	  if (!IDENTIFIER_MARKED (name))
2437 	    {
2438 	      tree type = DECL_CONV_FN_TYPE (cur);
2439 	      if (type_uses_auto (type))
2440 		{
2441 		  mark_used (cur);
2442 		  type = DECL_CONV_FN_TYPE (cur);
2443 		}
2444 
2445 	      if (check_hidden_convs (binfo, virtual_depth, virtualness,
2446 				      type, parent_convs, other_convs))
2447 		{
2448 		  my_convs = tree_cons (binfo, conv, my_convs);
2449 		  TREE_TYPE (my_convs) = type;
2450 		  if (virtual_depth)
2451 		    {
2452 		      TREE_STATIC (my_convs) = 1;
2453 		      my_virtualness = 1;
2454 		    }
2455 		  IDENTIFIER_MARKED (name) = 1;
2456 		}
2457 	    }
2458 	}
2459     }
2460 
2461   if (my_convs)
2462     {
2463       parent_convs = tree_cons (binfo, my_convs, parent_convs);
2464       if (virtual_depth)
2465 	TREE_STATIC (parent_convs) = 1;
2466     }
2467 
2468   if (my_tpl_convs)
2469     {
2470       parent_tpl_convs = tree_cons (binfo, my_tpl_convs, parent_tpl_convs);
2471       if (virtual_depth)
2472 	TREE_STATIC (parent_tpl_convs) = 1;
2473     }
2474 
2475   child_convs = other_convs;
2476   child_tpl_convs = other_tpl_convs;
2477 
2478   /* Now iterate over each base, looking for more conversions.  */
2479   for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2480     {
2481       tree base_convs, base_tpl_convs;
2482       unsigned base_virtualness;
2483 
2484       base_virtualness = lookup_conversions_r (base_binfo,
2485 					       virtual_depth, virtualness,
2486 					       parent_convs, parent_tpl_convs,
2487 					       child_convs, child_tpl_convs,
2488 					       &base_convs, &base_tpl_convs);
2489       if (base_virtualness)
2490 	my_virtualness = virtualness = 1;
2491       child_convs = chainon (base_convs, child_convs);
2492       child_tpl_convs = chainon (base_tpl_convs, child_tpl_convs);
2493     }
2494 
2495   /* Unmark the conversions found at this level  */
2496   for (conv = my_convs; conv; conv = TREE_CHAIN (conv))
2497     IDENTIFIER_MARKED (DECL_NAME (OVL_CURRENT (TREE_VALUE (conv)))) = 0;
2498 
2499   *convs = split_conversions (my_convs, parent_convs,
2500 			      child_convs, other_convs);
2501   *tpl_convs = split_conversions (my_tpl_convs, parent_tpl_convs,
2502 				  child_tpl_convs, other_tpl_convs);
2503 
2504   return my_virtualness;
2505 }
2506 
2507 /* Return a TREE_LIST containing all the non-hidden user-defined
2508    conversion functions for TYPE (and its base-classes).  The
2509    TREE_VALUE of each node is the FUNCTION_DECL of the conversion
2510    function.  The TREE_PURPOSE is the BINFO from which the conversion
2511    functions in this node were selected.  This function is effectively
2512    performing a set of member lookups as lookup_fnfield does, but
2513    using the type being converted to as the unique key, rather than the
2514    field name.  */
2515 
2516 tree
2517 lookup_conversions (tree type)
2518 {
2519   tree convs, tpl_convs;
2520   tree list = NULL_TREE;
2521 
2522   complete_type (type);
2523   if (!TYPE_BINFO (type))
2524     return NULL_TREE;
2525 
2526   lookup_conversions_r (TYPE_BINFO (type), 0, 0,
2527 			NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
2528 			&convs, &tpl_convs);
2529 
2530   /* Flatten the list-of-lists */
2531   for (; convs; convs = TREE_CHAIN (convs))
2532     {
2533       tree probe, next;
2534 
2535       for (probe = TREE_VALUE (convs); probe; probe = next)
2536 	{
2537 	  next = TREE_CHAIN (probe);
2538 
2539 	  TREE_CHAIN (probe) = list;
2540 	  list = probe;
2541 	}
2542     }
2543 
2544   for (; tpl_convs; tpl_convs = TREE_CHAIN (tpl_convs))
2545     {
2546       tree probe, next;
2547 
2548       for (probe = TREE_VALUE (tpl_convs); probe; probe = next)
2549 	{
2550 	  next = TREE_CHAIN (probe);
2551 
2552 	  TREE_CHAIN (probe) = list;
2553 	  list = probe;
2554 	}
2555     }
2556 
2557   return list;
2558 }
2559 
2560 /* Returns the binfo of the first direct or indirect virtual base derived
2561    from BINFO, or NULL if binfo is not via virtual.  */
2562 
2563 tree
2564 binfo_from_vbase (tree binfo)
2565 {
2566   for (; binfo; binfo = BINFO_INHERITANCE_CHAIN (binfo))
2567     {
2568       if (BINFO_VIRTUAL_P (binfo))
2569 	return binfo;
2570     }
2571   return NULL_TREE;
2572 }
2573 
2574 /* Returns the binfo of the first direct or indirect virtual base derived
2575    from BINFO up to the TREE_TYPE, LIMIT, or NULL if binfo is not
2576    via virtual.  */
2577 
2578 tree
2579 binfo_via_virtual (tree binfo, tree limit)
2580 {
2581   if (limit && !CLASSTYPE_VBASECLASSES (limit))
2582     /* LIMIT has no virtual bases, so BINFO cannot be via one.  */
2583     return NULL_TREE;
2584 
2585   for (; binfo && !SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), limit);
2586        binfo = BINFO_INHERITANCE_CHAIN (binfo))
2587     {
2588       if (BINFO_VIRTUAL_P (binfo))
2589 	return binfo;
2590     }
2591   return NULL_TREE;
2592 }
2593 
2594 /* BINFO is a base binfo in the complete type BINFO_TYPE (HERE).
2595    Find the equivalent binfo within whatever graph HERE is located.
2596    This is the inverse of original_binfo.  */
2597 
2598 tree
2599 copied_binfo (tree binfo, tree here)
2600 {
2601   tree result = NULL_TREE;
2602 
2603   if (BINFO_VIRTUAL_P (binfo))
2604     {
2605       tree t;
2606 
2607       for (t = here; BINFO_INHERITANCE_CHAIN (t);
2608 	   t = BINFO_INHERITANCE_CHAIN (t))
2609 	continue;
2610 
2611       result = binfo_for_vbase (BINFO_TYPE (binfo), BINFO_TYPE (t));
2612     }
2613   else if (BINFO_INHERITANCE_CHAIN (binfo))
2614     {
2615       tree cbinfo;
2616       tree base_binfo;
2617       int ix;
2618 
2619       cbinfo = copied_binfo (BINFO_INHERITANCE_CHAIN (binfo), here);
2620       for (ix = 0; BINFO_BASE_ITERATE (cbinfo, ix, base_binfo); ix++)
2621 	if (SAME_BINFO_TYPE_P (BINFO_TYPE (base_binfo), BINFO_TYPE (binfo)))
2622 	  {
2623 	    result = base_binfo;
2624 	    break;
2625 	  }
2626     }
2627   else
2628     {
2629       gcc_assert (SAME_BINFO_TYPE_P (BINFO_TYPE (here), BINFO_TYPE (binfo)));
2630       result = here;
2631     }
2632 
2633   gcc_assert (result);
2634   return result;
2635 }
2636 
2637 tree
2638 binfo_for_vbase (tree base, tree t)
2639 {
2640   unsigned ix;
2641   tree binfo;
2642   vec<tree, va_gc> *vbases;
2643 
2644   for (vbases = CLASSTYPE_VBASECLASSES (t), ix = 0;
2645        vec_safe_iterate (vbases, ix, &binfo); ix++)
2646     if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), base))
2647       return binfo;
2648   return NULL;
2649 }
2650 
2651 /* BINFO is some base binfo of HERE, within some other
2652    hierarchy. Return the equivalent binfo, but in the hierarchy
2653    dominated by HERE.  This is the inverse of copied_binfo.  If BINFO
2654    is not a base binfo of HERE, returns NULL_TREE.  */
2655 
2656 tree
2657 original_binfo (tree binfo, tree here)
2658 {
2659   tree result = NULL;
2660 
2661   if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), BINFO_TYPE (here)))
2662     result = here;
2663   else if (BINFO_VIRTUAL_P (binfo))
2664     result = (CLASSTYPE_VBASECLASSES (BINFO_TYPE (here))
2665 	      ? binfo_for_vbase (BINFO_TYPE (binfo), BINFO_TYPE (here))
2666 	      : NULL_TREE);
2667   else if (BINFO_INHERITANCE_CHAIN (binfo))
2668     {
2669       tree base_binfos;
2670 
2671       base_binfos = original_binfo (BINFO_INHERITANCE_CHAIN (binfo), here);
2672       if (base_binfos)
2673 	{
2674 	  int ix;
2675 	  tree base_binfo;
2676 
2677 	  for (ix = 0; (base_binfo = BINFO_BASE_BINFO (base_binfos, ix)); ix++)
2678 	    if (SAME_BINFO_TYPE_P (BINFO_TYPE (base_binfo),
2679 				   BINFO_TYPE (binfo)))
2680 	      {
2681 		result = base_binfo;
2682 		break;
2683 	      }
2684 	}
2685     }
2686 
2687   return result;
2688 }
2689 
2690