OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [cp/] [search.c] - Blame information for rev 327

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.