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