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