OSDN Git Service

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