LCOV - code coverage report
Current view: top level - gcc/cp - cp-objcp-common.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 97.3 % 292 284
Test Date: 2024-12-21 13:15:12 Functions: 95.8 % 24 23
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Some code common to C++ and ObjC++ front ends.
       2                 :             :    Copyright (C) 2004-2024 Free Software Foundation, Inc.
       3                 :             :    Contributed by Ziemowit Laski  <zlaski@apple.com>
       4                 :             : 
       5                 :             : This file is part of GCC.
       6                 :             : 
       7                 :             : GCC is free software; you can redistribute it and/or modify it under
       8                 :             : the terms of the GNU General Public License as published by the Free
       9                 :             : Software Foundation; either version 3, or (at your option) any later
      10                 :             : version.
      11                 :             : 
      12                 :             : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13                 :             : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14                 :             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15                 :             : 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                 :             : #include "config.h"
      22                 :             : #include "system.h"
      23                 :             : #include "coretypes.h"
      24                 :             : #include "cp-tree.h"
      25                 :             : #include "cp-objcp-common.h"
      26                 :             : #include "c-family/c-common.h"
      27                 :             : #include "dwarf2.h"
      28                 :             : #include "stringpool.h"
      29                 :             : #include "contracts.h"
      30                 :             : 
      31                 :             : /* Class to determine whether a given C++ language feature is available.
      32                 :             :    Used to implement __has_{feature,extension}.  */
      33                 :             : 
      34                 :             : struct cp_feature_selector
      35                 :             : {
      36                 :             :   enum
      37                 :             :   {
      38                 :             :     DIALECT,
      39                 :             :     FLAG
      40                 :             :   } kind;
      41                 :             : 
      42                 :             :   enum class result
      43                 :             :   {
      44                 :             :     NONE,
      45                 :             :     EXT,
      46                 :             :     FEAT
      47                 :             :   };
      48                 :             : 
      49                 :             :   union
      50                 :             :   {
      51                 :             :     const int *enable_flag;
      52                 :             :     struct {
      53                 :             :       enum cxx_dialect feat;
      54                 :             :       enum cxx_dialect ext;
      55                 :             :     } dialect;
      56                 :             :   };
      57                 :             : 
      58                 :             :   constexpr cp_feature_selector (const int *flag)
      59                 :             :     : kind (FLAG), enable_flag (flag) {}
      60                 :             :   constexpr cp_feature_selector (enum cxx_dialect feat,
      61                 :             :                                  enum cxx_dialect ext)
      62                 :             :     : kind (DIALECT), dialect{feat, ext} {}
      63                 :             :   constexpr cp_feature_selector (enum cxx_dialect feat)
      64                 :             :     : cp_feature_selector (feat, feat) {}
      65                 :             : 
      66                 :             :   inline result has_feature () const;
      67                 :             : };
      68                 :             : 
      69                 :             : /* Check whether this language feature is available as a feature,
      70                 :             :    extension, or not at all.  */
      71                 :             : 
      72                 :             : cp_feature_selector::result
      73                 :      985824 : cp_feature_selector::has_feature () const
      74                 :             : {
      75                 :      985824 :   switch (kind)
      76                 :             :     {
      77                 :      924210 :     case DIALECT:
      78                 :      924210 :       if (cxx_dialect >= dialect.feat)
      79                 :             :         return result::FEAT;
      80                 :       57006 :       else if (cxx_dialect >= dialect.ext)
      81                 :             :         return result::EXT;
      82                 :             :       else
      83                 :       49344 :         return result::NONE;
      84                 :       61614 :     case FLAG:
      85                 :       61614 :       return *enable_flag ? result::FEAT : result::NONE;
      86                 :             :     }
      87                 :             : 
      88                 :           0 :   gcc_unreachable ();
      89                 :             : }
      90                 :             : 
      91                 :             : /* Information about a C++ language feature which can be queried
      92                 :             :    through __has_{feature,extension}.  IDENT is the name of the feature,
      93                 :             :    and SELECTOR encodes how to compute whether the feature is available.  */
      94                 :             : 
      95                 :             : struct cp_feature_info
      96                 :             : {
      97                 :             :   const char *ident;
      98                 :             :   cp_feature_selector selector;
      99                 :             : };
     100                 :             : 
     101                 :             : /* Table of features for __has_{feature,extension}.  */
     102                 :             : 
     103                 :             : static constexpr cp_feature_info cp_feature_table[] =
     104                 :             : {
     105                 :             :   { "cxx_exceptions", &flag_exceptions },
     106                 :             :   { "cxx_rtti", &flag_rtti },
     107                 :             :   { "cxx_access_control_sfinae", { cxx11, cxx98 } },
     108                 :             :   { "cxx_alias_templates", cxx11 },
     109                 :             :   { "cxx_alignas", cxx11 },
     110                 :             :   { "cxx_alignof", cxx11 },
     111                 :             :   { "cxx_attributes", cxx11 },
     112                 :             :   { "cxx_constexpr", cxx11 },
     113                 :             :   { "cxx_decltype", cxx11 },
     114                 :             :   { "cxx_decltype_incomplete_return_types", cxx11 },
     115                 :             :   { "cxx_default_function_template_args", cxx11 },
     116                 :             :   { "cxx_defaulted_functions", cxx11 },
     117                 :             :   { "cxx_delegating_constructors", cxx11 },
     118                 :             :   { "cxx_deleted_functions", cxx11 },
     119                 :             :   { "cxx_explicit_conversions", cxx11 },
     120                 :             :   { "cxx_generalized_initializers", cxx11 },
     121                 :             :   { "cxx_implicit_moves", cxx11 },
     122                 :             :   { "cxx_inheriting_constructors", cxx11 },
     123                 :             :   { "cxx_inline_namespaces", { cxx11, cxx98 } },
     124                 :             :   { "cxx_lambdas", cxx11 },
     125                 :             :   { "cxx_local_type_template_args", cxx11 },
     126                 :             :   { "cxx_noexcept", cxx11 },
     127                 :             :   { "cxx_nonstatic_member_init", cxx11 },
     128                 :             :   { "cxx_nullptr", cxx11 },
     129                 :             :   { "cxx_override_control", cxx11 },
     130                 :             :   { "cxx_reference_qualified_functions", cxx11 },
     131                 :             :   { "cxx_range_for", cxx11 },
     132                 :             :   { "cxx_raw_string_literals", cxx11 },
     133                 :             :   { "cxx_rvalue_references", cxx11 },
     134                 :             :   { "cxx_static_assert", cxx11 },
     135                 :             :   { "cxx_thread_local", cxx11 },
     136                 :             :   { "cxx_auto_type", cxx11 },
     137                 :             :   { "cxx_strong_enums", cxx11 },
     138                 :             :   { "cxx_trailing_return", cxx11 },
     139                 :             :   { "cxx_unicode_literals", cxx11 },
     140                 :             :   { "cxx_unrestricted_unions", cxx11 },
     141                 :             :   { "cxx_user_literals", cxx11 },
     142                 :             :   { "cxx_variadic_templates", { cxx11, cxx98 } },
     143                 :             :   { "cxx_binary_literals", { cxx14, cxx98 } },
     144                 :             :   { "cxx_contextual_conversions", { cxx14, cxx98 } },
     145                 :             :   { "cxx_decltype_auto", cxx14 },
     146                 :             :   { "cxx_aggregate_nsdmi", cxx14 },
     147                 :             :   { "cxx_init_captures", { cxx14, cxx11 } },
     148                 :             :   { "cxx_generic_lambdas", cxx14 },
     149                 :             :   { "cxx_relaxed_constexpr", cxx14 },
     150                 :             :   { "cxx_return_type_deduction", cxx14 },
     151                 :             :   { "cxx_variable_templates", cxx14 },
     152                 :             :   { "modules", &flag_modules },
     153                 :             : };
     154                 :             : 
     155                 :             : /* Register C++ language features for __has_{feature,extension}.  */
     156                 :             : 
     157                 :             : void
     158                 :       20538 : cp_register_features ()
     159                 :             : {
     160                 :       20538 :   using result = cp_feature_selector::result;
     161                 :             : 
     162                 :     1006362 :   for (unsigned i = 0; i < ARRAY_SIZE (cp_feature_table); i++)
     163                 :             :     {
     164                 :      985824 :       const cp_feature_info *info = cp_feature_table + i;
     165                 :      985824 :       const auto res = info->selector.has_feature ();
     166                 :      985824 :       if (res == result::NONE)
     167                 :       71194 :         continue;
     168                 :             : 
     169                 :      914630 :       c_common_register_feature (info->ident, res == result::FEAT);
     170                 :             :     }
     171                 :       20538 : }
     172                 :             : 
     173                 :             : /* Special routine to get the alias set for C++.  */
     174                 :             : 
     175                 :             : alias_set_type
     176                 :   337054654 : cxx_get_alias_set (tree t)
     177                 :             : {
     178                 :   337054654 :   if (IS_FAKE_BASE_TYPE (t))
     179                 :             :     /* The base variant of a type must be in the same alias set as the
     180                 :             :        complete type.  */
     181                 :      779850 :     return get_alias_set (TYPE_CONTEXT (t));
     182                 :             : 
     183                 :             :   /* Punt on PMFs until we canonicalize functions properly.  */
     184                 :      586878 :   if (TYPE_PTRMEMFUNC_P (t)
     185                 :   336673775 :       || (INDIRECT_TYPE_P (t)
     186                 :      383175 :           && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))))
     187                 :             :     return 0;
     188                 :             : 
     189                 :   336069185 :   return c_common_get_alias_set (t);
     190                 :             : }
     191                 :             : 
     192                 :             : /* Called from check_global_declaration.  */
     193                 :             : 
     194                 :             : bool
     195                 :        2958 : cxx_warn_unused_global_decl (const_tree decl)
     196                 :             : {
     197                 :        2958 :   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl))
     198                 :             :     return false;
     199                 :          93 :   if (DECL_IN_SYSTEM_HEADER (decl))
     200                 :             :     return false;
     201                 :             : 
     202                 :             :   return true;
     203                 :             : }
     204                 :             : 
     205                 :             : /* Langhook for tree_size: determine size of our 'x' and 'c' nodes.  */
     206                 :             : size_t
     207                 :  2031898586 : cp_tree_size (enum tree_code code)
     208                 :             : {
     209                 :  2031898586 :   gcc_checking_assert (code >= NUM_TREE_CODES);
     210                 :  2031898586 :   switch (code)
     211                 :             :     {
     212                 :             :     case PTRMEM_CST:            return sizeof (ptrmem_cst);
     213                 :             :     case BASELINK:              return sizeof (tree_baselink);
     214                 :             :     case TEMPLATE_PARM_INDEX:   return sizeof (template_parm_index);
     215                 :             :     case DEFERRED_PARSE:        return sizeof (tree_deferred_parse);
     216                 :             :     case DEFERRED_NOEXCEPT:     return sizeof (tree_deferred_noexcept);
     217                 :             :     case OVERLOAD:              return sizeof (tree_overload);
     218                 :             :     case STATIC_ASSERT:         return sizeof (tree_static_assert);
     219                 :             : #if 0
     220                 :             :       /* This would match cp_common_init_ts, but breaks GC because
     221                 :             :          tree_node_structure_for_code returns TS_TYPE_NON_COMMON for all
     222                 :             :          types.  */
     223                 :             :     case UNBOUND_CLASS_TEMPLATE:
     224                 :             :     case TYPE_ARGUMENT_PACK:    return sizeof (tree_type_common);
     225                 :             : #endif
     226                 :             :     case ARGUMENT_PACK_SELECT:  return sizeof (tree_argument_pack_select);
     227                 :             :     case TRAIT_EXPR:            return sizeof (tree_trait_expr);
     228                 :      758072 :     case LAMBDA_EXPR:           return sizeof (tree_lambda_expr);
     229                 :             :     case TEMPLATE_INFO:         return sizeof (tree_template_info);
     230                 :             :     case CONSTRAINT_INFO:       return sizeof (tree_constraint_info);
     231                 :             :     case USERDEF_LITERAL:       return sizeof (tree_userdef_literal);
     232                 :   188816576 :     case TEMPLATE_DECL:         return sizeof (tree_template_decl);
     233                 :             :     case ASSERTION_STMT:        return sizeof (tree_exp);
     234                 :             :     case PRECONDITION_STMT:     return sizeof (tree_exp);
     235                 :             :     case POSTCONDITION_STMT:    return sizeof (tree_exp);
     236                 :             :     case TU_LOCAL_ENTITY:       return sizeof (tree_tu_local_entity);
     237                 :   611536713 :     default:
     238                 :   611536713 :       switch (TREE_CODE_CLASS (code))
     239                 :             :         {
     240                 :             :         case tcc_declaration:   return sizeof (tree_decl_non_common);
     241                 :   584659540 :         case tcc_type:          return sizeof (tree_type_non_common);
     242                 :           0 :         default: gcc_unreachable ();
     243                 :             :         }
     244                 :             :     }
     245                 :             :   /* NOTREACHED */
     246                 :             : }
     247                 :             : 
     248                 :             : /* Returns true if T is a variably modified type, in the sense of C99.
     249                 :             :    FN is as passed to variably_modified_p.
     250                 :             :    This routine needs only check cases that cannot be handled by the
     251                 :             :    language-independent logic in tree.cc.  */
     252                 :             : 
     253                 :             : bool
     254                 :  1391313005 : cp_var_mod_type_p (tree type, tree fn)
     255                 :             : {
     256                 :             :   /* If TYPE is a pointer-to-member, it is variably modified if either
     257                 :             :      the class or the member are variably modified.  */
     258                 :  1391313005 :   if (TYPE_PTRMEM_P (type))
     259                 :     1856491 :     return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type), fn)
     260                 :     1856491 :             || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type),
     261                 :             :                                          fn));
     262                 :             : 
     263                 :             :   /* All other types are not variably modified.  */
     264                 :             :   return false;
     265                 :             : }
     266                 :             : 
     267                 :             : /* This compares two types for equivalence ("compatible" in C-based languages).
     268                 :             :    This routine should only return 1 if it is sure.  It should not be used
     269                 :             :    in contexts where erroneously returning 0 causes problems.  */
     270                 :             : 
     271                 :             : int
     272                 :     1223729 : cxx_types_compatible_p (tree x, tree y)
     273                 :             : {
     274                 :     1223729 :   return same_type_ignoring_top_level_qualifiers_p (x, y);
     275                 :             : }
     276                 :             : 
     277                 :             : static GTY((cache)) type_tree_cache_map *debug_type_map;
     278                 :             : 
     279                 :             : /* Return a type to use in the debug info instead of TYPE, or NULL_TREE to
     280                 :             :    keep TYPE.  */
     281                 :             : 
     282                 :             : tree
     283                 :   961135829 : cp_get_debug_type (const_tree type)
     284                 :             : {
     285                 :   961135829 :   tree dtype = NULL_TREE;
     286                 :             : 
     287                 :   961135829 :   if (TYPE_PTRMEMFUNC_P (type) && !typedef_variant_p (type))
     288                 :      284999 :     dtype = build_offset_type (TYPE_PTRMEMFUNC_OBJECT_TYPE (type),
     289                 :      284999 :                                TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (type)));
     290                 :             : 
     291                 :             :   /* We cannot simply return the debug type here because the function uses
     292                 :             :      the type canonicalization hashtable, which is GC-ed, so its behavior
     293                 :             :      depends on the actual collection points.  Since we are building these
     294                 :             :      types on the fly for the debug info only, they would not be attached
     295                 :             :      to any GC root and always be swept, so we would make the contents of
     296                 :             :      the debug info depend on the collection points.  */
     297                 :   961135829 :   if (dtype)
     298                 :             :     {
     299                 :      284999 :       tree ktype = CONST_CAST_TREE (type);
     300                 :      560466 :       if (tree *slot = hash_map_safe_get (debug_type_map, ktype))
     301                 :      254178 :         return *slot;
     302                 :       30821 :       hash_map_safe_put<hm_ggc> (debug_type_map, ktype, dtype);
     303                 :             :     }
     304                 :             : 
     305                 :             :   return dtype;
     306                 :             : }
     307                 :             : 
     308                 :             : /* Return -1 if dwarf ATTR shouldn't be added for DECL, or the attribute
     309                 :             :    value otherwise.  */
     310                 :             : int
     311                 :   444088266 : cp_decl_dwarf_attribute (const_tree decl, int attr)
     312                 :             : {
     313                 :   444088266 :   if (decl == NULL_TREE)
     314                 :             :     return -1;
     315                 :             : 
     316                 :   444088266 :   switch (attr)
     317                 :             :     {
     318                 :    74209559 :     case DW_AT_explicit:
     319                 :    74209559 :       if (TREE_CODE (decl) == FUNCTION_DECL
     320                 :    74209559 :           && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
     321                 :   148419029 :           && DECL_NONCONVERTING_P (decl))
     322                 :     1959646 :         return 1;
     323                 :             :       break;
     324                 :             : 
     325                 :    74209541 :     case DW_AT_deleted:
     326                 :    74209541 :       if (TREE_CODE (decl) == FUNCTION_DECL
     327                 :    74209541 :           && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
     328                 :   148418993 :           && DECL_DELETED_FN (decl))
     329                 :     2222216 :         return 1;
     330                 :             :       break;
     331                 :             : 
     332                 :    75379879 :     case DW_AT_defaulted:
     333                 :    75379879 :       if (TREE_CODE (decl) == FUNCTION_DECL
     334                 :    75379879 :           && DECL_LANG_SPECIFIC (STRIP_TEMPLATE (decl))
     335                 :   150759669 :           && DECL_DEFAULTED_FN (decl))
     336                 :             :         {
     337                 :     5387640 :           if (DECL_DEFAULTED_IN_CLASS_P (decl))
     338                 :             :             return DW_DEFAULTED_in_class;
     339                 :             : 
     340                 :      850674 :           if (DECL_DEFAULTED_OUTSIDE_CLASS_P (decl))
     341                 :         598 :             return DW_DEFAULTED_out_of_class;
     342                 :             :         }
     343                 :             :       break;
     344                 :             : 
     345                 :    28363513 :     case DW_AT_const_expr:
     346                 :    28363513 :       if (VAR_OR_FUNCTION_DECL_P (decl) && DECL_DECLARED_CONSTEXPR_P (decl))
     347                 :    23784782 :         return 1;
     348                 :             :       break;
     349                 :             : 
     350                 :    74209541 :     case DW_AT_reference:
     351                 :    74209541 :       if (TREE_CODE (decl) == FUNCTION_DECL
     352                 :    74209541 :           && DECL_IOBJ_MEMBER_FUNCTION_P (decl)
     353                 :    63386510 :           && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl))
     354                 :    74261456 :           && !FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl)))
     355                 :       22821 :         return 1;
     356                 :             :       break;
     357                 :             : 
     358                 :    74209541 :     case DW_AT_rvalue_reference:
     359                 :    74209541 :       if (TREE_CODE (decl) == FUNCTION_DECL
     360                 :    74209541 :           && DECL_IOBJ_MEMBER_FUNCTION_P (decl)
     361                 :    63386510 :           && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl))
     362                 :    74261456 :           && FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl)))
     363                 :       29094 :         return 1;
     364                 :             :       break;
     365                 :             : 
     366                 :    43039316 :     case DW_AT_inline:
     367                 :    43039316 :       if (VAR_P (decl) && DECL_INLINE_VAR_P (decl))
     368                 :             :         {
     369                 :    36943581 :           if (DECL_VAR_DECLARED_INLINE_P (decl))
     370                 :             :             return DW_INL_declared_inlined;
     371                 :             :           else
     372                 :    28207206 :             return DW_INL_inlined;
     373                 :             :         }
     374                 :             :       break;
     375                 :             : 
     376                 :      467376 :     case DW_AT_export_symbols:
     377                 :      467376 :       if (TREE_CODE (decl) == NAMESPACE_DECL
     378                 :      467376 :           && (DECL_NAMESPACE_INLINE_P (decl)
     379                 :      266078 :               || (DECL_NAME (decl) == NULL_TREE && dwarf_version >= 5)))
     380                 :      202367 :         return 1;
     381                 :             :       break;
     382                 :             : 
     383                 :             :     default:
     384                 :             :       break;
     385                 :             :     }
     386                 :             : 
     387                 :             :   return -1;
     388                 :             : }
     389                 :             : 
     390                 :             : /* Return -1 if dwarf ATTR shouldn't be added for TYPE, or the attribute
     391                 :             :    value otherwise.  */
     392                 :             : int
     393                 :      700745 : cp_type_dwarf_attribute (const_tree type, int attr)
     394                 :             : {
     395                 :      700745 :   if (type == NULL_TREE)
     396                 :             :     return -1;
     397                 :             : 
     398                 :      700745 :   switch (attr)
     399                 :             :     {
     400                 :      291417 :     case DW_AT_reference:
     401                 :      291417 :       if (FUNC_OR_METHOD_TYPE_P (type)
     402                 :      291417 :           && FUNCTION_REF_QUALIFIED (type)
     403                 :      291525 :           && !FUNCTION_RVALUE_QUALIFIED (type))
     404                 :          77 :         return 1;
     405                 :             :       break;
     406                 :             : 
     407                 :      291417 :     case DW_AT_rvalue_reference:
     408                 :      291417 :       if (FUNC_OR_METHOD_TYPE_P (type)
     409                 :      291417 :           && FUNCTION_REF_QUALIFIED (type)
     410                 :      291525 :           && FUNCTION_RVALUE_QUALIFIED (type))
     411                 :          31 :         return 1;
     412                 :             :       break;
     413                 :             : 
     414                 :      117911 :     case DW_AT_export_symbols:
     415                 :      117911 :       if (ANON_AGGR_TYPE_P (type))
     416                 :      117911 :         return 1;
     417                 :             :       break;
     418                 :             : 
     419                 :             :     default:
     420                 :             :       break;
     421                 :             :     }
     422                 :             : 
     423                 :             :   return -1;
     424                 :             : }
     425                 :             : 
     426                 :             : /* Return the unit size of TYPE without reusable tail padding.  */
     427                 :             : 
     428                 :             : tree
     429                 :       22922 : cp_unit_size_without_reusable_padding (tree type)
     430                 :             : {
     431                 :       22922 :   if (CLASS_TYPE_P (type))
     432                 :       22922 :     return CLASSTYPE_SIZE_UNIT (type);
     433                 :           0 :   return TYPE_SIZE_UNIT (type);
     434                 :             : }
     435                 :             : 
     436                 :             : /* Returns type corresponding to FIELD's type when FIELD is a C++ base class
     437                 :             :    i.e., type without virtual base classes or tail padding.  Returns
     438                 :             :    NULL_TREE otherwise.  */
     439                 :             : 
     440                 :             : tree
     441                 :        2474 : cp_classtype_as_base (const_tree field)
     442                 :             : {
     443                 :        2474 :   if (DECL_FIELD_IS_BASE (field))
     444                 :             :     {
     445                 :         195 :       tree type = TREE_TYPE (field);
     446                 :         195 :       if (TYPE_LANG_SPECIFIC (type))
     447                 :         188 :         return CLASSTYPE_AS_BASE (type);
     448                 :             :     }
     449                 :             :   return NULL_TREE;
     450                 :             : }
     451                 :             : 
     452                 :             : /* Stubs to keep c-opts.cc happy.  */
     453                 :             : void
     454                 :       91454 : push_file_scope (void)
     455                 :             : {
     456                 :       91454 : }
     457                 :             : 
     458                 :             : void
     459                 :       91333 : pop_file_scope (void)
     460                 :             : {
     461                 :       91333 : }
     462                 :             : 
     463                 :             : /* c-pragma.cc needs to query whether a decl has extern "C" linkage.  */
     464                 :             : bool
     465                 :    45553627 : has_c_linkage (const_tree decl)
     466                 :             : {
     467                 :    45553627 :   return DECL_EXTERN_C_P (decl);
     468                 :             : }
     469                 :             : 
     470                 :             : /* Return true if stmt can fall through.  Used by block_may_fallthru
     471                 :             :    default case.  */
     472                 :             : 
     473                 :             : bool
     474                 :     3589044 : cxx_block_may_fallthru (const_tree stmt)
     475                 :             : {
     476                 :     3589044 :   switch (TREE_CODE (stmt))
     477                 :             :     {
     478                 :     1644415 :     case EXPR_STMT:
     479                 :     1644415 :       return block_may_fallthru (EXPR_STMT_EXPR (stmt));
     480                 :             : 
     481                 :             :     case THROW_EXPR:
     482                 :             :       return false;
     483                 :             : 
     484                 :      453146 :     case IF_STMT:
     485                 :      453146 :       if (IF_STMT_CONSTEXPR_P (stmt))
     486                 :             :         {
     487                 :        3609 :           if (integer_nonzerop (IF_COND (stmt)))
     488                 :         113 :             return block_may_fallthru (THEN_CLAUSE (stmt));
     489                 :        3496 :           if (integer_zerop (IF_COND (stmt)))
     490                 :         276 :             return block_may_fallthru (ELSE_CLAUSE (stmt));
     491                 :             :         }
     492                 :      452757 :       if (block_may_fallthru (THEN_CLAUSE (stmt)))
     493                 :             :         return true;
     494                 :        1046 :       return block_may_fallthru (ELSE_CLAUSE (stmt));
     495                 :             : 
     496                 :          11 :     case CLEANUP_STMT:
     497                 :             :       /* Just handle the try/finally cases.  */
     498                 :          11 :       if (!CLEANUP_EH_ONLY (stmt))
     499                 :             :         {
     500                 :          11 :           return (block_may_fallthru (CLEANUP_BODY (stmt))
     501                 :          19 :                   && block_may_fallthru (CLEANUP_EXPR (stmt)));
     502                 :             :         }
     503                 :             :       return true;
     504                 :             : 
     505                 :     1491452 :     default:
     506                 :     1491452 :       return c_block_may_fallthru (stmt);
     507                 :             :     }
     508                 :             : }
     509                 :             : 
     510                 :             : /* Return the list of decls in the global namespace.  */
     511                 :             : 
     512                 :             : tree
     513                 :           0 : cp_get_global_decls ()
     514                 :             : {
     515                 :           0 :   return NAMESPACE_LEVEL (global_namespace)->names;
     516                 :             : }
     517                 :             : 
     518                 :             : /* Push DECL into the current (namespace) scope.  */
     519                 :             : 
     520                 :             : tree
     521                 :     1850908 : cp_pushdecl (tree decl)
     522                 :             : {
     523                 :     1850908 :   DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace);
     524                 :     1850908 :   return pushdecl (decl);
     525                 :             : }
     526                 :             : 
     527                 :             : /* Get the global value binding of NAME.  Called directly from
     528                 :             :    c-common.cc, not via a hook. */
     529                 :             : 
     530                 :             : tree
     531                 :     3244682 : identifier_global_value (tree name)
     532                 :             : {
     533                 :     3244682 :   return get_global_binding (name);
     534                 :             : }
     535                 :             : 
     536                 :             : /* Similarly, but return struct/class/union NAME instead.  */
     537                 :             : 
     538                 :             : tree
     539                 :          36 : identifier_global_tag (tree name)
     540                 :             : {
     541                 :          36 :   tree ret = lookup_qualified_name (global_namespace, name, LOOK_want::TYPE,
     542                 :             :                                     /*complain*/false);
     543                 :          36 :   if (ret == error_mark_node)
     544                 :           3 :     return NULL_TREE;
     545                 :             :   return ret;
     546                 :             : }
     547                 :             : 
     548                 :             : /* Returns non-zero (result of __has_builtin) if NAME refers to a built-in
     549                 :             :    function or function-like operator.  */
     550                 :             : 
     551                 :             : int
     552                 :     5594575 : names_builtin_p (const char *name)
     553                 :             : {
     554                 :     5594575 :   tree id = get_identifier (name);
     555                 :     5594575 :   if (tree binding = get_global_binding (id))
     556                 :             :     {
     557                 :     1655815 :       if (TREE_CODE (binding) == FUNCTION_DECL
     558                 :     1655815 :           && DECL_IS_UNDECLARED_BUILTIN (binding))
     559                 :             :         return 1;
     560                 :             : 
     561                 :             :       /* Handle the case when an overload for a  built-in name exists.  */
     562                 :           9 :       if (TREE_CODE (binding) != OVERLOAD)
     563                 :             :         return 0;
     564                 :             : 
     565                 :           9 :       for (ovl_iterator it (binding); it; ++it)
     566                 :             :         {
     567                 :           9 :           tree decl = *it;
     568                 :           9 :           if (DECL_IS_UNDECLARED_BUILTIN (decl))
     569                 :           9 :             return 1;
     570                 :             :         }
     571                 :             :     }
     572                 :             : 
     573                 :             :   /* Check for built-in traits.  */
     574                 :     3938760 :   if (IDENTIFIER_TRAIT_P (id))
     575                 :             :     return 1;
     576                 :             : 
     577                 :             :   /* Also detect common reserved C++ words that aren't strictly built-in
     578                 :             :      functions.  */
     579                 :      575817 :   switch (C_RID_CODE (id))
     580                 :             :     {
     581                 :             :     case RID_ADDRESSOF:
     582                 :             :     case RID_BUILTIN_CONVERTVECTOR:
     583                 :             :     case RID_BUILTIN_HAS_ATTRIBUTE:
     584                 :             :     case RID_BUILTIN_SHUFFLE:
     585                 :             :     case RID_BUILTIN_SHUFFLEVECTOR:
     586                 :             :     case RID_BUILTIN_LAUNDER:
     587                 :             :     case RID_BUILTIN_ASSOC_BARRIER:
     588                 :             :     case RID_BUILTIN_BIT_CAST:
     589                 :             :     case RID_OFFSETOF:
     590                 :             :       return 1;
     591                 :             :     case RID_BUILTIN_OPERATOR_NEW:
     592                 :             :     case RID_BUILTIN_OPERATOR_DELETE:
     593                 :             :       return 201802L;
     594                 :             :     default:
     595                 :             :       break;
     596                 :             :     }
     597                 :             : 
     598                 :             :   return 0;
     599                 :             : }
     600                 :             : 
     601                 :             : /* Register c++-specific dumps.  */
     602                 :             : 
     603                 :             : void
     604                 :       92786 : cp_register_dumps (gcc::dump_manager *dumps)
     605                 :             : {
     606                 :      185572 :   class_dump_id = dumps->dump_register
     607                 :       92786 :     (".class", "lang-class", "lang-class", DK_lang, OPTGROUP_NONE, false);
     608                 :             : 
     609                 :      185572 :   module_dump_id = dumps->dump_register
     610                 :       92786 :     (".module", "lang-module", "lang-module", DK_lang, OPTGROUP_NONE, false);
     611                 :             : 
     612                 :      185572 :   raw_dump_id = dumps->dump_register
     613                 :       92786 :     (".raw", "lang-raw", "lang-raw", DK_lang, OPTGROUP_NONE, false);
     614                 :      185572 :   coro_dump_id = dumps->dump_register
     615                 :       92786 :     (".coro", "lang-coro", "lang-coro", DK_lang, OPTGROUP_NONE, false);
     616                 :       92786 : }
     617                 :             : 
     618                 :             : void
     619                 :       92786 : cp_common_init_ts (void)
     620                 :             : {
     621                 :             :   /* With type.  */
     622                 :       92786 :   MARK_TS_TYPED (PTRMEM_CST);
     623                 :       92786 :   MARK_TS_TYPED (LAMBDA_EXPR);
     624                 :       92786 :   MARK_TS_TYPED (TYPE_ARGUMENT_PACK);
     625                 :       92786 :   MARK_TS_TYPED (TRAIT_EXPR);
     626                 :             : 
     627                 :             :   /* Random new trees.  */
     628                 :       92786 :   MARK_TS_COMMON (BASELINK);
     629                 :       92786 :   MARK_TS_COMMON (OVERLOAD);
     630                 :       92786 :   MARK_TS_COMMON (TEMPLATE_PARM_INDEX);
     631                 :             : 
     632                 :             :   /* New decls.  */
     633                 :       92786 :   MARK_TS_DECL_COMMON (TEMPLATE_DECL);
     634                 :             : 
     635                 :       92786 :   MARK_TS_DECL_NON_COMMON (USING_DECL);
     636                 :             : 
     637                 :             :   /* New Types.  */
     638                 :       92786 :   MARK_TS_TYPE_COMMON (UNBOUND_CLASS_TEMPLATE);
     639                 :       92786 :   MARK_TS_TYPE_COMMON (TYPE_ARGUMENT_PACK);
     640                 :       92786 :   MARK_TS_TYPE_COMMON (DEPENDENT_OPERATOR_TYPE);
     641                 :             : 
     642                 :       92786 :   MARK_TS_TYPE_NON_COMMON (DECLTYPE_TYPE);
     643                 :       92786 :   MARK_TS_TYPE_NON_COMMON (TYPENAME_TYPE);
     644                 :       92786 :   MARK_TS_TYPE_NON_COMMON (TYPEOF_TYPE);
     645                 :       92786 :   MARK_TS_TYPE_NON_COMMON (TRAIT_TYPE);
     646                 :       92786 :   MARK_TS_TYPE_NON_COMMON (BOUND_TEMPLATE_TEMPLATE_PARM);
     647                 :       92786 :   MARK_TS_TYPE_NON_COMMON (TEMPLATE_TEMPLATE_PARM);
     648                 :       92786 :   MARK_TS_TYPE_NON_COMMON (TEMPLATE_TYPE_PARM);
     649                 :       92786 :   MARK_TS_TYPE_NON_COMMON (TYPE_PACK_EXPANSION);
     650                 :       92786 :   MARK_TS_TYPE_NON_COMMON (PACK_INDEX_TYPE);
     651                 :             : 
     652                 :             :   /* Statements.  */
     653                 :       92786 :   MARK_TS_EXP (CLEANUP_STMT);
     654                 :       92786 :   MARK_TS_EXP (EH_SPEC_BLOCK);
     655                 :       92786 :   MARK_TS_EXP (HANDLER);
     656                 :       92786 :   MARK_TS_EXP (IF_STMT);
     657                 :       92786 :   MARK_TS_EXP (OMP_DEPOBJ);
     658                 :       92786 :   MARK_TS_EXP (RANGE_FOR_STMT);
     659                 :       92786 :   MARK_TS_EXP (TRY_BLOCK);
     660                 :       92786 :   MARK_TS_EXP (USING_STMT);
     661                 :             : 
     662                 :             :   /* Random expressions.  */
     663                 :       92786 :   MARK_TS_EXP (ADDRESSOF_EXPR);
     664                 :       92786 :   MARK_TS_EXP (AGGR_INIT_EXPR);
     665                 :       92786 :   MARK_TS_EXP (ALIGNOF_EXPR);
     666                 :       92786 :   MARK_TS_EXP (ARROW_EXPR);
     667                 :       92786 :   MARK_TS_EXP (AT_ENCODE_EXPR);
     668                 :       92786 :   MARK_TS_EXP (BIT_CAST_EXPR);
     669                 :       92786 :   MARK_TS_EXP (CAST_EXPR);
     670                 :       92786 :   MARK_TS_EXP (CONST_CAST_EXPR);
     671                 :       92786 :   MARK_TS_EXP (CTOR_INITIALIZER);
     672                 :       92786 :   MARK_TS_EXP (DELETE_EXPR);
     673                 :       92786 :   MARK_TS_EXP (DOTSTAR_EXPR);
     674                 :       92786 :   MARK_TS_EXP (DYNAMIC_CAST_EXPR);
     675                 :       92786 :   MARK_TS_EXP (EMPTY_CLASS_EXPR);
     676                 :       92786 :   MARK_TS_EXP (EXPR_STMT);
     677                 :       92786 :   MARK_TS_EXP (IMPLICIT_CONV_EXPR);
     678                 :       92786 :   MARK_TS_EXP (MEMBER_REF);
     679                 :       92786 :   MARK_TS_EXP (MODOP_EXPR);
     680                 :       92786 :   MARK_TS_EXP (MUST_NOT_THROW_EXPR);
     681                 :       92786 :   MARK_TS_EXP (NEW_EXPR);
     682                 :       92786 :   MARK_TS_EXP (NOEXCEPT_EXPR);
     683                 :       92786 :   MARK_TS_EXP (OFFSETOF_EXPR);
     684                 :       92786 :   MARK_TS_EXP (OFFSET_REF);
     685                 :       92786 :   MARK_TS_EXP (PSEUDO_DTOR_EXPR);
     686                 :       92786 :   MARK_TS_EXP (REINTERPRET_CAST_EXPR);
     687                 :       92786 :   MARK_TS_EXP (SCOPE_REF);
     688                 :       92786 :   MARK_TS_EXP (STATIC_CAST_EXPR);
     689                 :       92786 :   MARK_TS_EXP (STMT_EXPR);
     690                 :       92786 :   MARK_TS_EXP (TAG_DEFN);
     691                 :       92786 :   MARK_TS_EXP (TEMPLATE_ID_EXPR);
     692                 :       92786 :   MARK_TS_EXP (THROW_EXPR);
     693                 :       92786 :   MARK_TS_EXP (TYPEID_EXPR);
     694                 :       92786 :   MARK_TS_EXP (TYPE_EXPR);
     695                 :       92786 :   MARK_TS_EXP (UNARY_PLUS_EXPR);
     696                 :       92786 :   MARK_TS_EXP (VEC_DELETE_EXPR);
     697                 :       92786 :   MARK_TS_EXP (VEC_INIT_EXPR);
     698                 :       92786 :   MARK_TS_EXP (VEC_NEW_EXPR);
     699                 :       92786 :   MARK_TS_EXP (SPACESHIP_EXPR);
     700                 :             : 
     701                 :             :   /* Fold expressions.  */
     702                 :       92786 :   MARK_TS_EXP (BINARY_LEFT_FOLD_EXPR);
     703                 :       92786 :   MARK_TS_EXP (BINARY_RIGHT_FOLD_EXPR);
     704                 :       92786 :   MARK_TS_EXP (EXPR_PACK_EXPANSION);
     705                 :       92786 :   MARK_TS_EXP (NONTYPE_ARGUMENT_PACK);
     706                 :       92786 :   MARK_TS_EXP (UNARY_LEFT_FOLD_EXPR);
     707                 :       92786 :   MARK_TS_EXP (UNARY_RIGHT_FOLD_EXPR);
     708                 :       92786 :   MARK_TS_EXP (PACK_INDEX_EXPR);
     709                 :             : 
     710                 :             :   /* Constraints.  */
     711                 :       92786 :   MARK_TS_EXP (COMPOUND_REQ);
     712                 :       92786 :   MARK_TS_EXP (CONJ_CONSTR);
     713                 :       92786 :   MARK_TS_EXP (DISJ_CONSTR);
     714                 :       92786 :   MARK_TS_EXP (ATOMIC_CONSTR);
     715                 :       92786 :   MARK_TS_EXP (NESTED_REQ);
     716                 :       92786 :   MARK_TS_EXP (REQUIRES_EXPR);
     717                 :       92786 :   MARK_TS_EXP (SIMPLE_REQ);
     718                 :       92786 :   MARK_TS_EXP (TYPE_REQ);
     719                 :             : 
     720                 :       92786 :   MARK_TS_EXP (CO_AWAIT_EXPR);
     721                 :       92786 :   MARK_TS_EXP (CO_YIELD_EXPR);
     722                 :       92786 :   MARK_TS_EXP (CO_RETURN_EXPR);
     723                 :             : 
     724                 :       92786 :   MARK_TS_EXP (ASSERTION_STMT);
     725                 :       92786 :   MARK_TS_EXP (PRECONDITION_STMT);
     726                 :       92786 :   MARK_TS_EXP (POSTCONDITION_STMT);
     727                 :             : 
     728                 :       92786 :   c_common_init_ts ();
     729                 :       92786 : }
     730                 :             : 
     731                 :             : /* Handle C++-specficic options here.  Punt to c_common otherwise.  */
     732                 :             : 
     733                 :             : bool
     734                 :     1793856 : cp_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
     735                 :             :                   int kind, location_t loc,
     736                 :             :                   const struct cl_option_handlers *handlers)
     737                 :             : {
     738                 :     1793856 :   if (handle_module_option (unsigned (scode), arg, value))
     739                 :             :     return true;
     740                 :             : 
     741                 :     1792990 :   enum opt_code code = (enum opt_code) scode;
     742                 :     1792990 :   bool handled_p = true;
     743                 :             : 
     744                 :     1792990 :   switch (code)
     745                 :             :     {
     746                 :           4 :     case OPT_fcontract_build_level_:
     747                 :           4 :       handle_OPT_fcontract_build_level_ (arg);
     748                 :           4 :       break;
     749                 :             : 
     750                 :           0 :     case OPT_fcontract_assumption_mode_:
     751                 :           0 :       handle_OPT_fcontract_assumption_mode_ (arg);
     752                 :           0 :       break;
     753                 :             : 
     754                 :          47 :     case OPT_fcontract_continuation_mode_:
     755                 :          47 :       handle_OPT_fcontract_continuation_mode_ (arg);
     756                 :          47 :       break;
     757                 :             : 
     758                 :          25 :     case OPT_fcontract_role_:
     759                 :          25 :       handle_OPT_fcontract_role_ (arg);
     760                 :          25 :       break;
     761                 :             : 
     762                 :           3 :     case OPT_fcontract_semantic_:
     763                 :           3 :       handle_OPT_fcontract_semantic_ (arg);
     764                 :           3 :       break;
     765                 :             : 
     766                 :             :     default:
     767                 :             :       handled_p = false;
     768                 :             :       break;
     769                 :             :     }
     770                 :          79 :   if (handled_p)
     771                 :          79 :     return handled_p;
     772                 :             : 
     773                 :     1792911 :   return c_common_handle_option (scode, arg, value, kind, loc, handlers);
     774                 :             : }
     775                 :             : 
     776                 :             : #include "gt-cp-cp-objcp-common.h"
        

Generated by: LCOV version 2.1-beta

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