OSDN Git Service

PR c++/17585
[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 /* DECL is the result of a qualified name lookup.  QUALIFYING_SCOPE is
1468    the class or namespace used to qualify the name.  CONTEXT_CLASS is
1469    the class corresponding to the object in which DECL will be used.
1470    Return a possibly modified version of DECL that takes into account
1471    the CONTEXT_CLASS.
1472
1473    In particular, consider an expression like `B::m' in the context of
1474    a derived class `D'.  If `B::m' has been resolved to a BASELINK,
1475    then the most derived class indicated by the BASELINK_BINFO will be
1476    `B', not `D'.  This function makes that adjustment.  */
1477
1478 tree
1479 adjust_result_of_qualified_name_lookup (tree decl, 
1480                                         tree qualifying_scope,
1481                                         tree context_class)
1482 {
1483   if (context_class && CLASS_TYPE_P (qualifying_scope) 
1484       && DERIVED_FROM_P (qualifying_scope, context_class)
1485       && BASELINK_P (decl))
1486     {
1487       tree base;
1488
1489       gcc_assert (CLASS_TYPE_P (context_class));
1490
1491       /* Look for the QUALIFYING_SCOPE as a base of the CONTEXT_CLASS.
1492          Because we do not yet know which function will be chosen by
1493          overload resolution, we cannot yet check either accessibility
1494          or ambiguity -- in either case, the choice of a static member
1495          function might make the usage valid.  */
1496       base = lookup_base (context_class, qualifying_scope,
1497                           ba_ignore | ba_quiet, NULL);
1498       if (base)
1499         {
1500           BASELINK_ACCESS_BINFO (decl) = base;
1501           BASELINK_BINFO (decl) 
1502             = lookup_base (base, BINFO_TYPE (BASELINK_BINFO (decl)),
1503                            ba_ignore | ba_quiet,
1504                            NULL);
1505         }
1506     }
1507
1508   return decl;
1509 }
1510
1511 \f
1512 /* Walk the class hierarchy within BINFO, in a depth-first traversal.
1513    PREFN is called in preorder, while POSTFN is called in postorder.
1514    If they ever returns a non-NULL value, that value is immediately
1515    returned and the walk is terminated.  Both PREFN and POSTFN can be
1516    NULL.  At each node, PREFN and POSTFN are passed the binfo to
1517    examine.  Before each base-binfo of BINFO is walked, QFN is called.
1518    If the value returned is nonzero, the base-binfo is walked;
1519    otherwise it is not.  If QFN is NULL, it is treated as a function
1520    which always returns 1.  All callbacks are passed DATA whenever
1521    they are called.  */
1522
1523 tree
1524 dfs_walk_real (tree binfo,
1525                tree (*prefn) (tree, void *),
1526                tree (*postfn) (tree, void *),
1527                tree (*qfn) (tree, int, void *),
1528                void *data)
1529 {
1530   int i;
1531   tree base_binfo;
1532   tree rval = NULL_TREE;
1533
1534   /* Call the pre-order walking function.  */
1535   if (prefn)
1536     {
1537       rval = (*prefn) (binfo, data);
1538       if (rval)
1539         return rval;
1540     }
1541
1542   /* Process the basetypes.  */
1543   for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
1544     {
1545       if (qfn)
1546         {
1547           base_binfo = (*qfn) (binfo, i, data);
1548           if (!base_binfo)
1549             continue;
1550         }
1551       rval = dfs_walk_real (base_binfo, prefn, postfn, qfn, data);
1552       if (rval)
1553         return rval;
1554     }
1555
1556   /* Call the post-order walking function.  */
1557   if (postfn)
1558     rval = (*postfn) (binfo, data);
1559   
1560   return rval;
1561 }
1562
1563 /* Exactly like dfs_walk_real, except that there is no pre-order
1564    function call and  FN is called in post-order.  */
1565
1566 tree
1567 dfs_walk (tree binfo,
1568           tree (*fn) (tree, void *),
1569           tree (*qfn) (tree, int, void *),
1570           void *data)
1571 {
1572   return dfs_walk_real (binfo, 0, fn, qfn, data);
1573 }
1574
1575 /* Check that virtual overrider OVERRIDER is acceptable for base function
1576    BASEFN. Issue diagnostic, and return zero, if unacceptable.  */
1577
1578 int
1579 check_final_overrider (tree overrider, tree basefn)
1580 {
1581   tree over_type = TREE_TYPE (overrider);
1582   tree base_type = TREE_TYPE (basefn);
1583   tree over_return = TREE_TYPE (over_type);
1584   tree base_return = TREE_TYPE (base_type);
1585   tree over_throw = TYPE_RAISES_EXCEPTIONS (over_type);
1586   tree base_throw = TYPE_RAISES_EXCEPTIONS (base_type);
1587   int fail = 0;
1588
1589   if (DECL_INVALID_OVERRIDER_P (overrider))
1590     return 0;
1591
1592   if (same_type_p (base_return, over_return))
1593     /* OK */;
1594   else if ((CLASS_TYPE_P (over_return) && CLASS_TYPE_P (base_return))
1595            || (TREE_CODE (base_return) == TREE_CODE (over_return)
1596                && POINTER_TYPE_P (base_return)))
1597     {
1598       /* Potentially covariant.  */
1599       unsigned base_quals, over_quals;
1600       
1601       fail = !POINTER_TYPE_P (base_return);
1602       if (!fail)
1603         {
1604           fail = cp_type_quals (base_return) != cp_type_quals (over_return);
1605           
1606           base_return = TREE_TYPE (base_return);
1607           over_return = TREE_TYPE (over_return);
1608         }
1609       base_quals = cp_type_quals (base_return);
1610       over_quals = cp_type_quals (over_return);
1611
1612       if ((base_quals & over_quals) != over_quals)
1613         fail = 1;
1614       
1615       if (CLASS_TYPE_P (base_return) && CLASS_TYPE_P (over_return))
1616         {
1617           tree binfo = lookup_base (over_return, base_return,
1618                                     ba_check | ba_quiet, NULL);
1619
1620           if (!binfo)
1621             fail = 1;
1622         }
1623       else if (!pedantic
1624                && can_convert (TREE_TYPE (base_type), TREE_TYPE (over_type)))
1625         /* GNU extension, allow trivial pointer conversions such as
1626            converting to void *, or qualification conversion.  */
1627         {
1628           /* can_convert will permit user defined conversion from a
1629              (reference to) class type. We must reject them.  */
1630           over_return = non_reference (TREE_TYPE (over_type));
1631           if (CLASS_TYPE_P (over_return))
1632             fail = 2;
1633         }
1634       else
1635         fail = 2;
1636     }
1637   else
1638     fail = 2;
1639   if (!fail)
1640     /* OK */;
1641   else
1642     {
1643       if (fail == 1)
1644         {
1645           cp_error_at ("invalid covariant return type for `%#D'", overrider);
1646           cp_error_at ("  overriding `%#D'", basefn);
1647         }
1648       else
1649         {
1650           cp_error_at ("conflicting return type specified for `%#D'",
1651                        overrider);
1652           cp_error_at ("  overriding `%#D'", basefn);
1653         }
1654       DECL_INVALID_OVERRIDER_P (overrider) = 1;
1655       return 0;
1656     }
1657   
1658   /* Check throw specifier is at least as strict.  */
1659   if (!comp_except_specs (base_throw, over_throw, 0))
1660     {
1661       cp_error_at ("looser throw specifier for `%#F'", overrider);
1662       cp_error_at ("  overriding `%#F'", basefn);
1663       DECL_INVALID_OVERRIDER_P (overrider) = 1;
1664       return 0;
1665     }
1666   
1667   return 1;
1668 }
1669
1670 /* Given a class TYPE, and a function decl FNDECL, look for
1671    virtual functions in TYPE's hierarchy which FNDECL overrides.
1672    We do not look in TYPE itself, only its bases.
1673    
1674    Returns nonzero, if we find any. Set FNDECL's DECL_VIRTUAL_P, if we
1675    find that it overrides anything.
1676    
1677    We check that every function which is overridden, is correctly
1678    overridden.  */
1679
1680 int
1681 look_for_overrides (tree type, tree fndecl)
1682 {
1683   tree binfo = TYPE_BINFO (type);
1684   tree base_binfo;
1685   int ix;
1686   int found = 0;
1687
1688   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
1689     {
1690       tree basetype = BINFO_TYPE (base_binfo);
1691       
1692       if (TYPE_POLYMORPHIC_P (basetype))
1693         found += look_for_overrides_r (basetype, fndecl);
1694     }
1695   return found;
1696 }
1697
1698 /* Look in TYPE for virtual functions with the same signature as
1699    FNDECL.  */
1700
1701 tree
1702 look_for_overrides_here (tree type, tree fndecl)
1703 {
1704   int ix;
1705
1706   /* If there are no methods in TYPE (meaning that only implicitly
1707      declared methods will ever be provided for TYPE), then there are
1708      no virtual functions.  */
1709   if (!CLASSTYPE_METHOD_VEC (type))
1710     return NULL_TREE;
1711
1712   if (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (fndecl))
1713     ix = CLASSTYPE_DESTRUCTOR_SLOT;
1714   else
1715     ix = lookup_fnfields_1 (type, DECL_NAME (fndecl));
1716   if (ix >= 0)
1717     {
1718       tree fns = VEC_index (tree, CLASSTYPE_METHOD_VEC (type), ix);
1719   
1720       for (; fns; fns = OVL_NEXT (fns))
1721         {
1722           tree fn = OVL_CURRENT (fns);
1723
1724           if (!DECL_VIRTUAL_P (fn))
1725             /* Not a virtual.  */;
1726           else if (DECL_CONTEXT (fn) != type)
1727             /* Introduced with a using declaration.  */;
1728           else if (DECL_STATIC_FUNCTION_P (fndecl))
1729             {
1730               tree btypes = TYPE_ARG_TYPES (TREE_TYPE (fn));
1731               tree dtypes = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1732               if (compparms (TREE_CHAIN (btypes), dtypes))
1733                 return fn;
1734             }
1735           else if (same_signature_p (fndecl, fn))
1736             return fn;
1737         }
1738     }
1739   return NULL_TREE;
1740 }
1741
1742 /* Look in TYPE for virtual functions overridden by FNDECL. Check both
1743    TYPE itself and its bases.  */
1744
1745 static int
1746 look_for_overrides_r (tree type, tree fndecl)
1747 {
1748   tree fn = look_for_overrides_here (type, fndecl);
1749   if (fn)
1750     {
1751       if (DECL_STATIC_FUNCTION_P (fndecl))
1752         {
1753           /* A static member function cannot match an inherited
1754              virtual member function.  */
1755           cp_error_at ("`%#D' cannot be declared", fndecl);
1756           cp_error_at ("  since `%#D' declared in base class", fn);
1757         }
1758       else
1759         {
1760           /* It's definitely virtual, even if not explicitly set.  */
1761           DECL_VIRTUAL_P (fndecl) = 1;
1762           check_final_overrider (fndecl, fn);
1763         }
1764       return 1;
1765     }
1766
1767   /* We failed to find one declared in this class. Look in its bases.  */
1768   return look_for_overrides (type, fndecl);
1769 }
1770
1771 /* Called via dfs_walk from dfs_get_pure_virtuals.  */
1772
1773 static tree
1774 dfs_get_pure_virtuals (tree binfo, void *data)
1775 {
1776   tree type = (tree) data;
1777
1778   /* We're not interested in primary base classes; the derived class
1779      of which they are a primary base will contain the information we
1780      need.  */
1781   if (!BINFO_PRIMARY_P (binfo))
1782     {
1783       tree virtuals;
1784       
1785       for (virtuals = BINFO_VIRTUALS (binfo);
1786            virtuals;
1787            virtuals = TREE_CHAIN (virtuals))
1788         if (DECL_PURE_VIRTUAL_P (BV_FN (virtuals)))
1789           VEC_safe_push (tree, CLASSTYPE_PURE_VIRTUALS (type),
1790                          BV_FN (virtuals));
1791     }
1792   
1793   BINFO_MARKED (binfo) = 1;
1794
1795   return NULL_TREE;
1796 }
1797
1798 /* Set CLASSTYPE_PURE_VIRTUALS for TYPE.  */
1799
1800 void
1801 get_pure_virtuals (tree type)
1802 {
1803   /* Clear the CLASSTYPE_PURE_VIRTUALS list; whatever is already there
1804      is going to be overridden.  */
1805   CLASSTYPE_PURE_VIRTUALS (type) = NULL;
1806   /* Now, run through all the bases which are not primary bases, and
1807      collect the pure virtual functions.  We look at the vtable in
1808      each class to determine what pure virtual functions are present.
1809      (A primary base is not interesting because the derived class of
1810      which it is a primary base will contain vtable entries for the
1811      pure virtuals in the base class.  */
1812   dfs_walk (TYPE_BINFO (type), dfs_get_pure_virtuals, unmarkedp, type);
1813   dfs_walk (TYPE_BINFO (type), dfs_unmark, markedp, type);
1814 }
1815 \f
1816 /* DEPTH-FIRST SEARCH ROUTINES.  */
1817
1818 tree 
1819 markedp (tree derived, int ix, void *data ATTRIBUTE_UNUSED) 
1820 {
1821   tree binfo = BINFO_BASE_BINFO (derived, ix);
1822   
1823   return BINFO_MARKED (binfo) ? binfo : NULL_TREE; 
1824 }
1825
1826 tree
1827 unmarkedp (tree derived, int ix, void *data ATTRIBUTE_UNUSED) 
1828 {
1829   tree binfo = BINFO_BASE_BINFO (derived, ix);
1830   
1831   return !BINFO_MARKED (binfo) ? binfo : NULL_TREE; 
1832 }
1833
1834 /* The worker functions for `dfs_walk'.  These do not need to
1835    test anything (vis a vis marking) if they are paired with
1836    a predicate function (above).  */
1837
1838 tree
1839 dfs_unmark (tree binfo, void *data ATTRIBUTE_UNUSED)
1840 {
1841   BINFO_MARKED (binfo) = 0;
1842   return NULL_TREE;
1843 }
1844
1845 \f
1846 /* Debug info for C++ classes can get very large; try to avoid
1847    emitting it everywhere.
1848
1849    Note that this optimization wins even when the target supports
1850    BINCL (if only slightly), and reduces the amount of work for the
1851    linker.  */
1852
1853 void
1854 maybe_suppress_debug_info (tree t)
1855 {
1856   if (write_symbols == NO_DEBUG)
1857     return;
1858
1859   /* We might have set this earlier in cp_finish_decl.  */
1860   TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 0;
1861
1862   /* If we already know how we're handling this class, handle debug info
1863      the same way.  */
1864   if (CLASSTYPE_INTERFACE_KNOWN (t))
1865     {
1866       if (CLASSTYPE_INTERFACE_ONLY (t))
1867         TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
1868       /* else don't set it.  */
1869     }
1870   /* If the class has a vtable, write out the debug info along with
1871      the vtable.  */
1872   else if (TYPE_CONTAINS_VPTR_P (t))
1873     TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
1874
1875   /* Otherwise, just emit the debug info normally.  */
1876 }
1877
1878 /* Note that we want debugging information for a base class of a class
1879    whose vtable is being emitted.  Normally, this would happen because
1880    calling the constructor for a derived class implies calling the
1881    constructors for all bases, which involve initializing the
1882    appropriate vptr with the vtable for the base class; but in the
1883    presence of optimization, this initialization may be optimized
1884    away, so we tell finish_vtable_vardecl that we want the debugging
1885    information anyway.  */
1886
1887 static tree
1888 dfs_debug_mark (tree binfo, void *data ATTRIBUTE_UNUSED)
1889 {
1890   tree t = BINFO_TYPE (binfo);
1891
1892   CLASSTYPE_DEBUG_REQUESTED (t) = 1;
1893
1894   return NULL_TREE;
1895 }
1896
1897 /* Returns BINFO if we haven't already noted that we want debugging
1898    info for this base class.  */
1899
1900 static tree 
1901 dfs_debug_unmarkedp (tree derived, int ix, void *data ATTRIBUTE_UNUSED)
1902 {
1903   tree binfo = BINFO_BASE_BINFO (derived, ix);
1904   
1905   return (!CLASSTYPE_DEBUG_REQUESTED (BINFO_TYPE (binfo)) 
1906           ? binfo : NULL_TREE);
1907 }
1908
1909 /* Write out the debugging information for TYPE, whose vtable is being
1910    emitted.  Also walk through our bases and note that we want to
1911    write out information for them.  This avoids the problem of not
1912    writing any debug info for intermediate basetypes whose
1913    constructors, and thus the references to their vtables, and thus
1914    the vtables themselves, were optimized away.  */
1915
1916 void
1917 note_debug_info_needed (tree type)
1918 {
1919   if (TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type)))
1920     {
1921       TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type)) = 0;
1922       rest_of_type_compilation (type, toplevel_bindings_p ());
1923     }
1924
1925   dfs_walk (TYPE_BINFO (type), dfs_debug_mark, dfs_debug_unmarkedp, 0);
1926 }
1927 \f
1928 void
1929 print_search_statistics (void)
1930 {
1931 #ifdef GATHER_STATISTICS
1932   fprintf (stderr, "%d fields searched in %d[%d] calls to lookup_field[_1]\n",
1933            n_fields_searched, n_calls_lookup_field, n_calls_lookup_field_1);
1934   fprintf (stderr, "%d fnfields searched in %d calls to lookup_fnfields\n",
1935            n_outer_fields_searched, n_calls_lookup_fnfields);
1936   fprintf (stderr, "%d calls to get_base_type\n", n_calls_get_base_type);
1937 #else /* GATHER_STATISTICS */
1938   fprintf (stderr, "no search statistics\n");
1939 #endif /* GATHER_STATISTICS */
1940 }
1941
1942 void
1943 reinit_search_statistics (void)
1944 {
1945 #ifdef GATHER_STATISTICS
1946   n_fields_searched = 0;
1947   n_calls_lookup_field = 0, n_calls_lookup_field_1 = 0;
1948   n_calls_lookup_fnfields = 0, n_calls_lookup_fnfields_1 = 0;
1949   n_calls_get_base_type = 0;
1950   n_outer_fields_searched = 0;
1951   n_contexts_saved = 0;
1952 #endif /* GATHER_STATISTICS */
1953 }
1954
1955 /* Helper for lookup_conversions_r.  TO_TYPE is the type converted to
1956    by a conversion op in base BINFO.  VIRTUAL_DEPTH is nonzero if
1957    BINFO is morally virtual, and VIRTUALNESS is nonzero if virtual
1958    bases have been encountered already in the tree walk.  PARENT_CONVS
1959    is the list of lists of conversion functions that could hide CONV
1960    and OTHER_CONVS is the list of lists of conversion functions that
1961    could hide or be hidden by CONV, should virtualness be involved in
1962    the hierarchy.  Merely checking the conversion op's name is not
1963    enough because two conversion operators to the same type can have
1964    different names.  Return nonzero if we are visible.  */
1965
1966 static int
1967 check_hidden_convs (tree binfo, int virtual_depth, int virtualness,
1968                     tree to_type, tree parent_convs, tree other_convs)
1969 {
1970   tree level, probe;
1971
1972   /* See if we are hidden by a parent conversion.  */
1973   for (level = parent_convs; level; level = TREE_CHAIN (level))
1974     for (probe = TREE_VALUE (level); probe; probe = TREE_CHAIN (probe))
1975       if (same_type_p (to_type, TREE_TYPE (probe)))
1976         return 0;
1977
1978   if (virtual_depth || virtualness)
1979     {
1980      /* In a virtual hierarchy, we could be hidden, or could hide a
1981         conversion function on the other_convs list.  */
1982       for (level = other_convs; level; level = TREE_CHAIN (level))
1983         {
1984           int we_hide_them;
1985           int they_hide_us;
1986           tree *prev, other;
1987           
1988           if (!(virtual_depth || TREE_STATIC (level)))
1989             /* Neither is morally virtual, so cannot hide each other. */
1990             continue;
1991           
1992           if (!TREE_VALUE (level))
1993             /* They evaporated away already.  */
1994             continue;
1995
1996           they_hide_us = (virtual_depth
1997                           && original_binfo (binfo, TREE_PURPOSE (level)));
1998           we_hide_them = (!they_hide_us && TREE_STATIC (level)
1999                           && original_binfo (TREE_PURPOSE (level), binfo));
2000
2001           if (!(we_hide_them || they_hide_us))
2002             /* Neither is within the other, so no hiding can occur.  */
2003             continue;
2004           
2005           for (prev = &TREE_VALUE (level), other = *prev; other;)
2006             {
2007               if (same_type_p (to_type, TREE_TYPE (other)))
2008                 {
2009                   if (they_hide_us)
2010                     /* We are hidden. */
2011                     return 0;
2012
2013                   if (we_hide_them)
2014                     {
2015                       /* We hide the other one.  */
2016                       other = TREE_CHAIN (other);
2017                       *prev = other;
2018                       continue;
2019                     }
2020                 }
2021               prev = &TREE_CHAIN (other);
2022               other = *prev;
2023             }
2024         }
2025     }
2026   return 1;
2027 }
2028
2029 /* Helper for lookup_conversions_r.  PARENT_CONVS is a list of lists
2030    of conversion functions, the first slot will be for the current
2031    binfo, if MY_CONVS is non-NULL.  CHILD_CONVS is the list of lists
2032    of conversion functions from children of the current binfo,
2033    concatenated with conversions from elsewhere in the hierarchy --
2034    that list begins with OTHER_CONVS.  Return a single list of lists
2035    containing only conversions from the current binfo and its
2036    children.  */
2037
2038 static tree
2039 split_conversions (tree my_convs, tree parent_convs,
2040                    tree child_convs, tree other_convs)
2041 {
2042   tree t;
2043   tree prev;
2044   
2045   /* Remove the original other_convs portion from child_convs.  */
2046   for (prev = NULL, t = child_convs;
2047        t != other_convs; prev = t, t = TREE_CHAIN (t))
2048     continue;
2049   
2050   if (prev)
2051     TREE_CHAIN (prev) = NULL_TREE;
2052   else
2053     child_convs = NULL_TREE;
2054
2055   /* Attach the child convs to any we had at this level.  */
2056   if (my_convs)
2057     {
2058       my_convs = parent_convs;
2059       TREE_CHAIN (my_convs) = child_convs;
2060     }
2061   else
2062     my_convs = child_convs;
2063   
2064   return my_convs;
2065 }
2066
2067 /* Worker for lookup_conversions.  Lookup conversion functions in
2068    BINFO and its children.  VIRTUAL_DEPTH is nonzero, if BINFO is in
2069    a morally virtual base, and VIRTUALNESS is nonzero, if we've
2070    encountered virtual bases already in the tree walk.  PARENT_CONVS &
2071    PARENT_TPL_CONVS are lists of list of conversions within parent
2072    binfos.  OTHER_CONVS and OTHER_TPL_CONVS are conversions found
2073    elsewhere in the tree.  Return the conversions found within this
2074    portion of the graph in CONVS and TPL_CONVS.  Return nonzero is we
2075    encountered virtualness.  We keep template and non-template
2076    conversions separate, to avoid unnecessary type comparisons.
2077
2078    The located conversion functions are held in lists of lists.  The
2079    TREE_VALUE of the outer list is the list of conversion functions
2080    found in a particular binfo.  The TREE_PURPOSE of both the outer
2081    and inner lists is the binfo at which those conversions were
2082    found.  TREE_STATIC is set for those lists within of morally
2083    virtual binfos.  The TREE_VALUE of the inner list is the conversion
2084    function or overload itself.  The TREE_TYPE of each inner list node
2085    is the converted-to type.  */
2086
2087 static int
2088 lookup_conversions_r (tree binfo,
2089                       int virtual_depth, int virtualness,
2090                       tree parent_convs, tree parent_tpl_convs,
2091                       tree other_convs, tree other_tpl_convs,
2092                       tree *convs, tree *tpl_convs)
2093 {
2094   int my_virtualness = 0;
2095   tree my_convs = NULL_TREE;
2096   tree my_tpl_convs = NULL_TREE;
2097   tree child_convs = NULL_TREE;
2098   tree child_tpl_convs = NULL_TREE;
2099   unsigned i;
2100   tree base_binfo;
2101   VEC(tree) *method_vec = CLASSTYPE_METHOD_VEC (BINFO_TYPE (binfo));
2102   tree conv;
2103
2104   /* If we have no conversion operators, then don't look.  */
2105   if (!TYPE_HAS_CONVERSION (BINFO_TYPE (binfo)))
2106     {
2107       *convs = *tpl_convs = NULL_TREE;
2108       
2109       return 0;
2110     }
2111   
2112   if (BINFO_VIRTUAL_P (binfo))
2113     virtual_depth++;
2114   
2115   /* First, locate the unhidden ones at this level.  */
2116   for (i = CLASSTYPE_FIRST_CONVERSION_SLOT; 
2117        VEC_iterate (tree, method_vec, i, conv);
2118        ++i)
2119     {
2120       tree cur = OVL_CURRENT (conv);
2121
2122       if (!DECL_CONV_FN_P (cur))
2123         break;
2124
2125       if (TREE_CODE (cur) == TEMPLATE_DECL)
2126         {
2127           /* Only template conversions can be overloaded, and we must
2128              flatten them out and check each one individually.  */
2129           tree tpls;
2130
2131           for (tpls = conv; tpls; tpls = OVL_NEXT (tpls))
2132             {
2133               tree tpl = OVL_CURRENT (tpls);
2134               tree type = DECL_CONV_FN_TYPE (tpl);
2135               
2136               if (check_hidden_convs (binfo, virtual_depth, virtualness,
2137                                       type, parent_tpl_convs, other_tpl_convs))
2138                 {
2139                   my_tpl_convs = tree_cons (binfo, tpl, my_tpl_convs);
2140                   TREE_TYPE (my_tpl_convs) = type;
2141                   if (virtual_depth)
2142                     {
2143                       TREE_STATIC (my_tpl_convs) = 1;
2144                       my_virtualness = 1;
2145                     }
2146                 }
2147             }
2148         }
2149       else
2150         {
2151           tree name = DECL_NAME (cur);
2152
2153           if (!IDENTIFIER_MARKED (name))
2154             {
2155               tree type = DECL_CONV_FN_TYPE (cur);
2156               
2157               if (check_hidden_convs (binfo, virtual_depth, virtualness,
2158                                       type, parent_convs, other_convs))
2159                 {
2160                   my_convs = tree_cons (binfo, conv, my_convs);
2161                   TREE_TYPE (my_convs) = type;
2162                   if (virtual_depth)
2163                     {
2164                       TREE_STATIC (my_convs) = 1;
2165                       my_virtualness = 1;
2166                     }
2167                   IDENTIFIER_MARKED (name) = 1;
2168                 }
2169             }
2170         }
2171     }
2172
2173   if (my_convs)
2174     {
2175       parent_convs = tree_cons (binfo, my_convs, parent_convs);
2176       if (virtual_depth)
2177         TREE_STATIC (parent_convs) = 1;
2178     }
2179   
2180   if (my_tpl_convs)
2181     {
2182       parent_tpl_convs = tree_cons (binfo, my_tpl_convs, parent_tpl_convs);
2183       if (virtual_depth)
2184         TREE_STATIC (parent_convs) = 1;
2185     }
2186
2187   child_convs = other_convs;
2188   child_tpl_convs = other_tpl_convs;
2189   
2190   /* Now iterate over each base, looking for more conversions.  */
2191   for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2192     {
2193       tree base_convs, base_tpl_convs;
2194       unsigned base_virtualness;
2195
2196       base_virtualness = lookup_conversions_r (base_binfo,
2197                                                virtual_depth, virtualness,
2198                                                parent_convs, parent_tpl_convs,
2199                                                child_convs, child_tpl_convs,
2200                                                &base_convs, &base_tpl_convs);
2201       if (base_virtualness)
2202         my_virtualness = virtualness = 1;
2203       child_convs = chainon (base_convs, child_convs);
2204       child_tpl_convs = chainon (base_tpl_convs, child_tpl_convs);
2205     }
2206
2207   /* Unmark the conversions found at this level  */
2208   for (conv = my_convs; conv; conv = TREE_CHAIN (conv))
2209     IDENTIFIER_MARKED (DECL_NAME (OVL_CURRENT (TREE_VALUE (conv)))) = 0;
2210
2211   *convs = split_conversions (my_convs, parent_convs,
2212                               child_convs, other_convs);
2213   *tpl_convs = split_conversions (my_tpl_convs, parent_tpl_convs,
2214                                   child_tpl_convs, other_tpl_convs);
2215   
2216   return my_virtualness;
2217 }
2218
2219 /* Return a TREE_LIST containing all the non-hidden user-defined
2220    conversion functions for TYPE (and its base-classes).  The
2221    TREE_VALUE of each node is the FUNCTION_DECL of the conversion
2222    function.  The TREE_PURPOSE is the BINFO from which the conversion
2223    functions in this node were selected.  This function is effectively
2224    performing a set of member lookups as lookup_fnfield does, but
2225    using the type being converted to as the unique key, rather than the
2226    field name.  */
2227
2228 tree
2229 lookup_conversions (tree type)
2230 {
2231   tree convs, tpl_convs;
2232   tree list = NULL_TREE;
2233   
2234   complete_type (type);
2235   if (!TYPE_BINFO (type))
2236     return NULL_TREE;
2237   
2238   lookup_conversions_r (TYPE_BINFO (type), 0, 0,
2239                         NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
2240                         &convs, &tpl_convs);
2241   
2242   /* Flatten the list-of-lists */
2243   for (; convs; convs = TREE_CHAIN (convs))
2244     {
2245       tree probe, next;
2246
2247       for (probe = TREE_VALUE (convs); probe; probe = next)
2248         {
2249           next = TREE_CHAIN (probe);
2250
2251           TREE_CHAIN (probe) = list;
2252           list = probe;
2253         }
2254     }
2255   
2256   for (; tpl_convs; tpl_convs = TREE_CHAIN (tpl_convs))
2257     {
2258       tree probe, next;
2259
2260       for (probe = TREE_VALUE (tpl_convs); probe; probe = next)
2261         {
2262           next = TREE_CHAIN (probe);
2263
2264           TREE_CHAIN (probe) = list;
2265           list = probe;
2266         }
2267     }
2268   
2269   return list;
2270 }
2271
2272 /* Returns the binfo of the first direct or indirect virtual base derived
2273    from BINFO, or NULL if binfo is not via virtual.  */
2274
2275 tree
2276 binfo_from_vbase (tree binfo)
2277 {
2278   for (; binfo; binfo = BINFO_INHERITANCE_CHAIN (binfo))
2279     {
2280       if (BINFO_VIRTUAL_P (binfo))
2281         return binfo;
2282     }
2283   return NULL_TREE;
2284 }
2285
2286 /* Returns the binfo of the first direct or indirect virtual base derived
2287    from BINFO up to the TREE_TYPE, LIMIT, or NULL if binfo is not
2288    via virtual.  */
2289
2290 tree
2291 binfo_via_virtual (tree binfo, tree limit)
2292 {
2293   for (; binfo && (!limit || !same_type_p (BINFO_TYPE (binfo), limit));
2294        binfo = BINFO_INHERITANCE_CHAIN (binfo))
2295     {
2296       if (BINFO_VIRTUAL_P (binfo))
2297         return binfo;
2298     }
2299   return NULL_TREE;
2300 }
2301
2302 /* BINFO is a base binfo in the complete type BINFO_TYPE (HERE).
2303    Find the equivalent binfo within whatever graph HERE is located.
2304    This is the inverse of original_binfo.  */
2305
2306 tree
2307 copied_binfo (tree binfo, tree here)
2308 {
2309   tree result = NULL_TREE;
2310   
2311   if (BINFO_VIRTUAL_P (binfo))
2312     {
2313       tree t;
2314
2315       for (t = here; BINFO_INHERITANCE_CHAIN (t);
2316            t = BINFO_INHERITANCE_CHAIN (t))
2317         continue;
2318
2319       result = binfo_for_vbase (BINFO_TYPE (binfo), BINFO_TYPE (t));
2320     }
2321   else if (BINFO_INHERITANCE_CHAIN (binfo))
2322     {
2323       tree cbinfo;
2324       tree base_binfo;
2325       int ix;
2326       
2327       cbinfo = copied_binfo (BINFO_INHERITANCE_CHAIN (binfo), here);
2328       for (ix = 0; BINFO_BASE_ITERATE (cbinfo, ix, base_binfo); ix++)
2329         if (BINFO_TYPE (base_binfo) == BINFO_TYPE (binfo))
2330           {
2331             result = base_binfo;
2332             break;
2333           }
2334     }
2335   else
2336     {
2337       gcc_assert (BINFO_TYPE (here) == BINFO_TYPE (binfo));
2338       result = here;
2339     }
2340
2341   gcc_assert (result);
2342   return result;
2343 }
2344
2345 tree
2346 binfo_for_vbase (tree base, tree t)
2347 {
2348   unsigned ix;
2349   tree binfo;
2350   VEC (tree) *vbases;
2351   
2352   for (vbases = CLASSTYPE_VBASECLASSES (t), ix = 0;
2353        VEC_iterate (tree, vbases, ix, binfo); ix++)
2354     if (BINFO_TYPE (binfo) == base)
2355       return binfo;
2356   return NULL;
2357 }
2358
2359 /* BINFO is some base binfo of HERE, within some other
2360    hierarchy. Return the equivalent binfo, but in the hierarchy
2361    dominated by HERE.  This is the inverse of copied_binfo.  If BINFO
2362    is not a base binfo of HERE, returns NULL_TREE.  */
2363
2364 tree
2365 original_binfo (tree binfo, tree here)
2366 {
2367   tree result = NULL;
2368   
2369   if (BINFO_TYPE (binfo) == BINFO_TYPE (here))
2370     result = here;
2371   else if (BINFO_VIRTUAL_P (binfo))
2372     result = (CLASSTYPE_VBASECLASSES (BINFO_TYPE (here))
2373               ? binfo_for_vbase (BINFO_TYPE (binfo), BINFO_TYPE (here))
2374               : NULL_TREE);
2375   else if (BINFO_INHERITANCE_CHAIN (binfo))
2376     {
2377       tree base_binfos;
2378       
2379       base_binfos = original_binfo (BINFO_INHERITANCE_CHAIN (binfo), here);
2380       if (base_binfos)
2381         {
2382           int ix;
2383           tree base_binfo;
2384           
2385           for (ix = 0; (base_binfo = BINFO_BASE_BINFO (base_binfos, ix)); ix++)
2386             if (BINFO_TYPE (base_binfo) == BINFO_TYPE (binfo))
2387               {
2388                 result = base_binfo;
2389                 break;
2390               }
2391         }
2392     }
2393   
2394   return result;
2395 }
2396