LCOV - code coverage report
Current view: top level - gcc/cp - cvt.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 79.3 % 1062 842
Test Date: 2026-08-01 15:33:25 Functions: 94.1 % 34 32
Legend: Lines:     hit not hit

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

Generated by: LCOV version 2.4-beta

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