LCOV - code coverage report
Current view: top level - gcc/cp - cvt.cc (source / functions) Hit Total Coverage
Test: gcc.info Lines: 800 1022 78.3 %
Date: 2023-07-19 08:18:47 Functions: 30 32 93.8 %

          Line data    Source code
       1             : /* Language-level data type conversion for GNU C++.
       2             :    Copyright (C) 1987-2023 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             : /* This file contains the functions for converting C++ expressions
      23             :    to different data types.  The only entry point is `convert'.
      24             :    Every language front end must have a `convert' function
      25             :    but what kind of conversions it does will depend on the language.  */
      26             : 
      27             : #include "config.h"
      28             : #include "system.h"
      29             : #include "coretypes.h"
      30             : #include "target.h"
      31             : #include "cp-tree.h"
      32             : #include "stor-layout.h"
      33             : #include "flags.h"
      34             : #include "intl.h"
      35             : #include "convert.h"
      36             : #include "stringpool.h"
      37             : #include "attribs.h"
      38             : #include "escaped_string.h"
      39             : 
      40             : static tree convert_to_pointer_force (tree, tree, tsubst_flags_t);
      41             : static tree build_type_conversion (tree, tree);
      42             : static tree build_up_reference (tree, tree, int, tree, tsubst_flags_t);
      43             : static void diagnose_ref_binding (location_t, tree, tree, tree);
      44             : 
      45             : /* Change of width--truncation and extension of integers or reals--
      46             :    is represented with NOP_EXPR.  Proper functioning of many things
      47             :    assumes that no other conversions can be NOP_EXPRs.
      48             : 
      49             :    Conversion between integer and pointer is represented with CONVERT_EXPR.
      50             :    Converting integer to real uses FLOAT_EXPR
      51             :    and real to integer uses FIX_TRUNC_EXPR.
      52             : 
      53             :    Here is a list of all the functions that assume that widening and
      54             :    narrowing is always done with a NOP_EXPR:
      55             :      In convert.cc, convert_to_integer[_maybe_fold].
      56             :      In c-typeck.cc, build_binary_op_nodefault (boolean ops),
      57             :         and c_common_truthvalue_conversion.
      58             :      In expr.cc: expand_expr, for operands of a MULT_EXPR.
      59             :      In fold-const.cc: fold.
      60             :      In tree.cc: get_narrower and get_unwidened.
      61             : 
      62             :    C++: in multiple-inheritance, converting between pointers may involve
      63             :    adjusting them by a delta stored within the class definition.  */
      64             : 
      65             : /* Subroutines of `convert'.  */
      66             : 
      67             : /* if converting pointer to pointer
      68             :      if dealing with classes, check for derived->base or vice versa
      69             :      else if dealing with method pointers, delegate
      70             :      else convert blindly
      71             :    else if converting class, pass off to build_type_conversion
      72             :    else try C-style pointer conversion.  */
      73             : 
      74             : static tree
      75    14479666 : cp_convert_to_pointer (tree type, tree expr, bool dofold,
      76             :                        tsubst_flags_t complain)
      77             : {
      78    14479666 :   tree intype = TREE_TYPE (expr);
      79    14479666 :   enum tree_code form;
      80    14479666 :   tree rval;
      81    14479666 :   location_t loc = cp_expr_loc_or_input_loc (expr);
      82             : 
      83    14479666 :   if (intype == error_mark_node)
      84             :     return error_mark_node;
      85             : 
      86    14479702 :   if (MAYBE_CLASS_TYPE_P (intype))
      87             :     {
      88           4 :       intype = complete_type (intype);
      89           4 :       if (!COMPLETE_TYPE_P (intype))
      90             :         {
      91           0 :           if (complain & tf_error)
      92           0 :             error_at (loc, "cannot convert from incomplete type %qH to %qI",
      93             :                       intype, type);
      94           0 :           return error_mark_node;
      95             :         }
      96             : 
      97           4 :       rval = build_type_conversion (type, expr);
      98           4 :       if (rval)
      99             :         {
     100           0 :           if ((complain & tf_error)
     101           0 :               && rval == error_mark_node)
     102           0 :             error_at (loc, "conversion of %qE from %qH to %qI is ambiguous",
     103             :                       expr, intype, type);
     104           0 :           return rval;
     105             :         }
     106             :     }
     107             : 
     108             :   /* Handle anachronistic conversions from (::*)() to cv void* or (*)().  */
     109    14479666 :   if (TYPE_PTR_P (type)
     110    14479666 :       && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
     111    14361326 :           || VOID_TYPE_P (TREE_TYPE (type))))
     112             :     {
     113          16 :       if (TYPE_PTRMEMFUNC_P (intype)
     114     1363258 :           || TREE_CODE (intype) == METHOD_TYPE)
     115          12 :         return convert_member_func_to_ptr (type, expr, complain);
     116     1363242 :       if (TYPE_PTR_P (TREE_TYPE (expr)))
     117      647563 :         return build_nop (type, expr);
     118      715679 :       intype = TREE_TYPE (expr);
     119             :     }
     120             : 
     121    13832091 :   if (expr == error_mark_node)
     122             :     return error_mark_node;
     123             : 
     124    13832091 :   form = TREE_CODE (intype);
     125             : 
     126    13832091 :   if (INDIRECT_TYPE_P (intype))
     127             :     {
     128     8962124 :       intype = TYPE_MAIN_VARIANT (intype);
     129             : 
     130     8962124 :       if (TYPE_MAIN_VARIANT (type) != intype
     131     5453333 :           && TYPE_PTR_P (type)
     132     5448864 :           && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
     133     4381890 :           && MAYBE_CLASS_TYPE_P (TREE_TYPE (type))
     134     4129571 :           && MAYBE_CLASS_TYPE_P (TREE_TYPE (intype))
     135    10998940 :           && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
     136             :         {
     137     2036816 :           enum tree_code code = PLUS_EXPR;
     138     2036816 :           tree binfo;
     139     2036816 :           tree intype_class;
     140     2036816 :           tree type_class;
     141     2036816 :           bool same_p;
     142             : 
     143     2036816 :           intype_class = TREE_TYPE (intype);
     144     2036816 :           type_class = TREE_TYPE (type);
     145             : 
     146     2036816 :           same_p = same_type_p (TYPE_MAIN_VARIANT (intype_class),
     147             :                                 TYPE_MAIN_VARIANT (type_class));
     148     2036816 :           binfo = NULL_TREE;
     149             :           /* Try derived to base conversion.  */
     150     2036816 :           if (!same_p)
     151       30677 :             binfo = lookup_base (intype_class, type_class, ba_check,
     152             :                                  NULL, complain);
     153     2036816 :           if (!same_p && !binfo)
     154             :             {
     155             :               /* Try base to derived conversion.  */
     156          20 :               binfo = lookup_base (type_class, intype_class, ba_check,
     157             :                                    NULL, complain);
     158          20 :               code = MINUS_EXPR;
     159             :             }
     160     2036816 :           if (binfo == error_mark_node)
     161             :             return error_mark_node;
     162     2036807 :           if (binfo || same_p)
     163             :             {
     164     2036807 :               if (binfo)
     165       30668 :                 expr = build_base_path (code, expr, binfo, 0, complain);
     166             :               /* Add any qualifier conversions.  */
     167     2036807 :               return build_nop (type, expr);
     168             :             }
     169             :         }
     170             : 
     171     6925308 :       if (TYPE_PTRMEMFUNC_P (type))
     172             :         {
     173           0 :           if (complain & tf_error)
     174           0 :             error_at (loc, "cannot convert %qE from type %qH to type %qI",
     175             :                       expr, intype, type);
     176           0 :           return error_mark_node;
     177             :         }
     178             : 
     179     6925308 :       return build_nop (type, expr);
     180             :     }
     181        1382 :   else if ((TYPE_PTRDATAMEM_P (type) && TYPE_PTRDATAMEM_P (intype))
     182     4871225 :            || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
     183         144 :     return convert_ptrmem (type, expr, /*allow_inverse_p=*/false,
     184         144 :                            /*c_cast_p=*/false, complain);
     185     4869823 :   else if (TYPE_PTRMEMFUNC_P (intype))
     186             :     {
     187           0 :       if (!warn_pmf2ptr)
     188             :         {
     189           0 :           if (TREE_CODE (expr) == PTRMEM_CST)
     190           0 :             return cp_convert_to_pointer (type, PTRMEM_CST_MEMBER (expr),
     191           0 :                                           dofold, complain);
     192           0 :           else if (TREE_CODE (expr) == OFFSET_REF)
     193             :             {
     194           0 :               tree object = TREE_OPERAND (expr, 0);
     195           0 :               return get_member_function_from_ptrfunc (&object,
     196           0 :                                                        TREE_OPERAND (expr, 1),
     197             :                                                        complain);
     198             :             }
     199             :         }
     200           0 :       if (complain & tf_error)
     201           0 :         error_at (loc, "cannot convert %qE from type %qH to type %qI",
     202             :                   expr, intype, type);
     203           0 :       return error_mark_node;
     204             :     }
     205             : 
     206     4869823 :   if (null_ptr_cst_p (expr))
     207             :     {
     208     3284088 :       if (TYPE_PTRMEMFUNC_P (type))
     209         699 :         return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0,
     210         699 :                                  /*c_cast_p=*/false, complain);
     211             : 
     212     3283389 :       if (complain & tf_warning)
     213     2407007 :         maybe_warn_zero_as_null_pointer_constant (expr, loc);
     214             : 
     215             :       /* A NULL pointer-to-data-member is represented by -1, not by
     216             :          zero.  */
     217     3283389 :       tree val = (TYPE_PTRDATAMEM_P (type)
     218     3283389 :                   ? build_int_cst_type (type, -1)
     219     3282131 :                   : build_int_cst (type, 0));
     220             : 
     221     3283389 :       return (TREE_SIDE_EFFECTS (expr)
     222     3283389 :               ? build2 (COMPOUND_EXPR, type, expr, val) : val);
     223             :     }
     224     1585735 :   else if (TYPE_PTRMEM_P (type) && INTEGRAL_CODE_P (form))
     225             :     {
     226           0 :       if (complain & tf_error)
     227           0 :         error_at (loc, "invalid conversion from %qH to %qI", intype, type);
     228           0 :       return error_mark_node;
     229             :     }
     230             : 
     231     1585735 :   if (INTEGRAL_CODE_P (form))
     232             :     {
     233     1598305 :       if (TYPE_PRECISION (intype) == POINTER_SIZE)
     234     1570244 :         return build1 (CONVERT_EXPR, type, expr);
     235       15483 :       expr = cp_convert (c_common_type_for_size (TYPE_PRECISION (type), 0), expr,
     236             :                          complain);
     237             :       /* Modes may be different but sizes should be the same.  There
     238             :          is supposed to be some integral type that is the same width
     239             :          as a pointer.  */
     240       46449 :       gcc_assert (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (expr)))
     241             :                   == GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (type)));
     242             : 
     243             :       /* FIXME needed because convert_to_pointer_maybe_fold still folds
     244             :          conversion of constants.  */
     245       15483 :       if (!dofold)
     246       15483 :         return build1 (CONVERT_EXPR, type, expr);
     247             : 
     248           0 :       return convert_to_pointer_maybe_fold (type, expr, dofold);
     249             :     }
     250             : 
     251           8 :   if (type_unknown_p (expr))
     252           0 :     return instantiate_type (type, expr, complain);
     253             : 
     254           8 :   if (complain & tf_error)
     255           8 :     error_at (loc, "cannot convert %qE from type %qH to type %qI",
     256             :               expr, intype, type);
     257           8 :   return error_mark_node;
     258             : }
     259             : 
     260             : /* Like convert, except permit conversions to take place which
     261             :    are not normally allowed due to access restrictions
     262             :    (such as conversion from sub-type to private super-type).  */
     263             : 
     264             : static tree
     265     4789593 : convert_to_pointer_force (tree type, tree expr, tsubst_flags_t complain)
     266             : {
     267     4789593 :   tree intype = TREE_TYPE (expr);
     268     4789593 :   enum tree_code form = TREE_CODE (intype);
     269             : 
     270     4789593 :   if (form == POINTER_TYPE)
     271             :     {
     272     4789593 :       intype = TYPE_MAIN_VARIANT (intype);
     273             : 
     274     4789593 :       if (TYPE_MAIN_VARIANT (type) != intype
     275     1280775 :           && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
     276     2561486 :           && MAYBE_CLASS_TYPE_P (TREE_TYPE (type))
     277     2561478 :           && MAYBE_CLASS_TYPE_P (TREE_TYPE (intype))
     278     6070332 :           && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
     279             :         {
     280     1280739 :           enum tree_code code = PLUS_EXPR;
     281     1280739 :           tree binfo;
     282             : 
     283     1280739 :           binfo = lookup_base (TREE_TYPE (intype), TREE_TYPE (type),
     284             :                                ba_unique, NULL, complain);
     285     1280739 :           if (!binfo)
     286             :             {
     287           0 :               binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
     288             :                                    ba_unique, NULL, complain);
     289           0 :               code = MINUS_EXPR;
     290             :             }
     291     1280739 :           if (binfo == error_mark_node)
     292             :             return error_mark_node;
     293     1280739 :           if (binfo)
     294             :             {
     295     1280739 :               expr = build_base_path (code, expr, binfo, 0, complain);
     296     1280739 :               if (expr == error_mark_node)
     297             :                  return error_mark_node;
     298             :               /* Add any qualifier conversions.  */
     299     1280739 :               if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)),
     300             :                                 TREE_TYPE (type)))
     301      283501 :                 expr = build_nop (type, expr);
     302     1280739 :               return expr;
     303             :             }
     304             :         }
     305             :     }
     306             : 
     307     3508854 :   return cp_convert_to_pointer (type, expr, /*fold*/false, complain);
     308             : }
     309             : 
     310             : /* We are passing something to a function which requires a reference.
     311             :    The type we are interested in is in TYPE. The initial
     312             :    value we have to begin with is in ARG.
     313             : 
     314             :    FLAGS controls how we manage access checking.
     315             :    DIRECT_BIND in FLAGS controls how any temporaries are generated.
     316             :      If DIRECT_BIND is set, DECL is the reference we're binding to.  */
     317             : 
     318             : static tree
     319         306 : build_up_reference (tree type, tree arg, int flags, tree decl,
     320             :                     tsubst_flags_t complain)
     321             : {
     322         306 :   tree rval;
     323         306 :   tree argtype = TREE_TYPE (arg);
     324         306 :   tree target_type = TREE_TYPE (type);
     325             : 
     326         306 :   gcc_assert (TYPE_REF_P (type));
     327             : 
     328         306 :   if ((flags & DIRECT_BIND) && ! lvalue_p (arg))
     329             :     {
     330             :       /* Create a new temporary variable.  We can't just use a TARGET_EXPR
     331             :          here because it needs to live as long as DECL.  */
     332           0 :       tree targ = arg;
     333             : 
     334           0 :       arg = make_temporary_var_for_ref_to_temp (decl, target_type);
     335             : 
     336             :       /* Process the initializer for the declaration.  */
     337           0 :       DECL_INITIAL (arg) = targ;
     338           0 :       cp_finish_decl (arg, targ, /*init_const_expr_p=*/false, NULL_TREE,
     339             :                       LOOKUP_ONLYCONVERTING|DIRECT_BIND);
     340             :     }
     341         306 :   else if (!(flags & DIRECT_BIND) && ! obvalue_p (arg))
     342           0 :     return get_target_expr (arg, complain);
     343             : 
     344             :   /* If we had a way to wrap this up, and say, if we ever needed its
     345             :      address, transform all occurrences of the register, into a memory
     346             :      reference we could win better.  */
     347         306 :   rval = cp_build_addr_expr (arg, complain);
     348         306 :   if (rval == error_mark_node)
     349             :     return error_mark_node;
     350             : 
     351         306 :   if ((flags & LOOKUP_PROTECT)
     352         306 :       && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type)
     353           9 :       && MAYBE_CLASS_TYPE_P (argtype)
     354         315 :       && MAYBE_CLASS_TYPE_P (target_type))
     355             :     {
     356             :       /* We go through lookup_base for the access control.  */
     357           9 :       tree binfo = lookup_base (argtype, target_type, ba_check,
     358             :                                 NULL, complain);
     359           9 :       if (binfo == error_mark_node)
     360             :         return error_mark_node;
     361           9 :       if (binfo == NULL_TREE)
     362           0 :         return error_not_base_type (target_type, argtype);
     363           9 :       rval = build_base_path (PLUS_EXPR, rval, binfo, 1, complain);
     364             :     }
     365             :   else
     366         297 :     rval
     367         297 :       = convert_to_pointer_force (build_pointer_type (target_type),
     368             :                                   rval, complain);
     369         306 :   return build_nop (type, rval);
     370             : }
     371             : 
     372             : /* Subroutine of convert_to_reference. REFTYPE is the target reference type.
     373             :    INTYPE is the original rvalue type and DECL is an optional _DECL node
     374             :    for diagnostics.
     375             : 
     376             :    [dcl.init.ref] says that if an rvalue is used to
     377             :    initialize a reference, then the reference must be to a
     378             :    non-volatile const type.  */
     379             : 
     380             : static void
     381           6 : diagnose_ref_binding (location_t loc, tree reftype, tree intype, tree decl)
     382             : {
     383           6 :   tree ttl = TREE_TYPE (reftype);
     384             : 
     385           6 :   if (!TYPE_REF_IS_RVALUE (reftype)
     386           6 :       && !CP_TYPE_CONST_NON_VOLATILE_P (ttl))
     387             :     {
     388           0 :       const char *msg;
     389             : 
     390           0 :       if (CP_TYPE_VOLATILE_P (ttl) && decl)
     391             :         msg = G_("initialization of volatile reference type %q#T from "
     392             :                  "rvalue of type %qT");
     393           0 :       else if (CP_TYPE_VOLATILE_P (ttl))
     394             :         msg = G_("conversion to volatile reference type %q#T "
     395             :                  "from rvalue of type %qT");
     396           0 :       else if (decl)
     397             :         msg = G_("initialization of non-const reference type %q#T from "
     398             :                  "rvalue of type %qT");
     399             :       else
     400           0 :         msg = G_("conversion to non-const reference type %q#T from "
     401             :                  "rvalue of type %qT");
     402             : 
     403           0 :       permerror (loc, msg, reftype, intype);
     404             :     }
     405           6 : }
     406             : 
     407             : /* For C++: Only need to do one-level references, but cannot
     408             :    get tripped up on signed/unsigned differences.
     409             : 
     410             :    DECL is either NULL_TREE or the _DECL node for a reference that is being
     411             :    initialized.  It can be error_mark_node if we don't know the _DECL but
     412             :    we know it's an initialization.  */
     413             : 
     414             : tree
     415         318 : convert_to_reference (tree reftype, tree expr, int convtype,
     416             :                       int flags, tree decl, tsubst_flags_t complain)
     417             : {
     418         318 :   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
     419         318 :   tree intype;
     420         318 :   tree rval = NULL_TREE;
     421         318 :   tree rval_as_conversion = NULL_TREE;
     422         318 :   bool can_convert_intype_to_type;
     423         318 :   location_t loc = cp_expr_loc_or_input_loc (expr);
     424             : 
     425         318 :   if (TREE_CODE (type) == FUNCTION_TYPE
     426         318 :       && TREE_TYPE (expr) == unknown_type_node)
     427           0 :     expr = instantiate_type (type, expr, complain);
     428             : 
     429         318 :   if (expr == error_mark_node)
     430             :     return error_mark_node;
     431             : 
     432         306 :   intype = TREE_TYPE (expr);
     433             : 
     434         306 :   gcc_assert (!TYPE_REF_P (intype));
     435         306 :   gcc_assert (TYPE_REF_P (reftype));
     436             : 
     437         306 :   intype = TYPE_MAIN_VARIANT (intype);
     438             : 
     439         306 :   can_convert_intype_to_type = can_convert_standard (type, intype, complain);
     440             : 
     441         306 :   if (!can_convert_intype_to_type
     442           3 :       && (convtype & CONV_IMPLICIT) && MAYBE_CLASS_TYPE_P (intype)
     443         306 :       && ! (flags & LOOKUP_NO_CONVERSION))
     444             :     {
     445             :       /* Look for a user-defined conversion to lvalue that we can use.  */
     446             : 
     447           0 :       rval_as_conversion
     448           0 :         = build_type_conversion (reftype, expr);
     449             : 
     450           0 :       if (rval_as_conversion && rval_as_conversion != error_mark_node
     451           0 :           && lvalue_p (rval_as_conversion))
     452             :         {
     453             :           expr = rval_as_conversion;
     454         306 :           rval_as_conversion = NULL_TREE;
     455             :           intype = type;
     456             :           can_convert_intype_to_type = 1;
     457             :         }
     458             :     }
     459             : 
     460         306 :   if (((convtype & CONV_STATIC)
     461         175 :        && can_convert_standard (intype, type, complain))
     462         306 :       || ((convtype & CONV_IMPLICIT) && can_convert_intype_to_type))
     463             :     {
     464         303 :       {
     465         303 :         tree ttl = TREE_TYPE (reftype);
     466         303 :         tree ttr = lvalue_type (expr);
     467             : 
     468         303 :         if ((complain & tf_error)
     469         303 :             && ! lvalue_p (expr))
     470           3 :           diagnose_ref_binding (loc, reftype, intype, decl);
     471             : 
     472         303 :         if (! (convtype & CONV_CONST)
     473         303 :             && !at_least_as_qualified_p (ttl, ttr))
     474             :           {
     475           7 :             if (complain & tf_error)
     476           7 :               permerror (loc, "conversion from %qH to %qI discards qualifiers",
     477             :                          ttr, reftype);
     478             :             else
     479           0 :               return error_mark_node;
     480             :           }
     481             :       }
     482             : 
     483         303 :       return build_up_reference (reftype, expr, flags, decl, complain);
     484             :     }
     485           3 :   else if ((convtype & CONV_REINTERPRET) && obvalue_p (expr))
     486             :     {
     487             :       /* When casting an lvalue to a reference type, just convert into
     488             :          a pointer to the new type and deference it.  This is allowed
     489             :          by San Diego WP section 5.2.9 paragraph 12, though perhaps it
     490             :          should be done directly (jason).  (int &)ri ---> *(int*)&ri */
     491             : 
     492             :       /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they
     493             :          meant.  */
     494           0 :       if ((complain & tf_warning)
     495           0 :           && TYPE_PTR_P (intype)
     496           0 :           && (comptypes (TREE_TYPE (intype), type,
     497             :                          COMPARE_BASE | COMPARE_DERIVED)))
     498           0 :         warning_at (loc, 0, "casting %qT to %qT does not dereference pointer",
     499             :                     intype, reftype);
     500             : 
     501           0 :       rval = cp_build_addr_expr (expr, complain);
     502           0 :       if (rval != error_mark_node)
     503           0 :         rval = convert_force (build_pointer_type (TREE_TYPE (reftype)),
     504             :                               rval, 0, complain);
     505           0 :       if (rval != error_mark_node)
     506           0 :         rval = build1 (NOP_EXPR, reftype, rval);
     507             :     }
     508             :   else
     509             :     {
     510           3 :       rval = convert_for_initialization (NULL_TREE, type, expr, flags,
     511             :                                          ICR_CONVERTING, 0, 0, complain);
     512           3 :       if (rval == NULL_TREE || rval == error_mark_node)
     513             :         return rval;
     514           3 :       if (complain & tf_error)
     515           3 :         diagnose_ref_binding (loc, reftype, intype, decl);
     516           3 :       rval = build_up_reference (reftype, rval, flags, decl, complain);
     517             :     }
     518             : 
     519           3 :   if (rval)
     520             :     {
     521             :       /* If we found a way to convert earlier, then use it.  */
     522             :       return rval;
     523             :     }
     524             : 
     525           0 :   if (complain & tf_error)
     526           0 :     error_at (loc, "cannot convert type %qH to type %qI", intype, reftype);
     527             : 
     528           0 :   return error_mark_node;
     529             : }
     530             : 
     531             : /* We are using a reference VAL for its value. Bash that reference all the
     532             :    way down to its lowest form.  */
     533             : 
     534             : tree
     535  1099671217 : convert_from_reference (tree val)
     536             : {
     537  1099671217 :   if (TREE_TYPE (val)
     538  1099671217 :       && TYPE_REF_P (TREE_TYPE (val)))
     539             :     {
     540   111408551 :       tree t = TREE_TYPE (TREE_TYPE (val));
     541   111408551 :       tree ref = build1 (INDIRECT_REF, t, val);
     542             : 
     543   111408551 :       mark_exp_read (val);
     544             :        /* We *must* set TREE_READONLY when dereferencing a pointer to const,
     545             :           so that we get the proper error message if the result is used
     546             :           to assign to.  Also, &* is supposed to be a no-op.  */
     547   111408551 :       TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
     548   111408551 :       TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
     549   111408551 :       TREE_SIDE_EFFECTS (ref)
     550   111408551 :         = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val));
     551   111408551 :       val = ref;
     552             :     }
     553             : 
     554  1099671217 :   return val;
     555             : }
     556             : 
     557             : /* Really perform an lvalue-to-rvalue conversion, including copying an
     558             :    argument of class type into a temporary.  */
     559             : 
     560             : tree
     561     4711354 : force_rvalue (tree expr, tsubst_flags_t complain)
     562             : {
     563     4711354 :   tree type = TREE_TYPE (expr);
     564     4711354 :   if (MAYBE_CLASS_TYPE_P (type) && TREE_CODE (expr) != TARGET_EXPR)
     565             :     {
     566      102173 :       releasing_vec args (make_tree_vector_single (expr));
     567      102173 :       expr = build_special_member_call (NULL_TREE, complete_ctor_identifier,
     568             :                                         &args, type, LOOKUP_NORMAL, complain);
     569      102173 :       expr = build_cplus_new (type, expr, complain);
     570      102173 :     }
     571             :   else
     572     4609181 :     expr = decay_conversion (expr, complain);
     573             : 
     574     4711354 :   return expr;
     575             : }
     576             : 
     577             : 
     578             : /* If EXPR and ORIG are INTEGER_CSTs, return a version of EXPR that has
     579             :    TREE_OVERFLOW set only if it is set in ORIG.  Otherwise, return EXPR
     580             :    unchanged.  */
     581             : 
     582             : static tree
     583    72498533 : ignore_overflows (tree expr, tree orig)
     584             : {
     585    72498533 :   tree stripped_expr = tree_strip_any_location_wrapper (expr);
     586    72498533 :   tree stripped_orig = tree_strip_any_location_wrapper (orig);
     587             : 
     588    72498533 :   if (TREE_CODE (stripped_expr) == INTEGER_CST
     589    46201796 :       && TREE_CODE (stripped_orig) == INTEGER_CST
     590   118697696 :       && TREE_OVERFLOW (stripped_expr) != TREE_OVERFLOW (stripped_orig))
     591             :     {
     592       41074 :       gcc_assert (!TREE_OVERFLOW (stripped_orig));
     593             :       /* Ensure constant sharing.  */
     594       41074 :       stripped_expr = wide_int_to_tree (TREE_TYPE (stripped_expr),
     595       82148 :                                         wi::to_wide (stripped_expr));
     596             :     }
     597             : 
     598    72498533 :   return preserve_any_location_wrapper (stripped_expr, expr);
     599             : }
     600             : 
     601             : /* Fold away simple conversions, but make sure TREE_OVERFLOW is set
     602             :    properly and propagate TREE_NO_WARNING if folding EXPR results
     603             :    in the same expression code.  */
     604             : 
     605             : tree
     606     4351833 : cp_fold_convert (tree type, tree expr)
     607             : {
     608     4351833 :   tree conv;
     609     4351833 :   if (TREE_TYPE (expr) == type)
     610             :     conv = expr;
     611     3450313 :   else if (TREE_CODE (expr) == PTRMEM_CST
     612     3450313 :            && same_type_p (TYPE_PTRMEM_CLASS_TYPE (type),
     613             :                            PTRMEM_CST_CLASS (expr)))
     614             :     {
     615             :       /* Avoid wrapping a PTRMEM_CST in NOP_EXPR.  */
     616         107 :       conv = copy_node (expr);
     617         107 :       TREE_TYPE (conv) = type;
     618             :     }
     619     3450206 :   else if (TYPE_PTRMEM_P (type))
     620             :     {
     621           7 :       conv = convert_ptrmem (type, expr, true, false,
     622             :                              tf_warning_or_error);
     623           7 :       conv = cp_fully_fold (conv);
     624             :     }
     625             :   else
     626             :     {
     627     3450199 :       conv = fold_convert (type, expr);
     628     3450199 :       conv = ignore_overflows (conv, expr);
     629             :     }
     630             : 
     631     4351833 :   if (TREE_CODE (expr) == TREE_CODE (conv))
     632     1215133 :     copy_warning (conv, expr);
     633             : 
     634     4351833 :   return conv;
     635             : }
     636             : 
     637             : /* C++ conversions, preference to static cast conversions.  */
     638             : 
     639             : tree
     640   119123990 : cp_convert (tree type, tree expr, tsubst_flags_t complain)
     641             : {
     642    76573310 :   return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL, complain);
     643             : }
     644             : 
     645             : /* C++ equivalent of convert_and_check but using cp_convert as the
     646             :    conversion function.
     647             : 
     648             :    Convert EXPR to TYPE, warning about conversion problems with constants.
     649             :    Invoke this function on every expression that is converted implicitly,
     650             :    i.e. because of language rules and not because of an explicit cast.  */
     651             : 
     652             : tree
     653    30757106 : cp_convert_and_check (tree type, tree expr, tsubst_flags_t complain)
     654             : {
     655    30757106 :   tree result, expr_for_warning = expr;
     656             : 
     657    30757106 :   if (TREE_CODE (expr) == EXCESS_PRECISION_EXPR)
     658         122 :     expr = TREE_OPERAND (expr, 0);
     659    30757106 :   if (TREE_TYPE (expr) == type)
     660             :     return expr;
     661    30757090 :   if (expr == error_mark_node)
     662             :     return expr;
     663    30757090 :   result = cp_convert (type, expr, complain);
     664             : 
     665    30757090 :   if ((complain & tf_warning)
     666    28413284 :       && c_inhibit_evaluation_warnings == 0)
     667             :     {
     668    27720605 :       tree folded = cp_fully_fold (expr_for_warning);
     669    27720605 :       tree folded_result;
     670    27720605 :       if (folded == expr)
     671             :         folded_result = result;
     672             :       else
     673             :         {
     674             :           /* Avoid bogus -Wparentheses warnings.  */
     675    11793590 :           warning_sentinel w (warn_parentheses);
     676    11793590 :           warning_sentinel c (warn_int_in_bool_context);
     677    11793590 :           folded_result = cp_convert (type, folded, tf_none);
     678    11793590 :         }
     679    27720605 :       folded_result = fold_simple (folded_result);
     680    21331393 :       if (!TREE_OVERFLOW_P (folded)
     681    49051987 :           && folded_result != error_mark_node)
     682    42366525 :         warnings_for_convert_and_check (cp_expr_loc_or_input_loc (expr),
     683             :                                         type, folded, folded_result);
     684             :     }
     685             : 
     686             :   return result;
     687             : }
     688             : 
     689             : /* Conversion...
     690             : 
     691             :    FLAGS indicates how we should behave.  */
     692             : 
     693             : tree
     694   194354403 : ocp_convert (tree type, tree expr, int convtype, int flags,
     695             :              tsubst_flags_t complain)
     696             : {
     697   194354403 :   tree e = expr;
     698   194354403 :   enum tree_code code = TREE_CODE (type);
     699   194354403 :   const char *invalid_conv_diag;
     700   194354403 :   tree e1;
     701   194354403 :   location_t loc = cp_expr_loc_or_input_loc (expr);
     702   194354403 :   bool dofold = (convtype & CONV_FOLD);
     703             : 
     704   194354403 :   if (error_operand_p (e) || type == error_mark_node)
     705         108 :     return error_mark_node;
     706             : 
     707   194354295 :   if (TREE_CODE (e) == COMPOUND_EXPR)
     708             :     {
     709      309498 :       e = ocp_convert (type, TREE_OPERAND (e, 1), convtype, flags, complain);
     710      309498 :       if (e == error_mark_node)
     711             :         return error_mark_node;
     712      309498 :       if (e == TREE_OPERAND (expr, 1))
     713             :         return expr;
     714      309483 :       e = build2_loc (EXPR_LOCATION (expr), COMPOUND_EXPR, TREE_TYPE (e),
     715      309483 :                       TREE_OPERAND (expr, 0), e);
     716      309483 :       copy_warning (e, expr);
     717      309483 :       return e;
     718             :     }
     719             : 
     720   194044797 :   complete_type (type);
     721   194044797 :   complete_type (TREE_TYPE (expr));
     722             : 
     723   388089594 :   if ((invalid_conv_diag
     724   194044797 :        = targetm.invalid_conversion (TREE_TYPE (expr), type)))
     725             :     {
     726           0 :       if (complain & tf_error)
     727           0 :         error (invalid_conv_diag);
     728           0 :       return error_mark_node;
     729             :     }
     730             : 
     731             :   /* FIXME remove when moving to c_fully_fold model.  */
     732   194044797 :   if (!CLASS_TYPE_P (type))
     733             :     {
     734   184848049 :       e = mark_rvalue_use (e);
     735   184848049 :       tree v = scalar_constant_value (e);
     736   184848049 :       if (!error_operand_p (v))
     737   184847971 :         e = v;
     738             :     }
     739   194044797 :   if (error_operand_p (e))
     740           0 :     return error_mark_node;
     741             : 
     742   194044797 :   if (NULLPTR_TYPE_P (type) && null_ptr_cst_p (e))
     743             :     {
     744        1927 :       if (complain & tf_warning)
     745         998 :         maybe_warn_zero_as_null_pointer_constant (e, loc);
     746             : 
     747        1927 :       if (!TREE_SIDE_EFFECTS (e))
     748        1921 :         return nullptr_node;
     749             :     }
     750             : 
     751   203240457 :   if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP))
     752             :     /* We need a new temporary; don't take this shortcut.  */;
     753   193658050 :   else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e)))
     754             :     {
     755    96046587 :       tree etype = TREE_TYPE (e);
     756    96046587 :       if (same_type_p (type, etype))
     757             :         /* The call to fold will not always remove the NOP_EXPR as
     758             :            might be expected, since if one of the types is a typedef;
     759             :            the comparison in fold is just equality of pointers, not a
     760             :            call to comptypes.  We don't call fold in this case because
     761             :            that can result in infinite recursion; fold will call
     762             :            convert, which will call ocp_convert, etc.  */
     763             :         return e;
     764             :       /* For complex data types, we need to perform componentwise
     765             :          conversion.  */
     766     9447268 :       else if (TREE_CODE (type) == COMPLEX_TYPE)
     767           0 :         return convert_to_complex_maybe_fold (type, e, dofold);
     768     9447268 :       else if (VECTOR_TYPE_P (type))
     769        3224 :         return convert_to_vector (type, rvalue (e));
     770     9444044 :       else if (TREE_CODE (e) == TARGET_EXPR)
     771             :         {
     772             :           /* Don't build a NOP_EXPR of class type.  Instead, change the
     773             :              type of the temporary.  */
     774       44814 :           gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, etype));
     775       44814 :           TREE_TYPE (e) = TREE_TYPE (TARGET_EXPR_SLOT (e)) = type;
     776       44814 :           return e;
     777             :         }
     778     9399230 :       else if (TREE_CODE (e) == CONSTRUCTOR)
     779             :         {
     780           3 :           gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, etype));
     781           3 :           TREE_TYPE (e) = type;
     782           3 :           return e;
     783             :         }
     784             :       else
     785             :         {
     786             :           /* We shouldn't be treating objects of ADDRESSABLE type as
     787             :              rvalues.  */
     788     9399227 :           gcc_assert (!TREE_ADDRESSABLE (type));
     789     9399227 :           return build_nop (type, e);
     790             :         }
     791             :     }
     792             : 
     793    97996289 :   e1 = targetm.convert_to_type (type, e);
     794    97996289 :   if (e1)
     795             :     return e1;
     796             : 
     797    97996289 :   if (code == VOID_TYPE && (convtype & CONV_STATIC))
     798             :     {
     799        1950 :       e = convert_to_void (e, ICV_CAST, complain);
     800        1950 :       return e;
     801             :     }
     802             : 
     803    97994339 :   if (INTEGRAL_CODE_P (code))
     804             :     {
     805    73170807 :       tree intype = TREE_TYPE (e);
     806    73170807 :       tree converted;
     807             : 
     808    73170807 :       if (TREE_CODE (type) == ENUMERAL_TYPE)
     809             :         {
     810             :           /* enum = enum, enum = int, enum = float, (enum)pointer are all
     811             :              errors.  */
     812      574220 :           if (((INTEGRAL_OR_ENUMERATION_TYPE_P (intype)
     813      574220 :                 || SCALAR_FLOAT_TYPE_P (intype))
     814      574220 :                && ! (convtype & CONV_STATIC))
     815      574220 :               || TYPE_PTR_P (intype))
     816             :             {
     817           0 :               if (complain & tf_error)
     818           0 :                 permerror (loc, "conversion from %q#T to %q#T", intype, type);
     819             :               else
     820           0 :                 return error_mark_node;
     821             :             }
     822             : 
     823             :           /* [expr.static.cast]
     824             : 
     825             :              8. A value of integral or enumeration type can be explicitly
     826             :              converted to an enumeration type. The value is unchanged if
     827             :              the original value is within the range of the enumeration
     828             :              values. Otherwise, the resulting enumeration value is
     829             :              unspecified.  */
     830      574220 :           tree val = fold_for_warn (e);
     831      574220 :           if ((complain & tf_warning)
     832      518512 :               && TREE_CODE (val) == INTEGER_CST
     833      125948 :               && ENUM_UNDERLYING_TYPE (type)
     834      700164 :               && !int_fits_type_p (val, ENUM_UNDERLYING_TYPE (type)))
     835         139 :             warning_at (loc, OPT_Wconversion, 
     836             :                         "the result of the conversion is unspecified because "
     837             :                         "%qE is outside the range of type %qT",
     838             :                         expr, type);
     839             :         }
     840    73170917 :       if (MAYBE_CLASS_TYPE_P (intype))
     841             :         {
     842           2 :           tree rval;
     843           4 :           rval = build_type_conversion (type, e);
     844           2 :           if (rval)
     845             :             return rval;
     846           0 :           if (complain & tf_error)
     847           0 :             error_at (loc, "%q#T used where a %qT was expected", intype, type);
     848           0 :           return error_mark_node;
     849             :         }
     850    73170805 :       if (code == BOOLEAN_TYPE)
     851             :         {
     852     4122471 :           if (VOID_TYPE_P (intype))
     853             :             {
     854          21 :               if (complain & tf_error)
     855          21 :                 error_at (loc,
     856             :                           "could not convert %qE from %<void%> to %<bool%>",
     857             :                           expr);
     858          21 :               return error_mark_node;
     859             :             }
     860             : 
     861     4122450 :           if (VECTOR_TYPE_P (intype) && !gnu_vector_type_p (intype))
     862             :             {
     863           0 :               if (complain & tf_error)
     864           0 :                 error_at (loc, "could not convert %qE from %qH to %qI", expr,
     865           0 :                           TREE_TYPE (expr), type);
     866           0 :               return error_mark_node;
     867             :             }
     868             : 
     869             :           /* We can't implicitly convert a scoped enum to bool, so convert
     870             :              to the underlying type first.  */
     871     4122450 :           if (SCOPED_ENUM_P (intype) && (convtype & CONV_STATIC))
     872          16 :             e = build_nop (ENUM_UNDERLYING_TYPE (intype), e);
     873     4122450 :           if (complain & tf_warning)
     874     2365956 :             return cp_truthvalue_conversion (e, complain);
     875             :           else
     876             :             {
     877             :               /* Prevent bogus -Wint-in-bool-context warnings coming
     878             :                  from c_common_truthvalue_conversion down the line.  */
     879     1756494 :               warning_sentinel w (warn_int_in_bool_context);
     880     1756494 :               warning_sentinel c (warn_sign_compare);
     881     1756494 :               return cp_truthvalue_conversion (e, complain);
     882     1756494 :             }
     883             :         }
     884             : 
     885    69048334 :       converted = convert_to_integer_maybe_fold (type, e, dofold);
     886             : 
     887             :       /* Ignore any integer overflow caused by the conversion.  */
     888    69048334 :       return ignore_overflows (converted, e);
     889             :     }
     890    24823532 :   if (INDIRECT_TYPE_P (type) || TYPE_PTRMEM_P (type))
     891    10970812 :     return cp_convert_to_pointer (type, e, dofold, complain);
     892    13852720 :   if (code == VECTOR_TYPE)
     893             :     {
     894        4803 :       tree in_vtype = TREE_TYPE (e);
     895        4803 :       if (MAYBE_CLASS_TYPE_P (in_vtype))
     896             :         {
     897           0 :           tree ret_val;
     898           0 :           ret_val = build_type_conversion (type, e);
     899           0 :           if (ret_val)
     900             :             return ret_val;
     901           0 :           if (complain & tf_error)
     902           0 :             error_at (loc, "%q#T used where a %qT was expected",
     903             :                       in_vtype, type);
     904           0 :           return error_mark_node;
     905             :         }
     906        4803 :       return convert_to_vector (type, rvalue (e));
     907             :     }
     908    13847917 :   if (code == REAL_TYPE || code == COMPLEX_TYPE)
     909             :     {
     910    13463085 :       if (MAYBE_CLASS_TYPE_P (TREE_TYPE (e)))
     911             :         {
     912           0 :           tree rval;
     913           0 :           rval = build_type_conversion (type, e);
     914           0 :           if (rval)
     915             :             return rval;
     916           0 :           else if (complain & tf_error)
     917           0 :             error_at (loc,
     918             :                       "%q#T used where a floating-point value was expected",
     919           0 :                       TREE_TYPE (e));
     920             :         }
     921    13463085 :       if (code == REAL_TYPE)
     922    13308989 :         return convert_to_real_maybe_fold (type, e, dofold);
     923      154096 :       else if (code == COMPLEX_TYPE)
     924      154096 :         return convert_to_complex_maybe_fold (type, e, dofold);
     925             :     }
     926             : 
     927             :   /* New C++ semantics:  since assignment is now based on
     928             :      memberwise copying,  if the rhs type is derived from the
     929             :      lhs type, then we may still do a conversion.  */
     930      384832 :   if (RECORD_OR_UNION_CODE_P (code))
     931             :     {
     932      384826 :       tree dtype = TREE_TYPE (e);
     933      384826 :       tree ctor = NULL_TREE;
     934             : 
     935      384826 :       dtype = TYPE_MAIN_VARIANT (dtype);
     936             : 
     937             :       /* Conversion between aggregate types.  New C++ semantics allow
     938             :          objects of derived type to be cast to objects of base type.
     939             :          Old semantics only allowed this between pointers.
     940             : 
     941             :          There may be some ambiguity between using a constructor
     942             :          vs. using a type conversion operator when both apply.  */
     943             : 
     944      384826 :       ctor = e;
     945             : 
     946      384826 :       if (abstract_virtuals_error (NULL_TREE, type, complain))
     947           0 :         return error_mark_node;
     948             : 
     949      384826 :       if (BRACE_ENCLOSED_INITIALIZER_P (ctor))
     950       20581 :         ctor = perform_implicit_conversion (type, ctor, complain);
     951      364245 :       else if ((flags & LOOKUP_ONLYCONVERTING)
     952      364245 :                && ! (CLASS_TYPE_P (dtype) && DERIVED_FROM_P (type, dtype)))
     953             :         /* For copy-initialization, first we create a temp of the proper type
     954             :            with a user-defined conversion sequence, then we direct-initialize
     955             :            the target with the temp (see [dcl.init]).  */
     956        8914 :         ctor = build_user_type_conversion (type, ctor, flags, complain);
     957             :       else
     958             :         {
     959      355331 :           releasing_vec ctor_vec (make_tree_vector_single (ctor));
     960      355331 :           ctor = build_special_member_call (NULL_TREE,
     961             :                                             complete_ctor_identifier,
     962             :                                             &ctor_vec,
     963             :                                             type, flags, complain);
     964      355331 :         }
     965      384826 :       if (ctor)
     966      384705 :         return build_cplus_new (type, ctor, complain);
     967             :     }
     968             : 
     969         127 :   if (complain & tf_error)
     970             :     {
     971             :       /* If the conversion failed and expr was an invalid use of pointer to
     972             :          member function, try to report a meaningful error.  */
     973         127 :       if (invalid_nonstatic_memfn_p (loc, expr, complain))
     974             :         /* We displayed the error message.  */;
     975             :       else
     976         123 :         error_at (loc, "conversion from %qH to non-scalar type %qI requested",
     977         123 :                   TREE_TYPE (expr), type);
     978             :     }
     979         127 :   return error_mark_node;
     980             : }
     981             : 
     982             : /* If CALL is a call, return the callee; otherwise null.  */
     983             : 
     984             : tree
     985   369924601 : cp_get_callee (tree call)
     986             : {
     987   369924601 :   if (call == NULL_TREE)
     988             :     return call;
     989   369924601 :   else if (TREE_CODE (call) == CALL_EXPR)
     990   359606268 :     return CALL_EXPR_FN (call);
     991    10318333 :   else if (TREE_CODE (call) == AGGR_INIT_EXPR)
     992     4687480 :     return AGGR_INIT_EXPR_FN (call);
     993             :   return NULL_TREE;
     994             : }
     995             : 
     996             : /* FN is the callee of a CALL_EXPR or AGGR_INIT_EXPR; return the FUNCTION_DECL
     997             :    if we can.  */
     998             : 
     999             : tree
    1000   121257222 : cp_get_fndecl_from_callee (tree fn, bool fold /* = true */)
    1001             : {
    1002   121257222 :   if (fn == NULL_TREE)
    1003             :     return fn;
    1004   120765793 :   if (TREE_CODE (fn) == FUNCTION_DECL)
    1005             :     return fn;
    1006   120624117 :   tree type = TREE_TYPE (fn);
    1007   120624117 :   if (type == NULL_TREE || !INDIRECT_TYPE_P (type))
    1008             :     return NULL_TREE;
    1009   120567884 :   if (fold)
    1010     1329602 :     fn = maybe_constant_init (fn);
    1011   120567884 :   STRIP_NOPS (fn);
    1012   120567884 :   if (TREE_CODE (fn) == ADDR_EXPR
    1013   120567884 :       || TREE_CODE (fn) == FDESC_EXPR)
    1014   118898241 :     fn = TREE_OPERAND (fn, 0);
    1015   120567884 :   if (TREE_CODE (fn) == FUNCTION_DECL)
    1016             :     return fn;
    1017             :   return NULL_TREE;
    1018             : }
    1019             : 
    1020             : /* Like get_callee_fndecl, but handles AGGR_INIT_EXPR as well and uses the
    1021             :    constexpr machinery.  */
    1022             : 
    1023             : tree
    1024           0 : cp_get_callee_fndecl (tree call)
    1025             : {
    1026           0 :   return cp_get_fndecl_from_callee (cp_get_callee (call));
    1027             : }
    1028             : 
    1029             : /* As above, but not using the constexpr machinery.  */
    1030             : 
    1031             : tree
    1032   119927556 : cp_get_callee_fndecl_nofold (tree call)
    1033             : {
    1034   119927556 :   return cp_get_fndecl_from_callee (cp_get_callee (call), false);
    1035             : }
    1036             : 
    1037             : /* Subroutine of convert_to_void.  Warn if we're discarding something with
    1038             :    attribute [[nodiscard]].  */
    1039             : 
    1040             : static void
    1041     1342548 : maybe_warn_nodiscard (tree expr, impl_conv_void implicit)
    1042             : {
    1043     1342548 :   if (!warn_unused_result || c_inhibit_evaluation_warnings)
    1044             :     return;
    1045             : 
    1046     1331012 :   tree call = expr;
    1047     1331012 :   if (TREE_CODE (expr) == TARGET_EXPR)
    1048       13476 :     call = TARGET_EXPR_INITIAL (expr);
    1049     1331012 :   location_t loc = cp_expr_loc_or_input_loc (call);
    1050     1331012 :   tree callee = cp_get_callee (call);
    1051     1331012 :   if (!callee)
    1052             :     return;
    1053             : 
    1054     1329602 :   tree type = TREE_TYPE (callee);
    1055     1329602 :   if (TYPE_PTRMEMFUNC_P (type))
    1056           0 :     type = TYPE_PTRMEMFUNC_FN_TYPE (type);
    1057     1329602 :   if (INDIRECT_TYPE_P (type))
    1058     1329602 :     type = TREE_TYPE (type);
    1059             : 
    1060     1329602 :   tree rettype = TREE_TYPE (type);
    1061     1329602 :   tree fn = cp_get_fndecl_from_callee (callee);
    1062     1329602 :   tree attr;
    1063     1329602 :   if (implicit != ICV_CAST && fn
    1064     1329602 :       && (attr = lookup_attribute ("nodiscard", DECL_ATTRIBUTES (fn))))
    1065             :     {
    1066         111 :       escaped_string msg;
    1067         111 :       tree args = TREE_VALUE (attr);
    1068         111 :       if (args)
    1069          19 :         msg.escape (TREE_STRING_POINTER (TREE_VALUE (args)));
    1070         111 :       const char *format
    1071         111 :         = (msg
    1072         111 :            ? G_("ignoring return value of %qD, "
    1073             :                 "declared with attribute %<nodiscard%>: %<%s%>")
    1074             :            : G_("ignoring return value of %qD, "
    1075         111 :                 "declared with attribute %<nodiscard%>%s"));
    1076         111 :       const char *raw_msg = msg ? (const char *) msg : "";
    1077         111 :       auto_diagnostic_group d;
    1078         111 :       if (warning_at (loc, OPT_Wunused_result, format, fn, raw_msg))
    1079         111 :         inform (DECL_SOURCE_LOCATION (fn), "declared here");
    1080         111 :     }
    1081     1329491 :   else if (implicit != ICV_CAST
    1082     1329491 :            && (attr = lookup_attribute ("nodiscard", TYPE_ATTRIBUTES (rettype))))
    1083             :     {
    1084          63 :       escaped_string msg;
    1085          63 :       tree args = TREE_VALUE (attr);
    1086          63 :       if (args)
    1087          18 :         msg.escape (TREE_STRING_POINTER (TREE_VALUE (args)));
    1088          63 :       const char *format
    1089          63 :         = (msg
    1090          63 :            ? G_("ignoring returned value of type %qT, "
    1091             :                 "declared with attribute %<nodiscard%>: %<%s%>")
    1092             :            : G_("ignoring returned value of type %qT, "
    1093          63 :                 "declared with attribute %<nodiscard%>%s"));
    1094          63 :       const char *raw_msg = msg ? (const char *) msg : "";
    1095          63 :       auto_diagnostic_group d;
    1096          63 :       if (warning_at (loc, OPT_Wunused_result, format, rettype, raw_msg))
    1097             :         {
    1098          63 :           if (fn)
    1099          12 :             inform (DECL_SOURCE_LOCATION (fn),
    1100             :                     "in call to %qD, declared here", fn);
    1101          63 :           inform (DECL_SOURCE_LOCATION (TYPE_NAME (rettype)),
    1102             :                   "%qT declared here", rettype);
    1103             :         }
    1104          63 :     }
    1105     1329428 :   else if (TREE_CODE (expr) == TARGET_EXPR
    1106     1329428 :            && lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (type)))
    1107             :     {
    1108             :       /* The TARGET_EXPR confuses do_warn_unused_result into thinking that the
    1109             :          result is used, so handle that case here.  */
    1110          80 :       if (fn)
    1111             :         {
    1112          80 :           auto_diagnostic_group d;
    1113          80 :           if (warning_at (loc, OPT_Wunused_result,
    1114             :                           "ignoring return value of %qD, "
    1115             :                           "declared with attribute %<warn_unused_result%>",
    1116             :                           fn))
    1117          80 :             inform (DECL_SOURCE_LOCATION (fn), "declared here");
    1118          80 :         }
    1119             :       else
    1120           0 :         warning_at (loc, OPT_Wunused_result,
    1121             :                     "ignoring return value of function "
    1122             :                     "declared with attribute %<warn_unused_result%>");
    1123             :     }
    1124             : }
    1125             : 
    1126             : /* When an expression is used in a void context, its value is discarded and
    1127             :    no lvalue-rvalue and similar conversions happen [expr.static.cast/4,
    1128             :    stmt.expr/1, expr.comma/1].  This permits dereferencing an incomplete type
    1129             :    in a void context. The C++ standard does not define what an `access' to an
    1130             :    object is, but there is reason to believe that it is the lvalue to rvalue
    1131             :    conversion -- if it were not, `*&*p = 1' would violate [expr]/4 in that it
    1132             :    accesses `*p' not to calculate the value to be stored. But, dcl.type.cv/8
    1133             :    indicates that volatile semantics should be the same between C and C++
    1134             :    where ever possible. C leaves it implementation defined as to what
    1135             :    constitutes an access to a volatile. So, we interpret `*vp' as a read of
    1136             :    the volatile object `vp' points to, unless that is an incomplete type. For
    1137             :    volatile references we do not do this interpretation, because that would
    1138             :    make it impossible to ignore the reference return value from functions. We
    1139             :    issue warnings in the confusing cases.
    1140             : 
    1141             :    The IMPLICIT is ICV_CAST when the user is explicitly converting an expression
    1142             :    to void via a cast. If an expression is being implicitly converted, IMPLICIT
    1143             :    indicates the context of the implicit conversion.  */
    1144             : 
    1145             : tree
    1146    42020958 : convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain)
    1147             : {
    1148    42020958 :   location_t loc = cp_expr_loc_or_input_loc (expr);
    1149             : 
    1150    42020958 :   if (expr == error_mark_node
    1151    42020958 :       || TREE_TYPE (expr) == error_mark_node)
    1152             :     return error_mark_node;
    1153             : 
    1154    41996577 :   expr = maybe_undo_parenthesized_ref (expr);
    1155             : 
    1156    41996577 :   expr = mark_discarded_use (expr);
    1157    41996577 :   if (implicit == ICV_CAST)
    1158             :     /* An explicit cast to void avoids all -Wunused-but-set* warnings.  */
    1159      133330 :     mark_exp_read (expr);
    1160             : 
    1161    41996577 :   if (!TREE_TYPE (expr))
    1162             :     return expr;
    1163    41996577 :   if (invalid_nonstatic_memfn_p (loc, expr, complain))
    1164          25 :     return error_mark_node;
    1165    41996552 :   if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
    1166             :     {
    1167           8 :       if (complain & tf_error)
    1168           8 :         error_at (loc, "pseudo-destructor is not called");
    1169           8 :       return error_mark_node;
    1170             :     }
    1171             : 
    1172             :   /* Explicitly evaluate void-converted concept checks since their
    1173             :      satisfaction may produce ill-formed programs.  */
    1174    41996544 :    if (concept_check_p (expr))
    1175          11 :      expr = evaluate_concept_check (expr);
    1176             : 
    1177    41996544 :   if (VOID_TYPE_P (TREE_TYPE (expr)))
    1178             :     return expr;
    1179    23873045 :   switch (TREE_CODE (expr))
    1180             :     {
    1181        1034 :     case COND_EXPR:
    1182        1034 :       {
    1183             :         /* The two parts of a cond expr might be separate lvalues.  */
    1184        1034 :         tree op1 = TREE_OPERAND (expr,1);
    1185        1034 :         tree op2 = TREE_OPERAND (expr,2);
    1186        1034 :         bool side_effects = ((op1 && TREE_SIDE_EFFECTS (op1))
    1187        1322 :                              || TREE_SIDE_EFFECTS (op2));
    1188        1034 :         tree new_op1, new_op2;
    1189        1034 :         new_op1 = NULL_TREE;
    1190        1034 :         if (implicit != ICV_CAST && !side_effects)
    1191             :           {
    1192          62 :             if (op1)
    1193          62 :               new_op1 = convert_to_void (op1, ICV_SECOND_OF_COND, complain);
    1194          62 :             new_op2 = convert_to_void (op2, ICV_THIRD_OF_COND, complain);
    1195             :           }
    1196             :         else
    1197             :           {
    1198         972 :             if (op1)
    1199         972 :               new_op1 = convert_to_void (op1, ICV_CAST, complain);
    1200         972 :             new_op2 = convert_to_void (op2, ICV_CAST, complain);
    1201             :           }
    1202             : 
    1203        1034 :         expr = build3_loc (loc, COND_EXPR, TREE_TYPE (new_op2),
    1204        1034 :                            TREE_OPERAND (expr, 0), new_op1, new_op2);
    1205        1034 :         break;
    1206             :       }
    1207             : 
    1208      202017 :     case COMPOUND_EXPR:
    1209      202017 :       {
    1210             :         /* The second part of a compound expr contains the value.  */
    1211      202017 :         tree op1 = TREE_OPERAND (expr,1);
    1212      202017 :         tree new_op1;
    1213      202017 :         if (implicit != ICV_CAST && !warning_suppressed_p (expr /* What warning? */))
    1214      138726 :           new_op1 = convert_to_void (op1, ICV_RIGHT_OF_COMMA, complain);
    1215             :         else
    1216       63291 :           new_op1 = convert_to_void (op1, ICV_CAST, complain);
    1217             : 
    1218      202017 :         if (new_op1 != op1)
    1219             :           {
    1220      202017 :             tree t = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (new_op1),
    1221      202017 :                                  TREE_OPERAND (expr, 0), new_op1);
    1222      202017 :             expr = t;
    1223             :           }
    1224             : 
    1225             :         break;
    1226             :       }
    1227             : 
    1228             :     case NON_LVALUE_EXPR:
    1229             :     case NOP_EXPR:
    1230             :       /* These have already decayed to rvalue.  */
    1231             :       break;
    1232             : 
    1233      823381 :     case CALL_EXPR:   /* We have a special meaning for volatile void fn().  */
    1234             :       /* cdtors may return this or void, depending on
    1235             :          targetm.cxx.cdtor_returns_this, but this shouldn't affect our
    1236             :          decisions here: neither nodiscard warnings (nodiscard dtors
    1237             :          are nonsensical and ctors have a different behavior with that
    1238             :          attribute that is handled in the TARGET_EXPR case), nor should
    1239             :          any constexpr or template instantiations be affected by an ABI
    1240             :          property that is, or at least ought to be transparent to the
    1241             :          language.  */
    1242      823381 :       if (tree fn = cp_get_callee_fndecl_nofold (expr))
    1243     1629162 :         if (DECL_CONSTRUCTOR_P (fn) || DECL_DESTRUCTOR_P (fn))
    1244             :           return expr;
    1245             : 
    1246      823381 :       if (complain & tf_warning)
    1247      783207 :         maybe_warn_nodiscard (expr, implicit);
    1248             :       break;
    1249             : 
    1250      662020 :     case INDIRECT_REF:
    1251      662020 :       {
    1252      662020 :         tree type = TREE_TYPE (expr);
    1253      662020 :         int is_reference = TYPE_REF_P (TREE_TYPE (TREE_OPERAND (expr, 0)));
    1254      662020 :         int is_volatile = TYPE_VOLATILE (type);
    1255      662020 :         int is_complete = COMPLETE_TYPE_P (complete_type (type));
    1256             : 
    1257             :         /* Can't load the value if we don't know the type.  */
    1258      662020 :         if (is_volatile && !is_complete)
    1259             :           {
    1260          52 :             if (complain & tf_warning)
    1261          52 :               switch (implicit)
    1262             :                 {
    1263          32 :                   case ICV_CAST:
    1264          32 :                     warning_at (loc, 0, "conversion to void will not access "
    1265             :                                 "object of incomplete type %qT", type);
    1266          32 :                     break;
    1267           0 :                   case ICV_SECOND_OF_COND:
    1268           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1269             :                                 "incomplete type %qT in second operand "
    1270             :                                 "of conditional expression", type);
    1271           0 :                     break;
    1272           0 :                   case ICV_THIRD_OF_COND:
    1273           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1274             :                                 "incomplete type %qT in third operand "
    1275             :                                 "of conditional expression", type);
    1276           0 :                     break;
    1277           0 :                   case ICV_RIGHT_OF_COMMA:
    1278           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1279             :                                 "incomplete type %qT in right operand of "
    1280             :                                 "comma operator", type);
    1281           0 :                     break;
    1282           0 :                   case ICV_LEFT_OF_COMMA:
    1283           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1284             :                                 "incomplete type %qT in left operand of "
    1285             :                                 "comma operator", type);
    1286           0 :                     break;
    1287          20 :                   case ICV_STATEMENT:
    1288          20 :                     warning_at (loc, 0, "indirection will not access object of "
    1289             :                                 "incomplete type %qT in statement", type);
    1290          20 :                      break;
    1291           0 :                   case ICV_THIRD_IN_FOR:
    1292           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1293             :                                 "incomplete type %qT in for increment "
    1294             :                                 "expression", type);
    1295           0 :                     break;
    1296           0 :                   default:
    1297           0 :                     gcc_unreachable ();
    1298             :                 }
    1299             :           }
    1300             :         /* Don't load the value if this is an implicit dereference, or if
    1301             :            the type needs to be handled by ctors/dtors.  */
    1302      661968 :         else if (is_volatile && is_reference)
    1303             :           {
    1304         125 :             if (complain & tf_warning)
    1305          52 :               switch (implicit)
    1306             :                 {
    1307          32 :                   case ICV_CAST:
    1308          32 :                     warning_at (loc, 0, "conversion to void will not access "
    1309             :                                 "object of type %qT", type);
    1310          32 :                     break;
    1311           0 :                   case ICV_SECOND_OF_COND:
    1312           0 :                     warning_at (loc, 0, "implicit dereference will not access "
    1313             :                                 "object of type %qT in second operand of "
    1314             :                                 "conditional expression", type);
    1315           0 :                     break;
    1316           0 :                   case ICV_THIRD_OF_COND:
    1317           0 :                     warning_at (loc, 0, "implicit dereference will not access "
    1318             :                                 "object of type %qT in third operand of "
    1319             :                                 "conditional expression", type);
    1320           0 :                     break;
    1321           0 :                   case ICV_RIGHT_OF_COMMA:
    1322           0 :                     warning_at (loc, 0, "implicit dereference will not access "
    1323             :                                 "object of type %qT in right operand of "
    1324             :                                 "comma operator", type);
    1325           0 :                     break;
    1326           0 :                   case ICV_LEFT_OF_COMMA:
    1327           0 :                     warning_at (loc, 0, "implicit dereference will not access "
    1328             :                                 "object of type %qT in left operand of comma "
    1329             :                                 "operator", type);
    1330           0 :                     break;
    1331          20 :                   case ICV_STATEMENT:
    1332          20 :                     warning_at (loc, 0, "implicit dereference will not access "
    1333             :                                 "object of type %qT in statement",  type);
    1334          20 :                      break;
    1335           0 :                   case ICV_THIRD_IN_FOR:
    1336           0 :                     warning_at (loc, 0, "implicit dereference will not access "
    1337             :                                 "object of type %qT in for increment expression",
    1338             :                                 type);
    1339           0 :                     break;
    1340           0 :                   default:
    1341           0 :                     gcc_unreachable ();
    1342             :                 }
    1343             :           }
    1344      661843 :         else if (is_volatile && TREE_ADDRESSABLE (type))
    1345             :           {
    1346           4 :             if (complain & tf_warning)
    1347           4 :               switch (implicit)
    1348             :                 {
    1349           0 :                   case ICV_CAST:
    1350           0 :                     warning_at (loc, 0, "conversion to void will not access "
    1351             :                                 "object of non-trivially-copyable type %qT",
    1352             :                                 type);
    1353           0 :                     break;
    1354           0 :                   case ICV_SECOND_OF_COND:
    1355           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1356             :                                 "non-trivially-copyable type %qT in second "
    1357             :                                 "operand of conditional expression", type);
    1358           0 :                     break;
    1359           0 :                   case ICV_THIRD_OF_COND:
    1360           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1361             :                                 "non-trivially-copyable type %qT in third "
    1362             :                                 "operand of conditional expression", type);
    1363           0 :                     break;
    1364           0 :                   case ICV_RIGHT_OF_COMMA:
    1365           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1366             :                                 "non-trivially-copyable type %qT in right "
    1367             :                                 "operand of comma operator", type);
    1368           0 :                     break;
    1369           0 :                   case ICV_LEFT_OF_COMMA:
    1370           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1371             :                                 "non-trivially-copyable type %qT in left "
    1372             :                                 "operand of comma operator", type);
    1373           0 :                     break;
    1374           4 :                   case ICV_STATEMENT:
    1375           4 :                     warning_at (loc, 0, "indirection will not access object of "
    1376             :                                 "non-trivially-copyable type %qT in statement",
    1377             :                                 type);
    1378           4 :                      break;
    1379           0 :                   case ICV_THIRD_IN_FOR:
    1380           0 :                     warning_at (loc, 0, "indirection will not access object of "
    1381             :                                 "non-trivially-copyable type %qT in for "
    1382             :                                 "increment expression", type);
    1383           0 :                     break;
    1384           0 :                   default:
    1385           0 :                     gcc_unreachable ();
    1386             :                 }
    1387             :           }
    1388      662020 :         if (is_reference || !is_volatile || !is_complete || TREE_ADDRESSABLE (type))
    1389             :           {
    1390             :             /* Emit a warning (if enabled) when the "effect-less" INDIRECT_REF
    1391             :                operation is stripped off. Note that we don't warn about
    1392             :                - an expression with TREE_NO_WARNING set. (For an example of
    1393             :                  such expressions, see build_over_call in call.cc.)
    1394             :                - automatic dereferencing of references, since the user cannot
    1395             :                  control it. (See also warn_if_unused_value() in c-common.cc.)  */
    1396      661916 :             if (warn_unused_value
    1397       10704 :                 && implicit != ICV_CAST
    1398        9878 :                 && (complain & tf_warning)
    1399        8736 :                 && !warning_suppressed_p (expr, OPT_Wunused_value)
    1400      667578 :                 && !is_reference)
    1401          12 :               warning_at (loc, OPT_Wunused_value, "value computed is not used");
    1402      661916 :             expr = TREE_OPERAND (expr, 0);
    1403      661916 :             if (TREE_CODE (expr) == CALL_EXPR
    1404      573384 :                 && (complain & tf_warning))
    1405      545749 :               maybe_warn_nodiscard (expr, implicit);
    1406             :           }
    1407             : 
    1408             :         break;
    1409             :       }
    1410             : 
    1411        6046 :     case VAR_DECL:
    1412        6046 :       {
    1413             :         /* External variables might be incomplete.  */
    1414        6046 :         tree type = TREE_TYPE (expr);
    1415        6046 :         int is_complete = COMPLETE_TYPE_P (complete_type (type));
    1416             : 
    1417        6046 :         if (TYPE_VOLATILE (type) && !is_complete && (complain & tf_warning))
    1418          20 :           switch (implicit)
    1419             :             {
    1420          16 :               case ICV_CAST:
    1421          16 :                 warning_at (loc, 0, "conversion to void will not access "
    1422             :                             "object %qE of incomplete type %qT", expr, type);
    1423          16 :                 break;
    1424           0 :               case ICV_SECOND_OF_COND:
    1425           0 :                 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
    1426             :                             "not be accessed in second operand of "
    1427             :                             "conditional expression", expr, type);
    1428           0 :                 break;
    1429           0 :               case ICV_THIRD_OF_COND:
    1430           0 :                 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
    1431             :                             "not be accessed in third operand of "
    1432             :                             "conditional expression", expr, type);
    1433           0 :                 break;
    1434           0 :               case ICV_RIGHT_OF_COMMA:
    1435           0 :                 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
    1436             :                             "not be accessed in right operand of comma operator",
    1437             :                             expr, type);
    1438           0 :                 break;
    1439           0 :               case ICV_LEFT_OF_COMMA:
    1440           0 :                 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
    1441             :                             "not be accessed in left operand of comma operator",
    1442             :                             expr, type);
    1443           0 :                 break;
    1444           4 :               case ICV_STATEMENT:
    1445           4 :                 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
    1446             :                             "not be accessed in statement", expr, type);
    1447           4 :                 break;
    1448           0 :               case ICV_THIRD_IN_FOR:
    1449           0 :                 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
    1450             :                             "not be accessed in for increment expression",
    1451             :                             expr, type);
    1452           0 :                 break;
    1453           0 :               default:
    1454           0 :                 gcc_unreachable ();
    1455             :             }
    1456             : 
    1457             :         break;
    1458             :       }
    1459             : 
    1460       69204 :     case TARGET_EXPR:
    1461             :       /* Don't bother with the temporary object returned from a function if
    1462             :          we don't use it, don't need to destroy it, and won't abort in
    1463             :          assign_temp.  We'll still
    1464             :          allocate space for it in expand_call or declare_return_variable,
    1465             :          but we don't need to track it through all the tree phases.  */
    1466       69204 :       if (TARGET_EXPR_IMPLICIT_P (expr)
    1467       69204 :           && !TREE_ADDRESSABLE (TREE_TYPE (expr)))
    1468             :         {
    1469       35299 :           tree init = TARGET_EXPR_INITIAL (expr);
    1470       35299 :           if (TREE_CODE (init) == AGGR_INIT_EXPR
    1471       35299 :               && !AGGR_INIT_VIA_CTOR_P (init))
    1472             :             {
    1473           0 :               tree fn = AGGR_INIT_EXPR_FN (init);
    1474           0 :               expr = build_call_array_loc (input_location,
    1475           0 :                                            TREE_TYPE (TREE_TYPE
    1476             :                                                       (TREE_TYPE (fn))),
    1477             :                                            fn,
    1478           0 :                                            aggr_init_expr_nargs (init),
    1479           0 :                                            AGGR_INIT_EXPR_ARGP (init));
    1480             :             }
    1481             :         }
    1482       69204 :       if (complain & tf_warning)
    1483       13592 :         maybe_warn_nodiscard (expr, implicit);
    1484             :       break;
    1485             : 
    1486    23873045 :     default:;
    1487             :     }
    1488    23873045 :   expr = resolve_nondeduced_context (expr, complain);
    1489    23873045 :   if (!mark_single_function (expr, complain))
    1490           1 :     return error_mark_node;
    1491             : 
    1492    23873044 :   {
    1493    23873044 :     tree probe = expr;
    1494             : 
    1495    23873044 :     if (TREE_CODE (probe) == ADDR_EXPR)
    1496       10805 :       probe = TREE_OPERAND (expr, 0);
    1497    23873044 :     if (type_unknown_p (probe))
    1498             :       {
    1499             :         /* [over.over] enumerates the places where we can take the address
    1500             :            of an overloaded function, and this is not one of them.  */
    1501          52 :         if (complain & tf_error)
    1502          51 :           switch (implicit)
    1503             :             {
    1504          16 :               case ICV_CAST:
    1505          16 :                 error_at (loc, "conversion to void "
    1506             :                           "cannot resolve address of overloaded function");
    1507          16 :                 break;
    1508           0 :               case ICV_SECOND_OF_COND:
    1509           0 :                 error_at (loc, "second operand of conditional expression "
    1510             :                           "cannot resolve address of overloaded function");
    1511           0 :                 break;
    1512           0 :               case ICV_THIRD_OF_COND:
    1513           0 :                 error_at (loc, "third operand of conditional expression "
    1514             :                           "cannot resolve address of overloaded function");
    1515           0 :                 break;
    1516           0 :               case ICV_RIGHT_OF_COMMA:
    1517           0 :                 error_at (loc, "right operand of comma operator "
    1518             :                           "cannot resolve address of overloaded function");
    1519           0 :                 break;
    1520           0 :               case ICV_LEFT_OF_COMMA:
    1521           0 :                 error_at (loc, "left operand of comma operator "
    1522             :                           "cannot resolve address of overloaded function");
    1523           0 :                 break;
    1524          35 :               case ICV_STATEMENT:
    1525          35 :                 error_at (loc, "statement "
    1526             :                           "cannot resolve address of overloaded function");
    1527          35 :                 break;
    1528           0 :               case ICV_THIRD_IN_FOR:
    1529           0 :                 error_at (loc, "for increment expression "
    1530             :                           "cannot resolve address of overloaded function");
    1531           0 :                 break;
    1532             :             }
    1533             :         else
    1534           1 :           return error_mark_node;
    1535          51 :         expr = void_node;
    1536             :       }
    1537    23872992 :     else if (implicit != ICV_CAST && probe == expr && is_overloaded_fn (probe))
    1538             :       {
    1539             :         /* Only warn when there is no &.  */
    1540         114 :         if (complain & tf_warning)
    1541         114 :           switch (implicit)
    1542             :             {
    1543           4 :               case ICV_SECOND_OF_COND:
    1544           4 :                 warning_at (loc, OPT_Waddress,
    1545             :                             "second operand of conditional expression "
    1546             :                             "is a reference, not call, to function %qE", expr);
    1547           4 :                 break;
    1548           4 :               case ICV_THIRD_OF_COND:
    1549           4 :                 warning_at (loc, OPT_Waddress,
    1550             :                             "third operand of conditional expression "
    1551             :                             "is a reference, not call, to function %qE", expr);
    1552           4 :                 break;
    1553           0 :               case ICV_RIGHT_OF_COMMA:
    1554           0 :                 warning_at (loc, OPT_Waddress,
    1555             :                             "right operand of comma operator "
    1556             :                             "is a reference, not call, to function %qE", expr);
    1557           0 :                 break;
    1558           9 :               case ICV_LEFT_OF_COMMA:
    1559           9 :                 warning_at (loc, OPT_Waddress,
    1560             :                             "left operand of comma operator "
    1561             :                             "is a reference, not call, to function %qE", expr);
    1562           9 :                 break;
    1563          97 :               case ICV_STATEMENT:
    1564          97 :                 warning_at (loc, OPT_Waddress,
    1565             :                             "statement is a reference, not call, to function %qE",
    1566             :                             expr);
    1567          97 :                 break;
    1568           0 :               case ICV_THIRD_IN_FOR:
    1569           0 :                 warning_at (loc, OPT_Waddress,
    1570             :                             "for increment expression "
    1571             :                             "is a reference, not call, to function %qE", expr);
    1572           0 :                 break;
    1573           0 :               default:
    1574           0 :                 gcc_unreachable ();
    1575             :             }
    1576             : 
    1577         114 :         if (TREE_CODE (expr) == COMPONENT_REF)
    1578          12 :           expr = TREE_OPERAND (expr, 0);
    1579             :       }
    1580             :   }
    1581             : 
    1582    23873043 :   if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr)))
    1583             :     {
    1584    23669941 :       if (implicit != ICV_CAST
    1585    23548336 :           && warn_unused_value
    1586      451489 :           && !warning_suppressed_p (expr, OPT_Wunused_value)
    1587      436908 :           && !processing_template_decl
    1588      387946 :           && !cp_unevaluated_operand
    1589    24051297 :           && (complain & tf_warning))
    1590             :         {
    1591             :           /* The middle end does not warn about expressions that have
    1592             :              been explicitly cast to void, so we must do so here.  */
    1593      381348 :           if (!TREE_SIDE_EFFECTS (expr))
    1594             :             {
    1595         124 :               switch (implicit)
    1596             :                 {
    1597           4 :                   case ICV_SECOND_OF_COND:
    1598           4 :                     warning_at (loc, OPT_Wunused_value,
    1599             :                                 "second operand of conditional expression "
    1600             :                                 "has no effect");
    1601           4 :                     break;
    1602           4 :                   case ICV_THIRD_OF_COND:
    1603           4 :                     warning_at (loc, OPT_Wunused_value,
    1604             :                                 "third operand of conditional expression "
    1605             :                                 "has no effect");
    1606           4 :                     break;
    1607          48 :                   case ICV_RIGHT_OF_COMMA:
    1608          48 :                     warning_at (loc, OPT_Wunused_value,
    1609             :                                 "right operand of comma operator has no effect");
    1610          48 :                     break;
    1611          16 :                   case ICV_LEFT_OF_COMMA:
    1612          16 :                     warning_at (loc, OPT_Wunused_value,
    1613             :                                 "left operand of comma operator has no effect");
    1614          16 :                     break;
    1615          52 :                   case ICV_STATEMENT:
    1616          52 :                     warning_at (loc, OPT_Wunused_value,
    1617             :                                 "statement has no effect");
    1618          52 :                     break;
    1619           0 :                   case ICV_THIRD_IN_FOR:
    1620           0 :                     warning_at (loc, OPT_Wunused_value,
    1621             :                                 "for increment expression has no effect");
    1622           0 :                     break;
    1623           0 :                   default:
    1624           0 :                     gcc_unreachable ();
    1625             :                 }
    1626             :             }
    1627             :           else
    1628             :             {
    1629             :               tree e = expr;
    1630             :               /* We might like to warn about (say) "(int) f()", as the
    1631             :                  cast has no effect, but the compiler itself will
    1632             :                  generate implicit conversions under some
    1633             :                  circumstances.  (For example a block copy will be
    1634             :                  turned into a call to "__builtin_memcpy", with a
    1635             :                  conversion of the return value to an appropriate
    1636             :                  type.)  So, to avoid false positives, we strip
    1637             :                  conversions.  Do not use STRIP_NOPs because it will
    1638             :                  not strip conversions to "void", as that is not a
    1639             :                  mode-preserving conversion.  */
    1640      381546 :               while (TREE_CODE (e) == NOP_EXPR)
    1641         322 :                 e = TREE_OPERAND (e, 0);
    1642             : 
    1643      381224 :               enum tree_code code = TREE_CODE (e);
    1644      381224 :               enum tree_code_class tclass = TREE_CODE_CLASS (code);
    1645      381224 :               if (tclass == tcc_comparison
    1646             :                   || tclass == tcc_unary
    1647      381224 :                   || tclass == tcc_binary
    1648             :                   || code == VEC_PERM_EXPR
    1649      381124 :                   || code == VEC_COND_EXPR)
    1650         108 :                 warn_if_unused_value (e, loc);
    1651             :             }
    1652             :         }
    1653    23669937 :       expr = build1 (CONVERT_EXPR, void_type_node, expr);
    1654             :     }
    1655    23873039 :   if (! TREE_SIDE_EFFECTS (expr))
    1656      187366 :     expr = void_node;
    1657             :   return expr;
    1658             : }
    1659             : 
    1660             : /* Create an expression whose value is that of EXPR,
    1661             :    converted to type TYPE.  The TREE_TYPE of the value
    1662             :    is always TYPE.  This function implements all reasonable
    1663             :    conversions; callers should filter out those that are
    1664             :    not permitted by the language being compiled.
    1665             : 
    1666             :    Most of this routine is from build_reinterpret_cast.
    1667             : 
    1668             :    The back end cannot call cp_convert (what was convert) because
    1669             :    conversions to/from basetypes may involve memory references
    1670             :    (vbases) and adding or subtracting small values (multiple
    1671             :    inheritance), but it calls convert from the constant folding code
    1672             :    on subtrees of already built trees after it has ripped them apart.
    1673             : 
    1674             :    Also, if we ever support range variables, we'll probably also have to
    1675             :    do a little bit more work.  */
    1676             : 
    1677             : tree
    1678    94900724 : convert (tree type, tree expr)
    1679             : {
    1680    94900724 :   tree intype;
    1681             : 
    1682    94900724 :   if (type == error_mark_node || expr == error_mark_node)
    1683             :     return error_mark_node;
    1684             : 
    1685    94898697 :   intype = TREE_TYPE (expr);
    1686             : 
    1687    94898697 :   if (INDIRECT_TYPE_P (type) && INDIRECT_TYPE_P (intype))
    1688    21481431 :     return build_nop (type, expr);
    1689             : 
    1690    73417266 :   return ocp_convert (type, expr, CONV_BACKEND_CONVERT,
    1691             :                       LOOKUP_NORMAL|LOOKUP_NO_CONVERSION,
    1692    73417266 :                       tf_warning_or_error);
    1693             : }
    1694             : 
    1695             : /* Like convert, but in a static initializer (called from
    1696             :    convert_and_check).  */
    1697             : 
    1698             : tree
    1699           0 : convert_init (tree type, tree expr)
    1700             : {
    1701           0 :   return convert (type, expr);
    1702             : }
    1703             : 
    1704             : /* Like cp_convert, except permit conversions to take place which
    1705             :    are not normally allowed due to access restrictions
    1706             :    (such as conversion from sub-type to private super-type).  */
    1707             : 
    1708             : tree
    1709     4789296 : convert_force (tree type, tree expr, int convtype, tsubst_flags_t complain)
    1710             : {
    1711     4789296 :   tree e = expr;
    1712     4789296 :   enum tree_code code = TREE_CODE (type);
    1713             : 
    1714     4789296 :   if (code == REFERENCE_TYPE)
    1715           0 :     return convert_to_reference (type, e, CONV_C_CAST, 0,
    1716           0 :                                  NULL_TREE, complain);
    1717             : 
    1718     4789296 :   if (code == POINTER_TYPE)
    1719     4789296 :     return convert_to_pointer_force (type, e, complain);
    1720             : 
    1721             :   /* From typeck.cc convert_for_assignment */
    1722           0 :   if (((TYPE_PTR_P (TREE_TYPE (e)) && TREE_CODE (e) == ADDR_EXPR
    1723           0 :         && TREE_CODE (TREE_TYPE (TREE_TYPE (e))) == METHOD_TYPE)
    1724           0 :        || integer_zerop (e)
    1725           0 :        || TYPE_PTRMEMFUNC_P (TREE_TYPE (e)))
    1726           0 :       && TYPE_PTRMEMFUNC_P (type))
    1727             :     /* compatible pointer to member functions.  */
    1728           0 :     return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1,
    1729           0 :                              /*c_cast_p=*/1, complain);
    1730             : 
    1731           0 :   return ocp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL, complain);
    1732             : }
    1733             : 
    1734             : /* Convert an aggregate EXPR to type XTYPE.  If a conversion
    1735             :    exists, return the attempted conversion.  This may
    1736             :    return ERROR_MARK_NODE if the conversion is not
    1737             :    allowed (references private members, etc).
    1738             :    If no conversion exists, NULL_TREE is returned.
    1739             : 
    1740             :    FIXME: Ambiguity checking is wrong.  Should choose one by the implicit
    1741             :    object parameter, or by the second standard conversion sequence if
    1742             :    that doesn't do it.  This will probably wait for an overloading rewrite.
    1743             :    (jason 8/9/95)  */
    1744             : 
    1745             : static tree
    1746           6 : build_type_conversion (tree xtype, tree expr)
    1747             : {
    1748             :   /* C++: check to see if we can convert this aggregate type
    1749             :      into the required type.  */
    1750           6 :   return build_user_type_conversion (xtype, expr, LOOKUP_NORMAL,
    1751           4 :                                      tf_warning_or_error);
    1752             : }
    1753             : 
    1754             : /* Convert the given EXPR to one of a group of types suitable for use in an
    1755             :    expression.  DESIRES is a combination of various WANT_* flags (q.v.)
    1756             :    which indicates which types are suitable.  If COMPLAIN is true, complain
    1757             :    about ambiguity; otherwise, the caller will deal with it.  */
    1758             : 
    1759             : tree
    1760    20207594 : build_expr_type_conversion (int desires, tree expr, bool complain)
    1761             : {
    1762    20207594 :   tree basetype = TREE_TYPE (expr);
    1763    20207594 :   tree conv = NULL_TREE;
    1764    20207594 :   tree winner = NULL_TREE;
    1765             : 
    1766    20207594 :   if (null_node_p (expr)
    1767             :       && (desires & WANT_INT)
    1768    20207594 :       && !(desires & WANT_NULL))
    1769             :     {
    1770          48 :       location_t loc =
    1771          48 :         expansion_point_location_if_in_system_header (input_location);
    1772             : 
    1773          48 :       warning_at (loc, OPT_Wconversion_null,
    1774             :                   "converting NULL to non-pointer type");
    1775             :     }
    1776             : 
    1777    20207594 :   if (basetype == error_mark_node)
    1778             :     return error_mark_node;
    1779             : 
    1780    20207780 :   if (! MAYBE_CLASS_TYPE_P (basetype))
    1781    20207394 :     switch (TREE_CODE (basetype))
    1782             :       {
    1783    14344921 :       case INTEGER_TYPE:
    1784    14344921 :         if ((desires & WANT_NULL) && null_ptr_cst_p (expr))
    1785             :           return expr;
    1786             :         /* fall through.  */
    1787             : 
    1788    14367902 :       case BOOLEAN_TYPE:
    1789    16374425 :         return (desires & WANT_INT) ? expr : NULL_TREE;
    1790       40705 :       case ENUMERAL_TYPE:
    1791       42761 :         return (desires & WANT_ENUM) ? expr : NULL_TREE;
    1792     1277129 :       case REAL_TYPE:
    1793     1277180 :         return (desires & WANT_FLOAT) ? expr : NULL_TREE;
    1794     3743653 :       case POINTER_TYPE:
    1795     5007924 :         return (desires & WANT_POINTER) ? expr : NULL_TREE;
    1796             : 
    1797      707295 :       case FUNCTION_TYPE:
    1798      707295 :       case ARRAY_TYPE:
    1799      707295 :         return (desires & WANT_POINTER) ? decay_conversion (expr,
    1800             :                                                             tf_warning_or_error)
    1801             :                                         : NULL_TREE;
    1802             : 
    1803       55283 :       case VECTOR_TYPE:
    1804       55283 :         if (!gnu_vector_type_p (basetype))
    1805             :           return NULL_TREE;
    1806             :         /* FALLTHROUGH */
    1807       70643 :       case COMPLEX_TYPE:
    1808       70643 :         if ((desires & WANT_VECTOR_OR_COMPLEX) == 0)
    1809             :           return NULL_TREE;
    1810       33396 :         switch (TREE_CODE (TREE_TYPE (basetype)))
    1811             :           {
    1812         348 :           case INTEGER_TYPE:
    1813         348 :           case BOOLEAN_TYPE:
    1814         348 :             return (desires & WANT_INT) ? expr : NULL_TREE;
    1815           0 :           case ENUMERAL_TYPE:
    1816           0 :             return (desires & WANT_ENUM) ? expr : NULL_TREE;
    1817       33048 :           case REAL_TYPE:
    1818       33056 :             return (desires & WANT_FLOAT) ? expr : NULL_TREE;
    1819             :           default:
    1820             :             return NULL_TREE;
    1821             :           }
    1822             : 
    1823             :       default:
    1824             :         return NULL_TREE;
    1825             :       }
    1826             : 
    1827             :   /* The code for conversions from class type is currently only used for
    1828             :      delete expressions.  Other expressions are handled by build_new_op.  */
    1829         185 :   if (!complete_type_or_maybe_complain (basetype, expr, complain))
    1830           0 :     return error_mark_node;
    1831         185 :   if (!TYPE_HAS_CONVERSION (basetype))
    1832             :     return NULL_TREE;
    1833             : 
    1834         390 :   for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv))
    1835             :     {
    1836         216 :       int win = 0;
    1837         216 :       tree candidate;
    1838         216 :       tree cand = TREE_VALUE (conv);
    1839         216 :       cand = OVL_FIRST (cand);
    1840             : 
    1841         216 :       if (winner && winner == cand)
    1842           0 :         continue;
    1843             : 
    1844         216 :       if (DECL_NONCONVERTING_P (cand))
    1845           3 :         continue;
    1846             : 
    1847         213 :       candidate = non_reference (TREE_TYPE (TREE_TYPE (cand)));
    1848             : 
    1849         213 :       switch (TREE_CODE (candidate))
    1850             :         {
    1851         150 :         case BOOLEAN_TYPE:
    1852         150 :         case INTEGER_TYPE:
    1853         150 :           win = (desires & WANT_INT); break;
    1854          12 :         case ENUMERAL_TYPE:
    1855          12 :           win = (desires & WANT_ENUM); break;
    1856           3 :         case REAL_TYPE:
    1857           3 :           win = (desires & WANT_FLOAT); break;
    1858          44 :         case POINTER_TYPE:
    1859          44 :           win = (desires & WANT_POINTER); break;
    1860             : 
    1861           0 :         case COMPLEX_TYPE:
    1862           0 :         case VECTOR_TYPE:
    1863           0 :           if ((desires & WANT_VECTOR_OR_COMPLEX) == 0)
    1864             :             break;
    1865           0 :           switch (TREE_CODE (TREE_TYPE (candidate)))
    1866             :             {
    1867           0 :             case BOOLEAN_TYPE:
    1868           0 :             case INTEGER_TYPE:
    1869           0 :               win = (desires & WANT_INT); break;
    1870           0 :             case ENUMERAL_TYPE:
    1871           0 :               win = (desires & WANT_ENUM); break;
    1872           0 :             case REAL_TYPE:
    1873           0 :               win = (desires & WANT_FLOAT); break;
    1874             :             default:
    1875             :               break;
    1876             :             }
    1877             :           break;
    1878             : 
    1879           4 :         default:
    1880             :           /* A wildcard could be instantiated to match any desired
    1881             :              type, but we can't deduce the template argument.  */
    1882           4 :           if (WILDCARD_TYPE_P (candidate))
    1883             :             win = true;
    1884             :           break;
    1885             :         }
    1886             : 
    1887         209 :       if (win)
    1888             :         {
    1889         198 :           if (TREE_CODE (cand) == TEMPLATE_DECL)
    1890             :             {
    1891           8 :               if (complain)
    1892           8 :                 error ("default type conversion cannot deduce template"
    1893             :                        " argument for %qD", cand);
    1894           8 :               return error_mark_node;
    1895             :             }
    1896             : 
    1897         190 :           if (winner)
    1898             :             {
    1899          19 :               tree winner_type
    1900          19 :                 = non_reference (TREE_TYPE (TREE_TYPE (winner)));
    1901             : 
    1902          19 :               if (!same_type_ignoring_top_level_qualifiers_p (winner_type,
    1903             :                                                               candidate))
    1904             :                 {
    1905           3 :                   if (complain)
    1906             :                     {
    1907           3 :                       error ("ambiguous default type conversion from %qT",
    1908             :                              basetype);
    1909           3 :                       inform (input_location,
    1910             :                               "  candidate conversions include %qD and %qD",
    1911             :                               winner, cand);
    1912             :                     }
    1913           3 :                   return error_mark_node;
    1914             :                 }
    1915             :             }
    1916             : 
    1917             :           winner = cand;
    1918             :         }
    1919             :     }
    1920             : 
    1921         174 :   if (winner)
    1922             :     {
    1923         168 :       tree type = non_reference (TREE_TYPE (TREE_TYPE (winner)));
    1924         168 :       return build_user_type_conversion (type, expr, LOOKUP_NORMAL,
    1925         168 :                                          tf_warning_or_error);
    1926             :     }
    1927             : 
    1928             :   return NULL_TREE;
    1929             : }
    1930             : 
    1931             : /* Implements integral promotion (4.1) and float->double promotion.  */
    1932             : 
    1933             : tree
    1934   178835788 : type_promotes_to (tree type)
    1935             : {
    1936   181242669 :   tree promoted_type;
    1937             : 
    1938   181242669 :   if (type == error_mark_node)
    1939             :     return error_mark_node;
    1940             : 
    1941   181242669 :   type = TYPE_MAIN_VARIANT (type);
    1942             : 
    1943             :   /* Check for promotions of target-defined types first.  */
    1944   181242669 :   promoted_type = targetm.promoted_type (type);
    1945   181242669 :   if (promoted_type)
    1946             :     return promoted_type;
    1947             : 
    1948             :   /* bool always promotes to int (not unsigned), even if it's the same
    1949             :      size.  */
    1950   181242669 :   if (TREE_CODE (type) == BOOLEAN_TYPE)
    1951     2584182 :     type = integer_type_node;
    1952             : 
    1953             :   /* Normally convert enums to int, but convert wide enums to something
    1954             :      wider.  Scoped enums don't promote, but pretend they do for backward
    1955             :      ABI bug compatibility wrt varargs.  */
    1956   178658487 :   else if (TREE_CODE (type) == ENUMERAL_TYPE
    1957   162848366 :            || type == char8_type_node
    1958   162833274 :            || type == char16_type_node
    1959   162624416 :            || type == char32_type_node
    1960   162465594 :            || type == wchar_type_node)
    1961             :     {
    1962    16422176 :       tree prom = type;
    1963             : 
    1964    16422176 :       if (TREE_CODE (type) == ENUMERAL_TYPE)
    1965             :         {
    1966    15810121 :           prom = ENUM_UNDERLYING_TYPE (prom);
    1967    15810121 :           if (!ENUM_IS_SCOPED (type)
    1968    15810121 :               && ENUM_FIXED_UNDERLYING_TYPE_P (type))
    1969             :             {
    1970             :               /* ISO C++17, 7.6/4.  A prvalue of an unscoped enumeration type
    1971             :                  whose underlying type is fixed (10.2) can be converted to a
    1972             :                  prvalue of its underlying type. Moreover, if integral promotion
    1973             :                  can be applied to its underlying type, a prvalue of an unscoped
    1974             :                  enumeration type whose underlying type is fixed can also be 
    1975             :                  converted to a prvalue of the promoted underlying type.  */
    1976             :               return type_promotes_to (prom);
    1977             :             }
    1978             :         }
    1979             : 
    1980    14015295 :       int precision = MAX (TYPE_PRECISION (type),
    1981             :                            TYPE_PRECISION (integer_type_node));
    1982    14015295 :       tree totype = c_common_type_for_size (precision, 0);
    1983    14015295 :       if (TYPE_UNSIGNED (prom)
    1984    14015295 :           && ! int_fits_type_p (TYPE_MAX_VALUE (prom), totype))
    1985      404608 :         prom = c_common_type_for_size (precision, 1);
    1986             :       else
    1987             :         prom = totype;
    1988    14015295 :       if (SCOPED_ENUM_P (type))
    1989             :         {
    1990          33 :           if (abi_version_crosses (6)
    1991          33 :               && TYPE_MODE (prom) != TYPE_MODE (type))
    1992          60 :             warning (OPT_Wabi, "scoped enum %qT passed through %<...%> as "
    1993             :                      "%qT before %<-fabi-version=6%>, %qT after",
    1994          30 :                      type, prom, ENUM_UNDERLYING_TYPE (type));
    1995          33 :           if (!abi_version_at_least (6))
    1996    14015265 :             type = prom;
    1997             :         }
    1998             :       else
    1999             :         type = prom;
    2000             :     }
    2001   162236311 :   else if (c_promoting_integer_type_p (type))
    2002             :     {
    2003             :       /* Retain unsignedness if really not getting bigger.  */
    2004     4280293 :       if (TYPE_UNSIGNED (type)
    2005     4280293 :           && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
    2006           0 :         type = unsigned_type_node;
    2007             :       else
    2008     4280293 :         type = integer_type_node;
    2009             :     }
    2010   157956018 :   else if (type == float_type_node)
    2011     6508400 :     type = double_type_node;
    2012             : 
    2013             :   return type;
    2014             : }
    2015             : 
    2016             : /* The routines below this point are carefully written to conform to
    2017             :    the standard.  They use the same terminology, and follow the rules
    2018             :    closely.  Although they are used only in pt.cc at the moment, they
    2019             :    should presumably be used everywhere in the future.  */
    2020             : 
    2021             : /* True iff EXPR can be converted to TYPE via a qualification conversion.
    2022             :    Callers should check for identical types before calling this function.  */
    2023             : 
    2024             : bool
    2025          71 : can_convert_qual (tree type, tree expr)
    2026             : {
    2027          71 :   tree expr_type = TREE_TYPE (expr);
    2028          71 :   gcc_assert (!same_type_p (type, expr_type));
    2029             : 
    2030             :   /* A function pointer conversion also counts as a Qualification Adjustment
    2031             :      under [over.ics.scs].  */
    2032          71 :   if (fnptr_conv_p (type, expr_type))
    2033             :     return true;
    2034             : 
    2035          61 :   if (TYPE_PTR_P (type) && TYPE_PTR_P (expr_type))
    2036          16 :     return comp_ptr_ttypes (TREE_TYPE (type), TREE_TYPE (expr_type));
    2037          45 :   else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (expr_type))
    2038          40 :     return (same_type_p (TYPE_PTRMEM_CLASS_TYPE (type),
    2039             :                          TYPE_PTRMEM_CLASS_TYPE (expr_type))
    2040          77 :             && comp_ptr_ttypes (TYPE_PTRMEM_POINTED_TO_TYPE (type),
    2041          37 :                                 TYPE_PTRMEM_POINTED_TO_TYPE (expr_type)));
    2042             :   else
    2043             :     return false;
    2044             : }
    2045             : 
    2046             : /* Attempt to perform qualification conversions on EXPR to convert it
    2047             :    to TYPE.  Return the resulting expression, or error_mark_node if
    2048             :    the conversion was impossible.  Since this is only used by
    2049             :    convert_nontype_argument, we fold the conversion.  */
    2050             : 
    2051             : tree
    2052         956 : perform_qualification_conversions (tree type, tree expr)
    2053             : {
    2054         956 :   tree expr_type;
    2055             : 
    2056         956 :   expr_type = TREE_TYPE (expr);
    2057             : 
    2058         956 :   if (same_type_p (type, expr_type))
    2059             :     return expr;
    2060          37 :   else if (can_convert_qual (type, expr))
    2061          24 :     return cp_fold_convert (type, expr);
    2062             :   else
    2063          13 :     return error_mark_node;
    2064             : }
    2065             : 
    2066             : /* True iff T is a transaction-safe function type.  */
    2067             : 
    2068             : bool
    2069     5541052 : tx_safe_fn_type_p (tree t)
    2070             : {
    2071     5541052 :   if (!FUNC_OR_METHOD_TYPE_P (t))
    2072             :     return false;
    2073     5535944 :   return !!lookup_attribute ("transaction_safe", TYPE_ATTRIBUTES (t));
    2074             : }
    2075             : 
    2076             : /* Return the transaction-unsafe variant of transaction-safe function type
    2077             :    T.  */
    2078             : 
    2079             : tree
    2080          50 : tx_unsafe_fn_variant (tree t)
    2081             : {
    2082          50 :   gcc_assert (tx_safe_fn_type_p (t));
    2083          50 :   tree attrs = remove_attribute ("transaction_safe",
    2084          50 :                                  TYPE_ATTRIBUTES (t));
    2085          50 :   return cp_build_type_attribute_variant (t, attrs);
    2086             : }
    2087             : 
    2088             : /* Return true iff FROM can convert to TO by a transaction-safety
    2089             :    conversion.  */
    2090             : 
    2091             : static bool
    2092    47329990 : can_convert_tx_safety (tree to, tree from)
    2093             : {
    2094        4090 :   return (flag_tm && tx_safe_fn_type_p (from)
    2095    47330038 :           && same_type_p (to, tx_unsafe_fn_variant (from)));
    2096             : }
    2097             : 
    2098             : /* Return true iff FROM can convert to TO by dropping noexcept.
    2099             :    This is just a subroutine of fnptr_conv_p.  */
    2100             : 
    2101             : static bool
    2102    47657936 : noexcept_conv_p (tree to, tree from)
    2103             : {
    2104    47657936 :   if (!flag_noexcept_type)
    2105             :     return false;
    2106             : 
    2107    47045824 :   if (TREE_CODE (to) != TREE_CODE (from))
    2108             :     return false;
    2109    21783607 :   if (!FUNC_OR_METHOD_TYPE_P (from))
    2110             :     return false;
    2111      968401 :   if (!type_throw_all_p (to)
    2112      968401 :       || type_throw_all_p (from))
    2113       67800 :     return false;
    2114      900601 :   tree v = build_exception_variant (from, NULL_TREE);
    2115      900601 :   return same_type_p (to, v);
    2116             : }
    2117             : 
    2118             : /* Return true iff FROM can convert to TO by a function pointer conversion.  */
    2119             : 
    2120             : bool
    2121    47657936 : fnptr_conv_p (tree to, tree from)
    2122             : {
    2123    47657936 :   tree t = to;
    2124    47657936 :   tree f = from;
    2125         898 :   if (TYPE_PTRMEMFUNC_P (t)
    2126    47658834 :       && TYPE_PTRMEMFUNC_P (f))
    2127             :     {
    2128         842 :       t = TYPE_PTRMEMFUNC_FN_TYPE (t);
    2129         842 :       f = TYPE_PTRMEMFUNC_FN_TYPE (f);
    2130             :     }
    2131    47657936 :   if (INDIRECT_TYPE_P (t)
    2132    46920450 :       && INDIRECT_TYPE_P (f))
    2133             :     {
    2134    46920435 :       t = TREE_TYPE (t);
    2135    46920435 :       f = TREE_TYPE (f);
    2136             :     }
    2137             : 
    2138    47657936 :   return (noexcept_conv_p (t, f)
    2139    47657936 :           || can_convert_tx_safety (t, f));
    2140             : }
    2141             : 
    2142             : /* Return FN with any NOP_EXPRs stripped that represent function pointer
    2143             :    conversions or conversions to the same type.  */
    2144             : 
    2145             : tree
    2146         760 : strip_fnptr_conv (tree fn)
    2147             : {
    2148         770 :   while (TREE_CODE (fn) == NOP_EXPR)
    2149             :     {
    2150          41 :       tree op = TREE_OPERAND (fn, 0);
    2151          41 :       tree ft = TREE_TYPE (fn);
    2152          41 :       tree ot = TREE_TYPE (op);
    2153          82 :       if (same_type_p (ft, ot)
    2154          41 :           || fnptr_conv_p (ft, ot))
    2155             :         fn = op;
    2156             :       else
    2157             :         break;
    2158             :     }
    2159         760 :   return fn;
    2160             : }

Generated by: LCOV version 1.16