LCOV - code coverage report
Current view: top level - gcc/cp - decl2.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 95.2 % 2924 2785
Test Date: 2026-05-30 15:37:04 Functions: 100.0 % 134 134
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Process declarations and variables for C++ compiler.
       2              :    Copyright (C) 1988-2026 Free Software Foundation, Inc.
       3              :    Hacked by Michael Tiemann (tiemann@cygnus.com)
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify
       8              : it under the terms of the GNU General Public License as published by
       9              : the Free Software Foundation; either version 3, or (at your option)
      10              : any later version.
      11              : 
      12              : GCC is distributed in the hope that it will be useful,
      13              : but WITHOUT ANY WARRANTY; without even the implied warranty of
      14              : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15              : GNU General Public License for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : 
      22              : /* Process declarations and symbol lookup for C++ front end.
      23              :    Also constructs types; the standard scalar types at initialization,
      24              :    and structure, union, array and enum types when they are declared.  */
      25              : 
      26              : /* ??? not all decl nodes are given the most useful possible
      27              :    line numbers.  For example, the CONST_DECLs for enum values.  */
      28              : 
      29              : #include "config.h"
      30              : #include "system.h"
      31              : #include "coretypes.h"
      32              : #include "memmodel.h"
      33              : #include "target.h"
      34              : #include "cp-tree.h"
      35              : #include "c-family/c-common.h"
      36              : #include "timevar.h"
      37              : #include "stringpool.h"
      38              : #include "cgraph.h"
      39              : #include "varasm.h"
      40              : #include "attribs.h"
      41              : #include "stor-layout.h"
      42              : #include "calls.h"
      43              : #include "decl.h"
      44              : #include "toplev.h"
      45              : #include "c-family/c-objc.h"
      46              : #include "c-family/c-pragma.h"
      47              : #include "dumpfile.h"
      48              : #include "intl.h"
      49              : #include "c-family/c-ada-spec.h"
      50              : #include "asan.h"
      51              : #include "optabs-query.h"
      52              : #include "omp-general.h"
      53              : #include "tree-inline.h"
      54              : #include "escaped_string.h"
      55              : #include "gcc-rich-location.h"
      56              : #include "tree-pretty-print-markup.h"
      57              : #include "contracts.h"
      58              : 
      59              : /* Id for dumping the raw trees.  */
      60              : int raw_dump_id;
      61              : 
      62              : extern cpp_reader *parse_in;
      63              : 
      64              : static tree start_objects (bool, unsigned, bool, bool);
      65              : static tree finish_objects (bool, unsigned, tree, bool = true);
      66              : static tree start_partial_init_fini_fn (bool, unsigned, unsigned, bool);
      67              : static void finish_partial_init_fini_fn (tree);
      68              : static tree emit_partial_init_fini_fn (bool, unsigned, tree,
      69              :                                        unsigned, location_t, tree);
      70              : static void one_static_initialization_or_destruction (bool, tree, tree, bool);
      71              : static void generate_ctor_or_dtor_function (bool, unsigned, tree, location_t,
      72              :                                             bool);
      73              : static tree prune_vars_needing_no_initialization (tree *);
      74              : static void write_out_vars (tree);
      75              : static void import_export_class (tree);
      76              : static tree get_guard_bits (tree);
      77              : static void determine_visibility_from_class (tree, tree);
      78              : static bool determine_hidden_inline (tree);
      79              : 
      80              : /* A list of static class variables.  This is needed, because a
      81              :    static class variable can be declared inside the class without
      82              :    an initializer, and then initialized, statically, outside the class.  */
      83              : static GTY(()) vec<tree, va_gc> *pending_statics;
      84              : 
      85              : /* A list of functions which were declared inline, but which we
      86              :    may need to emit outline anyway.  */
      87              : static GTY(()) vec<tree, va_gc> *deferred_fns;
      88              : 
      89              : /* A list of decls that use types with no linkage, which we need to make
      90              :    sure are defined.  */
      91              : static GTY(()) vec<tree, va_gc> *no_linkage_decls;
      92              : 
      93              : /* A vector of alternating decls and identifiers, where the latter
      94              :    is to be an alias for the former if the former is defined.  */
      95              : static GTY(()) vec<tree, va_gc> *mangling_aliases;
      96              : 
      97              : /* hash traits for declarations.  Hashes single decls via
      98              :    DECL_ASSEMBLER_NAME_RAW.  */
      99              : 
     100              : struct mangled_decl_hash : ggc_remove <tree>
     101              : {
     102              :   typedef tree value_type; /* A DECL.  */
     103              :   typedef tree compare_type; /* An identifier.  */
     104              : 
     105    598250494 :   static hashval_t hash (const value_type decl)
     106              :   {
     107    598250494 :     return IDENTIFIER_HASH_VALUE (DECL_ASSEMBLER_NAME_RAW (decl));
     108              :   }
     109    577596324 :   static bool equal (const value_type existing, compare_type candidate)
     110              :   {
     111    577596324 :     tree name = DECL_ASSEMBLER_NAME_RAW (existing);
     112    577596324 :     return candidate == name;
     113              :   }
     114              : 
     115              :   static const bool empty_zero_p = true;
     116           18 :   static inline void mark_empty (value_type &p) {p = NULL_TREE;}
     117              :   static inline bool is_empty (value_type p) {return !p;}
     118              : 
     119    759731201 :   static bool is_deleted (value_type e)
     120              :   {
     121    759731201 :     return e == reinterpret_cast <value_type> (1);
     122              :   }
     123           75 :   static void mark_deleted (value_type &e)
     124              :   {
     125           75 :     e = reinterpret_cast <value_type> (1);
     126              :   }
     127              : };
     128              : 
     129              : /* A hash table of decls keyed by mangled name.  Used to figure out if
     130              :    we need compatibility aliases.  */
     131              : static GTY(()) hash_table<mangled_decl_hash> *mangled_decls;
     132              : 
     133              : // Hash table mapping priority to lists of variables or functions.
     134              : struct priority_map_traits
     135              : {
     136              :   typedef unsigned key_type;
     137              :   typedef tree value_type;
     138              :   static const bool maybe_mx = true;
     139              :   static hashval_t hash (key_type v)
     140              :   {
     141              :     return hashval_t (v);
     142              :   }
     143              :   static bool equal_keys (key_type k1, key_type k2)
     144              :   {
     145              :     return k1 == k2;
     146              :   }
     147              :   template <typename T> static void remove (T &)
     148              :   {
     149              :   }
     150              :   // Zero is not a priority
     151              :   static const bool empty_zero_p = true;
     152       516833 :   template <typename T> static bool is_empty (const T &entry)
     153              :   {
     154       516833 :     return entry.m_key == 0;
     155              :   }
     156            0 :   template <typename T> static void mark_empty (T &entry)
     157              :   {
     158            0 :     entry.m_key = 0;
     159              :   }
     160              :   // Entries are not deleteable
     161              :   template <typename T> static bool is_deleted (const T &)
     162              :   {
     163              :     return false;
     164              :   }
     165              :   template <typename T> static void mark_deleted (T &)
     166              :   {
     167              :     gcc_unreachable ();
     168              :   }
     169              : };
     170              : 
     171              : typedef hash_map<unsigned/*Priority*/, tree/*List*/,
     172              :                  priority_map_traits> priority_map_t;
     173              : 
     174              : /* Two pairs of such hash tables, for the host and an OpenMP offload device.
     175              :    Each pair has one priority map for fini and one for init.  The fini tables
     176              :    are only ever used when !cxa_atexit.  */
     177              : static GTY(()) priority_map_t *static_init_fini_fns[4];
     178              : 
     179              : /* Nonzero if we're done parsing and into end-of-file activities.
     180              :    2 if all templates have been instantiated.
     181              :    3 if we're done with front-end processing.  */
     182              : 
     183              : int at_eof;
     184              : 
     185              : /* True if note_mangling_alias should enqueue mangling aliases for
     186              :    later generation, rather than emitting them right away.  */
     187              : 
     188              : bool defer_mangling_aliases = true;
     189              : 
     190              : 
     191              : /* Return a member function type (a METHOD_TYPE), given FNTYPE (a
     192              :    FUNCTION_TYPE), CTYPE (class type), and QUALS (the cv-qualifiers
     193              :    that apply to the function).  */
     194              : 
     195              : tree
     196    102067560 : build_memfn_type (tree fntype, tree ctype, cp_cv_quals quals,
     197              :                   cp_ref_qualifier rqual)
     198              : {
     199    102067560 :   if (fntype == error_mark_node || ctype == error_mark_node)
     200              :     return error_mark_node;
     201              : 
     202    102067557 :   gcc_assert (FUNC_OR_METHOD_TYPE_P (fntype));
     203              : 
     204    102067557 :   cp_cv_quals type_quals = quals & ~TYPE_QUAL_RESTRICT;
     205    102067557 :   ctype = cp_build_qualified_type (ctype, type_quals);
     206              : 
     207    102067557 :   tree newtype
     208    102067557 :     = build_method_type_directly (ctype, TREE_TYPE (fntype),
     209    102067557 :                                   (TREE_CODE (fntype) == METHOD_TYPE
     210        58634 :                                    ? TREE_CHAIN (TYPE_ARG_TYPES (fntype))
     211    102008923 :                                    : TYPE_ARG_TYPES (fntype)));
     212    102067557 :   if (tree attrs = TYPE_ATTRIBUTES (fntype))
     213           71 :     newtype = cp_build_type_attribute_variant (newtype, attrs);
     214    306202671 :   newtype = build_cp_fntype_variant (newtype, rqual,
     215    102067557 :                                      TYPE_RAISES_EXCEPTIONS (fntype),
     216    102067557 :                                      TYPE_HAS_LATE_RETURN_TYPE (fntype));
     217              : 
     218    102067557 :   return newtype;
     219              : }
     220              : 
     221              : /* Return a variant of FNTYPE, a FUNCTION_TYPE or METHOD_TYPE, with its
     222              :    return type changed to NEW_RET.  */
     223              : 
     224              : tree
     225       897103 : change_return_type (tree new_ret, tree fntype)
     226              : {
     227       897103 :   if (new_ret == error_mark_node)
     228              :     return fntype;
     229              : 
     230       897103 :   if (same_type_p (new_ret, TREE_TYPE (fntype)))
     231              :     return fntype;
     232              : 
     233       897100 :   tree newtype;
     234       897100 :   tree args = TYPE_ARG_TYPES (fntype);
     235              : 
     236       897100 :   if (TREE_CODE (fntype) == FUNCTION_TYPE)
     237              :     {
     238       833274 :       newtype = build_function_type (new_ret, args,
     239       277758 :                                      TYPE_NO_NAMED_ARGS_STDARG_P (fntype));
     240       277758 :       newtype = apply_memfn_quals (newtype,
     241              :                                    type_memfn_quals (fntype));
     242              :     }
     243              :   else
     244       619342 :     newtype = build_method_type_directly
     245       619342 :       (class_of_this_parm (fntype), new_ret, TREE_CHAIN (args));
     246              : 
     247       897100 :   if (tree attrs = TYPE_ATTRIBUTES (fntype))
     248           92 :     newtype = cp_build_type_attribute_variant (newtype, attrs);
     249       897100 :   newtype = cxx_copy_lang_qualifiers (newtype, fntype);
     250              : 
     251       897100 :   return newtype;
     252              : }
     253              : 
     254              : /* Build a PARM_DECL of FN with NAME and TYPE, and set DECL_ARG_TYPE
     255              :    appropriately.  */
     256              : 
     257              : tree
     258    545837935 : cp_build_parm_decl (tree fn, tree name, tree type)
     259              : {
     260    545837935 :   tree parm = build_decl (input_location,
     261              :                           PARM_DECL, name, type);
     262    545837935 :   DECL_CONTEXT (parm) = fn;
     263              : 
     264              :   /* DECL_ARG_TYPE is only used by the back end and the back end never
     265              :      sees templates.  */
     266    545837935 :   if (!processing_template_decl)
     267    189382249 :     DECL_ARG_TYPE (parm) = type_passed_as (type);
     268              : 
     269    545837935 :   return parm;
     270              : }
     271              : 
     272              : /* Returns a PARM_DECL of FN for a parameter of the indicated TYPE, with the
     273              :    indicated NAME.  */
     274              : 
     275              : tree
     276    236499809 : build_artificial_parm (tree fn, tree name, tree type)
     277              : {
     278    236499809 :   tree parm = cp_build_parm_decl (fn, name, type);
     279    236499809 :   DECL_ARTIFICIAL (parm) = 1;
     280              :   /* All our artificial parms are implicitly `const'; they cannot be
     281              :      assigned to.  */
     282    236499809 :   TREE_READONLY (parm) = 1;
     283    236499809 :   return parm;
     284              : }
     285              : 
     286              : /* 'structors for types with virtual baseclasses need an "in-charge" flag
     287              :    saying whether this function is responsible for virtual baseclasses or not.
     288              : 
     289              :    This function adds the "in-charge" flag to member function FN if
     290              :    appropriate.  It is called from grokclassfn and tsubst.
     291              :    FN must be either a constructor or destructor.
     292              : 
     293              :    The in-charge flag follows the 'this' parameter, and is followed by the
     294              :    VTT parm (if any), then the user-written parms.  */
     295              : 
     296              : void
     297     80076523 : maybe_retrofit_in_chrg (tree fn)
     298              : {
     299     80076523 :   tree basetype, arg_types, parms, parm, fntype;
     300              : 
     301              :   /* If we've already add the in-charge parameter don't do it again.  */
     302     80076523 :   if (DECL_HAS_IN_CHARGE_PARM_P (fn))
     303              :     return;
     304              : 
     305              :   /* When processing templates we can't know, in general, whether or
     306              :      not we're going to have virtual baseclasses.  */
     307     80076523 :   if (processing_template_decl)
     308              :     return;
     309              : 
     310              :   /* We don't need an in-charge parameter for 'structors that don't
     311              :      have virtual bases.  */
     312     51117004 :   if (!CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn)))
     313              :     return;
     314              : 
     315      1135323 :   arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
     316      1135323 :   basetype = TREE_TYPE (TREE_VALUE (arg_types));
     317      1135323 :   arg_types = TREE_CHAIN (arg_types);
     318              : 
     319      1135323 :   parms = DECL_CHAIN (DECL_ARGUMENTS (fn));
     320              : 
     321              :   /* If this is a subobject constructor or destructor, our caller will
     322              :      pass us a pointer to our VTT.  */
     323      1135323 :   if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn)))
     324              :     {
     325      1135323 :       parm = build_artificial_parm (fn, vtt_parm_identifier, vtt_parm_type);
     326              : 
     327              :       /* First add it to DECL_ARGUMENTS between 'this' and the real args...  */
     328      1135323 :       DECL_CHAIN (parm) = parms;
     329      1135323 :       parms = parm;
     330              : 
     331              :       /* ...and then to TYPE_ARG_TYPES.  */
     332      1135323 :       arg_types = hash_tree_chain (vtt_parm_type, arg_types);
     333              : 
     334      1135323 :       DECL_HAS_VTT_PARM_P (fn) = 1;
     335              :     }
     336              : 
     337              :   /* Then add the in-charge parm (before the VTT parm).  */
     338      1135323 :   parm = build_artificial_parm (fn, in_charge_identifier, integer_type_node);
     339      1135323 :   DECL_CHAIN (parm) = parms;
     340      1135323 :   parms = parm;
     341      1135323 :   arg_types = hash_tree_chain (integer_type_node, arg_types);
     342              : 
     343              :   /* Insert our new parameter(s) into the list.  */
     344      1135323 :   DECL_CHAIN (DECL_ARGUMENTS (fn)) = parms;
     345              : 
     346              :   /* And rebuild the function type.  */
     347      1135323 :   fntype = build_method_type_directly (basetype, TREE_TYPE (TREE_TYPE (fn)),
     348              :                                        arg_types);
     349      1135323 :   if (TYPE_ATTRIBUTES (TREE_TYPE (fn)))
     350            3 :     fntype = (cp_build_type_attribute_variant
     351            3 :               (fntype, TYPE_ATTRIBUTES (TREE_TYPE (fn))));
     352      1135323 :   fntype = cxx_copy_lang_qualifiers (fntype, TREE_TYPE (fn));
     353      1135323 :   TREE_TYPE (fn) = fntype;
     354              : 
     355              :   /* Now we've got the in-charge parameter.  */
     356      1135323 :   DECL_HAS_IN_CHARGE_PARM_P (fn) = 1;
     357              : }
     358              : 
     359              : /* Classes overload their constituent function names automatically.
     360              :    When a function name is declared in a record structure,
     361              :    its name is changed to it overloaded name.  Since names for
     362              :    constructors and destructors can conflict, we place a leading
     363              :    '$' for destructors.
     364              : 
     365              :    CNAME is the name of the class we are grokking for.
     366              : 
     367              :    FUNCTION is a FUNCTION_DECL.  It was created by `grokdeclarator'.
     368              : 
     369              :    FLAGS contains bits saying what's special about today's
     370              :    arguments.  DTOR_FLAG == DESTRUCTOR.
     371              : 
     372              :    If FUNCTION is a destructor, then we must add the `auto-delete' field
     373              :    as a second parameter.  There is some hair associated with the fact
     374              :    that we must "declare" this variable in the manner consistent with the
     375              :    way the rest of the arguments were declared.
     376              : 
     377              :    QUALS are the qualifiers for the this pointer.  */
     378              : 
     379              : void
     380    142049979 : grokclassfn (tree ctype, tree function, enum overload_flags flags)
     381              : {
     382    142049979 :   tree fn_name = DECL_NAME (function);
     383              : 
     384              :   /* Even within an `extern "C"' block, members get C++ linkage.  See
     385              :      [dcl.link] for details.  */
     386    142049979 :   SET_DECL_LANGUAGE (function, lang_cplusplus);
     387              : 
     388    142049979 :   if (fn_name == NULL_TREE)
     389              :     {
     390            0 :       error ("name missing for member function");
     391            0 :       fn_name = get_identifier ("<anonymous>");
     392            0 :       DECL_NAME (function) = fn_name;
     393              :     }
     394              : 
     395    142049979 :   DECL_CONTEXT (function) = ctype;
     396              : 
     397    142049979 :   if (flags == DTOR_FLAG)
     398     11101668 :     DECL_CXX_DESTRUCTOR_P (function) = 1;
     399              : 
     400    272998290 :   if (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function))
     401     53684789 :     maybe_retrofit_in_chrg (function);
     402    142049979 : }
     403              : 
     404              : /* Create an ARRAY_REF, checking for the user doing things backwards
     405              :    along the way.
     406              :    If INDEX_EXP is non-NULL, then that is the index expression,
     407              :    otherwise INDEX_EXP_LIST is the list of index expressions.  */
     408              : 
     409              : tree
     410     11654686 : grok_array_decl (location_t loc, tree array_expr, tree index_exp,
     411              :                  vec<tree, va_gc> **index_exp_list, tsubst_flags_t complain)
     412              : {
     413     11654686 :   tree type;
     414     11654686 :   tree expr;
     415     11654686 :   tree orig_array_expr = array_expr;
     416     11654686 :   tree orig_index_exp = index_exp;
     417     11645431 :   vec<tree, va_gc> *orig_index_exp_list
     418     11654686 :     = index_exp_list ? *index_exp_list : NULL;
     419     11654686 :   tree overload = NULL_TREE;
     420              : 
     421     11654686 :   if (error_operand_p (array_expr) || error_operand_p (index_exp))
     422           92 :     return error_mark_node;
     423              : 
     424     11654594 :   if (processing_template_decl)
     425              :     {
     426     10021994 :       if (type_dependent_expression_p (array_expr)
     427     10022020 :           || (index_exp ? type_dependent_expression_p (index_exp)
     428           26 :                         : any_type_dependent_arguments_p (*index_exp_list)))
     429              :         {
     430      8208417 :           if (index_exp == NULL)
     431         6987 :             index_exp = build_min_nt_call_vec (ovl_op_identifier (ARRAY_REF),
     432              :                                                *index_exp_list);
     433      8208417 :           return build_min_nt_loc (loc, ARRAY_REF, array_expr, index_exp,
     434      8208417 :                                    NULL_TREE, NULL_TREE);
     435              :         }
     436      1813577 :       if (!index_exp)
     437           25 :         orig_index_exp_list = make_tree_vector_copy (*index_exp_list);
     438              :     }
     439              : 
     440      3446177 :   type = TREE_TYPE (array_expr);
     441      3446177 :   gcc_assert (type);
     442      3446177 :   type = non_reference (type);
     443              : 
     444              :   /* If they have an `operator[]', use that.  */
     445      3446177 :   if (MAYBE_CLASS_TYPE_P (type)
     446      3163548 :       || (index_exp && MAYBE_CLASS_TYPE_P (TREE_TYPE (index_exp)))
     447              :       || (index_exp == NULL_TREE
     448           56 :           && !(*index_exp_list)->is_empty ()
     449           51 :           && MAYBE_CLASS_TYPE_P (TREE_TYPE ((*index_exp_list)->last ()))))
     450              :     {
     451       282672 :       if (index_exp)
     452       282234 :         expr = build_new_op (loc, ARRAY_REF, LOOKUP_NORMAL, array_expr,
     453              :                              index_exp, NULL_TREE, NULL_TREE,
     454              :                              &overload, complain);
     455          438 :       else if ((*index_exp_list)->is_empty ())
     456           99 :         expr = build_op_subscript (loc, array_expr, index_exp_list, &overload,
     457              :                                    complain);
     458              :       else
     459              :         {
     460          339 :           expr = build_op_subscript (loc, array_expr, index_exp_list,
     461              :                                      &overload, complain & tf_decltype);
     462          339 :           if (expr == error_mark_node
     463              :               /* Don't do the backward compatibility fallback in a SFINAE
     464              :                  context.   */
     465           16 :               && (complain & tf_error))
     466              :             {
     467           10 :               tree idx = build_x_compound_expr_from_vec (*index_exp_list, NULL,
     468              :                                                          tf_none);
     469           10 :               if (idx != error_mark_node)
     470           10 :                 expr = build_new_op (loc, ARRAY_REF, LOOKUP_NORMAL, array_expr,
     471              :                                      idx, NULL_TREE, NULL_TREE, &overload,
     472              :                                      complain & tf_decltype);
     473           10 :               if (expr == error_mark_node)
     474              :                 {
     475            1 :                   overload = NULL_TREE;
     476            1 :                   expr = build_op_subscript (loc, array_expr, index_exp_list,
     477              :                                              &overload, complain);
     478              :                 }
     479              :               else
     480              :                 {
     481              :                   /* If it would be valid albeit deprecated expression in
     482              :                      C++20, just pedwarn on it and treat it as if wrapped
     483              :                      in ().  */
     484            9 :                   pedwarn (loc, OPT_Wcomma_subscript,
     485              :                            "top-level comma expression in array subscript "
     486              :                            "changed meaning in C++23");
     487            9 :                   if (processing_template_decl)
     488              :                     {
     489            2 :                       orig_index_exp
     490            2 :                         = build_x_compound_expr_from_vec (orig_index_exp_list,
     491              :                                                           NULL, complain);
     492            2 :                       if (orig_index_exp == error_mark_node)
     493            0 :                         expr = error_mark_node;
     494            2 :                       release_tree_vector (orig_index_exp_list);
     495              :                     }
     496              :                 }
     497              :             }
     498              :         }
     499              :     }
     500              :   else
     501              :     {
     502      3163505 :       tree p1, p2, i1, i2;
     503      3163505 :       bool swapped = false;
     504              : 
     505              :       /* Otherwise, create an ARRAY_REF for a pointer or array type.
     506              :          It is a little-known fact that, if `a' is an array and `i' is
     507              :          an int, you can write `i[a]', which means the same thing as
     508              :          `a[i]'.  */
     509      3163505 :       if (TREE_CODE (type) == ARRAY_TYPE || VECTOR_TYPE_P (type))
     510              :         p1 = array_expr;
     511              :       else
     512      2044530 :         p1 = build_expr_type_conversion (WANT_POINTER, array_expr, false);
     513              : 
     514      3163505 :       if (index_exp == NULL_TREE)
     515              :         {
     516           56 :           if (!(complain & tf_error))
     517              :             /* Don't do the backward compatibility fallback in a SFINAE
     518              :                context.  */
     519            8 :             return error_mark_node;
     520              : 
     521           48 :           if ((*index_exp_list)->is_empty ())
     522              :             {
     523            1 :               error_at (loc, "built-in subscript operator without expression "
     524              :                              "list");
     525            1 :               return error_mark_node;
     526              :             }
     527           47 :           tree idx = build_x_compound_expr_from_vec (*index_exp_list, NULL,
     528              :                                                      tf_none);
     529           47 :           if (idx != error_mark_node)
     530              :             /* If it would be valid albeit deprecated expression in C++20,
     531              :                just pedwarn on it and treat it as if wrapped in ().  */
     532           47 :             pedwarn (loc, OPT_Wcomma_subscript,
     533              :                      "top-level comma expression in array subscript "
     534              :                      "changed meaning in C++23");
     535              :           else
     536              :             {
     537            0 :               error_at (loc, "built-in subscript operator with more than one "
     538              :                              "expression in expression list");
     539            0 :               return error_mark_node;
     540              :             }
     541           47 :           index_exp = idx;
     542           47 :           if (processing_template_decl)
     543              :             {
     544            1 :               orig_index_exp
     545            1 :                 = build_x_compound_expr_from_vec (orig_index_exp_list,
     546              :                                                   NULL, complain);
     547            1 :               release_tree_vector (orig_index_exp_list);
     548            1 :               if (orig_index_exp == error_mark_node)
     549              :                 return error_mark_node;
     550              :             }
     551              :         }
     552              : 
     553      3163496 :       if (TREE_CODE (TREE_TYPE (index_exp)) == ARRAY_TYPE)
     554              :         p2 = index_exp;
     555              :       else
     556      3163460 :         p2 = build_expr_type_conversion (WANT_POINTER, index_exp, false);
     557              : 
     558      3163496 :       i1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, array_expr,
     559              :                                        false);
     560      3163496 :       i2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, index_exp,
     561              :                                        false);
     562              : 
     563      3163496 :       if ((p1 && i2) && (i1 && p2))
     564            0 :         error ("ambiguous conversion for array subscript");
     565              : 
     566      3163496 :       if (p1 && i2)
     567              :         array_expr = p1, index_exp = i2;
     568           80 :       else if (i1 && p2)
     569              :         swapped = true, array_expr = p2, index_exp = i1;
     570              :       else
     571              :         {
     572           29 :           if (complain & tf_error)
     573           25 :             error_at (loc, "invalid types %<%T[%T]%> for array subscript",
     574           25 :                       type, TREE_TYPE (index_exp));
     575           29 :           return error_mark_node;
     576              :         }
     577              : 
     578      3163467 :       if (array_expr == error_mark_node || index_exp == error_mark_node)
     579            0 :         error ("ambiguous conversion for array subscript");
     580              : 
     581      3163467 :       if (TYPE_PTR_P (TREE_TYPE (array_expr)))
     582      2044482 :         array_expr = mark_rvalue_use (array_expr);
     583              :       else
     584      1118985 :         array_expr = mark_lvalue_use_nonread (array_expr);
     585      3163467 :       index_exp = mark_rvalue_use (index_exp);
     586      3163467 :       if (swapped
     587           51 :           && flag_strong_eval_order == 2
     588      3163511 :           && (TREE_SIDE_EFFECTS (array_expr) || TREE_SIDE_EFFECTS (index_exp)))
     589           18 :         expr = build_array_ref (input_location, index_exp, array_expr);
     590              :       else
     591      3163449 :         expr = build_array_ref (input_location, array_expr, index_exp);
     592              :     }
     593      3446139 :   if (processing_template_decl && expr != error_mark_node)
     594              :     {
     595      1813577 :       if (overload != NULL_TREE)
     596              :         {
     597       247709 :           if (orig_index_exp == NULL_TREE)
     598              :             {
     599           22 :               expr = build_min_non_dep_op_overload (expr, overload,
     600              :                                                     orig_array_expr,
     601              :                                                     orig_index_exp_list);
     602           22 :               release_tree_vector (orig_index_exp_list);
     603           22 :               return expr;
     604              :             }
     605       247687 :           return build_min_non_dep_op_overload (ARRAY_REF, expr, overload,
     606              :                                                 orig_array_expr,
     607       247687 :                                                 orig_index_exp);
     608              :         }
     609              : 
     610      1565868 :       if (orig_index_exp == NULL_TREE)
     611              :         {
     612            0 :           orig_index_exp
     613            0 :             = build_min_nt_call_vec (ovl_op_identifier (ARRAY_REF),
     614              :                                      orig_index_exp_list);
     615            0 :           release_tree_vector (orig_index_exp_list);
     616              :         }
     617              : 
     618      1565868 :       return build_min_non_dep (ARRAY_REF, expr, orig_array_expr,
     619      1565868 :                                 orig_index_exp, NULL_TREE, NULL_TREE);
     620              :     }
     621              :   return expr;
     622              : }
     623              : 
     624              : /* Build an OMP_ARRAY_SECTION expression, handling usage in template
     625              :    definitions, etc.  */
     626              : 
     627              : tree
     628         4825 : grok_omp_array_section (location_t loc, tree array_expr, tree index,
     629              :                         tree length)
     630              : {
     631         4825 :   tree orig_array_expr = array_expr;
     632         4825 :   tree orig_index = index;
     633         4825 :   tree orig_length = length;
     634              : 
     635         4825 :   if (error_operand_p (array_expr)
     636         4816 :       || error_operand_p (index)
     637         9641 :       || error_operand_p (length))
     638            9 :     return error_mark_node;
     639              : 
     640         4816 :   if (processing_template_decl
     641         4816 :       && (type_dependent_expression_p (array_expr)
     642          757 :           || type_dependent_expression_p (index)
     643          741 :           || type_dependent_expression_p (length)))
     644          933 :     return build_min_nt_loc (loc, OMP_ARRAY_SECTION, array_expr, index, length);
     645              : 
     646         3883 :   index = fold_non_dependent_expr (index);
     647         3883 :   length = fold_non_dependent_expr (length);
     648              : 
     649              :   /* NOTE: We can pass through invalidly-typed index/length fields
     650              :      here (e.g. if the user tries to use a floating-point index/length).
     651              :      This is diagnosed later in semantics.cc:handle_omp_array_sections_1.  */
     652              : 
     653         3883 :   tree expr = build_omp_array_section (loc, array_expr, index, length);
     654              : 
     655         3883 :   if (processing_template_decl)
     656          741 :     expr = build_min_non_dep (OMP_ARRAY_SECTION, expr, orig_array_expr,
     657              :                               orig_index, orig_length);
     658              :   return expr;
     659              : }
     660              : 
     661              : /* Given the cast expression EXP, checking out its validity.   Either return
     662              :    an error_mark_node if there was an unavoidable error, return a cast to
     663              :    void for trying to delete a pointer w/ the value 0, or return the
     664              :    call to delete.  If DOING_VEC is true, we handle things differently
     665              :    for doing an array delete.
     666              :    Implements ARM $5.3.4.  This is called from the parser.  */
     667              : 
     668              : tree
     669       566633 : delete_sanity (location_t loc, tree exp, tree size, bool doing_vec,
     670              :                int use_global_delete, tsubst_flags_t complain)
     671              : {
     672       566633 :   tree t, type;
     673              : 
     674       566633 :   if (exp == error_mark_node)
     675              :     return exp;
     676              : 
     677       566516 :   if (processing_template_decl)
     678              :     {
     679       441075 :       t = build_min (DELETE_EXPR, void_type_node, exp, size);
     680       441075 :       DELETE_EXPR_USE_GLOBAL (t) = use_global_delete;
     681       441075 :       DELETE_EXPR_USE_VEC (t) = doing_vec;
     682       441075 :       TREE_SIDE_EFFECTS (t) = 1;
     683       441075 :       SET_EXPR_LOCATION (t, loc);
     684       441075 :       return t;
     685              :     }
     686              : 
     687       125441 :   location_t exp_loc = cp_expr_loc_or_loc (exp, loc);
     688              : 
     689              :   /* An array can't have been allocated by new, so complain.  */
     690       125441 :   if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
     691       125441 :       && (complain & tf_warning))
     692           21 :     warning_at (exp_loc, 0, "deleting array %q#E", exp);
     693              : 
     694       125441 :   t = build_expr_type_conversion (WANT_POINTER, exp, true);
     695              : 
     696       125441 :   if (t == NULL_TREE || t == error_mark_node)
     697              :     {
     698           21 :       if (complain & tf_error)
     699           21 :         error_at (exp_loc,
     700              :                   "type %q#T argument given to %<delete%>, expected pointer",
     701           21 :                   TREE_TYPE (exp));
     702           21 :       return error_mark_node;
     703              :     }
     704              : 
     705       125420 :   type = TREE_TYPE (t);
     706              : 
     707              :   /* As of Valley Forge, you can delete a pointer to const.  */
     708              : 
     709              :   /* You can't delete functions.  */
     710       125420 :   if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
     711              :     {
     712            6 :       if (complain & tf_error)
     713            6 :         error_at (exp_loc,
     714              :                   "cannot delete a function.  Only pointer-to-objects are "
     715              :                   "valid arguments to %<delete%>");
     716            6 :       return error_mark_node;
     717              :     }
     718              : 
     719              :   /* Deleting ptr to void is undefined behavior [expr.delete/3].  */
     720       125414 :   if (VOID_TYPE_P (TREE_TYPE (type)))
     721              :     {
     722           19 :       if (complain & tf_warning)
     723           19 :         warning_at (exp_loc, OPT_Wdelete_incomplete,
     724              :                     "deleting %qT is undefined", type);
     725              :       doing_vec = 0;
     726              :     }
     727              : 
     728              :   /* Deleting a pointer with the value zero is valid and has no effect.  */
     729       125414 :   if (integer_zerop (t))
     730            3 :     return build1_loc (loc, NOP_EXPR, void_type_node, t);
     731              : 
     732       125411 :   if (doing_vec)
     733        21193 :     return build_vec_delete (loc, t, /*maxindex=*/NULL_TREE,
     734              :                              sfk_deleting_destructor,
     735        21193 :                              use_global_delete, complain);
     736              :   else
     737       104218 :     return build_delete (loc, type, t, sfk_deleting_destructor,
     738              :                          LOOKUP_NORMAL, use_global_delete,
     739       104218 :                          complain);
     740              : }
     741              : 
     742              : /* Report an error if the indicated template declaration is not the
     743              :    sort of thing that should be a member template.  */
     744              : 
     745              : void
     746     22035371 : check_member_template (tree tmpl)
     747              : {
     748     22035371 :   tree decl;
     749              : 
     750     22035371 :   gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL);
     751     22035371 :   decl = DECL_TEMPLATE_RESULT (tmpl);
     752              : 
     753     22035371 :   if (TREE_CODE (decl) == FUNCTION_DECL
     754      2331596 :       || DECL_ALIAS_TEMPLATE_P (tmpl)
     755     23133905 :       || (TREE_CODE (decl) == TYPE_DECL
     756       768868 :           && MAYBE_CLASS_TYPE_P (TREE_TYPE (decl))))
     757              :     {
     758              :       /* The parser rejects template declarations in local classes
     759              :          (with the exception of generic lambdas).  */
     760     22135700 :       gcc_assert (!current_function_decl || LAMBDA_FUNCTION_P (decl));
     761              :       /* The parser rejects any use of virtual in a function template.  */
     762     21705705 :       gcc_assert (!(TREE_CODE (decl) == FUNCTION_DECL
     763              :                     && DECL_VIRTUAL_P (decl)));
     764              : 
     765              :       /* The debug-information generating code doesn't know what to do
     766              :          with member templates.  */
     767     21705705 :       DECL_IGNORED_P (tmpl) = 1;
     768              :     }
     769       329666 :   else if (variable_template_p (tmpl))
     770              :     /* OK */;
     771              :   else
     772            0 :     error ("template declaration of %q#D", decl);
     773     22035371 : }
     774              : 
     775              : /* A struct for conveniently working with the parameter types of a
     776              :    fndecl.  */
     777              : 
     778          276 : struct fndecl_signature
     779              : {
     780          184 :   fndecl_signature (tree fndecl)
     781          184 :   : m_fndecl (fndecl),
     782          184 :     m_num_artificial_parms (num_artificial_parms_for (fndecl)),
     783          184 :     m_variadic (true)
     784              :   {
     785          184 :     function_args_iterator iter;
     786          184 :     tree argtype;
     787          615 :     FOREACH_FUNCTION_ARGS (TREE_TYPE (fndecl), argtype, iter)
     788              :       {
     789              :         /* A trailing "void" type means that FNDECL is non-variadic.  */
     790          603 :         if (VOID_TYPE_P (argtype))
     791              :           {
     792          172 :             gcc_assert (!TREE_CHAIN (iter.next));
     793          172 :             m_variadic = false;
     794          172 :             break;
     795              :           }
     796          431 :         m_parm_types.safe_push (argtype);
     797              :       }
     798          368 :     gcc_assert (m_parm_types.length () >= (size_t)m_num_artificial_parms);
     799          184 :     m_num_user_parms = m_parm_types.length () - m_num_artificial_parms;
     800          184 :   }
     801              : 
     802              :   /* Convert from index within DECL_ARGUMENTS to 0-based user-written
     803              :      parameter, or -1 for "this".  */
     804              :   int
     805           88 :   get_argno_from_idx (size_t idx) const
     806              :   {
     807           88 :     return static_cast<int> (idx) - m_num_artificial_parms;
     808              :   }
     809              : 
     810              :   location_t
     811           88 :   get_argno_location (int argno) const
     812              :   {
     813           88 :     return get_fndecl_argument_location (m_fndecl, argno);
     814              :   }
     815              : 
     816              :   tree m_fndecl;
     817              :   int m_num_artificial_parms;
     818              :   auto_vec<tree> m_parm_types;
     819              :   size_t m_num_user_parms;
     820              :   bool m_variadic;
     821              : };
     822              : 
     823              : /* A rich_location subclass that highlights a given argno
     824              :    within FNDECL_SIG using HIGHLIGHT_COLOR in the quoted source.  */
     825              : 
     826          132 : class parm_rich_location : public gcc_rich_location
     827              : {
     828              : public:
     829           88 :   parm_rich_location (const fndecl_signature &fndecl_sig,
     830              :                       int argno,
     831              :                       const char *highlight_color)
     832           88 :   : gcc_rich_location (fndecl_sig.get_argno_location (argno),
     833              :                        nullptr,
     834           88 :                        highlight_color)
     835              :   {
     836           88 :   }
     837              : };
     838              : 
     839              : /* A class for comparing a pair of fndecls and emitting diagnostic notes
     840              :    about the differences between them, if they are sufficiently close.  */
     841              : 
     842           92 : class fndecl_comparison
     843              : {
     844              : public:
     845           92 :   fndecl_comparison (tree decl_a,
     846              :                      tree decl_b)
     847           92 :   : m_decl_a (decl_a),
     848           92 :     m_decl_b (decl_b)
     849              :   {
     850           92 :     gcc_assert (TREE_CODE (decl_a) == FUNCTION_DECL);
     851           92 :     gcc_assert (TREE_CODE (decl_b) == FUNCTION_DECL);
     852           92 :   }
     853              : 
     854              :   /* Attempt to emit diagnostic notes describing the differences between
     855              :      the fndecls, when they are a sufficiently close match.  */
     856              :   void
     857           92 :   maybe_emit_notes_for_close_match () const
     858              :   {
     859              :     /* If there's a difference in "variadicness", don't attempt to emit
     860              :        any notes.  */
     861           92 :     if (m_decl_a.m_variadic != m_decl_b.m_variadic)
     862           12 :       return;
     863              : 
     864           80 :     auto_vec<parm_difference> differences = get_differences ();
     865          124 :     if (differences.length () == 1)
     866              :       {
     867           44 :         auto_diagnostic_nesting_level sentinel;
     868           44 :         print_parm_type_difference (differences[0]);
     869           44 :       }
     870           80 :   }
     871              : 
     872              : private:
     873              :   struct parm_difference
     874              :   {
     875              :     size_t m_parm_idx_a;
     876              :     size_t m_parm_idx_b;
     877              :   };
     878              : 
     879              :   /* If we have a close match, return the differences between the two
     880              :      fndecls.  Otherwise return an empty vector.  */
     881              :   auto_vec<parm_difference>
     882           80 :   get_differences () const
     883              :   {
     884           80 :     auto_vec<parm_difference> differences;
     885              : 
     886              :     /* For now, just handle the case where the "user parm" count is
     887              :        equal.  */
     888           80 :     if (m_decl_a.m_num_user_parms != m_decl_b.m_num_user_parms)
     889              :       return differences;
     890              : 
     891              :     /* Ideally we'd check the edit distance, and thus report on close
     892              :        matches which are missing a param, have transposed params, etc.
     893              :        For now, just iterate through the params, finding differences
     894              :        elementwise.  */
     895              : 
     896              :     /* Find differences in artificial params, if they are comparable.
     897              :        This should find e.g. const vs non-const differences in "this".  */
     898           65 :     if (m_decl_a.m_num_artificial_parms == m_decl_b.m_num_artificial_parms)
     899           62 :       for (int parm_idx = 0;
     900          124 :            parm_idx < m_decl_a.m_num_artificial_parms;
     901              :            ++parm_idx)
     902           62 :         compare (parm_idx, parm_idx, differences);
     903              : 
     904              :     /* Find differences in user-provided params.  */
     905           74 :     for (size_t user_parm_idx = 0;
     906          139 :          user_parm_idx < m_decl_a.m_num_user_parms;
     907              :          ++user_parm_idx)
     908              :       {
     909           74 :         const size_t idx_a = m_decl_a.m_num_artificial_parms + user_parm_idx;
     910           74 :         const size_t idx_b = m_decl_b.m_num_artificial_parms + user_parm_idx;
     911           74 :         compare (idx_a, idx_b, differences);
     912              :       }
     913              : 
     914              :     return differences;
     915              :   }
     916              : 
     917              :   void
     918          136 :   compare (size_t idx_a, size_t idx_b,
     919              :            auto_vec<parm_difference> &differences) const
     920              :   {
     921          136 :     if (!same_type_p (m_decl_a.m_parm_types[idx_a],
     922              :                       m_decl_b.m_parm_types[idx_b]))
     923           44 :       differences.safe_push (parm_difference {idx_a, idx_b});
     924          136 :   }
     925              : 
     926              :   void
     927           44 :   print_parm_type_difference (const parm_difference &diff) const
     928              :   {
     929           44 :     const char * const highlight_a = "highlight-a";
     930           44 :     pp_markup::element_quoted_type type_of_parm_a
     931           44 :       (m_decl_a.m_parm_types[diff.m_parm_idx_a],
     932           44 :        highlight_a);
     933           44 :     const int argno_a = m_decl_a.get_argno_from_idx (diff.m_parm_idx_a);
     934           44 :     parm_rich_location rich_loc_a (m_decl_a, argno_a, highlight_a);
     935           44 :     inform (&rich_loc_a,
     936              :             "parameter %P of candidate has type %e...",
     937              :             argno_a, &type_of_parm_a);
     938              : 
     939           44 :     const char * const highlight_b = "highlight-b";
     940           44 :     pp_markup::element_quoted_type type_of_parm_b
     941           44 :       (m_decl_b.m_parm_types[diff.m_parm_idx_b],
     942           44 :        highlight_b);
     943           44 :     const int argno_b = m_decl_b.get_argno_from_idx (diff.m_parm_idx_b);
     944           44 :     parm_rich_location rich_loc_b (m_decl_b, argno_b, highlight_b);
     945           44 :     inform (&rich_loc_b,
     946              :             "...which does not match type %e",
     947              :             &type_of_parm_b);
     948           44 :   }
     949              : 
     950              :   fndecl_signature m_decl_a;
     951              :   fndecl_signature m_decl_b;
     952              : };
     953              : 
     954           78 : class decl_mismatch_context : public candidate_context
     955              : {
     956              : public:
     957           78 :   decl_mismatch_context (tree function)
     958           78 :   : m_function (function)
     959              :   {
     960           78 :     gcc_assert (TREE_CODE (function) == FUNCTION_DECL);
     961           78 :   }
     962              : 
     963              :   void
     964          101 :   emit_any_notes_for_candidate (tree cand) final override
     965              :   {
     966          101 :     if (TREE_CODE (cand) == FUNCTION_DECL)
     967              :       {
     968           92 :         fndecl_comparison diff (cand, m_function);
     969           92 :         diff.maybe_emit_notes_for_close_match ();
     970           92 :       }
     971          101 :   }
     972              : private:
     973              :   tree m_function;
     974              : };
     975              : 
     976              : /* Sanity check: report error if this function FUNCTION is not
     977              :    really a member of the class (CTYPE) it is supposed to belong to.
     978              :    TEMPLATE_PARMS is used to specify the template parameters of a member
     979              :    template passed as FUNCTION_DECL. If the member template is passed as a
     980              :    TEMPLATE_DECL, it can be NULL since the parameters can be extracted
     981              :    from the declaration. If the function is not a function template, it
     982              :    must be NULL.
     983              :    It returns the original declaration for the function, NULL_TREE if
     984              :    no declaration was found, error_mark_node if an error was emitted.  */
     985              : 
     986              : tree
     987      9258133 : check_classfn (tree ctype, tree function, tree template_parms)
     988              : {
     989      9258133 :   if (DECL_USE_TEMPLATE (function)
     990      1181121 :       && !(TREE_CODE (function) == TEMPLATE_DECL
     991         1148 :            && DECL_TEMPLATE_SPECIALIZATION (function))
     992     10438106 :       && DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (function)))
     993              :     /* Since this is a specialization of a member template,
     994              :        we're not going to find the declaration in the class.
     995              :        For example, in:
     996              : 
     997              :          struct S { template <typename T> void f(T); };
     998              :          template <> void S::f(int);
     999              : 
    1000              :        we're not going to find `S::f(int)', but there's no
    1001              :        reason we should, either.  We let our callers know we didn't
    1002              :        find the method, but we don't complain.  */
    1003              :     return NULL_TREE;
    1004              : 
    1005              :   /* Basic sanity check: for a template function, the template parameters
    1006              :      either were not passed, or they are the same of DECL_TEMPLATE_PARMS.  */
    1007      8865265 :   if (TREE_CODE (function) == TEMPLATE_DECL)
    1008              :     {
    1009         1166 :       if (template_parms
    1010         2314 :           && !comp_template_parms (template_parms,
    1011         1148 :                                    DECL_TEMPLATE_PARMS (function)))
    1012              :         {
    1013            0 :           error ("template parameter lists provided don%'t match the "
    1014              :                  "template parameters of %qD", function);
    1015            0 :           return error_mark_node;
    1016              :         }
    1017         1166 :       template_parms = DECL_TEMPLATE_PARMS (function);
    1018              :     }
    1019              : 
    1020              :   /* OK, is this a definition of a member template?  */
    1021      8865265 :   bool is_template = (template_parms != NULL_TREE);
    1022              : 
    1023              :   /* [temp.mem]
    1024              : 
    1025              :      A destructor shall not be a member template.  */
    1026     17730530 :   if (DECL_DESTRUCTOR_P (function) && is_template)
    1027              :     {
    1028            6 :       error ("destructor %qD declared as member template", function);
    1029            6 :       return error_mark_node;
    1030              :     }
    1031              : 
    1032              :   /* We must enter the scope here, because conversion operators are
    1033              :      named by target type, and type equivalence relies on typenames
    1034              :      resolving within the scope of CTYPE.  */
    1035      8865259 :   tree pushed_scope = push_scope (ctype);
    1036      8865259 :   tree matched = NULL_TREE;
    1037      8865259 :   tree fns = get_class_binding (ctype, DECL_NAME (function));
    1038      8865259 :   bool saw_template = false;
    1039              : 
    1040     35696381 :   for (ovl_iterator iter (fns); !matched && iter; ++iter)
    1041              :     {
    1042     15915262 :       tree fndecl = *iter;
    1043              : 
    1044     15915262 :       if (TREE_CODE (fndecl) == TEMPLATE_DECL)
    1045      3929206 :         saw_template = true;
    1046              : 
    1047              :       /* A member template definition only matches a member template
    1048              :          declaration.  */
    1049     15915262 :       if (is_template != (TREE_CODE (fndecl) == TEMPLATE_DECL))
    1050      1723922 :         continue;
    1051              : 
    1052     14191340 :       if (!DECL_DECLARES_FUNCTION_P (fndecl))
    1053       296229 :         continue;
    1054              : 
    1055     13895111 :       tree p1 = TYPE_ARG_TYPES (TREE_TYPE (function));
    1056     13895111 :       tree p2 = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
    1057              : 
    1058              :       /* We cannot simply call decls_match because this doesn't work
    1059              :          for static member functions that are pretending to be
    1060              :          methods, and because the name may have been changed by
    1061              :          asm("new_name").  */
    1062              : 
    1063              :       /* Get rid of the this parameter on functions that become
    1064              :          static.  */
    1065     13895111 :       if (DECL_STATIC_FUNCTION_P (fndecl)
    1066     13895111 :           && TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
    1067       172911 :         p1 = TREE_CHAIN (p1);
    1068              : 
    1069              :       /* ref-qualifier or absence of same must match.  */
    1070     27790222 :       if (type_memfn_rqual (TREE_TYPE (function))
    1071     13895111 :           != type_memfn_rqual (TREE_TYPE (fndecl)))
    1072           86 :         continue;
    1073              : 
    1074              :       // Include constraints in the match.
    1075     13895025 :       tree c1 = get_constraints (function);
    1076     13895025 :       tree c2 = get_constraints (fndecl);
    1077              : 
    1078              :       /* While finding a match, same types and params are not enough
    1079              :          if the function is versioned.  Also check for different target
    1080              :          specific attributes.  */
    1081     13895025 :       if (same_type_p (TREE_TYPE (TREE_TYPE (function)),
    1082              :                        TREE_TYPE (TREE_TYPE (fndecl)))
    1083     13151669 :           && compparms (p1, p2)
    1084      8865187 :           && !disjoint_version_decls (function, fndecl)
    1085      8865187 :           && (!is_template
    1086      2152119 :               || comp_template_parms (template_parms,
    1087      2152119 :                                       DECL_TEMPLATE_PARMS (fndecl)))
    1088      8865181 :           && equivalent_constraints (c1, c2)
    1089      8865130 :           && (DECL_TEMPLATE_SPECIALIZATION (function)
    1090      8865130 :               == DECL_TEMPLATE_SPECIALIZATION (fndecl))
    1091     22760155 :           && (!DECL_TEMPLATE_SPECIALIZATION (function)
    1092       786061 :               || (DECL_TI_TEMPLATE (function) == DECL_TI_TEMPLATE (fndecl))))
    1093              :         matched = fndecl;
    1094              :     }
    1095              : 
    1096          114 :   if (!matched && !is_template && saw_template
    1097      8865274 :       && !processing_template_decl && DECL_UNIQUE_FRIEND_P (function))
    1098              :     {
    1099              :       /* "[if no non-template match is found,] each remaining function template
    1100              :          is replaced with the specialization chosen by deduction from the
    1101              :          friend declaration or discarded if deduction fails."
    1102              : 
    1103              :          So tell check_explicit_specialization to look for a match.  */
    1104            3 :       SET_DECL_IMPLICIT_INSTANTIATION (function);
    1105            3 :       DECL_TEMPLATE_INFO (function) = build_template_info (fns, NULL_TREE);
    1106            3 :       matched = function;
    1107              :     }
    1108              : 
    1109      8865259 :   if (!matched)
    1110              :     {
    1111          126 :       if (!COMPLETE_TYPE_P (ctype))
    1112            6 :         cxx_incomplete_type_error (DECL_SOURCE_LOCATION (function),
    1113              :                                    function, ctype);
    1114              :       else
    1115              :         {
    1116          120 :           if (DECL_CONV_FN_P (function))
    1117            6 :             fns = get_class_binding (ctype, conv_op_identifier);
    1118              : 
    1119          120 :           auto_diagnostic_group d;
    1120          120 :           error_at (DECL_SOURCE_LOCATION (function),
    1121              :                     "no declaration matches %q#D", function);
    1122          120 :           if (fns)
    1123              :             {
    1124           78 :               decl_mismatch_context ctxt (function);
    1125           78 :               print_candidates (DECL_SOURCE_LOCATION (function), fns, &ctxt);
    1126           78 :             }
    1127           42 :           else if (DECL_CONV_FN_P (function))
    1128            3 :             inform (DECL_SOURCE_LOCATION (function),
    1129              :                     "no conversion operators declared");
    1130              :           else
    1131           39 :             inform (DECL_SOURCE_LOCATION (function),
    1132              :                     "no functions named %qD", function);
    1133          120 :           inform (DECL_SOURCE_LOCATION (TYPE_NAME (ctype)),
    1134              :                   "%#qT defined here", ctype);
    1135          120 :         }
    1136          126 :       matched = error_mark_node;
    1137              :     }
    1138              : 
    1139      8865259 :   if (pushed_scope)
    1140      8510324 :     pop_scope (pushed_scope);
    1141              : 
    1142              :   return matched;
    1143              : }
    1144              : 
    1145              : /* DECL is a function with vague linkage.  Remember it so that at the
    1146              :    end of the translation unit we can decide whether or not to emit
    1147              :    it.  */
    1148              : 
    1149              : void
    1150     48450078 : note_vague_linkage_fn (tree decl)
    1151              : {
    1152     48450078 :   if (processing_template_decl)
    1153              :     return;
    1154              : 
    1155     48450069 :   DECL_DEFER_OUTPUT (decl) = 1;
    1156     48450069 :   vec_safe_push (deferred_fns, decl);
    1157              : }
    1158              : 
    1159              : /* As above, but for variables.  */
    1160              : 
    1161              : void
    1162     12201042 : note_vague_linkage_variable (tree decl)
    1163              : {
    1164     12201042 :   vec_safe_push (pending_statics, decl);
    1165     12201042 : }
    1166              : 
    1167              : /* We have just processed the DECL, which is a static data member.
    1168              :    The other parameters are as for cp_finish_decl.  */
    1169              : 
    1170              : void
    1171     16623580 : finish_static_data_member_decl (tree decl,
    1172              :                                 tree init, bool init_const_expr_p,
    1173              :                                 tree asmspec_tree,
    1174              :                                 int flags)
    1175              : {
    1176     16623580 :   if (DECL_TEMPLATE_INSTANTIATED (decl))
    1177              :     /* We already needed to instantiate this, so the processing in this
    1178              :        function is unnecessary/wrong.  */
    1179              :     return;
    1180              : 
    1181     16623577 :   DECL_CONTEXT (decl) = current_class_type;
    1182              : 
    1183              :   /* We cannot call pushdecl here, because that would fill in the
    1184              :      TREE_CHAIN of our decl.  Instead, we modify cp_finish_decl to do
    1185              :      the right thing, namely, to put this decl out straight away.  */
    1186              : 
    1187     16623577 :   if (! processing_template_decl)
    1188     13752685 :     vec_safe_push (pending_statics, decl);
    1189              : 
    1190     16623577 :   if (LOCAL_CLASS_P (current_class_type)
    1191              :       /* We already complained about the template definition.  */
    1192     16623577 :       && !DECL_TEMPLATE_INSTANTIATION (decl))
    1193           15 :     permerror (DECL_SOURCE_LOCATION (decl),
    1194              :                "local class %q#T shall not have static data member %q#D",
    1195              :                current_class_type, decl);
    1196              :   else
    1197     33626182 :     for (tree t = current_class_type; TYPE_P (t);
    1198     16976089 :          t = CP_TYPE_CONTEXT (t))
    1199     33952250 :       if (TYPE_UNNAMED_P (t))
    1200              :         {
    1201           24 :           auto_diagnostic_group d;
    1202           24 :           if (permerror (DECL_SOURCE_LOCATION (decl),
    1203              :                          "static data member %qD in unnamed class", decl))
    1204           24 :             inform (DECL_SOURCE_LOCATION (TYPE_NAME (t)),
    1205              :                     "unnamed class defined here");
    1206           24 :           break;
    1207           24 :         }
    1208              : 
    1209     16623577 :   if (DECL_INLINE_VAR_P (decl) && !DECL_TEMPLATE_INSTANTIATION (decl))
    1210              :     /* An inline variable is immediately defined, so don't set DECL_IN_AGGR_P.
    1211              :        Except that if decl is a template instantiation, it isn't defined until
    1212              :        instantiate_decl.  */;
    1213              :   else
    1214      5568262 :     DECL_IN_AGGR_P (decl) = 1;
    1215              : 
    1216     16623577 :   if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
    1217     16623577 :       && TYPE_DOMAIN (TREE_TYPE (decl)) == NULL_TREE)
    1218       108645 :     SET_VAR_HAD_UNKNOWN_BOUND (decl);
    1219              : 
    1220     16623577 :   if (init)
    1221              :     {
    1222              :       /* Similarly to start_decl_1, we want to complete the type in order
    1223              :          to do the right thing in cp_apply_type_quals_to_decl, possibly
    1224              :          clear TYPE_QUAL_CONST (c++/65579).  */
    1225     12184778 :       tree type = TREE_TYPE (decl) = complete_type (TREE_TYPE (decl));
    1226     12184778 :       cp_apply_type_quals_to_decl (cp_type_quals (type), decl);
    1227              :     }
    1228              : 
    1229     16623577 :   cp_finish_decl (decl, init, init_const_expr_p, asmspec_tree, flags);
    1230     16623577 :   check_module_decl_linkage (decl);
    1231              : }
    1232              : 
    1233              : /* DECLARATOR and DECLSPECS correspond to a class member.  The other
    1234              :    parameters are as for cp_finish_decl.  Return the DECL for the
    1235              :    class member declared.  */
    1236              : 
    1237              : tree
    1238     71459834 : grokfield (const cp_declarator *declarator,
    1239              :            cp_decl_specifier_seq *declspecs,
    1240              :            tree init, bool init_const_expr_p,
    1241              :            tree asmspec_tree,
    1242              :            tree attrlist)
    1243              : {
    1244     71459834 :   tree value;
    1245     71459834 :   const char *asmspec = 0;
    1246     71459834 :   int flags;
    1247              : 
    1248     71459834 :   if (init
    1249     12865354 :       && TREE_CODE (init) == TREE_LIST
    1250            0 :       && TREE_VALUE (init) == error_mark_node
    1251     71459834 :       && TREE_CHAIN (init) == NULL_TREE)
    1252              :     init = NULL_TREE;
    1253              : 
    1254     71459834 :   int initialized;
    1255     71459834 :   if (init == ridpointers[(int)RID_DELETE]
    1256     71459834 :       || (init
    1257      9269663 :           && TREE_CODE (init) == STRING_CST
    1258          178 :           && TREE_TYPE (init) == ridpointers[(int)RID_DELETE]))
    1259              :     initialized = SD_DELETED;
    1260     67863965 :   else if (init == ridpointers[(int)RID_DEFAULT])
    1261              :     initialized = SD_DEFAULTED;
    1262     61179009 :   else if (init)
    1263              :     initialized = SD_INITIALIZED;
    1264              :   else
    1265     58594480 :     initialized = SD_UNINITIALIZED;
    1266              : 
    1267     71459834 :   value = grokdeclarator (declarator, declspecs, FIELD, initialized, &attrlist);
    1268     71459828 :   if (! value || value == error_mark_node)
    1269              :     /* friend or constructor went bad.  */
    1270          340 :     return error_mark_node;
    1271     71459488 :   if (TREE_TYPE (value) == error_mark_node)
    1272              :     return value;
    1273              : 
    1274     71459329 :   if (TREE_CODE (value) == TYPE_DECL && init)
    1275              :     {
    1276            6 :       error_at (cp_expr_loc_or_loc (init, DECL_SOURCE_LOCATION (value)),
    1277              :                 "typedef %qD is initialized (use %qs instead)",
    1278              :                 value, "decltype");
    1279            6 :       init = NULL_TREE;
    1280              :     }
    1281              : 
    1282              :   /* Pass friendly classes back.  */
    1283     71459329 :   if (value == void_type_node)
    1284              :     return value;
    1285              : 
    1286     71459329 :   if (DECL_NAME (value)
    1287     71459329 :       && TREE_CODE (DECL_NAME (value)) == TEMPLATE_ID_EXPR)
    1288              :     {
    1289            3 :       error_at (declarator->id_loc,
    1290              :                 "explicit template argument list not allowed");
    1291            3 :       return error_mark_node;
    1292              :     }
    1293              : 
    1294              :   /* Stash away type declarations.  */
    1295     71459326 :   if (TREE_CODE (value) == TYPE_DECL)
    1296              :     {
    1297     25061155 :       DECL_NONLOCAL (value) = 1;
    1298     25061155 :       DECL_CONTEXT (value) = current_class_type;
    1299              : 
    1300     25061155 :       if (attrlist)
    1301              :         {
    1302        23803 :           int attrflags = 0;
    1303              : 
    1304              :           /* If this is a typedef that names the class for linkage purposes
    1305              :              (7.1.3p8), apply any attributes directly to the type.  */
    1306        23803 :           if (TYPE_DECL_FOR_LINKAGE_PURPOSES_P (value))
    1307           12 :             attrflags = ATTR_FLAG_TYPE_IN_PLACE;
    1308              : 
    1309        23803 :           cplus_decl_attributes (&value, attrlist, attrflags);
    1310              :         }
    1311              : 
    1312     25061155 :       if (decl_spec_seq_has_spec_p (declspecs, ds_typedef)
    1313     25061155 :           && TREE_TYPE (value) != error_mark_node
    1314     50122310 :           && TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (value))) != value)
    1315     25060518 :         set_underlying_type (value);
    1316              : 
    1317              :       /* It's important that push_template_decl below follows
    1318              :          set_underlying_type above so that the created template
    1319              :          carries the properly set type of VALUE.  */
    1320     25061155 :       if (processing_template_decl)
    1321     20706299 :         value = push_template_decl (value);
    1322              : 
    1323     25061155 :       record_locally_defined_typedef (value);
    1324     25061155 :       return value;
    1325              :     }
    1326              : 
    1327     46398171 :   int friendp = decl_spec_seq_has_spec_p (declspecs, ds_friend);
    1328              : 
    1329     46398171 :   if (!friendp && DECL_IN_AGGR_P (value))
    1330              :     {
    1331            0 :       error ("%qD is already defined in %qT", value, DECL_CONTEXT (value));
    1332            0 :       return void_type_node;
    1333              :     }
    1334              : 
    1335     46398171 :   if (asmspec_tree && asmspec_tree != error_mark_node)
    1336          194 :     asmspec = TREE_STRING_POINTER (asmspec_tree);
    1337              : 
    1338     46398171 :   if (init)
    1339              :     {
    1340     12865291 :       if (TREE_CODE (value) == FUNCTION_DECL)
    1341              :         {
    1342     10649408 :           if (init == ridpointers[(int)RID_DELETE]
    1343     10649408 :               || (TREE_CODE (init) == STRING_CST
    1344          178 :                   && TREE_TYPE (init) == ridpointers[(int)RID_DELETE]))
    1345              :             {
    1346      3595863 :               DECL_DELETED_FN (value) = 1;
    1347      3595863 :               DECL_DECLARED_INLINE_P (value) = 1;
    1348      3595863 :               if (TREE_CODE (init) == STRING_CST)
    1349          178 :                 DECL_INITIAL (value) = init;
    1350              :             }
    1351      7053545 :           else if (init == ridpointers[(int)RID_DEFAULT])
    1352              :             {
    1353      6684953 :               if (defaultable_fn_check (value))
    1354              :                 {
    1355      6684874 :                   DECL_DEFAULTED_FN (value) = 1;
    1356      6684874 :                   DECL_INITIALIZED_IN_CLASS_P (value) = 1;
    1357      6684874 :                   DECL_DECLARED_INLINE_P (value) = 1;
    1358              :                   /* grokfndecl set this to error_mark_node, but we want to
    1359              :                      leave it unset until synthesize_method.  */
    1360      6684874 :                   DECL_INITIAL (value) = NULL_TREE;
    1361              :                 }
    1362              :             }
    1363       368592 :           else if (TREE_CODE (init) == DEFERRED_PARSE)
    1364            0 :             error ("invalid initializer for member function %qD", value);
    1365       368592 :           else if (TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE)
    1366              :             {
    1367       368583 :               if (integer_zerop (init))
    1368       368544 :                 DECL_PURE_VIRTUAL_P (value) = 1;
    1369           39 :               else if (error_operand_p (init))
    1370              :                 ; /* An error has already been reported.  */
    1371              :               else
    1372            0 :                 error ("invalid initializer for member function %qD",
    1373              :                        value);
    1374              :             }
    1375              :           else
    1376              :             {
    1377            9 :               gcc_assert (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE);
    1378            9 :               location_t iloc
    1379            9 :                 = cp_expr_loc_or_loc (init, DECL_SOURCE_LOCATION (value));
    1380            9 :               if (friendp)
    1381            3 :                 error_at (iloc, "initializer specified for friend "
    1382              :                           "function %qD", value);
    1383              :               else
    1384            6 :                 error_at (iloc, "initializer specified for static "
    1385              :                           "member function %qD", value);
    1386              :             }
    1387              :         }
    1388      2215883 :       else if (TREE_CODE (value) == FIELD_DECL)
    1389              :         /* C++11 NSDMI, keep going.  */;
    1390            0 :       else if (!VAR_P (value))
    1391            0 :         gcc_unreachable ();
    1392              :     }
    1393              : 
    1394              :   /* Pass friend decls back.  */
    1395     46398171 :   if ((TREE_CODE (value) == FUNCTION_DECL
    1396     19866492 :        || TREE_CODE (value) == TEMPLATE_DECL)
    1397     46398228 :       && DECL_CONTEXT (value) != current_class_type)
    1398              :     {
    1399      2029570 :       if (attrlist)
    1400            0 :         cplus_decl_attributes (&value, attrlist, 0);
    1401      2029570 :       return value;
    1402              :     }
    1403              : 
    1404              :   /* Need to set this before push_template_decl.  */
    1405     44368601 :   if (VAR_P (value))
    1406       694093 :     DECL_CONTEXT (value) = current_class_type;
    1407              : 
    1408     44368601 :   if (processing_template_decl && VAR_OR_FUNCTION_DECL_P (value))
    1409              :     {
    1410     15401082 :       value = push_template_decl (value);
    1411     15401082 :       if (error_operand_p (value))
    1412            7 :         return error_mark_node;
    1413              :     }
    1414              : 
    1415     44368594 :   if (attrlist)
    1416       862820 :     cplus_decl_attributes (&value, attrlist, 0);
    1417              : 
    1418     44368594 :   if (init && DIRECT_LIST_INIT_P (init))
    1419              :     flags = LOOKUP_NORMAL;
    1420              :   else
    1421              :     flags = LOOKUP_IMPLICIT;
    1422              : 
    1423     44368594 :   switch (TREE_CODE (value))
    1424              :     {
    1425       694089 :     case VAR_DECL:
    1426       694089 :       finish_static_data_member_decl (value, init, init_const_expr_p,
    1427              :                                       asmspec_tree, flags);
    1428       694089 :       return value;
    1429              : 
    1430     19172342 :     case FIELD_DECL:
    1431     19172342 :       if (asmspec)
    1432            6 :         error ("%<asm%> specifiers are not permitted on non-static data members");
    1433     19172342 :       if (DECL_INITIAL (value) == error_mark_node)
    1434            0 :         init = error_mark_node;
    1435     19172342 :       cp_finish_decl (value, init, /*init_const_expr_p=*/false,
    1436              :                       NULL_TREE, flags);
    1437     19172342 :       DECL_IN_AGGR_P (value) = 1;
    1438     19172342 :       return value;
    1439              : 
    1440     24502163 :     case  FUNCTION_DECL:
    1441     24502163 :       if (asmspec)
    1442           92 :         set_user_assembler_name (value, asmspec);
    1443              : 
    1444     24502163 :       cp_finish_decl (value,
    1445              :                       /*init=*/NULL_TREE,
    1446              :                       /*init_const_expr_p=*/false,
    1447              :                       asmspec_tree, flags);
    1448              : 
    1449              :       /* Pass friends back this way.  */
    1450     24502163 :       if (DECL_UNIQUE_FRIEND_P (value))
    1451            0 :         return void_type_node;
    1452              : 
    1453     24502163 :       DECL_IN_AGGR_P (value) = 1;
    1454     24502163 :       return value;
    1455              : 
    1456            0 :     default:
    1457            0 :       gcc_unreachable ();
    1458              :     }
    1459              :   return NULL_TREE;
    1460              : }
    1461              : 
    1462              : /* Like grokfield, but just for the initial grok of an initialized static
    1463              :    member.  Used to be able to push the new decl before parsing the
    1464              :    initialiser.  */
    1465              : 
    1466              : tree
    1467     12184785 : start_initialized_static_member (const cp_declarator *declarator,
    1468              :                                  cp_decl_specifier_seq *declspecs,
    1469              :                                  tree attrlist)
    1470              : {
    1471     12184785 :   tree value = grokdeclarator (declarator, declspecs, FIELD, SD_INITIALIZED,
    1472     12184785 :                                &attrlist);
    1473     12184785 :   if (!value || error_operand_p (value))
    1474            3 :     return error_mark_node;
    1475     12184782 :   if (TREE_CODE (value) == TYPE_DECL)
    1476              :     {
    1477            0 :       error_at (declarator->init_loc,
    1478              :                 "typedef %qD is initialized (use %qs instead)",
    1479              :                 value, "decltype");
    1480            0 :       return error_mark_node;
    1481              :     }
    1482     12184782 :   else if (TREE_CODE (value) == FUNCTION_DECL)
    1483              :     {
    1484            0 :       if (TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE)
    1485            0 :         error_at (declarator->init_loc,
    1486              :                   "invalid initializer for member function %qD",
    1487              :                   value);
    1488            0 :       else if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE)
    1489            0 :         error_at (declarator->init_loc,
    1490              :                   "initializer specified for static member function %qD",
    1491              :                   value);
    1492              :       else
    1493            0 :         gcc_unreachable ();
    1494            0 :       return error_mark_node;
    1495              :     }
    1496     12184782 :   else if (TREE_CODE (value) == FIELD_DECL)
    1497              :     {
    1498              :       /* NSDM marked 'static', grokdeclarator has already errored.  */
    1499            3 :       gcc_checking_assert (seen_error ());
    1500            3 :       return error_mark_node;
    1501              :     }
    1502     12184779 :   gcc_checking_assert (VAR_P (value));
    1503              : 
    1504     12184779 :   DECL_CONTEXT (value) = current_class_type;
    1505     12184779 :   DECL_INITIALIZED_IN_CLASS_P (value) = true;
    1506              : 
    1507     12184779 :   if (processing_template_decl)
    1508              :     {
    1509      2711236 :       value = push_template_decl (value);
    1510      2711236 :       if (error_operand_p (value))
    1511            0 :         return error_mark_node;
    1512              :     }
    1513              : 
    1514     12184779 :   if (attrlist)
    1515        95543 :     cplus_decl_attributes (&value, attrlist, 0);
    1516              : 
    1517              :   /* When defining a template we need to register the TEMPLATE_DECL.  */
    1518     12184779 :   tree maybe_template = value;
    1519     12184779 :   if (template_parm_scope_p ())
    1520              :     {
    1521       371333 :       if (!DECL_TEMPLATE_SPECIALIZATION (value))
    1522       329563 :         maybe_template = DECL_TI_TEMPLATE (value);
    1523              :       else
    1524              :         maybe_template = NULL_TREE;
    1525              :     }
    1526     12143009 :   if (maybe_template)
    1527     12143009 :     finish_member_declaration (maybe_template);
    1528              : 
    1529     12184779 :   return value;
    1530              : }
    1531              : 
    1532              : /* Whether DECL is a static data member initialized at the point
    1533              :    of declaration within its class.  */
    1534              : 
    1535              : bool
    1536     34445224 : is_static_data_member_initialized_in_class (tree decl)
    1537              : {
    1538     34445224 :   if (!decl || decl == error_mark_node)
    1539              :     return false;
    1540              : 
    1541     34444405 :   tree inner = STRIP_TEMPLATE (decl);
    1542     20800322 :   return (inner
    1543     34444405 :           && VAR_P (inner)
    1544     12669136 :           && DECL_CLASS_SCOPE_P (inner)
    1545     33465218 :           && DECL_INITIALIZED_IN_CLASS_P (inner));
    1546              : }
    1547              : 
    1548              : /* Finish a declaration prepared with start_initialized_static_member.  */
    1549              : 
    1550              : void
    1551     12184782 : finish_initialized_static_member (tree decl, tree init, tree asmspec)
    1552              : {
    1553     12184782 :   if (decl == error_mark_node)
    1554              :     return;
    1555     12184776 :   gcc_checking_assert (is_static_data_member_initialized_in_class (decl));
    1556              : 
    1557     12184776 :   int flags;
    1558     12184776 :   if (init && DIRECT_LIST_INIT_P (init))
    1559              :     flags = LOOKUP_NORMAL;
    1560              :   else
    1561              :     flags = LOOKUP_IMPLICIT;
    1562     12184776 :   finish_static_data_member_decl (decl, init, /*init_const_expr_p=*/true,
    1563              :                                   asmspec, flags);
    1564              : }
    1565              : 
    1566              : /* Like `grokfield', but for bitfields.
    1567              :    WIDTH is the width of the bitfield, a constant expression.
    1568              :    The other parameters are as for grokfield.  */
    1569              : 
    1570              : tree
    1571       601833 : grokbitfield (const cp_declarator *declarator,
    1572              :               cp_decl_specifier_seq *declspecs, tree width, tree init,
    1573              :               tree attrlist)
    1574              : {
    1575       601833 :   tree value = grokdeclarator (declarator, declspecs, BITFIELD,
    1576       601833 :                                init != NULL_TREE, &attrlist);
    1577              : 
    1578       601833 :   if (value == error_mark_node)
    1579              :     return NULL_TREE; /* friends went bad.  */
    1580              : 
    1581       601827 :   tree type = TREE_TYPE (value);
    1582       601827 :   if (type == error_mark_node)
    1583              :     return value;
    1584              : 
    1585              :   /* Pass friendly classes back.  */
    1586       601780 :   if (VOID_TYPE_P (value))
    1587            0 :     return void_type_node;
    1588              : 
    1589       601780 :   if (!INTEGRAL_OR_ENUMERATION_TYPE_P (type)
    1590       601780 :       && (INDIRECT_TYPE_P (type) || !dependent_type_p (type)))
    1591              :     {
    1592           33 :       error_at (DECL_SOURCE_LOCATION (value),
    1593              :                 "bit-field %qD with non-integral type %qT",
    1594              :                 value, type);
    1595           33 :       return error_mark_node;
    1596              :     }
    1597              : 
    1598       601747 :   if (TREE_CODE (value) == TYPE_DECL)
    1599              :     {
    1600            6 :       error_at (DECL_SOURCE_LOCATION (value),
    1601              :                 "cannot declare %qD to be a bit-field type", value);
    1602            6 :       return NULL_TREE;
    1603              :     }
    1604              : 
    1605              :   /* Usually, finish_struct_1 catches bitfields with invalid types.
    1606              :      But, in the case of bitfields with function type, we confuse
    1607              :      ourselves into thinking they are member functions, so we must
    1608              :      check here.  */
    1609       601741 :   if (TREE_CODE (value) == FUNCTION_DECL)
    1610              :     {
    1611            3 :       error_at (DECL_SOURCE_LOCATION (value),
    1612              :                 "cannot declare bit-field %qD with function type", value);
    1613            3 :       return NULL_TREE;
    1614              :     }
    1615              : 
    1616       601738 :   if (TYPE_WARN_IF_NOT_ALIGN (type))
    1617              :     {
    1618            9 :       error_at (DECL_SOURCE_LOCATION (value), "cannot declare bit-field "
    1619              :                 "%qD with %<warn_if_not_aligned%> type", value);
    1620            9 :       return NULL_TREE;
    1621              :     }
    1622              : 
    1623       601729 :   if (DECL_IN_AGGR_P (value))
    1624              :     {
    1625            0 :       error ("%qD is already defined in the class %qT", value,
    1626            0 :              DECL_CONTEXT (value));
    1627            0 :       return void_type_node;
    1628              :     }
    1629              : 
    1630       601729 :   if (TREE_STATIC (value))
    1631              :     {
    1632            6 :       error_at (DECL_SOURCE_LOCATION (value),
    1633              :                 "static member %qD cannot be a bit-field", value);
    1634            6 :       return NULL_TREE;
    1635              :     }
    1636              : 
    1637              :   /* [class.bit]/2 "An unnamed bit-field shall not be declared with
    1638              :      a cv-qualified type."  */
    1639       601723 :   if (!DECL_NAME (value) && TYPE_QUALS (type) != TYPE_UNQUALIFIED)
    1640           18 :     pedwarn (DECL_SOURCE_LOCATION (value), 0,
    1641              :              "unnamed bit-field cannot be cv-qualified");
    1642              : 
    1643       601723 :   int flags = LOOKUP_IMPLICIT;
    1644       601723 :   if (init && DIRECT_LIST_INIT_P (init))
    1645              :     flags = LOOKUP_NORMAL;
    1646       601723 :   cp_finish_decl (value, init, false, NULL_TREE, flags);
    1647              : 
    1648       601723 :   if (width != error_mark_node)
    1649              :     {
    1650              :       /* The width must be an integer type.  */
    1651       601706 :       if (!type_dependent_expression_p (width)
    1652       601706 :           && !INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (width)))
    1653           12 :         error ("width of bit-field %qD has non-integral type %qT", value,
    1654           12 :                TREE_TYPE (width));
    1655       601694 :       else if (!check_for_bare_parameter_packs (width))
    1656              :         {
    1657              :           /* Temporarily stash the width in DECL_BIT_FIELD_REPRESENTATIVE.
    1658              :              check_bitfield_decl picks it from there later and sets DECL_SIZE
    1659              :              accordingly.  */
    1660       601688 :           DECL_BIT_FIELD_REPRESENTATIVE (value) = width;
    1661       601688 :           SET_DECL_C_BIT_FIELD (value);
    1662              :         }
    1663              :     }
    1664              : 
    1665       601723 :   DECL_IN_AGGR_P (value) = 1;
    1666              : 
    1667       601723 :   if (attrlist)
    1668         1203 :     cplus_decl_attributes (&value, attrlist, /*flags=*/0);
    1669              : 
    1670       601723 :   return value;
    1671              : }
    1672              : 
    1673              : 
    1674              : /* Returns true iff ATTR is an attribute which needs to be applied at
    1675              :    instantiation time rather than template definition time.  */
    1676              : 
    1677              : static bool
    1678     16719611 : is_late_template_attribute (tree attr, tree decl)
    1679              : {
    1680     16719611 :   tree name = get_attribute_name (attr);
    1681     16719611 :   tree args = TREE_VALUE (attr);
    1682     16719611 :   const struct attribute_spec *spec
    1683     16719611 :     = lookup_attribute_spec (TREE_PURPOSE (attr));
    1684     16719611 :   tree arg;
    1685              : 
    1686              :   /* Handle all annotations as late, so that they aren't incorrectly
    1687              :      reordered if some have dependent expressions and others don't.  */
    1688     16719611 :   if (annotation_p (attr))
    1689              :     return true;
    1690              : 
    1691     16719571 :   if (!spec)
    1692              :     /* Unknown attribute.  */
    1693              :     return false;
    1694              : 
    1695              :   /* Attribute weak handling wants to write out assembly right away.  */
    1696     16719537 :   if (is_attribute_p ("weak", name))
    1697              :     return true;
    1698              : 
    1699              :   /* Attributes used and unused or std attribute maybe_unused are applied
    1700              :      directly to typedefs for the benefit of
    1701              :      maybe_warn_unused_local_typedefs.  */
    1702     16719534 :   if (TREE_CODE (decl) == TYPE_DECL
    1703     16719534 :       && (is_attribute_p ("unused", name)
    1704        16558 :           || is_attribute_p ("used", name)
    1705        16552 :           || (is_attribute_p ("maybe_unused", name)
    1706           10 :               && get_attribute_namespace (attr) == NULL_TREE)))
    1707          244 :     return false;
    1708              : 
    1709              :   /* Attribute tls_model wants to modify the symtab.  */
    1710     16719290 :   if (is_attribute_p ("tls_model", name))
    1711              :     return true;
    1712              : 
    1713              :   /* #pragma omp declare simd attribute needs to be always deferred.  */
    1714     16719287 :   if (flag_openmp
    1715     16719287 :       && is_attribute_p ("omp declare simd", name))
    1716              :     return true;
    1717              : 
    1718     16718395 :   if (args == error_mark_node)
    1719              :     return false;
    1720              : 
    1721              :   /* An attribute pack is clearly dependent.  */
    1722     16718395 :   if (args && PACK_EXPANSION_P (args))
    1723              :     return true;
    1724              : 
    1725              :   /* If any of the arguments are dependent expressions, we can't evaluate
    1726              :      the attribute until instantiation time.  */
    1727     17610437 :   for (arg = args; arg; arg = TREE_CHAIN (arg))
    1728              :     {
    1729      1021076 :       tree t = TREE_VALUE (arg);
    1730              : 
    1731              :       /* If the first attribute argument is an identifier, only consider
    1732              :          second and following arguments.  Attributes like mode, format,
    1733              :          cleanup and several target specific attributes aren't late
    1734              :          just because they have an IDENTIFIER_NODE as first argument.  */
    1735      1058362 :       if (arg == args
    1736       980848 :           && get_attribute_namespace (attr) == gnu_identifier
    1737       823171 :           && attribute_takes_identifier_p (name)
    1738      1021076 :           && identifier_p (t))
    1739        37286 :         continue;
    1740              : 
    1741       983790 :       if (value_dependent_expression_p (t))
    1742              :         return true;
    1743              :     }
    1744              : 
    1745     16589361 :   if (TREE_CODE (decl) == TYPE_DECL
    1746     16573829 :       || TYPE_P (decl)
    1747     16209041 :       || spec->type_required)
    1748              :     {
    1749       774428 :       tree type = TYPE_P (decl) ? decl : TREE_TYPE (decl);
    1750              : 
    1751       409640 :       if (!type)
    1752              :         return true;
    1753              : 
    1754              :       /* We can't apply any attributes to a completely unknown type until
    1755              :          instantiation time.  */
    1756       774425 :       enum tree_code code = TREE_CODE (type);
    1757       774425 :       if (code == TEMPLATE_TYPE_PARM
    1758       774425 :           || code == BOUND_TEMPLATE_TEMPLATE_PARM
    1759       774013 :           || code == TYPENAME_TYPE)
    1760              :         return true;
    1761              :       /* Also defer most attributes on dependent types.  This is not
    1762              :          necessary in all cases, but is the better default.  */
    1763       769693 :       else if (dependent_type_p (type)
    1764              :                /* But some attributes specifically apply to templates.  */
    1765       696647 :                && !is_attribute_p ("abi_tag", name)
    1766       696623 :                && !is_attribute_p ("deprecated", name)
    1767       356574 :                && !is_attribute_p ("unavailable", name)
    1768      1126261 :                && !is_attribute_p ("visibility", name))
    1769              :         return true;
    1770              :       else
    1771              :         return false;
    1772              :     }
    1773              :   else
    1774              :     return false;
    1775              : }
    1776              : 
    1777              : /* ATTR_P is a list of attributes.  Remove any attributes which need to be
    1778              :    applied at instantiation time and return them.  If IS_DEPENDENT is true,
    1779              :    the declaration itself is dependent, so all attributes should be applied
    1780              :    at instantiation time.  */
    1781              : 
    1782              : tree
    1783    235526529 : splice_template_attributes (tree *attr_p, tree decl)
    1784              : {
    1785    235526529 :   tree *p = attr_p;
    1786    235526529 :   tree late_attrs = NULL_TREE;
    1787    235526529 :   tree *q = &late_attrs;
    1788              : 
    1789    235526529 :   if (!p || *p == error_mark_node)
    1790              :     return NULL_TREE;
    1791              : 
    1792    252246140 :   for (; *p; )
    1793              :     {
    1794     16719611 :       if (is_late_template_attribute (*p, decl))
    1795              :         {
    1796       491263 :           ATTR_IS_DEPENDENT (*p) = 1;
    1797       491263 :           *q = *p;
    1798       491263 :           *p = TREE_CHAIN (*p);
    1799       491263 :           q = &TREE_CHAIN (*q);
    1800       491263 :           *q = NULL_TREE;
    1801              :         }
    1802              :       else
    1803     16228348 :         p = &TREE_CHAIN (*p);
    1804              :     }
    1805              : 
    1806    235526529 :   return late_attrs;
    1807              : }
    1808              : 
    1809              : /* Attach any LATE_ATTRS to DECL_P, after the non-dependent attributes have
    1810              :    been applied by a previous call to decl_attributes.  */
    1811              : 
    1812              : static void
    1813       489231 : save_template_attributes (tree late_attrs, tree *decl_p, int flags)
    1814              : {
    1815       489231 :   tree *q;
    1816              : 
    1817       489231 :   if (!late_attrs)
    1818              :     return;
    1819              : 
    1820       489231 :   if (DECL_P (*decl_p))
    1821       477379 :     q = &DECL_ATTRIBUTES (*decl_p);
    1822              :   else
    1823        11852 :     q = &TYPE_ATTRIBUTES (*decl_p);
    1824              : 
    1825       489231 :   tree old_attrs = *q;
    1826              : 
    1827              :   /* Place the late attributes at the beginning of the attribute
    1828              :      list.  */
    1829       489231 :   late_attrs = chainon (late_attrs, *q);
    1830       489231 :   if (*q != late_attrs
    1831       489231 :       && !DECL_P (*decl_p)
    1832        11852 :       && !(flags & ATTR_FLAG_TYPE_IN_PLACE))
    1833              :     {
    1834           52 :       if (!dependent_type_p (*decl_p))
    1835           12 :         *decl_p = cp_build_type_attribute_variant (*decl_p, late_attrs);
    1836              :       else
    1837              :         {
    1838           40 :           *decl_p = build_variant_type_copy (*decl_p);
    1839           40 :           TYPE_ATTRIBUTES (*decl_p) = late_attrs;
    1840              :         }
    1841              :     }
    1842              :   else
    1843       489179 :     *q = late_attrs;
    1844              : 
    1845       489231 :   if (!DECL_P (*decl_p) && *decl_p == TYPE_MAIN_VARIANT (*decl_p))
    1846              :     {
    1847              :       /* We've added new attributes directly to the main variant, so
    1848              :          now we need to update all of the other variants to include
    1849              :          these new attributes.  */
    1850        11812 :       tree variant;
    1851        11952 :       for (variant = TYPE_NEXT_VARIANT (*decl_p); variant;
    1852          140 :            variant = TYPE_NEXT_VARIANT (variant))
    1853              :         {
    1854          140 :           gcc_assert (TYPE_ATTRIBUTES (variant) == old_attrs);
    1855          140 :           TYPE_ATTRIBUTES (variant) = TYPE_ATTRIBUTES (*decl_p);
    1856              :         }
    1857              :     }
    1858              : }
    1859              : 
    1860              : /* True if ATTRS contains any dependent attributes that affect type
    1861              :    identity.  */
    1862              : 
    1863              : bool
    1864   1882845716 : any_dependent_type_attributes_p (tree attrs)
    1865              : {
    1866   1915092921 :   for (tree a = attrs; a; a = TREE_CHAIN (a))
    1867     32247969 :     if (ATTR_IS_DEPENDENT (a))
    1868              :       {
    1869      1979926 :         const attribute_spec *as = lookup_attribute_spec (TREE_PURPOSE (a));
    1870      1979926 :         if (as && as->affects_type_identity)
    1871              :           return true;
    1872              :       }
    1873              :   return false;
    1874              : }
    1875              : 
    1876              : /* Return true iff ATTRS are acceptable attributes to be applied in-place
    1877              :    to a typedef which gives a previously unnamed class or enum a name for
    1878              :    linkage purposes.  */
    1879              : 
    1880              : bool
    1881       390547 : attributes_naming_typedef_ok (tree attrs)
    1882              : {
    1883       402187 :   for (; attrs; attrs = TREE_CHAIN (attrs))
    1884              :     {
    1885        11643 :       tree name = get_attribute_name (attrs);
    1886        11643 :       if (is_attribute_p ("vector_size", name))
    1887              :         return false;
    1888              :     }
    1889              :   return true;
    1890              : }
    1891              : 
    1892              : /* Like reconstruct_complex_type, but handle also template trees.  */
    1893              : 
    1894              : tree
    1895        30713 : cp_reconstruct_complex_type (tree type, tree bottom)
    1896              : {
    1897        30713 :   tree inner, outer;
    1898              : 
    1899        30713 :   if (TYPE_PTR_P (type))
    1900              :     {
    1901           39 :       inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom);
    1902           39 :       outer = build_pointer_type_for_mode (inner, TYPE_MODE (type),
    1903           39 :                                            TYPE_REF_CAN_ALIAS_ALL (type));
    1904              :     }
    1905              :   else if (TYPE_REF_P (type))
    1906              :     {
    1907           12 :       inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom);
    1908           12 :       outer = build_reference_type_for_mode (inner, TYPE_MODE (type),
    1909           12 :                                              TYPE_REF_CAN_ALIAS_ALL (type));
    1910              :     }
    1911              :   else if (TREE_CODE (type) == ARRAY_TYPE)
    1912              :     {
    1913           30 :       inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom);
    1914           30 :       outer = build_cplus_array_type (inner, TYPE_DOMAIN (type));
    1915              :       /* Don't call cp_build_qualified_type on ARRAY_TYPEs, the
    1916              :          element type qualification will be handled by the recursive
    1917              :          cp_reconstruct_complex_type call and cp_build_qualified_type
    1918              :          for ARRAY_TYPEs changes the element type.  */
    1919           30 :       return outer;
    1920              :     }
    1921              :   else if (TREE_CODE (type) == FUNCTION_TYPE)
    1922              :     {
    1923          131 :       inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom);
    1924          131 :       outer = build_function_type (inner, TYPE_ARG_TYPES (type),
    1925          131 :                                    TYPE_NO_NAMED_ARGS_STDARG_P (type));
    1926          131 :       outer = apply_memfn_quals (outer, type_memfn_quals (type));
    1927              :     }
    1928              :   else if (TREE_CODE (type) == METHOD_TYPE)
    1929              :     {
    1930           12 :       inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom);
    1931              :       /* The build_method_type_directly() routine prepends 'this' to argument list,
    1932              :          so we must compensate by getting rid of it.  */
    1933           12 :       outer
    1934              :         = build_method_type_directly
    1935           12 :             (class_of_this_parm (type), inner,
    1936           12 :              TREE_CHAIN (TYPE_ARG_TYPES (type)));
    1937              :     }
    1938              :   else if (TREE_CODE (type) == OFFSET_TYPE)
    1939              :     {
    1940            3 :       inner = cp_reconstruct_complex_type (TREE_TYPE (type), bottom);
    1941            3 :       outer = build_offset_type (TYPE_OFFSET_BASETYPE (type), inner);
    1942              :     }
    1943              :   else
    1944              :     return bottom;
    1945              : 
    1946          197 :   if (TYPE_ATTRIBUTES (type))
    1947            0 :     outer = cp_build_type_attribute_variant (outer, TYPE_ATTRIBUTES (type));
    1948          197 :   outer = cp_build_qualified_type (outer, cp_type_quals (type));
    1949          197 :   outer = cxx_copy_lang_qualifiers (outer, type);
    1950              : 
    1951          197 :   return outer;
    1952              : }
    1953              : 
    1954              : /* Replaces any constexpr expression that may be into the attributes
    1955              :    arguments with their reduced value.  */
    1956              : 
    1957              : void
    1958    378188757 : cp_check_const_attributes (tree attributes)
    1959              : {
    1960    378188757 :   if (attributes == error_mark_node)
    1961              :     return;
    1962              : 
    1963              :   tree attr;
    1964    417049638 :   for (attr = attributes; attr; attr = TREE_CHAIN (attr))
    1965              :     {
    1966              :       /* Annotation arguments are handled in handle_annotation_attribute.  */
    1967     38860881 :       if (annotation_p (attr))
    1968          379 :         continue;
    1969              : 
    1970     38860502 :       tree arg;
    1971              :       /* As we implement alignas using gnu::aligned attribute and
    1972              :          alignas argument is a constant expression, force manifestly
    1973              :          constant evaluation of aligned attribute argument.  */
    1974     38860502 :       bool manifestly_const_eval
    1975     38860502 :         = is_attribute_p ("aligned", get_attribute_name (attr));
    1976     50635219 :       for (arg = TREE_VALUE (attr); arg && TREE_CODE (arg) == TREE_LIST;
    1977     11774717 :            arg = TREE_CHAIN (arg))
    1978              :         {
    1979     11774717 :           tree expr = TREE_VALUE (arg);
    1980     11774717 :           if (EXPR_P (expr))
    1981         7190 :             TREE_VALUE (arg)
    1982         3595 :               = fold_non_dependent_expr (expr, tf_warning_or_error,
    1983              :                                          manifestly_const_eval);
    1984              :         }
    1985              :     }
    1986              : }
    1987              : 
    1988              : /* Copies hot or cold attributes to a function FN if present on the
    1989              :    encapsulating class, struct, or union TYPE.  */
    1990              : 
    1991              : void
    1992     24165730 : maybe_propagate_warmth_attributes (tree fn, tree type)
    1993              : {
    1994     24165730 :   if (fn == NULL_TREE || type == NULL_TREE
    1995     24165730 :       || !(TREE_CODE (type) == RECORD_TYPE
    1996              :            || TREE_CODE (type) == UNION_TYPE))
    1997              :     return;
    1998              : 
    1999     24165730 :   tree has_cold_attr = lookup_attribute ("cold", TYPE_ATTRIBUTES (type));
    2000     24165730 :   tree has_hot_attr = lookup_attribute ("hot", TYPE_ATTRIBUTES (type));
    2001              : 
    2002     24165730 :   if (has_cold_attr || has_hot_attr)
    2003              :     {
    2004              :       /* Transparently ignore the new warmth attribute if it
    2005              :          conflicts with a present function attribute.  Otherwise
    2006              :          decl_attribute would still honour the present attribute,
    2007              :          but producing an undesired warning in the process.  */
    2008              : 
    2009           18 :       if (has_cold_attr)
    2010              :         {
    2011            9 :           if (lookup_attribute ("hot", DECL_ATTRIBUTES (fn)) == NULL)
    2012              :             {
    2013            9 :               tree cold_cons
    2014            9 :                 = tree_cons (get_identifier ("cold"), NULL, NULL);
    2015              : 
    2016            9 :               decl_attributes (&fn, cold_cons, 0);
    2017              :             }
    2018              :         }
    2019            9 :       else if (has_hot_attr)
    2020              :         {
    2021            9 :           if (lookup_attribute ("cold", DECL_ATTRIBUTES (fn)) == NULL)
    2022              :             {
    2023            9 :               tree hot_cons
    2024            9 :                 = tree_cons (get_identifier ("hot"), NULL, NULL);
    2025              : 
    2026            9 :               decl_attributes (&fn, hot_cons, 0);
    2027              :             }
    2028              :         }
    2029              :     }
    2030              : }
    2031              : 
    2032              : /* Return the last pushed declaration for the symbol DECL or NULL
    2033              :    when no such declaration exists.  */
    2034              : 
    2035              : static tree
    2036    378122524 : find_last_decl (tree decl)
    2037              : {
    2038    378122524 :   tree last_decl = NULL_TREE;
    2039              : 
    2040    378122524 :   if (tree name = DECL_P (decl) ? DECL_NAME (decl) : NULL_TREE)
    2041              :     {
    2042              :       /* Template specializations are matched elsewhere.  */
    2043    315403389 :       if (DECL_LANG_SPECIFIC (decl)
    2044    315403389 :           && DECL_USE_TEMPLATE (decl))
    2045              :         return NULL_TREE;
    2046              : 
    2047              :       /* Look up the declaration in its scope.  */
    2048    310613485 :       tree pushed_scope = NULL_TREE;
    2049    310613485 :       if (tree ctype = DECL_CONTEXT (decl))
    2050    238163867 :         pushed_scope = push_scope (ctype);
    2051              : 
    2052    310613485 :       last_decl = lookup_name (name);
    2053              : 
    2054    310613485 :       if (pushed_scope)
    2055    134589720 :         pop_scope (pushed_scope);
    2056              : 
    2057              :       /* The declaration may be a member conversion operator
    2058              :          or a bunch of overfloads (handle the latter below).  */
    2059    310613485 :       if (last_decl && BASELINK_P (last_decl))
    2060       176071 :         last_decl = BASELINK_FUNCTIONS (last_decl);
    2061              :     }
    2062              : 
    2063     62669116 :   if (!last_decl)
    2064    277367567 :     return NULL_TREE;
    2065              : 
    2066     95965053 :   if (DECL_P (last_decl) || TREE_CODE (last_decl) == OVERLOAD)
    2067              :     {
    2068              :       /* A set of overloads of the same function.  */
    2069    545935414 :       for (lkp_iterator iter (last_decl); iter; ++iter)
    2070              :         {
    2071    459922674 :           if (TREE_CODE (*iter) == OVERLOAD)
    2072            0 :             continue;
    2073              : 
    2074    459922674 :           tree d = *iter;
    2075              : 
    2076              :           /* We can't compare versions in the middle of processing the
    2077              :              attribute that has the version.  */
    2078    459922674 :           if (TREE_CODE (d) == FUNCTION_DECL
    2079    459922674 :               && DECL_FUNCTION_VERSIONED (d))
    2080      9933716 :             return NULL_TREE;
    2081              : 
    2082    459921540 :           if (decls_match (decl, d, /*record_decls=*/false))
    2083              :             return d;
    2084              :         }
    2085     86012740 :       return NULL_TREE;
    2086              :     }
    2087              : 
    2088              :   return NULL_TREE;
    2089              : }
    2090              : 
    2091              : /* Like decl_attributes, but handle C++ complexity.  */
    2092              : 
    2093              : void
    2094    378186772 : cplus_decl_attributes (tree *decl, tree attributes, int flags)
    2095              : {
    2096    378186772 :   if (*decl == NULL_TREE || *decl == void_type_node
    2097    378186772 :       || *decl == error_mark_node || attributes == error_mark_node)
    2098              :     return;
    2099              : 
    2100              :   /* Add implicit "omp declare target" attribute if requested.  */
    2101    378186689 :   if (vec_safe_length (scope_chain->omp_declare_target_attribute)
    2102        10866 :       && ((VAR_P (*decl)
    2103         2156 :            && (TREE_STATIC (*decl) || DECL_EXTERNAL (*decl)))
    2104         3372 :           || TREE_CODE (*decl) == FUNCTION_DECL))
    2105              :     {
    2106         1693 :       if (VAR_P (*decl)
    2107         1693 :           && DECL_CLASS_SCOPE_P (*decl))
    2108            0 :         error ("%q+D static data member inside of declare target directive",
    2109              :                *decl);
    2110              :       else
    2111              :         {
    2112         1693 :           if (VAR_P (*decl)
    2113         1693 :               && (processing_template_decl
    2114          282 :                   || !omp_mappable_type (TREE_TYPE (*decl))))
    2115           52 :             attributes
    2116           52 :               = tree_cons (get_identifier ("omp declare target implicit"),
    2117              :                            NULL_TREE, attributes);
    2118              :           else
    2119         1641 :             attributes = tree_cons (get_identifier ("omp declare target"),
    2120              :                                     NULL_TREE, attributes);
    2121         1693 :           if (TREE_CODE (*decl) == FUNCTION_DECL)
    2122              :             {
    2123         1411 :               cp_omp_declare_target_attr &last
    2124         1411 :                 = scope_chain->omp_declare_target_attribute->last ();
    2125         1411 :               int device_type = MAX (last.device_type, 0);
    2126         1411 :               if ((device_type & OMP_CLAUSE_DEVICE_TYPE_HOST) != 0
    2127         1411 :                   && !lookup_attribute ("omp declare target host",
    2128              :                                         attributes))
    2129            6 :                 attributes
    2130            6 :                   = tree_cons (get_identifier ("omp declare target host"),
    2131              :                                NULL_TREE, attributes);
    2132         1411 :               if ((device_type & OMP_CLAUSE_DEVICE_TYPE_NOHOST) != 0
    2133         1411 :                   && !lookup_attribute ("omp declare target nohost",
    2134              :                                         attributes))
    2135            6 :                 attributes
    2136            6 :                   = tree_cons (get_identifier ("omp declare target nohost"),
    2137              :                                NULL_TREE, attributes);
    2138         1411 :               if (last.indirect
    2139         1411 :                   && !lookup_attribute ("omp declare target indirect",
    2140              :                                         attributes))
    2141           21 :                 attributes
    2142           21 :                   = tree_cons (get_identifier ("omp declare target indirect"),
    2143              :                                NULL_TREE, attributes);
    2144              :             }
    2145              :         }
    2146              :     }
    2147              : 
    2148    378186689 :   tree late_attrs = NULL_TREE;
    2149    378186689 :   if (processing_template_decl)
    2150              :     {
    2151    235512958 :       if (check_for_bare_parameter_packs (attributes))
    2152              :         return;
    2153    235512949 :       late_attrs = splice_template_attributes (&attributes, *decl);
    2154              :     }
    2155              : 
    2156    378186680 :   cp_check_const_attributes (attributes);
    2157              : 
    2158    378186680 :   if (flag_openmp || flag_openmp_simd)
    2159              :     {
    2160              :       bool diagnosed = false;
    2161      1355998 :       for (tree *pa = &attributes; *pa; )
    2162              :         {
    2163       187330 :           if (get_attribute_namespace (*pa) == omp_identifier)
    2164              :             {
    2165          209 :               tree name = get_attribute_name (*pa);
    2166          209 :               if (is_attribute_p ("directive", name)
    2167            0 :                   || is_attribute_p ("sequence", name)
    2168          209 :                   || is_attribute_p ("decl", name))
    2169              :                 {
    2170          209 :                   const char *p = NULL;
    2171          209 :                   if (TREE_VALUE (*pa) == NULL_TREE)
    2172            9 :                     p = IDENTIFIER_POINTER (name);
    2173          409 :                   for (tree a = TREE_VALUE (*pa); a; a = TREE_CHAIN (a))
    2174              :                     {
    2175          200 :                       tree d = TREE_VALUE (a);
    2176          200 :                       gcc_assert (TREE_CODE (d) == DEFERRED_PARSE);
    2177          340 :                       if (TREE_PUBLIC (d)
    2178          143 :                           && (VAR_P (*decl)
    2179           10 :                               || TREE_CODE (*decl) == FUNCTION_DECL)
    2180          343 :                           && cp_maybe_parse_omp_decl (*decl, d))
    2181          140 :                         continue;
    2182           60 :                       p = TREE_PUBLIC (d) ? "decl" : "directive";
    2183              :                     }
    2184          209 :                   if (p && !diagnosed)
    2185              :                     {
    2186           69 :                       error ("%<omp::%s%> not allowed to be specified in "
    2187              :                              "this context", p);
    2188           69 :                       diagnosed = true;
    2189              :                     }
    2190          209 :                   if (p)
    2191              :                     {
    2192           69 :                       *pa = TREE_CHAIN (*pa);
    2193           69 :                       continue;
    2194              :                     }
    2195              :                 }
    2196              :             }
    2197       187261 :           pa = &TREE_CHAIN (*pa);
    2198              :         }
    2199              :     }
    2200              : 
    2201    378186680 :   if (TREE_CODE (*decl) == TEMPLATE_DECL)
    2202         1148 :     decl = &DECL_TEMPLATE_RESULT (*decl);
    2203              : 
    2204    378186680 :   if (TREE_TYPE (*decl) && TYPE_PTRMEMFUNC_P (TREE_TYPE (*decl)))
    2205              :     {
    2206        64156 :       attributes
    2207        64156 :         = decl_attributes (decl, attributes, flags | ATTR_FLAG_FUNCTION_NEXT);
    2208        64156 :       decl_attributes (&TYPE_PTRMEMFUNC_FN_TYPE_RAW (TREE_TYPE (*decl)),
    2209              :                        attributes, flags);
    2210              :     }
    2211              :   else
    2212              :     {
    2213    378122524 :       tree last_decl = find_last_decl (*decl);
    2214    378122524 :       decl_attributes (decl, attributes, flags, last_decl);
    2215              :     }
    2216              : 
    2217    378186680 :   if (late_attrs)
    2218       489231 :     save_template_attributes (late_attrs, decl, flags);
    2219              : 
    2220              :   /* Propagate deprecation out to the template.  */
    2221    378186680 :   if (TREE_DEPRECATED (*decl))
    2222      1605434 :     if (tree ti = get_template_info (*decl))
    2223              :       {
    2224       476712 :         tree tmpl = TI_TEMPLATE (ti);
    2225       476712 :         tree pattern = (TYPE_P (*decl) ? TREE_TYPE (tmpl)
    2226       476712 :                         : DECL_TEMPLATE_RESULT (tmpl));
    2227       476712 :         if (*decl == pattern)
    2228       427758 :           TREE_DEPRECATED (tmpl) = true;
    2229              :       }
    2230              : 
    2231              :   /* Likewise, propagate unavailability out to the template.  */
    2232    378186680 :   if (TREE_UNAVAILABLE (*decl))
    2233          252 :     if (tree ti = get_template_info (*decl))
    2234              :       {
    2235            9 :         tree tmpl = TI_TEMPLATE (ti);
    2236            9 :         tree pattern = (TYPE_P (*decl) ? TREE_TYPE (tmpl)
    2237            9 :                         : DECL_TEMPLATE_RESULT (tmpl));
    2238            9 :         if (*decl == pattern)
    2239            9 :           TREE_UNAVAILABLE (tmpl) = true;
    2240              :       }
    2241              : 
    2242    378186680 :   if (VAR_P (*decl) && CP_DECL_THREAD_LOCAL_P (*decl))
    2243              :     {
    2244              :       // tls_model attribute can set a stronger TLS access model.
    2245        19555 :       tls_model model = DECL_TLS_MODEL (*decl);
    2246              :       // Don't upgrade TLS model if TLS model isn't set yet.
    2247        19555 :       if (model != TLS_MODEL_NONE)
    2248              :         {
    2249        19431 :           tls_model default_model = decl_default_tls_model (*decl);
    2250        19431 :           if (default_model > model)
    2251        19209 :             set_decl_tls_model (*decl, default_model);
    2252              :         }
    2253              :     }
    2254              : 
    2255              :   /* For target_version semantics, mark any annotated function as versioned
    2256              :      so that it gets mangled even when on its own in a TU.  */
    2257              :   if (!TARGET_HAS_FMV_TARGET_ATTRIBUTE
    2258              :       && TREE_CODE (*decl) == FUNCTION_DECL
    2259              :       && get_target_version (*decl).is_valid ())
    2260              :     maybe_mark_function_versioned (*decl);
    2261              : }
    2262              : 
    2263              : /* Walks through the namespace- or function-scope anonymous union
    2264              :    OBJECT, with the indicated TYPE, building appropriate VAR_DECLs.
    2265              :    Returns one of the fields for use in the mangled name.  */
    2266              : 
    2267              : static tree
    2268          377 : build_anon_union_vars (tree type, tree object)
    2269              : {
    2270          377 :   tree main_decl = NULL_TREE;
    2271          377 :   tree field;
    2272              : 
    2273              :   /* Rather than write the code to handle the non-union case,
    2274              :      just give an error.  */
    2275          377 :   if (TREE_CODE (type) != UNION_TYPE)
    2276              :     {
    2277            6 :       error_at (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
    2278              :                 "anonymous struct not inside named type");
    2279            6 :       return error_mark_node;
    2280              :     }
    2281              : 
    2282          371 :   for (field = TYPE_FIELDS (type);
    2283         1322 :        field != NULL_TREE;
    2284          951 :        field = DECL_CHAIN (field))
    2285              :     {
    2286          951 :       tree decl;
    2287          951 :       tree ref;
    2288              : 
    2289          951 :       if (DECL_ARTIFICIAL (field))
    2290          468 :         continue;
    2291          483 :       if (TREE_CODE (field) != FIELD_DECL)
    2292              :         {
    2293            0 :           permerror (DECL_SOURCE_LOCATION (field),
    2294              :                      "%q#D invalid; an anonymous union can only "
    2295              :                      "have non-static data members", field);
    2296            0 :           continue;
    2297              :         }
    2298              : 
    2299          483 :       if (TREE_PRIVATE (field))
    2300            6 :         permerror (DECL_SOURCE_LOCATION (field),
    2301              :                    "private member %q#D in anonymous union", field);
    2302          477 :       else if (TREE_PROTECTED (field))
    2303            0 :         permerror (DECL_SOURCE_LOCATION (field),
    2304              :                    "protected member %q#D in anonymous union", field);
    2305              : 
    2306          483 :       if (processing_template_decl)
    2307           66 :         ref = build_min_nt_loc (UNKNOWN_LOCATION, COMPONENT_REF, object,
    2308              :                                 field, NULL_TREE);
    2309              :       else
    2310          417 :         ref = build_class_member_access_expr (object, field, NULL_TREE,
    2311              :                                               false, tf_warning_or_error);
    2312              : 
    2313          483 :       if (DECL_NAME (field))
    2314              :         {
    2315          446 :           tree base;
    2316              : 
    2317          446 :           decl = build_decl (input_location,
    2318          446 :                              VAR_DECL, DECL_NAME (field), TREE_TYPE (field));
    2319          446 :           DECL_ANON_UNION_VAR_P (decl) = 1;
    2320          446 :           DECL_ARTIFICIAL (decl) = 1;
    2321              : 
    2322          446 :           base = get_base_address (object);
    2323          446 :           TREE_PUBLIC (decl) = TREE_PUBLIC (base);
    2324          446 :           TREE_STATIC (decl) = TREE_STATIC (base);
    2325          446 :           DECL_EXTERNAL (decl) = DECL_EXTERNAL (base);
    2326              : 
    2327          446 :           SET_DECL_VALUE_EXPR (decl, ref);
    2328          446 :           DECL_HAS_VALUE_EXPR_P (decl) = 1;
    2329              : 
    2330          446 :           decl = pushdecl (decl);
    2331              :         }
    2332           37 :       else if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
    2333           37 :         decl = build_anon_union_vars (TREE_TYPE (field), ref);
    2334              :       else
    2335              :         decl = 0;
    2336              : 
    2337          483 :       if (main_decl == NULL_TREE)
    2338          951 :         main_decl = decl;
    2339              :     }
    2340              : 
    2341              :   return main_decl;
    2342              : }
    2343              : 
    2344              : /* Finish off the processing of a UNION_TYPE structure.  If the union is an
    2345              :    anonymous union, then all members must be laid out together.  PUBLIC_P
    2346              :    is nonzero if this union is not declared static.  */
    2347              : 
    2348              : void
    2349          349 : finish_anon_union (tree anon_union_decl)
    2350              : {
    2351          349 :   tree type;
    2352          349 :   tree main_decl;
    2353          349 :   bool public_p;
    2354              : 
    2355          349 :   if (anon_union_decl == error_mark_node)
    2356              :     return;
    2357              : 
    2358          340 :   type = TREE_TYPE (anon_union_decl);
    2359          340 :   public_p = TREE_PUBLIC (anon_union_decl);
    2360              : 
    2361              :   /* The VAR_DECL's context is the same as the TYPE's context.  */
    2362          340 :   DECL_CONTEXT (anon_union_decl) = DECL_CONTEXT (TYPE_NAME (type));
    2363              : 
    2364          340 :   if (TYPE_FIELDS (type) == NULL_TREE)
    2365              :     return;
    2366              : 
    2367          340 :   if (public_p)
    2368              :     {
    2369            0 :       error ("namespace-scope anonymous aggregates must be static");
    2370            0 :       return;
    2371              :     }
    2372              : 
    2373          340 :   main_decl = build_anon_union_vars (type, anon_union_decl);
    2374          340 :   if (main_decl == error_mark_node)
    2375              :     return;
    2376          316 :   if (main_decl == NULL_TREE)
    2377              :     {
    2378           12 :       pedwarn (input_location, 0, "anonymous union with no members");
    2379           12 :       return;
    2380              :     }
    2381              : 
    2382          304 :   if (!processing_template_decl)
    2383              :     {
    2384              :       /* Use main_decl to set the mangled name.  */
    2385          265 :       DECL_NAME (anon_union_decl) = DECL_NAME (main_decl);
    2386          265 :       maybe_commonize_var (anon_union_decl);
    2387          265 :       if (TREE_STATIC (anon_union_decl) || DECL_EXTERNAL (anon_union_decl))
    2388              :         {
    2389          152 :           if (DECL_DISCRIMINATOR_P (anon_union_decl))
    2390           45 :             determine_local_discriminator (anon_union_decl);
    2391          152 :           mangle_decl (anon_union_decl);
    2392              :         }
    2393          265 :       DECL_NAME (anon_union_decl) = NULL_TREE;
    2394              :     }
    2395              : 
    2396          304 :   pushdecl (anon_union_decl);
    2397          304 :   cp_finish_decl (anon_union_decl, NULL_TREE, false, NULL_TREE, 0);
    2398              : }
    2399              : 
    2400              : /* Auxiliary functions to make type signatures for
    2401              :    `operator new' and `operator delete' correspond to
    2402              :    what compiler will be expecting.  */
    2403              : 
    2404              : tree
    2405       143725 : coerce_new_type (tree type, location_t loc)
    2406              : {
    2407       143725 :   int e = 0;
    2408       143725 :   tree args = TYPE_ARG_TYPES (type);
    2409              : 
    2410       143725 :   gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
    2411              : 
    2412       143725 :   if (!same_type_p (TREE_TYPE (type), ptr_type_node))
    2413              :     {
    2414            6 :       e = 1;
    2415            6 :       error_at (loc, "%<operator new%> must return type %qT",
    2416              :                 ptr_type_node);
    2417              :     }
    2418              : 
    2419       143725 :   if (args && args != void_list_node)
    2420              :     {
    2421       143710 :       if (TREE_PURPOSE (args))
    2422              :         {
    2423              :           /* [basic.stc.dynamic.allocation]
    2424              : 
    2425              :              The first parameter shall not have an associated default
    2426              :              argument.  */
    2427           18 :           error_at (loc, "the first parameter of %<operator new%> cannot "
    2428              :                     "have a default argument");
    2429              :           /* Throw away the default argument.  */
    2430           18 :           TREE_PURPOSE (args) = NULL_TREE;
    2431              :         }
    2432              : 
    2433       143710 :       if (!same_type_p (TREE_VALUE (args), size_type_node))
    2434              :         {
    2435           21 :           e = 2;
    2436           21 :           args = TREE_CHAIN (args);
    2437              :         }
    2438              :     }
    2439              :   else
    2440              :     e = 2;
    2441              : 
    2442           21 :   if (e == 2)
    2443           36 :     permerror (loc, "%<operator new%> takes type %<size_t%> (%qT) "
    2444              :                "as first parameter", size_type_node);
    2445              : 
    2446       143725 :   switch (e)
    2447              :   {
    2448           36 :     case 2:
    2449           36 :       args = tree_cons (NULL_TREE, size_type_node, args);
    2450              :       /* Fall through.  */
    2451           42 :     case 1:
    2452           42 :       type = (cxx_copy_lang_qualifiers
    2453           42 :               (build_function_type (ptr_type_node, args),
    2454              :                type));
    2455              :       /* Fall through.  */
    2456       143725 :     default:;
    2457              :   }
    2458       143725 :   return type;
    2459              : }
    2460              : 
    2461              : void
    2462       192570 : coerce_delete_type (tree decl, location_t loc)
    2463              : {
    2464       192570 :   int e = 0;
    2465       192570 :   tree type = TREE_TYPE (decl);
    2466       192570 :   tree args = TYPE_ARG_TYPES (type);
    2467              : 
    2468       192570 :   gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
    2469              : 
    2470       192570 :   if (!same_type_p (TREE_TYPE (type), void_type_node))
    2471              :     {
    2472           15 :       e = 1;
    2473           15 :       error_at (loc, "%<operator delete%> must return type %qT",
    2474              :                 void_type_node);
    2475              :     }
    2476              : 
    2477       192570 :   tree ptrtype = ptr_type_node;
    2478       192570 :   if (destroying_delete_p (decl))
    2479              :     {
    2480           37 :       if (DECL_CLASS_SCOPE_P (decl))
    2481              :         /* If the function is a destroying operator delete declared in class
    2482              :            type C, the type of its first parameter shall be C*.  */
    2483           37 :         ptrtype = build_pointer_type (DECL_CONTEXT (decl));
    2484              :       else
    2485              :         /* A destroying operator delete shall be a class member function named
    2486              :            operator delete.  */
    2487            0 :         error_at (loc,
    2488              :                   "destroying %<operator delete%> must be a member function");
    2489           37 :       const ovl_op_info_t *op = IDENTIFIER_OVL_OP_INFO (DECL_NAME (decl));
    2490           37 :       if (op->flags & OVL_OP_FLAG_VEC)
    2491            0 :         error_at (loc, "%<operator delete[]%> cannot be a destroying delete");
    2492           37 :       if (!usual_deallocation_fn_p (decl))
    2493            0 :         error_at (loc, "destroying %<operator delete%> must be a usual "
    2494              :                   "deallocation function");
    2495              :     }
    2496              : 
    2497       192567 :   if (!args || args == void_list_node
    2498       385134 :       || !same_type_p (TREE_VALUE (args), ptrtype))
    2499              :     {
    2500           15 :       e = 2;
    2501           15 :       if (args && args != void_list_node)
    2502            9 :         args = TREE_CHAIN (args);
    2503           15 :       error_at (loc, "%<operator delete%> takes type %qT as first parameter",
    2504              :                 ptrtype);
    2505              :     }
    2506       192555 :   switch (e)
    2507              :   {
    2508           15 :     case 2:
    2509           15 :       args = tree_cons (NULL_TREE, ptrtype, args);
    2510              :       /* Fall through.  */
    2511           30 :     case 1:
    2512           30 :       type = (cxx_copy_lang_qualifiers
    2513           30 :               (build_function_type (void_type_node, args),
    2514              :                type));
    2515              :       /* Fall through.  */
    2516       192570 :     default:;
    2517              :   }
    2518              : 
    2519       192570 :   TREE_TYPE (decl) = type;
    2520       192570 : }
    2521              : 
    2522              : /* DECL is a VAR_DECL for a vtable: walk through the entries in the vtable
    2523              :    and mark them as needed.  */
    2524              : 
    2525              : static void
    2526       361902 : mark_vtable_entries (tree decl, vec<tree> &consteval_vtables)
    2527              : {
    2528              :   /* It's OK for the vtable to refer to deprecated virtual functions.  */
    2529       361902 :   auto du = make_temp_override (deprecated_state,
    2530       361902 :                                 UNAVAILABLE_DEPRECATED_SUPPRESS);
    2531              : 
    2532       361902 :   bool consteval_seen = false;
    2533              : 
    2534      5749607 :   for (auto &e: CONSTRUCTOR_ELTS (DECL_INITIAL (decl)))
    2535              :     {
    2536      4663901 :       tree fnaddr = e.value;
    2537              : 
    2538      4663901 :       STRIP_NOPS (fnaddr);
    2539              : 
    2540      7114885 :       if (TREE_CODE (fnaddr) != ADDR_EXPR
    2541      4663901 :           && TREE_CODE (fnaddr) != FDESC_EXPR)
    2542              :         /* This entry is an offset: a virtual base class offset, a
    2543              :            virtual call offset, an RTTI offset, etc.  */
    2544      2450984 :         continue;
    2545              : 
    2546      2212917 :       tree fn = TREE_OPERAND (fnaddr, 0);
    2547      3986047 :       if (TREE_CODE (fn) == FUNCTION_DECL && DECL_IMMEDIATE_FUNCTION_P (fn))
    2548              :         {
    2549         1280 :           if (!consteval_seen)
    2550              :             {
    2551          443 :               consteval_seen = true;
    2552          443 :               consteval_vtables.safe_push (decl);
    2553              :             }
    2554         1280 :           continue;
    2555              :         }
    2556      2211637 :       TREE_ADDRESSABLE (fn) = 1;
    2557              :       /* When we don't have vcall offsets, we output thunks whenever
    2558              :          we output the vtables that contain them.  With vcall offsets,
    2559              :          we know all the thunks we'll need when we emit a virtual
    2560              :          function, so we emit the thunks there instead.  */
    2561      2211637 :       if (DECL_THUNK_P (fn))
    2562         3891 :         use_thunk (fn, /*emit_p=*/0);
    2563              :       /* Set the location, as marking the function could cause
    2564              :          instantiation.  We do not need to preserve the incoming
    2565              :          location, as we're called from c_parse_final_cleanups, which
    2566              :          takes care of that.  */
    2567      2211637 :       input_location = DECL_SOURCE_LOCATION (fn);
    2568      2211637 :       mark_used (fn);
    2569              :     }
    2570       361902 : }
    2571              : 
    2572              : /* Replace any consteval functions in vtables with null pointers.  */
    2573              : 
    2574              : static void
    2575        96822 : clear_consteval_vfns (vec<tree> &consteval_vtables)
    2576              : {
    2577        98117 :   for (tree vtable : consteval_vtables)
    2578         3518 :     for (constructor_elt &elt : CONSTRUCTOR_ELTS (DECL_INITIAL (vtable)))
    2579              :       {
    2580         2189 :         tree fn = cp_get_fndecl_from_callee (elt.value, /*fold*/false);
    2581         3486 :         if (fn && DECL_IMMEDIATE_FUNCTION_P (fn))
    2582         1282 :           elt.value = build_zero_cst (vtable_entry_type);
    2583              :       }
    2584        96822 : }
    2585              : 
    2586              : /* Adjust the TLS model on variable DECL if need be, typically after
    2587              :    the linkage of DECL has been modified.  */
    2588              : 
    2589              : static void
    2590     56323075 : adjust_var_decl_tls_model (tree decl)
    2591              : {
    2592     56323075 :   if (CP_DECL_THREAD_LOCAL_P (decl)
    2593     56323075 :       && !lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl)))
    2594          296 :     set_decl_tls_model (decl, decl_default_tls_model (decl));
    2595     56323075 : }
    2596              : 
    2597              : /* Set DECL up to have the closest approximation of "initialized common"
    2598              :    linkage available.  */
    2599              : 
    2600              : void
    2601    105055112 : comdat_linkage (tree decl)
    2602              : {
    2603    105055112 :   if (flag_weak)
    2604    105055088 :     make_decl_one_only (decl, cxx_comdat_group (decl));
    2605           24 :   else if (TREE_CODE (decl) == FUNCTION_DECL
    2606           24 :            || (VAR_P (decl) && DECL_ARTIFICIAL (decl)))
    2607              :     /* We can just emit function and compiler-generated variables
    2608              :        statically; having multiple copies is (for the most part) only
    2609              :        a waste of space.
    2610              : 
    2611              :        There are two correctness issues, however: the address of a
    2612              :        template instantiation with external linkage should be the
    2613              :        same, independent of what translation unit asks for the
    2614              :        address, and this will not hold when we emit multiple copies of
    2615              :        the function.  However, there's little else we can do.
    2616              : 
    2617              :        Also, by default, the typeinfo implementation assumes that
    2618              :        there will be only one copy of the string used as the name for
    2619              :        each type.  Therefore, if weak symbols are unavailable, the
    2620              :        run-time library should perform a more conservative check; it
    2621              :        should perform a string comparison, rather than an address
    2622              :        comparison.  */
    2623           24 :     TREE_PUBLIC (decl) = 0;
    2624              :   else
    2625              :     {
    2626              :       /* Static data member template instantiations, however, cannot
    2627              :          have multiple copies.  */
    2628            0 :       if (DECL_INITIAL (decl) == 0
    2629            0 :           || DECL_INITIAL (decl) == error_mark_node)
    2630            0 :         DECL_COMMON (decl) = 1;
    2631            0 :       else if (EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)))
    2632              :         {
    2633            0 :           DECL_COMMON (decl) = 1;
    2634            0 :           DECL_INITIAL (decl) = error_mark_node;
    2635              :         }
    2636            0 :       else if (!DECL_EXPLICIT_INSTANTIATION (decl))
    2637              :         {
    2638              :           /* We can't do anything useful; leave vars for explicit
    2639              :              instantiation.  */
    2640            0 :           DECL_EXTERNAL (decl) = 1;
    2641            0 :           DECL_NOT_REALLY_EXTERN (decl) = 0;
    2642              :         }
    2643              :     }
    2644              : 
    2645    105055112 :   if (TREE_PUBLIC (decl))
    2646    105055088 :     DECL_COMDAT (decl) = 1;
    2647              : 
    2648    105055112 :   if (VAR_P (decl))
    2649     56322423 :     adjust_var_decl_tls_model (decl);
    2650    105055112 : }
    2651              : 
    2652              : /* For win32 we also want to put explicit instantiations in
    2653              :    linkonce sections, so that they will be merged with implicit
    2654              :    instantiations; otherwise we get duplicate symbol errors.
    2655              :    For Darwin we do not want explicit instantiations to be
    2656              :    linkonce.  */
    2657              : 
    2658              : void
    2659       686680 : maybe_make_one_only (tree decl)
    2660              : {
    2661              :   /* We used to say that this was not necessary on targets that support weak
    2662              :      symbols, because the implicit instantiations will defer to the explicit
    2663              :      one.  However, that's not actually the case in SVR4; a strong definition
    2664              :      after a weak one is an error.  Also, not making explicit
    2665              :      instantiations one_only means that we can end up with two copies of
    2666              :      some template instantiations.  */
    2667       686680 :   if (! flag_weak)
    2668              :     return;
    2669              : 
    2670              :   /* These are not to be output.  */
    2671       686677 :   if (consteval_only_p (decl))
    2672              :     return;
    2673              : 
    2674              :   /* We can't set DECL_COMDAT on functions, or cp_finish_file will think
    2675              :      we can get away with not emitting them if they aren't used.  We need
    2676              :      to for variables so that cp_finish_decl will update their linkage,
    2677              :      because their DECL_INITIAL may not have been set properly yet.  */
    2678              : 
    2679       682905 :   if (!TARGET_WEAK_NOT_IN_ARCHIVE_TOC
    2680              :       || (! DECL_EXPLICIT_INSTANTIATION (decl)
    2681              :           && ! DECL_TEMPLATE_SPECIALIZATION (decl)))
    2682              :     {
    2683       682905 :       make_decl_one_only (decl, cxx_comdat_group (decl));
    2684              : 
    2685       682905 :       if (VAR_P (decl))
    2686              :         {
    2687          652 :           varpool_node *node = varpool_node::get_create (decl);
    2688          652 :           DECL_COMDAT (decl) = 1;
    2689              :           /* Mark it needed so we don't forget to emit it.  */
    2690          652 :           node->forced_by_abi = true;
    2691          652 :           TREE_USED (decl) = 1;
    2692              : 
    2693          652 :           adjust_var_decl_tls_model (decl);
    2694              :         }
    2695              :     }
    2696              : }
    2697              : 
    2698              : /* Returns true iff DECL, a FUNCTION_DECL or VAR_DECL, has vague linkage.
    2699              :    This predicate will give the right answer during parsing of the
    2700              :    function, which other tests may not.  */
    2701              : 
    2702              : bool
    2703     35781752 : vague_linkage_p (tree decl)
    2704              : {
    2705     35781755 :   if (!TREE_PUBLIC (decl))
    2706              :     {
    2707              :       /* maybe_thunk_body clears TREE_PUBLIC and DECL_ABSTRACT_P on the
    2708              :          maybe-in-charge 'tor variants; in that case we need to check one of
    2709              :          the "clones" for the real linkage.  But only in that case; before
    2710              :          maybe_clone_body we haven't yet copied the linkage to the clones.  */
    2711         8186 :       if (DECL_MAYBE_IN_CHARGE_CDTOR_P (decl)
    2712          183 :           && !DECL_ABSTRACT_P (decl)
    2713            3 :           && DECL_CHAIN (decl)
    2714         4178 :           && DECL_CLONED_FUNCTION_P (DECL_CHAIN (decl)))
    2715            3 :         return vague_linkage_p (DECL_CHAIN (decl));
    2716              : 
    2717         4172 :       gcc_checking_assert (!DECL_COMDAT (decl));
    2718              :       return false;
    2719              :     }
    2720              :   /* Unfortunately, import_export_decl has not always been called
    2721              :      before the function is processed, so we cannot simply check
    2722              :      DECL_COMDAT.  */
    2723     35777580 :   if (DECL_COMDAT (decl)
    2724       932850 :       || (TREE_CODE (decl) == FUNCTION_DECL
    2725       921047 :           && DECL_NONGNU_INLINE_P (decl))
    2726        65419 :       || (DECL_LANG_SPECIFIC (decl)
    2727        64881 :           && DECL_TEMPLOID_INSTANTIATION (decl))
    2728     35814079 :       || (VAR_P (decl) && DECL_INLINE_VAR_P (decl)))
    2729     35746536 :     return true;
    2730        31044 :   else if (DECL_FUNCTION_SCOPE_P (decl))
    2731              :     /* A local static in an inline effectively has vague linkage.  */
    2732            0 :     return (TREE_STATIC (decl)
    2733            0 :             && vague_linkage_p (DECL_CONTEXT (decl)));
    2734              :   else
    2735              :     return false;
    2736              : }
    2737              : 
    2738              : /* Determine whether or not we want to specifically import or export CTYPE,
    2739              :    using various heuristics.  */
    2740              : 
    2741              : static void
    2742      3856280 : import_export_class (tree ctype)
    2743              : {
    2744              :   /* -1 for imported, 1 for exported.  */
    2745      3856280 :   int import_export = 0;
    2746              : 
    2747              :   /* It only makes sense to call this function at EOF.  The reason is
    2748              :      that this function looks at whether or not the first non-inline
    2749              :      non-abstract virtual member function has been defined in this
    2750              :      translation unit.  But, we can't possibly know that until we've
    2751              :      seen the entire translation unit.  */
    2752      3856280 :   gcc_assert (at_eof);
    2753              : 
    2754      3856280 :   if (CLASSTYPE_INTERFACE_KNOWN (ctype))
    2755              :     return;
    2756              : 
    2757              :   /* If MULTIPLE_SYMBOL_SPACES is set and we saw a #pragma interface,
    2758              :      we will have CLASSTYPE_INTERFACE_ONLY set but not
    2759              :      CLASSTYPE_INTERFACE_KNOWN.  In that case, we don't want to use this
    2760              :      heuristic because someone will supply a #pragma implementation
    2761              :      elsewhere, and deducing it here would produce a conflict.  */
    2762      2086450 :   if (CLASSTYPE_INTERFACE_ONLY (ctype))
    2763              :     return;
    2764              : 
    2765      2086450 :   if (lookup_attribute ("dllimport", TYPE_ATTRIBUTES (ctype)))
    2766              :     import_export = -1;
    2767      2086450 :   else if (lookup_attribute ("dllexport", TYPE_ATTRIBUTES (ctype)))
    2768              :     import_export = 1;
    2769      2086450 :   else if (CLASSTYPE_IMPLICIT_INSTANTIATION (ctype)
    2770      2086450 :            && !flag_implicit_templates)
    2771              :     /* For a template class, without -fimplicit-templates, check the
    2772              :        repository.  If the virtual table is assigned to this
    2773              :        translation unit, then export the class; otherwise, import
    2774              :        it.  */
    2775              :       import_export = -1;
    2776      2085807 :   else if (TYPE_CONTAINS_VPTR_P (ctype))
    2777              :     {
    2778      1917367 :       tree cdecl = TYPE_NAME (ctype);
    2779      1921112 :       if (DECL_LANG_SPECIFIC (cdecl) && DECL_MODULE_ATTACH_P (cdecl))
    2780              :         /* For class types attached to a named module, the ABI specifies
    2781              :            that the tables are uniquely emitted in the object for the
    2782              :            module unit in which it is defined.  */
    2783         1740 :         import_export = (DECL_MODULE_IMPORT_P (cdecl) ? -1 : 1);
    2784              :       else
    2785              :         {
    2786              :           /* The ABI specifies that the virtual table and associated
    2787              :              information are emitted with the key method, if any.  */
    2788      1917172 :           tree method = CLASSTYPE_KEY_METHOD (ctype);
    2789              :           /* If weak symbol support is not available, then we must be
    2790              :              careful not to emit the vtable when the key function is
    2791              :              inline.  An inline function can be defined in multiple
    2792              :              translation units.  If we were to emit the vtable in each
    2793              :              translation unit containing a definition, we would get
    2794              :              multiple definition errors at link-time.  */
    2795      1893555 :           if (method && (flag_weak || ! DECL_NONGNU_INLINE_P (method)))
    2796       574296 :             import_export = (DECL_REALLY_EXTERN (method) ? -1 : 1);
    2797              :         }
    2798              :     }
    2799              : 
    2800              :   /* When MULTIPLE_SYMBOL_SPACES is set, we cannot count on seeing
    2801              :      a definition anywhere else.  */
    2802      2086450 :   if (MULTIPLE_SYMBOL_SPACES && import_export == -1)
    2803              :     import_export = 0;
    2804              : 
    2805              :   /* Allow back ends the chance to overrule the decision.  */
    2806      2086450 :   if (targetm.cxx.import_export_class)
    2807            0 :     import_export = targetm.cxx.import_export_class (ctype, import_export);
    2808              : 
    2809      2086450 :   if (import_export)
    2810              :     {
    2811       575134 :       SET_CLASSTYPE_INTERFACE_KNOWN (ctype);
    2812       575134 :       CLASSTYPE_INTERFACE_ONLY (ctype) = (import_export < 0);
    2813              :     }
    2814              : }
    2815              : 
    2816              : /* Return true if VAR has already been provided to the back end; in that
    2817              :    case VAR should not be modified further by the front end.  */
    2818              : static bool
    2819    100079110 : var_finalized_p (tree var)
    2820              : {
    2821            0 :   return varpool_node::get_create (var)->definition;
    2822              : }
    2823              : 
    2824              : /* DECL is a VAR_DECL or FUNCTION_DECL which, for whatever reason,
    2825              :    must be emitted in this translation unit.  Mark it as such.  */
    2826              : 
    2827              : void
    2828        49769 : mark_needed (tree decl)
    2829              : {
    2830              :   /* These are not to be output.  */
    2831        49769 :   if (consteval_only_p (decl))
    2832              :     return;
    2833              : 
    2834        49764 :   TREE_USED (decl) = 1;
    2835        49764 :   if (TREE_CODE (decl) == FUNCTION_DECL)
    2836              :     {
    2837              :       /* Extern inline functions don't become needed when referenced.
    2838              :          If we know a method will be emitted in other TU and no new
    2839              :          functions can be marked reachable, just use the external
    2840              :          definition.  */
    2841        41696 :       struct cgraph_node *node = cgraph_node::get_create (decl);
    2842        41696 :       node->forced_by_abi = true;
    2843              : 
    2844              :       /* #pragma interface can call mark_needed for
    2845              :           maybe-in-charge 'tors; mark the clones as well.  */
    2846        41696 :       tree clone;
    2847        50084 :       FOR_EACH_CLONE (clone, decl)
    2848         8388 :         mark_needed (clone);
    2849              :     }
    2850         8068 :   else if (VAR_P (decl))
    2851              :     {
    2852         8068 :       varpool_node *node = varpool_node::get_create (decl);
    2853              :       /* C++ frontend use mark_decl_references to force COMDAT variables
    2854              :          to be output that might appear dead otherwise.  */
    2855         8068 :       node->forced_by_abi = true;
    2856              :     }
    2857              : }
    2858              : 
    2859              : /* DECL is either a FUNCTION_DECL or a VAR_DECL.  This function
    2860              :    returns true if a definition of this entity should be provided in
    2861              :    this object file.  Callers use this function to determine whether
    2862              :    or not to let the back end know that a definition of DECL is
    2863              :    available in this translation unit.  */
    2864              : 
    2865              : bool
    2866    314233316 : decl_needed_p (tree decl)
    2867              : {
    2868    314233316 :   gcc_assert (VAR_OR_FUNCTION_DECL_P (decl));
    2869              :   /* This function should only be called at the end of the translation
    2870              :      unit.  We cannot be sure of whether or not something will be
    2871              :      COMDAT until that point.  */
    2872    314233316 :   gcc_assert (at_eof);
    2873              : 
    2874              :   /* All entities with external linkage that are not COMDAT/EXTERN should be
    2875              :      emitted; they may be referred to from other object files.  */
    2876    314233316 :   if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_REALLY_EXTERN (decl))
    2877              :     return true;
    2878              : 
    2879              :   /* Functions marked "dllexport" must be emitted so that they are
    2880              :      visible to other DLLs.  */
    2881    314233036 :   if (flag_keep_inline_dllexport
    2882    314233036 :       && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))
    2883              :     return true;
    2884              : 
    2885              :   /* When not optimizing, do not bother to produce definitions for extern
    2886              :      symbols.  */
    2887    389003220 :   if (DECL_REALLY_EXTERN (decl)
    2888            0 :       && ((TREE_CODE (decl) != FUNCTION_DECL
    2889            0 :            && !optimize)
    2890            0 :           || (TREE_CODE (decl) == FUNCTION_DECL
    2891            0 :               && !opt_for_fn (decl, optimize)))
    2892    314233036 :       && !lookup_attribute ("always_inline", decl))
    2893              :     return false;
    2894              : 
    2895              :   /* If this entity was used, let the back end see it; it will decide
    2896              :      whether or not to emit it into the object file.  */
    2897    314233036 :   if (TREE_USED (decl))
    2898              :     return true;
    2899              : 
    2900              :   /* Virtual functions might be needed for devirtualization.  */
    2901     65688143 :   if (flag_devirtualize
    2902     63708180 :       && TREE_CODE (decl) == FUNCTION_DECL
    2903    128221206 :       && DECL_VIRTUAL_P (decl))
    2904              :     return true;
    2905              : 
    2906              :   /* Otherwise, DECL does not need to be emitted -- yet.  A subsequent
    2907              :      reference to DECL might cause it to be emitted later.  */
    2908              :   return false;
    2909              : }
    2910              : 
    2911              : /* If necessary, write out the vtables for the dynamic class CTYPE.
    2912              :    Returns true if any vtables were emitted.  */
    2913              : 
    2914              : static bool
    2915      3601491 : maybe_emit_vtables (tree ctype, vec<tree> &consteval_vtables)
    2916              : {
    2917      3601491 :   tree vtbl;
    2918      3601491 :   tree primary_vtbl;
    2919      3601491 :   int needed = 0;
    2920      3601491 :   varpool_node *current = NULL, *last = NULL;
    2921              : 
    2922              :   /* If the vtables for this class have already been emitted there is
    2923              :      nothing more to do.  */
    2924      3601491 :   primary_vtbl = CLASSTYPE_VTABLES (ctype);
    2925      3601491 :   if (var_finalized_p (primary_vtbl))
    2926              :     return false;
    2927              :   /* Ignore dummy vtables made by get_vtable_decl.  */
    2928      3601491 :   if (TREE_TYPE (primary_vtbl) == void_type_node)
    2929              :     return false;
    2930              : 
    2931              :   /* On some targets, we cannot determine the key method until the end
    2932              :      of the translation unit -- which is when this function is
    2933              :      called.  */
    2934      3601491 :   if (!targetm.cxx.key_method_may_be_inline ())
    2935            0 :     determine_key_method (ctype);
    2936              : 
    2937              :   /* See if any of the vtables are needed.  */
    2938      8825567 :   for (vtbl = CLASSTYPE_VTABLES (ctype); vtbl; vtbl = DECL_CHAIN (vtbl))
    2939              :     {
    2940      5224076 :       import_export_decl (vtbl);
    2941      5224076 :       if (DECL_NOT_REALLY_EXTERN (vtbl) && decl_needed_p (vtbl))
    2942              :         needed = 1;
    2943              :     }
    2944      3601491 :   if (!needed)
    2945              :     {
    2946              :       /* If the references to this class' vtables are optimized away,
    2947              :          still emit the appropriate debugging information.  See
    2948              :          dfs_debug_mark.  */
    2949      3259476 :       if (DECL_COMDAT (primary_vtbl)
    2950      3259476 :           && CLASSTYPE_DEBUG_REQUESTED (ctype))
    2951        37770 :         note_debug_info_needed (ctype);
    2952      3259476 :       return false;
    2953              :     }
    2954              : 
    2955              :   /* The ABI requires that we emit all of the vtables if we emit any
    2956              :      of them.  */
    2957       703917 :   for (vtbl = CLASSTYPE_VTABLES (ctype); vtbl; vtbl = DECL_CHAIN (vtbl))
    2958              :     {
    2959              :       /* Mark entities references from the virtual table as used.  */
    2960       361902 :       mark_vtable_entries (vtbl, consteval_vtables);
    2961              : 
    2962       361902 :       if (TREE_TYPE (DECL_INITIAL (vtbl)) == 0)
    2963              :         {
    2964            0 :           vec<tree, va_gc> *cleanups = NULL;
    2965            0 :           tree expr = store_init_value (vtbl, DECL_INITIAL (vtbl), &cleanups,
    2966              :                                         LOOKUP_NORMAL);
    2967              : 
    2968              :           /* It had better be all done at compile-time.  */
    2969            0 :           gcc_assert (!expr && !cleanups);
    2970              :         }
    2971              : 
    2972              :       /* Write it out.  */
    2973       361902 :       DECL_EXTERNAL (vtbl) = 0;
    2974       361902 :       rest_of_decl_compilation (vtbl, 1, 1);
    2975              : 
    2976              :       /* Because we're only doing syntax-checking, we'll never end up
    2977              :          actually marking the variable as written.  */
    2978       361902 :       if (flag_syntax_only)
    2979           33 :         TREE_ASM_WRITTEN (vtbl) = 1;
    2980       361869 :       else if (DECL_ONE_ONLY (vtbl))
    2981              :         {
    2982       361147 :           current = varpool_node::get_create (vtbl);
    2983       361147 :           if (last)
    2984        19793 :             current->add_to_same_comdat_group (last);
    2985              :           last = current;
    2986              :         }
    2987              :     }
    2988              : 
    2989              :   /* For abstract classes, the destructor has been removed from the
    2990              :      vtable (in class.cc's build_vtbl_initializer).  For a compiler-
    2991              :      generated destructor, it hence might not have been generated in
    2992              :      this translation unit - and with '#pragma interface' it might
    2993              :      never get generated.  */
    2994       342015 :   if (CLASSTYPE_PURE_VIRTUALS (ctype)
    2995       108788 :       && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (ctype)
    2996        69171 :       && !CLASSTYPE_LAZY_DESTRUCTOR (ctype)
    2997       411183 :       && DECL_DEFAULTED_IN_CLASS_P (CLASSTYPE_DESTRUCTOR (ctype)))
    2998           65 :     note_vague_linkage_fn (CLASSTYPE_DESTRUCTOR (ctype));
    2999              : 
    3000              :   /* Since we're writing out the vtable here, also write the debug
    3001              :      info.  */
    3002       342015 :   note_debug_info_needed (ctype);
    3003              : 
    3004       342015 :   return true;
    3005              : }
    3006              : 
    3007              : /* A special return value from type_visibility meaning internal
    3008              :    linkage.  */
    3009              : 
    3010              : enum { VISIBILITY_ANON = VISIBILITY_INTERNAL+1 };
    3011              : 
    3012              : static int expr_visibility (tree);
    3013              : static int type_visibility (tree);
    3014              : 
    3015              : /* walk_tree helper function for type_visibility.  */
    3016              : 
    3017              : static tree
    3018   3905943304 : min_vis_r (tree *tp, int *walk_subtrees, void *data)
    3019              : {
    3020   3905943304 :   int *vis_p = (int *)data;
    3021   3905943304 :   int this_vis = VISIBILITY_DEFAULT;
    3022   3905943304 :   if (! TYPE_P (*tp))
    3023    776465119 :     *walk_subtrees = 0;
    3024   3129478185 :   else if (OVERLOAD_TYPE_P (*tp)
    3025   4095502580 :            && !TREE_PUBLIC (TYPE_MAIN_DECL (*tp)))
    3026              :     {
    3027       931638 :       this_vis = VISIBILITY_ANON;
    3028       931638 :       *walk_subtrees = 0;
    3029              :     }
    3030   3128546547 :   else if (CLASS_TYPE_P (*tp))
    3031              :     {
    3032    938702618 :       this_vis = CLASSTYPE_VISIBILITY (*tp);
    3033    938702618 :       *walk_subtrees = 0;
    3034              :     }
    3035   2189843929 :   else if (TREE_CODE (*tp) == ARRAY_TYPE
    3036   2189843929 :            && uses_template_parms (TYPE_DOMAIN (*tp)))
    3037       405593 :     this_vis = expr_visibility (TYPE_MAX_VALUE (TYPE_DOMAIN (*tp)));
    3038              : 
    3039   3905943304 :   if (this_vis > *vis_p)
    3040      1624862 :     *vis_p = this_vis;
    3041              : 
    3042              :   /* Tell cp_walk_subtrees to look through typedefs.  */
    3043   3905943304 :   if (*walk_subtrees == 1)
    3044   2189843929 :     *walk_subtrees = 2;
    3045              : 
    3046   3905943304 :   return NULL;
    3047              : }
    3048              : 
    3049              : /* walk_tree helper function for expr_visibility.  */
    3050              : 
    3051              : static tree
    3052    252838566 : min_vis_expr_r (tree *tp, int *walk_subtrees, void *data)
    3053              : {
    3054    252838566 :   int *vis_p = (int *)data;
    3055    252838566 :   int tpvis = VISIBILITY_DEFAULT;
    3056              : 
    3057    252838566 :   tree t = *tp;
    3058    252838566 :   if (TREE_CODE (t) == PTRMEM_CST)
    3059          657 :     t = PTRMEM_CST_MEMBER (t);
    3060              : 
    3061    252838566 :   if (TREE_CODE (t) == TEMPLATE_DECL)
    3062              :     {
    3063      6767310 :       if (DECL_ALIAS_TEMPLATE_P (t) || concept_definition_p (t))
    3064              :         /* FIXME: We don't maintain TREE_PUBLIC / DECL_VISIBILITY for
    3065              :            alias templates so we can't trust it here (PR107906).  Ditto
    3066              :            for concepts.  */
    3067              :         return NULL_TREE;
    3068              :       t = DECL_TEMPLATE_RESULT (t);
    3069              :       if (!t)
    3070              :         return NULL_TREE;
    3071              :     }
    3072              : 
    3073    252162141 :   switch (TREE_CODE (t))
    3074              :     {
    3075      8364680 :     case CAST_EXPR:
    3076      8364680 :     case IMPLICIT_CONV_EXPR:
    3077      8364680 :     case STATIC_CAST_EXPR:
    3078      8364680 :     case REINTERPRET_CAST_EXPR:
    3079      8364680 :     case CONST_CAST_EXPR:
    3080      8364680 :     case DYNAMIC_CAST_EXPR:
    3081      8364680 :     case NEW_EXPR:
    3082      8364680 :     case CONSTRUCTOR:
    3083      8364680 :     case LAMBDA_EXPR:
    3084      8364680 :     case TYPE_DECL:
    3085      8364680 :       tpvis = type_visibility (TREE_TYPE (t));
    3086      8364680 :       break;
    3087              : 
    3088         4138 :     case ADDR_EXPR:
    3089         4138 :       t = TREE_OPERAND (t, 0);
    3090         4138 :       if (VAR_P (t))
    3091              :         /* If a variable has its address taken, the lvalue-rvalue conversion is
    3092              :            not applied, so skip that case.  */
    3093         1945 :         goto addressable;
    3094              :       break;
    3095              : 
    3096      8492641 :     case VAR_DECL:
    3097      8492641 :     case FUNCTION_DECL:
    3098      8492641 :       if (decl_constant_var_p (t))
    3099              :         /* The ODR allows definitions in different TUs to refer to distinct
    3100              :            constant variables with internal or no linkage, so such a reference
    3101              :            shouldn't affect visibility if the lvalue-rvalue conversion is
    3102              :            applied (PR110323).  We still want to restrict visibility according
    3103              :            to the type of the declaration however.  */
    3104              :         {
    3105      4947483 :           tpvis = type_visibility (TREE_TYPE (t));
    3106      4947483 :           break;
    3107              :         }
    3108      3545158 :     addressable:
    3109              :       /* For _DECLs with no linkage refer to the linkage of the containing
    3110              :          entity that does have a name with linkage.  */
    3111      3547310 :       if (decl_linkage (t) == lk_none)
    3112        21400 :         tpvis = expr_visibility (DECL_CONTEXT (t));
    3113              :       /* Decls that have had their visibility constrained will report
    3114              :          as external linkage, but we still want to transitively constrain
    3115              :          if we refer to them, so just check TREE_PUBLIC instead.  */
    3116      3525910 :       else if (!TREE_PUBLIC (t))
    3117              :         tpvis = VISIBILITY_ANON;
    3118              :       else
    3119      3524441 :         tpvis = DECL_VISIBILITY (t);
    3120              :       break;
    3121              : 
    3122          960 :     case FIELD_DECL:
    3123          960 :       tpvis = type_visibility (DECL_CONTEXT (t));
    3124          960 :       break;
    3125              : 
    3126          881 :     case REFLECT_EXPR:
    3127          881 :       tree r;
    3128          881 :       r = REFLECT_EXPR_HANDLE (t);
    3129          881 :       switch (REFLECT_EXPR_KIND (t))
    3130              :         {
    3131           24 :         case REFLECT_BASE:
    3132              :           /* For direct base class relationship, determine visibility
    3133              :              from both D and B types.  */
    3134           24 :           tpvis = type_visibility (BINFO_TYPE (r));
    3135           24 :           if (tpvis > *vis_p)
    3136            1 :             *vis_p = tpvis;
    3137           24 :           tpvis = type_visibility (direct_base_derived (r));
    3138           24 :           *walk_subtrees = 0;
    3139           24 :           break;
    3140           19 :         case REFLECT_DATA_MEMBER_SPEC:
    3141              :           /* For data member description determine visibility
    3142              :              from the type.  */
    3143           19 :           tpvis = type_visibility (TREE_VEC_ELT (r, 0));
    3144           19 :           *walk_subtrees = 0;
    3145           19 :           break;
    3146           25 :         case REFLECT_PARM:
    3147              :           /* For function parameter reflection determine visibility
    3148              :              based on parent_of.  */
    3149           25 :           tpvis = expr_visibility (DECL_CONTEXT (r));
    3150           25 :           *walk_subtrees = 0;
    3151           25 :           break;
    3152            3 :         case REFLECT_ANNOTATION:
    3153              :           /* Annotations are always local to the TU.  */
    3154            3 :           tpvis = VISIBILITY_ANON;
    3155            3 :           *walk_subtrees = 0;
    3156            3 :           break;
    3157           10 :         case REFLECT_OBJECT:
    3158           10 :           r = get_base_address (r);
    3159          810 :           gcc_fallthrough ();
    3160          810 :         default:
    3161          810 :           if (TYPE_P (r))
    3162              :             {
    3163          169 :               tpvis = type_visibility (r);
    3164          169 :               *walk_subtrees = 0;
    3165          169 :               break;
    3166              :             }
    3167          641 :           if (VAR_P (r) || TREE_CODE (r) == PARM_DECL)
    3168              :             {
    3169          207 :               t = r;
    3170          207 :               goto addressable;
    3171              :             }
    3172              :           break;
    3173              :         }
    3174              :       break;
    3175              : 
    3176              :     default:
    3177              :       break;
    3178              :     }
    3179              : 
    3180    252162141 :   if (tpvis > *vis_p)
    3181         3308 :     *vis_p = tpvis;
    3182              : 
    3183              :   return NULL_TREE;
    3184              : }
    3185              : 
    3186              : /* Returns the visibility of TYPE, which is the minimum visibility of its
    3187              :    component types.  */
    3188              : 
    3189              : static int
    3190   1125578698 : type_visibility (tree type)
    3191              : {
    3192   1125578698 :   int vis = VISIBILITY_DEFAULT;
    3193   1125578698 :   cp_walk_tree_without_duplicates (&type, min_vis_r, &vis);
    3194   1125578698 :   return vis;
    3195              : }
    3196              : 
    3197              : /* Returns the visibility of an expression EXPR that appears in the signature
    3198              :    of a function template, which is the minimum visibility of names that appear
    3199              :    in its mangling.  */
    3200              : 
    3201              : static int
    3202     85148142 : expr_visibility (tree expr)
    3203              : {
    3204     85148142 :   int vis = VISIBILITY_DEFAULT;
    3205     85148142 :   cp_walk_tree_without_duplicates (&expr, min_vis_expr_r, &vis);
    3206     85148142 :   return vis;
    3207              : }
    3208              : 
    3209              : /* Limit the visibility of DECL to VISIBILITY, if not explicitly
    3210              :    specified (or if VISIBILITY is static).  If TMPL is true, this
    3211              :    constraint is for a template argument, and takes precedence
    3212              :    over explicitly-specified visibility on the template.  */
    3213              : 
    3214              : static void
    3215     74793910 : constrain_visibility (tree decl, int visibility, bool tmpl)
    3216              : {
    3217     74793910 :   if (visibility == VISIBILITY_ANON)
    3218              :     {
    3219              :       /* extern "C" declarations aren't affected by the anonymous
    3220              :          namespace.  */
    3221      1361328 :       if (!DECL_EXTERN_C_P (decl))
    3222              :         {
    3223      1361152 :           TREE_PUBLIC (decl) = 0;
    3224      1361152 :           DECL_WEAK (decl) = 0;
    3225      1361152 :           DECL_COMMON (decl) = 0;
    3226      1361152 :           DECL_COMDAT (decl) = false;
    3227      1361152 :           if (VAR_OR_FUNCTION_DECL_P (decl))
    3228              :             {
    3229       396608 :               struct symtab_node *snode = symtab_node::get (decl);
    3230              : 
    3231       396608 :               if (snode)
    3232        33148 :                 snode->set_comdat_group (NULL);
    3233              :             }
    3234      1361152 :           DECL_INTERFACE_KNOWN (decl) = 1;
    3235      1361152 :           if (DECL_LANG_SPECIFIC (decl))
    3236       400250 :             DECL_NOT_REALLY_EXTERN (decl) = 1;
    3237              :         }
    3238              :     }
    3239     73432582 :   else if (visibility > DECL_VISIBILITY (decl)
    3240     73432582 :            && (tmpl || !DECL_VISIBILITY_SPECIFIED (decl)))
    3241              :     {
    3242          309 :       DECL_VISIBILITY (decl) = (enum symbol_visibility) visibility;
    3243              :       /* This visibility was not specified.  */
    3244          309 :       DECL_VISIBILITY_SPECIFIED (decl) = false;
    3245              :     }
    3246     74793910 : }
    3247              : 
    3248              : /* Constrain the visibility of DECL based on the visibility of its template
    3249              :    arguments.  */
    3250              : 
    3251              : static void
    3252    339111757 : constrain_visibility_for_template (tree decl, tree targs)
    3253              : {
    3254              :   /* If this is a template instantiation, check the innermost
    3255              :      template args for visibility constraints.  The outer template
    3256              :      args are covered by the class check.  */
    3257    339111757 :   tree args = INNERMOST_TEMPLATE_ARGS (targs);
    3258    339111757 :   int i;
    3259    991150990 :   for (i = TREE_VEC_LENGTH (args); i > 0; --i)
    3260              :     {
    3261    652039233 :       int vis = 0;
    3262              : 
    3263    652039233 :       tree arg = TREE_VEC_ELT (args, i-1);
    3264    652039233 :       if (TYPE_P (arg))
    3265    568772229 :         vis = type_visibility (arg);
    3266              :       else
    3267     83267004 :         vis = expr_visibility (arg);
    3268    652039233 :       if (vis)
    3269       343242 :         constrain_visibility (decl, vis, true);
    3270              :     }
    3271    339111757 : }
    3272              : 
    3273              : /* Like c_determine_visibility, but with additional C++-specific
    3274              :    behavior.
    3275              : 
    3276              :    Function-scope entities can rely on the function's visibility because
    3277              :    it is set in start_preparsed_function.
    3278              : 
    3279              :    Class-scope entities cannot rely on the class's visibility until the end
    3280              :    of the enclosing class definition.
    3281              : 
    3282              :    Note that because namespaces have multiple independent definitions,
    3283              :    namespace visibility is handled elsewhere using the #pragma visibility
    3284              :    machinery rather than by decorating the namespace declaration.
    3285              : 
    3286              :    The goal is for constraints from the type to give a diagnostic, and
    3287              :    other constraints to be applied silently.  */
    3288              : 
    3289              : void
    3290    673919259 : determine_visibility (tree decl)
    3291              : {
    3292              :   /* Remember that all decls get VISIBILITY_DEFAULT when built.  */
    3293              : 
    3294              :   /* Only relevant for names with external linkage.  */
    3295    673919259 :   if (!TREE_PUBLIC (decl))
    3296              :     return;
    3297              : 
    3298              :   /* Cloned constructors and destructors get the same visibility as
    3299              :      the underlying function.  That should be set up in
    3300              :      maybe_clone_body.  */
    3301    626588924 :   gcc_assert (!DECL_CLONED_FUNCTION_P (decl));
    3302              : 
    3303    626588924 :   bool orig_visibility_specified = DECL_VISIBILITY_SPECIFIED (decl);
    3304    626588924 :   enum symbol_visibility orig_visibility = DECL_VISIBILITY (decl);
    3305              : 
    3306              :   /* The decl may be a template instantiation, which could influence
    3307              :      visibilty.  */
    3308    626588924 :   tree template_decl = NULL_TREE;
    3309    626588924 :   if (TREE_CODE (decl) == TYPE_DECL)
    3310              :     {
    3311    173458056 :       if (CLASS_TYPE_P (TREE_TYPE (decl)))
    3312              :         {
    3313    170467932 :           if (CLASSTYPE_USE_TEMPLATE (TREE_TYPE (decl)))
    3314    346689159 :             template_decl = decl;
    3315              :         }
    3316      2990124 :       else if (TYPE_TEMPLATE_INFO (TREE_TYPE (decl)))
    3317    346689159 :         template_decl = decl;
    3318              :     }
    3319    453130868 :   else if (DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl))
    3320              :     template_decl = decl;
    3321              : 
    3322    626588924 :   if (TREE_CODE (decl) == TYPE_DECL
    3323    342883719 :       && LAMBDA_TYPE_P (TREE_TYPE (decl))
    3324    629506638 :       && CLASSTYPE_LAMBDA_EXPR (TREE_TYPE (decl)) != error_mark_node)
    3325      2912472 :     if (tree extra = LAMBDA_TYPE_EXTRA_SCOPE (TREE_TYPE (decl)))
    3326              :       {
    3327              :         /* The lambda's visibility is limited by that of its extra
    3328              :            scope.  */
    3329      1454120 :         int vis = 0;
    3330      1454120 :         if (TYPE_P (extra))
    3331            0 :           vis = type_visibility (extra);
    3332              :         else
    3333      1454120 :           vis = expr_visibility (extra);
    3334      1454120 :         constrain_visibility (decl, vis, false);
    3335              :       }
    3336              : 
    3337              :   /* If DECL is a member of a class, visibility specifiers on the
    3338              :      class can influence the visibility of the DECL.  */
    3339    626588924 :   tree class_type = NULL_TREE;
    3340    626588924 :   if (DECL_CLASS_SCOPE_P (decl))
    3341    319418976 :     class_type = DECL_CONTEXT (decl);
    3342              :   else
    3343              :     {
    3344              :       /* Not a class member.  */
    3345              : 
    3346              :       /* Virtual tables have DECL_CONTEXT set to their associated class,
    3347              :          so they are automatically handled above.  */
    3348    307169948 :       gcc_assert (!VAR_P (decl)
    3349              :                   || !DECL_VTABLE_OR_VTT_P (decl));
    3350              : 
    3351    307169948 :       if (DECL_FUNCTION_SCOPE_P (decl) && ! DECL_VISIBILITY_SPECIFIED (decl))
    3352              :         {
    3353              :           /* Local statics and classes get the visibility of their
    3354              :              containing function by default, except that
    3355              :              -fvisibility-inlines-hidden doesn't affect them.  */
    3356      2276609 :           tree fn = DECL_CONTEXT (decl);
    3357      2276609 :           if (DECL_VISIBILITY_SPECIFIED (fn))
    3358              :             {
    3359      2205705 :               DECL_VISIBILITY (decl) = DECL_VISIBILITY (fn);
    3360      2205705 :               DECL_VISIBILITY_SPECIFIED (decl) =
    3361      2205705 :                 DECL_VISIBILITY_SPECIFIED (fn);
    3362              :             }
    3363              :           else
    3364              :             {
    3365        70904 :               if (DECL_CLASS_SCOPE_P (fn))
    3366        37489 :                 determine_visibility_from_class (decl, DECL_CONTEXT (fn));
    3367        33415 :               else if (determine_hidden_inline (fn))
    3368              :                 {
    3369            6 :                   DECL_VISIBILITY (decl) = default_visibility;
    3370            6 :                   DECL_VISIBILITY_SPECIFIED (decl) =
    3371            6 :                     visibility_options.inpragma;
    3372              :                 }
    3373              :               else
    3374              :                 {
    3375        33409 :                   DECL_VISIBILITY (decl) = DECL_VISIBILITY (fn);
    3376        33409 :                   DECL_VISIBILITY_SPECIFIED (decl) =
    3377        33409 :                     DECL_VISIBILITY_SPECIFIED (fn);
    3378              :                 }
    3379              :             }
    3380              : 
    3381              :           /* Local classes in templates have CLASSTYPE_USE_TEMPLATE set,
    3382              :              but have no TEMPLATE_INFO, so don't try to check it.  */
    3383              :           template_decl = NULL_TREE;
    3384              :         }
    3385     45587126 :       else if (VAR_P (decl) && DECL_TINFO_P (decl)
    3386    309847959 :                && flag_visibility_ms_compat)
    3387              :         {
    3388              :           /* Under -fvisibility-ms-compat, types are visible by default,
    3389              :              even though their contents aren't.  */
    3390           84 :           tree underlying_type = TREE_TYPE (DECL_NAME (decl));
    3391           84 :           int underlying_vis = type_visibility (underlying_type);
    3392           84 :           if (underlying_vis == VISIBILITY_ANON
    3393           84 :               || (CLASS_TYPE_P (underlying_type)
    3394           69 :                   && CLASSTYPE_VISIBILITY_SPECIFIED (underlying_type)))
    3395           54 :             constrain_visibility (decl, underlying_vis, false);
    3396              :           else
    3397           30 :             DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
    3398              :         }
    3399    304893255 :       else if (VAR_P (decl) && DECL_TINFO_P (decl))
    3400              :         {
    3401              :           /* tinfo visibility is based on the type it's for.  */
    3402      4954536 :           constrain_visibility
    3403      4954536 :             (decl, type_visibility (TREE_TYPE (DECL_NAME (decl))), false);
    3404              : 
    3405              :           /* Give the target a chance to override the visibility associated
    3406              :              with DECL.  */
    3407      4954536 :           if (TREE_PUBLIC (decl)
    3408      4952580 :               && !DECL_REALLY_EXTERN (decl)
    3409      4952580 :               && CLASS_TYPE_P (TREE_TYPE (DECL_NAME (decl)))
    3410      9877061 :               && !CLASSTYPE_VISIBILITY_SPECIFIED (TREE_TYPE (DECL_NAME (decl))))
    3411       107817 :             targetm.cxx.determine_class_data_visibility (decl);
    3412              :         }
    3413    299938719 :       else if (template_decl)
    3414              :         /* Template instantiations and specializations get visibility based
    3415              :            on their template unless they override it with an attribute.  */;
    3416    101610435 :       else if (! DECL_VISIBILITY_SPECIFIED (decl))
    3417              :         {
    3418     93686331 :           if (determine_hidden_inline (decl))
    3419           12 :             DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
    3420              :           else
    3421              :             {
    3422              :               /* Set default visibility to whatever the user supplied with
    3423              :                  #pragma GCC visibility or a namespace visibility attribute.  */
    3424     93686319 :               DECL_VISIBILITY (decl) = default_visibility;
    3425     93686319 :               DECL_VISIBILITY_SPECIFIED (decl) = visibility_options.inpragma;
    3426              :             }
    3427              :         }
    3428              :     }
    3429              : 
    3430    425984031 :   if (template_decl)
    3431              :     {
    3432              :       /* If the specialization doesn't specify visibility, use the
    3433              :          visibility from the template.  */
    3434    346102905 :       tree tinfo = get_template_info (template_decl);
    3435    346102905 :       tree args = TI_ARGS (tinfo);
    3436    346102905 :       tree attribs = (TREE_CODE (decl) == TYPE_DECL
    3437    346102905 :                       ? TYPE_ATTRIBUTES (TREE_TYPE (decl))
    3438    346102905 :                       : DECL_ATTRIBUTES (decl));
    3439    346102905 :       tree attr = lookup_attribute ("visibility", attribs);
    3440              : 
    3441    346102905 :       if (args != error_mark_node)
    3442              :         {
    3443    346102905 :           tree pattern = DECL_TEMPLATE_RESULT (TI_TEMPLATE (tinfo));
    3444              : 
    3445    346102905 :           if (!DECL_VISIBILITY_SPECIFIED (decl))
    3446              :             {
    3447    156115664 :               if (!attr
    3448    156115664 :                   && determine_hidden_inline (decl))
    3449           33 :                 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
    3450              :               else
    3451              :                 {
    3452    156115631 :                   DECL_VISIBILITY (decl) = DECL_VISIBILITY (pattern);
    3453    312231262 :                   DECL_VISIBILITY_SPECIFIED (decl)
    3454    156115631 :                     = DECL_VISIBILITY_SPECIFIED (pattern);
    3455              :                 }
    3456              :             }
    3457              : 
    3458    346102905 :           if (args
    3459              :               /* Template argument visibility outweighs #pragma or namespace
    3460              :                  visibility, but not an explicit attribute.  */
    3461    346102905 :               && !attr)
    3462              :             {
    3463    346102884 :               int depth = TMPL_ARGS_DEPTH (args);
    3464    346102884 :               if (DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P (TI_TEMPLATE (tinfo)))
    3465              :                 /* Class template args don't affect template friends.  */;
    3466    343523458 :               else if (DECL_VISIBILITY_SPECIFIED (decl))
    3467              :                 {
    3468              :                   /* A class template member with explicit visibility
    3469              :                      overrides the class visibility, so we need to apply
    3470              :                      all the levels of template args directly.  */
    3471              :                   int i;
    3472    611757205 :                   for (i = 1; i <= depth; ++i)
    3473              :                     {
    3474    310483667 :                       tree lev = TMPL_ARGS_LEVEL (args, i);
    3475    310483667 :                       constrain_visibility_for_template (decl, lev);
    3476              :                     }
    3477              :                 }
    3478     42249920 :               else if (PRIMARY_TEMPLATE_P (TI_TEMPLATE (tinfo)))
    3479              :                 /* Limit visibility based on its template arguments.  */
    3480     28628090 :                 constrain_visibility_for_template (decl, args);
    3481              :             }
    3482              :         }
    3483              :     }
    3484              : 
    3485    626588924 :   if (class_type)
    3486    319418976 :     determine_visibility_from_class (decl, class_type);
    3487              : 
    3488    626588924 :   if (decl_internal_context_p (decl))
    3489              :     /* Names in an anonymous namespace get internal linkage.  */
    3490       282626 :     constrain_visibility (decl, VISIBILITY_ANON, false);
    3491    626306298 :   else if (TREE_CODE (decl) != TYPE_DECL)
    3492              :     {
    3493              :       /* Propagate anonymity from type to decl.  */
    3494    452980590 :       int tvis = type_visibility (TREE_TYPE (decl));
    3495    452980590 :       if (tvis == VISIBILITY_ANON
    3496    452980590 :           || ! DECL_VISIBILITY_SPECIFIED (decl))
    3497     67009893 :         constrain_visibility (decl, tvis, false);
    3498              :     }
    3499    173325708 :   else if (no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/true))
    3500              :     /* DR 757: A type without linkage shall not be used as the type of a
    3501              :        variable or function with linkage, unless
    3502              :        o the variable or function has extern "C" linkage (7.5 [dcl.link]), or
    3503              :        o the variable or function is not used (3.2 [basic.def.odr]) or is
    3504              :        defined in the same translation unit.
    3505              : 
    3506              :        Since non-extern "C" decls need to be defined in the same
    3507              :        translation unit, we can make the type internal.  */
    3508       749439 :     constrain_visibility (decl, VISIBILITY_ANON, false);
    3509              : 
    3510              :   /* If visibility changed and DECL already has DECL_RTL, ensure
    3511              :      symbol flags are updated.  */
    3512    626588924 :   if ((DECL_VISIBILITY (decl) != orig_visibility
    3513    625600725 :        || DECL_VISIBILITY_SPECIFIED (decl) != orig_visibility_specified)
    3514    331132640 :       && ((VAR_P (decl) && TREE_STATIC (decl))
    3515    306914918 :           || TREE_CODE (decl) == FUNCTION_DECL)
    3516    936045349 :       && DECL_RTL_SET_P (decl))
    3517            0 :     make_decl_rtl (decl);
    3518              : }
    3519              : 
    3520              : /* By default, static data members and function members receive
    3521              :    the visibility of their containing class.  */
    3522              : 
    3523              : static void
    3524    319456465 : determine_visibility_from_class (tree decl, tree class_type)
    3525              : {
    3526    319456465 :   if (DECL_VISIBILITY_SPECIFIED (decl))
    3527              :     return;
    3528              : 
    3529    160227695 :   if (determine_hidden_inline (decl))
    3530          145 :     DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
    3531              :   else
    3532              :     {
    3533              :       /* Default to the class visibility.  */
    3534    160227550 :       DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type);
    3535    320455100 :       DECL_VISIBILITY_SPECIFIED (decl)
    3536    160227550 :         = CLASSTYPE_VISIBILITY_SPECIFIED (class_type);
    3537              :     }
    3538              : 
    3539              :   /* Give the target a chance to override the visibility associated
    3540              :      with DECL.  */
    3541    160227695 :   if (VAR_P (decl)
    3542     16354133 :       && TREE_PUBLIC (decl)
    3543     16354121 :       && (DECL_TINFO_P (decl) || DECL_VTABLE_OR_VTT_P (decl))
    3544      2238508 :       && !DECL_REALLY_EXTERN (decl)
    3545    162466203 :       && !CLASSTYPE_VISIBILITY_SPECIFIED (class_type))
    3546        75261 :     targetm.cxx.determine_class_data_visibility (decl);
    3547              : }
    3548              : 
    3549              : /* Returns true iff DECL is an inline that should get hidden visibility
    3550              :    because of -fvisibility-inlines-hidden.  */
    3551              : 
    3552              : static bool
    3553    410063105 : determine_hidden_inline (tree decl)
    3554              : {
    3555    410063105 :   return (visibility_options.inlines_hidden
    3556              :           /* Don't do this for inline templates; specializations might not be
    3557              :              inline, and we don't want them to inherit the hidden
    3558              :              visibility.  We'll set it here for all inline instantiations.  */
    3559          410 :           && !processing_template_decl
    3560          386 :           && TREE_CODE (decl) == FUNCTION_DECL
    3561          297 :           && DECL_DECLARED_INLINE_P (decl)
    3562    410063316 :           && (! DECL_LANG_SPECIFIC (decl)
    3563          211 :               || ! DECL_EXPLICIT_INSTANTIATION (decl)));
    3564              : }
    3565              : 
    3566              : /* Constrain the visibility of a class TYPE based on the visibility of its
    3567              :    field types.  Warn if any fields require lesser visibility.  */
    3568              : 
    3569              : void
    3570     49904436 : constrain_class_visibility (tree type)
    3571              : {
    3572     49904436 :   tree binfo;
    3573     49904436 :   tree t;
    3574     49904436 :   int i;
    3575              : 
    3576     49904436 :   int vis = type_visibility (type);
    3577              : 
    3578     49904436 :   if (vis == VISIBILITY_ANON
    3579     49904436 :       || DECL_IN_SYSTEM_HEADER (TYPE_MAIN_DECL (type)))
    3580      1302190 :     return;
    3581              : 
    3582              :   /* Don't warn about visibility if the class has explicit visibility.  */
    3583     48602246 :   if (CLASSTYPE_VISIBILITY_SPECIFIED (type))
    3584     47813503 :     vis = VISIBILITY_INTERNAL;
    3585              : 
    3586    404507666 :   for (t = TYPE_FIELDS (type); t; t = DECL_CHAIN (t))
    3587     35966026 :     if (TREE_CODE (t) == FIELD_DECL && TREE_TYPE (t) != error_mark_node
    3588    391871287 :         && !DECL_ARTIFICIAL (t))
    3589              :       {
    3590     12021203 :         tree ftype = strip_pointer_or_array_types (TREE_TYPE (t));
    3591     12021203 :         int subvis = type_visibility (ftype);
    3592              : 
    3593     12021203 :         if (subvis == VISIBILITY_ANON)
    3594              :           {
    3595          110 :             if (!in_main_input_context())
    3596              :               {
    3597           27 :                 tree nlt = no_linkage_check (ftype, /*relaxed_p=*/false);
    3598           27 :                 if (nlt)
    3599              :                   {
    3600            6 :                     if (same_type_p (TREE_TYPE (t), nlt))
    3601            6 :                       warning (OPT_Wsubobject_linkage, "\
    3602              : %qT has a field %q#D whose type has no linkage",
    3603              :                                type, t);
    3604              :                     else
    3605            0 :                       warning (OPT_Wsubobject_linkage, "\
    3606              : %qT has a field %qD whose type depends on the type %qT which has no linkage",
    3607              :                                type, t, nlt);
    3608              :                   }
    3609           21 :                 else if (cxx_dialect > cxx98
    3610           21 :                          && !decl_anon_ns_mem_p (ftype))
    3611            2 :                   warning (OPT_Wsubobject_linkage, "\
    3612              : %qT has a field %q#D whose type has internal linkage",
    3613              :                            type, t);
    3614              :                 else // In C++98 this can only happen with unnamed namespaces.
    3615           19 :                   warning (OPT_Wsubobject_linkage, "\
    3616              : %qT has a field %q#D whose type uses the anonymous namespace",
    3617              :                            type, t);
    3618              :               }
    3619              :           }
    3620     12021093 :         else if (MAYBE_CLASS_TYPE_P (ftype)
    3621      4682728 :                  && vis < VISIBILITY_HIDDEN
    3622      4682728 :                  && subvis >= VISIBILITY_HIDDEN)
    3623            6 :           warning (OPT_Wattributes, "\
    3624              : %qT declared with greater visibility than the type of its field %qD",
    3625              :                    type, t);
    3626              :       }
    3627              : 
    3628     48602246 :   binfo = TYPE_BINFO (type);
    3629     72234507 :   for (i = 0; BINFO_BASE_ITERATE (binfo, i, t); ++i)
    3630              :     {
    3631     23632261 :       tree btype = BINFO_TYPE (t);
    3632     23632261 :       int subvis = type_visibility (btype);
    3633              : 
    3634     23632261 :       if (subvis == VISIBILITY_ANON)
    3635              :         {
    3636           32 :           if (!in_main_input_context())
    3637              :             {
    3638           18 :               tree nlt = no_linkage_check (btype, /*relaxed_p=*/false);
    3639           18 :               if (nlt)
    3640              :                 {
    3641            6 :                   if (same_type_p (btype, nlt))
    3642            6 :                     warning (OPT_Wsubobject_linkage, "\
    3643              : %qT has a base %qT which has no linkage",
    3644              :                              type, btype);
    3645              :                   else
    3646            0 :                     warning (OPT_Wsubobject_linkage, "\
    3647              : %qT has a base %qT which depends on the type %qT which has no linkage",
    3648              :                              type, btype, nlt);
    3649              :                 }
    3650           12 :               else if (cxx_dialect > cxx98
    3651           12 :                        && !decl_anon_ns_mem_p (btype))
    3652            3 :                 warning (OPT_Wsubobject_linkage, "\
    3653              : %qT has a base %qT which has internal linkage",
    3654              :                          type, btype);
    3655              :               else // In C++98 this can only happen with unnamed namespaces.
    3656            9 :                 warning (OPT_Wsubobject_linkage, "\
    3657              : %qT has a base %qT which uses the anonymous namespace",
    3658              :                          type, btype);
    3659              :             }
    3660              :         }
    3661     23632229 :       else if (vis < VISIBILITY_HIDDEN
    3662     23632229 :                && subvis >= VISIBILITY_HIDDEN)
    3663            6 :         warning (OPT_Wattributes, "\
    3664              : %qT declared with greater visibility than its base %qT",
    3665            6 :                  type, TREE_TYPE (t));
    3666              :     }
    3667              : }
    3668              : 
    3669              : /* Functions for adjusting the visibility of a tagged type and its nested
    3670              :    types and declarations when it gets a name for linkage purposes from a
    3671              :    typedef.  */
    3672              : // FIXME: It is now a DR for such a class type to contain anything
    3673              : // other than C.  So at minium most of this can probably be deleted.
    3674              : 
    3675              : /* First reset the visibility of all the types.  */
    3676              : 
    3677              : static void
    3678      1085892 : reset_type_linkage_1 (tree type)
    3679              : {
    3680      1085892 :   set_linkage_according_to_type (type, TYPE_MAIN_DECL (type));
    3681      1085892 :   if (CLASS_TYPE_P (type))
    3682      3626228 :     for (tree member = TYPE_FIELDS (type); member; member = DECL_CHAIN (member))
    3683      2882759 :       if (DECL_IMPLICIT_TYPEDEF_P (member))
    3684       232476 :         reset_type_linkage_1 (TREE_TYPE (member));
    3685      1085892 : }
    3686              : 
    3687              : /* Then reset the visibility of any static data members or member
    3688              :    functions that use those types.  */
    3689              : 
    3690              : static void
    3691          103 : reset_decl_linkage (tree decl)
    3692              : {
    3693          103 :   if (TREE_PUBLIC (decl))
    3694              :     return;
    3695          103 :   if (DECL_CLONED_FUNCTION_P (decl))
    3696              :     return;
    3697           99 :   TREE_PUBLIC (decl) = true;
    3698           99 :   DECL_INTERFACE_KNOWN (decl) = false;
    3699           99 :   determine_visibility (decl);
    3700           99 :   tentative_decl_linkage (decl);
    3701              : }
    3702              : 
    3703              : void
    3704       853416 : reset_type_linkage (tree type)
    3705              : {
    3706       853416 :   reset_type_linkage_1 (type);
    3707       853416 :   if (CLASS_TYPE_P (type))
    3708              :     {
    3709       511005 :       if (tree vt = CLASSTYPE_VTABLES (type))
    3710              :         {
    3711           15 :           tree name = mangle_vtbl_for_type (type);
    3712           15 :           DECL_NAME (vt) = name;
    3713           15 :           SET_DECL_ASSEMBLER_NAME (vt, name);
    3714           15 :           reset_decl_linkage (vt);
    3715              :         }
    3716       511005 :       if (!ANON_AGGR_TYPE_P (type))
    3717       510868 :         if (tree ti = CLASSTYPE_TYPEINFO_VAR (type))
    3718              :           {
    3719           12 :             tree name = mangle_typeinfo_for_type (type);
    3720           12 :             DECL_NAME (ti) = name;
    3721           12 :             SET_DECL_ASSEMBLER_NAME (ti, name);
    3722           12 :             TREE_TYPE (name) = type;
    3723           12 :             reset_decl_linkage (ti);
    3724              :           }
    3725      2402545 :       for (tree m = TYPE_FIELDS (type); m; m = DECL_CHAIN (m))
    3726              :         {
    3727      1891540 :           tree mem = STRIP_TEMPLATE (m);
    3728      1891540 :           if (TREE_CODE (mem) == VAR_DECL || TREE_CODE (mem) == FUNCTION_DECL)
    3729           76 :             reset_decl_linkage (mem);
    3730      1891464 :           else if (DECL_IMPLICIT_TYPEDEF_P (mem))
    3731       122228 :             reset_type_linkage (TREE_TYPE (mem));
    3732              :         }
    3733              :     }
    3734       853416 : }
    3735              : 
    3736              : /* Set up our initial idea of what the linkage of DECL should be.  */
    3737              : 
    3738              : void
    3739     29927534 : tentative_decl_linkage (tree decl)
    3740              : {
    3741     29927534 :   if (DECL_INTERFACE_KNOWN (decl))
    3742              :     /* We've already made a decision as to how this function will
    3743              :        be handled.  */;
    3744     29926398 :   else if (vague_linkage_p (decl))
    3745              :     {
    3746     29925810 :       if (TREE_CODE (decl) == FUNCTION_DECL
    3747     29925810 :           && decl_defined_p (decl))
    3748              :         {
    3749     29903209 :           DECL_EXTERNAL (decl) = 1;
    3750     29903209 :           DECL_NOT_REALLY_EXTERN (decl) = 1;
    3751     29903209 :           note_vague_linkage_fn (decl);
    3752              :           /* A non-template inline function with external linkage will
    3753              :              always be COMDAT.  As we must eventually determine the
    3754              :              linkage of all functions, and as that causes writes to
    3755              :              the data mapped in from the PCH file, it's advantageous
    3756              :              to mark the functions at this point.  */
    3757     29903209 :           if (DECL_DECLARED_INLINE_P (decl))
    3758              :             {
    3759     29900663 :               if (!DECL_IMPLICIT_INSTANTIATION (decl)
    3760     29900663 :                   || DECL_DEFAULTED_FN (decl))
    3761              :                 {
    3762              :                   /* This function must have external linkage, as
    3763              :                      otherwise DECL_INTERFACE_KNOWN would have been
    3764              :                      set.  */
    3765     24858490 :                   gcc_assert (TREE_PUBLIC (decl));
    3766     24858490 :                   comdat_linkage (decl);
    3767     24858490 :                   DECL_INTERFACE_KNOWN (decl) = 1;
    3768              :                 }
    3769      5042173 :               else if (DECL_MAYBE_IN_CHARGE_CDTOR_P (decl))
    3770              :                 /* For implicit instantiations of cdtors try to make
    3771              :                    it comdat, so that maybe_clone_body can use aliases.
    3772              :                    See PR113208.  */
    3773       655499 :                 maybe_make_one_only (decl);
    3774              :             }
    3775              :         }
    3776        22601 :       else if (VAR_P (decl))
    3777        22599 :         maybe_commonize_var (decl);
    3778              :     }
    3779     29927534 : }
    3780              : 
    3781              : /* For a polymorphic class type CTYPE, whether its vtables are emitted in a
    3782              :    unique object as per the ABI.  */
    3783              : 
    3784              : static bool
    3785         2845 : vtables_uniquely_emitted (tree ctype)
    3786              : {
    3787              :   /* If the class is templated, the tables are emitted in every object that
    3788              :      references any of them.  */
    3789         2845 :   if (CLASSTYPE_USE_TEMPLATE (ctype))
    3790              :     return false;
    3791              : 
    3792              :   /* Otherwise, if the class is attached to a module, the tables are uniquely
    3793              :      emitted in the object for the module unit in which it is defined.  */
    3794         2219 :   tree cdecl = TYPE_NAME (ctype);
    3795         2354 :   if (DECL_LANG_SPECIFIC (cdecl) && DECL_MODULE_ATTACH_P (cdecl))
    3796              :     return true;
    3797              : 
    3798              :   /* Otherwise, if the class has a key function, the tables are emitted in the
    3799              :      object for the TU containing the definition of the key function.  This is
    3800              :      unique if the key function is not inline.  */
    3801         2087 :   tree key_method = CLASSTYPE_KEY_METHOD (ctype);
    3802         4154 :   if (key_method && !DECL_NONGNU_INLINE_P (key_method))
    3803         2047 :     return true;
    3804              : 
    3805              :   /* Otherwise, the tables are emitted in every object that references
    3806              :      any of them.  */
    3807              :   return false;
    3808              : }
    3809              : 
    3810              : /* DECL is a FUNCTION_DECL or VAR_DECL.  If the object file linkage
    3811              :    for DECL has not already been determined, do so now by setting
    3812              :    DECL_EXTERNAL, DECL_COMDAT and other related flags.  Until this
    3813              :    function is called entities with vague linkage whose definitions
    3814              :    are available must have TREE_PUBLIC set.
    3815              : 
    3816              :    If this function decides to place DECL in COMDAT, it will set
    3817              :    appropriate flags -- but will not clear DECL_EXTERNAL.  It is up to
    3818              :    the caller to decide whether or not to clear DECL_EXTERNAL.  Some
    3819              :    callers defer that decision until it is clear that DECL is actually
    3820              :    required.  */
    3821              : 
    3822              : void
    3823    227162592 : import_export_decl (tree decl)
    3824              : {
    3825    227162592 :   bool comdat_p;
    3826    227162592 :   bool import_p;
    3827    227162592 :   tree class_type = NULL_TREE;
    3828              : 
    3829    227162592 :   if (DECL_INTERFACE_KNOWN (decl))
    3830              :     return;
    3831              : 
    3832              :   /* We cannot determine what linkage to give to an entity with vague
    3833              :      linkage until the end of the file.  For example, a virtual table
    3834              :      for a class will be defined if and only if the key method is
    3835              :      defined in this translation unit.  */
    3836     38902351 :   gcc_assert (at_eof);
    3837              :   /* Object file linkage for explicit instantiations is handled in
    3838              :      mark_decl_instantiated.  For static variables in functions with
    3839              :      vague linkage, maybe_commonize_var is used.
    3840              : 
    3841              :      Therefore, the only declarations that should be provided to this
    3842              :      function are those with external linkage that are:
    3843              : 
    3844              :      * implicit instantiations of function templates
    3845              : 
    3846              :      * inline functions
    3847              : 
    3848              :      * inline variables
    3849              : 
    3850              :      * implicit instantiations of static data members of class
    3851              :        templates
    3852              : 
    3853              :      * virtual tables
    3854              : 
    3855              :      * typeinfo objects
    3856              : 
    3857              :      Furthermore, all entities that reach this point must have a
    3858              :      definition available in this translation unit.
    3859              : 
    3860              :      The following assertions check these conditions.  */
    3861     38902351 :   gcc_assert (VAR_OR_FUNCTION_DECL_P (decl));
    3862              :   /* Any code that creates entities with TREE_PUBLIC cleared should
    3863              :      also set DECL_INTERFACE_KNOWN.  */
    3864     38902351 :   gcc_assert (TREE_PUBLIC (decl));
    3865     38902351 :   if (TREE_CODE (decl) == FUNCTION_DECL)
    3866     20970168 :     gcc_assert (DECL_IMPLICIT_INSTANTIATION (decl)
    3867              :                 || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl)
    3868              :                 || DECL_DECLARED_INLINE_P (decl));
    3869              :   else
    3870     17932183 :     gcc_assert (DECL_IMPLICIT_INSTANTIATION (decl)
    3871              :                 || DECL_INLINE_VAR_P (decl)
    3872              :                 || DECL_VTABLE_OR_VTT_P (decl)
    3873              :                 || DECL_TINFO_P (decl));
    3874              :   /* Check that a definition of DECL is available in this translation
    3875              :      unit.  */
    3876     38902351 :   gcc_assert (!DECL_REALLY_EXTERN (decl));
    3877              : 
    3878              :   /* Assume that DECL will not have COMDAT linkage.  */
    3879     38902351 :   comdat_p = false;
    3880              :   /* Assume that DECL will not be imported into this translation
    3881              :      unit.  */
    3882     38902351 :   import_p = false;
    3883              : 
    3884     38902351 :   if (VAR_P (decl) && DECL_VTABLE_OR_VTT_P (decl))
    3885              :     {
    3886      1611271 :       class_type = DECL_CONTEXT (decl);
    3887      1611271 :       import_export_class (class_type);
    3888      1611271 :       if (CLASSTYPE_INTERFACE_KNOWN (class_type)
    3889      1611271 :           && CLASSTYPE_INTERFACE_ONLY (class_type))
    3890              :         import_p = true;
    3891       516701 :       else if ((!flag_weak || TARGET_WEAK_NOT_IN_ARCHIVE_TOC)
    3892       516701 :                && !vtables_uniquely_emitted (class_type))
    3893              :         /* The ABI historically required that all virtual tables be
    3894              :            emitted with COMDAT linkage.  However, on systems where
    3895              :            COMDAT symbols don't show up in the table of contents for
    3896              :            a static archive, or on systems without weak symbols (where
    3897              :            we approximate COMDAT linkage by using internal linkage),
    3898              :            the linker will report errors about undefined symbols because
    3899              :            it will not see the virtual table definition.  Therefore,
    3900              :            in the case that we know that the virtual table will be
    3901              :            emitted in only one translation unit, we make the virtual
    3902              :            table an ordinary definition with external linkage.  */
    3903            3 :         DECL_EXTERNAL (decl) = 0;
    3904       516698 :       else if (CLASSTYPE_INTERFACE_KNOWN (class_type))
    3905              :         {
    3906              :           /* CLASS_TYPE is being exported from this translation unit,
    3907              :              so DECL should be defined here.  */
    3908         2842 :           if (!flag_weak && CLASSTYPE_EXPLICIT_INSTANTIATION (class_type))
    3909              :             /* If a class is declared in a header with the "extern
    3910              :                template" extension, then it will not be instantiated,
    3911              :                even in translation units that would normally require
    3912              :                it.  Often such classes are explicitly instantiated in
    3913              :                one translation unit.  Therefore, the explicit
    3914              :                instantiation must be made visible to other translation
    3915              :                units.  */
    3916            0 :             DECL_EXTERNAL (decl) = 0;
    3917              :           else
    3918              :             {
    3919              :               /* The generic C++ ABI used to say that class data is always
    3920              :                  COMDAT, even if emitted in a unique object.  This is no
    3921              :                  longer true, but for now we continue to do so for
    3922              :                  compatibility with programs that are not strictly valid.
    3923              :                  However, some variants (e.g., the ARM EABI) explicitly say
    3924              :                  that class data only has COMDAT linkage if the class data
    3925              :                  might be emitted in more than one translation unit.
    3926              :                  When the key method can be inline and is inline, we still
    3927              :                  have to arrange for comdat even though
    3928              :                  class_data_always_comdat is false.  */
    3929         2842 :               if (!vtables_uniquely_emitted (class_type)
    3930         2842 :                   || targetm.cxx.class_data_always_comdat ())
    3931              :                 {
    3932              :                   /* The ABI requires COMDAT linkage.  Normally, we
    3933              :                      only emit COMDAT things when they are needed;
    3934              :                      make sure that we realize that this entity is
    3935              :                      indeed needed.  */
    3936         2842 :                   comdat_p = true;
    3937         2842 :                   mark_needed (decl);
    3938              :                 }
    3939              :             }
    3940              :         }
    3941       513856 :       else if (!flag_implicit_templates
    3942       513856 :                && CLASSTYPE_IMPLICIT_INSTANTIATION (class_type))
    3943              :         import_p = true;
    3944              :       else
    3945              :         comdat_p = true;
    3946              :     }
    3947     37291080 :   else if (VAR_P (decl) && DECL_TINFO_P (decl))
    3948              :     {
    3949      2247678 :       tree type = TREE_TYPE (DECL_NAME (decl));
    3950      2247678 :       if (CLASS_TYPE_P (type))
    3951              :         {
    3952      2245009 :           class_type = type;
    3953      2245009 :           import_export_class (type);
    3954      2245009 :           if (CLASSTYPE_INTERFACE_KNOWN (type)
    3955      1247552 :               && TYPE_CONTAINS_VPTR_P (type)
    3956      1247462 :               && CLASSTYPE_INTERFACE_ONLY (type)
    3957              :               /* If -fno-rtti was specified, then we cannot be sure
    3958              :                  that RTTI information will be emitted with the
    3959              :                  virtual table of the class, so we must emit it
    3960              :                  wherever it is used.  */
    3961      3488569 :               && flag_rtti)
    3962              :             import_p = true;
    3963              :           else
    3964              :             {
    3965      1001495 :               if (CLASSTYPE_INTERFACE_KNOWN (type)
    3966      1001495 :                   && !CLASSTYPE_INTERFACE_ONLY (type))
    3967              :                 {
    3968         3932 :                   comdat_p = (targetm.cxx.class_data_always_comdat ()
    3969         3932 :                               || !vtables_uniquely_emitted (class_type));
    3970         3932 :                   mark_needed (decl);
    3971         3932 :                   if (!flag_weak)
    3972              :                     {
    3973            0 :                       comdat_p = false;
    3974            0 :                       DECL_EXTERNAL (decl) = 0;
    3975              :                     }
    3976              :                 }
    3977              :               else
    3978              :                 comdat_p = true;
    3979              :             }
    3980              :         }
    3981              :       else
    3982              :         comdat_p = true;
    3983              :     }
    3984     35043402 :   else if (DECL_TEMPLOID_INSTANTIATION (decl))
    3985              :     {
    3986              :       /* DECL is an implicit instantiation of a function or static
    3987              :          data member.  */
    3988     34801113 :       if (flag_implicit_templates
    3989     34801113 :           || (flag_implicit_inline_templates
    3990        21112 :               && TREE_CODE (decl) == FUNCTION_DECL
    3991        16891 :               && DECL_DECLARED_INLINE_P (decl)))
    3992              :         comdat_p = true;
    3993              :       else
    3994              :         /* If we are not implicitly generating templates, then mark
    3995              :            this entity as undefined in this translation unit.  */
    3996              :         import_p = true;
    3997              :     }
    3998       242289 :   else if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
    3999              :     {
    4000       233545 :       if (!DECL_NONGNU_INLINE_P (decl))
    4001              :         {
    4002            0 :           tree ctype = DECL_CONTEXT (decl);
    4003            0 :           import_export_class (ctype);
    4004            0 :           if (CLASSTYPE_INTERFACE_KNOWN (ctype))
    4005              :             {
    4006            0 :               DECL_NOT_REALLY_EXTERN (decl)
    4007            0 :                 = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
    4008            0 :                      || (DECL_DECLARED_INLINE_P (decl)
    4009            0 :                          && ! flag_implement_inlines
    4010            0 :                          && !DECL_VINDEX (decl)));
    4011              : 
    4012            0 :               if (!DECL_NOT_REALLY_EXTERN (decl))
    4013            0 :                 DECL_EXTERNAL (decl) = 1;
    4014              : 
    4015              :               /* Always make artificials weak.  */
    4016            0 :               if (DECL_ARTIFICIAL (decl) && flag_weak)
    4017              :                 comdat_p = true;
    4018              :               else
    4019            0 :                 maybe_make_one_only (decl);
    4020              :             }
    4021              :         }
    4022              :       else
    4023              :         comdat_p = true;
    4024              :     }
    4025              :   else
    4026              :     comdat_p = true;
    4027              : 
    4028         2845 :   if (import_p)
    4029              :     {
    4030              :       /* If we are importing DECL into this translation unit, mark is
    4031              :          an undefined here.  */
    4032      2345684 :       DECL_EXTERNAL (decl) = 1;
    4033      2345684 :       DECL_NOT_REALLY_EXTERN (decl) = 0;
    4034              :     }
    4035     36556667 :   else if (comdat_p)
    4036              :     {
    4037              :       /* If we decided to put DECL in COMDAT, mark it accordingly at
    4038              :          this point.  */
    4039     36556664 :       comdat_linkage (decl);
    4040              :     }
    4041              : 
    4042     38902351 :   DECL_INTERFACE_KNOWN (decl) = 1;
    4043              : }
    4044              : 
    4045              : /* Return an expression that performs the destruction of DECL, which
    4046              :    must be a VAR_DECL whose type has a non-trivial destructor, or is
    4047              :    an array whose (innermost) elements have a non-trivial destructor.  */
    4048              : 
    4049              : tree
    4050         1330 : build_cleanup (tree decl)
    4051              : {
    4052         1330 :   tree clean = cxx_maybe_build_cleanup (decl, tf_warning_or_error);
    4053         1330 :   gcc_assert (clean != NULL_TREE);
    4054         1330 :   return clean;
    4055              : }
    4056              : 
    4057              : /* GUARD is a helper variable for DECL; make them have the same linkage and
    4058              :    visibility.  */
    4059              : 
    4060              : void
    4061        72120 : copy_linkage (tree guard, tree decl)
    4062              : {
    4063        72120 :   TREE_PUBLIC (guard) = TREE_PUBLIC (decl);
    4064        72120 :   TREE_STATIC (guard) = TREE_STATIC (decl);
    4065        72120 :   DECL_COMMON (guard) = DECL_COMMON (decl);
    4066        72120 :   DECL_COMDAT (guard) = DECL_COMDAT (decl);
    4067        72120 :   if (TREE_STATIC (guard))
    4068              :     {
    4069         6279 :       CP_DECL_THREAD_LOCAL_P (guard) = CP_DECL_THREAD_LOCAL_P (decl);
    4070         6279 :       set_decl_tls_model (guard, DECL_TLS_MODEL (decl));
    4071         6279 :       if (DECL_ONE_ONLY (decl))
    4072         4371 :         make_decl_one_only (guard, cxx_comdat_group (guard));
    4073         6279 :       if (TREE_PUBLIC (decl))
    4074         5083 :         DECL_WEAK (guard) = DECL_WEAK (decl);
    4075              :       /* Also check vague_linkage_p, as DECL_WEAK and DECL_ONE_ONLY might not
    4076              :          be set until import_export_decl at EOF.  */
    4077         6279 :       if (vague_linkage_p (decl))
    4078         4389 :         comdat_linkage (guard);
    4079         6279 :       DECL_VISIBILITY (guard) = DECL_VISIBILITY (decl);
    4080         6279 :       DECL_VISIBILITY_SPECIFIED (guard) = DECL_VISIBILITY_SPECIFIED (decl);
    4081         6279 :       if (!TREE_PUBLIC (decl))
    4082              :         {
    4083         1196 :           gcc_checking_assert (DECL_INTERFACE_KNOWN (decl));
    4084         1196 :           DECL_INTERFACE_KNOWN (guard) = 1;
    4085         1196 :           if (DECL_LANG_SPECIFIC (decl) && DECL_LANG_SPECIFIC (guard))
    4086          244 :             DECL_NOT_REALLY_EXTERN (guard) = DECL_NOT_REALLY_EXTERN (decl);
    4087              :         }
    4088              :     }
    4089        72120 : }
    4090              : 
    4091              : /* Returns the initialization guard variable for the variable DECL,
    4092              :    which has static storage duration.  */
    4093              : 
    4094              : tree
    4095         4763 : get_guard (tree decl)
    4096              : {
    4097         4763 :   tree sname = mangle_guard_variable (decl);
    4098         4763 :   tree guard = get_global_binding (sname);
    4099         4763 :   if (! guard)
    4100              :     {
    4101         4763 :       tree guard_type;
    4102              : 
    4103              :       /* We use a type that is big enough to contain a mutex as well
    4104              :          as an integer counter.  */
    4105         4763 :       guard_type = targetm.cxx.guard_type ();
    4106         4763 :       guard = build_decl (DECL_SOURCE_LOCATION (decl),
    4107              :                           VAR_DECL, sname, guard_type);
    4108              : 
    4109              :       /* The guard should have the same linkage as what it guards.  */
    4110         4763 :       copy_linkage (guard, decl);
    4111              : 
    4112         4763 :       DECL_ARTIFICIAL (guard) = 1;
    4113         4763 :       DECL_IGNORED_P (guard) = 1;
    4114         4763 :       TREE_USED (guard) = 1;
    4115         4763 :       pushdecl_top_level_and_finish (guard, NULL_TREE);
    4116              :     }
    4117         4763 :   return guard;
    4118              : }
    4119              : 
    4120              : /* Returns true if accessing the GUARD atomic is expensive,
    4121              :    i.e. involves a call to __sync_synchronize or similar.
    4122              :    In this case let __cxa_guard_acquire handle the atomics.  */
    4123              : 
    4124              : static bool
    4125         3742 : is_atomic_expensive_p (machine_mode mode)
    4126              : {
    4127         3742 :   if (!flag_inline_atomics)
    4128              :     return true;
    4129              : 
    4130         3742 :   if (!can_compare_and_swap_p (mode, false) || !can_atomic_load_p (mode))
    4131            0 :     return true;
    4132              : 
    4133              :   return false;
    4134              : }
    4135              : 
    4136              : /* Return an atomic load of src with the appropriate memory model.  */
    4137              : 
    4138              : static tree
    4139         3742 : build_atomic_load_type (tree src, HOST_WIDE_INT model, tree type)
    4140              : {
    4141         3742 :   tree ptr_type = build_pointer_type (type);
    4142         3742 :   tree mem_model = build_int_cst (integer_type_node, model);
    4143         3742 :   tree t, addr, val;
    4144         3742 :   unsigned int size;
    4145         3742 :   int fncode;
    4146              : 
    4147         3742 :   size = tree_to_uhwi (TYPE_SIZE_UNIT (type));
    4148              : 
    4149         3742 :   fncode = BUILT_IN_ATOMIC_LOAD_N + exact_log2 (size) + 1;
    4150         3742 :   t = builtin_decl_implicit ((enum built_in_function) fncode);
    4151              : 
    4152         3742 :   addr = build1 (ADDR_EXPR, ptr_type, src);
    4153         3742 :   val = build_call_expr (t, 2, addr, mem_model);
    4154         3742 :   return val;
    4155              : }
    4156              : 
    4157              : /* Return those bits of the GUARD variable that should be set when the
    4158              :    guarded entity is actually initialized.  */
    4159              : 
    4160              : static tree
    4161         2042 : get_guard_bits (tree guard)
    4162              : {
    4163         2042 :   if (!targetm.cxx.guard_mask_bit ())
    4164              :     {
    4165              :       /* We only set the first byte of the guard, in order to leave room
    4166              :          for a mutex in the high-order bits.  */
    4167         2042 :       guard = build1 (ADDR_EXPR,
    4168         2042 :                       build_pointer_type (TREE_TYPE (guard)),
    4169              :                       guard);
    4170         2042 :       guard = build1 (NOP_EXPR,
    4171              :                       build_pointer_type (char_type_node),
    4172              :                       guard);
    4173         2042 :       guard = build1 (INDIRECT_REF, char_type_node, guard);
    4174              :     }
    4175              : 
    4176         2042 :   return guard;
    4177              : }
    4178              : 
    4179              : /* Return an expression which determines whether or not the GUARD
    4180              :    variable has already been initialized.  */
    4181              : 
    4182              : tree
    4183         4763 : get_guard_cond (tree guard, bool thread_safe)
    4184              : {
    4185         4763 :   tree guard_value;
    4186              : 
    4187         4763 :   if (!thread_safe)
    4188         1021 :     guard = get_guard_bits (guard);
    4189              :   else
    4190              :     {
    4191         3742 :       tree type = targetm.cxx.guard_mask_bit ()
    4192         3742 :                   ? TREE_TYPE (guard) : char_type_node;
    4193              : 
    4194         3742 :       if (is_atomic_expensive_p (TYPE_MODE (type)))
    4195            0 :         guard = integer_zero_node;
    4196              :       else
    4197         3742 :         guard = build_atomic_load_type (guard, MEMMODEL_ACQUIRE, type);
    4198              :     }
    4199              : 
    4200              :   /* Mask off all but the low bit.  */
    4201         4763 :   if (targetm.cxx.guard_mask_bit ())
    4202              :     {
    4203            0 :       guard_value = integer_one_node;
    4204            0 :       if (!same_type_p (TREE_TYPE (guard_value), TREE_TYPE (guard)))
    4205            0 :         guard_value = fold_convert (TREE_TYPE (guard), guard_value);
    4206            0 :       guard = cp_build_binary_op (input_location,
    4207              :                                   BIT_AND_EXPR, guard, guard_value,
    4208              :                                   tf_warning_or_error);
    4209              :     }
    4210              : 
    4211         4763 :   guard_value = integer_zero_node;
    4212         4763 :   if (!same_type_p (TREE_TYPE (guard_value), TREE_TYPE (guard)))
    4213         4763 :     guard_value = fold_convert (TREE_TYPE (guard), guard_value);
    4214         4763 :   return cp_build_binary_op (input_location,
    4215              :                              EQ_EXPR, guard, guard_value,
    4216         4763 :                              tf_warning_or_error);
    4217              : }
    4218              : 
    4219              : /* Return an expression which sets the GUARD variable, indicating that
    4220              :    the variable being guarded has been initialized.  */
    4221              : 
    4222              : tree
    4223         1021 : set_guard (tree guard)
    4224              : {
    4225         1021 :   tree guard_init;
    4226              : 
    4227              :   /* Set the GUARD to one.  */
    4228         1021 :   guard = get_guard_bits (guard);
    4229         1021 :   guard_init = integer_one_node;
    4230         1021 :   if (!same_type_p (TREE_TYPE (guard_init), TREE_TYPE (guard)))
    4231         1021 :     guard_init = fold_convert (TREE_TYPE (guard), guard_init);
    4232         1021 :   return cp_build_modify_expr (input_location, guard, NOP_EXPR, guard_init,
    4233         1021 :                                tf_warning_or_error);
    4234              : }
    4235              : 
    4236              : /* Returns true iff we can tell that VAR does not have a dynamic
    4237              :    initializer.  */
    4238              : 
    4239              : static bool
    4240         2590 : var_defined_without_dynamic_init (tree var)
    4241              : {
    4242              :   /* constinit vars are guaranteed to not have dynamic initializer,
    4243              :      but still registering the destructor counts as dynamic initialization.  */
    4244         2590 :   if (DECL_DECLARED_CONSTINIT_P (var)
    4245           24 :       && COMPLETE_TYPE_P (TREE_TYPE (var))
    4246         2608 :       && !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (var)))
    4247              :     return true;
    4248              :   /* If it's defined in another TU, we can't tell.  */
    4249         2578 :   if (DECL_EXTERNAL (var))
    4250              :     return false;
    4251              :   /* If it has a non-trivial destructor, registering the destructor
    4252              :      counts as dynamic initialization.  */
    4253         2331 :   if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (var)))
    4254              :     return false;
    4255              :   /* If it's in this TU, its initializer has been processed, unless
    4256              :      it's a case of self-initialization, then DECL_INITIALIZED_P is
    4257              :      false while the initializer is handled by finish_id_expression.  */
    4258         2150 :   if (!DECL_INITIALIZED_P (var))
    4259              :     return false;
    4260              :   /* If it has no initializer or a constant one, it's not dynamic.  */
    4261         2144 :   return (!DECL_NONTRIVIALLY_INITIALIZED_P (var)
    4262         2144 :           || DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (var));
    4263              : }
    4264              : 
    4265              : /* Returns true iff VAR is a variable that needs uses to be
    4266              :    wrapped for possible dynamic initialization.  */
    4267              : 
    4268              : bool
    4269        75674 : var_needs_tls_wrapper (tree var)
    4270              : {
    4271        75674 :   return (!error_operand_p (var)
    4272        75671 :           && CP_DECL_THREAD_LOCAL_P (var)
    4273        75671 :           && !DECL_GNU_TLS_P (var)
    4274         2728 :           && !DECL_FUNCTION_SCOPE_P (var)
    4275        78264 :           && !var_defined_without_dynamic_init (var));
    4276              : }
    4277              : 
    4278              : /* Get the FUNCTION_DECL for the shared TLS init function for this
    4279              :    translation unit.  */
    4280              : 
    4281              : static tree
    4282          195 : get_local_tls_init_fn (location_t loc)
    4283              : {
    4284          195 :   tree sname = get_identifier ("__tls_init");
    4285          195 :   tree fn = get_global_binding (sname);
    4286          195 :   if (!fn)
    4287              :     {
    4288          123 :       fn = build_lang_decl_loc (loc, FUNCTION_DECL, sname,
    4289              :                                 build_function_type (void_type_node,
    4290              :                                                      void_list_node));
    4291          123 :       SET_DECL_LANGUAGE (fn, lang_c);
    4292          123 :       TREE_PUBLIC (fn) = false;
    4293          123 :       DECL_ARTIFICIAL (fn) = true;
    4294          123 :       mark_used (fn);
    4295          123 :       set_global_binding (fn);
    4296              :     }
    4297          195 :   return fn;
    4298              : }
    4299              : 
    4300              : /* Get a FUNCTION_DECL for the init function for the thread_local
    4301              :    variable VAR.  The init function will be an alias to the function
    4302              :    that initializes all the non-local TLS variables in the translation
    4303              :    unit.  The init function is only used by the wrapper function.  */
    4304              : 
    4305              : static tree
    4306         1282 : get_tls_init_fn (tree var)
    4307              : {
    4308              :   /* Only C++11 TLS vars need this init fn.  */
    4309         1282 :   if (!var_needs_tls_wrapper (var))
    4310              :     return NULL_TREE;
    4311              : 
    4312              :   /* If -fno-extern-tls-init, assume that we don't need to call
    4313              :      a tls init function for a variable defined in another TU.  */
    4314         1263 :   if (!flag_extern_tls_init && DECL_EXTERNAL (var))
    4315              :     return NULL_TREE;
    4316              : 
    4317              :   /* If the variable is internal, or if we can't generate aliases,
    4318              :      call the local init function directly.  */
    4319         1262 :   if (!TREE_PUBLIC (var) || !TARGET_SUPPORTS_ALIASES)
    4320           72 :     return get_local_tls_init_fn (DECL_SOURCE_LOCATION (var));
    4321              : 
    4322         1190 :   tree sname = mangle_tls_init_fn (var);
    4323         1190 :   tree fn = get_global_binding (sname);
    4324         1190 :   if (!fn)
    4325              :     {
    4326          765 :       fn = build_lang_decl (FUNCTION_DECL, sname,
    4327              :                             build_function_type (void_type_node,
    4328              :                                                  void_list_node));
    4329          765 :       SET_DECL_LANGUAGE (fn, lang_c);
    4330          765 :       TREE_PUBLIC (fn) = TREE_PUBLIC (var);
    4331          765 :       DECL_ARTIFICIAL (fn) = true;
    4332          765 :       DECL_CONTEXT (fn) = FROB_CONTEXT (global_namespace);
    4333          765 :       DECL_COMDAT (fn) = DECL_COMDAT (var);
    4334          765 :       DECL_EXTERNAL (fn) = DECL_EXTERNAL (var);
    4335          765 :       if (DECL_ONE_ONLY (var))
    4336            3 :         make_decl_one_only (fn, cxx_comdat_group (fn));
    4337          765 :       if (TREE_PUBLIC (var))
    4338              :         {
    4339          765 :           tree obtype = strip_array_types (non_reference (TREE_TYPE (var)));
    4340              :           /* If the variable is defined somewhere else and might have static
    4341              :              initialization, make the init function a weak reference.  */
    4342          765 :           if ((!TYPE_NEEDS_CONSTRUCTING (obtype)
    4343          603 :                || TYPE_HAS_CONSTEXPR_CTOR (obtype)
    4344          585 :                || TYPE_HAS_TRIVIAL_DFLT (obtype))
    4345          180 :               && TYPE_HAS_TRIVIAL_DESTRUCTOR (obtype)
    4346          927 :               && DECL_EXTERNAL (var))
    4347           51 :             declare_weak (fn);
    4348              :           else
    4349          714 :             DECL_WEAK (fn) = DECL_WEAK (var);
    4350              :         }
    4351          765 :       DECL_VISIBILITY (fn) = DECL_VISIBILITY (var);
    4352          765 :       DECL_VISIBILITY_SPECIFIED (fn) = DECL_VISIBILITY_SPECIFIED (var);
    4353          765 :       DECL_DLLIMPORT_P (fn) = DECL_DLLIMPORT_P (var);
    4354          765 :       DECL_IGNORED_P (fn) = 1;
    4355          765 :       mark_used (fn);
    4356              : 
    4357          765 :       DECL_BEFRIENDING_CLASSES (fn) = var;
    4358              : 
    4359          765 :       set_global_binding (fn);
    4360              :     }
    4361              :   return fn;
    4362              : }
    4363              : 
    4364              : /* Get a FUNCTION_DECL for the init wrapper function for the thread_local
    4365              :    variable VAR.  The wrapper function calls the init function (if any) for
    4366              :    VAR and then returns a reference to VAR.  The wrapper function is used
    4367              :    in place of VAR everywhere VAR is mentioned.  */
    4368              : 
    4369              : static tree
    4370        74377 : get_tls_wrapper_fn (tree var)
    4371              : {
    4372              :   /* Only C++11 TLS vars need this wrapper fn.  */
    4373        74377 :   if (!var_needs_tls_wrapper (var))
    4374              :     return NULL_TREE;
    4375              : 
    4376          749 :   tree sname = mangle_tls_wrapper_fn (var);
    4377          749 :   tree fn = get_global_binding (sname);
    4378          749 :   if (!fn)
    4379              :     {
    4380              :       /* A named rvalue reference is an lvalue, so the wrapper should
    4381              :          always return an lvalue reference.  */
    4382          586 :       tree type = non_reference (TREE_TYPE (var));
    4383          586 :       type = build_reference_type (type);
    4384          586 :       tree fntype = build_function_type (type, void_list_node);
    4385              : 
    4386          586 :       fn = build_lang_decl_loc (DECL_SOURCE_LOCATION (var),
    4387              :                                 FUNCTION_DECL, sname, fntype);
    4388          586 :       SET_DECL_LANGUAGE (fn, lang_c);
    4389          586 :       TREE_PUBLIC (fn) = TREE_PUBLIC (var);
    4390          586 :       DECL_ARTIFICIAL (fn) = true;
    4391          586 :       DECL_IGNORED_P (fn) = 1;
    4392          586 :       DECL_CONTEXT (fn) = FROB_CONTEXT (global_namespace);
    4393              :       /* The wrapper is inline and emitted everywhere var is used.  */
    4394          586 :       DECL_DECLARED_INLINE_P (fn) = true;
    4395          586 :       if (TREE_PUBLIC (var))
    4396              :         {
    4397          514 :           comdat_linkage (fn);
    4398              : #ifdef HAVE_GAS_HIDDEN
    4399              :           /* Make the wrapper bind locally; there's no reason to share
    4400              :              the wrapper between multiple shared objects.  */
    4401          514 :           DECL_VISIBILITY (fn) = VISIBILITY_INTERNAL;
    4402          514 :           DECL_VISIBILITY_SPECIFIED (fn) = true;
    4403              : #endif
    4404              :         }
    4405          586 :       if (!TREE_PUBLIC (fn))
    4406           72 :         DECL_INTERFACE_KNOWN (fn) = true;
    4407          586 :       mark_used (fn);
    4408          586 :       note_vague_linkage_fn (fn);
    4409              : 
    4410              : #if 0
    4411              :       /* We want CSE to commonize calls to the wrapper, but marking it as
    4412              :          pure is unsafe since it has side-effects.  I guess we need a new
    4413              :          ECF flag even weaker than ECF_PURE.  FIXME!  */
    4414              :       DECL_PURE_P (fn) = true;
    4415              : #endif
    4416              : 
    4417          586 :       DECL_BEFRIENDING_CLASSES (fn) = var;
    4418              : 
    4419          586 :       set_global_binding (fn);
    4420              :     }
    4421              :   return fn;
    4422              : }
    4423              : 
    4424              : /* If EXPR is a thread_local variable that should be wrapped by init
    4425              :    wrapper function, return a call to that function, otherwise return
    4426              :    NULL.  */
    4427              : 
    4428              : tree
    4429    954807654 : maybe_get_tls_wrapper_call (tree expr)
    4430              : {
    4431    954807654 :   if (VAR_P (expr)
    4432    328220739 :       && !processing_template_decl
    4433    136360053 :       && !cp_unevaluated_operand
    4434   1089581483 :       && CP_DECL_THREAD_LOCAL_P (expr))
    4435        74377 :     if (tree wrap = get_tls_wrapper_fn (expr))
    4436          749 :       return build_cxx_call (wrap, 0, NULL, tf_warning_or_error);
    4437              :   return NULL;
    4438              : }
    4439              : 
    4440              : /* At EOF, generate the definition for the TLS wrapper function FN:
    4441              : 
    4442              :    T& var_wrapper() {
    4443              :      if (init_fn) init_fn();
    4444              :      return var;
    4445              :    }  */
    4446              : 
    4447              : static void
    4448          586 : generate_tls_wrapper (tree fn)
    4449              : {
    4450          586 :   tree var = DECL_BEFRIENDING_CLASSES (fn);
    4451              : 
    4452          586 :   start_preparsed_function (fn, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
    4453          586 :   tree body = begin_function_body ();
    4454              :   /* Only call the init fn if there might be one.  */
    4455          586 :   if (tree init_fn = get_tls_init_fn (var))
    4456              :     {
    4457          566 :       tree if_stmt = NULL_TREE;
    4458              :       /* If init_fn is a weakref, make sure it exists before calling.  */
    4459          566 :       if (lookup_attribute ("weak", DECL_ATTRIBUTES (init_fn)))
    4460              :         {
    4461           51 :           if_stmt = begin_if_stmt ();
    4462           51 :           tree addr = cp_build_addr_expr (init_fn, tf_warning_or_error);
    4463           51 :           tree cond = cp_build_binary_op (DECL_SOURCE_LOCATION (var),
    4464              :                                           NE_EXPR, addr, nullptr_node,
    4465              :                                           tf_warning_or_error);
    4466           51 :           finish_if_stmt_cond (cond, if_stmt);
    4467              :         }
    4468          566 :       finish_expr_stmt (build_cxx_call
    4469              :                         (init_fn, 0, NULL, tf_warning_or_error));
    4470          566 :       if (if_stmt)
    4471              :         {
    4472           51 :           finish_then_clause (if_stmt);
    4473           51 :           finish_if_stmt (if_stmt);
    4474              :         }
    4475              :     }
    4476              :   else
    4477              :     /* If there's no initialization, the wrapper is a constant function.  */
    4478           20 :     TREE_READONLY (fn) = true;
    4479          586 :   finish_return_stmt (convert_from_reference (var));
    4480          586 :   finish_function_body (body);
    4481          586 :   expand_or_defer_fn (finish_function (/*inline_p=*/false));
    4482          586 : }
    4483              : 
    4484              : /* Start a global constructor or destructor function.  */
    4485              : 
    4486              : static tree
    4487         7450 : start_objects (bool initp, unsigned priority, bool has_body,
    4488              :                bool omp_target = false)
    4489              : {
    4490         7450 :   bool default_init = initp && priority == DEFAULT_INIT_PRIORITY;
    4491              :   /* FIXME: We may eventually want to treat OpenMP offload initializers
    4492              :      in modules specially as well.  */
    4493         7450 :   bool is_module_init = (default_init
    4494         7450 :                          && !omp_target
    4495         7450 :                          && module_global_init_needed ());
    4496         7450 :   tree name = NULL_TREE;
    4497              : 
    4498         7450 :   if (is_module_init)
    4499         1986 :     name = mangle_module_global_init (0);
    4500              :   else
    4501              :     {
    4502         5464 :       char type[14];
    4503              : 
    4504              :       /* We use `I' to indicate initialization and `D' to indicate
    4505              :          destruction.  */
    4506         5464 :       unsigned len;
    4507         5464 :       if (omp_target)
    4508              :         /* Use "off_" signifying "offload" here.  The name must be distinct
    4509              :            from the non-offload case.  The format of the name is scanned in
    4510              :            tree.cc/get_file_function_name, so stick to the same length for
    4511              :            both name variants.  */
    4512           15 :         len = sprintf (type, "off_%c", initp ? 'I' : 'D');
    4513              :       else
    4514         5458 :         len = sprintf (type, "sub_%c", initp ? 'I' : 'D');
    4515         5464 :       if (priority != DEFAULT_INIT_PRIORITY)
    4516              :         {
    4517           40 :           char joiner = '_';
    4518              : #ifdef JOINER
    4519           40 :           joiner = JOINER;
    4520              : #endif
    4521           40 :           type[len++] = joiner;
    4522           40 :           sprintf (type + len, "%.5u", priority);
    4523              :         }
    4524         5464 :       name = get_file_function_name (type);
    4525              :     }
    4526              : 
    4527         7450 :   tree fntype = build_function_type (void_type_node, void_list_node);
    4528         7450 :   tree fndecl = build_lang_decl (FUNCTION_DECL, name, fntype);
    4529              : 
    4530         7450 :   if (omp_target)
    4531              :     {
    4532           15 :       DECL_ATTRIBUTES (fndecl)
    4533           15 :         = tree_cons (get_identifier ("omp declare target"), NULL_TREE,
    4534           15 :                      DECL_ATTRIBUTES (fndecl));
    4535           15 :       DECL_ATTRIBUTES (fndecl)
    4536           30 :         = tree_cons (get_identifier ("omp declare target nohost"), NULL_TREE,
    4537           15 :                      DECL_ATTRIBUTES (fndecl));
    4538              :     }
    4539              : 
    4540         7450 :   DECL_CONTEXT (fndecl) = FROB_CONTEXT (global_namespace);
    4541         7450 :   if (is_module_init)
    4542              :     {
    4543         1986 :       SET_DECL_ASSEMBLER_NAME (fndecl, name);
    4544         1986 :       TREE_PUBLIC (fndecl) = true;
    4545         1986 :       determine_visibility (fndecl);
    4546              :     }
    4547              :   else
    4548         5464 :     TREE_PUBLIC (fndecl) = 0;
    4549         7450 :   start_preparsed_function (fndecl, /*attrs=*/NULL_TREE, SF_PRE_PARSED);
    4550              : 
    4551              :   /* Mark as artificial because it's not explicitly in the user's
    4552              :      source code.  */
    4553         7450 :   DECL_ARTIFICIAL (current_function_decl) = 1;
    4554              : 
    4555              :   /* Mark this declaration as used to avoid spurious warnings.  */
    4556         7450 :   TREE_USED (current_function_decl) = 1;
    4557              : 
    4558              :   /* Mark this function as a global constructor or destructor.  */
    4559         7450 :   if (initp)
    4560         7441 :     DECL_GLOBAL_CTOR_P (current_function_decl) = 1;
    4561              :   else
    4562            9 :     DECL_GLOBAL_DTOR_P (current_function_decl) = 1;
    4563              : 
    4564         7450 :   tree body = begin_compound_stmt (BCS_FN_BODY);
    4565              : 
    4566         7450 :   if (is_module_init && has_body)
    4567              :     {
    4568              :       // If the function is going to be empty, don't emit idempotency.
    4569              :       // 'static bool __in_chrg = false;
    4570              :       // if (__inchrg) return;
    4571              :       // __inchrg = true
    4572           64 :       tree var = build_lang_decl (VAR_DECL, in_charge_identifier,
    4573              :                                   boolean_type_node);
    4574           64 :       DECL_CONTEXT (var) = fndecl;
    4575           64 :       DECL_ARTIFICIAL (var) = true;
    4576           64 :       TREE_STATIC (var) = true;
    4577           64 :       pushdecl (var);
    4578           64 :       cp_finish_decl (var, NULL_TREE, false, NULL_TREE, 0);
    4579              : 
    4580           64 :       tree if_stmt = begin_if_stmt ();
    4581           64 :       finish_if_stmt_cond (var, if_stmt);
    4582           64 :       finish_return_stmt (NULL_TREE);
    4583           64 :       finish_then_clause (if_stmt);
    4584           64 :       finish_if_stmt (if_stmt);
    4585              : 
    4586           64 :       tree assign = build2 (MODIFY_EXPR, boolean_type_node,
    4587              :                             var, boolean_true_node);
    4588           64 :       TREE_SIDE_EFFECTS (assign) = true;
    4589           64 :       finish_expr_stmt (assign);
    4590              :     }
    4591              : 
    4592         7450 :   return body;
    4593              : }
    4594              : 
    4595              : /* Finish a global constructor or destructor.  Add it to the global
    4596              :    ctors or dtors, if STARTP is true.  */
    4597              : 
    4598              : static tree
    4599         7447 : finish_objects (bool initp, unsigned priority, tree body, bool startp)
    4600              : {
    4601              :   /* Finish up.  */
    4602         7447 :   finish_compound_stmt (body);
    4603         7447 :   tree fn = finish_function (/*inline_p=*/false);
    4604              : 
    4605         7447 :   if (!startp)
    4606              :     ; // Neither ctor nor dtor I be.
    4607         5525 :   else if (initp)
    4608              :     {
    4609         5516 :       DECL_STATIC_CONSTRUCTOR (fn) = 1;
    4610         5516 :       decl_init_priority_insert (fn, priority);
    4611              :     }
    4612              :   else
    4613              :     {
    4614            9 :       DECL_STATIC_DESTRUCTOR (fn) = 1;
    4615            9 :       decl_fini_priority_insert (fn, priority);
    4616              :     }
    4617              : 
    4618         7447 :   return fn;
    4619              : }
    4620              : 
    4621              : /* The name of the function we create to handle initializations and
    4622              :    destructions for objects with static storage duration.  */
    4623              : #define SSDF_IDENTIFIER "__static_initialization_and_destruction"
    4624              : #define OMP_SSDF_IDENTIFIER "__omp_target_static_init_and_destruction"
    4625              : 
    4626              : /* Begins the generation of the function that will handle all
    4627              :    initialization or destruction of objects with static storage
    4628              :    duration at PRIORITY.
    4629              : 
    4630              :    It is assumed that this function will be called once for the host, and once
    4631              :    for an OpenMP offload target.  */
    4632              : 
    4633              : static tree
    4634         5534 : start_partial_init_fini_fn (bool initp, unsigned priority, unsigned count,
    4635              :                             bool omp_target)
    4636              : {
    4637         5534 :   char id[MAX (sizeof (SSDF_IDENTIFIER), sizeof (OMP_SSDF_IDENTIFIER))
    4638              :           + 1 /* \0 */ + 32];
    4639         5534 :   tree name;
    4640              : 
    4641              :   /* Create the identifier for this function.  It will be of the form
    4642              :      SSDF_IDENTIFIER_<number> if not omp_target and otherwise
    4643              :      OMP_SSDF_IDENTIFIER_<number>.  */
    4644         5534 :   sprintf (id, "%s_%u", omp_target ? OMP_SSDF_IDENTIFIER : SSDF_IDENTIFIER,
    4645              :            count);
    4646         5534 :   name = get_identifier (id);
    4647         5534 :   tree type = build_function_type (void_type_node, void_list_node);
    4648              : 
    4649              :   /* Create the FUNCTION_DECL itself.  */
    4650         5534 :   tree fn = build_lang_decl (FUNCTION_DECL, name, type);
    4651         5534 :   TREE_PUBLIC (fn) = 0;
    4652         5534 :   DECL_ARTIFICIAL (fn) = 1;
    4653              : 
    4654         5534 :   if (omp_target)
    4655              :     {
    4656           15 :       DECL_ATTRIBUTES (fn)
    4657           15 :         = tree_cons (get_identifier ("omp declare target"), NULL_TREE,
    4658           15 :                      DECL_ATTRIBUTES (fn));
    4659           15 :       DECL_ATTRIBUTES (fn)
    4660           30 :         = tree_cons (get_identifier ("omp declare target nohost"), NULL_TREE,
    4661           15 :                      DECL_ATTRIBUTES (fn));
    4662              :     }
    4663              : 
    4664         5534 :   int idx = initp + 2 * omp_target;
    4665              : 
    4666              :   /* Put this function in the list of functions to be called from the
    4667              :      static constructors and destructors.  */
    4668         5534 :   if (!static_init_fini_fns[idx])
    4669         5504 :     static_init_fini_fns[idx] = priority_map_t::create_ggc ();
    4670         5534 :   auto &slot = static_init_fini_fns[idx]->get_or_insert (priority);
    4671         5534 :   slot = tree_cons (fn, NULL_TREE, slot);
    4672              : 
    4673              :   /* Put the function in the global scope.  */
    4674         5534 :   pushdecl (fn);
    4675              : 
    4676              :   /* Start the function itself.  This is equivalent to declaring the
    4677              :      function as:
    4678              : 
    4679              :        static void __ssdf (int __initialize_p, init __priority_p);
    4680              : 
    4681              :      It is static because we only need to call this function from the
    4682              :      various constructor and destructor functions for this module.  */
    4683         5534 :   start_preparsed_function (fn, /*attrs=*/NULL_TREE, SF_PRE_PARSED);
    4684              : 
    4685              :   /* Set up the scope of the outermost block in the function.  */
    4686         5534 :   return begin_compound_stmt (BCS_FN_BODY);
    4687              : }
    4688              : 
    4689              : /* Finish the generation of the function which performs initialization
    4690              :    or destruction of objects with static storage duration.  */
    4691              : 
    4692              : static void
    4693         5534 : finish_partial_init_fini_fn (tree body)
    4694              : {
    4695              :   /* Close out the function.  */
    4696         5534 :   finish_compound_stmt (body);
    4697         5534 :   expand_or_defer_fn (finish_function (/*inline_p=*/false));
    4698         5534 : }
    4699              : 
    4700              : /* The effective initialization priority of a DECL.  */
    4701              : 
    4702              : #define DECL_EFFECTIVE_INIT_PRIORITY(decl)                                    \
    4703              :         ((!DECL_HAS_INIT_PRIORITY_P (decl) || DECL_INIT_PRIORITY (decl) == 0) \
    4704              :          ? DEFAULT_INIT_PRIORITY : DECL_INIT_PRIORITY (decl))
    4705              : 
    4706              : /* Whether a DECL needs a guard to protect it against multiple
    4707              :    initialization.  */
    4708              : 
    4709              : #define NEEDS_GUARD_P(decl) (TREE_PUBLIC (decl) && (DECL_COMMON (decl)      \
    4710              :                                                     || DECL_ONE_ONLY (decl) \
    4711              :                                                     || DECL_WEAK (decl)))
    4712              : 
    4713              : /* Walks the initializer list of a global variable and looks for
    4714              :    temporary variables (DECL_NAME() == NULL and DECL_ARTIFICIAL != 0)
    4715              :    and that have their DECL_CONTEXT() == NULL.  For each such
    4716              :    temporary variable, set their DECL_CONTEXT() to CTX -- the
    4717              :    initializing function. This is necessary because otherwise some
    4718              :    optimizers (enabled by -O2 -fprofile-arcs) might crash when trying
    4719              :    to refer to a temporary variable that does not have its
    4720              :    DECL_CONTEXT() properly set.  */
    4721              : 
    4722              : static tree
    4723       268090 : fix_temporary_vars_context_r (tree *node,
    4724              :                               int  * /*unused*/,
    4725              :                               void *ctx)
    4726              : {
    4727       268090 :   if (TREE_CODE (*node) == BIND_EXPR)
    4728          800 :     for (tree var = BIND_EXPR_VARS (*node); var; var = DECL_CHAIN (var))
    4729          400 :       if (VAR_P (var) && !DECL_NAME (var)
    4730          800 :           && DECL_ARTIFICIAL (var) && !DECL_CONTEXT (var))
    4731          400 :         DECL_CONTEXT (var) = tree (ctx);
    4732              : 
    4733       268090 :   return NULL_TREE;
    4734              : }
    4735              : 
    4736              : /* Set up to handle the initialization or destruction of DECL.  If
    4737              :    INITP is nonzero, we are initializing the variable.  Otherwise, we
    4738              :    are destroying it.  */
    4739              : 
    4740              : static void
    4741        11134 : one_static_initialization_or_destruction (bool initp, tree decl, tree init,
    4742              :                                           bool omp_target)
    4743              : {
    4744              :   /* If we are supposed to destruct and there's a trivial destructor,
    4745              :      nothing has to be done.  */
    4746        11134 :   gcc_checking_assert (init || !TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl)));
    4747              : 
    4748              :   /* Trick the compiler into thinking we are at the file and line
    4749              :      where DECL was declared so that error-messages make sense, and so
    4750              :      that the debugger will show somewhat sensible file and line
    4751              :      information.  */
    4752        11134 :   input_location = DECL_SOURCE_LOCATION (decl);
    4753              : 
    4754              :   /* Make sure temporary variables in the initialiser all have
    4755              :      their DECL_CONTEXT() set to a value different from NULL_TREE.
    4756              :      This can happen when global variables initializers are built.
    4757              :      In that case, the DECL_CONTEXT() of the global variables _AND_ of all
    4758              :      the temporary variables that might have been generated in the
    4759              :      accompanying initializers is NULL_TREE, meaning the variables have been
    4760              :      declared in the global namespace.
    4761              :      What we want to do here is to fix that and make sure the DECL_CONTEXT()
    4762              :      of the temporaries are set to the current function decl.  */
    4763        11134 :   cp_walk_tree_without_duplicates (&init,
    4764              :                                    fix_temporary_vars_context_r,
    4765              :                                    current_function_decl);
    4766              : 
    4767              :   /* Because of:
    4768              : 
    4769              :        [class.access.spec]
    4770              : 
    4771              :        Access control for implicit calls to the constructors,
    4772              :        the conversion functions, or the destructor called to
    4773              :        create and destroy a static data member is performed as
    4774              :        if these calls appeared in the scope of the member's
    4775              :        class.
    4776              : 
    4777              :      we pretend we are in a static member function of the class of
    4778              :      which the DECL is a member.  */
    4779        11134 :   if (member_p (decl))
    4780              :     {
    4781         1652 :       DECL_CONTEXT (current_function_decl) = DECL_CONTEXT (decl);
    4782         1652 :       DECL_STATIC_FUNCTION_P (current_function_decl) = 1;
    4783              :     }
    4784              : 
    4785              :   /* Assume we don't need a guard.  */
    4786        11134 :   tree guard_if_stmt = NULL_TREE;
    4787              : 
    4788              :   /* We need a guard if this is an object with external linkage that
    4789              :      might be initialized in more than one place.  (For example, a
    4790              :      static data member of a template, when the data member requires
    4791              :      construction.)  */
    4792        11134 :   if (NEEDS_GUARD_P (decl))
    4793              :     {
    4794          876 :       tree guard = get_guard (decl);
    4795          876 :       tree guard_cond;
    4796              : 
    4797          876 :       if (flag_use_cxa_atexit)
    4798              :         {
    4799              :           /* When using __cxa_atexit, we just check the GUARD as we
    4800              :              would for a local static.  We never try to destroy
    4801              :              anything from a static destructor.  */
    4802          876 :           gcc_assert (initp);
    4803          876 :           guard_cond = get_guard_cond (guard, false);
    4804              :         }
    4805              :       else
    4806              :         {
    4807              :           /* If we don't have __cxa_atexit, then we will be running
    4808              :              destructors from .fini sections, or their equivalents.
    4809              :              So, we need to know how many times we've tried to
    4810              :              initialize this object.  We do initializations only if
    4811              :              the GUARD was or becomes zero (initp vs !initp
    4812              :              respectively).  */
    4813            0 :           guard_cond = cp_build_unary_op (initp ? POSTINCREMENT_EXPR
    4814              :                                           : PREDECREMENT_EXPR,
    4815              :                                           guard,
    4816              :                                           /*noconvert=*/true,
    4817              :                                           tf_warning_or_error);
    4818            0 :           guard_cond = cp_build_binary_op (input_location, EQ_EXPR, guard_cond,
    4819              :                                            integer_zero_node,
    4820              :                                            tf_warning_or_error);
    4821              :         }
    4822              : 
    4823          876 :       guard_if_stmt = begin_if_stmt ();
    4824          876 :       finish_if_stmt_cond (guard_cond, guard_if_stmt);
    4825              : 
    4826          876 :       if (flag_use_cxa_atexit)
    4827              :         /* Set the GUARD now.  */
    4828          876 :         finish_expr_stmt (set_guard (guard));
    4829              :     }
    4830              : 
    4831              :   /* Perform the initialization or destruction.  */
    4832        11134 :   if (initp)
    4833              :     {
    4834        11119 :       if (init)
    4835              :         {
    4836        10589 :           finish_expr_stmt (init);
    4837        10589 :           if (sanitize_flags_p (SANITIZE_ADDRESS, decl))
    4838           28 :             if (varpool_node *vnode = varpool_node::get (decl))
    4839           28 :               vnode->dynamically_initialized = 1;
    4840              :         }
    4841              : 
    4842              :       /* If we're using __cxa_atexit, register a function that calls the
    4843              :          destructor for the object.  */
    4844        11119 :       if (flag_use_cxa_atexit)
    4845        11110 :         finish_expr_stmt (register_dtor_fn (decl, omp_target));
    4846              :     }
    4847              :   else
    4848           15 :     finish_expr_stmt (build_cleanup (decl));
    4849              : 
    4850              :   /* Finish the guard if-stmt, if necessary.  */
    4851        11134 :   if (guard_if_stmt)
    4852              :     {
    4853          876 :       finish_then_clause (guard_if_stmt);
    4854          876 :       finish_if_stmt (guard_if_stmt);
    4855              :     }
    4856              : 
    4857              :   /* Now that we're done with DECL we don't need to pretend to be a
    4858              :      member of its class any longer.  */
    4859        11134 :   DECL_CONTEXT (current_function_decl) = NULL_TREE;
    4860        11134 :   DECL_STATIC_FUNCTION_P (current_function_decl) = 0;
    4861        11134 : }
    4862              : 
    4863              : /* Helper function for emit_partial_init_fini_fn and handle_tls_init.
    4864              :    For structured bindings, disable stmts_are_full_exprs_p ()
    4865              :    on STATIC_INIT_DECOMP_BASE_P nodes, reenable it on the
    4866              :    first STATIC_INIT_DECOMP_NONBASE_P node and emit all the
    4867              :    STATIC_INIT_DECOMP_BASE_P and STATIC_INIT_DECOMP_NONBASE_P
    4868              :    consecutive nodes in a single STATEMENT_LIST wrapped with
    4869              :    CLEANUP_POINT_EXPR.  */
    4870              : 
    4871              : static inline tree
    4872        11134 : decomp_handle_one_var (tree node, tree sl, bool *saw_nonbase,
    4873              :                        int save_stmts_are_full_exprs_p)
    4874              : {
    4875        11203 :   if (sl && !*saw_nonbase && STATIC_INIT_DECOMP_NONBASE_P (node))
    4876              :     {
    4877           63 :       *saw_nonbase = true;
    4878           63 :       current_stmt_tree ()->stmts_are_full_exprs_p
    4879           63 :         = save_stmts_are_full_exprs_p;
    4880              :     }
    4881        11257 :   else if (sl && *saw_nonbase && !STATIC_INIT_DECOMP_NONBASE_P (node))
    4882              :     {
    4883           45 :       sl = pop_stmt_list (sl);
    4884           45 :       sl = maybe_cleanup_point_expr_void (sl);
    4885           45 :       add_stmt (sl);
    4886           45 :       sl = NULL_TREE;
    4887              :     }
    4888        22058 :   if (sl == NULL_TREE && STATIC_INIT_DECOMP_BASE_P (node))
    4889              :     {
    4890           63 :       sl = push_stmt_list ();
    4891           63 :       *saw_nonbase = false;
    4892           63 :       current_stmt_tree ()->stmts_are_full_exprs_p = 0;
    4893              :     }
    4894        11134 :   return sl;
    4895              : }
    4896              : 
    4897              : /* Similarly helper called when the whole var list is processed.  */
    4898              : 
    4899              : static inline void
    4900         5611 : decomp_finalize_var_list (tree sl, int save_stmts_are_full_exprs_p)
    4901              : {
    4902         5611 :   if (sl)
    4903              :     {
    4904           18 :       current_stmt_tree ()->stmts_are_full_exprs_p
    4905           18 :         = save_stmts_are_full_exprs_p;
    4906           18 :       sl = pop_stmt_list (sl);
    4907           18 :       sl = maybe_cleanup_point_expr_void (sl);
    4908           18 :       add_stmt (sl);
    4909              :     }
    4910         5611 : }
    4911              : 
    4912              : /* Helper for emit_partial_init_fini_fn OpenMP target handling, called via
    4913              :    walk_tree.  Set DECL_CONTEXT on any automatic temporaries which still
    4914              :    have it NULL to id->src_fn, so that later copy_tree_body_r can remap those.
    4915              :    Otherwise DECL_CONTEXT would be set only during gimplification of the host
    4916              :    fn and when copy_tree_body_r doesn't remap those, we'd ICE during the
    4917              :    target fn gimplification because the same automatic VAR_DECL can't be
    4918              :    used in multiple functions (with the exception of nested functions).  */
    4919              : 
    4920              : static tree
    4921          303 : set_context_for_auto_vars_r (tree *tp, int *, void *data)
    4922              : {
    4923          303 :   copy_body_data *id = (copy_body_data *) data;
    4924          303 :   if (auto_var_in_fn_p (*tp, NULL_TREE) && DECL_ARTIFICIAL (*tp))
    4925           11 :     DECL_CONTEXT (*tp) = id->src_fn;
    4926          303 :   return NULL_TREE;
    4927              : }
    4928              : 
    4929              : /* Generate code to do the initialization or destruction of the decls in VARS,
    4930              :    a TREE_LIST of VAR_DECL with static storage duration.
    4931              :    Whether initialization or destruction is performed is specified by INITP.  */
    4932              : 
    4933              : static tree
    4934         5488 : emit_partial_init_fini_fn (bool initp, unsigned priority, tree vars,
    4935              :                            unsigned counter, location_t locus, tree host_fn)
    4936              : {
    4937         5488 :   input_location = locus;
    4938         5488 :   bool omp_target = (host_fn != NULL_TREE);
    4939         5488 :   tree body = start_partial_init_fini_fn (initp, priority, counter, omp_target);
    4940         5488 :   tree fndecl = current_function_decl;
    4941              : 
    4942         5488 :   tree nonhost_if_stmt = NULL_TREE;
    4943         5488 :   if (omp_target)
    4944              :     {
    4945           15 :       nonhost_if_stmt = begin_if_stmt ();
    4946              :       /* We add an "omp declare target nohost" attribute, but (for
    4947              :          now) we still get a copy of the constructor/destructor on
    4948              :          the host.  Make sure it does nothing unless we're on the
    4949              :          target device.  */
    4950           15 :       tree fn = builtin_decl_explicit (BUILT_IN_OMP_IS_INITIAL_DEVICE);
    4951           15 :       tree initial_dev = build_call_expr (fn, 0);
    4952           15 :       tree target_dev_p
    4953           15 :         = cp_build_binary_op (input_location, NE_EXPR, initial_dev,
    4954              :                               integer_one_node, tf_warning_or_error);
    4955           15 :       finish_if_stmt_cond (target_dev_p, nonhost_if_stmt);
    4956              :     }
    4957              : 
    4958         5488 :   tree sl = NULL_TREE;
    4959         5488 :   int save_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();
    4960         5488 :   bool saw_nonbase = false;
    4961        15827 :   for (tree node = vars; node; node = TREE_CHAIN (node))
    4962              :     {
    4963        10339 :       tree decl = TREE_VALUE (node);
    4964        10339 :       tree init = TREE_PURPOSE (node);
    4965        10339 :       sl = decomp_handle_one_var (node, sl, &saw_nonbase,
    4966              :                                   save_stmts_are_full_exprs_p);
    4967              :       /* We will emit 'init' twice, and it is modified in-place during
    4968              :          gimplification.  Make a copy here.  */
    4969        10339 :       if (omp_target)
    4970              :         {
    4971              :           /* We've already emitted INIT in the host version of the ctor/dtor
    4972              :              function.  We need to deep-copy it (including new versions of
    4973              :              local variables introduced, etc.) for use in the target
    4974              :              ctor/dtor function.  */
    4975           19 :           copy_body_data id;
    4976           19 :           hash_map<tree, tree> decl_map;
    4977           19 :           memset (&id, 0, sizeof (id));
    4978           19 :           id.src_fn = host_fn;
    4979           19 :           id.dst_fn = current_function_decl;
    4980           19 :           id.src_cfun = DECL_STRUCT_FUNCTION (id.src_fn);
    4981           19 :           id.decl_map = &decl_map;
    4982           19 :           id.copy_decl = copy_decl_no_change;
    4983           19 :           id.transform_call_graph_edges = CB_CGE_DUPLICATE;
    4984           19 :           id.transform_new_cfg = true;
    4985           19 :           id.transform_return_to_modify = false;
    4986           19 :           id.eh_lp_nr = 0;
    4987           19 :           walk_tree (&init, set_context_for_auto_vars_r, &id, NULL);
    4988           19 :           walk_tree (&init, copy_tree_body_r, &id, NULL);
    4989           19 :         }
    4990              :       /* Do one initialization or destruction.  */
    4991        10339 :       one_static_initialization_or_destruction (initp, decl, init, omp_target);
    4992              :     }
    4993         5488 :   decomp_finalize_var_list (sl, save_stmts_are_full_exprs_p);
    4994              : 
    4995         5488 :   if (omp_target)
    4996              :     {
    4997              :       /* Finish up nonhost if-stmt body.  */
    4998           15 :       finish_then_clause (nonhost_if_stmt);
    4999           15 :       finish_if_stmt (nonhost_if_stmt);
    5000              :     }
    5001              : 
    5002              :   /* Finish up the static storage duration function for this
    5003              :      round.  */
    5004         5488 :   input_location = locus;
    5005         5488 :   finish_partial_init_fini_fn (body);
    5006              : 
    5007         5488 :   return fndecl;
    5008              : }
    5009              : 
    5010              : /* VARS is a list of variables with static storage duration which may
    5011              :    need initialization and/or finalization.  Remove those variables
    5012              :    that don't really need to be initialized or finalized, and return
    5013              :    the resulting list.  The order in which the variables appear in
    5014              :    VARS is in reverse order of the order in which they should actually
    5015              :    be initialized.  That order is preserved.  */
    5016              : 
    5017              : static tree
    5018       284952 : prune_vars_needing_no_initialization (tree *vars)
    5019              : {
    5020       284952 :   tree *var = vars;
    5021       284952 :   tree result = NULL_TREE;
    5022              : 
    5023       296058 :   while (*var)
    5024              :     {
    5025        11106 :       tree t = *var;
    5026        11106 :       tree decl = TREE_VALUE (t);
    5027        11106 :       tree init = TREE_PURPOSE (t);
    5028              : 
    5029              :       /* Deal gracefully with error.  */
    5030        11106 :       if (error_operand_p (decl))
    5031              :         {
    5032            0 :           var = &TREE_CHAIN (t);
    5033            0 :           continue;
    5034              :         }
    5035              : 
    5036              :       /* The only things that can be initialized are variables.  */
    5037        11106 :       gcc_assert (VAR_P (decl));
    5038              : 
    5039              :       /* If this object is not defined, we don't need to do anything
    5040              :          here.  */
    5041        11106 :       if (DECL_EXTERNAL (decl))
    5042              :         {
    5043            0 :           gcc_checking_assert (!STATIC_INIT_DECOMP_BASE_P (t)
    5044              :                                && !STATIC_INIT_DECOMP_NONBASE_P (t));
    5045            0 :           var = &TREE_CHAIN (t);
    5046            0 :           continue;
    5047              :         }
    5048              : 
    5049              :       /* Also, if the initializer already contains errors, we can bail
    5050              :          out now.  */
    5051        10573 :       if (init && TREE_CODE (init) == TREE_LIST
    5052        11106 :           && value_member (error_mark_node, init))
    5053              :         {
    5054            0 :           var = &TREE_CHAIN (t);
    5055            0 :           continue;
    5056              :         }
    5057              : 
    5058              :       /* Reflections are consteval-only types and we don't want them
    5059              :          to survive until gimplification.  */
    5060        11106 :       if (consteval_only_p (decl))
    5061              :         {
    5062            0 :           var = &TREE_CHAIN (t);
    5063            0 :           continue;
    5064              :         }
    5065              : 
    5066              :       /* This variable is going to need initialization and/or
    5067              :          finalization, so we add it to the list.  */
    5068        11106 :       *var = TREE_CHAIN (t);
    5069        11106 :       TREE_CHAIN (t) = result;
    5070        11106 :       result = t;
    5071              :     }
    5072              : 
    5073       284952 :   return result;
    5074              : }
    5075              : 
    5076              : /* Split VAR_LIST by init priority and add into PARTS hash table.
    5077              :    This reverses the variable ordering.  */
    5078              : 
    5079              : void
    5080         5456 : partition_vars_for_init_fini (tree var_list, priority_map_t *(&parts)[4])
    5081              : {
    5082         5456 :   unsigned priority = 0;
    5083         5456 :   enum { none, base, nonbase } decomp_state = none;
    5084        15767 :   for (auto node = var_list; node; node = TREE_CHAIN (node))
    5085              :     {
    5086        10311 :       tree decl = TREE_VALUE (node);
    5087        10311 :       tree init = TREE_PURPOSE (node);
    5088        10311 :       bool has_cleanup = !TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl));
    5089        10311 :       if (decomp_state == base && STATIC_INIT_DECOMP_NONBASE_P (node))
    5090              :         decomp_state = nonbase;
    5091        10275 :       else if (decomp_state == nonbase && !STATIC_INIT_DECOMP_NONBASE_P (node))
    5092              :         decomp_state = none;
    5093        10290 :       if (decomp_state == none)
    5094        20375 :         priority = DECL_EFFECTIVE_INIT_PRIORITY (decl);
    5095              : 
    5096        10311 :       if (init || (flag_use_cxa_atexit && has_cleanup))
    5097              :         {
    5098              :           // Add to initialization list.
    5099        10305 :           if (!parts[true])
    5100         5450 :             parts[true] = priority_map_t::create_ggc ();
    5101        10305 :           auto &slot = parts[true]->get_or_insert (priority);
    5102        10305 :           slot = tree_cons (init, decl, slot);
    5103        10305 :           if (init
    5104         9793 :               && STATIC_INIT_DECOMP_BASE_P (node)
    5105        10341 :               && decomp_state == none)
    5106              :             {
    5107              :               /* If one or more STATIC_INIT_DECOMP_BASE_P with at least
    5108              :                  one init is followed by at least one
    5109              :                  STATIC_INIT_DECOMP_NONBASE_P with init, mark it in the
    5110              :                  resulting chain as well.  */
    5111           36 :               for (tree n = TREE_CHAIN (node); n; n = TREE_CHAIN (n))
    5112           36 :                 if (STATIC_INIT_DECOMP_BASE_P (n))
    5113            0 :                   continue;
    5114           36 :                 else if (STATIC_INIT_DECOMP_NONBASE_P (n))
    5115              :                   {
    5116           36 :                     if (TREE_PURPOSE (n))
    5117              :                       {
    5118              :                         decomp_state = base;
    5119              :                         break;
    5120              :                       }
    5121              :                     else
    5122            0 :                       continue;
    5123              :                   }
    5124              :                 else
    5125              :                   break;
    5126              :             }
    5127        10305 :           if (init && decomp_state == base)
    5128           36 :             STATIC_INIT_DECOMP_BASE_P (slot) = 1;
    5129        10269 :           else if (decomp_state == nonbase)
    5130          108 :             STATIC_INIT_DECOMP_NONBASE_P (slot) = 1;
    5131              :         }
    5132              : 
    5133        10311 :       if (!flag_use_cxa_atexit && has_cleanup)
    5134              :         {
    5135              :           // Add to finalization list.
    5136           15 :           if (!parts[false])
    5137            9 :             parts[false] = priority_map_t::create_ggc ();
    5138           15 :           auto &slot = parts[false]->get_or_insert (priority);
    5139           15 :           slot = tree_cons (NULL_TREE, decl, slot);
    5140              :         }
    5141              : 
    5142        10311 :       if (flag_openmp
    5143        10311 :           && lookup_attribute ("omp declare target", DECL_ATTRIBUTES (decl)))
    5144              :         {
    5145           19 :           priority_map_t **omp_parts = parts + 2;
    5146              : 
    5147           19 :           if (init || (flag_use_cxa_atexit && has_cleanup))
    5148              :             {
    5149              :               // Add to initialization list.
    5150           19 :               if (!omp_parts[true])
    5151           14 :                 omp_parts[true] = priority_map_t::create_ggc ();
    5152           19 :               auto &slot = omp_parts[true]->get_or_insert (priority);
    5153           19 :               slot = tree_cons (init, decl, slot);
    5154           19 :               if (init && decomp_state == base)
    5155            0 :                 STATIC_INIT_DECOMP_BASE_P (slot) = 1;
    5156           19 :               else if (decomp_state == nonbase)
    5157            0 :                 STATIC_INIT_DECOMP_NONBASE_P (slot) = 1;
    5158              :             }
    5159              : 
    5160           19 :           if (!flag_use_cxa_atexit && has_cleanup)
    5161              :             {
    5162              :               // Add to finalization list.
    5163            0 :               if (!omp_parts[false])
    5164            0 :                 omp_parts[false] = priority_map_t::create_ggc ();
    5165            0 :               auto &slot = omp_parts[false]->get_or_insert (priority);
    5166            0 :               slot = tree_cons (NULL_TREE, decl, slot);
    5167              :             }
    5168              :         }
    5169              :     }
    5170         5456 : }
    5171              : 
    5172              : /* Make sure we have told the back end about all the variables in
    5173              :    VARS.  */
    5174              : 
    5175              : static void
    5176         5579 : write_out_vars (tree vars)
    5177              : {
    5178         5579 :   tree v;
    5179              : 
    5180        16685 :   for (v = vars; v; v = TREE_CHAIN (v))
    5181              :     {
    5182        11106 :       tree var = TREE_VALUE (v);
    5183        11106 :       if (!var_finalized_p (var))
    5184              :         {
    5185          807 :           import_export_decl (var);
    5186          807 :           rest_of_decl_compilation (var, 1, 1);
    5187              :         }
    5188              :     }
    5189         5579 : }
    5190              : 
    5191              : /* Generate a static constructor or destructor that calls the given
    5192              :    init/fini fns at the indicated priority.  */
    5193              : 
    5194              : static void
    5195         7441 : generate_ctor_or_dtor_function (bool initp, unsigned priority,
    5196              :                                 tree fns, location_t locus, bool omp_target)
    5197              : {
    5198         7441 :   input_location = locus;
    5199         7441 :   tree body = start_objects (initp, priority, bool (fns), omp_target);
    5200              : 
    5201         7441 :   if (fns)
    5202              :     {
    5203              :       /* To make sure dynamic construction doesn't access globals from
    5204              :          other compilation units where they might not be yet
    5205              :          constructed, for -fsanitize=address insert
    5206              :          __asan_before_dynamic_init call that prevents access to
    5207              :          either all global variables that need construction in other
    5208              :          compilation units, or at least those that haven't been
    5209              :          initialized yet.  Variables that need dynamic construction in
    5210              :          the current compilation unit are kept accessible.  */
    5211         5519 :       if (initp && (flag_sanitize & SANITIZE_ADDRESS))
    5212           21 :         finish_expr_stmt (asan_dynamic_init_call (/*after_p=*/false));
    5213              : 
    5214              :       /* Call the static init/fini functions.  */
    5215        11053 :       for (tree node = fns; node; node = TREE_CHAIN (node))
    5216              :         {
    5217         5534 :           tree fn = TREE_PURPOSE (node);
    5218              : 
    5219              :           // We should never find a pure or constant cdtor.
    5220         5534 :           gcc_checking_assert (!(flags_from_decl_or_type (fn)
    5221              :                                  & (ECF_CONST | ECF_PURE)));
    5222              : 
    5223         5534 :           tree call = cp_build_function_call_nary (fn, tf_warning_or_error,
    5224              :                                                    NULL_TREE);
    5225         5534 :           finish_expr_stmt (call);
    5226              :         }
    5227              : 
    5228              :       /* Revert what __asan_before_dynamic_init did by calling
    5229              :          __asan_after_dynamic_init.  */
    5230         5519 :       if (initp && (flag_sanitize & SANITIZE_ADDRESS))
    5231           21 :         finish_expr_stmt (asan_dynamic_init_call (/*after_p=*/true));
    5232              :     }
    5233              : 
    5234              :   /* Close out the function, and arrange for it to be called at init
    5235              :      or fini time, if non-empty.  (Even non-nop module initializer
    5236              :      functions need this, as we cannot guarantee the module is
    5237              :      imported somewhere in the program.)  */
    5238         7441 :   expand_or_defer_fn (finish_objects (initp, priority, body, fns != NULL_TREE));
    5239         7441 : }
    5240              : 
    5241              : /* Return C++ property of T, based on given operation OP.  */
    5242              : 
    5243              : static int
    5244         1941 : cpp_check (tree t, cpp_operation op)
    5245              : {
    5246         1941 :   switch (op)
    5247              :     {
    5248            9 :       case HAS_DEPENDENT_TEMPLATE_ARGS:
    5249            9 :         {
    5250            9 :           tree ti = CLASSTYPE_TEMPLATE_INFO (t);
    5251            9 :           if (!ti)
    5252              :             return 0;
    5253            9 :           ++processing_template_decl;
    5254            9 :           const bool dep = any_dependent_template_arguments_p (TI_ARGS (ti));
    5255            9 :           --processing_template_decl;
    5256            9 :           return dep;
    5257              :         }
    5258          294 :       case IS_ABSTRACT:
    5259          294 :         return DECL_PURE_VIRTUAL_P (t);
    5260          165 :       case IS_ASSIGNMENT_OPERATOR:
    5261          165 :         return DECL_ASSIGNMENT_OPERATOR_P (t);
    5262          165 :       case IS_CONSTRUCTOR:
    5263          330 :         return DECL_CONSTRUCTOR_P (t);
    5264          165 :       case IS_DESTRUCTOR:
    5265          330 :         return DECL_DESTRUCTOR_P (t);
    5266          165 :       case IS_COPY_CONSTRUCTOR:
    5267          477 :         return DECL_COPY_CONSTRUCTOR_P (t);
    5268          165 :       case IS_MOVE_CONSTRUCTOR:
    5269          483 :         return DECL_MOVE_CONSTRUCTOR_P (t);
    5270          447 :       case IS_TEMPLATE:
    5271          447 :         return TREE_CODE (t) == TEMPLATE_DECL;
    5272          366 :       case IS_TRIVIAL:
    5273          366 :         return trivial_type_p (t);
    5274              :       default:
    5275              :         return 0;
    5276              :     }
    5277              : }
    5278              : 
    5279              : /* Collect source file references recursively, starting from NAMESPC.  */
    5280              : 
    5281              : static void
    5282           78 : collect_source_refs (tree namespc)
    5283              : {
    5284              :   /* Iterate over names in this name space.  */
    5285       183568 :   for (tree t = NAMESPACE_LEVEL (namespc)->names; t; t = TREE_CHAIN (t))
    5286       183490 :     if (DECL_IS_UNDECLARED_BUILTIN (t))
    5287              :       ;
    5288          240 :     else if (TREE_CODE (t) == NAMESPACE_DECL && !DECL_NAMESPACE_ALIAS (t))
    5289            3 :       collect_source_refs (t);
    5290              :     else
    5291          237 :       collect_source_ref (DECL_SOURCE_FILE (t));
    5292           78 : }
    5293              : 
    5294              : /* Collect decls relevant to SOURCE_FILE from all namespaces recursively,
    5295              :    starting from NAMESPC.  */
    5296              : 
    5297              : static void
    5298          228 : collect_ada_namespace (tree namespc, const char *source_file)
    5299              : {
    5300          228 :   tree decl = NAMESPACE_LEVEL (namespc)->names;
    5301              : 
    5302              :   /* Collect decls from this namespace.  This will skip
    5303              :      NAMESPACE_DECLs (both aliases and regular, it cannot tell).  */
    5304          228 :   collect_ada_nodes (decl, source_file);
    5305              : 
    5306              :   /* Now scan for namespace children, and dump them.  */
    5307       219746 :   for (; decl; decl = TREE_CHAIN (decl))
    5308       219290 :     if (TREE_CODE (decl) == NAMESPACE_DECL && !DECL_NAMESPACE_ALIAS (decl))
    5309          153 :       collect_ada_namespace (decl, source_file);
    5310          228 : }
    5311              : 
    5312              : /* Returns true iff there is a definition available for variable or
    5313              :    function DECL.  */
    5314              : 
    5315              : bool
    5316     79947316 : decl_defined_p (tree decl)
    5317              : {
    5318     79947316 :   if (TREE_CODE (decl) == FUNCTION_DECL)
    5319     72002360 :     return (DECL_INITIAL (decl) != NULL_TREE
    5320              :             /* A pending instantiation of a friend temploid is defined.  */
    5321     72002360 :             || (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl)
    5322      7427529 :                 && DECL_INITIAL (DECL_TEMPLATE_RESULT
    5323              :                                  (DECL_TI_TEMPLATE (decl)))));
    5324              :   else
    5325              :     {
    5326      7944956 :       gcc_assert (VAR_P (decl));
    5327      7944956 :       return (!DECL_EXTERNAL (decl)
    5328              :               /* An initialized variable is defined even if we've decided not
    5329              :                  to emit it, unless it's initialized within the class and not
    5330              :                  inline.  Note that finish_static_member_decl doesn't set
    5331              :                  DECL_IN_AGGR_P for inline variables, so we don't need to check
    5332              :                  DECL_INLINE_VAR_P here.  */
    5333      7944956 :               || (DECL_INITIAL (decl) && !DECL_IN_AGGR_P (decl)));
    5334              :     }
    5335              : }
    5336              : 
    5337              : /* Nonzero for a VAR_DECL whose value can be used in a constant expression.
    5338              : 
    5339              :       [expr.const]
    5340              : 
    5341              :       An integral constant-expression can only involve ... const
    5342              :       variables of integral or enumeration types initialized with
    5343              :       constant expressions ...
    5344              : 
    5345              :       C++0x also allows constexpr variables and temporaries initialized
    5346              :       with constant expressions.  We handle the former here, but the latter
    5347              :       are just folded away in cxx_eval_constant_expression.
    5348              : 
    5349              :    The standard does not require that the expression be non-volatile.
    5350              :    G++ implements the proposed correction in DR 457.  */
    5351              : 
    5352              : bool
    5353   1103502407 : decl_constant_var_p (tree decl)
    5354              : {
    5355   1103502407 :   if (!decl_maybe_constant_var_p (decl))
    5356              :     return false;
    5357              : 
    5358              :   /* We don't know if a template static data member is initialized with
    5359              :      a constant expression until we instantiate its initializer.  Even
    5360              :      in the case of a constexpr variable, we can't treat it as a
    5361              :      constant until its initializer is complete in case it's used in
    5362              :      its own initializer.  */
    5363    138603901 :   maybe_instantiate_decl (decl);
    5364    138601204 :   return DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl);
    5365              : }
    5366              : 
    5367              : /* Returns true if DECL could be a symbolic constant variable, depending on
    5368              :    its initializer.  */
    5369              : 
    5370              : bool
    5371   1456319207 : decl_maybe_constant_var_p (tree decl)
    5372              : {
    5373   1456319207 :   tree type = TREE_TYPE (decl);
    5374   1456319207 :   if (!VAR_P (decl))
    5375              :     return false;
    5376    692072768 :   if (DECL_DECLARED_CONSTEXPR_P (decl)
    5377    692072768 :       && (!TREE_THIS_VOLATILE (decl) || NULLPTR_TYPE_P (type)))
    5378              :     return true;
    5379    394124037 :   if (DECL_HAS_VALUE_EXPR_P (decl))
    5380              :     /* A proxy isn't constant.  */
    5381              :     return false;
    5382    391749780 :   if (TYPE_REF_P (type))
    5383              :     /* References can be constant.  */;
    5384    385683428 :   else if (CP_TYPE_CONST_NON_VOLATILE_P (type)
    5385    385683428 :            && INTEGRAL_OR_ENUMERATION_TYPE_P (type))
    5386              :     /* And const integers.  */;
    5387              :   else
    5388              :     return false;
    5389              : 
    5390     82151013 :   if (DECL_INITIAL (decl)
    5391    127366634 :       && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
    5392              :     /* We know the initializer, and it isn't constant.  */
    5393              :     return false;
    5394              :   else
    5395              :     return true;
    5396              : }
    5397              : 
    5398              : /* Complain that DECL uses a type with no linkage.  In C++98 mode this is
    5399              :    called from grokfndecl and grokvardecl; in all modes it is called from
    5400              :    cp_write_global_declarations.  */
    5401              : 
    5402              : void
    5403      1635928 : no_linkage_error (tree decl)
    5404              : {
    5405      1635928 :   if (cxx_dialect >= cxx11
    5406      1635928 :       && (decl_defined_p (decl)
    5407              :           /* Treat templates which limit_bad_template_recursion decided
    5408              :              not to instantiate as if they were defined.  */
    5409          128 :           || (errorcount + sorrycount > 0
    5410           53 :               && DECL_LANG_SPECIFIC (decl)
    5411           53 :               && DECL_TEMPLATE_INFO (decl)
    5412           33 :               && warning_suppressed_p (decl /* What warning? */))))
    5413              :     /* In C++11 it's ok if the decl is defined.  */
    5414       479888 :     return;
    5415              : 
    5416      1156040 :   if (DECL_LANG_SPECIFIC (decl) && DECL_MODULE_IMPORT_P (decl))
    5417              :     /* An imported decl is ok.  */
    5418              :     return;
    5419              : 
    5420              :   /* Metafunctions are magic and should be considered defined even though
    5421              :      they have no bodies.  ??? This can't be checked in decl_defined_p;
    5422              :      we'd get redefinition errors for some of our metafunctions.  */
    5423      1155995 :   if (TREE_CODE (decl) == FUNCTION_DECL && metafunction_p (decl))
    5424              :     return;
    5425              : 
    5426      1155992 :   tree t = no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false);
    5427      1155992 :   if (t == NULL_TREE)
    5428              :     /* The type that got us on no_linkage_decls must have gotten a name for
    5429              :        linkage purposes.  */;
    5430           74 :   else if (CLASS_TYPE_P (t) && TYPE_BEING_DEFINED (t))
    5431              :     // FIXME: This is now invalid, as a DR to c++98
    5432              :     /* The type might end up having a typedef name for linkage purposes.  */
    5433            0 :     vec_safe_push (no_linkage_decls, decl);
    5434          201 :   else if (TYPE_UNNAMED_P (t))
    5435              :     {
    5436           26 :       bool d = false;
    5437           26 :       auto_diagnostic_group grp;
    5438           26 :       if (cxx_dialect >= cxx11)
    5439              :         {
    5440              :           /* If t is declared in a module CMI, then decl could actually
    5441              :              be defined in a different TU, so don't warn since C++20.  */
    5442            9 :           tree relaxed = no_linkage_check (t, /*relaxed_p=*/true);
    5443            9 :           if (relaxed != NULL_TREE)
    5444            9 :             d = permerror (DECL_SOURCE_LOCATION (decl),
    5445              :                            "%q#D, declared using an unnamed type, "
    5446              :                            "is used but never defined", decl);
    5447            0 :           else if (cxx_dialect < cxx20)
    5448            0 :             d = pedwarn (DECL_SOURCE_LOCATION (decl), OPT_Wc__20_extensions,
    5449              :                          "%q#D, declared using an unnamed type, "
    5450              :                          "is used but not defined", decl);
    5451              :         }
    5452           17 :       else if (DECL_EXTERN_C_P (decl))
    5453              :         /* Allow this; it's pretty common in C.  */;
    5454           17 :       else if (VAR_P (decl))
    5455              :         /* DRs 132, 319 and 389 seem to indicate types with
    5456              :            no linkage can only be used to declare extern "C"
    5457              :            entities.  Since it's not always an error in the
    5458              :            ISO C++ 90 Standard, we only issue a warning.  */
    5459           16 :         d = warning_at (DECL_SOURCE_LOCATION (decl), 0, "unnamed type "
    5460              :                         "with no linkage used to declare variable %q#D with "
    5461              :                         "linkage", decl);
    5462              :       else
    5463            1 :         d = permerror (DECL_SOURCE_LOCATION (decl), "unnamed type with no "
    5464              :                        "linkage used to declare function %q#D with linkage",
    5465              :                        decl);
    5466           26 :       if (d && is_typedef_decl (TYPE_NAME (t)))
    5467            0 :         inform (DECL_SOURCE_LOCATION (TYPE_NAME (t)), "%q#D does not refer "
    5468              :                 "to the unqualified type, so it is not used for linkage",
    5469            0 :                 TYPE_NAME (t));
    5470              :       /* Suppress warning from check_global_declaration if needed.  */
    5471           26 :       if (d)
    5472           23 :         suppress_warning (decl, OPT_Wunused);
    5473           26 :     }
    5474           48 :   else if (cxx_dialect >= cxx11)
    5475              :     {
    5476           48 :       if (VAR_P (decl) || !DECL_PURE_VIRTUAL_P (decl))
    5477              :         {
    5478              :           /* Similarly for local types in a function with vague linkage or
    5479              :              defined in a module CMI, then decl could actually be defined
    5480              :              in a different TU, so don't warn since C++20.  */
    5481           45 :           bool d = false;
    5482           45 :           tree relaxed = no_linkage_check (t, /*relaxed_p=*/true);
    5483           45 :           if (relaxed != NULL_TREE)
    5484           30 :             d = permerror (DECL_SOURCE_LOCATION (decl),
    5485              :                            "%q#D, declared using local type "
    5486              :                            "%qT, is used but never defined", decl, t);
    5487           15 :           else if (cxx_dialect < cxx20)
    5488            3 :             d = pedwarn (DECL_SOURCE_LOCATION (decl), OPT_Wc__20_extensions,
    5489              :                          "%q#D, declared using local type "
    5490              :                          "%qT, is used but not defined here", decl, t);
    5491              :           /* Suppress warning from check_global_declaration if needed.  */
    5492           33 :           if (d)
    5493           33 :             suppress_warning (decl, OPT_Wunused);
    5494              :         }
    5495              :     }
    5496            0 :   else if (VAR_P (decl))
    5497            0 :     warning_at (DECL_SOURCE_LOCATION (decl), 0, "type %qT with no linkage "
    5498              :                 "used to declare variable %q#D with linkage", t, decl);
    5499              :   else
    5500            0 :     permerror (DECL_SOURCE_LOCATION (decl), "type %qT with no linkage used "
    5501              :                "to declare function %q#D with linkage", t, decl);
    5502              : }
    5503              : 
    5504              : /* Collect declarations from all namespaces relevant to SOURCE_FILE.  */
    5505              : 
    5506              : static void
    5507           75 : collect_all_refs (const char *source_file)
    5508              : {
    5509           75 :   collect_ada_namespace (global_namespace, source_file);
    5510           75 : }
    5511              : 
    5512              : /* Clear DECL_EXTERNAL for NODE.  */
    5513              : 
    5514              : static bool
    5515    147566658 : clear_decl_external (struct cgraph_node *node, void * /*data*/)
    5516              : {
    5517    147566658 :   DECL_EXTERNAL (node->decl) = 0;
    5518    147566658 :   return false;
    5519              : }
    5520              : 
    5521              : /* Build up the function to run dynamic initializers for thread_local
    5522              :    variables in this translation unit and alias the init functions for the
    5523              :    individual variables to it.  */
    5524              : 
    5525              : static void
    5526       142476 : handle_tls_init (void)
    5527              : {
    5528       142476 :   tree vars = prune_vars_needing_no_initialization (&tls_aggregates);
    5529       142476 :   if (vars == NULL_TREE)
    5530       142353 :     return;
    5531              : 
    5532          123 :   location_t loc = DECL_SOURCE_LOCATION (TREE_VALUE (vars));
    5533              : 
    5534          123 :   write_out_vars (vars);
    5535              : 
    5536          123 :   tree guard = build_decl (loc, VAR_DECL, get_identifier ("__tls_guard"),
    5537              :                            boolean_type_node);
    5538          123 :   TREE_PUBLIC (guard) = false;
    5539          123 :   TREE_STATIC (guard) = true;
    5540          123 :   DECL_ARTIFICIAL (guard) = true;
    5541          123 :   DECL_IGNORED_P (guard) = true;
    5542          123 :   TREE_USED (guard) = true;
    5543          123 :   CP_DECL_THREAD_LOCAL_P (guard) = true;
    5544          123 :   set_decl_tls_model (guard, decl_default_tls_model (guard));
    5545          123 :   pushdecl_top_level_and_finish (guard, NULL_TREE);
    5546              : 
    5547          123 :   tree fn = get_local_tls_init_fn (loc);
    5548          123 :   start_preparsed_function (fn, NULL_TREE, SF_PRE_PARSED);
    5549          123 :   tree body = begin_function_body ();
    5550          123 :   tree if_stmt = begin_if_stmt ();
    5551          123 :   tree cond = cp_build_unary_op (TRUTH_NOT_EXPR, guard, false,
    5552              :                                  tf_warning_or_error);
    5553          123 :   finish_if_stmt_cond (cond, if_stmt);
    5554          123 :   finish_expr_stmt (cp_build_modify_expr (loc, guard, NOP_EXPR,
    5555              :                                           boolean_true_node,
    5556              :                                           tf_warning_or_error));
    5557          123 :   tree sl = NULL_TREE;
    5558          123 :   int save_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();
    5559          123 :   bool saw_nonbase = false;
    5560          918 :   for (; vars; vars = TREE_CHAIN (vars))
    5561              :     {
    5562          795 :       tree var = TREE_VALUE (vars);
    5563          795 :       tree init = TREE_PURPOSE (vars);
    5564          795 :       sl = decomp_handle_one_var (vars, sl, &saw_nonbase,
    5565              :                                   save_stmts_are_full_exprs_p);
    5566          795 :       one_static_initialization_or_destruction (/*initp=*/true, var, init,
    5567              :                                                 false);
    5568              : 
    5569              :       /* Output init aliases even with -fno-extern-tls-init.  */
    5570          795 :       if (TARGET_SUPPORTS_ALIASES && TREE_PUBLIC (var))
    5571              :         {
    5572          696 :           tree single_init_fn = get_tls_init_fn (var);
    5573          696 :           if (single_init_fn == NULL_TREE)
    5574            0 :             continue;
    5575          696 :           cgraph_node *alias
    5576          696 :             = cgraph_node::get_create (fn)->create_same_body_alias
    5577          696 :                 (single_init_fn, fn);
    5578          696 :           gcc_assert (alias != NULL);
    5579              :         }
    5580              :     }
    5581          123 :   decomp_finalize_var_list (sl, save_stmts_are_full_exprs_p);
    5582              : 
    5583          123 :   finish_then_clause (if_stmt);
    5584          123 :   finish_if_stmt (if_stmt);
    5585          123 :   finish_function_body (body);
    5586          123 :   expand_or_defer_fn (finish_function (/*inline_p=*/false));
    5587              : }
    5588              : 
    5589              : /* We're at the end of compilation, so generate any mangling aliases that
    5590              :    we've been saving up, if DECL is going to be output and ID2 isn't
    5591              :    already taken by another declaration.  */
    5592              : 
    5593              : static void
    5594        28258 : generate_mangling_alias (tree decl, tree id2)
    5595              : {
    5596        28258 :   struct cgraph_node *n = NULL;
    5597              : 
    5598        28258 :   if (TREE_CODE (decl) == FUNCTION_DECL)
    5599              :     {
    5600        28198 :       n = cgraph_node::get (decl);
    5601        28198 :       if (!n)
    5602              :         /* Don't create an alias to an unreferenced function.  */
    5603              :         return;
    5604              :     }
    5605              : 
    5606        28258 :   tree *slot
    5607        28258 :     = mangled_decls->find_slot_with_hash (id2, IDENTIFIER_HASH_VALUE (id2),
    5608              :                                           INSERT);
    5609              : 
    5610              :   /* If there's a declaration already using this mangled name,
    5611              :      don't create a compatibility alias that conflicts.  */
    5612        28258 :   if (*slot)
    5613              :     return;
    5614              : 
    5615        28228 :   tree alias = make_alias_for (decl, id2);
    5616        28228 :   *slot = alias;
    5617              : 
    5618        28228 :   DECL_IGNORED_P (alias) = 1;
    5619        28228 :   TREE_PUBLIC (alias) = TREE_PUBLIC (decl);
    5620        28228 :   DECL_VISIBILITY (alias) = DECL_VISIBILITY (decl);
    5621        28228 :   if (vague_linkage_p (decl))
    5622        28075 :     DECL_WEAK (alias) = 1;
    5623              : 
    5624        28228 :   if (n)
    5625        28168 :     n->create_same_body_alias (alias, decl);
    5626              :   else
    5627           60 :     varpool_node::create_extra_name_alias (alias, decl);
    5628              : }
    5629              : 
    5630              : /* Note that we might want to emit an alias with the symbol ID2 for DECL at
    5631              :    the end of translation, for compatibility across bugs in the mangling
    5632              :    implementation.  */
    5633              : 
    5634              : void
    5635        28282 : note_mangling_alias (tree decl, tree id2)
    5636              : {
    5637        28282 :   if (TARGET_SUPPORTS_ALIASES)
    5638              :     {
    5639        28282 :       if (!defer_mangling_aliases)
    5640        19209 :         generate_mangling_alias (decl, id2);
    5641              :       else
    5642              :         {
    5643         9073 :           vec_safe_push (mangling_aliases, decl);
    5644         9073 :           vec_safe_push (mangling_aliases, id2);
    5645              :         }
    5646              :     }
    5647        28282 : }
    5648              : 
    5649              : /* Emit all mangling aliases that were deferred up to this point.  */
    5650              : 
    5651              : void
    5652        96822 : generate_mangling_aliases ()
    5653              : {
    5654       105871 :   while (!vec_safe_is_empty (mangling_aliases))
    5655              :     {
    5656         9049 :       tree id2 = mangling_aliases->pop();
    5657         9049 :       tree decl = mangling_aliases->pop();
    5658         9049 :       generate_mangling_alias (decl, id2);
    5659              :     }
    5660        96822 :   defer_mangling_aliases = false;
    5661        96822 : }
    5662              : 
    5663              : /* Record a mangling of DECL, whose DECL_ASSEMBLER_NAME has just been
    5664              :    set.  NEED_WARNING is true if we must warn about collisions.  We do
    5665              :    this to spot changes in mangling that may require compatibility
    5666              :    aliases.  */
    5667              : 
    5668              : void
    5669     80956243 : record_mangling (tree decl, bool need_warning)
    5670              : {
    5671     80956243 :   if (!mangled_decls)
    5672        75019 :     mangled_decls = hash_table<mangled_decl_hash>::create_ggc (499);
    5673              : 
    5674     80956243 :   gcc_checking_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
    5675     80956243 :   tree id = DECL_ASSEMBLER_NAME_RAW (decl);
    5676     80956243 :   tree *slot
    5677     80956243 :     = mangled_decls->find_slot_with_hash (id, IDENTIFIER_HASH_VALUE (id),
    5678              :                                           INSERT);
    5679              : 
    5680              :   /* If this is already an alias, cancel the alias, because the real
    5681              :      decl takes precedence.  */
    5682     80956243 :   if (*slot && DECL_ARTIFICIAL (*slot) && DECL_IGNORED_P (*slot))
    5683              :     {
    5684           27 :       if (symtab_node *n = symtab_node::get (*slot))
    5685              :         {
    5686           27 :           if (n->cpp_implicit_alias)
    5687              :             /* Actually removing the node isn't safe if other code is already
    5688              :                holding a pointer to it, so just neutralize it.  */
    5689           27 :             n->reset ();
    5690              :         }
    5691              :       else
    5692              :         /* analyze_functions might have already removed the alias from the
    5693              :            symbol table if it's internal.  */
    5694            0 :         gcc_checking_assert (!TREE_PUBLIC (*slot));
    5695              : 
    5696           27 :       *slot = NULL_TREE;
    5697              :     }
    5698              : 
    5699     80956243 :   if (!*slot)
    5700     80956021 :     *slot = decl;
    5701          222 :   else if (need_warning)
    5702              :     {
    5703            3 :       auto_diagnostic_group d;
    5704            3 :       error_at (DECL_SOURCE_LOCATION (decl),
    5705              :                 "mangling of %q#D as %qE conflicts with a previous mangle",
    5706              :                 decl, id);
    5707            3 :       inform (DECL_SOURCE_LOCATION (*slot),
    5708              :               "previous mangling %q#D", *slot);
    5709            3 :       inform (DECL_SOURCE_LOCATION (decl),
    5710              :               "a later %<-fabi-version=%> (or =0)"
    5711              :               " avoids this error with a change in mangling");
    5712            3 :       *slot = decl;
    5713            3 :     }
    5714     80956243 : }
    5715              : 
    5716              : /* The mangled name of DECL is being forcibly changed to NAME.  Remove
    5717              :    any existing knowledge of DECL's mangled name meaning DECL.  */
    5718              : 
    5719              : void
    5720    268148627 : overwrite_mangling (tree decl, tree name)
    5721              : {
    5722    268148627 :   if (tree id = DECL_ASSEMBLER_NAME_RAW (decl))
    5723       237624 :     if ((TREE_CODE (decl) == VAR_DECL
    5724       237534 :          || TREE_CODE (decl) == FUNCTION_DECL)
    5725       237624 :         && mangled_decls)
    5726       461964 :       if (tree *slot
    5727       230982 :           = mangled_decls->find_slot_with_hash (id, IDENTIFIER_HASH_VALUE (id),
    5728              :                                                 NO_INSERT))
    5729       123500 :         if (*slot == decl)
    5730              :           {
    5731           75 :             mangled_decls->clear_slot (slot);
    5732              : 
    5733              :             /* If this is an alias, remove it from the symbol table.  */
    5734           75 :             if (DECL_ARTIFICIAL (decl) && DECL_IGNORED_P (decl))
    5735            0 :               if (symtab_node *n = symtab_node::get (decl))
    5736            0 :                 if (n->cpp_implicit_alias)
    5737            0 :                   n->remove ();
    5738              :           }
    5739              : 
    5740    268148627 :   DECL_ASSEMBLER_NAME_RAW (decl) = name;
    5741    268148627 : }
    5742              : 
    5743              : /* The entire file is now complete.  If requested, dump everything
    5744              :    to a file.  */
    5745              : 
    5746              : static void
    5747        96919 : dump_tu (void)
    5748              : {
    5749        96919 :   dump_flags_t flags;
    5750        96919 :   if (FILE *stream = dump_begin (raw_dump_id, &flags))
    5751              :     {
    5752            6 :       dump_node (global_namespace, flags & ~TDF_SLIM, stream);
    5753            6 :       dump_end (raw_dump_id, stream);
    5754              :     }
    5755        96919 : }
    5756              : 
    5757              : static location_t locus_at_end_of_parsing;
    5758              : 
    5759              : /* Check the deallocation functions for CODE to see if we want to warn that
    5760              :    only one was defined.  */
    5761              : 
    5762              : static void
    5763         1946 : maybe_warn_sized_delete (enum tree_code code)
    5764              : {
    5765         1946 :   tree sized = NULL_TREE;
    5766         1946 :   tree unsized = NULL_TREE;
    5767              : 
    5768        10728 :   for (ovl_iterator iter (get_global_binding (ovl_op_identifier (false, code)));
    5769        10728 :        iter; ++iter)
    5770              :     {
    5771         8782 :       tree fn = *iter;
    5772              :       /* We're only interested in usual deallocation functions.  */
    5773         8782 :       if (!usual_deallocation_fn_p (fn))
    5774          998 :         continue;
    5775         7784 :       if (FUNCTION_ARG_CHAIN (fn) == void_list_node)
    5776              :         unsized = fn;
    5777              :       else
    5778         5834 :         sized = fn;
    5779              :     }
    5780         1946 :   if (DECL_INITIAL (unsized) && !DECL_INITIAL (sized))
    5781            6 :     warning_at (DECL_SOURCE_LOCATION (unsized), OPT_Wsized_deallocation,
    5782              :                 "the program should also define %qD", sized);
    5783         1940 :   else if (!DECL_INITIAL (unsized) && DECL_INITIAL (sized))
    5784            4 :     warning_at (DECL_SOURCE_LOCATION (sized), OPT_Wsized_deallocation,
    5785              :                 "the program should also define %qD", unsized);
    5786         1946 : }
    5787              : 
    5788              : /* Check the global deallocation functions to see if we want to warn about
    5789              :    defining unsized without sized (or vice versa).  */
    5790              : 
    5791              : static void
    5792        96822 : maybe_warn_sized_delete ()
    5793              : {
    5794        96822 :   if (!flag_sized_deallocation || !warn_sized_deallocation)
    5795              :     return;
    5796          973 :   maybe_warn_sized_delete (DELETE_EXPR);
    5797          973 :   maybe_warn_sized_delete (VEC_DELETE_EXPR);
    5798              : }
    5799              : 
    5800              : /* Earlier we left PTRMEM_CST in variable initializers alone so that we could
    5801              :    look them up when evaluating non-type template parameters.  Now we need to
    5802              :    lower them to something the back end can understand.  */
    5803              : 
    5804              : static void
    5805        96822 : lower_var_init ()
    5806              : {
    5807        96822 :   varpool_node *node;
    5808     32227201 :   FOR_EACH_VARIABLE (node)
    5809              :     {
    5810     32130379 :       tree d = node->decl;
    5811     32130379 :       if (tree init = DECL_INITIAL (d))
    5812     29745402 :         DECL_INITIAL (d) = cplus_expand_constant (init);
    5813              :     }
    5814        96822 : }
    5815              : 
    5816              : /* This routine is called at the end of compilation.
    5817              :    Its job is to create all the code needed to initialize and
    5818              :    destroy the global aggregates.  We do the destruction
    5819              :    first, since that way we only need to reverse the decls once.  */
    5820              : 
    5821              : void
    5822        96934 : c_parse_final_cleanups (void)
    5823              : {
    5824        96934 :   size_t i;
    5825        96934 :   tree decl;
    5826              : 
    5827        96934 :   locus_at_end_of_parsing = input_location;
    5828              :   /* We're done parsing.  */
    5829        96934 :   at_eof = 1;
    5830              : 
    5831              :   /* Bad parse errors.  Just forget about it.  */
    5832       193868 :   if (! global_bindings_p () || current_class_type
    5833       193868 :       || !vec_safe_is_empty (decl_namespace_list))
    5834          100 :     return;
    5835              : 
    5836              :   /* This is the point to write out a PCH if we're doing that.
    5837              :      In that case we do not want to do anything else.  */
    5838        96931 :   if (pch_file)
    5839              :     {
    5840              :       /* Mangle all symbols at PCH creation time.  */
    5841           97 :       symtab_node *node;
    5842        49462 :       FOR_EACH_SYMBOL (node)
    5843        49365 :         if (! is_a <varpool_node *> (node)
    5844        16300 :             || ! DECL_HARD_REGISTER (node->decl))
    5845        49365 :           DECL_ASSEMBLER_NAME (node->decl);
    5846           97 :       c_common_write_pch ();
    5847           97 :       dump_tu ();
    5848              :       /* Ensure even the callers don't try to finalize the CU.  */
    5849           97 :       flag_syntax_only = 1;
    5850           97 :       return;
    5851              :     }
    5852              : 
    5853        96834 :   timevar_stop (TV_PHASE_PARSING);
    5854        96834 :   timevar_start (TV_PHASE_DEFERRED);
    5855              : 
    5856        96834 :   symtab->process_same_body_aliases ();
    5857              : 
    5858              :   /* Handle -fdump-ada-spec[-slim] */
    5859        96834 :   if (flag_dump_ada_spec || flag_dump_ada_spec_slim)
    5860              :     {
    5861           75 :       collect_source_ref (main_input_filename);
    5862           75 :       if (!flag_dump_ada_spec_slim)
    5863           75 :         collect_source_refs (global_namespace);
    5864              : 
    5865           75 :       dump_ada_specs (collect_all_refs, cpp_check);
    5866              :     }
    5867              : 
    5868              :   /* FIXME - huh?  was  input_line -= 1;*/
    5869              : 
    5870              :   /* We now have to write out all the stuff we put off writing out.
    5871              :      These include:
    5872              : 
    5873              :        o Template specializations that we have not yet instantiated,
    5874              :          but which are needed.
    5875              :        o Initialization and destruction for non-local objects with
    5876              :          static storage duration.  (Local objects with static storage
    5877              :          duration are initialized when their scope is first entered,
    5878              :          and are cleaned up via atexit.)
    5879              :        o Virtual function tables.
    5880              : 
    5881              :      All of these may cause others to be needed.  For example,
    5882              :      instantiating one function may cause another to be needed, and
    5883              :      generating the initializer for an object may cause templates to be
    5884              :      instantiated, etc., etc.  */
    5885              : 
    5886        96834 :   emit_support_tinfos ();
    5887              : 
    5888              :   /* Track vtables we want to emit that refer to consteval functions.  */
    5889        96834 :   auto_vec<tree> consteval_vtables;
    5890              : 
    5891        96834 :   int retries = 0;
    5892        96834 :   unsigned ssdf_count = 0, omp_ssdf_count = 0;
    5893       240221 :   for (bool reconsider = true; reconsider; retries++)
    5894              :     {
    5895       143399 :       reconsider = false;
    5896              : 
    5897              :       /* If there are templates that we've put off instantiating, do
    5898              :          them now.  */
    5899       143399 :       instantiate_pending_templates (retries);
    5900       143387 :       ggc_collect ();
    5901              : 
    5902       143387 :       if (header_module_p ())
    5903              :         /* A header modules initializations are handled in its
    5904              :            importer.  */
    5905          911 :         continue;
    5906              : 
    5907              :       /* Emit wrappers where needed, and if that causes more to be added then
    5908              :          make sure we account for possible additional instantiations.  */
    5909       142476 :       if (flag_contracts)
    5910        29101 :         if (emit_contract_wrapper_func (/*done*/false))
    5911       142476 :           reconsider = true;
    5912              : 
    5913              :       /* Write out virtual tables as required.  Writing out the
    5914              :          virtual table for a template class may cause the
    5915              :          instantiation of members of that class.  If we write out
    5916              :          vtables then we remove the class from our list so we don't
    5917              :          have to look at it again.  */
    5918       142476 :       tree t;
    5919       142476 :       for (i = keyed_classes->length ();
    5920      3743967 :            keyed_classes->iterate (--i, &t);)
    5921      3601491 :         if (maybe_emit_vtables (t, consteval_vtables))
    5922              :           {
    5923       342015 :             reconsider = true;
    5924       342015 :             keyed_classes->unordered_remove (i);
    5925              :           }
    5926              :       /* The input_location may have been changed during marking of
    5927              :          vtable entries.  */
    5928       142476 :       input_location = locus_at_end_of_parsing;
    5929              : 
    5930              :       /* Write out needed type info variables.  We have to be careful
    5931              :          looping through unemitted decls, because emit_tinfo_decl may
    5932              :          cause other variables to be needed. New elements will be
    5933              :          appended, and we remove from the vector those that actually
    5934              :          get emitted.  */
    5935       142476 :       for (i = unemitted_tinfo_decls->length ();
    5936      5977131 :            unemitted_tinfo_decls->iterate (--i, &t);)
    5937      5834655 :         if (DECL_INITIAL (t) || emit_tinfo_decl (t))
    5938              :           {
    5939       427159 :             reconsider = true;
    5940       427159 :             unemitted_tinfo_decls->unordered_remove (i);
    5941              :           }
    5942              : 
    5943              :       /* The list of objects with static storage duration is built up
    5944              :          in reverse order.  We clear STATIC_AGGREGATES so that any new
    5945              :          aggregates added during the initialization of these will be
    5946              :          initialized in the correct order when we next come around the
    5947              :          loop.  */
    5948       142476 :       if (tree vars = prune_vars_needing_no_initialization (&static_aggregates))
    5949              :         {
    5950         5456 :           if (flag_openmp)
    5951              :             /* Add initializer information from VARS into
    5952              :                DYNAMIC_INITIALIZERS.  */
    5953          394 :             for (t = vars; t; t = TREE_CHAIN (t))
    5954          566 :               hash_map_safe_put<hm_ggc> (dynamic_initializers,
    5955          283 :                                          TREE_VALUE (t), TREE_PURPOSE (t));
    5956              : 
    5957              :           /* Make sure the back end knows about all the variables.  */
    5958         5456 :           write_out_vars (vars);
    5959              : 
    5960         5456 :           function_depth++; // Disable GC
    5961         5456 :           priority_map_t *parts[4] = {nullptr, nullptr, nullptr, nullptr};
    5962         5456 :           partition_vars_for_init_fini (vars, parts);
    5963         5456 :           tree host_init_fini[2] = { NULL_TREE, NULL_TREE };
    5964              : 
    5965        16368 :           for (unsigned initp = 2; initp--;)
    5966        10912 :             if (parts[initp])
    5967        16391 :               for (auto iter : *parts[initp])
    5968              :                 {
    5969         5473 :                   auto list = iter.second;
    5970         5473 :                   if (initp)
    5971              :                     // Partitioning kept the vars in reverse order.
    5972              :                     // We only want that for dtors.
    5973         5464 :                     list = nreverse (list);
    5974         5473 :                   host_init_fini[initp]
    5975         5473 :                     = emit_partial_init_fini_fn (initp, iter.first, list,
    5976              :                                                  ssdf_count++,
    5977              :                                                  locus_at_end_of_parsing,
    5978              :                                                  NULL_TREE);
    5979              :                 }
    5980              : 
    5981         5456 :           if (flag_openmp)
    5982              :             {
    5983              :               priority_map_t **omp_parts = parts + 2;
    5984          333 :               for (unsigned initp = 2; initp--;)
    5985          222 :                 if (omp_parts[initp])
    5986           58 :                   for (auto iter : *omp_parts[initp])
    5987              :                     {
    5988           15 :                       auto list = iter.second;
    5989           15 :                       if (initp)
    5990              :                         // Partitioning kept the vars in reverse order.
    5991              :                         // We only want that for dtors.
    5992           15 :                         list = nreverse (list);
    5993           15 :                       emit_partial_init_fini_fn (initp, iter.first, list,
    5994              :                                                  omp_ssdf_count++,
    5995              :                                                  locus_at_end_of_parsing,
    5996              :                                                  host_init_fini[initp]);
    5997              :                   }
    5998              :             }
    5999              : 
    6000         5456 :           function_depth--; // Re-enable GC
    6001              : 
    6002              :           /* All those initializations and finalizations might cause
    6003              :              us to need more inline functions, more template
    6004              :              instantiations, etc.  */
    6005         5456 :           reconsider = true;
    6006              :         }
    6007              : 
    6008              :       /* Now do the same for thread_local variables.  */
    6009       142476 :       handle_tls_init ();
    6010              : 
    6011              :       /* Go through the set of inline functions whose bodies have not
    6012              :          been emitted yet.  If out-of-line copies of these functions
    6013              :          are required, emit them.  */
    6014    185741592 :       FOR_EACH_VEC_SAFE_ELT (deferred_fns, i, decl)
    6015              :         {
    6016              :           /* Does it need synthesizing?  */
    6017    191239576 :           if (DECL_DEFAULTED_FN (decl) && ! DECL_INITIAL (decl)
    6018    185599122 :               && (! DECL_REALLY_EXTERN (decl) || possibly_inlined_p (decl)))
    6019              :             {
    6020              :               /* Even though we're already at the top-level, we push
    6021              :                  there again.  That way, when we pop back a few lines
    6022              :                  hence, all of our state is restored.  Otherwise,
    6023              :                  finish_function doesn't clean things up, and we end
    6024              :                  up with CURRENT_FUNCTION_DECL set.  */
    6025            6 :               push_to_top_level ();
    6026              :               /* The decl's location will mark where it was first
    6027              :                  needed.  Save that so synthesize method can indicate
    6028              :                  where it was needed from, in case of error  */
    6029            6 :               input_location = DECL_SOURCE_LOCATION (decl);
    6030            6 :               synthesize_method (decl);
    6031            6 :               pop_from_top_level ();
    6032            6 :               reconsider = true;
    6033              :             }
    6034              : 
    6035    185599116 :           if (!DECL_INITIAL (decl) && decl_tls_wrapper_p (decl))
    6036          586 :             generate_tls_wrapper (decl);
    6037              : 
    6038    185599116 :           if (!DECL_SAVED_TREE (decl))
    6039       212065 :             continue;
    6040              : 
    6041    185387051 :           cgraph_node *node = cgraph_node::get_create (decl);
    6042              : 
    6043              :           /* We lie to the back end, pretending that some functions
    6044              :              are not defined when they really are.  This keeps these
    6045              :              functions from being put out unnecessarily.  But, we must
    6046              :              stop lying when the functions are referenced, or if they
    6047              :              are not comdat since they need to be put out now.  If
    6048              :              DECL_INTERFACE_KNOWN, then we have already set
    6049              :              DECL_EXTERNAL appropriately, so there's no need to check
    6050              :              again, and we do not want to clear DECL_EXTERNAL if a
    6051              :              previous call to import_export_decl set it.
    6052              : 
    6053              :              This is done in a separate for cycle, because if some
    6054              :              deferred function is contained in another deferred
    6055              :              function later in deferred_fns varray,
    6056              :              rest_of_compilation would skip this function and we
    6057              :              really cannot expand the same function twice.  */
    6058    185387051 :           import_export_decl (decl);
    6059    185387051 :           if (DECL_NOT_REALLY_EXTERN (decl)
    6060    178451220 :               && DECL_INITIAL (decl)
    6061    363838271 :               && decl_needed_p (decl))
    6062              :             {
    6063    116846056 :               if (node->cpp_implicit_alias)
    6064     10365878 :                 node = node->get_alias_target ();
    6065              : 
    6066    116846056 :               node->call_for_symbol_thunks_and_aliases (clear_decl_external,
    6067              :                                                         NULL, true);
    6068              :               /* If we mark !DECL_EXTERNAL one of the symbols in some comdat
    6069              :                  group, we need to mark all symbols in the same comdat group
    6070              :                  that way.  */
    6071    116846056 :               if (node->same_comdat_group)
    6072     30698446 :                 for (cgraph_node *next
    6073     15133752 :                        = dyn_cast<cgraph_node *> (node->same_comdat_group);
    6074     30698446 :                      next != node;
    6075     46263140 :                      next = dyn_cast<cgraph_node *> (next->same_comdat_group))
    6076     15564694 :                   next->call_for_symbol_thunks_and_aliases (clear_decl_external,
    6077              :                                                             NULL, true);
    6078              :             }
    6079              : 
    6080              :           /* If we're going to need to write this function out, and
    6081              :              there's already a body for it, create RTL for it now.
    6082              :              (There might be no body if this is a method we haven't
    6083              :              gotten around to synthesizing yet.)  */
    6084    185387051 :           if (!DECL_EXTERNAL (decl)
    6085    119714620 :               && decl_needed_p (decl)
    6086    117516941 :               && !TREE_ASM_WRITTEN (decl)
    6087    215106656 :               && !DECL_IMMEDIATE_FUNCTION_P (decl)
    6088    287700346 :               && !node->definition)
    6089              :             {
    6090              :               /* We will output the function; no longer consider it in this
    6091              :                  loop.  */
    6092            0 :               DECL_DEFER_OUTPUT (decl) = 0;
    6093              :               /* Generate RTL for this function now that we know we
    6094              :                  need it.  */
    6095            0 :               expand_or_defer_fn (decl);
    6096            0 :               reconsider = true;
    6097              :             }
    6098              :         }
    6099              : 
    6100       142476 :       if (wrapup_namespace_globals ())
    6101          554 :         reconsider = true;
    6102              : 
    6103              :       /* Static data members are just like namespace-scope globals.  */
    6104     96609137 :       FOR_EACH_VEC_SAFE_ELT (pending_statics, i, decl)
    6105              :         {
    6106    178816938 :           if (consteval_only_p (decl)
    6107     96466513 :               || var_finalized_p (decl)
    6108     24983684 :               || DECL_REALLY_EXTERN (decl)
    6109              :               /* Don't write it out if we haven't seen a definition.  */
    6110    110589693 :               || DECL_IN_AGGR_P (decl))
    6111     82350277 :             continue;
    6112     14116384 :           import_export_decl (decl);
    6113              :           /* If this static data member is needed, provide it to the
    6114              :              back end.  */
    6115     14116384 :           if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl))
    6116     14086347 :             DECL_EXTERNAL (decl) = 0;
    6117              :         }
    6118              : 
    6119       285863 :       if (vec_safe_length (pending_statics) != 0
    6120       115636 :           && wrapup_global_declarations (pending_statics->address (),
    6121        57818 :                                          pending_statics->length ()))
    6122              :         reconsider = true;
    6123              :     }
    6124              : 
    6125        96822 :   if (flag_contracts)
    6126              :     {
    6127        23559 :       emit_contract_wrapper_func (/*done*/true);
    6128        23559 :       maybe_emit_violation_handler_wrappers ();
    6129              :     }
    6130              : 
    6131              :   /* All templates have been instantiated.  */
    6132        96822 :   at_eof = 2;
    6133              : 
    6134        96822 :   void *module_cookie = finish_module_processing (parse_in);
    6135              : 
    6136        96822 :   lower_var_init ();
    6137              : 
    6138        96822 :   generate_mangling_aliases ();
    6139              : 
    6140              :   /* All used inline functions must have a definition at this point.  */
    6141     48514611 :   FOR_EACH_VEC_SAFE_ELT (deferred_fns, i, decl)
    6142              :     {
    6143     48417789 :       if (/* Check online inline functions that were actually used.  */
    6144     78856899 :           DECL_ODR_USED (decl) && DECL_DECLARED_INLINE_P (decl)
    6145              :           /* If the definition actually was available here, then the
    6146              :              fact that the function was not defined merely represents
    6147              :              that for some reason (use of a template repository,
    6148              :              #pragma interface, etc.) we decided not to emit the
    6149              :              definition here.  */
    6150     30437706 :           && !DECL_INITIAL (decl)
    6151              :           /* A defaulted fn or TLS wrapper in a header module can be
    6152              :              synthesized on demand later.  (In non-header modules we
    6153              :              should have synthesized it above.)  */
    6154         4823 :           && !(header_module_p ()
    6155           11 :                && (DECL_DEFAULTED_FN (decl) || decl_tls_wrapper_p (decl)))
    6156              :           /* Metafunctions are never defined.  */
    6157         4817 :           && !metafunction_p (decl)
    6158              :           /* Don't complain if the template was defined.  */
    6159          749 :           && !(DECL_TEMPLOID_INSTANTIATION (decl)
    6160          664 :                && DECL_INITIAL (DECL_TEMPLATE_RESULT
    6161              :                                 (template_for_substitution (decl))))
    6162     78856899 :           && warning_at (DECL_SOURCE_LOCATION (decl), 0,
    6163              :                          "inline function %qD used but never defined", decl))
    6164              :         /* Avoid a duplicate warning from check_global_declaration.  */
    6165           82 :         suppress_warning (decl, OPT_Wunused);
    6166              :     }
    6167              : 
    6168              :   /* So must decls that use a type with no linkage.  */
    6169       576815 :   FOR_EACH_VEC_SAFE_ELT (no_linkage_decls, i, decl)
    6170       479993 :     no_linkage_error (decl);
    6171              : 
    6172        96822 :   maybe_warn_sized_delete ();
    6173              : 
    6174              :   // Place the init fns in the right order.  We need to do this now,
    6175              :   // so that any module init will go at the start.
    6176        96822 :   if (static_init_fini_fns[true])
    6177        16355 :     for (auto iter : *static_init_fini_fns[true])
    6178         5461 :       iter.second = nreverse (iter.second);
    6179              : 
    6180        96822 :   if (flag_openmp && static_init_fini_fns[2 + true])
    6181           43 :     for (auto iter : *static_init_fini_fns[2 + true])
    6182           15 :       iter.second = nreverse (iter.second);
    6183              : 
    6184              :   /* Now we've instantiated all templates.  Now we can escalate the functions
    6185              :      we squirreled away earlier.  */
    6186        96822 :   process_and_check_pending_immediate_escalating_fns ();
    6187              : 
    6188              :   /* Then, do the Objective-C stuff.  This is where all the
    6189              :      Objective-C module stuff gets generated (symtab,
    6190              :      class/protocol/selector lists etc).  This must be done after C++
    6191              :      templates, destructors etc. so that selectors used in C++
    6192              :      templates are properly allocated.  */
    6193        96822 :   if (c_dialect_objc ())
    6194            0 :     objc_write_global_declarations ();
    6195              : 
    6196        96822 :   bool has_module_inits = module_determine_import_inits ();
    6197        96822 :   bool has_objc_init = c_dialect_objc () && objc_static_init_needed_p ();
    6198        96822 :   if (has_module_inits || has_objc_init)
    6199              :     {
    6200           46 :       input_location = locus_at_end_of_parsing;
    6201           46 :       tree body = start_partial_init_fini_fn (true, DEFAULT_INIT_PRIORITY,
    6202              :                                               ssdf_count++, false);
    6203              :       /* For Objective-C++, we may need to initialize metadata found
    6204              :          in this module.  This must be done _before_ any other static
    6205              :          initializations.  */
    6206           46 :       if (has_objc_init)
    6207            0 :         objc_generate_static_init_call (NULL_TREE);
    6208           46 :       if (has_module_inits)
    6209           46 :         module_add_import_initializers ();
    6210           46 :       input_location = locus_at_end_of_parsing;
    6211           46 :       finish_partial_init_fini_fn (body);
    6212              :     }
    6213              : 
    6214        96822 :   if (module_global_init_needed ())
    6215              :     {
    6216              :       // Make sure there's a default priority entry.
    6217         1986 :       if (!static_init_fini_fns[true])
    6218         1922 :         static_init_fini_fns[true] = priority_map_t::create_ggc ();
    6219         1986 :       if (static_init_fini_fns[true]->get_or_insert (DEFAULT_INIT_PRIORITY))
    6220        96822 :         has_module_inits = true;
    6221              : 
    6222              :       /* FIXME: We need to work out what static constructors on OpenMP offload
    6223              :          target in modules will look like.  */
    6224              :     }
    6225              : 
    6226              :   /* Generate initialization and destruction functions for all
    6227              :      priorities for which they are required.  They have C-language
    6228              :      linkage.  */
    6229        96822 :   push_lang_context (lang_name_c);
    6230       484110 :   for (unsigned initp = 4; initp--;)
    6231       387288 :     if (static_init_fini_fns[initp])
    6232              :       {
    6233        14867 :         for (auto iter : *static_init_fini_fns[initp])
    6234         7441 :           generate_ctor_or_dtor_function (initp & 1, iter.first, iter.second,
    6235              :                                           locus_at_end_of_parsing,
    6236         7441 :                                           (initp & 2) != 0);
    6237         7426 :         static_init_fini_fns[initp] = nullptr;
    6238              :       }
    6239        96822 :   pop_lang_context ();
    6240              : 
    6241        96822 :   fini_modules (parse_in, module_cookie, has_module_inits);
    6242              : 
    6243              :   /* Generate any missing aliases.  */
    6244        96822 :   maybe_apply_pending_pragma_weaks ();
    6245              : 
    6246        96822 :   if (flag_vtable_verify)
    6247              :     {
    6248            9 :       vtv_recover_class_info ();
    6249            9 :       vtv_compute_class_hierarchy_transitive_closure ();
    6250            9 :       vtv_build_vtable_verify_fndecl ();
    6251              :     }
    6252              : 
    6253        96822 :   perform_deferred_noexcept_checks ();
    6254              : 
    6255        96822 :   fini_constexpr ();
    6256        96822 :   cp_tree_c_finish_parsing ();
    6257        96822 :   clear_consteval_vfns (consteval_vtables);
    6258              : 
    6259              :   /* The entire file is now complete.  If requested, dump everything
    6260              :      to a file.  */
    6261        96822 :   dump_tu ();
    6262              : 
    6263        96822 :   if (flag_detailed_statistics)
    6264              :     {
    6265            0 :       dump_tree_statistics ();
    6266            0 :       dump_time_statistics ();
    6267              :     }
    6268              : 
    6269        96822 :   timevar_stop (TV_PHASE_DEFERRED);
    6270        96822 :   timevar_start (TV_PHASE_PARSING);
    6271              : 
    6272              :   /* Indicate that we're done with front end processing.  */
    6273        96822 :   at_eof = 3;
    6274        96822 : }
    6275              : 
    6276              : /* Perform any post compilation-proper cleanups for the C++ front-end.
    6277              :    This should really go away.  No front-end should need to do
    6278              :    anything past the compilation process.  */
    6279              : 
    6280              : void
    6281        96579 : cxx_post_compilation_parsing_cleanups (void)
    6282              : {
    6283        96579 :   timevar_start (TV_PHASE_LATE_PARSING_CLEANUPS);
    6284              : 
    6285        96579 :   if (flag_vtable_verify)
    6286              :     {
    6287              :       /* Generate the special constructor initialization function that
    6288              :          calls __VLTRegisterPairs, and give it a very high
    6289              :          initialization priority.  This must be done after
    6290              :          finalize_compilation_unit so that we have accurate
    6291              :          information about which vtable will actually be emitted.  */
    6292            9 :       vtv_generate_init_routine ();
    6293              :     }
    6294              : 
    6295        96579 :   input_location = locus_at_end_of_parsing;
    6296              : 
    6297        96579 :   if (flag_checking)
    6298        96570 :     validate_conversion_obstack ();
    6299              : 
    6300        96579 :   timevar_stop (TV_PHASE_LATE_PARSING_CLEANUPS);
    6301        96579 : }
    6302              : 
    6303              : /* FN is an OFFSET_REF, DOTSTAR_EXPR or MEMBER_REF indicating the
    6304              :    function to call in parse-tree form; it has not yet been
    6305              :    semantically analyzed.  ARGS are the arguments to the function.
    6306              :    They have already been semantically analyzed.  This may change
    6307              :    ARGS.  */
    6308              : 
    6309              : tree
    6310       358961 : build_offset_ref_call_from_tree (tree fn, vec<tree, va_gc> **args,
    6311              :                                  tsubst_flags_t complain)
    6312              : {
    6313       358961 :   tree orig_fn;
    6314       358961 :   vec<tree, va_gc> *orig_args = NULL;
    6315       358961 :   tree expr;
    6316       358961 :   tree object;
    6317              : 
    6318       358961 :   orig_fn = fn;
    6319       358961 :   object = TREE_OPERAND (fn, 0);
    6320              : 
    6321       358961 :   if (processing_template_decl)
    6322              :     {
    6323       274956 :       gcc_assert (TREE_CODE (fn) == DOTSTAR_EXPR
    6324              :                   || TREE_CODE (fn) == MEMBER_REF);
    6325       274956 :       if (type_dependent_expression_p (fn)
    6326       274956 :           || any_type_dependent_arguments_p (*args))
    6327       274917 :         return build_min_nt_call_vec (fn, *args);
    6328              : 
    6329           39 :       orig_args = make_tree_vector_copy (*args);
    6330              : 
    6331              :       /* Transform the arguments and add the implicit "this"
    6332              :          parameter.  */
    6333           39 :       if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE)
    6334              :         {
    6335           33 :           if (TREE_CODE (fn) == DOTSTAR_EXPR)
    6336           27 :             object = cp_build_addr_expr (object, complain);
    6337           33 :           vec_safe_insert (*args, 0, object);
    6338              :         }
    6339              :     }
    6340              : 
    6341              :   /* A qualified name corresponding to a bound pointer-to-member is
    6342              :      represented as an OFFSET_REF:
    6343              : 
    6344              :         struct B { void g(); };
    6345              :         void (B::*p)();
    6346              :         void B::g() { (this->*p)(); }  */
    6347        84044 :   if (TREE_CODE (fn) == OFFSET_REF)
    6348              :     {
    6349        84005 :       tree object_addr = cp_build_addr_expr (object, complain);
    6350        84005 :       fn = TREE_OPERAND (fn, 1);
    6351        84005 :       fn = get_member_function_from_ptrfunc (&object_addr, fn,
    6352              :                                              complain);
    6353        84005 :       vec_safe_insert (*args, 0, object_addr);
    6354              :     }
    6355              : 
    6356        84044 :   if (CLASS_TYPE_P (TREE_TYPE (fn)))
    6357            3 :     expr = build_op_call (fn, args, complain);
    6358              :   else
    6359        84041 :     expr = cp_build_function_call_vec (fn, args, complain);
    6360        84044 :   if (processing_template_decl && expr != error_mark_node)
    6361           39 :     expr = build_min_non_dep_call_vec (expr, orig_fn, orig_args);
    6362              : 
    6363        84044 :   if (orig_args != NULL)
    6364           39 :     release_tree_vector (orig_args);
    6365              : 
    6366              :   return expr;
    6367              : }
    6368              : 
    6369              : 
    6370              : void
    6371    361055228 : check_default_args (tree x)
    6372              : {
    6373    361055228 :   tree arg = TYPE_ARG_TYPES (TREE_TYPE (x));
    6374    361055228 :   bool saw_def = false;
    6375    361055228 :   bool noted_first_def = false;
    6376    361055228 :   int idx_of_first_default_arg = 0;
    6377    361055228 :   location_t loc_of_first_default_arg = UNKNOWN_LOCATION;
    6378    361055228 :   int i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE);
    6379    361055228 :   tree fndecl = STRIP_TEMPLATE (x);
    6380    361055228 :   auto_diagnostic_group d;
    6381    985248766 :   for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i)
    6382              :     {
    6383    624193538 :       if (TREE_PURPOSE (arg))
    6384              :         {
    6385     11555576 :           if (!saw_def)
    6386              :             {
    6387      8661246 :               saw_def = true;
    6388      8661246 :               idx_of_first_default_arg = i;
    6389      8661246 :               location_t loc = get_fndecl_argument_location (fndecl, i);
    6390      8661246 :               if (loc != DECL_SOURCE_LOCATION (x))
    6391      8661208 :                 loc_of_first_default_arg = loc;
    6392              :             }
    6393              :         }
    6394    612637962 :       else if (saw_def && !PACK_EXPANSION_P (TREE_VALUE (arg)))
    6395              :         {
    6396          147 :           error_at (get_fndecl_argument_location (fndecl, i),
    6397              :                     "default argument missing for parameter %P of %q#D", i, x);
    6398          147 :           if (loc_of_first_default_arg != UNKNOWN_LOCATION
    6399          147 :               && !noted_first_def)
    6400              :             {
    6401          144 :               inform (loc_of_first_default_arg,
    6402              :                       "...following parameter %P which has a default argument",
    6403              :                       idx_of_first_default_arg);
    6404          144 :               noted_first_def = true;
    6405              :             }
    6406          147 :           TREE_PURPOSE (arg) = error_mark_node;
    6407              :         }
    6408              :     }
    6409    361055228 : }
    6410              : 
    6411              : /* Return true if function DECL can be inlined.  This is used to force
    6412              :    instantiation of methods that might be interesting for inlining.  */
    6413              : bool
    6414            3 : possibly_inlined_p (tree decl)
    6415              : {
    6416            3 :   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
    6417            3 :   if (DECL_UNINLINABLE (decl))
    6418              :     return false;
    6419            3 :   if (!optimize)
    6420            3 :     return DECL_DECLARED_INLINE_P (decl);
    6421              :   /* When optimizing, we might inline everything when flatten
    6422              :      attribute or heuristics inlining for size or autoinlining
    6423              :      is used.  */
    6424              :   return true;
    6425              : }
    6426              : 
    6427              : /* If DECL is a function or variable template specialization, instantiate
    6428              :    its definition now.  */
    6429              : 
    6430              : void
    6431    165898608 : maybe_instantiate_decl (tree decl)
    6432              : {
    6433       600477 :   if (VAR_OR_FUNCTION_DECL_P (decl)
    6434    165898608 :       && DECL_LANG_SPECIFIC (decl)
    6435    125447714 :       && DECL_TEMPLATE_INFO (decl)
    6436    265479591 :       && !uses_template_parms (DECL_TI_ARGS (decl)))
    6437              :     {
    6438              :       /* Instantiating a function will result in garbage collection.  We
    6439              :          must treat this situation as if we were within the body of a
    6440              :          function so as to avoid collecting live data only referenced from
    6441              :          the stack (such as overload resolution candidates).  */
    6442     95151898 :       ++function_depth;
    6443     95151898 :       instantiate_decl (decl, /*defer_ok=*/false,
    6444              :                         /*expl_inst_class_mem_p=*/false);
    6445     95149201 :       --function_depth;
    6446              :     }
    6447    165895911 : }
    6448              : 
    6449              : /* Error if the DECL is unavailable (unless this is currently suppressed).
    6450              :    Maybe warn if DECL is deprecated, subject to COMPLAIN.  Returns true if
    6451              :    an error or warning was emitted.  */
    6452              : 
    6453              : bool
    6454   4028436901 : cp_handle_deprecated_or_unavailable (tree decl, tsubst_flags_t complain)
    6455              : {
    6456   4028436901 :   if (!decl)
    6457              :     return false;
    6458              : 
    6459   3990071243 :   if ((complain & tf_error)
    6460   3657550264 :       && deprecated_state != UNAVAILABLE_DEPRECATED_SUPPRESS)
    6461              :     {
    6462   2945721949 :       if (TREE_UNAVAILABLE (decl))
    6463              :         {
    6464          252 :           error_unavailable_use (decl, NULL_TREE);
    6465          252 :           return true;
    6466              :         }
    6467              :       else
    6468              :         {
    6469              :           /* Perhaps this is an unavailable typedef.  */
    6470   2945721697 :           if (TYPE_P (decl)
    6471    784383894 :               && TYPE_NAME (decl)
    6472   3723918510 :               && TREE_UNAVAILABLE (TYPE_NAME (decl)))
    6473              :             {
    6474            6 :               decl = TYPE_NAME (decl);
    6475              :               /* Don't error within members of a unavailable type.  */
    6476            6 :               if (TYPE_P (decl)
    6477            6 :                   && currently_open_class (decl))
    6478              :                 return false;
    6479              : 
    6480            6 :               error_unavailable_use (decl, NULL_TREE);
    6481            6 :               return true;
    6482              :             }
    6483              :         }
    6484              :       /* Carry on to consider deprecatedness.  */
    6485              :     }
    6486              : 
    6487   3990070985 :   if (!(complain & tf_warning)
    6488   3614938481 :       || deprecated_state == DEPRECATED_SUPPRESS
    6489   3612641730 :       || deprecated_state == UNAVAILABLE_DEPRECATED_SUPPRESS)
    6490              :     return false;
    6491              : 
    6492   2906066586 :   if (!TREE_DEPRECATED (decl))
    6493              :     {
    6494              :       /* Perhaps this is a deprecated typedef.  */
    6495   2905453106 :       if (TYPE_P (decl) && TYPE_NAME (decl))
    6496    776851318 :         decl = TYPE_NAME (decl);
    6497              : 
    6498   2905453106 :       if (!TREE_DEPRECATED (decl))
    6499              :         return false;
    6500              :     }
    6501              : 
    6502              :   /* Don't warn within members of a deprecated type.  */
    6503       613488 :   if (TYPE_P (decl)
    6504       613488 :       && currently_open_class (decl))
    6505              :     return false;
    6506              : 
    6507       134387 :   bool warned = false;
    6508       134387 :   if (cxx_dialect >= cxx11
    6509       134296 :       && DECL_P (decl)
    6510       134175 :       && DECL_ARTIFICIAL (decl)
    6511        19779 :       && DECL_IOBJ_MEMBER_FUNCTION_P (decl)
    6512       154166 :       && copy_fn_p (decl))
    6513              :     {
    6514              :       /* Don't warn if the flag was disabled around the class definition
    6515              :          (c++/94492).  */
    6516        19767 :       if (warning_enabled_at (DECL_SOURCE_LOCATION (decl),
    6517        19767 :                               OPT_Wdeprecated_copy))
    6518              :         {
    6519           20 :           auto_diagnostic_group d;
    6520           20 :           tree ctx = DECL_CONTEXT (decl);
    6521           20 :           tree other = classtype_has_depr_implicit_copy (ctx);
    6522           20 :           int opt = (DECL_DESTRUCTOR_P (other)
    6523           20 :                      ? OPT_Wdeprecated_copy_dtor
    6524            0 :                      : OPT_Wdeprecated_copy);
    6525           20 :           warned = warning (opt, "implicitly-declared %qD is deprecated",
    6526              :                             decl);
    6527           20 :           if (warned)
    6528            4 :             inform (DECL_SOURCE_LOCATION (other),
    6529              :                     "because %qT has user-provided %qD",
    6530              :                     ctx, other);
    6531           20 :         }
    6532              :     }
    6533              :   else
    6534              :     {
    6535       114620 :       if (!warning_suppressed_at (input_location,
    6536              :                                   OPT_Wdeprecated_declarations))
    6537       109814 :         warned = warn_deprecated_use (decl, NULL_TREE);
    6538       114620 :       suppress_warning_at (input_location, OPT_Wdeprecated_declarations);
    6539              :     }
    6540              : 
    6541              :   return warned;
    6542              : }
    6543              : 
    6544              : /* Like above, but takes into account outer scopes.  */
    6545              : 
    6546              : void
    6547   1504377076 : cp_warn_deprecated_use_scopes (tree scope)
    6548              : {
    6549   1504377076 :   while (scope
    6550   2639097471 :          && scope != error_mark_node
    6551   5278194907 :          && scope != global_namespace)
    6552              :     {
    6553    252473047 :       if ((TREE_CODE (scope) == NAMESPACE_DECL || OVERLOAD_TYPE_P (scope))
    6554   1370679791 :           && cp_handle_deprecated_or_unavailable (scope))
    6555              :         return;
    6556   1134720395 :       if (TYPE_P (scope))
    6557    237686627 :         scope = CP_TYPE_CONTEXT (scope);
    6558              :       else
    6559    897033768 :         scope = CP_DECL_CONTEXT (scope);
    6560              :     }
    6561              : }
    6562              : 
    6563              : /* True if DECL or its enclosing scope have unbound template parameters.  */
    6564              : 
    6565              : bool
    6566    474005530 : decl_dependent_p (tree decl)
    6567              : {
    6568    474005530 :   tree orig_decl = decl;
    6569    947403984 :   if (DECL_FUNCTION_SCOPE_P (decl)
    6570    204716806 :       || TREE_CODE (decl) == CONST_DECL
    6571    204716806 :       || TREE_CODE (decl) == USING_DECL
    6572    678722336 :       || TREE_CODE (decl) == FIELD_DECL)
    6573    269288724 :     decl = CP_DECL_CONTEXT (decl);
    6574    474005530 :   if (tree tinfo = get_template_info (decl))
    6575    406621133 :     if (any_dependent_template_arguments_p (TI_ARGS (tinfo)))
    6576              :       return true;
    6577    303742387 :   if (LAMBDA_FUNCTION_P (decl)
    6578    302310336 :       && dependent_type_p (DECL_CONTEXT (decl)))
    6579              :     return true;
    6580              :   /* for-range-declaration of expansion statement as well as variable
    6581              :      declarations in the expansion statement body when the expansion statement
    6582              :      is not inside a template still need to be treated as dependent during
    6583              :      parsing.  When the body is instantiated, in_expansion_stmt will be already
    6584              :      false.  */
    6585    301009192 :   if (VAR_P (orig_decl) && in_expansion_stmt && decl == current_function_decl)
    6586              :     return true;
    6587              :   return false;
    6588              : }
    6589              : 
    6590              : /* [basic.def.odr] A function is named [and therefore odr-used] by an
    6591              :    expression or conversion if it is the selected member of an overload set in
    6592              :    an overload resolution performed as part of forming that expression or
    6593              :    conversion, unless it is a pure virtual function and either the expression
    6594              :    is not an id-expression naming the function with an explicitly qualified
    6595              :    name or the expression forms a pointer to member.
    6596              : 
    6597              :    Mostly, we call mark_used in places that actually do something with a
    6598              :    function, like build_over_call.  But in a few places we end up with a
    6599              :    non-overloaded FUNCTION_DECL that we aren't going to do any more with, like
    6600              :    convert_to_void.  resolve_nondeduced_context is called in those places,
    6601              :    but it's also called in too many other places.  */
    6602              : 
    6603              : bool
    6604    434994940 : mark_single_function (tree expr, tsubst_flags_t complain)
    6605              : {
    6606    434994940 :   expr = maybe_undo_parenthesized_ref (expr);
    6607    434994940 :   expr = tree_strip_any_location_wrapper (expr);
    6608              : 
    6609    434994940 :   if (expr == error_mark_node)
    6610              :     return false;
    6611              : 
    6612    434994240 :   if (is_overloaded_fn (expr) == 1
    6613    115017770 :       && !mark_used (expr, complain)
    6614    434994277 :       && !(complain & tf_error))
    6615              :     return false;
    6616              :   return true;
    6617              : }
    6618              : 
    6619              : /* True iff we have started, but not finished, defining FUNCTION_DECL DECL.  */
    6620              : 
    6621              : bool
    6622     86182921 : fn_being_defined (tree decl)
    6623              : {
    6624              :   /* DECL_INITIAL is set to error_mark_node in grokfndecl for a definition, and
    6625              :      changed to BLOCK by poplevel at the end of the function.  */
    6626     86182921 :   return (TREE_CODE (decl) == FUNCTION_DECL
    6627     86182921 :           && DECL_INITIAL (decl) == error_mark_node);
    6628              : }
    6629              : 
    6630              : /* True if DECL is an instantiation of a function template currently being
    6631              :    defined.  */
    6632              : 
    6633              : bool
    6634    301008733 : fn_template_being_defined (tree decl)
    6635              : {
    6636    301008733 :   if (TREE_CODE (decl) != FUNCTION_DECL
    6637    139410231 :       || !DECL_LANG_SPECIFIC (decl)
    6638    139410231 :       || !DECL_TEMPLOID_INSTANTIATION (decl)
    6639    414630592 :       || DECL_TEMPLATE_INSTANTIATED (decl))
    6640              :     return false;
    6641     86182921 :   tree tinfo = DECL_TEMPLATE_INFO (decl);
    6642     86182921 :   tree pattern = DECL_TEMPLATE_RESULT (TI_TEMPLATE (tinfo));
    6643     86182921 :   return fn_being_defined (pattern);
    6644              : }
    6645              : 
    6646              : /* Mark DECL (either a _DECL or a BASELINK) as "used" in the program.
    6647              :    If DECL is a specialization or implicitly declared class member,
    6648              :    generate the actual definition.  Return false if something goes
    6649              :    wrong, true otherwise.  */
    6650              : 
    6651              : bool
    6652   1324489239 : mark_used (tree decl, tsubst_flags_t complain /* = tf_warning_or_error */)
    6653              : {
    6654   1324489239 :   if (decl == error_mark_node)
    6655              :     return false;
    6656              : 
    6657              :   /* If we're just testing conversions or resolving overloads, we
    6658              :      don't want any permanent effects like forcing functions to be
    6659              :      output or instantiating templates.  */
    6660   1324489134 :   if ((complain & tf_conv))
    6661              :     return true;
    6662              : 
    6663              :   /* If DECL is a BASELINK for a single function, then treat it just
    6664              :      like the DECL for the function.  Otherwise, if the BASELINK is
    6665              :      for an overloaded function, we don't know which function was
    6666              :      actually used until after overload resolution.  */
    6667   1324467832 :   if (BASELINK_P (decl))
    6668              :     {
    6669        11158 :       tree fns = BASELINK_FUNCTIONS (decl);
    6670        11158 :       if (really_overloaded_fn (fns))
    6671              :         return true;
    6672        11115 :       fns = OVL_FIRST (fns);
    6673        11115 :       if (!mark_used (fns, complain))
    6674              :         return false;
    6675              :       /* We might have deduced its return type.  */
    6676        11103 :       TREE_TYPE (decl) = TREE_TYPE (fns);
    6677        11103 :       return true;
    6678              :     }
    6679              : 
    6680   1324456674 :   if (!DECL_P (decl))
    6681              :     return true;
    6682              : 
    6683              :   /* Set TREE_USED for the benefit of -Wunused.  */
    6684   1323543887 :   TREE_USED (decl) = true;
    6685              : 
    6686              :   /* And for structured bindings also the underlying decl.  */
    6687   1323543887 :   if (DECL_DECOMPOSITION_P (decl) && !DECL_DECOMP_IS_BASE (decl))
    6688       895079 :     TREE_USED (DECL_DECOMP_BASE (decl)) = true;
    6689              : 
    6690   1323543887 :   if (TREE_CODE (decl) == TEMPLATE_DECL)
    6691              :     return true;
    6692              : 
    6693   1323532513 :   if (DECL_CLONED_FUNCTION_P (decl))
    6694     20235955 :     TREE_USED (DECL_CLONED_FUNCTION (decl)) = 1;
    6695              : 
    6696              :   /* Mark enumeration types as used.  */
    6697   1323532513 :   if (TREE_CODE (decl) == CONST_DECL)
    6698     32350320 :     used_types_insert (DECL_CONTEXT (decl));
    6699              : 
    6700   1323532513 :   if (TREE_CODE (decl) == FUNCTION_DECL)
    6701              :     {
    6702    291996127 :       if (DECL_MAYBE_DELETED (decl))
    6703              :         {
    6704        33650 :           ++function_depth;
    6705        33650 :           maybe_synthesize_method (decl);
    6706        33650 :           --function_depth;
    6707              :         }
    6708              : 
    6709    291996127 :       if (DECL_DELETED_FN (decl))
    6710              :         {
    6711         2629 :           if (DECL_ARTIFICIAL (decl)
    6712         1785 :               && DECL_CONV_FN_P (decl)
    6713         2641 :               && LAMBDA_TYPE_P (DECL_CONTEXT (decl)))
    6714              :             /* We mark a lambda conversion op as deleted if we can't
    6715              :                generate it properly; see maybe_add_lambda_conv_op.  */
    6716            6 :             sorry ("converting lambda that uses %<...%> to function pointer");
    6717         2623 :           else if (complain & tf_error)
    6718              :             {
    6719         2381 :               auto_diagnostic_group d;
    6720         2381 :               if (DECL_INITIAL (decl)
    6721         2381 :                   && TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
    6722              :                 {
    6723           23 :                   escaped_string msg;
    6724           23 :                   msg.escape (TREE_STRING_POINTER (DECL_INITIAL (decl)));
    6725           23 :                   error ("use of deleted function %qD: %s",
    6726              :                          decl, (const char *) msg);
    6727           23 :                 }
    6728              :               else
    6729         2358 :                 error ("use of deleted function %qD", decl);
    6730         2381 :               if (!maybe_explain_implicit_delete (decl))
    6731          661 :                 inform (DECL_SOURCE_LOCATION (decl), "declared here");
    6732         2381 :             }
    6733         2629 :           return false;
    6734              :         }
    6735              : 
    6736    291993498 :       if (!maybe_instantiate_noexcept (decl, complain))
    6737              :         return false;
    6738              :     }
    6739              : 
    6740   1323529788 :   if (VAR_OR_FUNCTION_DECL_P (decl) && DECL_LOCAL_DECL_P (decl))
    6741              :     {
    6742        70832 :       if (!DECL_LANG_SPECIFIC (decl))
    6743              :         /* An unresolved dependent local extern.  */
    6744              :         return true;
    6745              : 
    6746        70832 :       DECL_ODR_USED (decl) = 1;
    6747        70832 :       auto alias = DECL_LOCAL_DECL_ALIAS (decl);
    6748        70832 :       if (!alias || alias == error_mark_node)
    6749              :         return true;
    6750              : 
    6751              :       /* Process the underlying decl.  */
    6752        70540 :       decl = alias;
    6753        70540 :       TREE_USED (decl) = true;
    6754              :     }
    6755              : 
    6756   1323529496 :   cp_handle_deprecated_or_unavailable (decl, complain);
    6757              : 
    6758              :   /* We can only check DECL_ODR_USED on variables or functions with
    6759              :      DECL_LANG_SPECIFIC set, and these are also the only decls that we
    6760              :      might need special handling for.  */
    6761    761010322 :   if (!VAR_OR_FUNCTION_DECL_P (decl)
    6762   1615522876 :       || DECL_THUNK_P (decl))
    6763              :     return true;
    6764              : 
    6765              :   /* We only want to do this processing once.  We don't need to keep trying
    6766              :      to instantiate inline templates, because unit-at-a-time will make sure
    6767              :      we get them compiled before functions that want to inline them.  */
    6768    854504162 :   if (DECL_LANG_SPECIFIC (decl) && DECL_ODR_USED (decl))
    6769              :     return true;
    6770              : 
    6771    468085706 :   if (flag_concepts && TREE_CODE (decl) == FUNCTION_DECL
    6772    612867174 :       && !constraints_satisfied_p (decl))
    6773              :     {
    6774           15 :       if (complain & tf_error)
    6775              :         {
    6776            6 :           auto_diagnostic_group d;
    6777            6 :           error ("use of function %qD with unsatisfied constraints",
    6778              :                  decl);
    6779            6 :           location_t loc = DECL_SOURCE_LOCATION (decl);
    6780            6 :           inform (loc, "declared here");
    6781            6 :           diagnose_constraints (loc, decl, NULL_TREE);
    6782            6 :         }
    6783           15 :       return false;
    6784              :     }
    6785              : 
    6786              :   /* If DECL has a deduced return type, we need to instantiate it now to
    6787              :      find out its type.  For OpenMP user defined reductions, we need them
    6788              :      instantiated for reduction clauses which inline them by hand directly.
    6789              :      OpenMP declared mappers are used implicitly so must be instantiated
    6790              :      before they can be detected.  */
    6791    474005530 :   if (undeduced_auto_decl (decl)
    6792    446730631 :       || (VAR_P (decl)
    6793    307098439 :           && VAR_HAD_UNKNOWN_BOUND (decl))
    6794    446711212 :       || (TREE_CODE (decl) == FUNCTION_DECL
    6795    139632192 :           && DECL_OMP_DECLARE_REDUCTION_P (decl))
    6796    920716480 :       || (TREE_CODE (decl) == VAR_DECL
    6797    307079020 :           && DECL_LANG_SPECIFIC (decl)
    6798     72223534 :           && DECL_OMP_DECLARE_MAPPER_P (decl)))
    6799     27294689 :     maybe_instantiate_decl (decl);
    6800              : 
    6801    474005530 :   if (!decl_dependent_p (decl)
    6802              :       /* Don't require this yet for an instantiation of a function template
    6803              :          we're currently defining (c++/120555).  */
    6804    301008733 :       && !fn_template_being_defined (decl)
    6805    774893283 :       && !require_deduced_type (decl, complain))
    6806              :     return false;
    6807              : 
    6808    474003818 :   if (DECL_LANG_SPECIFIC (decl) == NULL)
    6809              :     return true;
    6810              : 
    6811    213181382 :   if (processing_template_decl || in_template_context)
    6812              :     return true;
    6813              : 
    6814              :   /* Check this too in case we're within instantiate_non_dependent_expr.  */
    6815    158938552 :   if (DECL_TEMPLATE_INFO (decl)
    6816    158938552 :       && uses_template_parms (DECL_TI_ARGS (decl)))
    6817              :     return true;
    6818              : 
    6819    158938552 :   if (builtin_pack_fn_p (decl))
    6820              :     {
    6821           12 :       error ("use of built-in parameter pack %qD outside of a template",
    6822            6 :              DECL_NAME (decl));
    6823            6 :       return false;
    6824              :     }
    6825              : 
    6826              :   /* If we don't need a value, then we don't need to synthesize DECL.  */
    6827    158938546 :   if (cp_unevaluated_operand || in_discarded_stmt)
    6828              :     return true;
    6829              : 
    6830     47548605 :   DECL_ODR_USED (decl) = 1;
    6831     47548605 :   if (DECL_CLONED_FUNCTION_P (decl))
    6832      7184305 :     DECL_ODR_USED (DECL_CLONED_FUNCTION (decl)) = 1;
    6833              : 
    6834              :   /* DR 757: A type without linkage shall not be used as the type of a
    6835              :      variable or function with linkage, unless
    6836              :    o the variable or function has extern "C" linkage (7.5 [dcl.link]), or
    6837              :    o the variable or function is not used (3.2 [basic.def.odr]) or is
    6838              :    defined in the same translation unit.  */
    6839     47548605 :   if (cxx_dialect > cxx98
    6840     47328838 :       && decl_linkage (decl) != lk_none
    6841     44648502 :       && !DECL_EXTERN_C_P (decl)
    6842     40130203 :       && !DECL_ARTIFICIAL (decl)
    6843     38390137 :       && !decl_defined_p (decl)
    6844     76240257 :       && no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false))
    6845       480078 :     vec_safe_push (no_linkage_decls, decl);
    6846              : 
    6847     47548605 :   if (TREE_CODE (decl) == FUNCTION_DECL
    6848     37183418 :       && DECL_DECLARED_INLINE_P (decl)
    6849     28533469 :       && !DECL_INITIAL (decl)
    6850     19119847 :       && !DECL_ARTIFICIAL (decl)
    6851     66096694 :       && !DECL_PURE_VIRTUAL_P (decl))
    6852              :     /* Remember it, so we can check it was defined.  */
    6853     18546212 :     note_vague_linkage_fn (decl);
    6854              : 
    6855              :   /* Is it a synthesized method that needs to be synthesized?  */
    6856     47548605 :   if (TREE_CODE (decl) == FUNCTION_DECL
    6857     37183418 :       && DECL_DEFAULTED_FN (decl)
    6858              :       /* A function defaulted outside the class is synthesized either by
    6859              :          cp_finish_decl or instantiate_decl.  */
    6860      1357451 :       && !DECL_DEFAULTED_OUTSIDE_CLASS_P (decl)
    6861     48905823 :       && ! DECL_INITIAL (decl))
    6862              :     {
    6863              :       /* Remember the current location for a function we will end up
    6864              :          synthesizing.  Then we can inform the user where it was
    6865              :          required in the case of error.  */
    6866      1160852 :       if (decl_remember_implicit_trigger_p (decl))
    6867       518584 :         DECL_SOURCE_LOCATION (decl) = input_location;
    6868              : 
    6869              :       /* Synthesizing an implicitly defined member function will result in
    6870              :          garbage collection.  We must treat this situation as if we were
    6871              :          within the body of a function so as to avoid collecting live data
    6872              :          on the stack (such as overload resolution candidates).
    6873              : 
    6874              :          We could just let c_parse_final_cleanups handle synthesizing
    6875              :          this function by adding it to deferred_fns, but doing
    6876              :          it at the use site produces better error messages.  */
    6877      1160852 :       ++function_depth;
    6878      1160852 :       synthesize_method (decl);
    6879      1160852 :       --function_depth;
    6880              :       /* If this is a synthesized method we don't need to
    6881              :          do the instantiation test below.  */
    6882              :     }
    6883     36022566 :   else if (VAR_OR_FUNCTION_DECL_P (decl)
    6884     46387753 :            && DECL_TEMPLATE_INFO (decl)
    6885     74389274 :            && (!DECL_EXPLICIT_INSTANTIATION (decl)
    6886      1168756 :                || always_instantiate_p (decl)))
    6887              :     /* If this is a function or variable that is an instance of some
    6888              :        template, we now know that we will need to actually do the
    6889              :        instantiation. We check that DECL is not an explicit
    6890              :        instantiation because that is not checked in instantiate_decl.
    6891              : 
    6892              :        We put off instantiating functions in order to improve compile
    6893              :        times.  Maintaining a stack of active functions is expensive,
    6894              :        and the inliner knows to instantiate any functions it might
    6895              :        need.  Therefore, we always try to defer instantiation.  */
    6896              :     {
    6897     27947798 :       ++function_depth;
    6898     27947798 :       instantiate_decl (decl, /*defer_ok=*/true,
    6899              :                         /*expl_inst_class_mem_p=*/false);
    6900     27939698 :       --function_depth;
    6901              :     }
    6902              : 
    6903              :   return true;
    6904              : }
    6905              : 
    6906              : tree
    6907            9 : vtv_start_verification_constructor_init_function (void)
    6908              : {
    6909            9 :   return start_objects (/*initp=*/true, MAX_RESERVED_INIT_PRIORITY - 1, true);
    6910              : }
    6911              : 
    6912              : tree
    6913            6 : vtv_finish_verification_constructor_init_function (tree body)
    6914              : {
    6915            6 :   return finish_objects (/*initp=*/true, MAX_RESERVED_INIT_PRIORITY - 1, body);
    6916              : }
    6917              : 
    6918              : #include "gt-cp-decl2.h"
        

Generated by: LCOV version 2.4-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.