OSDN Git Service

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