LCOV - code coverage report
Current view: top level - gcc/cp - search.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 96.0 % 969 930
Test Date: 2024-04-13 14:00:49 Functions: 100.0 % 68 68
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Breadth-first and depth-first routines for
       2                 :             :    searching multiple-inheritance lattice for GNU C++.
       3                 :             :    Copyright (C) 1987-2024 Free Software Foundation, Inc.
       4                 :             :    Contributed by Michael Tiemann (tiemann@cygnus.com)
       5                 :             : 
       6                 :             : This file is part of GCC.
       7                 :             : 
       8                 :             : GCC is free software; you can redistribute it and/or modify
       9                 :             : it under the terms of the GNU General Public License as published by
      10                 :             : the Free Software Foundation; either version 3, or (at your option)
      11                 :             : any later version.
      12                 :             : 
      13                 :             : GCC is distributed in the hope that it will be useful,
      14                 :             : but WITHOUT ANY WARRANTY; without even the implied warranty of
      15                 :             : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16                 :             : GNU General Public License for more details.
      17                 :             : 
      18                 :             : You should have received a copy of the GNU General Public License
      19                 :             : along with GCC; see the file COPYING3.  If not see
      20                 :             : <http://www.gnu.org/licenses/>.  */
      21                 :             : 
      22                 :             : /* High-level class interface.  */
      23                 :             : 
      24                 :             : #include "config.h"
      25                 :             : #include "system.h"
      26                 :             : #include "coretypes.h"
      27                 :             : #include "cp-tree.h"
      28                 :             : #include "intl.h"
      29                 :             : #include "toplev.h"
      30                 :             : #include "spellcheck-tree.h"
      31                 :             : #include "stringpool.h"
      32                 :             : #include "attribs.h"
      33                 :             : #include "tree-inline.h"
      34                 :             : 
      35                 :             : static int is_subobject_of_p (tree, tree);
      36                 :             : static tree dfs_lookup_base (tree, void *);
      37                 :             : static tree dfs_dcast_hint_pre (tree, void *);
      38                 :             : static tree dfs_dcast_hint_post (tree, void *);
      39                 :             : static tree dfs_debug_mark (tree, void *);
      40                 :             : static int check_hidden_convs (tree, int, int, tree, tree, tree);
      41                 :             : static tree split_conversions (tree, tree, tree, tree);
      42                 :             : static int lookup_conversions_r (tree, int, int, tree, tree, tree *);
      43                 :             : static int look_for_overrides_r (tree, tree);
      44                 :             : static tree lookup_field_r (tree, void *);
      45                 :             : static tree dfs_accessible_post (tree, void *);
      46                 :             : static tree dfs_walk_once_accessible (tree, bool,
      47                 :             :                                       tree (*pre_fn) (tree, void *),
      48                 :             :                                       tree (*post_fn) (tree, void *),
      49                 :             :                                       void *data);
      50                 :             : static tree dfs_access_in_type (tree, void *);
      51                 :             : static access_kind access_in_type (tree, tree);
      52                 :             : static tree dfs_get_pure_virtuals (tree, void *);
      53                 :             : 
      54                 :             : 
      55                 :             : /* Data for lookup_base and its workers.  */
      56                 :             : 
      57                 :             : struct lookup_base_data_s
      58                 :             : {
      59                 :             :   HOST_WIDE_INT offset; /* Offset we want, or -1 if any.  */
      60                 :             :   tree t;               /* type being searched.  */
      61                 :             :   tree base;            /* The base type we're looking for.  */
      62                 :             :   tree binfo;           /* Found binfo.  */
      63                 :             :   bool via_virtual;     /* Found via a virtual path.  */
      64                 :             :   bool ambiguous;       /* Found multiply ambiguous */
      65                 :             :   bool repeated_base;   /* Whether there are repeated bases in the
      66                 :             :                             hierarchy.  */
      67                 :             :   bool want_any;        /* Whether we want any matching binfo.  */
      68                 :             : };
      69                 :             : 
      70                 :             : /* Worker function for lookup_base.  See if we've found the desired
      71                 :             :    base and update DATA_ (a pointer to LOOKUP_BASE_DATA_S).  */
      72                 :             : 
      73                 :             : static tree
      74                 :   749453578 : dfs_lookup_base (tree binfo, void *data_)
      75                 :             : {
      76                 :   749453578 :   struct lookup_base_data_s *data = (struct lookup_base_data_s *) data_;
      77                 :             : 
      78                 :   749453578 :   if (data->offset != -1)
      79                 :             :     {
      80                 :             :       /* We're looking for the type at a particular offset.  */
      81                 :     5260317 :       int comp = compare_tree_int (BINFO_OFFSET (binfo), data->offset);
      82                 :     5260317 :       if (comp > 0)
      83                 :             :         /* Don't bother looking into bases laid out later; even if they
      84                 :             :            do virtually inherit from the base we want, we can get there
      85                 :             :            by another path.  */
      86                 :             :         return dfs_skip_bases;
      87                 :     5259470 :       else if (comp != 0
      88                 :     5260359 :                && SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), data->base))
      89                 :             :         /* Right type, wrong offset.  */
      90                 :             :         return dfs_skip_bases;
      91                 :             :       /* Fall through.  */
      92                 :             :     }
      93                 :             : 
      94                 :   749452728 :   if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), data->base))
      95                 :             :     {
      96                 :   346261570 :       if (!data->binfo)
      97                 :             :         {
      98                 :   346260194 :           data->binfo = binfo;
      99                 :   346260194 :           data->via_virtual
     100                 :   346260194 :             = binfo_via_virtual (data->binfo, data->t) != NULL_TREE;
     101                 :             : 
     102                 :   346260194 :           if (!data->repeated_base)
     103                 :             :             /* If there are no repeated bases, we can stop now.  */
     104                 :             :             return binfo;
     105                 :             : 
     106                 :       13030 :           if (data->want_any && !data->via_virtual)
     107                 :             :             /* If this is a non-virtual base, then we can't do
     108                 :             :                better.  */
     109                 :             :             return binfo;
     110                 :             : 
     111                 :             :           return dfs_skip_bases;
     112                 :             :         }
     113                 :             :       else
     114                 :             :         {
     115                 :        1376 :           gcc_assert (binfo != data->binfo);
     116                 :             : 
     117                 :             :           /* We've found more than one matching binfo.  */
     118                 :        1376 :           if (!data->want_any)
     119                 :             :             {
     120                 :             :               /* This is immediately ambiguous.  */
     121                 :        1241 :               data->binfo = NULL_TREE;
     122                 :        1241 :               data->ambiguous = true;
     123                 :        1241 :               return error_mark_node;
     124                 :             :             }
     125                 :             : 
     126                 :             :           /* Prefer one via a non-virtual path.  */
     127                 :         135 :           if (!binfo_via_virtual (binfo, data->t))
     128                 :             :             {
     129                 :          36 :               data->binfo = binfo;
     130                 :          36 :               data->via_virtual = false;
     131                 :          36 :               return binfo;
     132                 :             :             }
     133                 :             : 
     134                 :             :           /* There must be repeated bases, otherwise we'd have stopped
     135                 :             :              on the first base we found.  */
     136                 :             :           return dfs_skip_bases;
     137                 :             :         }
     138                 :             :     }
     139                 :             : 
     140                 :             :   return NULL_TREE;
     141                 :             : }
     142                 :             : 
     143                 :             : /* This deals with bug PR17314.
     144                 :             : 
     145                 :             :    DECL is a declaration and BINFO represents a class that has attempted (but
     146                 :             :    failed) to access DECL.
     147                 :             : 
     148                 :             :    Examine the parent binfos of BINFO and determine whether any of them had
     149                 :             :    private access to DECL.  If they did, return the parent binfo.  This helps
     150                 :             :    in figuring out the correct error message to show (if the parents had
     151                 :             :    access, it's their fault for not giving sufficient access to BINFO).
     152                 :             : 
     153                 :             :    If no parents had access, return NULL_TREE.  */
     154                 :             : 
     155                 :             : tree
     156                 :        1331 : get_parent_with_private_access (tree decl, tree binfo)
     157                 :             : {
     158                 :             :   /* Only BINFOs should come through here.  */
     159                 :        1331 :   gcc_assert (TREE_CODE (binfo) == TREE_BINFO);
     160                 :             : 
     161                 :        1452 :   tree base_binfo = NULL_TREE;
     162                 :             : 
     163                 :             :   /* Iterate through immediate parent classes.  */
     164                 :        1452 :   for (int i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
     165                 :             :     {
     166                 :             :       /* This parent had private access.  Therefore that's why BINFO can't
     167                 :             :           access DECL.  */
     168                 :         342 :       if (access_in_type (BINFO_TYPE (base_binfo), decl) == ak_private)
     169                 :         221 :         return base_binfo;
     170                 :             :     }
     171                 :             : 
     172                 :             :   /* None of the parents had access.  Note: it's impossible for one of the
     173                 :             :      parents to have had public or protected access to DECL, since then
     174                 :             :      BINFO would have been able to access DECL too.  */
     175                 :             :   return NULL_TREE;
     176                 :             : }
     177                 :             : 
     178                 :             : /* Returns true if type BASE is accessible in T.  (BASE is known to be
     179                 :             :    a (possibly non-proper) base class of T.)  If CONSIDER_LOCAL_P is
     180                 :             :    true, consider any special access of the current scope, or access
     181                 :             :    bestowed by friendship.  */
     182                 :             : 
     183                 :             : bool
     184                 :    34331097 : accessible_base_p (tree t, tree base, bool consider_local_p)
     185                 :             : {
     186                 :    34331097 :   tree decl;
     187                 :             : 
     188                 :             :   /* [class.access.base]
     189                 :             : 
     190                 :             :      A base class is said to be accessible if an invented public
     191                 :             :      member of the base class is accessible.
     192                 :             : 
     193                 :             :      If BASE is a non-proper base, this condition is trivially
     194                 :             :      true.  */
     195                 :    34331097 :   if (same_type_p (t, base))
     196                 :             :     return true;
     197                 :             :   /* Rather than inventing a public member, we use the implicit
     198                 :             :      public typedef created in the scope of every class.  */
     199                 :     7935859 :   decl = TYPE_FIELDS (base);
     200                 :   538696904 :   while (!DECL_SELF_REFERENCE_P (decl))
     201                 :   530761045 :     decl = DECL_CHAIN (decl);
     202                 :     7935859 :   while (ANON_AGGR_TYPE_P (t))
     203                 :           0 :     t = TYPE_CONTEXT (t);
     204                 :     7935859 :   return accessible_p (t, decl, consider_local_p);
     205                 :             : }
     206                 :             : 
     207                 :             : /* Lookup BASE in the hierarchy dominated by T.  Do access checking as
     208                 :             :    ACCESS specifies.  Return the binfo we discover.  If KIND_PTR is
     209                 :             :    non-NULL, fill with information about what kind of base we
     210                 :             :    discovered.  If OFFSET is other than -1, only match at that offset.
     211                 :             : 
     212                 :             :    If the base is inaccessible, or ambiguous, then error_mark_node is
     213                 :             :    returned.  If the tf_error bit of COMPLAIN is not set, no error
     214                 :             :    is issued.  */
     215                 :             : 
     216                 :             : tree
     217                 :   579826037 : lookup_base (tree t, tree base, base_access access,
     218                 :             :              base_kind *kind_ptr, tsubst_flags_t complain,
     219                 :             :              HOST_WIDE_INT offset /* = -1 */)
     220                 :             : {
     221                 :   579826037 :   tree binfo;
     222                 :   579826037 :   tree t_binfo;
     223                 :   579826037 :   base_kind bk;
     224                 :             : 
     225                 :             :   /* "Nothing" is definitely not derived from Base.  */
     226                 :   579826037 :   if (t == NULL_TREE)
     227                 :             :     {
     228                 :        4674 :       if (kind_ptr)
     229                 :           0 :         *kind_ptr = bk_not_base;
     230                 :        4674 :       return NULL_TREE;
     231                 :             :     }
     232                 :             : 
     233                 :   579821363 :   if (t == error_mark_node || base == error_mark_node)
     234                 :             :     {
     235                 :           0 :       if (kind_ptr)
     236                 :           0 :         *kind_ptr = bk_not_base;
     237                 :           0 :       return error_mark_node;
     238                 :             :     }
     239                 :   579821363 :   gcc_assert (TYPE_P (base));
     240                 :             : 
     241                 :   579821363 :   if (!TYPE_P (t))
     242                 :             :     {
     243                 :     2836654 :       t_binfo = t;
     244                 :     2836654 :       t = BINFO_TYPE (t);
     245                 :             :     }
     246                 :             :   else
     247                 :             :     {
     248                 :   576984709 :       t = complete_type (TYPE_MAIN_VARIANT (t));
     249                 :   576984709 :       if (dependent_type_p (t))
     250                 :   140409293 :         if (tree open = currently_open_class (t))
     251                 :   576984709 :           t = open;
     252                 :   576984709 :       t_binfo = TYPE_BINFO (t);
     253                 :             :     }
     254                 :             : 
     255                 :   579821363 :   base = TYPE_MAIN_VARIANT (base);
     256                 :             : 
     257                 :             :   /* If BASE is incomplete, it can't be a base of T--and instantiating it
     258                 :             :      might cause an error.  */
     259                 :   579821363 :   if (t_binfo && CLASS_TYPE_P (base) && COMPLETE_OR_OPEN_TYPE_P (base))
     260                 :             :     {
     261                 :   575207009 :       struct lookup_base_data_s data;
     262                 :             : 
     263                 :   575207009 :       data.t = t;
     264                 :   575207009 :       data.base = base;
     265                 :   575207009 :       data.binfo = NULL_TREE;
     266                 :   575207009 :       data.ambiguous = data.via_virtual = false;
     267                 :   575207009 :       data.repeated_base = (offset == -1) && CLASSTYPE_REPEATED_BASE_P (t);
     268                 :   575207009 :       data.want_any = access == ba_any;
     269                 :   575207009 :       data.offset = offset;
     270                 :             : 
     271                 :   575207009 :       dfs_walk_once (t_binfo, dfs_lookup_base, NULL, &data);
     272                 :   575207009 :       binfo = data.binfo;
     273                 :             : 
     274                 :   575207009 :       if (!binfo)
     275                 :   228948056 :         bk = data.ambiguous ? bk_ambig : bk_not_base;
     276                 :   346258953 :       else if (binfo == t_binfo)
     277                 :             :         bk = bk_same_type;
     278                 :    65349575 :       else if (data.via_virtual)
     279                 :             :         bk = bk_via_virtual;
     280                 :             :       else
     281                 :    64754833 :         bk = bk_proper_base;
     282                 :             :     }
     283                 :             :   else
     284                 :             :     {
     285                 :             :       binfo = NULL_TREE;
     286                 :             :       bk = bk_not_base;
     287                 :             :     }
     288                 :             : 
     289                 :             :   /* Check that the base is unambiguous and accessible.  */
     290                 :   579821363 :   if (access != ba_any)
     291                 :    13031239 :     switch (bk)
     292                 :             :       {
     293                 :             :       case bk_not_base:
     294                 :             :         break;
     295                 :             : 
     296                 :        1241 :       case bk_ambig:
     297                 :        1241 :         if (complain & tf_error)
     298                 :         106 :           error ("%qT is an ambiguous base of %qT", base, t);
     299                 :        1241 :         binfo = error_mark_node;
     300                 :        1241 :         break;
     301                 :             : 
     302                 :    13018899 :       default:
     303                 :    13018899 :         if ((access & ba_check_bit)
     304                 :             :             /* If BASE is incomplete, then BASE and TYPE are probably
     305                 :             :                the same, in which case BASE is accessible.  If they
     306                 :             :                are not the same, then TYPE is invalid.  In that case,
     307                 :             :                there's no need to issue another error here, and
     308                 :             :                there's no implicit typedef to use in the code that
     309                 :             :                follows, so we skip the check.  */
     310                 :     3367735 :             && COMPLETE_TYPE_P (base)
     311                 :    16386628 :             && !accessible_base_p (t, base, !(access & ba_ignore_scope)))
     312                 :             :           {
     313                 :         292 :             if (complain & tf_error)
     314                 :          60 :               error ("%qT is an inaccessible base of %qT", base, t);
     315                 :         292 :             binfo = error_mark_node;
     316                 :         292 :             bk = bk_inaccessible;
     317                 :             :           }
     318                 :             :         break;
     319                 :             :       }
     320                 :             : 
     321                 :   579821363 :   if (kind_ptr)
     322                 :     3200220 :     *kind_ptr = bk;
     323                 :             : 
     324                 :             :   return binfo;
     325                 :             : }
     326                 :             : 
     327                 :             : /* Data for dcast_base_hint walker.  */
     328                 :             : 
     329                 :             : struct dcast_data_s
     330                 :             : {
     331                 :             :   tree subtype;   /* The base type we're looking for.  */
     332                 :             :   int virt_depth; /* Number of virtual bases encountered from most
     333                 :             :                      derived.  */
     334                 :             :   tree offset;    /* Best hint offset discovered so far.  */
     335                 :             :   bool repeated_base;  /* Whether there are repeated bases in the
     336                 :             :                           hierarchy.  */
     337                 :             : };
     338                 :             : 
     339                 :             : /* Worker for dcast_base_hint.  Search for the base type being cast
     340                 :             :    from.  */
     341                 :             : 
     342                 :             : static tree
     343                 :       14741 : dfs_dcast_hint_pre (tree binfo, void *data_)
     344                 :             : {
     345                 :       14741 :   struct dcast_data_s *data = (struct dcast_data_s *) data_;
     346                 :             : 
     347                 :       14741 :   if (BINFO_VIRTUAL_P (binfo))
     348                 :         180 :     data->virt_depth++;
     349                 :             : 
     350                 :       14741 :   if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), data->subtype))
     351                 :             :     {
     352                 :        6871 :       if (data->virt_depth)
     353                 :             :         {
     354                 :         160 :           data->offset = ssize_int (-1);
     355                 :         160 :           return data->offset;
     356                 :             :         }
     357                 :        6711 :       if (data->offset)
     358                 :           4 :         data->offset = ssize_int (-3);
     359                 :             :       else
     360                 :        6707 :         data->offset = BINFO_OFFSET (binfo);
     361                 :             : 
     362                 :        6711 :       return data->repeated_base ? dfs_skip_bases : data->offset;
     363                 :             :     }
     364                 :             : 
     365                 :             :   return NULL_TREE;
     366                 :             : }
     367                 :             : 
     368                 :             : /* Worker for dcast_base_hint.  Track the virtual depth.  */
     369                 :             : 
     370                 :             : static tree
     371                 :         685 : dfs_dcast_hint_post (tree binfo, void *data_)
     372                 :             : {
     373                 :         685 :   struct dcast_data_s *data = (struct dcast_data_s *) data_;
     374                 :             : 
     375                 :         685 :   if (BINFO_VIRTUAL_P (binfo))
     376                 :           4 :     data->virt_depth--;
     377                 :             : 
     378                 :         685 :   return NULL_TREE;
     379                 :             : }
     380                 :             : 
     381                 :             : /* The dynamic cast runtime needs a hint about how the static SUBTYPE type
     382                 :             :    started from is related to the required TARGET type, in order to optimize
     383                 :             :    the inheritance graph search. This information is independent of the
     384                 :             :    current context, and ignores private paths, hence get_base_distance is
     385                 :             :    inappropriate. Return a TREE specifying the base offset, BOFF.
     386                 :             :    BOFF >= 0, there is only one public non-virtual SUBTYPE base at offset BOFF,
     387                 :             :       and there are no public virtual SUBTYPE bases.
     388                 :             :    BOFF == -1, SUBTYPE occurs as multiple public virtual or non-virtual bases.
     389                 :             :    BOFF == -2, SUBTYPE is not a public base.
     390                 :             :    BOFF == -3, SUBTYPE occurs as multiple public non-virtual bases.  */
     391                 :             : 
     392                 :             : tree
     393                 :        7068 : dcast_base_hint (tree subtype, tree target)
     394                 :             : {
     395                 :        7068 :   struct dcast_data_s data;
     396                 :             : 
     397                 :        7068 :   data.subtype = subtype;
     398                 :        7068 :   data.virt_depth = 0;
     399                 :        7068 :   data.offset = NULL_TREE;
     400                 :        7068 :   data.repeated_base = CLASSTYPE_REPEATED_BASE_P (target);
     401                 :             : 
     402                 :        7068 :   dfs_walk_once_accessible (TYPE_BINFO (target), /*friends=*/false,
     403                 :             :                             dfs_dcast_hint_pre, dfs_dcast_hint_post, &data);
     404                 :        7068 :   return data.offset ? data.offset : ssize_int (-2);
     405                 :             : }
     406                 :             : 
     407                 :             : /* Search for a member with name NAME in a multiple inheritance
     408                 :             :    lattice specified by TYPE.  If it does not exist, return NULL_TREE.
     409                 :             :    If the member is ambiguously referenced, return `error_mark_node'.
     410                 :             :    Otherwise, return a DECL with the indicated name.  If WANT_TYPE is
     411                 :             :    true, type declarations are preferred.  */
     412                 :             : 
     413                 :             : /* Return the FUNCTION_DECL, RECORD_TYPE, UNION_TYPE, or
     414                 :             :    NAMESPACE_DECL corresponding to the innermost non-block scope.  */
     415                 :             : 
     416                 :             : tree
     417                 :  1688008851 : current_scope (void)
     418                 :             : {
     419                 :             :   /* There are a number of cases we need to be aware of here:
     420                 :             :                          current_class_type     current_function_decl
     421                 :             :      global                     NULL                    NULL
     422                 :             :      fn-local                   NULL                    SET
     423                 :             :      class-local                SET                     NULL
     424                 :             :      class->fn                       SET                     SET
     425                 :             :      fn->class                       SET                     SET
     426                 :             : 
     427                 :             :      Those last two make life interesting.  If we're in a function which is
     428                 :             :      itself inside a class, we need decls to go into the fn's decls (our
     429                 :             :      second case below).  But if we're in a class and the class itself is
     430                 :             :      inside a function, we need decls to go into the decls for the class.  To
     431                 :             :      achieve this last goal, we must see if, when both current_class_ptr and
     432                 :             :      current_function_decl are set, the class was declared inside that
     433                 :             :      function.  If so, we know to put the decls into the class's scope.  */
     434                 :   405953234 :   if (current_function_decl && current_class_type
     435                 :  1951805049 :       && ((DECL_FUNCTION_MEMBER_P (current_function_decl)
     436                 :   258862975 :            && same_type_p (DECL_CONTEXT (current_function_decl),
     437                 :             :                            current_class_type))
     438                 :    19492363 :           || (DECL_FRIEND_CONTEXT (current_function_decl)
     439                 :     3156363 :               && same_type_p (DECL_FRIEND_CONTEXT (current_function_decl),
     440                 :             :                               current_class_type))))
     441                 :   257041570 :     return current_function_decl;
     442                 :             : 
     443                 :  1430967281 :   if (current_class_type)
     444                 :             :     return current_class_type;
     445                 :             : 
     446                 :   701442640 :   if (current_function_decl)
     447                 :             :     return current_function_decl;
     448                 :             : 
     449                 :   559285604 :   return current_namespace;
     450                 :             : }
     451                 :             : 
     452                 :             : /* Returns nonzero if we are currently in a function scope.  Note
     453                 :             :    that this function returns zero if we are within a local class, but
     454                 :             :    not within a member function body of the local class.  */
     455                 :             : 
     456                 :             : int
     457                 :   394327357 : at_function_scope_p (void)
     458                 :             : {
     459                 :   394327357 :   tree cs = current_scope ();
     460                 :             :   /* Also check cfun to make sure that we're really compiling
     461                 :             :      this function (as opposed to having set current_function_decl
     462                 :             :      for access checking or some such).  */
     463                 :   394327357 :   return (cs && TREE_CODE (cs) == FUNCTION_DECL
     464                 :   526170863 :           && cfun && cfun->decl == current_function_decl);
     465                 :             : }
     466                 :             : 
     467                 :             : /* Returns true if the innermost active scope is a class scope.  */
     468                 :             : 
     469                 :             : bool
     470                 :   573321612 : at_class_scope_p (void)
     471                 :             : {
     472                 :   573321612 :   tree cs = current_scope ();
     473                 :   573321612 :   return cs && TYPE_P (cs);
     474                 :             : }
     475                 :             : 
     476                 :             : /* Returns true if the innermost active scope is a namespace scope.  */
     477                 :             : 
     478                 :             : bool
     479                 :   282276640 : at_namespace_scope_p (void)
     480                 :             : {
     481                 :   282276640 :   tree cs = current_scope ();
     482                 :   282276640 :   return cs && TREE_CODE (cs) == NAMESPACE_DECL;
     483                 :             : }
     484                 :             : 
     485                 :             : /* Return the scope of DECL, as appropriate when doing name-lookup.  */
     486                 :             : 
     487                 :             : tree
     488                 :  4698447685 : context_for_name_lookup (tree decl)
     489                 :             : {
     490                 :             :   /* [class.union]
     491                 :             : 
     492                 :             :      For the purposes of name lookup, after the anonymous union
     493                 :             :      definition, the members of the anonymous union are considered to
     494                 :             :      have been defined in the scope in which the anonymous union is
     495                 :             :      declared.  */
     496                 :  4698447685 :   tree context = DECL_CONTEXT (decl);
     497                 :             : 
     498                 :  8995006089 :   while (context && TYPE_P (context)
     499                 :  6667106622 :          && (ANON_AGGR_TYPE_P (context) || UNSCOPED_ENUM_P (context)))
     500                 :    51686095 :     context = TYPE_CONTEXT (context);
     501                 :  4698447685 :   if (!context)
     502                 :   453575376 :     context = global_namespace;
     503                 :             : 
     504                 :  4698447685 :   return context;
     505                 :             : }
     506                 :             : 
     507                 :             : /* Like the above, but always return a type, because it's simpler for member
     508                 :             :    handling to refer to the anonymous aggr rather than a function.  */
     509                 :             : 
     510                 :             : tree
     511                 :      928167 : type_context_for_name_lookup (tree decl)
     512                 :             : {
     513                 :      928167 :   tree context = DECL_P (decl) ? DECL_CONTEXT (decl) : decl;
     514                 :      928167 :   gcc_checking_assert (CLASS_TYPE_P (context));
     515                 :             : 
     516                 :      930254 :   while (context && TYPE_P (context) && ANON_AGGR_TYPE_P (context))
     517                 :             :     {
     518                 :        2099 :       tree next = TYPE_CONTEXT (context);
     519                 :        2099 :       if (!TYPE_P (next))
     520                 :             :         break;
     521                 :             :       context = next;
     522                 :             :     }
     523                 :      928167 :   return context;
     524                 :             : }
     525                 :             : 
     526                 :             : /* Returns true iff DECL is declared in TYPE.  */
     527                 :             : 
     528                 :             : static bool
     529                 :   366396277 : member_declared_in_type (tree decl, tree type)
     530                 :             : {
     531                 :             :   /* A normal declaration obviously counts.  */
     532                 :   366396277 :   if (context_for_name_lookup (decl) == type)
     533                 :             :     return true;
     534                 :             :   /* So does a using or access declaration.  */
     535                 :   112641310 :   if (DECL_LANG_SPECIFIC (decl) && !DECL_DISCRIMINATOR_P (decl)
     536                 :   112641310 :       && purpose_member (type, DECL_ACCESS (decl)))
     537                 :             :     return true;
     538                 :             :   return false;
     539                 :             : }
     540                 :             : 
     541                 :             : /* The accessibility routines use BINFO_ACCESS for scratch space
     542                 :             :    during the computation of the accessibility of some declaration.  */
     543                 :             : 
     544                 :             : /* Avoid walking up past a declaration of the member.  */
     545                 :             : 
     546                 :             : static tree
     547                 :   325067791 : dfs_access_in_type_pre (tree binfo, void *data)
     548                 :             : {
     549                 :   325067791 :   tree decl = (tree) data;
     550                 :   325067791 :   tree type = BINFO_TYPE (binfo);
     551                 :   325067791 :   if (member_declared_in_type (decl, type))
     552                 :   270270176 :     return dfs_skip_bases;
     553                 :             :   return NULL_TREE;
     554                 :             : }
     555                 :             : 
     556                 :             : #define BINFO_ACCESS(NODE) \
     557                 :             :   ((access_kind) ((TREE_PUBLIC (NODE) << 1) | TREE_PRIVATE (NODE)))
     558                 :             : 
     559                 :             : /* Set the access associated with NODE to ACCESS.  */
     560                 :             : 
     561                 :             : #define SET_BINFO_ACCESS(NODE, ACCESS)                  \
     562                 :             :   ((TREE_PUBLIC (NODE) = ((ACCESS) & 2) != 0),      \
     563                 :             :    (TREE_PRIVATE (NODE) = ((ACCESS) & 1) != 0))
     564                 :             : 
     565                 :             : /* Called from access_in_type via dfs_walk.  Calculate the access to
     566                 :             :    DATA (which is really a DECL) in BINFO.  */
     567                 :             : 
     568                 :             : static tree
     569                 :   325067791 : dfs_access_in_type (tree binfo, void *data)
     570                 :             : {
     571                 :   325067791 :   tree decl = (tree) data;
     572                 :   325067791 :   tree type = BINFO_TYPE (binfo);
     573                 :   325067791 :   access_kind access = ak_none;
     574                 :             : 
     575                 :   325067791 :   if (context_for_name_lookup (decl) == type)
     576                 :             :     {
     577                 :             :       /* If we have descended to the scope of DECL, just note the
     578                 :             :          appropriate access.  */
     579                 :   269728557 :       if (TREE_PRIVATE (decl))
     580                 :             :         access = ak_private;
     581                 :   241520416 :       else if (TREE_PROTECTED (decl))
     582                 :             :         access = ak_protected;
     583                 :             :       else
     584                 :   282090525 :         access = ak_public;
     585                 :             :     }
     586                 :             :   else
     587                 :             :     {
     588                 :             :       /* First, check for an access-declaration that gives us more
     589                 :             :          access to the DECL.  */
     590                 :    55339234 :       if (DECL_LANG_SPECIFIC (decl) && !DECL_DISCRIMINATOR_P (decl))
     591                 :             :         {
     592                 :    77697498 :           tree decl_access = purpose_member (type, DECL_ACCESS (decl));
     593                 :             : 
     594                 :    50957426 :           if (decl_access)
     595                 :             :             {
     596                 :      541619 :               decl_access = TREE_VALUE (decl_access);
     597                 :             : 
     598                 :      541619 :               if (decl_access == access_public_node)
     599                 :             :                 access = ak_public;
     600                 :      196997 :               else if (decl_access == access_protected_node)
     601                 :             :                 access = ak_protected;
     602                 :       33273 :               else if (decl_access == access_private_node)
     603                 :             :                 access = ak_private;
     604                 :             :               else
     605                 :           0 :                 gcc_unreachable ();
     606                 :             :             }
     607                 :             :         }
     608                 :             : 
     609                 :             :       if (!access)
     610                 :             :         {
     611                 :    54797615 :           int i;
     612                 :    54797615 :           tree base_binfo;
     613                 :    54797615 :           vec<tree, va_gc> *accesses;
     614                 :             : 
     615                 :             :           /* Otherwise, scan our baseclasses, and pick the most favorable
     616                 :             :              access.  */
     617                 :    54797615 :           accesses = BINFO_BASE_ACCESSES (binfo);
     618                 :    60847900 :           for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
     619                 :             :             {
     620                 :    54122007 :               tree base_access = (*accesses)[i];
     621                 :    54122007 :               access_kind base_access_now = BINFO_ACCESS (base_binfo);
     622                 :             : 
     623                 :    54122007 :               if (base_access_now == ak_none || base_access_now == ak_private)
     624                 :             :                 /* If it was not accessible in the base, or only
     625                 :             :                    accessible as a private member, we can't access it
     626                 :             :                    all.  */
     627                 :             :                 base_access_now = ak_none;
     628                 :    51307436 :               else if (base_access == access_protected_node)
     629                 :             :                 /* Public and protected members in the base become
     630                 :             :                    protected here.  */
     631                 :             :                 base_access_now = ak_protected;
     632                 :    50880173 :               else if (base_access == access_private_node)
     633                 :             :                 /* Public and protected members in the base become
     634                 :             :                    private here.  */
     635                 :             :                 base_access_now = ak_private;
     636                 :             : 
     637                 :             :               /* See if the new access, via this base, gives more
     638                 :             :                  access than our previous best access.  */
     639                 :    49753089 :               if (base_access_now != ak_none
     640                 :    51307436 :                   && (access == ak_none || base_access_now < access))
     641                 :             :                 {
     642                 :    51307106 :                   access = base_access_now;
     643                 :             : 
     644                 :             :                   /* If the new access is public, we can't do better.  */
     645                 :    51307106 :                   if (access == ak_public)
     646                 :             :                     break;
     647                 :             :                 }
     648                 :             :             }
     649                 :             :         }
     650                 :             :     }
     651                 :             : 
     652                 :             :   /* Note the access to DECL in TYPE.  */
     653                 :   325067791 :   SET_BINFO_ACCESS (binfo, access);
     654                 :             : 
     655                 :   325067791 :   return NULL_TREE;
     656                 :             : }
     657                 :             : 
     658                 :             : /* Return the access to DECL in TYPE.  */
     659                 :             : 
     660                 :             : static access_kind
     661                 :   270269981 : access_in_type (tree type, tree decl)
     662                 :             : {
     663                 :   270269981 :   tree binfo = TYPE_BINFO (type);
     664                 :             : 
     665                 :             :   /* We must take into account
     666                 :             : 
     667                 :             :        [class.paths]
     668                 :             : 
     669                 :             :        If a name can be reached by several paths through a multiple
     670                 :             :        inheritance graph, the access is that of the path that gives
     671                 :             :        most access.
     672                 :             : 
     673                 :             :     The algorithm we use is to make a post-order depth-first traversal
     674                 :             :     of the base-class hierarchy.  As we come up the tree, we annotate
     675                 :             :     each node with the most lenient access.  */
     676                 :   270269981 :   dfs_walk_once (binfo, dfs_access_in_type_pre, dfs_access_in_type, decl);
     677                 :             : 
     678                 :   270269981 :   return BINFO_ACCESS (binfo);
     679                 :             : }
     680                 :             : 
     681                 :             : /* Returns nonzero if it is OK to access DECL named in TYPE through an object
     682                 :             :    of OTYPE in the context of DERIVED.  */
     683                 :             : 
     684                 :             : static int
     685                 :     8067836 : protected_accessible_p (tree decl, tree derived, tree type, tree otype)
     686                 :             : {
     687                 :             :   /* We're checking this clause from [class.access.base]
     688                 :             : 
     689                 :             :        m as a member of N is protected, and the reference occurs in a
     690                 :             :        member or friend of class N, or in a member or friend of a
     691                 :             :        class P derived from N, where m as a member of P is public, private
     692                 :             :        or protected.
     693                 :             : 
     694                 :             :     Here DERIVED is a possible P, DECL is m and TYPE is N.  */
     695                 :             : 
     696                 :             :   /* If DERIVED isn't derived from N, then it can't be a P.  */
     697                 :     8067836 :   if (!DERIVED_FROM_P (type, derived))
     698                 :             :     return 0;
     699                 :             : 
     700                 :             :   /* DECL_NONSTATIC_MEMBER_P won't work for USING_DECLs.  */
     701                 :     8010280 :   decl = strip_using_decl (decl);
     702                 :             :   /* We don't expect or support dependent decls.  */
     703                 :     8010280 :   gcc_assert (TREE_CODE (decl) != USING_DECL);
     704                 :             : 
     705                 :             :   /* [class.protected]
     706                 :             : 
     707                 :             :      When a friend or a member function of a derived class references
     708                 :             :      a protected non-static member of a base class, an access check
     709                 :             :      applies in addition to those described earlier in clause
     710                 :             :      _class.access_) Except when forming a pointer to member
     711                 :             :      (_expr.unary.op_), the access must be through a pointer to,
     712                 :             :      reference to, or object of the derived class itself (or any class
     713                 :             :      derived from that class) (_expr.ref_).  If the access is to form
     714                 :             :      a pointer to member, the nested-name-specifier shall name the
     715                 :             :      derived class (or any class derived from that class).  */
     716                 :    13520186 :   if (DECL_NONSTATIC_MEMBER_P (decl)
     717                 :    12144542 :       && !DERIVED_FROM_P (derived, otype))
     718                 :             :     return 0;
     719                 :             : 
     720                 :             :   return 1;
     721                 :             : }
     722                 :             : 
     723                 :             : /* Returns nonzero if SCOPE is a type or a friend of a type which would be able
     724                 :             :    to access DECL through TYPE.  OTYPE is the type of the object.  */
     725                 :             : 
     726                 :             : static int
     727                 :    14119435 : friend_accessible_p (tree scope, tree decl, tree type, tree otype)
     728                 :             : {
     729                 :             :   /* We're checking this clause from [class.access.base]
     730                 :             : 
     731                 :             :        m as a member of N is protected, and the reference occurs in a
     732                 :             :        member or friend of class N, or in a member or friend of a
     733                 :             :        class P derived from N, where m as a member of P is public, private
     734                 :             :        or protected.
     735                 :             : 
     736                 :             :     Here DECL is m and TYPE is N.  SCOPE is the current context,
     737                 :             :     and we check all its possible Ps.  */
     738                 :    14119435 :   tree befriending_classes;
     739                 :    14119435 :   tree t;
     740                 :             : 
     741                 :    14119435 :   if (!scope)
     742                 :             :     return 0;
     743                 :             : 
     744                 :    14119435 :   if (is_global_friend (scope))
     745                 :             :     return 1;
     746                 :             : 
     747                 :             :   /* Is SCOPE itself a suitable P?  */
     748                 :    14119435 :   if (TYPE_P (scope) && protected_accessible_p (decl, scope, type, otype))
     749                 :             :     return 1;
     750                 :             : 
     751                 :     6120381 :   if (DECL_DECLARES_FUNCTION_P (scope))
     752                 :     6062485 :     befriending_classes = DECL_BEFRIENDING_CLASSES (scope);
     753                 :       57896 :   else if (TYPE_P (scope))
     754                 :       57116 :     befriending_classes = CLASSTYPE_BEFRIENDING_CLASSES (scope);
     755                 :             :   else
     756                 :             :     return 0;
     757                 :             : 
     758                 :     6120146 :   for (t = befriending_classes; t; t = TREE_CHAIN (t))
     759                 :       11666 :     if (protected_accessible_p (decl, TREE_VALUE (t), type, otype))
     760                 :             :       return 1;
     761                 :             : 
     762                 :             :   /* Nested classes have the same access as their enclosing types, as
     763                 :             :      per DR 45 (this is a change from C++98).  */
     764                 :     6108480 :   if (TYPE_P (scope))
     765                 :       46523 :     if (friend_accessible_p (TYPE_CONTEXT (scope), decl, type, otype))
     766                 :             :       return 1;
     767                 :             : 
     768                 :     6062520 :   if (DECL_DECLARES_FUNCTION_P (scope))
     769                 :             :     {
     770                 :             :       /* Perhaps this SCOPE is a member of a class which is a
     771                 :             :          friend.  */
     772                 :    12123914 :       if (DECL_CLASS_SCOPE_P (scope)
     773                 :    12123530 :           && friend_accessible_p (DECL_CONTEXT (scope), decl, type, otype))
     774                 :             :         return 1;
     775                 :             :       /* Perhaps SCOPE is a friend function defined inside a class from which
     776                 :             :          DECL is accessible.  */
     777                 :        1016 :       if (tree fctx = DECL_FRIEND_CONTEXT (scope))
     778                 :           4 :         if (friend_accessible_p (fctx, decl, type, otype))
     779                 :             :           return 1;
     780                 :             :     }
     781                 :             : 
     782                 :             :   /* Maybe scope's template is a friend.  */
     783                 :        1067 :   if (tree tinfo = get_template_info (scope))
     784                 :             :     {
     785                 :         762 :       tree tmpl = TI_TEMPLATE (tinfo);
     786                 :         762 :       if (DECL_CLASS_TEMPLATE_P (tmpl))
     787                 :         479 :         tmpl = TREE_TYPE (tmpl);
     788                 :             :       else
     789                 :         283 :         tmpl = DECL_TEMPLATE_RESULT (tmpl);
     790                 :         762 :       if (tmpl != scope)
     791                 :             :         {
     792                 :             :           /* Increment processing_template_decl to make sure that
     793                 :             :              dependent_type_p works correctly.  */
     794                 :         598 :           ++processing_template_decl;
     795                 :         598 :           int ret = friend_accessible_p (tmpl, decl, type, otype);
     796                 :         598 :           --processing_template_decl;
     797                 :         598 :           if (ret)
     798                 :             :             return 1;
     799                 :             :         }
     800                 :             :     }
     801                 :             : 
     802                 :             :   /* If is_friend is true, we should have found a befriending class.  */
     803                 :         513 :   gcc_checking_assert (!is_friend (type, scope));
     804                 :             : 
     805                 :             :   return 0;
     806                 :             : }
     807                 :             : 
     808                 :             : struct dfs_accessible_data
     809                 :             : {
     810                 :             :   tree decl;
     811                 :             :   tree object_type;
     812                 :             : };
     813                 :             : 
     814                 :             : /* Avoid walking up past a declaration of the member.  */
     815                 :             : 
     816                 :             : static tree
     817                 :    41328486 : dfs_accessible_pre (tree binfo, void *data)
     818                 :             : {
     819                 :    41328486 :   dfs_accessible_data *d = (dfs_accessible_data *)data;
     820                 :    41328486 :   tree type = BINFO_TYPE (binfo);
     821                 :    41328486 :   if (member_declared_in_type (d->decl, type))
     822                 :    37447252 :     return dfs_skip_bases;
     823                 :             :   return NULL_TREE;
     824                 :             : }
     825                 :             : 
     826                 :             : /* Called via dfs_walk_once_accessible from accessible_p */
     827                 :             : 
     828                 :             : static tree
     829                 :    38013714 : dfs_accessible_post (tree binfo, void *data)
     830                 :             : {
     831                 :             :   /* access_in_type already set BINFO_ACCESS for us.  */
     832                 :    38013714 :   access_kind access = BINFO_ACCESS (binfo);
     833                 :    38013714 :   tree N = BINFO_TYPE (binfo);
     834                 :    38013714 :   dfs_accessible_data *d = (dfs_accessible_data *)data;
     835                 :    38013714 :   tree decl = d->decl;
     836                 :    38013714 :   tree scope = current_nonlambda_scope ();
     837                 :             : 
     838                 :             :   /* A member m is accessible at the point R when named in class N if */
     839                 :    38013714 :   switch (access)
     840                 :             :     {
     841                 :             :     case ak_none:
     842                 :             :       return NULL_TREE;
     843                 :             : 
     844                 :             :     case ak_public:
     845                 :             :       /* m as a member of N is public, or */
     846                 :             :       return binfo;
     847                 :             : 
     848                 :    28241288 :     case ak_private:
     849                 :    28241288 :       {
     850                 :             :         /* m as a member of N is private, and R occurs in a member or friend of
     851                 :             :            class N, or */
     852                 :    28241288 :         if (scope && TREE_CODE (scope) != NAMESPACE_DECL
     853                 :    56482246 :             && is_friend (N, scope))
     854                 :             :           return binfo;
     855                 :             :         return NULL_TREE;
     856                 :             :       }
     857                 :             : 
     858                 :     8010737 :     case ak_protected:
     859                 :     8010737 :       {
     860                 :             :         /* m as a member of N is protected, and R occurs in a member or friend
     861                 :             :            of class N, or in a member or friend of a class P derived from N,
     862                 :             :            where m as a member of P is public, private, or protected  */
     863                 :     8010737 :         if (friend_accessible_p (scope, decl, N, d->object_type))
     864                 :             :           return binfo;
     865                 :             :         return NULL_TREE;
     866                 :             :       }
     867                 :             : 
     868                 :             :     default:
     869                 :             :       gcc_unreachable ();
     870                 :             :     }
     871                 :             : }
     872                 :             : 
     873                 :             : /* Like accessible_p below, but within a template returns true iff DECL is
     874                 :             :    accessible in TYPE to all possible instantiations of the template.  */
     875                 :             : 
     876                 :             : int
     877                 :     5100016 : accessible_in_template_p (tree type, tree decl)
     878                 :             : {
     879                 :     5100016 :   int save_ptd = processing_template_decl;
     880                 :     5100016 :   processing_template_decl = 0;
     881                 :     5100016 :   int val = accessible_p (type, decl, false);
     882                 :     5100016 :   processing_template_decl = save_ptd;
     883                 :     5100016 :   return val;
     884                 :             : }
     885                 :             : 
     886                 :             : /* DECL is a declaration from a base class of TYPE, which was the
     887                 :             :    class used to name DECL.  Return nonzero if, in the current
     888                 :             :    context, DECL is accessible.  If TYPE is actually a BINFO node,
     889                 :             :    then we can tell in what context the access is occurring by looking
     890                 :             :    at the most derived class along the path indicated by BINFO.  If
     891                 :             :    CONSIDER_LOCAL is true, do consider special access the current
     892                 :             :    scope or friendship thereof we might have.  */
     893                 :             : 
     894                 :             : int
     895                 :   270269694 : accessible_p (tree type, tree decl, bool consider_local_p)
     896                 :             : {
     897                 :   270269694 :   tree binfo;
     898                 :   270269694 :   access_kind access;
     899                 :             : 
     900                 :             :   /* If this declaration is in a block or namespace scope, there's no
     901                 :             :      access control.  */
     902                 :   270269694 :   if (!TYPE_P (context_for_name_lookup (decl)))
     903                 :             :     return 1;
     904                 :             : 
     905                 :             :   /* There is no need to perform access checks inside a thunk.  */
     906                 :   270269639 :   if (current_function_decl && DECL_THUNK_P (current_function_decl))
     907                 :             :     return 1;
     908                 :             : 
     909                 :   270269639 :   tree otype = NULL_TREE;
     910                 :   270269639 :   if (!TYPE_P (type))
     911                 :             :     {
     912                 :             :       /* When accessing a non-static member, the most derived type in the
     913                 :             :          binfo chain is the type of the object; remember that type for
     914                 :             :          protected_accessible_p.  */
     915                 :   530588643 :       for (tree b = type; b; b = BINFO_INHERITANCE_CHAIN (b))
     916                 :   273387074 :         otype = BINFO_TYPE (b);
     917                 :   257201569 :       type = BINFO_TYPE (type);
     918                 :             :     }
     919                 :             :   else
     920                 :             :     otype = type;
     921                 :             : 
     922                 :             :   /* Anonymous unions don't have their own access.  */
     923                 :   270269639 :   if (ANON_AGGR_TYPE_P (type))
     924                 :           3 :     type = type_context_for_name_lookup (type);
     925                 :             : 
     926                 :             :   /* [class.access.base]
     927                 :             : 
     928                 :             :      A member m is accessible when named in class N if
     929                 :             : 
     930                 :             :      --m as a member of N is public, or
     931                 :             : 
     932                 :             :      --m as a member of N is private, and the reference occurs in a
     933                 :             :        member or friend of class N, or
     934                 :             : 
     935                 :             :      --m as a member of N is protected, and the reference occurs in a
     936                 :             :        member or friend of class N, or in a member or friend of a
     937                 :             :        class P derived from N, where m as a member of P is public, private or
     938                 :             :        protected, or
     939                 :             : 
     940                 :             :      --there exists a base class B of N that is accessible at the point
     941                 :             :        of reference, and m is accessible when named in class B.
     942                 :             : 
     943                 :             :     We walk the base class hierarchy, checking these conditions.  */
     944                 :             : 
     945                 :             :   /* We walk using TYPE_BINFO (type) because access_in_type will set
     946                 :             :      BINFO_ACCESS on it and its bases.  */
     947                 :   270269639 :   binfo = TYPE_BINFO (type);
     948                 :             : 
     949                 :             :   /* Compute the accessibility of DECL in the class hierarchy
     950                 :             :      dominated by type.  */
     951                 :   270269639 :   access = access_in_type (type, decl);
     952                 :   270269639 :   if (access == ak_public)
     953                 :             :     return 1;
     954                 :             : 
     955                 :             :   /* If we aren't considering the point of reference, only the first bullet
     956                 :             :      applies.  */
     957                 :    37448773 :   if (!consider_local_p)
     958                 :             :     return 0;
     959                 :             : 
     960                 :    37448391 :   dfs_accessible_data d = { decl, otype };
     961                 :             : 
     962                 :             :   /* Walk the hierarchy again, looking for a base class that allows
     963                 :             :      access.  */
     964                 :    37448391 :   return dfs_walk_once_accessible (binfo, /*friends=*/true,
     965                 :             :                                    dfs_accessible_pre,
     966                 :             :                                    dfs_accessible_post, &d)
     967                 :    37448391 :     != NULL_TREE;
     968                 :             : }
     969                 :             : 
     970                 :             : struct lookup_field_info {
     971                 :             :   /* The type in which we're looking.  */
     972                 :             :   tree type;
     973                 :             :   /* The name of the field for which we're looking.  */
     974                 :             :   tree name;
     975                 :             :   /* If non-NULL, the current result of the lookup.  */
     976                 :             :   tree rval;
     977                 :             :   /* The path to RVAL.  */
     978                 :             :   tree rval_binfo;
     979                 :             :   /* If non-NULL, the lookup was ambiguous, and this is a list of the
     980                 :             :      candidates.  */
     981                 :             :   tree ambiguous;
     982                 :             :   /* If nonzero, we are looking for types, not data members.  */
     983                 :             :   int want_type;
     984                 :             : };
     985                 :             : 
     986                 :             : /* True for a class member means that it is shared between all objects
     987                 :             :    of that class.
     988                 :             : 
     989                 :             :    [class.member.lookup]:If the resulting set of declarations are not all
     990                 :             :    from sub-objects of the same type, or the set has a non-static member
     991                 :             :    and  includes members from distinct sub-objects, there is an ambiguity
     992                 :             :    and the program is ill-formed.
     993                 :             : 
     994                 :             :    This function checks that T contains no non-static members.  */
     995                 :             : 
     996                 :             : bool
     997                 :    40146866 : shared_member_p (tree t)
     998                 :             : {
     999                 :    40146866 :   if (VAR_P (t) || TREE_CODE (t) == TYPE_DECL
    1000                 :    37297039 :       || TREE_CODE (t) == CONST_DECL)
    1001                 :             :     return true;
    1002                 :    37293639 :   if (is_overloaded_fn (t))
    1003                 :             :     {
    1004                 :    64049488 :       for (ovl_iterator iter (get_fns (t)); iter; ++iter)
    1005                 :             :         {
    1006                 :    40726088 :           tree decl = strip_using_decl (*iter);
    1007                 :    40726088 :           if (TREE_CODE (decl) == USING_DECL)
    1008                 :             :             /* Conservatively assume a dependent using-declaration
    1009                 :             :                might resolve to a non-static member.  */
    1010                 :    23399228 :             return false;
    1011                 :    40726084 :           if (DECL_OBJECT_MEMBER_FUNCTION_P (decl))
    1012                 :             :             return false;
    1013                 :             :         }
    1014                 :    13894043 :       return true;
    1015                 :             :     }
    1016                 :             :   return false;
    1017                 :             : }
    1018                 :             : 
    1019                 :             : /* Routine to see if the sub-object denoted by the binfo PARENT can be
    1020                 :             :    found as a base class and sub-object of the object denoted by
    1021                 :             :    BINFO.  */
    1022                 :             : 
    1023                 :             : static int
    1024                 :     6636908 : is_subobject_of_p (tree parent, tree binfo)
    1025                 :             : {
    1026                 :     6636908 :   tree probe;
    1027                 :             : 
    1028                 :    18384663 :   for (probe = parent; probe; probe = BINFO_INHERITANCE_CHAIN (probe))
    1029                 :             :     {
    1030                 :    13427811 :       if (probe == binfo)
    1031                 :             :         return 1;
    1032                 :    13388604 :       if (BINFO_VIRTUAL_P (probe))
    1033                 :     1640849 :         return (binfo_for_vbase (BINFO_TYPE (probe), BINFO_TYPE (binfo))
    1034                 :     1640849 :                 != NULL_TREE);
    1035                 :             :     }
    1036                 :             :   return 0;
    1037                 :             : }
    1038                 :             : 
    1039                 :             : /* DATA is really a struct lookup_field_info.  Look for a field with
    1040                 :             :    the name indicated there in BINFO.  If this function returns a
    1041                 :             :    non-NULL value it is the result of the lookup.  Called from
    1042                 :             :    lookup_field via breadth_first_search.  */
    1043                 :             : 
    1044                 :             : static tree
    1045                 :  5510999522 : lookup_field_r (tree binfo, void *data)
    1046                 :             : {
    1047                 :  5510999522 :   struct lookup_field_info *lfi = (struct lookup_field_info *) data;
    1048                 :  5510999522 :   tree type = BINFO_TYPE (binfo);
    1049                 :  5510999522 :   tree nval = NULL_TREE;
    1050                 :             : 
    1051                 :             :   /* If this is a dependent base, don't look in it.  */
    1052                 :  5510999522 :   if (BINFO_DEPENDENT_BASE_P (binfo))
    1053                 :             :     return NULL_TREE;
    1054                 :             : 
    1055                 :             :   /* If this base class is hidden by the best-known value so far, we
    1056                 :             :      don't need to look.  */
    1057                 :    77239807 :   if (lfi->rval_binfo && BINFO_INHERITANCE_CHAIN (binfo) == lfi->rval_binfo
    1058                 :  4398842594 :       && !BINFO_VIRTUAL_P (binfo))
    1059                 :             :     return dfs_skip_bases;
    1060                 :             : 
    1061                 :  4282181099 :   nval = get_class_binding (type, lfi->name, lfi->want_type);
    1062                 :             : 
    1063                 :             :   /* If there is no declaration with the indicated name in this type,
    1064                 :             :      then there's nothing to do.  */
    1065                 :  4282181099 :   if (!nval)
    1066                 :  3781658251 :     goto done;
    1067                 :             : 
    1068                 :             :   /* If the lookup already found a match, and the new value doesn't
    1069                 :             :      hide the old one, we might have an ambiguity.  */
    1070                 :   500522848 :   if (lfi->rval_binfo
    1071                 :   500522848 :       && !is_subobject_of_p (lfi->rval_binfo, binfo))
    1072                 :             : 
    1073                 :             :     {
    1074                 :     3298963 :       if (nval == lfi->rval && shared_member_p (nval))
    1075                 :             :         /* The two things are really the same.  */
    1076                 :             :         ;
    1077                 :     3298695 :       else if (is_subobject_of_p (binfo, lfi->rval_binfo))
    1078                 :             :         /* The previous value hides the new one.  */
    1079                 :             :         ;
    1080                 :             :       else
    1081                 :             :         {
    1082                 :             :           /* We have a real ambiguity.  We keep a chain of all the
    1083                 :             :              candidates.  */
    1084                 :     1702138 :           if (!lfi->ambiguous && lfi->rval)
    1085                 :             :             {
    1086                 :             :               /* This is the first time we noticed an ambiguity.  Add
    1087                 :             :                  what we previously thought was a reasonable candidate
    1088                 :             :                  to the list.  */
    1089                 :      882571 :               lfi->ambiguous = tree_cons (NULL_TREE, lfi->rval, NULL_TREE);
    1090                 :      882571 :               TREE_TYPE (lfi->ambiguous) = error_mark_node;
    1091                 :             :             }
    1092                 :             : 
    1093                 :             :           /* Add the new value.  */
    1094                 :     1702138 :           if (TREE_CODE (nval) == TREE_LIST)
    1095                 :           6 :             lfi->ambiguous = chainon (nval, lfi->ambiguous);
    1096                 :             :           else
    1097                 :             :             {
    1098                 :     1702132 :               lfi->ambiguous = tree_cons (NULL_TREE, nval, lfi->ambiguous);
    1099                 :     1702132 :               TREE_TYPE (lfi->ambiguous) = error_mark_node;
    1100                 :             :             }
    1101                 :             :         }
    1102                 :             :     }
    1103                 :             :   else
    1104                 :             :     {
    1105                 :   497223885 :       if (TREE_CODE (nval) == TREE_LIST)
    1106                 :             :         {
    1107                 :          97 :           lfi->ambiguous = chainon (nval, lfi->ambiguous);
    1108                 :          97 :           lfi->rval = TREE_VALUE (nval);
    1109                 :             :         }
    1110                 :             :       else
    1111                 :   497223788 :         lfi->rval = nval;
    1112                 :   497223885 :       lfi->rval_binfo = binfo;
    1113                 :             :     }
    1114                 :             : 
    1115                 :  4282181099 :  done:
    1116                 :             :   /* Don't look for constructors or destructors in base classes.  */
    1117                 :  4282181099 :   if (IDENTIFIER_CDTOR_P (lfi->name))
    1118                 :             :     return dfs_skip_bases;
    1119                 :             :   return NULL_TREE;
    1120                 :             : }
    1121                 :             : 
    1122                 :             : /* Return a "baselink" with BASELINK_BINFO, BASELINK_ACCESS_BINFO,
    1123                 :             :    BASELINK_FUNCTIONS, and BASELINK_OPTYPE set to BINFO, ACCESS_BINFO,
    1124                 :             :    FUNCTIONS, and OPTYPE respectively.  */
    1125                 :             : 
    1126                 :             : tree
    1127                 :   164213096 : build_baselink (tree binfo, tree access_binfo, tree functions, tree optype)
    1128                 :             : {
    1129                 :   164213096 :   tree baselink;
    1130                 :             : 
    1131                 :   164213096 :   gcc_assert (OVL_P (functions) || TREE_CODE (functions) == TEMPLATE_ID_EXPR);
    1132                 :   164213096 :   gcc_assert (!optype || TYPE_P (optype));
    1133                 :   164213096 :   gcc_assert (TREE_TYPE (functions));
    1134                 :             : 
    1135                 :   164213096 :   baselink = make_node (BASELINK);
    1136                 :   164213096 :   TREE_TYPE (baselink) = TREE_TYPE (functions);
    1137                 :   164213096 :   BASELINK_BINFO (baselink) = binfo;
    1138                 :   164213096 :   BASELINK_ACCESS_BINFO (baselink) = access_binfo;
    1139                 :   164213096 :   BASELINK_FUNCTIONS (baselink) = functions;
    1140                 :   164213096 :   BASELINK_OPTYPE (baselink) = optype;
    1141                 :             : 
    1142                 :   164213096 :   if (binfo == access_binfo
    1143                 :   319652709 :       && TYPE_BEING_DEFINED (BINFO_TYPE (access_binfo)))
    1144                 :     3567066 :     BASELINK_FUNCTIONS_MAYBE_INCOMPLETE_P (baselink) = true;
    1145                 :             : 
    1146                 :   164213096 :   return baselink;
    1147                 :             : }
    1148                 :             : 
    1149                 :             : /* Look for a member named NAME in an inheritance lattice dominated by
    1150                 :             :    XBASETYPE.  If PROTECT is 0 or two, we do not check access.  If it
    1151                 :             :    is 1, we enforce accessibility.  If PROTECT is zero, then, for an
    1152                 :             :    ambiguous lookup, we return NULL.  If PROTECT is 1, we issue error
    1153                 :             :    messages about inaccessible or ambiguous lookup.  If PROTECT is 2,
    1154                 :             :    we return a TREE_LIST whose TREE_TYPE is error_mark_node and whose
    1155                 :             :    TREE_VALUEs are the list of ambiguous candidates.
    1156                 :             : 
    1157                 :             :    WANT_TYPE is 1 when we should only return TYPE_DECLs.
    1158                 :             : 
    1159                 :             :    If nothing can be found return NULL_TREE and do not issue an error.
    1160                 :             : 
    1161                 :             :    If non-NULL, failure information is written back to AFI.  */
    1162                 :             : 
    1163                 :             : tree
    1164                 :  3623537337 : lookup_member (tree xbasetype, tree name, int protect, bool want_type,
    1165                 :             :                tsubst_flags_t complain, access_failure_info *afi /* = NULL */)
    1166                 :             : {
    1167                 :  3623537337 :   tree rval, rval_binfo = NULL_TREE;
    1168                 :  3623537337 :   tree type = NULL_TREE, basetype_path = NULL_TREE;
    1169                 :  3623537337 :   struct lookup_field_info lfi;
    1170                 :             : 
    1171                 :             :   /* rval_binfo is the binfo associated with the found member, note,
    1172                 :             :      this can be set with useful information, even when rval is not
    1173                 :             :      set, because it must deal with ALL members, not just non-function
    1174                 :             :      members.  It is used for ambiguity checking and the hidden
    1175                 :             :      checks.  Whereas rval is only set if a proper (not hidden)
    1176                 :             :      non-function member is found.  */
    1177                 :             : 
    1178                 :  3623537337 :   if (name == error_mark_node
    1179                 :  3623537337 :       || xbasetype == NULL_TREE
    1180                 :  3623537329 :       || xbasetype == error_mark_node)
    1181                 :             :     return NULL_TREE;
    1182                 :             : 
    1183                 :  3623537329 :   gcc_assert (identifier_p (name));
    1184                 :             : 
    1185                 :  3623537329 :   if (TREE_CODE (xbasetype) == TREE_BINFO)
    1186                 :             :     {
    1187                 :    75987125 :       type = BINFO_TYPE (xbasetype);
    1188                 :    75987125 :       basetype_path = xbasetype;
    1189                 :             :     }
    1190                 :             :   else
    1191                 :             :     {
    1192                 :  3547550204 :       if (!RECORD_OR_UNION_CODE_P (TREE_CODE (xbasetype)))
    1193                 :             :         return NULL_TREE;
    1194                 :             :       type = xbasetype;
    1195                 :  3623537305 :       xbasetype = NULL_TREE;
    1196                 :             :     }
    1197                 :             : 
    1198                 :  3623537305 :   type = complete_type (type);
    1199                 :             : 
    1200                 :             :   /* Make sure we're looking for a member of the current instantiation in the
    1201                 :             :      right partial specialization.  */
    1202                 :  3623537241 :   if (dependent_type_p (type))
    1203                 :  2483875439 :     if (tree t = currently_open_class (type))
    1204                 :  3623537241 :       type = t;
    1205                 :             : 
    1206                 :  3623537241 :   if (!basetype_path)
    1207                 :  3547550116 :     basetype_path = TYPE_BINFO (type);
    1208                 :             : 
    1209                 :  3547550116 :   if (!basetype_path)
    1210                 :             :     return NULL_TREE;
    1211                 :             : 
    1212                 :  3550571418 :   memset (&lfi, 0, sizeof (lfi));
    1213                 :  3550571418 :   lfi.type = type;
    1214                 :  3550571418 :   lfi.name = name;
    1215                 :  3550571418 :   lfi.want_type = want_type;
    1216                 :  3550571418 :   dfs_walk_all (basetype_path, &lookup_field_r, NULL, &lfi);
    1217                 :  3550571418 :   rval = lfi.rval;
    1218                 :  3550571418 :   rval_binfo = lfi.rval_binfo;
    1219                 :  3550571418 :   if (rval_binfo)
    1220                 :   497184635 :     type = BINFO_TYPE (rval_binfo);
    1221                 :             : 
    1222                 :  3550571418 :   if (lfi.ambiguous)
    1223                 :             :     {
    1224                 :      882668 :       if (protect == 0)
    1225                 :             :         return NULL_TREE;
    1226                 :      882650 :       else if (protect == 1)
    1227                 :             :         {
    1228                 :          85 :           if (complain & tf_error)
    1229                 :             :             {
    1230                 :          74 :               error ("request for member %qD is ambiguous", name);
    1231                 :          74 :               print_candidates (lfi.ambiguous);
    1232                 :             :             }
    1233                 :          85 :           return error_mark_node;
    1234                 :             :         }
    1235                 :      882565 :       else if (protect == 2)
    1236                 :             :         return lfi.ambiguous;
    1237                 :             :     }
    1238                 :             : 
    1239                 :  3549688750 :   if (!rval)
    1240                 :             :     return NULL_TREE;
    1241                 :             : 
    1242                 :             :   /* [class.access]
    1243                 :             : 
    1244                 :             :      In the case of overloaded function names, access control is
    1245                 :             :      applied to the function selected by overloaded resolution.  
    1246                 :             : 
    1247                 :             :      We cannot check here, even if RVAL is only a single non-static
    1248                 :             :      member function, since we do not know what the "this" pointer
    1249                 :             :      will be.  For:
    1250                 :             : 
    1251                 :             :         class A { protected: void f(); };
    1252                 :             :         class B : public A { 
    1253                 :             :           void g(A *p) {
    1254                 :             :             f(); // OK
    1255                 :             :             p->f(); // Not OK.
    1256                 :             :           }
    1257                 :             :         };
    1258                 :             : 
    1259                 :             :     only the first call to "f" is valid.  However, if the function is
    1260                 :             :     static, we can check.  */
    1261                 :   496301967 :   if (protect == 1 && !really_overloaded_fn (rval))
    1262                 :             :     {
    1263                 :    79557113 :       tree decl = is_overloaded_fn (rval) ? get_first_fn (rval) : rval;
    1264                 :    79557113 :       decl = strip_using_decl (decl);
    1265                 :             :       /* A dependent USING_DECL will be checked after tsubsting.  */
    1266                 :    79557113 :       if (TREE_CODE (decl) != USING_DECL
    1267                 :    74662402 :           && !DECL_IOBJ_MEMBER_FUNCTION_P (decl)
    1268                 :   115993448 :           && !perform_or_defer_access_check (basetype_path, decl, decl,
    1269                 :             :                                              complain, afi))
    1270                 :          70 :         return error_mark_node;
    1271                 :             :     }
    1272                 :             : 
    1273                 :   496301897 :   if (is_overloaded_fn (rval)
    1274                 :             :       /* Don't use a BASELINK for class-scope deduction guides since
    1275                 :             :          they're not actually member functions.  */
    1276                 :   496301897 :       && !dguide_name_p (name))
    1277                 :   305604646 :     rval = build_baselink (rval_binfo, basetype_path, rval,
    1278                 :   292340451 :                            (IDENTIFIER_CONV_OP_P (name)
    1279                 :      286855 :                            ? TREE_TYPE (name): NULL_TREE));
    1280                 :             :   return rval;
    1281                 :             : }
    1282                 :             : 
    1283                 :             : /* Helper class for lookup_member_fuzzy.  */
    1284                 :             : 
    1285                 :         681 : class lookup_field_fuzzy_info
    1286                 :             : {
    1287                 :             :  public:
    1288                 :         681 :   lookup_field_fuzzy_info (bool want_type_p) :
    1289                 :         681 :     m_want_type_p (want_type_p), m_candidates () {}
    1290                 :             : 
    1291                 :             :   void fuzzy_lookup_field (tree type);
    1292                 :             : 
    1293                 :             :   /* If true, we are looking for types, not data members.  */
    1294                 :             :   bool m_want_type_p;
    1295                 :             :   /* The result: a vec of identifiers.  */
    1296                 :             :   auto_vec<tree> m_candidates;
    1297                 :             : };
    1298                 :             : 
    1299                 :             : /* Locate all fields within TYPE, append them to m_candidates.  */
    1300                 :             : 
    1301                 :             : void
    1302                 :         777 : lookup_field_fuzzy_info::fuzzy_lookup_field (tree type)
    1303                 :             : {
    1304                 :         777 :   if (!CLASS_TYPE_P (type))
    1305                 :             :     return;
    1306                 :             : 
    1307                 :        4135 :   for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
    1308                 :             :     {
    1309                 :        3364 :       if (m_want_type_p && !DECL_DECLARES_TYPE_P (field))
    1310                 :         141 :         continue;
    1311                 :             : 
    1312                 :        3223 :       if (!DECL_NAME (field))
    1313                 :          86 :         continue;
    1314                 :             : 
    1315                 :        3137 :       if (is_lambda_ignored_entity (field))
    1316                 :          36 :         continue;
    1317                 :             : 
    1318                 :             :       /* Ignore special identifiers with space at the end like cdtor or
    1319                 :             :          conversion op identifiers.  */
    1320                 :        3101 :       if (TREE_CODE (DECL_NAME (field)) == IDENTIFIER_NODE)
    1321                 :        3101 :         if (unsigned int len = IDENTIFIER_LENGTH (DECL_NAME (field)))
    1322                 :        3101 :           if (IDENTIFIER_POINTER (DECL_NAME (field))[len - 1] == ' ')
    1323                 :        1528 :             continue;
    1324                 :             : 
    1325                 :        1573 :       m_candidates.safe_push (DECL_NAME (field));
    1326                 :             :     }
    1327                 :             : }
    1328                 :             : 
    1329                 :             : 
    1330                 :             : /* Helper function for lookup_member_fuzzy, called via dfs_walk_all
    1331                 :             :    DATA is really a lookup_field_fuzzy_info.  Look for a field with
    1332                 :             :    the name indicated there in BINFO.  Gathers pertinent identifiers into
    1333                 :             :    m_candidates.  */
    1334                 :             : 
    1335                 :             : static tree
    1336                 :         777 : lookup_field_fuzzy_r (tree binfo, void *data)
    1337                 :             : {
    1338                 :         777 :   lookup_field_fuzzy_info *lffi = (lookup_field_fuzzy_info *) data;
    1339                 :         777 :   tree type = BINFO_TYPE (binfo);
    1340                 :             : 
    1341                 :         777 :   lffi->fuzzy_lookup_field (type);
    1342                 :             : 
    1343                 :         777 :   return NULL_TREE;
    1344                 :             : }
    1345                 :             : 
    1346                 :             : /* Like lookup_member, but try to find the closest match for NAME,
    1347                 :             :    rather than an exact match, and return an identifier (or NULL_TREE).
    1348                 :             :    Do not complain.  */
    1349                 :             : 
    1350                 :             : tree
    1351                 :         681 : lookup_member_fuzzy (tree xbasetype, tree name, bool want_type_p)
    1352                 :             : {
    1353                 :         681 :   tree type = NULL_TREE, basetype_path = NULL_TREE;
    1354                 :         681 :   class lookup_field_fuzzy_info lffi (want_type_p);
    1355                 :             : 
    1356                 :             :   /* rval_binfo is the binfo associated with the found member, note,
    1357                 :             :      this can be set with useful information, even when rval is not
    1358                 :             :      set, because it must deal with ALL members, not just non-function
    1359                 :             :      members.  It is used for ambiguity checking and the hidden
    1360                 :             :      checks.  Whereas rval is only set if a proper (not hidden)
    1361                 :             :      non-function member is found.  */
    1362                 :             : 
    1363                 :         681 :   if (name == error_mark_node
    1364                 :         681 :       || xbasetype == NULL_TREE
    1365                 :         681 :       || xbasetype == error_mark_node)
    1366                 :             :     return NULL_TREE;
    1367                 :             : 
    1368                 :         681 :   gcc_assert (identifier_p (name));
    1369                 :             : 
    1370                 :         681 :   if (TREE_CODE (xbasetype) == TREE_BINFO)
    1371                 :             :     {
    1372                 :           8 :       type = BINFO_TYPE (xbasetype);
    1373                 :           8 :       basetype_path = xbasetype;
    1374                 :             :     }
    1375                 :             :   else
    1376                 :             :     {
    1377                 :         673 :       if (!RECORD_OR_UNION_CODE_P (TREE_CODE (xbasetype)))
    1378                 :             :         return NULL_TREE;
    1379                 :             :       type = xbasetype;
    1380                 :         681 :       xbasetype = NULL_TREE;
    1381                 :             :     }
    1382                 :             : 
    1383                 :         681 :   type = complete_type (type);
    1384                 :             : 
    1385                 :             :   /* Make sure we're looking for a member of the current instantiation in the
    1386                 :             :      right partial specialization.  */
    1387                 :         681 :   if (flag_concepts && dependent_type_p (type))
    1388                 :          39 :     type = currently_open_class (type);
    1389                 :             : 
    1390                 :         681 :   if (!basetype_path)
    1391                 :         673 :     basetype_path = TYPE_BINFO (type);
    1392                 :             : 
    1393                 :         673 :   if (!basetype_path)
    1394                 :             :     return NULL_TREE;
    1395                 :             : 
    1396                 :             :   /* Populate lffi.m_candidates.  */
    1397                 :         673 :   dfs_walk_all (basetype_path, &lookup_field_fuzzy_r, NULL, &lffi);
    1398                 :             : 
    1399                 :         673 :   return find_closest_identifier (name, &lffi.m_candidates);
    1400                 :         681 : }
    1401                 :             : 
    1402                 :             : /* Like lookup_member, except that if we find a function member we
    1403                 :             :    return NULL_TREE.  */
    1404                 :             : 
    1405                 :             : tree
    1406                 :    21203094 : lookup_field (tree xbasetype, tree name, int protect, bool want_type)
    1407                 :             : {
    1408                 :    21203094 :   tree rval = lookup_member (xbasetype, name, protect, want_type,
    1409                 :             :                              tf_warning_or_error);
    1410                 :             : 
    1411                 :             :   /* Ignore functions, but propagate the ambiguity list.  */
    1412                 :    21203094 :   if (!error_operand_p (rval)
    1413                 :    21203094 :       && (rval && BASELINK_P (rval)))
    1414                 :           0 :     return NULL_TREE;
    1415                 :             : 
    1416                 :             :   return rval;
    1417                 :             : }
    1418                 :             : 
    1419                 :             : /* Like lookup_member, except that if we find a non-function member we
    1420                 :             :    return NULL_TREE.  */
    1421                 :             : 
    1422                 :             : tree
    1423                 :    93504522 : lookup_fnfields (tree xbasetype, tree name, int protect,
    1424                 :             :                  tsubst_flags_t complain)
    1425                 :             : {
    1426                 :    93504522 :   tree rval = lookup_member (xbasetype, name, protect, /*want_type=*/false,
    1427                 :             :                              complain);
    1428                 :             : 
    1429                 :             :   /* Ignore non-functions, but propagate the ambiguity list.  */
    1430                 :    93504522 :   if (!error_operand_p (rval)
    1431                 :    93504522 :       && (rval && !BASELINK_P (rval)))
    1432                 :           0 :     return NULL_TREE;
    1433                 :             : 
    1434                 :             :   return rval;
    1435                 :             : }
    1436                 :             : 
    1437                 :             : /* DECL is the result of a qualified name lookup.  QUALIFYING_SCOPE is
    1438                 :             :    the class or namespace used to qualify the name.  CONTEXT_CLASS is
    1439                 :             :    the class corresponding to the object in which DECL will be used.
    1440                 :             :    Return a possibly modified version of DECL that takes into account
    1441                 :             :    the CONTEXT_CLASS.
    1442                 :             : 
    1443                 :             :    In particular, consider an expression like `B::m' in the context of
    1444                 :             :    a derived class `D'.  If `B::m' has been resolved to a BASELINK,
    1445                 :             :    then the most derived class indicated by the BASELINK_BINFO will be
    1446                 :             :    `B', not `D'.  This function makes that adjustment.  */
    1447                 :             : 
    1448                 :             : tree
    1449                 :   119053462 : adjust_result_of_qualified_name_lookup (tree decl,
    1450                 :             :                                         tree qualifying_scope,
    1451                 :             :                                         tree context_class)
    1452                 :             : {
    1453                 :    83145644 :   if (context_class && context_class != error_mark_node
    1454                 :    83145632 :       && CLASS_TYPE_P (context_class)
    1455                 :    83145624 :       && CLASS_TYPE_P (qualifying_scope)
    1456                 :    48838511 :       && DERIVED_FROM_P (qualifying_scope, context_class)
    1457                 :   121886884 :       && BASELINK_P (decl))
    1458                 :             :     {
    1459                 :     2733299 :       tree base;
    1460                 :             : 
    1461                 :             :       /* Look for the QUALIFYING_SCOPE as a base of the CONTEXT_CLASS.
    1462                 :             :          Because we do not yet know which function will be chosen by
    1463                 :             :          overload resolution, we cannot yet check either accessibility
    1464                 :             :          or ambiguity -- in either case, the choice of a static member
    1465                 :             :          function might make the usage valid.  */
    1466                 :     2733299 :       base = lookup_base (context_class, qualifying_scope,
    1467                 :             :                           ba_unique, NULL, tf_none);
    1468                 :     2733299 :       if (base && base != error_mark_node)
    1469                 :             :         {
    1470                 :     2733291 :           BASELINK_ACCESS_BINFO (decl) = base;
    1471                 :     2733291 :           tree decl_binfo
    1472                 :     2733291 :             = lookup_base (base, BINFO_TYPE (BASELINK_BINFO (decl)),
    1473                 :             :                            ba_unique, NULL, tf_none);
    1474                 :     2733291 :           if (decl_binfo && decl_binfo != error_mark_node)
    1475                 :     2733283 :             BASELINK_BINFO (decl) = decl_binfo;
    1476                 :             :         }
    1477                 :             :     }
    1478                 :             : 
    1479                 :   119053462 :   if (BASELINK_P (decl))
    1480                 :    16686173 :     BASELINK_QUALIFIED_P (decl) = true;
    1481                 :             : 
    1482                 :   119053462 :   return decl;
    1483                 :             : }
    1484                 :             : 
    1485                 :             : 
    1486                 :             : /* Walk the class hierarchy within BINFO, in a depth-first traversal.
    1487                 :             :    PRE_FN is called in preorder, while POST_FN is called in postorder.
    1488                 :             :    If PRE_FN returns DFS_SKIP_BASES, child binfos will not be
    1489                 :             :    walked.  If PRE_FN or POST_FN returns a different non-NULL value,
    1490                 :             :    that value is immediately returned and the walk is terminated.  One
    1491                 :             :    of PRE_FN and POST_FN can be NULL.  At each node, PRE_FN and
    1492                 :             :    POST_FN are passed the binfo to examine and the caller's DATA
    1493                 :             :    value.  All paths are walked, thus virtual and morally virtual
    1494                 :             :    binfos can be multiply walked.  */
    1495                 :             : 
    1496                 :             : tree
    1497                 :  6668254771 : dfs_walk_all (tree binfo, tree (*pre_fn) (tree, void *),
    1498                 :             :               tree (*post_fn) (tree, void *), void *data)
    1499                 :             : {
    1500                 :  6668254771 :   tree rval;
    1501                 :  6668254771 :   unsigned ix;
    1502                 :  6668254771 :   tree base_binfo;
    1503                 :             : 
    1504                 :             :   /* Call the pre-order walking function.  */
    1505                 :  6668254771 :   if (pre_fn)
    1506                 :             :     {
    1507                 :  6664056090 :       rval = pre_fn (binfo, data);
    1508                 :  6664056090 :       if (rval)
    1509                 :             :         {
    1510                 :   867422538 :           if (rval == dfs_skip_bases)
    1511                 :   521551318 :             goto skip_bases;
    1512                 :             :           return rval;
    1513                 :             :         }
    1514                 :             :     }
    1515                 :             : 
    1516                 :             :   /* Find the next child binfo to walk.  */
    1517                 :  7950071824 :   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
    1518                 :             :     {
    1519                 :  2220502250 :       rval = dfs_walk_all (base_binfo, pre_fn, post_fn, data);
    1520                 :  2220502250 :       if (rval)
    1521                 :    71262659 :         return rval;
    1522                 :             :     }
    1523                 :             : 
    1524                 :  6251120892 :  skip_bases:
    1525                 :             :   /* Call the post-order walking function.  */
    1526                 :  6251120892 :   if (post_fn)
    1527                 :             :     {
    1528                 :   356468061 :       rval = post_fn (binfo, data);
    1529                 :   356468061 :       gcc_assert (rval != dfs_skip_bases);
    1530                 :             :       return rval;
    1531                 :             :     }
    1532                 :             : 
    1533                 :             :   return NULL_TREE;
    1534                 :             : }
    1535                 :             : 
    1536                 :             : /* Worker for dfs_walk_once.  This behaves as dfs_walk_all, except
    1537                 :             :    that binfos are walked at most once.  */
    1538                 :             : 
    1539                 :             : static tree
    1540                 :     2640352 : dfs_walk_once_r (tree binfo, tree (*pre_fn) (tree, void *),
    1541                 :             :                  tree (*post_fn) (tree, void *), hash_set<tree> *pset,
    1542                 :             :                  void *data)
    1543                 :             : {
    1544                 :     2640352 :   tree rval;
    1545                 :     2640352 :   unsigned ix;
    1546                 :     2640352 :   tree base_binfo;
    1547                 :             : 
    1548                 :             :   /* Call the pre-order walking function.  */
    1549                 :     2640352 :   if (pre_fn)
    1550                 :             :     {
    1551                 :     2306646 :       rval = pre_fn (binfo, data);
    1552                 :     2306646 :       if (rval)
    1553                 :             :         {
    1554                 :      525181 :           if (rval == dfs_skip_bases)
    1555                 :      141858 :             goto skip_bases;
    1556                 :             : 
    1557                 :             :           return rval;
    1558                 :             :         }
    1559                 :             :     }
    1560                 :             : 
    1561                 :             :   /* Find the next child binfo to walk.  */
    1562                 :     3933101 :   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
    1563                 :             :     {
    1564                 :     2301491 :       if (BINFO_VIRTUAL_P (base_binfo))
    1565                 :      915187 :         if (pset->add (base_binfo))
    1566                 :      395139 :           continue;
    1567                 :             : 
    1568                 :     1906352 :       rval = dfs_walk_once_r (base_binfo, pre_fn, post_fn, pset, data);
    1569                 :     1906352 :       if (rval)
    1570                 :      483561 :         return rval;
    1571                 :             :     }
    1572                 :             : 
    1573                 :     1773468 :  skip_bases:
    1574                 :             :   /* Call the post-order walking function.  */
    1575                 :     1773468 :   if (post_fn)
    1576                 :             :     {
    1577                 :      492793 :       rval = post_fn (binfo, data);
    1578                 :      492793 :       gcc_assert (rval != dfs_skip_bases);
    1579                 :             :       return rval;
    1580                 :             :     }
    1581                 :             : 
    1582                 :             :   return NULL_TREE;
    1583                 :             : }
    1584                 :             : 
    1585                 :             : /* Like dfs_walk_all, except that binfos are not multiply walked.  For
    1586                 :             :    non-diamond shaped hierarchies this is the same as dfs_walk_all.
    1587                 :             :    For diamond shaped hierarchies we must mark the virtual bases, to
    1588                 :             :    avoid multiple walks.  */
    1589                 :             : 
    1590                 :             : tree
    1591                 :   889171144 : dfs_walk_once (tree binfo, tree (*pre_fn) (tree, void *),
    1592                 :             :                tree (*post_fn) (tree, void *), void *data)
    1593                 :             : {
    1594                 :   889171144 :   static int active = 0;  /* We must not be called recursively. */
    1595                 :   889171144 :   tree rval;
    1596                 :             : 
    1597                 :   889171144 :   gcc_assert (pre_fn || post_fn);
    1598                 :   889171144 :   gcc_assert (!active);
    1599                 :   889171144 :   active++;
    1600                 :             : 
    1601                 :   889171144 :   if (!CLASSTYPE_DIAMOND_SHAPED_P (BINFO_TYPE (binfo)))
    1602                 :             :     /* We are not diamond shaped, and therefore cannot encounter the
    1603                 :             :        same binfo twice.  */
    1604                 :   888437144 :     rval = dfs_walk_all (binfo, pre_fn, post_fn, data);
    1605                 :             :   else
    1606                 :             :     {
    1607                 :      734000 :       hash_set<tree> pset;
    1608                 :      734000 :       rval = dfs_walk_once_r (binfo, pre_fn, post_fn, &pset, data);
    1609                 :      734000 :     }
    1610                 :             : 
    1611                 :   889171144 :   active--;
    1612                 :             : 
    1613                 :   889171144 :   return rval;
    1614                 :             : }
    1615                 :             : 
    1616                 :             : /* Worker function for dfs_walk_once_accessible.  Behaves like
    1617                 :             :    dfs_walk_once_r, except (a) FRIENDS_P is true if special
    1618                 :             :    access given by the current context should be considered, (b) ONCE
    1619                 :             :    indicates whether bases should be marked during traversal.  */
    1620                 :             : 
    1621                 :             : static tree
    1622                 :    41343735 : dfs_walk_once_accessible_r (tree binfo, bool friends_p, hash_set<tree> *pset,
    1623                 :             :                             tree (*pre_fn) (tree, void *),
    1624                 :             :                             tree (*post_fn) (tree, void *), void *data)
    1625                 :             : {
    1626                 :    41343735 :   tree rval = NULL_TREE;
    1627                 :    41343735 :   unsigned ix;
    1628                 :    41343735 :   tree base_binfo;
    1629                 :             : 
    1630                 :             :   /* Call the pre-order walking function.  */
    1631                 :    41343735 :   if (pre_fn)
    1632                 :             :     {
    1633                 :    41343735 :       rval = pre_fn (binfo, data);
    1634                 :    41343735 :       if (rval)
    1635                 :             :         {
    1636                 :    37454284 :           if (rval == dfs_skip_bases)
    1637                 :    37447324 :             goto skip_bases;
    1638                 :             : 
    1639                 :             :           return rval;
    1640                 :             :         }
    1641                 :             :     }
    1642                 :             : 
    1643                 :             :   /* Find the next child binfo to walk.  */
    1644                 :     4482906 :   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
    1645                 :             :     {
    1646                 :     3915505 :       bool mark = pset && BINFO_VIRTUAL_P (base_binfo);
    1647                 :             : 
    1648                 :       10202 :       if (mark && pset->contains (base_binfo))
    1649                 :           0 :         continue;
    1650                 :             : 
    1651                 :             :       /* If the base is inherited via private or protected
    1652                 :             :          inheritance, then we can't see it, unless we are a friend of
    1653                 :             :          the current binfo.  */
    1654                 :     3915505 :       if (BINFO_BASE_ACCESS (binfo, ix) != access_public_node)
    1655                 :             :         {
    1656                 :     1704344 :           tree scope;
    1657                 :     1704344 :           if (!friends_p)
    1658                 :         169 :             continue;
    1659                 :     1704175 :           scope = current_scope ();
    1660                 :     1731695 :           if (!scope
    1661                 :     1704175 :               || TREE_CODE (scope) == NAMESPACE_DECL
    1662                 :     3408242 :               || !is_friend (BINFO_TYPE (binfo), scope))
    1663                 :       27520 :             continue;
    1664                 :             :         }
    1665                 :             : 
    1666                 :     3887816 :       if (mark)
    1667                 :         398 :         pset->add (base_binfo);
    1668                 :             : 
    1669                 :     3887816 :       rval = dfs_walk_once_accessible_r (base_binfo, friends_p, pset,
    1670                 :             :                                          pre_fn, post_fn, data);
    1671                 :     3887816 :       if (rval)
    1672                 :     3322050 :         return rval;
    1673                 :             :     }
    1674                 :             : 
    1675                 :    38014725 :  skip_bases:
    1676                 :             :   /* Call the post-order walking function.  */
    1677                 :    38014725 :   if (post_fn)
    1678                 :             :     {
    1679                 :    38014399 :       rval = post_fn (binfo, data);
    1680                 :    38014399 :       gcc_assert (rval != dfs_skip_bases);
    1681                 :             :       return rval;
    1682                 :             :     }
    1683                 :             : 
    1684                 :             :   return NULL_TREE;
    1685                 :             : }
    1686                 :             : 
    1687                 :             : /* Like dfs_walk_once except that only accessible bases are walked.
    1688                 :             :    FRIENDS_P indicates whether friendship of the local context
    1689                 :             :    should be considered when determining accessibility.  */
    1690                 :             : 
    1691                 :             : static tree
    1692                 :    37455919 : dfs_walk_once_accessible (tree binfo, bool friends_p,
    1693                 :             :                             tree (*pre_fn) (tree, void *),
    1694                 :             :                             tree (*post_fn) (tree, void *), void *data)
    1695                 :             : {
    1696                 :    37455919 :   hash_set<tree> *pset = NULL;
    1697                 :    37455919 :   if (CLASSTYPE_DIAMOND_SHAPED_P (BINFO_TYPE (binfo)))
    1698                 :        1921 :     pset = new hash_set<tree>;
    1699                 :    37455919 :   tree rval = dfs_walk_once_accessible_r (binfo, friends_p, pset,
    1700                 :             :                                           pre_fn, post_fn, data);
    1701                 :             : 
    1702                 :    37455919 :   if (pset)
    1703                 :        1921 :     delete pset;
    1704                 :    37455919 :   return rval;
    1705                 :             : }
    1706                 :             : 
    1707                 :             : /* Return true iff the code of T is CODE, and it has compatible
    1708                 :             :    type with TYPE.  */
    1709                 :             : 
    1710                 :             : static bool
    1711                 :         448 : matches_code_and_type_p (tree t, enum tree_code code, tree type)
    1712                 :             : {
    1713                 :         448 :   if (TREE_CODE (t) != code)
    1714                 :             :     return false;
    1715                 :         434 :   if (!cxx_types_compatible_p (TREE_TYPE (t), type))
    1716                 :             :     return false;
    1717                 :             :   return true;
    1718                 :             : }
    1719                 :             : 
    1720                 :             : /* Subroutine of direct_accessor_p and reference_accessor_p.
    1721                 :             :    Determine if COMPONENT_REF is a simple field lookup of this->FIELD_DECL.
    1722                 :             :    We expect a tree of the form:
    1723                 :             :              <component_ref:
    1724                 :             :                <indirect_ref:S>
    1725                 :             :                  <nop_expr:P*
    1726                 :             :                    <parm_decl (this)>
    1727                 :             :                  <field_decl (FIELD_DECL)>>>.  */
    1728                 :             : 
    1729                 :             : static bool
    1730                 :         203 : field_access_p (tree component_ref, tree field_decl, tree field_type)
    1731                 :             : {
    1732                 :         203 :   if (!matches_code_and_type_p (component_ref, COMPONENT_REF, field_type))
    1733                 :             :     return false;
    1734                 :             : 
    1735                 :         189 :   tree indirect_ref = TREE_OPERAND (component_ref, 0);
    1736                 :         189 :   if (!INDIRECT_REF_P (indirect_ref))
    1737                 :             :     return false;
    1738                 :             : 
    1739                 :         189 :   tree ptr = STRIP_NOPS (TREE_OPERAND (indirect_ref, 0));
    1740                 :         189 :   if (!is_object_parameter (ptr))
    1741                 :             :     return false;
    1742                 :             : 
    1743                 :             :   /* Must access the correct field.  */
    1744                 :         189 :   if (TREE_OPERAND (component_ref, 1) != field_decl)
    1745                 :             :     return false;
    1746                 :             :   return true;
    1747                 :             : }
    1748                 :             : 
    1749                 :             : /* Subroutine of field_accessor_p.
    1750                 :             : 
    1751                 :             :    Assuming that INIT_EXPR has already had its code and type checked,
    1752                 :             :    determine if it is a simple accessor for FIELD_DECL
    1753                 :             :    (of type FIELD_TYPE).
    1754                 :             : 
    1755                 :             :    Specifically, a simple accessor within struct S of the form:
    1756                 :             :        T get_field () { return m_field; }
    1757                 :             :    should have a constexpr_fn_retval (saved_tree) of the form:
    1758                 :             :          <init_expr:T
    1759                 :             :            <result_decl:T
    1760                 :             :            <nop_expr:T
    1761                 :             :              <component_ref:
    1762                 :             :                <indirect_ref:S>
    1763                 :             :                  <nop_expr:P*
    1764                 :             :                    <parm_decl (this)>
    1765                 :             :                  <field_decl (FIELD_DECL)>>>>>.  */
    1766                 :             : 
    1767                 :             : static bool
    1768                 :         161 : direct_accessor_p (tree init_expr, tree field_decl, tree field_type)
    1769                 :             : {
    1770                 :         161 :   tree result_decl = TREE_OPERAND (init_expr, 0);
    1771                 :         161 :   if (!matches_code_and_type_p (result_decl, RESULT_DECL, field_type))
    1772                 :             :     return false;
    1773                 :             : 
    1774                 :         161 :   tree component_ref = STRIP_NOPS (TREE_OPERAND (init_expr, 1));
    1775                 :         161 :   if (!field_access_p (component_ref, field_decl, field_type))
    1776                 :             :     return false;
    1777                 :             : 
    1778                 :             :   return true;
    1779                 :             : }
    1780                 :             : 
    1781                 :             : /* Subroutine of field_accessor_p.
    1782                 :             : 
    1783                 :             :    Assuming that INIT_EXPR has already had its code and type checked,
    1784                 :             :    determine if it is a "reference" accessor for FIELD_DECL
    1785                 :             :    (of type FIELD_REFERENCE_TYPE).
    1786                 :             : 
    1787                 :             :    Specifically, a simple accessor within struct S of the form:
    1788                 :             :        T& get_field () { return m_field; }
    1789                 :             :    should have a constexpr_fn_retval (saved_tree) of the form:
    1790                 :             :          <init_expr:T&
    1791                 :             :            <result_decl:T&
    1792                 :             :            <nop_expr: T&
    1793                 :             :              <addr_expr: T*
    1794                 :             :                <component_ref:T
    1795                 :             :                  <indirect_ref:S
    1796                 :             :                    <nop_expr
    1797                 :             :                      <parm_decl (this)>>
    1798                 :             :                    <field (FIELD_DECL)>>>>>>.  */
    1799                 :             : static bool
    1800                 :          42 : reference_accessor_p (tree init_expr, tree field_decl, tree field_type,
    1801                 :             :                       tree field_reference_type)
    1802                 :             : {
    1803                 :          42 :   tree result_decl = TREE_OPERAND (init_expr, 0);
    1804                 :          42 :   if (!matches_code_and_type_p (result_decl, RESULT_DECL, field_reference_type))
    1805                 :             :     return false;
    1806                 :             : 
    1807                 :          42 :   tree field_pointer_type = build_pointer_type (field_type);
    1808                 :          42 :   tree addr_expr = STRIP_NOPS (TREE_OPERAND (init_expr, 1));
    1809                 :          42 :   if (!matches_code_and_type_p (addr_expr, ADDR_EXPR, field_pointer_type))
    1810                 :             :     return false;
    1811                 :             : 
    1812                 :          42 :   tree component_ref = STRIP_NOPS (TREE_OPERAND (addr_expr, 0));
    1813                 :             : 
    1814                 :          42 :   if (!field_access_p (component_ref, field_decl, field_type))
    1815                 :             :     return false;
    1816                 :             : 
    1817                 :             :   return true;
    1818                 :             : }
    1819                 :             : 
    1820                 :             : /* Return the class of the `this' or explicit object parameter of FN.  */
    1821                 :             : 
    1822                 :             : static tree
    1823                 :          49 : class_of_object_parm (const_tree fn)
    1824                 :             : {
    1825                 :          49 :   tree fntype = TREE_TYPE (fn);
    1826                 :          49 :   if (DECL_XOBJ_MEMBER_FUNCTION_P (fn))
    1827                 :           0 :     return non_reference (TREE_VALUE (TYPE_ARG_TYPES (fntype)));
    1828                 :          49 :   return class_of_this_parm (fntype);
    1829                 :             : }
    1830                 :             : 
    1831                 :             : /* Return true if FN is an accessor method for FIELD_DECL.
    1832                 :             :    i.e. a method of the form { return FIELD; }, with no
    1833                 :             :    conversions.
    1834                 :             : 
    1835                 :             :    If CONST_P, then additionally require that FN be a const
    1836                 :             :    method.  */
    1837                 :             : 
    1838                 :             : static bool
    1839                 :        3031 : field_accessor_p (tree fn, tree field_decl, bool const_p)
    1840                 :             : {
    1841                 :        3031 :   if (TREE_CODE (fn) != FUNCTION_DECL)
    1842                 :             :     return false;
    1843                 :             : 
    1844                 :             :   /* We don't yet support looking up static data, just fields.  */
    1845                 :         770 :   if (TREE_CODE (field_decl) != FIELD_DECL)
    1846                 :             :     return false;
    1847                 :             : 
    1848                 :         757 :   if (!DECL_OBJECT_MEMBER_FUNCTION_P (fn))
    1849                 :             :     return false;
    1850                 :             : 
    1851                 :             :   /* If the field is accessed via a const "this" argument, verify
    1852                 :             :      that the "this" parameter is const.  */
    1853                 :         757 :   if (const_p)
    1854                 :             :     {
    1855                 :          49 :       tree this_class = class_of_object_parm (fn);
    1856                 :          49 :       if (!TYPE_READONLY (this_class))
    1857                 :             :         return false;
    1858                 :             :     }
    1859                 :             : 
    1860                 :         729 :   tree saved_tree = DECL_SAVED_TREE (fn);
    1861                 :             : 
    1862                 :         729 :   if (saved_tree == NULL_TREE)
    1863                 :             :     return false;
    1864                 :             : 
    1865                 :             :   /* Attempt to extract a single return value from the function,
    1866                 :             :      if it has one.  */
    1867                 :         228 :   tree retval = constexpr_fn_retval (saved_tree);
    1868                 :         228 :   if (retval == NULL_TREE || retval == error_mark_node)
    1869                 :             :     return false;
    1870                 :             :   /* Require an INIT_EXPR.  */
    1871                 :         203 :   if (TREE_CODE (retval) != INIT_EXPR)
    1872                 :             :     return false;
    1873                 :         203 :   tree init_expr = retval;
    1874                 :             : 
    1875                 :             :   /* Determine if this is a simple accessor within struct S of the form:
    1876                 :             :        T get_field () { return m_field; }.  */
    1877                 :         203 :   tree field_type = TREE_TYPE (field_decl);
    1878                 :         203 :   if (cxx_types_compatible_p (TREE_TYPE (init_expr), field_type))
    1879                 :         161 :     return direct_accessor_p (init_expr, field_decl, field_type);
    1880                 :             : 
    1881                 :             :   /* Failing that, determine if it is an accessor of the form:
    1882                 :             :        T& get_field () { return m_field; }.  */
    1883                 :          42 :   tree field_reference_type = cp_build_reference_type (field_type, false);
    1884                 :          42 :   if (cxx_types_compatible_p (TREE_TYPE (init_expr), field_reference_type))
    1885                 :          42 :     return reference_accessor_p (init_expr, field_decl, field_type,
    1886                 :          42 :                                  field_reference_type);
    1887                 :             : 
    1888                 :             :   return false;
    1889                 :             : }
    1890                 :             : 
    1891                 :             : /* Callback data for dfs_locate_field_accessor_pre.  */
    1892                 :             : 
    1893                 :             : class locate_field_data
    1894                 :             : {
    1895                 :             : public:
    1896                 :         460 :   locate_field_data (tree field_decl_, bool const_p_)
    1897                 :         460 :   : field_decl (field_decl_), const_p (const_p_) {}
    1898                 :             : 
    1899                 :             :   tree field_decl;
    1900                 :             :   bool const_p;
    1901                 :             : };
    1902                 :             : 
    1903                 :             : /* Return a FUNCTION_DECL that is an "accessor" method for DATA, a FIELD_DECL,
    1904                 :             :    callable via binfo, if one exists, otherwise return NULL_TREE.
    1905                 :             : 
    1906                 :             :    Callback for dfs_walk_once_accessible for use within
    1907                 :             :    locate_field_accessor.  */
    1908                 :             : 
    1909                 :             : static tree
    1910                 :         508 : dfs_locate_field_accessor_pre (tree binfo, void *data)
    1911                 :             : {
    1912                 :         508 :   locate_field_data *lfd = (locate_field_data *)data;
    1913                 :         508 :   tree type = BINFO_TYPE (binfo);
    1914                 :             : 
    1915                 :         508 :   vec<tree, va_gc> *member_vec;
    1916                 :         508 :   tree fn;
    1917                 :         508 :   size_t i;
    1918                 :             : 
    1919                 :         508 :   if (!CLASS_TYPE_P (type))
    1920                 :             :     return NULL_TREE;
    1921                 :             : 
    1922                 :         508 :   member_vec = CLASSTYPE_MEMBER_VEC (type);
    1923                 :         508 :   if (!member_vec)
    1924                 :             :     return NULL_TREE;
    1925                 :             : 
    1926                 :        3253 :   for (i = 0; vec_safe_iterate (member_vec, i, &fn); ++i)
    1927                 :        3031 :     if (fn)
    1928                 :        3031 :       if (field_accessor_p (fn, lfd->field_decl, lfd->const_p))
    1929                 :         161 :         return fn;
    1930                 :             : 
    1931                 :             :   return NULL_TREE;
    1932                 :             : }
    1933                 :             : 
    1934                 :             : /* Return a FUNCTION_DECL that is an "accessor" method for FIELD_DECL,
    1935                 :             :    callable via BASETYPE_PATH, if one exists, otherwise return NULL_TREE.  */
    1936                 :             : 
    1937                 :             : tree
    1938                 :         460 : locate_field_accessor (tree basetype_path, tree field_decl, bool const_p)
    1939                 :             : {
    1940                 :         460 :   if (TREE_CODE (basetype_path) != TREE_BINFO)
    1941                 :             :     return NULL_TREE;
    1942                 :             : 
    1943                 :             :   /* Walk the hierarchy, looking for a method of some base class that allows
    1944                 :             :      access to the field.  */
    1945                 :         460 :   locate_field_data lfd (field_decl, const_p);
    1946                 :         460 :   return dfs_walk_once_accessible (basetype_path, /*friends=*/true,
    1947                 :             :                                    dfs_locate_field_accessor_pre,
    1948                 :         460 :                                    NULL, &lfd);
    1949                 :             : }
    1950                 :             : 
    1951                 :             : /* Check throw specifier of OVERRIDER is at least as strict as
    1952                 :             :    the one of BASEFN.  This is due to [except.spec]: "If a virtual function
    1953                 :             :    has a non-throwing exception specification, all declarations, including
    1954                 :             :    the definition, of any function that overrides that virtual function in
    1955                 :             :    any derived class shall have a non-throwing exception specification,
    1956                 :             :    unless the overriding function is defined as deleted."  */
    1957                 :             : 
    1958                 :             : bool
    1959                 :     3216695 : maybe_check_overriding_exception_spec (tree overrider, tree basefn)
    1960                 :             : {
    1961                 :     3216695 :   maybe_instantiate_noexcept (basefn);
    1962                 :     3216695 :   maybe_instantiate_noexcept (overrider);
    1963                 :     3216695 :   tree base_throw = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (basefn));
    1964                 :     3216695 :   tree over_throw = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (overrider));
    1965                 :             : 
    1966                 :     3216695 :   if (DECL_INVALID_OVERRIDER_P (overrider)
    1967                 :             :       /* CWG 1351 added the "unless the overriding function is defined as
    1968                 :             :          deleted" wording.  */
    1969                 :     3216695 :       || DECL_DELETED_FN (overrider))
    1970                 :             :     return true;
    1971                 :             : 
    1972                 :             :   /* Can't check this yet.  Pretend this is fine and let
    1973                 :             :      noexcept_override_late_checks check this later.  */
    1974                 :     2106356 :   if (UNPARSED_NOEXCEPT_SPEC_P (base_throw)
    1975                 :     7429488 :       || UNPARSED_NOEXCEPT_SPEC_P (over_throw))
    1976                 :             :     return true;
    1977                 :             : 
    1978                 :             :   /* We also have to defer checking when we're in a template and couldn't
    1979                 :             :      instantiate & evaluate the noexcept to true/false.  */
    1980                 :     3216677 :   if (processing_template_decl)
    1981                 :           6 :     if ((base_throw
    1982                 :           3 :          && base_throw != noexcept_true_spec
    1983                 :           0 :          && base_throw != noexcept_false_spec)
    1984                 :           6 :         || (over_throw
    1985                 :           6 :             && over_throw != noexcept_true_spec
    1986                 :           6 :             && over_throw != noexcept_false_spec))
    1987                 :             :       return true;
    1988                 :             : 
    1989                 :     3216671 :   if (!comp_except_specs (base_throw, over_throw, ce_derived))
    1990                 :             :     {
    1991                 :          53 :       auto_diagnostic_group d;
    1992                 :          53 :       error ("looser exception specification on overriding virtual function "
    1993                 :             :              "%q+#F", overrider);
    1994                 :          53 :       inform (DECL_SOURCE_LOCATION (basefn),
    1995                 :             :               "overridden function is %q#F", basefn);
    1996                 :          53 :       DECL_INVALID_OVERRIDER_P (overrider) = 1;
    1997                 :          53 :       return false;
    1998                 :          53 :     }
    1999                 :             :   return true;
    2000                 :             : }
    2001                 :             : 
    2002                 :             : /* Check that virtual overrider OVERRIDER is acceptable for base function
    2003                 :             :    BASEFN. Issue diagnostic, and return zero, if unacceptable.  */
    2004                 :             : 
    2005                 :             : static int
    2006                 :     3216756 : check_final_overrider (tree overrider, tree basefn)
    2007                 :             : {
    2008                 :     3216756 :   tree over_type = TREE_TYPE (overrider);
    2009                 :     3216756 :   tree base_type = TREE_TYPE (basefn);
    2010                 :     3216756 :   tree over_return = fndecl_declared_return_type (overrider);
    2011                 :     3216756 :   tree base_return = fndecl_declared_return_type (basefn);
    2012                 :             : 
    2013                 :     3216756 :   int fail = 0;
    2014                 :             : 
    2015                 :     3216756 :   if (DECL_INVALID_OVERRIDER_P (overrider))
    2016                 :             :     return 0;
    2017                 :             : 
    2018                 :     3216746 :   if (same_type_p (base_return, over_return))
    2019                 :             :     /* OK */;
    2020                 :           0 :   else if ((CLASS_TYPE_P (over_return) && CLASS_TYPE_P (base_return))
    2021                 :         363 :            || (TREE_CODE (base_return) == TREE_CODE (over_return)
    2022                 :         344 :                && INDIRECT_TYPE_P (base_return)))
    2023                 :             :     {
    2024                 :             :       /* Potentially covariant.  */
    2025                 :         344 :       unsigned base_quals, over_quals;
    2026                 :             : 
    2027                 :         344 :       fail = !INDIRECT_TYPE_P (base_return);
    2028                 :         344 :       if (!fail)
    2029                 :             :         {
    2030                 :         344 :           if (cp_type_quals (base_return) != cp_type_quals (over_return))
    2031                 :           0 :             fail = 1;
    2032                 :             : 
    2033                 :         344 :           if (TYPE_REF_P (base_return)
    2034                 :         344 :               && (TYPE_REF_IS_RVALUE (base_return)
    2035                 :          78 :                   != TYPE_REF_IS_RVALUE (over_return)))
    2036                 :             :             fail = 1;
    2037                 :             : 
    2038                 :         344 :           base_return = TREE_TYPE (base_return);
    2039                 :         344 :           over_return = TREE_TYPE (over_return);
    2040                 :             :         }
    2041                 :         344 :       base_quals = cp_type_quals (base_return);
    2042                 :         344 :       over_quals = cp_type_quals (over_return);
    2043                 :             : 
    2044                 :         344 :       if ((base_quals & over_quals) != over_quals)
    2045                 :           4 :         fail = 1;
    2046                 :             : 
    2047                 :         344 :       if (CLASS_TYPE_P (base_return) && CLASS_TYPE_P (over_return))
    2048                 :             :         {
    2049                 :             :           /* Strictly speaking, the standard requires the return type to be
    2050                 :             :              complete even if it only differs in cv-quals, but that seems
    2051                 :             :              like a bug in the wording.  */
    2052                 :         332 :           if (!same_type_ignoring_top_level_qualifiers_p (base_return,
    2053                 :             :                                                           over_return))
    2054                 :             :             {
    2055                 :         321 :               tree binfo = lookup_base (over_return, base_return,
    2056                 :             :                                         ba_check, NULL, tf_none);
    2057                 :             : 
    2058                 :         321 :               if (!binfo || binfo == error_mark_node)
    2059                 :             :                 fail = 1;
    2060                 :             :             }
    2061                 :             :         }
    2062                 :          12 :       else if (can_convert_standard (TREE_TYPE (base_type),
    2063                 :          12 :                                      TREE_TYPE (over_type),
    2064                 :             :                                      tf_warning_or_error))
    2065                 :             :         /* GNU extension, allow trivial pointer conversions such as
    2066                 :             :            converting to void *, or qualification conversion.  */
    2067                 :             :         {
    2068                 :           0 :           auto_diagnostic_group d;
    2069                 :           0 :           if (pedwarn (DECL_SOURCE_LOCATION (overrider), 0,
    2070                 :             :                        "invalid covariant return type for %q#D", overrider))
    2071                 :           0 :             inform (DECL_SOURCE_LOCATION (basefn),
    2072                 :             :                     "overridden function is %q#D", basefn);
    2073                 :           0 :         }
    2074                 :             :       else
    2075                 :             :         fail = 2;
    2076                 :             :     }
    2077                 :             :   else
    2078                 :             :     fail = 2;
    2079                 :         312 :   if (!fail)
    2080                 :             :     /* OK */;
    2081                 :             :   else
    2082                 :             :     {
    2083                 :          57 :       auto_diagnostic_group d;
    2084                 :          57 :       if (fail == 1)
    2085                 :          26 :         error ("invalid covariant return type for %q+#D", overrider);
    2086                 :             :       else
    2087                 :          31 :         error ("conflicting return type specified for %q+#D", overrider);
    2088                 :          57 :       inform (DECL_SOURCE_LOCATION (basefn),
    2089                 :             :               "overridden function is %q#D", basefn);
    2090                 :          57 :       DECL_INVALID_OVERRIDER_P (overrider) = 1;
    2091                 :          57 :       return 0;
    2092                 :          57 :     }
    2093                 :             : 
    2094                 :     3216689 :   if (!maybe_check_overriding_exception_spec (overrider, basefn))
    2095                 :             :     return 0;
    2096                 :             : 
    2097                 :             :   /* Check for conflicting type attributes.  But leave transaction_safe for
    2098                 :             :      set_one_vmethod_tm_attributes.  */
    2099                 :     3216636 :   if (!comp_type_attributes (over_type, base_type)
    2100                 :          72 :       && !tx_safe_fn_type_p (base_type)
    2101                 :     3216645 :       && !tx_safe_fn_type_p (over_type))
    2102                 :             :     {
    2103                 :           0 :       auto_diagnostic_group d;
    2104                 :           0 :       error ("conflicting type attributes specified for %q+#D", overrider);
    2105                 :           0 :       inform (DECL_SOURCE_LOCATION (basefn),
    2106                 :             :               "overridden function is %q#D", basefn);
    2107                 :           0 :       DECL_INVALID_OVERRIDER_P (overrider) = 1;
    2108                 :           0 :       return 0;
    2109                 :           0 :     }
    2110                 :             : 
    2111                 :             :   /* A consteval virtual function shall not override a virtual function that is
    2112                 :             :      not consteval. A consteval virtual function shall not be overridden by a
    2113                 :             :      virtual function that is not consteval.  */
    2114                 :     9649908 :   if (DECL_IMMEDIATE_FUNCTION_P (overrider)
    2115                 :     6433272 :       != DECL_IMMEDIATE_FUNCTION_P (basefn))
    2116                 :             :     {
    2117                 :           2 :       auto_diagnostic_group d;
    2118                 :           4 :       if (DECL_IMMEDIATE_FUNCTION_P (overrider))
    2119                 :           1 :         error ("%<consteval%> function %q+D overriding non-%<consteval%> "
    2120                 :             :                "function", overrider);
    2121                 :             :       else
    2122                 :           1 :         error ("non-%<consteval%> function %q+D overriding %<consteval%> "
    2123                 :             :                "function", overrider);
    2124                 :           2 :       inform (DECL_SOURCE_LOCATION (basefn),
    2125                 :             :               "overridden function is %qD", basefn);
    2126                 :           2 :       DECL_INVALID_OVERRIDER_P (overrider) = 1;
    2127                 :           2 :       return 0;
    2128                 :           2 :     }
    2129                 :             : 
    2130                 :             :   /* A function declared transaction_safe_dynamic that overrides a function
    2131                 :             :      declared transaction_safe (but not transaction_safe_dynamic) is
    2132                 :             :      ill-formed.  */
    2133                 :     3216634 :   if (tx_safe_fn_type_p (base_type)
    2134                 :          80 :       && lookup_attribute ("transaction_safe_dynamic",
    2135                 :          80 :                            DECL_ATTRIBUTES (overrider))
    2136                 :     3216647 :       && !lookup_attribute ("transaction_safe_dynamic",
    2137                 :          13 :                             DECL_ATTRIBUTES (basefn)))
    2138                 :             :     {
    2139                 :           1 :       auto_diagnostic_group d;
    2140                 :           1 :       error_at (DECL_SOURCE_LOCATION (overrider),
    2141                 :             :                 "%qD declared %<transaction_safe_dynamic%>", overrider);
    2142                 :           1 :       inform (DECL_SOURCE_LOCATION (basefn),
    2143                 :             :               "overriding %qD declared %<transaction_safe%>", basefn);
    2144                 :           1 :     }
    2145                 :             : 
    2146                 :     3216634 :   if (DECL_DELETED_FN (basefn) != DECL_DELETED_FN (overrider))
    2147                 :             :     {
    2148                 :          18 :       if (DECL_DELETED_FN (overrider))
    2149                 :             :         {
    2150                 :          15 :           auto_diagnostic_group d;
    2151                 :          15 :           error ("deleted function %q+D overriding non-deleted function",
    2152                 :             :                  overrider);
    2153                 :          15 :           inform (DECL_SOURCE_LOCATION (basefn),
    2154                 :             :                   "overridden function is %qD", basefn);
    2155                 :          15 :           maybe_explain_implicit_delete (overrider);
    2156                 :          15 :         }
    2157                 :             :       else
    2158                 :             :         {
    2159                 :           3 :           auto_diagnostic_group d;
    2160                 :           3 :           error ("non-deleted function %q+D overriding deleted function",
    2161                 :             :                  overrider);
    2162                 :           3 :           inform (DECL_SOURCE_LOCATION (basefn),
    2163                 :             :                   "overridden function is %qD", basefn);
    2164                 :           3 :         }
    2165                 :          18 :       return 0;
    2166                 :             :     }
    2167                 :             : 
    2168                 :     3216616 :   if (!DECL_HAS_CONTRACTS_P (basefn) && DECL_HAS_CONTRACTS_P (overrider))
    2169                 :             :     {
    2170                 :           0 :       auto_diagnostic_group d;
    2171                 :           0 :       error ("function with contracts %q+D overriding contractless function",
    2172                 :             :              overrider);
    2173                 :           0 :       inform (DECL_SOURCE_LOCATION (basefn),
    2174                 :             :               "overridden function is %qD", basefn);
    2175                 :           0 :       return 0;
    2176                 :           0 :     }
    2177                 :     3216616 :   else if (DECL_HAS_CONTRACTS_P (basefn) && !DECL_HAS_CONTRACTS_P (overrider))
    2178                 :             :     {
    2179                 :             :       /* We're inheriting basefn's contracts; create a copy of them but
    2180                 :             :          replace references to their parms to our parms.  */
    2181                 :          12 :       inherit_base_contracts (overrider, basefn);
    2182                 :             :     }
    2183                 :     3216604 :   else if (DECL_HAS_CONTRACTS_P (basefn) && DECL_HAS_CONTRACTS_P (overrider))
    2184                 :             :     {
    2185                 :             :       /* We're in the process of completing the overrider's class, which means
    2186                 :             :          our conditions definitely are not parsed so simply chain on the
    2187                 :             :          basefn for later checking.
    2188                 :             : 
    2189                 :             :          Note that OVERRIDER's contracts will have been fully parsed at the
    2190                 :             :          point the deferred match is run.  */
    2191                 :          20 :       defer_guarded_contract_match (overrider, basefn, DECL_CONTRACTS (basefn));
    2192                 :             :     }
    2193                 :             : 
    2194                 :     3216616 :   if (DECL_FINAL_P (basefn))
    2195                 :             :     {
    2196                 :           6 :       auto_diagnostic_group d;
    2197                 :           6 :       error ("virtual function %q+D overriding final function", overrider);
    2198                 :           6 :       inform (DECL_SOURCE_LOCATION (basefn),
    2199                 :             :               "overridden function is %qD", basefn);
    2200                 :           6 :       return 0;
    2201                 :           6 :     }
    2202                 :             :   return 1;
    2203                 :             : }
    2204                 :             : 
    2205                 :             : /* Given a class TYPE, and a function decl FNDECL, look for
    2206                 :             :    virtual functions in TYPE's hierarchy which FNDECL overrides.
    2207                 :             :    We do not look in TYPE itself, only its bases.
    2208                 :             : 
    2209                 :             :    Returns nonzero, if we find any. Set FNDECL's DECL_VIRTUAL_P, if we
    2210                 :             :    find that it overrides anything.
    2211                 :             : 
    2212                 :             :    We check that every function which is overridden, is correctly
    2213                 :             :    overridden.  */
    2214                 :             : 
    2215                 :             : int
    2216                 :    13827741 : look_for_overrides (tree type, tree fndecl)
    2217                 :             : {
    2218                 :    13827741 :   tree binfo = TYPE_BINFO (type);
    2219                 :    13827741 :   tree base_binfo;
    2220                 :    13827741 :   int ix;
    2221                 :    13827741 :   int found = 0;
    2222                 :             : 
    2223                 :             :   /* A constructor for a class T does not override a function T
    2224                 :             :      in a base class.  */
    2225                 :    27655482 :   if (DECL_CONSTRUCTOR_P (fndecl))
    2226                 :             :     return 0;
    2227                 :             : 
    2228                 :    21658204 :   for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
    2229                 :             :     {
    2230                 :     7830463 :       tree basetype = BINFO_TYPE (base_binfo);
    2231                 :             : 
    2232                 :     7830463 :       if (TYPE_POLYMORPHIC_P (basetype))
    2233                 :     4729652 :         found += look_for_overrides_r (basetype, fndecl);
    2234                 :             :     }
    2235                 :             :   return found;
    2236                 :             : }
    2237                 :             : 
    2238                 :             : /* Look in TYPE for virtual functions with the same signature as
    2239                 :             :    FNDECL.  */
    2240                 :             : 
    2241                 :             : tree
    2242                 :    22705753 : look_for_overrides_here (tree type, tree fndecl)
    2243                 :             : {
    2244                 :    22705753 :   tree ovl = get_class_binding (type, DECL_NAME (fndecl));
    2245                 :             : 
    2246                 :    23477327 :   for (ovl_iterator iter (ovl); iter; ++iter)
    2247                 :             :     {
    2248                 :    17769502 :       tree fn = *iter;
    2249                 :             : 
    2250                 :    17769502 :       if (!DECL_VIRTUAL_P (fn))
    2251                 :             :         /* Not a virtual.  */;
    2252                 :    17721928 :       else if (DECL_CONTEXT (fn) != type)
    2253                 :             :         /* Introduced with a using declaration.  */;
    2254                 :    17721739 :       else if (DECL_STATIC_FUNCTION_P (fndecl)
    2255                 :    17721739 :                || DECL_XOBJ_MEMBER_FUNCTION_P (fndecl))
    2256                 :             :         {
    2257                 :          32 :           tree btypes = TYPE_ARG_TYPES (TREE_TYPE (fn));
    2258                 :          32 :           tree dtypes = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
    2259                 :          32 :           dtypes = DECL_XOBJ_MEMBER_FUNCTION_P (fndecl) ? TREE_CHAIN (dtypes)
    2260                 :             :                                                         : dtypes;
    2261                 :          32 :           if (compparms (TREE_CHAIN (btypes), dtypes))
    2262                 :    17359318 :             return fn;
    2263                 :             :         }
    2264                 :    17721707 :       else if (same_signature_p (fndecl, fn))
    2265                 :    17359294 :         return fn;
    2266                 :             :     }
    2267                 :             : 
    2268                 :     5346435 :   return NULL_TREE;
    2269                 :             : }
    2270                 :             : 
    2271                 :             : /* Look in TYPE for virtual functions overridden by FNDECL. Check both
    2272                 :             :    TYPE itself and its bases.  */
    2273                 :             : 
    2274                 :             : static int
    2275                 :     4729652 : look_for_overrides_r (tree type, tree fndecl)
    2276                 :             : {
    2277                 :     4729652 :   tree fn = look_for_overrides_here (type, fndecl);
    2278                 :     4729652 :   if (fn)
    2279                 :             :     {
    2280                 :     3216780 :       if (DECL_STATIC_FUNCTION_P (fndecl))
    2281                 :             :         {
    2282                 :             :           /* A static member function cannot match an inherited
    2283                 :             :              virtual member function.  */
    2284                 :           8 :           auto_diagnostic_group d;
    2285                 :           8 :           error ("%q+#D cannot be declared", fndecl);
    2286                 :           8 :           error ("  since %q+#D declared in base class", fn);
    2287                 :           8 :         }
    2288                 :     3216772 :       else if (DECL_XOBJ_MEMBER_FUNCTION_P (fndecl))
    2289                 :             :         {
    2290                 :          16 :           auto_diagnostic_group d;
    2291                 :          16 :           error_at (DECL_SOURCE_LOCATION (fndecl),
    2292                 :             :                     "explicit object member function "
    2293                 :             :                     "overrides virtual function");
    2294                 :          16 :           inform (DECL_SOURCE_LOCATION (fn),
    2295                 :             :                   "virtual function declared here");
    2296                 :          16 :         }
    2297                 :             :       else
    2298                 :             :         {
    2299                 :             :           /* It's definitely virtual, even if not explicitly set.  */
    2300                 :     3216756 :           DECL_VIRTUAL_P (fndecl) = 1;
    2301                 :     3216756 :           check_final_overrider (fndecl, fn);
    2302                 :             :         }
    2303                 :     3216780 :       return 1;
    2304                 :             :     }
    2305                 :             : 
    2306                 :             :   /* We failed to find one declared in this class. Look in its bases.  */
    2307                 :     1512872 :   return look_for_overrides (type, fndecl);
    2308                 :             : }
    2309                 :             : 
    2310                 :             : /* Called via dfs_walk from dfs_get_pure_virtuals.  */
    2311                 :             : 
    2312                 :             : static tree
    2313                 :     4532387 : dfs_get_pure_virtuals (tree binfo, void *data)
    2314                 :             : {
    2315                 :     4532387 :   tree type = (tree) data;
    2316                 :             : 
    2317                 :             :   /* We're not interested in primary base classes; the derived class
    2318                 :             :      of which they are a primary base will contain the information we
    2319                 :             :      need.  */
    2320                 :     4532387 :   if (!BINFO_PRIMARY_P (binfo))
    2321                 :             :     {
    2322                 :     2206230 :       tree virtuals;
    2323                 :             : 
    2324                 :     2206230 :       for (virtuals = BINFO_VIRTUALS (binfo);
    2325                 :    10925750 :            virtuals;
    2326                 :     8719520 :            virtuals = TREE_CHAIN (virtuals))
    2327                 :     8719520 :         if (DECL_PURE_VIRTUAL_P (BV_FN (virtuals)))
    2328                 :      500292 :           vec_safe_push (CLASSTYPE_PURE_VIRTUALS (type), BV_FN (virtuals));
    2329                 :             :     }
    2330                 :             : 
    2331                 :     4532387 :   return NULL_TREE;
    2332                 :             : }
    2333                 :             : 
    2334                 :             : /* Set CLASSTYPE_PURE_VIRTUALS for TYPE.  */
    2335                 :             : 
    2336                 :             : void
    2337                 :     1408058 : get_pure_virtuals (tree type)
    2338                 :             : {
    2339                 :             :   /* Clear the CLASSTYPE_PURE_VIRTUALS list; whatever is already there
    2340                 :             :      is going to be overridden.  */
    2341                 :     1408058 :   CLASSTYPE_PURE_VIRTUALS (type) = NULL;
    2342                 :             :   /* Now, run through all the bases which are not primary bases, and
    2343                 :             :      collect the pure virtual functions.  We look at the vtable in
    2344                 :             :      each class to determine what pure virtual functions are present.
    2345                 :             :      (A primary base is not interesting because the derived class of
    2346                 :             :      which it is a primary base will contain vtable entries for the
    2347                 :             :      pure virtuals in the base class.  */
    2348                 :     1408058 :   dfs_walk_once (TYPE_BINFO (type), NULL, dfs_get_pure_virtuals, type);
    2349                 :     1408058 : }
    2350                 :             : 
    2351                 :             : /* Debug info for C++ classes can get very large; try to avoid
    2352                 :             :    emitting it everywhere.
    2353                 :             : 
    2354                 :             :    Note that this optimization wins even when the target supports
    2355                 :             :    BINCL (if only slightly), and reduces the amount of work for the
    2356                 :             :    linker.  */
    2357                 :             : 
    2358                 :             : void
    2359                 :    35955569 : maybe_suppress_debug_info (tree t)
    2360                 :             : {
    2361                 :    35955569 :   if (write_symbols == NO_DEBUG)
    2362                 :             :     return;
    2363                 :             : 
    2364                 :             :   /* We might have set this earlier in cp_finish_decl.  */
    2365                 :    34575509 :   TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 0;
    2366                 :             : 
    2367                 :             :   /* Always emit the information for each class every time. */
    2368                 :    34575509 :   if (flag_emit_class_debug_always)
    2369                 :             :     return;
    2370                 :             : 
    2371                 :             :   /* If we already know how we're handling this class, handle debug info
    2372                 :             :      the same way.  */
    2373                 :    34575509 :   if (CLASSTYPE_INTERFACE_KNOWN (t))
    2374                 :             :     {
    2375                 :           1 :       if (CLASSTYPE_INTERFACE_ONLY (t))
    2376                 :           1 :         TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
    2377                 :             :       /* else don't set it.  */
    2378                 :             :     }
    2379                 :             :   /* If the class has a vtable, write out the debug info along with
    2380                 :             :      the vtable.  */
    2381                 :    34575508 :   else if (TYPE_CONTAINS_VPTR_P (t))
    2382                 :     1510236 :     TYPE_DECL_SUPPRESS_DEBUG (TYPE_MAIN_DECL (t)) = 1;
    2383                 :             : 
    2384                 :             :   /* Otherwise, just emit the debug info normally.  */
    2385                 :             : }
    2386                 :             : 
    2387                 :             : /* Note that we want debugging information for a base class of a class
    2388                 :             :    whose vtable is being emitted.  Normally, this would happen because
    2389                 :             :    calling the constructor for a derived class implies calling the
    2390                 :             :    constructors for all bases, which involve initializing the
    2391                 :             :    appropriate vptr with the vtable for the base class; but in the
    2392                 :             :    presence of optimization, this initialization may be optimized
    2393                 :             :    away, so we tell finish_vtable_vardecl that we want the debugging
    2394                 :             :    information anyway.  */
    2395                 :             : 
    2396                 :             : static tree
    2397                 :      651009 : dfs_debug_mark (tree binfo, void * /*data*/)
    2398                 :             : {
    2399                 :      651009 :   tree t = BINFO_TYPE (binfo);
    2400                 :             : 
    2401                 :      651009 :   if (CLASSTYPE_DEBUG_REQUESTED (t))
    2402                 :             :     return dfs_skip_bases;
    2403                 :             : 
    2404                 :      406064 :   CLASSTYPE_DEBUG_REQUESTED (t) = 1;
    2405                 :             : 
    2406                 :      406064 :   return NULL_TREE;
    2407                 :             : }
    2408                 :             : 
    2409                 :             : /* Write out the debugging information for TYPE, whose vtable is being
    2410                 :             :    emitted.  Also walk through our bases and note that we want to
    2411                 :             :    write out information for them.  This avoids the problem of not
    2412                 :             :    writing any debug info for intermediate basetypes whose
    2413                 :             :    constructors, and thus the references to their vtables, and thus
    2414                 :             :    the vtables themselves, were optimized away.  */
    2415                 :             : 
    2416                 :             : void
    2417                 :      300243 : note_debug_info_needed (tree type)
    2418                 :             : {
    2419                 :      300243 :   if (TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type)))
    2420                 :             :     {
    2421                 :      258726 :       TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type)) = 0;
    2422                 :      258726 :       rest_of_type_compilation (type, namespace_bindings_p ());
    2423                 :             :     }
    2424                 :             : 
    2425                 :      300243 :   dfs_walk_all (TYPE_BINFO (type), dfs_debug_mark, NULL, 0);
    2426                 :      300243 : }
    2427                 :             : 
    2428                 :             : /* Helper for lookup_conversions_r.  TO_TYPE is the type converted to
    2429                 :             :    by a conversion op in base BINFO.  VIRTUAL_DEPTH is nonzero if
    2430                 :             :    BINFO is morally virtual, and VIRTUALNESS is nonzero if virtual
    2431                 :             :    bases have been encountered already in the tree walk.  PARENT_CONVS
    2432                 :             :    is the list of lists of conversion functions that could hide CONV
    2433                 :             :    and OTHER_CONVS is the list of lists of conversion functions that
    2434                 :             :    could hide or be hidden by CONV, should virtualness be involved in
    2435                 :             :    the hierarchy.  Merely checking the conversion op's name is not
    2436                 :             :    enough because two conversion operators to the same type can have
    2437                 :             :    different names.  Return nonzero if we are visible.  */
    2438                 :             : 
    2439                 :             : static int
    2440                 :    15115739 : check_hidden_convs (tree binfo, int virtual_depth, int virtualness,
    2441                 :             :                     tree to_type, tree parent_convs, tree other_convs)
    2442                 :             : {
    2443                 :    15115739 :   tree level, probe;
    2444                 :             : 
    2445                 :             :   /* See if we are hidden by a parent conversion.  */
    2446                 :    15117489 :   for (level = parent_convs; level; level = TREE_CHAIN (level))
    2447                 :        7717 :     for (probe = TREE_VALUE (level); probe; probe = TREE_CHAIN (probe))
    2448                 :        5967 :       if (same_type_p (to_type, TREE_TYPE (probe)))
    2449                 :             :         return 0;
    2450                 :             : 
    2451                 :    15111576 :   if (virtual_depth || virtualness)
    2452                 :             :     {
    2453                 :             :      /* In a virtual hierarchy, we could be hidden, or could hide a
    2454                 :             :         conversion function on the other_convs list.  */
    2455                 :       72652 :       for (level = other_convs; level; level = TREE_CHAIN (level))
    2456                 :             :         {
    2457                 :        1258 :           int we_hide_them;
    2458                 :        1258 :           int they_hide_us;
    2459                 :        1258 :           tree *prev, other;
    2460                 :             : 
    2461                 :        1258 :           if (!(virtual_depth || TREE_STATIC (level)))
    2462                 :             :             /* Neither is morally virtual, so cannot hide each other.  */
    2463                 :           0 :             continue;
    2464                 :             : 
    2465                 :        1258 :           if (!TREE_VALUE (level))
    2466                 :             :             /* They evaporated away already.  */
    2467                 :           0 :             continue;
    2468                 :             : 
    2469                 :        2524 :           they_hide_us = (virtual_depth
    2470                 :        1258 :                           && original_binfo (binfo, TREE_PURPOSE (level)));
    2471                 :           8 :           we_hide_them = (!they_hide_us && TREE_STATIC (level)
    2472                 :           8 :                           && original_binfo (TREE_PURPOSE (level), binfo));
    2473                 :             : 
    2474                 :        1258 :           if (!(we_hide_them || they_hide_us))
    2475                 :             :             /* Neither is within the other, so no hiding can occur.  */
    2476                 :           0 :             continue;
    2477                 :             : 
    2478                 :        1266 :           for (prev = &TREE_VALUE (level), other = *prev; other;)
    2479                 :             :             {
    2480                 :        1258 :               if (same_type_p (to_type, TREE_TYPE (other)))
    2481                 :             :                 {
    2482                 :        1258 :                   if (they_hide_us)
    2483                 :             :                     /* We are hidden.  */
    2484                 :             :                     return 0;
    2485                 :             : 
    2486                 :           8 :                   if (we_hide_them)
    2487                 :             :                     {
    2488                 :             :                       /* We hide the other one.  */
    2489                 :           8 :                       other = TREE_CHAIN (other);
    2490                 :           8 :                       *prev = other;
    2491                 :           8 :                       continue;
    2492                 :             :                     }
    2493                 :             :                 }
    2494                 :           0 :               prev = &TREE_CHAIN (other);
    2495                 :           0 :               other = *prev;
    2496                 :             :             }
    2497                 :             :         }
    2498                 :             :     }
    2499                 :             :   return 1;
    2500                 :             : }
    2501                 :             : 
    2502                 :             : /* Helper for lookup_conversions_r.  PARENT_CONVS is a list of lists
    2503                 :             :    of conversion functions, the first slot will be for the current
    2504                 :             :    binfo, if MY_CONVS is non-NULL.  CHILD_CONVS is the list of lists
    2505                 :             :    of conversion functions from children of the current binfo,
    2506                 :             :    concatenated with conversions from elsewhere in the hierarchy --
    2507                 :             :    that list begins with OTHER_CONVS.  Return a single list of lists
    2508                 :             :    containing only conversions from the current binfo and its
    2509                 :             :    children.  */
    2510                 :             : 
    2511                 :             : static tree
    2512                 :    14309880 : split_conversions (tree my_convs, tree parent_convs,
    2513                 :             :                    tree child_convs, tree other_convs)
    2514                 :             : {
    2515                 :    14309880 :   tree t;
    2516                 :    14309880 :   tree prev;
    2517                 :             : 
    2518                 :             :   /* Remove the original other_convs portion from child_convs.  */
    2519                 :    14309880 :   for (prev = NULL, t = child_convs;
    2520                 :    15109514 :        t != other_convs; prev = t, t = TREE_CHAIN (t))
    2521                 :      799634 :     continue;
    2522                 :             : 
    2523                 :    14309880 :   if (prev)
    2524                 :      799528 :     TREE_CHAIN (prev) = NULL_TREE;
    2525                 :             :   else
    2526                 :             :     child_convs = NULL_TREE;
    2527                 :             : 
    2528                 :             :   /* Attach the child convs to any we had at this level.  */
    2529                 :    14309880 :   if (my_convs)
    2530                 :             :     {
    2531                 :    13506703 :       my_convs = parent_convs;
    2532                 :    13506703 :       TREE_CHAIN (my_convs) = child_convs;
    2533                 :             :     }
    2534                 :             :   else
    2535                 :             :     my_convs = child_convs;
    2536                 :             : 
    2537                 :    14309880 :   return my_convs;
    2538                 :      799634 : }
    2539                 :             : 
    2540                 :             : /* Worker for lookup_conversions.  Lookup conversion functions in
    2541                 :             :    BINFO and its children.  VIRTUAL_DEPTH is nonzero, if BINFO is in a
    2542                 :             :    morally virtual base, and VIRTUALNESS is nonzero, if we've
    2543                 :             :    encountered virtual bases already in the tree walk.  PARENT_CONVS
    2544                 :             :    is a list of conversions within parent binfos.  OTHER_CONVS are
    2545                 :             :    conversions found elsewhere in the tree.  Return the conversions
    2546                 :             :    found within this portion of the graph in CONVS.  Return nonzero if
    2547                 :             :    we encountered virtualness.  We keep template and non-template
    2548                 :             :    conversions separate, to avoid unnecessary type comparisons.
    2549                 :             : 
    2550                 :             :    The located conversion functions are held in lists of lists.  The
    2551                 :             :    TREE_VALUE of the outer list is the list of conversion functions
    2552                 :             :    found in a particular binfo.  The TREE_PURPOSE of both the outer
    2553                 :             :    and inner lists is the binfo at which those conversions were
    2554                 :             :    found.  TREE_STATIC is set for those lists within of morally
    2555                 :             :    virtual binfos.  The TREE_VALUE of the inner list is the conversion
    2556                 :             :    function or overload itself.  The TREE_TYPE of each inner list node
    2557                 :             :    is the converted-to type.  */
    2558                 :             : 
    2559                 :             : static int
    2560                 :    37714824 : lookup_conversions_r (tree binfo, int virtual_depth, int virtualness,
    2561                 :             :                       tree parent_convs, tree other_convs, tree *convs)
    2562                 :             : {
    2563                 :    37714824 :   int my_virtualness = 0;
    2564                 :    37714824 :   tree my_convs = NULL_TREE;
    2565                 :    37714824 :   tree child_convs = NULL_TREE;
    2566                 :             : 
    2567                 :             :   /* If we have no conversion operators, then don't look.  */
    2568                 :    37714824 :   if (!TYPE_HAS_CONVERSION (BINFO_TYPE (binfo)))
    2569                 :             :     {
    2570                 :    23404944 :       *convs = NULL_TREE;
    2571                 :             : 
    2572                 :    23404944 :       return 0;
    2573                 :             :     }
    2574                 :             : 
    2575                 :    14309880 :   if (BINFO_VIRTUAL_P (binfo))
    2576                 :       72652 :     virtual_depth++;
    2577                 :             : 
    2578                 :             :   /* First, locate the unhidden ones at this level.  */
    2579                 :    14309880 :   if (tree conv = get_class_binding (BINFO_TYPE (binfo), conv_op_identifier))
    2580                 :    30941528 :   for (ovl_iterator iter (conv); iter; ++iter)
    2581                 :             :     {
    2582                 :    15115739 :       tree fn = *iter;
    2583                 :    15115739 :       tree type = DECL_CONV_FN_TYPE (fn);
    2584                 :             : 
    2585                 :    15115739 :       if (TREE_CODE (fn) != TEMPLATE_DECL && type_uses_auto (type))
    2586                 :             :         {
    2587                 :           3 :           mark_used (fn);
    2588                 :           3 :           type = DECL_CONV_FN_TYPE (fn);
    2589                 :             :         }
    2590                 :             : 
    2591                 :    15115739 :       if (check_hidden_convs (binfo, virtual_depth, virtualness,
    2592                 :             :                               type, parent_convs, other_convs))
    2593                 :             :         {
    2594                 :    15110326 :           my_convs = tree_cons (binfo, fn, my_convs);
    2595                 :    15110326 :           TREE_TYPE (my_convs) = type;
    2596                 :    15110326 :           if (virtual_depth)
    2597                 :             :             {
    2598                 :       71386 :               TREE_STATIC (my_convs) = 1;
    2599                 :       71386 :               my_virtualness = 1;
    2600                 :             :             }
    2601                 :             :         }
    2602                 :             :     }
    2603                 :             : 
    2604                 :    13510082 :   if (my_convs)
    2605                 :             :     {
    2606                 :    13506703 :       parent_convs = tree_cons (binfo, my_convs, parent_convs);
    2607                 :    13506703 :       if (virtual_depth)
    2608                 :       71386 :         TREE_STATIC (parent_convs) = 1;
    2609                 :             :     }
    2610                 :             : 
    2611                 :    14309880 :   child_convs = other_convs;
    2612                 :             : 
    2613                 :             :   /* Now iterate over each base, looking for more conversions.  */
    2614                 :    14309880 :   unsigned i;
    2615                 :    14309880 :   tree base_binfo;
    2616                 :    15719096 :   for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
    2617                 :             :     {
    2618                 :     1409216 :       tree base_convs;
    2619                 :     1409216 :       unsigned base_virtualness;
    2620                 :             : 
    2621                 :     1409216 :       base_virtualness = lookup_conversions_r (base_binfo,
    2622                 :             :                                                virtual_depth, virtualness,
    2623                 :             :                                                parent_convs, child_convs,
    2624                 :             :                                                &base_convs);
    2625                 :     1409216 :       if (base_virtualness)
    2626                 :       88902 :         my_virtualness = virtualness = 1;
    2627                 :     1409216 :       child_convs = chainon (base_convs, child_convs);
    2628                 :             :     }
    2629                 :             : 
    2630                 :    14309880 :   *convs = split_conversions (my_convs, parent_convs,
    2631                 :             :                               child_convs, other_convs);
    2632                 :             : 
    2633                 :    14309880 :   return my_virtualness;
    2634                 :             : }
    2635                 :             : 
    2636                 :             : /* Return a TREE_LIST containing all the non-hidden user-defined
    2637                 :             :    conversion functions for TYPE (and its base-classes).  The
    2638                 :             :    TREE_VALUE of each node is the FUNCTION_DECL of the conversion
    2639                 :             :    function.  The TREE_PURPOSE is the BINFO from which the conversion
    2640                 :             :    functions in this node were selected.  This function is effectively
    2641                 :             :    performing a set of member lookups as lookup_fnfield does, but
    2642                 :             :    using the type being converted to as the unique key, rather than the
    2643                 :             :    field name.  */
    2644                 :             : 
    2645                 :             : tree
    2646                 :    36305789 : lookup_conversions (tree type)
    2647                 :             : {
    2648                 :    36305789 :   tree convs;
    2649                 :             : 
    2650                 :    36305789 :   complete_type (type);
    2651                 :    36305789 :   if (!CLASS_TYPE_P (type) || !TYPE_BINFO (type))
    2652                 :             :     return NULL_TREE;
    2653                 :             : 
    2654                 :    36305608 :   lookup_conversions_r (TYPE_BINFO (type), 0, 0, NULL_TREE, NULL_TREE, &convs);
    2655                 :             : 
    2656                 :    36305608 :   tree list = NULL_TREE;
    2657                 :             :   
    2658                 :             :   /* Flatten the list-of-lists */
    2659                 :    49812311 :   for (; convs; convs = TREE_CHAIN (convs))
    2660                 :             :     {
    2661                 :    13506703 :       tree probe, next;
    2662                 :             : 
    2663                 :    28617021 :       for (probe = TREE_VALUE (convs); probe; probe = next)
    2664                 :             :         {
    2665                 :    15110318 :           next = TREE_CHAIN (probe);
    2666                 :             : 
    2667                 :    15110318 :           TREE_CHAIN (probe) = list;
    2668                 :    15110318 :           list = probe;
    2669                 :             :         }
    2670                 :             :     }
    2671                 :             : 
    2672                 :             :   return list;
    2673                 :             : }
    2674                 :             : 
    2675                 :             : /* Returns the binfo of the first direct or indirect virtual base derived
    2676                 :             :    from BINFO, or NULL if binfo is not via virtual.  */
    2677                 :             : 
    2678                 :             : tree
    2679                 :         104 : binfo_from_vbase (tree binfo)
    2680                 :             : {
    2681                 :         164 :   for (; binfo; binfo = BINFO_INHERITANCE_CHAIN (binfo))
    2682                 :             :     {
    2683                 :         164 :       if (BINFO_VIRTUAL_P (binfo))
    2684                 :         104 :         return binfo;
    2685                 :             :     }
    2686                 :             :   return NULL_TREE;
    2687                 :             : }
    2688                 :             : 
    2689                 :             : /* Returns the binfo of the first direct or indirect virtual base derived
    2690                 :             :    from BINFO up to the TREE_TYPE, LIMIT, or NULL if binfo is not
    2691                 :             :    via virtual.  */
    2692                 :             : 
    2693                 :             : tree
    2694                 :   347544206 : binfo_via_virtual (tree binfo, tree limit)
    2695                 :             : {
    2696                 :   347544206 :   if (limit && !CLASSTYPE_VBASECLASSES (limit))
    2697                 :             :     /* LIMIT has no virtual bases, so BINFO cannot be via one.  */
    2698                 :             :     return NULL_TREE;
    2699                 :             : 
    2700                 :    12501868 :   for (; binfo && !SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), limit);
    2701                 :     1822005 :        binfo = BINFO_INHERITANCE_CHAIN (binfo))
    2702                 :             :     {
    2703                 :     3700341 :       if (BINFO_VIRTUAL_P (binfo))
    2704                 :     1878336 :         return binfo;
    2705                 :             :     }
    2706                 :             :   return NULL_TREE;
    2707                 :             : }
    2708                 :             : 
    2709                 :             : /* BINFO is for a base class in some hierarchy.  Return true iff it is a
    2710                 :             :    direct base.  */
    2711                 :             : 
    2712                 :             : bool
    2713                 :       44064 : binfo_direct_p (tree binfo)
    2714                 :             : {
    2715                 :       44064 :   tree d_binfo = BINFO_INHERITANCE_CHAIN (binfo);
    2716                 :       44064 :   if (BINFO_INHERITANCE_CHAIN (d_binfo))
    2717                 :             :     /* A second inheritance chain means indirect.  */
    2718                 :             :     return false;
    2719                 :       44058 :   if (!BINFO_VIRTUAL_P (binfo))
    2720                 :             :     /* Non-virtual, so only one inheritance chain means direct.  */
    2721                 :             :     return true;
    2722                 :             :   /* A virtual base looks like a direct base, so we need to look through the
    2723                 :             :      direct bases to see if it's there.  */
    2724                 :             :   tree b_binfo;
    2725                 :          27 :   for (int i = 0; BINFO_BASE_ITERATE (d_binfo, i, b_binfo); ++i)
    2726                 :          24 :     if (b_binfo == binfo)
    2727                 :             :       return true;
    2728                 :             :   return false;
    2729                 :             : }
    2730                 :             : 
    2731                 :             : /* BINFO is a base binfo in the complete type BINFO_TYPE (HERE).
    2732                 :             :    Find the equivalent binfo within whatever graph HERE is located.
    2733                 :             :    This is the inverse of original_binfo.  */
    2734                 :             : 
    2735                 :             : tree
    2736                 :    25793603 : copied_binfo (tree binfo, tree here)
    2737                 :             : {
    2738                 :    25793603 :   tree result = NULL_TREE;
    2739                 :             : 
    2740                 :    25793603 :   if (BINFO_VIRTUAL_P (binfo))
    2741                 :             :     {
    2742                 :             :       tree t;
    2743                 :             : 
    2744                 :     6578357 :       for (t = here; BINFO_INHERITANCE_CHAIN (t);
    2745                 :     3420664 :            t = BINFO_INHERITANCE_CHAIN (t))
    2746                 :     3420664 :         continue;
    2747                 :             : 
    2748                 :     3157693 :       result = binfo_for_vbase (BINFO_TYPE (binfo), BINFO_TYPE (t));
    2749                 :     3420664 :     }
    2750                 :    22635910 :   else if (BINFO_INHERITANCE_CHAIN (binfo))
    2751                 :             :     {
    2752                 :    11317955 :       tree cbinfo;
    2753                 :    11317955 :       tree base_binfo;
    2754                 :    11317955 :       int ix;
    2755                 :             : 
    2756                 :    11317955 :       cbinfo = copied_binfo (BINFO_INHERITANCE_CHAIN (binfo), here);
    2757                 :    22667510 :       for (ix = 0; BINFO_BASE_ITERATE (cbinfo, ix, base_binfo); ix++)
    2758                 :    11349555 :         if (SAME_BINFO_TYPE_P (BINFO_TYPE (base_binfo), BINFO_TYPE (binfo)))
    2759                 :             :           {
    2760                 :             :             result = base_binfo;
    2761                 :             :             break;
    2762                 :             :           }
    2763                 :             :     }
    2764                 :             :   else
    2765                 :             :     {
    2766                 :    11317955 :       gcc_assert (SAME_BINFO_TYPE_P (BINFO_TYPE (here), BINFO_TYPE (binfo)));
    2767                 :             :       result = here;
    2768                 :             :     }
    2769                 :             : 
    2770                 :    25793603 :   gcc_assert (result);
    2771                 :    25793603 :   return result;
    2772                 :             : }
    2773                 :             : 
    2774                 :             : tree
    2775                 :     6146314 : binfo_for_vbase (tree base, tree t)
    2776                 :             : {
    2777                 :     6146314 :   unsigned ix;
    2778                 :     6146314 :   tree binfo;
    2779                 :     6146314 :   vec<tree, va_gc> *vbases;
    2780                 :             : 
    2781                 :    67429509 :   for (vbases = CLASSTYPE_VBASECLASSES (t), ix = 0;
    2782                 :    67429509 :        vec_safe_iterate (vbases, ix, &binfo); ix++)
    2783                 :    66172761 :     if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), base))
    2784                 :     4889566 :       return binfo;
    2785                 :             :   return NULL;
    2786                 :             : }
    2787                 :             : 
    2788                 :             : /* BINFO is some base binfo of HERE, within some other
    2789                 :             :    hierarchy. Return the equivalent binfo, but in the hierarchy
    2790                 :             :    dominated by HERE.  This is the inverse of copied_binfo.  If BINFO
    2791                 :             :    is not a base binfo of HERE, returns NULL_TREE.  */
    2792                 :             : 
    2793                 :             : tree
    2794                 :        1258 : original_binfo (tree binfo, tree here)
    2795                 :             : {
    2796                 :        1258 :   tree result = NULL;
    2797                 :             : 
    2798                 :        1258 :   if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), BINFO_TYPE (here)))
    2799                 :             :     result = here;
    2800                 :          16 :   else if (BINFO_VIRTUAL_P (binfo))
    2801                 :          16 :     result = (CLASSTYPE_VBASECLASSES (BINFO_TYPE (here))
    2802                 :          16 :               ? binfo_for_vbase (BINFO_TYPE (binfo), BINFO_TYPE (here))
    2803                 :             :               : NULL_TREE);
    2804                 :           0 :   else if (BINFO_INHERITANCE_CHAIN (binfo))
    2805                 :             :     {
    2806                 :           0 :       tree base_binfos;
    2807                 :             : 
    2808                 :           0 :       base_binfos = original_binfo (BINFO_INHERITANCE_CHAIN (binfo), here);
    2809                 :           0 :       if (base_binfos)
    2810                 :             :         {
    2811                 :             :           int ix;
    2812                 :             :           tree base_binfo;
    2813                 :             : 
    2814                 :           0 :           for (ix = 0; (base_binfo = BINFO_BASE_BINFO (base_binfos, ix)); ix++)
    2815                 :           0 :             if (SAME_BINFO_TYPE_P (BINFO_TYPE (base_binfo),
    2816                 :             :                                    BINFO_TYPE (binfo)))
    2817                 :             :               {
    2818                 :             :                 result = base_binfo;
    2819                 :             :                 break;
    2820                 :             :               }
    2821                 :             :         }
    2822                 :             :     }
    2823                 :             : 
    2824                 :        1258 :   return result;
    2825                 :             : }
    2826                 :             : 
    2827                 :             : /* True iff TYPE has any dependent bases (and therefore we can't say
    2828                 :             :    definitively that another class is not a base of an instantiation of
    2829                 :             :    TYPE).  */
    2830                 :             : 
    2831                 :             : bool
    2832                 :    94724575 : any_dependent_bases_p (tree type)
    2833                 :             : {
    2834                 :    94724575 :   if (!type || !CLASS_TYPE_P (type) || !uses_template_parms (type))
    2835                 :    62939008 :     return false;
    2836                 :             : 
    2837                 :             :   /* If we haven't set TYPE_BINFO yet, we don't know anything about the bases.
    2838                 :             :      Return false because in this situation we aren't actually looking up names
    2839                 :             :      in the scope of the class, so it doesn't matter whether it has dependent
    2840                 :             :      bases.  */
    2841                 :    31785567 :   if (!TYPE_BINFO (type))
    2842                 :             :     return false;
    2843                 :             : 
    2844                 :             :   unsigned i;
    2845                 :             :   tree base_binfo;
    2846                 :    33846628 :   FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_BINFOS (TYPE_BINFO (type)), i, base_binfo)
    2847                 :    19467721 :     if (BINFO_DEPENDENT_BASE_P (base_binfo))
    2848                 :             :       return true;
    2849                 :             : 
    2850                 :             :   return false;
    2851                 :             : }
        

Generated by: LCOV version 2.1-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.