]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/cvt.c
Various small C++ fixes.
[thirdparty/gcc.git] / gcc / cp / cvt.c
CommitLineData
471086d6 1/* Language-level data type conversion for GNU C++.
aad93da1 2 Copyright (C) 1987-2017 Free Software Foundation, Inc.
471086d6 3 Hacked by Michael Tiemann (tiemann@cygnus.com)
4
6f0d25a6 5This file is part of GCC.
471086d6 6
6f0d25a6 7GCC is free software; you can redistribute it and/or modify
471086d6 8it under the terms of the GNU General Public License as published by
aa139c3f 9the Free Software Foundation; either version 3, or (at your option)
471086d6 10any later version.
11
6f0d25a6 12GCC is distributed in the hope that it will be useful,
471086d6 13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
aa139c3f 18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
471086d6 20
21
af86cc06 22/* This file contains the functions for converting C++ expressions
471086d6 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"
b3ef7553 28#include "system.h"
805e22b2 29#include "coretypes.h"
4cba6f60 30#include "target.h"
4cba6f60 31#include "cp-tree.h"
9ed99284 32#include "stor-layout.h"
471086d6 33#include "flags.h"
ca82e026 34#include "intl.h"
471086d6 35#include "convert.h"
30a86690 36#include "stringpool.h"
37#include "attribs.h"
96624a9e 38
c4698a21 39static tree convert_to_pointer_force (tree, tree, tsubst_flags_t);
ef9571e5 40static tree build_type_conversion (tree, tree);
c4698a21 41static tree build_up_reference (tree, tree, int, tree, tsubst_flags_t);
19b271a9 42static void diagnose_ref_binding (location_t, tree, tree, tree);
71ccdfff 43
471086d6 44/* Change of width--truncation and extension of integers or reals--
45 is represented with NOP_EXPR. Proper functioning of many things
46 assumes that no other conversions can be NOP_EXPRs.
47
48 Conversion between integer and pointer is represented with CONVERT_EXPR.
49 Converting integer to real uses FLOAT_EXPR
50 and real to integer uses FIX_TRUNC_EXPR.
51
52 Here is a list of all the functions that assume that widening and
53 narrowing is always done with a NOP_EXPR:
b981525c 54 In convert.c, convert_to_integer[_maybe_fold].
471086d6 55 In c-typeck.c, build_binary_op_nodefault (boolean ops),
653e5405 56 and c_common_truthvalue_conversion.
471086d6 57 In expr.c: expand_expr, for operands of a MULT_EXPR.
58 In fold-const.c: fold.
59 In tree.c: get_narrower and get_unwidened.
60
61 C++: in multiple-inheritance, converting between pointers may involve
62 adjusting them by a delta stored within the class definition. */
63\f
64/* Subroutines of `convert'. */
65
471086d6 66/* if converting pointer to pointer
67 if dealing with classes, check for derived->base or vice versa
68 else if dealing with method pointers, delegate
69 else convert blindly
70 else if converting class, pass off to build_type_conversion
e5ead12a 71 else try C-style pointer conversion. */
96624a9e 72
471086d6 73static tree
b981525c 74cp_convert_to_pointer (tree type, tree expr, bool dofold,
75 tsubst_flags_t complain)
471086d6 76{
cd16867a 77 tree intype = TREE_TYPE (expr);
78 enum tree_code form;
f82eeb87 79 tree rval;
3df42822 80 location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
61f69bc9 81
8bf328bf 82 if (intype == error_mark_node)
83 return error_mark_node;
74002e1d 84
95397ff9 85 if (MAYBE_CLASS_TYPE_P (intype))
96624a9e 86 {
96624a9e 87 intype = complete_type (intype);
4b72716d 88 if (!COMPLETE_TYPE_P (intype))
96624a9e 89 {
c4698a21 90 if (complain & tf_error)
4d1eda3a 91 error_at (loc, "can%'t convert from incomplete type %qH to %qI",
c4698a21 92 intype, type);
96624a9e 93 return error_mark_node;
94 }
95
8999978b 96 rval = build_type_conversion (type, expr);
96624a9e 97 if (rval)
98 {
c4698a21 99 if ((complain & tf_error)
100 && rval == error_mark_node)
4d1eda3a 101 error_at (loc, "conversion of %qE from %qH to %qI is ambiguous",
61f69bc9 102 expr, intype, type);
96624a9e 103 return rval;
104 }
105 }
106
860740a7 107 /* Handle anachronistic conversions from (::*)() to cv void* or (*)(). */
c21c015b 108 if (TYPE_PTR_P (type)
38281c46 109 && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
e3cfe3ce 110 || VOID_TYPE_P (TREE_TYPE (type))))
38281c46 111 {
6ab399e8 112 if (TYPE_PTRMEMFUNC_P (intype)
113 || TREE_CODE (intype) == METHOD_TYPE)
c4698a21 114 return convert_member_func_to_ptr (type, expr, complain);
c21c015b 115 if (TYPE_PTR_P (TREE_TYPE (expr)))
a63bc44c 116 return build_nop (type, expr);
38281c46 117 intype = TREE_TYPE (expr);
118 }
119
311e42bc 120 if (expr == error_mark_node)
121 return error_mark_node;
122
74002e1d 123 form = TREE_CODE (intype);
124
2b77484d 125 if (POINTER_TYPE_P (intype))
471086d6 126 {
127 intype = TYPE_MAIN_VARIANT (intype);
128
129 if (TYPE_MAIN_VARIANT (type) != intype
c21c015b 130 && TYPE_PTR_P (type)
471086d6 131 && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
95397ff9 132 && MAYBE_CLASS_TYPE_P (TREE_TYPE (type))
133 && MAYBE_CLASS_TYPE_P (TREE_TYPE (intype))
4a2680fc 134 && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
471086d6 135 {
136 enum tree_code code = PLUS_EXPR;
4a2680fc 137 tree binfo;
8999978b 138 tree intype_class;
139 tree type_class;
140 bool same_p;
4a2680fc 141
8999978b 142 intype_class = TREE_TYPE (intype);
143 type_class = TREE_TYPE (type);
144
9031d10b 145 same_p = same_type_p (TYPE_MAIN_VARIANT (intype_class),
8999978b 146 TYPE_MAIN_VARIANT (type_class));
147 binfo = NULL_TREE;
c0af329c 148 /* Try derived to base conversion. */
8999978b 149 if (!same_p)
ae260dcc 150 binfo = lookup_base (intype_class, type_class, ba_check,
151 NULL, complain);
8999978b 152 if (!same_p && !binfo)
471086d6 153 {
c0af329c 154 /* Try base to derived conversion. */
ae260dcc 155 binfo = lookup_base (type_class, intype_class, ba_check,
156 NULL, complain);
471086d6 157 code = MINUS_EXPR;
158 }
4a2680fc 159 if (binfo == error_mark_node)
160 return error_mark_node;
8999978b 161 if (binfo || same_p)
471086d6 162 {
8999978b 163 if (binfo)
c4698a21 164 expr = build_base_path (code, expr, binfo, 0, complain);
c0af329c 165 /* Add any qualifier conversions. */
8999978b 166 return build_nop (type, expr);
471086d6 167 }
168 }
471086d6 169
1bc16cab 170 if (TYPE_PTRMEMFUNC_P (type))
bea7d742 171 {
c4698a21 172 if (complain & tf_error)
4d1eda3a 173 error_at (loc, "cannot convert %qE from type %qH to type %qI",
c4698a21 174 expr, intype, type);
1bc16cab 175 return error_mark_node;
176 }
a17aefa2 177
1bc16cab 178 return build_nop (type, expr);
179 }
05765a91 180 else if ((TYPE_PTRDATAMEM_P (type) && TYPE_PTRDATAMEM_P (intype))
e5ead12a 181 || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
182 return convert_ptrmem (type, expr, /*allow_inverse_p=*/false,
c4698a21 183 /*c_cast_p=*/false, complain);
2b77484d 184 else if (TYPE_PTRMEMFUNC_P (intype))
185 {
a63bc44c 186 if (!warn_pmf2ptr)
187 {
188 if (TREE_CODE (expr) == PTRMEM_CST)
c4698a21 189 return cp_convert_to_pointer (type, PTRMEM_CST_MEMBER (expr),
b981525c 190 dofold, complain);
a63bc44c 191 else if (TREE_CODE (expr) == OFFSET_REF)
192 {
193 tree object = TREE_OPERAND (expr, 0);
194 return get_member_function_from_ptrfunc (&object,
4405c1ad 195 TREE_OPERAND (expr, 1),
c4698a21 196 complain);
a63bc44c 197 }
198 }
d3f0af4b 199 if (complain & tf_error)
4d1eda3a 200 error_at (loc, "cannot convert %qE from type %qH to type %qI",
d3f0af4b 201 expr, intype, type);
2b77484d 202 return error_mark_node;
203 }
471086d6 204
ef434176 205 if (null_ptr_cst_p (expr))
471086d6 206 {
2b77484d 207 if (TYPE_PTRMEMFUNC_P (type))
cb02169c 208 return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0,
c4698a21 209 /*c_cast_p=*/false, complain);
ad63a0fc 210
106c3d67 211 if (complain & tf_warning)
212 maybe_warn_zero_as_null_pointer_constant (expr, loc);
213
7ba2f86f 214 /* A NULL pointer-to-data-member is represented by -1, not by
215 zero. */
216 tree val = (TYPE_PTRDATAMEM_P (type)
217 ? build_int_cst_type (type, -1)
218 : build_int_cst (type, 0));
219
220 return (TREE_SIDE_EFFECTS (expr)
221 ? build2 (COMPOUND_EXPR, type, expr, val) : val);
471086d6 222 }
05765a91 223 else if (TYPE_PTRMEM_P (type) && INTEGRAL_CODE_P (form))
de1f960a 224 {
c4698a21 225 if (complain & tf_error)
4d1eda3a 226 error_at (loc, "invalid conversion from %qH to %qI", intype, type);
de1f960a 227 return error_mark_node;
228 }
471086d6 229
bb0726a1 230 if (INTEGRAL_CODE_P (form))
471086d6 231 {
c5aa1e92 232 if (TYPE_PRECISION (intype) == POINTER_SIZE)
471086d6 233 return build1 (CONVERT_EXPR, type, expr);
c4698a21 234 expr = cp_convert (c_common_type_for_size (POINTER_SIZE, 0), expr,
235 complain);
092b1d6f 236 /* Modes may be different but sizes should be the same. There
237 is supposed to be some integral type that is the same width
238 as a pointer. */
03b7a719 239 gcc_assert (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (expr)))
240 == GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (type)));
9031d10b 241
b981525c 242 return convert_to_pointer_maybe_fold (type, expr, dofold);
471086d6 243 }
244
cc4d0855 245 if (type_unknown_p (expr))
c4698a21 246 return instantiate_type (type, expr, complain);
cc4d0855 247
c4698a21 248 if (complain & tf_error)
4d1eda3a 249 error_at (loc, "cannot convert %qE from type %qH to type %qI",
c4698a21 250 expr, intype, type);
471086d6 251 return error_mark_node;
252}
253
254/* Like convert, except permit conversions to take place which
255 are not normally allowed due to access restrictions
256 (such as conversion from sub-type to private super-type). */
96624a9e 257
471086d6 258static tree
c4698a21 259convert_to_pointer_force (tree type, tree expr, tsubst_flags_t complain)
471086d6 260{
cd16867a 261 tree intype = TREE_TYPE (expr);
262 enum tree_code form = TREE_CODE (intype);
9031d10b 263
471086d6 264 if (form == POINTER_TYPE)
265 {
266 intype = TYPE_MAIN_VARIANT (intype);
267
268 if (TYPE_MAIN_VARIANT (type) != intype
269 && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
95397ff9 270 && MAYBE_CLASS_TYPE_P (TREE_TYPE (type))
271 && MAYBE_CLASS_TYPE_P (TREE_TYPE (intype))
471086d6 272 && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
273 {
274 enum tree_code code = PLUS_EXPR;
4a2680fc 275 tree binfo;
276
277 binfo = lookup_base (TREE_TYPE (intype), TREE_TYPE (type),
ae260dcc 278 ba_unique, NULL, complain);
4a2680fc 279 if (!binfo)
471086d6 280 {
4a2680fc 281 binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
ae260dcc 282 ba_unique, NULL, complain);
4a2680fc 283 code = MINUS_EXPR;
471086d6 284 }
4a2680fc 285 if (binfo == error_mark_node)
286 return error_mark_node;
287 if (binfo)
471086d6 288 {
c4698a21 289 expr = build_base_path (code, expr, binfo, 0, complain);
653e5405 290 if (expr == error_mark_node)
291 return error_mark_node;
c0af329c 292 /* Add any qualifier conversions. */
4a2680fc 293 if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)),
294 TREE_TYPE (type)))
8999978b 295 expr = build_nop (type, expr);
4a2680fc 296 return expr;
471086d6 297 }
471086d6 298 }
471086d6 299 }
300
b981525c 301 return cp_convert_to_pointer (type, expr, /*fold*/false, complain);
471086d6 302}
303
304/* We are passing something to a function which requires a reference.
305 The type we are interested in is in TYPE. The initial
306 value we have to begin with is in ARG.
307
308 FLAGS controls how we manage access checking.
ca106ab1 309 DIRECT_BIND in FLAGS controls how any temporaries are generated.
310 If DIRECT_BIND is set, DECL is the reference we're binding to. */
96624a9e 311
471086d6 312static tree
c4698a21 313build_up_reference (tree type, tree arg, int flags, tree decl,
314 tsubst_flags_t complain)
471086d6 315{
c76251c1 316 tree rval;
0543e7a9 317 tree argtype = TREE_TYPE (arg);
471086d6 318 tree target_type = TREE_TYPE (type);
471086d6 319
b4df430b 320 gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
471086d6 321
18bede74 322 if ((flags & DIRECT_BIND) && ! lvalue_p (arg))
471086d6 323 {
ca106ab1 324 /* Create a new temporary variable. We can't just use a TARGET_EXPR
325 here because it needs to live as long as DECL. */
c76251c1 326 tree targ = arg;
ca106ab1 327
5ab1aaca 328 arg = make_temporary_var_for_ref_to_temp (decl, target_type);
c23ebfdd 329
330 /* Process the initializer for the declaration. */
38281c46 331 DECL_INITIAL (arg) = targ;
d91303a6 332 cp_finish_decl (arg, targ, /*init_const_expr_p=*/false, NULL_TREE,
011310f7 333 LOOKUP_ONLYCONVERTING|DIRECT_BIND);
1ad432f2 334 }
049132bc 335 else if (!(flags & DIRECT_BIND) && ! obvalue_p (arg))
44189c16 336 return get_target_expr_sfinae (arg, complain);
1ad432f2 337
ca106ab1 338 /* If we had a way to wrap this up, and say, if we ever needed its
b0df6589 339 address, transform all occurrences of the register, into a memory
340 reference we could win better. */
44189c16 341 rval = cp_build_addr_expr (arg, complain);
15e55420 342 if (rval == error_mark_node)
343 return error_mark_node;
344
6686e84d 345 if ((flags & LOOKUP_PROTECT)
346 && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type)
95397ff9 347 && MAYBE_CLASS_TYPE_P (argtype)
348 && MAYBE_CLASS_TYPE_P (target_type))
6686e84d 349 {
7e6960e0 350 /* We go through lookup_base for the access control. */
ae260dcc 351 tree binfo = lookup_base (argtype, target_type, ba_check,
352 NULL, complain);
6686e84d 353 if (binfo == error_mark_node)
354 return error_mark_node;
355 if (binfo == NULL_TREE)
356 return error_not_base_type (target_type, argtype);
c4698a21 357 rval = build_base_path (PLUS_EXPR, rval, binfo, 1, complain);
6686e84d 358 }
c76251c1 359 else
360 rval
c4698a21 361 = convert_to_pointer_force (build_pointer_type (target_type),
362 rval, complain);
8999978b 363 return build_nop (type, rval);
471086d6 364}
365
519ba62c 366/* Subroutine of convert_to_reference. REFTYPE is the target reference type.
367 INTYPE is the original rvalue type and DECL is an optional _DECL node
368 for diagnostics.
9031d10b 369
519ba62c 370 [dcl.init.ref] says that if an rvalue is used to
371 initialize a reference, then the reference must be to a
372 non-volatile const type. */
373
374static void
19b271a9 375diagnose_ref_binding (location_t loc, tree reftype, tree intype, tree decl)
519ba62c 376{
377 tree ttl = TREE_TYPE (reftype);
9031d10b 378
519ba62c 379 if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl))
380 {
381 const char *msg;
382
383 if (CP_TYPE_VOLATILE_P (ttl) && decl)
ca82e026 384 msg = G_("initialization of volatile reference type %q#T from "
385 "rvalue of type %qT");
519ba62c 386 else if (CP_TYPE_VOLATILE_P (ttl))
ca82e026 387 msg = G_("conversion to volatile reference type %q#T "
388 "from rvalue of type %qT");
519ba62c 389 else if (decl)
ca82e026 390 msg = G_("initialization of non-const reference type %q#T from "
391 "rvalue of type %qT");
519ba62c 392 else
ca82e026 393 msg = G_("conversion to non-const reference type %q#T from "
394 "rvalue of type %qT");
519ba62c 395
61f69bc9 396 permerror (loc, msg, reftype, intype);
519ba62c 397 }
398}
399
471086d6 400/* For C++: Only need to do one-level references, but cannot
401 get tripped up on signed/unsigned differences.
402
d81e00a4 403 DECL is either NULL_TREE or the _DECL node for a reference that is being
404 initialized. It can be error_mark_node if we don't know the _DECL but
405 we know it's an initialization. */
471086d6 406
471086d6 407tree
35771a9a 408convert_to_reference (tree reftype, tree expr, int convtype,
c4698a21 409 int flags, tree decl, tsubst_flags_t complain)
471086d6 410{
cd16867a 411 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
412 tree intype;
471086d6 413 tree rval = NULL_TREE;
1a3f833b 414 tree rval_as_conversion = NULL_TREE;
1bc16cab 415 bool can_convert_intype_to_type;
3df42822 416 location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
1a3f833b 417
9031d10b 418 if (TREE_CODE (type) == FUNCTION_TYPE
d32df6a6 419 && TREE_TYPE (expr) == unknown_type_node)
66bbeb85 420 expr = instantiate_type (type, expr, complain);
0a3b29ad 421
422 if (expr == error_mark_node)
423 return error_mark_node;
424
425 intype = TREE_TYPE (expr);
cc4d0855 426
b4df430b 427 gcc_assert (TREE_CODE (intype) != REFERENCE_TYPE);
ab12ed55 428 gcc_assert (TREE_CODE (reftype) == REFERENCE_TYPE);
471086d6 429
471086d6 430 intype = TYPE_MAIN_VARIANT (intype);
431
b657f346 432 can_convert_intype_to_type = can_convert_standard (type, intype, complain);
66bbeb85 433
1bc16cab 434 if (!can_convert_intype_to_type
95397ff9 435 && (convtype & CONV_IMPLICIT) && MAYBE_CLASS_TYPE_P (intype)
1a3f833b 436 && ! (flags & LOOKUP_NO_CONVERSION))
437 {
438 /* Look for a user-defined conversion to lvalue that we can use. */
439
0a4be248 440 rval_as_conversion
8999978b 441 = build_type_conversion (reftype, expr);
1a3f833b 442
443 if (rval_as_conversion && rval_as_conversion != error_mark_node
18bede74 444 && lvalue_p (rval_as_conversion))
1a3f833b 445 {
446 expr = rval_as_conversion;
447 rval_as_conversion = NULL_TREE;
448 intype = type;
1bc16cab 449 can_convert_intype_to_type = 1;
1a3f833b 450 }
451 }
452
b657f346 453 if (((convtype & CONV_STATIC)
454 && can_convert_standard (intype, type, complain))
1bc16cab 455 || ((convtype & CONV_IMPLICIT) && can_convert_intype_to_type))
471086d6 456 {
c4698a21 457 {
458 tree ttl = TREE_TYPE (reftype);
459 tree ttr = lvalue_type (expr);
471086d6 460
19b271a9 461 if ((complain & tf_error)
18bede74 462 && ! lvalue_p (expr))
19b271a9 463 diagnose_ref_binding (loc, reftype, intype, decl);
9031d10b 464
c4698a21 465 if (! (convtype & CONV_CONST)
466 && !at_least_as_qualified_p (ttl, ttr))
467 {
468 if (complain & tf_error)
4d1eda3a 469 permerror (loc, "conversion from %qH to %qI discards qualifiers",
c4698a21 470 ttr, reftype);
471 else
472 return error_mark_node;
473 }
474 }
0543e7a9 475
c4698a21 476 return build_up_reference (reftype, expr, flags, decl, complain);
471086d6 477 }
049132bc 478 else if ((convtype & CONV_REINTERPRET) && obvalue_p (expr))
0543e7a9 479 {
480 /* When casting an lvalue to a reference type, just convert into
481 a pointer to the new type and deference it. This is allowed
e581f478 482 by San Diego WP section 5.2.9 paragraph 12, though perhaps it
0543e7a9 483 should be done directly (jason). (int &)ri ---> *(int*)&ri */
e581f478 484
3748625f 485 /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they
653e5405 486 meant. */
c4698a21 487 if ((complain & tf_warning)
c21c015b 488 && TYPE_PTR_P (intype)
a09db423 489 && (comptypes (TREE_TYPE (intype), type,
490 COMPARE_BASE | COMPARE_DERIVED)))
61f69bc9 491 warning_at (loc, 0, "casting %qT to %qT does not dereference pointer",
492 intype, reftype);
9031d10b 493
c4698a21 494 rval = cp_build_addr_expr (expr, complain);
0543e7a9 495 if (rval != error_mark_node)
985e9ee0 496 rval = convert_force (build_pointer_type (TREE_TYPE (reftype)),
c4698a21 497 rval, 0, complain);
0543e7a9 498 if (rval != error_mark_node)
b0722fac 499 rval = build1 (NOP_EXPR, reftype, rval);
0543e7a9 500 }
0a4be248 501 else
860740a7 502 {
503 rval = convert_for_initialization (NULL_TREE, type, expr, flags,
c4698a21 504 ICR_CONVERTING, 0, 0, complain);
a66fe4cb 505 if (rval == NULL_TREE || rval == error_mark_node)
506 return rval;
19b271a9 507 if (complain & tf_error)
508 diagnose_ref_binding (loc, reftype, intype, decl);
c4698a21 509 rval = build_up_reference (reftype, rval, flags, decl, complain);
860740a7 510 }
471086d6 511
512 if (rval)
513 {
96624a9e 514 /* If we found a way to convert earlier, then use it. */
471086d6 515 return rval;
516 }
517
c4698a21 518 if (complain & tf_error)
4d1eda3a 519 error_at (loc, "cannot convert type %qH to type %qI", intype, reftype);
b248d3f7 520
471086d6 521 return error_mark_node;
522}
523
524/* We are using a reference VAL for its value. Bash that reference all the
96624a9e 525 way down to its lowest form. */
526
471086d6 527tree
35771a9a 528convert_from_reference (tree val)
471086d6 529{
73bdcca2 530 if (TREE_TYPE (val)
531 && TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE)
729f89ff 532 {
2fb61329 533 tree t = TREE_TYPE (TREE_TYPE (val));
729f89ff 534 tree ref = build1 (INDIRECT_REF, t, val);
9031d10b 535
3d37a176 536 mark_exp_read (val);
729f89ff 537 /* We *must* set TREE_READONLY when dereferencing a pointer to const,
538 so that we get the proper error message if the result is used
539 to assign to. Also, &* is supposed to be a no-op. */
540 TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
541 TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
542 TREE_SIDE_EFFECTS (ref)
543 = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val));
729f89ff 544 val = ref;
545 }
9031d10b 546
471086d6 547 return val;
548}
e5dab226 549
550/* Really perform an lvalue-to-rvalue conversion, including copying an
551 argument of class type into a temporary. */
552
553tree
9e505437 554force_rvalue (tree expr, tsubst_flags_t complain)
e5dab226 555{
9e505437 556 tree type = TREE_TYPE (expr);
557 if (MAYBE_CLASS_TYPE_P (type) && TREE_CODE (expr) != TARGET_EXPR)
558 {
f1f41a6c 559 vec<tree, va_gc> *args = make_tree_vector_single (expr);
9e505437 560 expr = build_special_member_call (NULL_TREE, complete_ctor_identifier,
561 &args, type, LOOKUP_NORMAL, complain);
562 release_tree_vector (args);
563 expr = build_cplus_new (type, expr, complain);
564 }
e5dab226 565 else
4405c1ad 566 expr = decay_conversion (expr, complain);
e5dab226 567
568 return expr;
569}
f5220369 570
471086d6 571\f
a1f05651 572/* If EXPR and ORIG are INTEGER_CSTs, return a version of EXPR that has
573 TREE_OVERFLOW set only if it is set in ORIG. Otherwise, return EXPR
574 unchanged. */
575
576static tree
577ignore_overflows (tree expr, tree orig)
578{
579 if (TREE_CODE (expr) == INTEGER_CST
580 && TREE_CODE (orig) == INTEGER_CST
581 && TREE_OVERFLOW (expr) != TREE_OVERFLOW (orig))
582 {
583 gcc_assert (!TREE_OVERFLOW (orig));
584 /* Ensure constant sharing. */
e3d0f65c 585 expr = wide_int_to_tree (TREE_TYPE (expr), wi::to_wide (expr));
a1f05651 586 }
587 return expr;
588}
589
590/* Fold away simple conversions, but make sure TREE_OVERFLOW is set
591 properly. */
f5220369 592
593tree
594cp_fold_convert (tree type, tree expr)
595{
fe565588 596 tree conv;
597 if (TREE_TYPE (expr) == type)
598 conv = expr;
599 else if (TREE_CODE (expr) == PTRMEM_CST)
600 {
601 /* Avoid wrapping a PTRMEM_CST in NOP_EXPR. */
602 conv = copy_node (expr);
603 TREE_TYPE (conv) = type;
604 }
605 else
606 {
607 conv = fold_convert (type, expr);
608 conv = ignore_overflows (conv, expr);
609 }
a1f05651 610 return conv;
f5220369 611}
612
c4a8ac95 613/* C++ conversions, preference to static cast conversions. */
614
615tree
c4698a21 616cp_convert (tree type, tree expr, tsubst_flags_t complain)
c4a8ac95 617{
c4698a21 618 return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL, complain);
c4a8ac95 619}
620
59dd8856 621/* C++ equivalent of convert_and_check but using cp_convert as the
622 conversion function.
623
624 Convert EXPR to TYPE, warning about conversion problems with constants.
625 Invoke this function on every expression that is converted implicitly,
626 i.e. because of language rules and not because of an explicit cast. */
627
628tree
c4698a21 629cp_convert_and_check (tree type, tree expr, tsubst_flags_t complain)
59dd8856 630{
631 tree result;
632
633 if (TREE_TYPE (expr) == type)
634 return expr;
d2c63826 635 if (expr == error_mark_node)
636 return expr;
c4698a21 637 result = cp_convert (type, expr, complain);
59dd8856 638
c4698a21 639 if ((complain & tf_warning)
65615944 640 && c_inhibit_evaluation_warnings == 0)
641 {
d2c63826 642 tree folded = cp_fully_fold (expr);
643 tree folded_result;
644 if (folded == expr)
645 folded_result = result;
646 else
647 {
648 /* Avoid bogus -Wparentheses warnings. */
93a735ed 649 warning_sentinel w (warn_parentheses);
bed03df1 650 warning_sentinel c (warn_int_in_bool_context);
d2c63826 651 folded_result = cp_convert (type, folded, tf_none);
652 }
653 folded_result = fold_simple (folded_result);
654 if (!TREE_OVERFLOW_P (folded)
65615944 655 && folded_result != error_mark_node)
3d27a0fa 656 warnings_for_convert_and_check (EXPR_LOC_OR_LOC (expr, input_location),
657 type, folded, folded_result);
65615944 658 }
59dd8856 659
660 return result;
661}
662
b248d3f7 663/* Conversion...
664
665 FLAGS indicates how we should behave. */
666
471086d6 667tree
c4698a21 668ocp_convert (tree type, tree expr, int convtype, int flags,
669 tsubst_flags_t complain)
471086d6 670{
cd16867a 671 tree e = expr;
672 enum tree_code code = TREE_CODE (type);
7a979707 673 const char *invalid_conv_diag;
2b3c93a3 674 tree e1;
3df42822 675 location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
b981525c 676 bool dofold = (convtype & CONV_FOLD);
471086d6 677
1bc16cab 678 if (error_operand_p (e) || type == error_mark_node)
471086d6 679 return error_mark_node;
d81e00a4 680
5b592939 681 complete_type (type);
682 complete_type (TREE_TYPE (expr));
683
7a979707 684 if ((invalid_conv_diag
685 = targetm.invalid_conversion (TREE_TYPE (expr), type)))
686 {
c4698a21 687 if (complain & tf_error)
688 error (invalid_conv_diag);
7a979707 689 return error_mark_node;
690 }
691
ce984e5e 692 /* FIXME remove when moving to c_fully_fold model. */
0a7452a8 693 if (!CLASS_TYPE_P (type))
694 e = scalar_constant_value (e);
7a00f939 695 if (error_operand_p (e))
696 return error_mark_node;
7745052b 697
c821ae1a 698 if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP))
ceab25e5 699 /* We need a new temporary; don't take this shortcut. */;
930e8175 700 else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e)))
ca23ec64 701 {
daf9ff67 702 if (same_type_p (type, TREE_TYPE (e)))
ca23ec64 703 /* The call to fold will not always remove the NOP_EXPR as
704 might be expected, since if one of the types is a typedef;
755edffd 705 the comparison in fold is just equality of pointers, not a
a09db423 706 call to comptypes. We don't call fold in this case because
f699c174 707 that can result in infinite recursion; fold will call
708 convert, which will call ocp_convert, etc. */
709 return e;
372e0e29 710 /* For complex data types, we need to perform componentwise
653e5405 711 conversion. */
372e0e29 712 else if (TREE_CODE (type) == COMPLEX_TYPE)
b981525c 713 return convert_to_complex_maybe_fold (type, e, dofold);
76249021 714 else if (VECTOR_TYPE_P (type))
d2c63826 715 return convert_to_vector (type, e);
bdb2219e 716 else if (TREE_CODE (e) == TARGET_EXPR)
717 {
718 /* Don't build a NOP_EXPR of class type. Instead, change the
930e8175 719 type of the temporary. */
bdb2219e 720 TREE_TYPE (e) = TREE_TYPE (TARGET_EXPR_SLOT (e)) = type;
721 return e;
722 }
ca23ec64 723 else
092b1d6f 724 {
725 /* We shouldn't be treating objects of ADDRESSABLE type as
726 rvalues. */
727 gcc_assert (!TREE_ADDRESSABLE (type));
d2c63826 728 return build_nop (type, e);
092b1d6f 729 }
ca23ec64 730 }
731
2b3c93a3 732 e1 = targetm.convert_to_type (type, e);
733 if (e1)
734 return e1;
735
d81e00a4 736 if (code == VOID_TYPE && (convtype & CONV_STATIC))
95b2ac55 737 {
c4698a21 738 e = convert_to_void (e, ICV_CAST, complain);
aeef2be5 739 return e;
95b2ac55 740 }
d81e00a4 741
bb0726a1 742 if (INTEGRAL_CODE_P (code))
471086d6 743 {
617abf06 744 tree intype = TREE_TYPE (e);
a1f05651 745 tree converted;
384590d4 746
747 if (TREE_CODE (type) == ENUMERAL_TYPE)
748 {
749 /* enum = enum, enum = int, enum = float, (enum)pointer are all
750 errors. */
751 if (((INTEGRAL_OR_ENUMERATION_TYPE_P (intype)
653e5405 752 || TREE_CODE (intype) == REAL_TYPE)
b312a686 753 && ! (convtype & CONV_STATIC))
c21c015b 754 || TYPE_PTR_P (intype))
384590d4 755 {
c4698a21 756 if (complain & tf_error)
61f69bc9 757 permerror (loc, "conversion from %q#T to %q#T", intype, type);
c4698a21 758 else
384590d4 759 return error_mark_node;
760 }
761
762 /* [expr.static.cast]
763
764 8. A value of integral or enumeration type can be explicitly
765 converted to an enumeration type. The value is unchanged if
766 the original value is within the range of the enumeration
767 values. Otherwise, the resulting enumeration value is
768 unspecified. */
c4698a21 769 if ((complain & tf_warning)
c28ddc97 770 && TREE_CODE (e) == INTEGER_CST
0116c9f8 771 && ENUM_UNDERLYING_TYPE (type)
c28ddc97 772 && !int_fits_type_p (e, ENUM_UNDERLYING_TYPE (type)))
61f69bc9 773 warning_at (loc, OPT_Wconversion,
774 "the result of the conversion is unspecified because "
775 "%qE is outside the range of type %qT",
776 expr, type);
471086d6 777 }
95397ff9 778 if (MAYBE_CLASS_TYPE_P (intype))
471086d6 779 {
780 tree rval;
8999978b 781 rval = build_type_conversion (type, e);
6495357a 782 if (rval)
783 return rval;
c4698a21 784 if (complain & tf_error)
61f69bc9 785 error_at (loc, "%q#T used where a %qT was expected", intype, type);
471086d6 786 return error_mark_node;
787 }
bb0726a1 788 if (code == BOOLEAN_TYPE)
f8913d47 789 {
c21c015b 790 if (VOID_TYPE_P (intype))
61f69bc9 791 {
c4698a21 792 if (complain & tf_error)
793 error_at (loc,
794 "could not convert %qE from %<void%> to %<bool%>",
795 expr);
61f69bc9 796 return error_mark_node;
797 }
798
f8913d47 799 /* We can't implicitly convert a scoped enum to bool, so convert
800 to the underlying type first. */
801 if (SCOPED_ENUM_P (intype) && (convtype & CONV_STATIC))
172fff7b 802 e = build_nop (ENUM_UNDERLYING_TYPE (intype), e);
493196c0 803 if (complain & tf_warning)
804 return cp_truthvalue_conversion (e);
805 else
806 {
807 /* Prevent bogus -Wint-in-bool-context warnings coming
808 from c_common_truthvalue_conversion down the line. */
809 warning_sentinel w (warn_int_in_bool_context);
810 return cp_truthvalue_conversion (e);
811 }
f8913d47 812 }
ce871053 813
b981525c 814 converted = convert_to_integer_maybe_fold (type, e, dofold);
a1f05651 815
816 /* Ignore any integer overflow caused by the conversion. */
817 return ignore_overflows (converted, e);
471086d6 818 }
c7ca48ea 819 if (NULLPTR_TYPE_P (type) && e && null_ptr_cst_p (e))
49858f84 820 {
821 if (complain & tf_warning)
822 maybe_warn_zero_as_null_pointer_constant (e, loc);
823 return nullptr_node;
824 }
05765a91 825 if (POINTER_TYPE_P (type) || TYPE_PTRMEM_P (type))
b981525c 826 return cp_convert_to_pointer (type, e, dofold, complain);
684b9d79 827 if (code == VECTOR_TYPE)
c37ff371 828 {
829 tree in_vtype = TREE_TYPE (e);
95397ff9 830 if (MAYBE_CLASS_TYPE_P (in_vtype))
c37ff371 831 {
832 tree ret_val;
833 ret_val = build_type_conversion (type, e);
653e5405 834 if (ret_val)
835 return ret_val;
c4698a21 836 if (complain & tf_error)
837 error_at (loc, "%q#T used where a %qT was expected",
838 in_vtype, type);
653e5405 839 return error_mark_node;
c37ff371 840 }
d2c63826 841 return convert_to_vector (type, e);
c37ff371 842 }
c4a8ac95 843 if (code == REAL_TYPE || code == COMPLEX_TYPE)
471086d6 844 {
95397ff9 845 if (MAYBE_CLASS_TYPE_P (TREE_TYPE (e)))
471086d6 846 {
847 tree rval;
8999978b 848 rval = build_type_conversion (type, e);
471086d6 849 if (rval)
850 return rval;
c4698a21 851 else if (complain & tf_error)
852 error_at (loc,
853 "%q#T used where a floating point value was expected",
854 TREE_TYPE (e));
471086d6 855 }
c4a8ac95 856 if (code == REAL_TYPE)
b981525c 857 return convert_to_real_maybe_fold (type, e, dofold);
c4a8ac95 858 else if (code == COMPLEX_TYPE)
b981525c 859 return convert_to_complex_maybe_fold (type, e, dofold);
471086d6 860 }
861
862 /* New C++ semantics: since assignment is now based on
863 memberwise copying, if the rhs type is derived from the
864 lhs type, then we may still do a conversion. */
95397ff9 865 if (RECORD_OR_UNION_CODE_P (code))
471086d6 866 {
867 tree dtype = TREE_TYPE (e);
c25194fd 868 tree ctor = NULL_TREE;
471086d6 869
471086d6 870 dtype = TYPE_MAIN_VARIANT (dtype);
871
471086d6 872 /* Conversion between aggregate types. New C++ semantics allow
873 objects of derived type to be cast to objects of base type.
874 Old semantics only allowed this between pointers.
875
876 There may be some ambiguity between using a constructor
877 vs. using a type conversion operator when both apply. */
878
0a4be248 879 ctor = e;
860740a7 880
44189c16 881 if (abstract_virtuals_error_sfinae (NULL_TREE, type, complain))
8c18e707 882 return error_mark_node;
6cbb4197 883
f82f1250 884 if (BRACE_ENCLOSED_INITIALIZER_P (ctor))
c4698a21 885 ctor = perform_implicit_conversion (type, ctor, complain);
f82f1250 886 else if ((flags & LOOKUP_ONLYCONVERTING)
887 && ! (CLASS_TYPE_P (dtype) && DERIVED_FROM_P (type, dtype)))
fce73460 888 /* For copy-initialization, first we create a temp of the proper type
889 with a user-defined conversion sequence, then we direct-initialize
890 the target with the temp (see [dcl.init]). */
c4698a21 891 ctor = build_user_type_conversion (type, ctor, flags, complain);
3eb89cd8 892 else
f352a3fb 893 {
f1f41a6c 894 vec<tree, va_gc> *ctor_vec = make_tree_vector_single (ctor);
f352a3fb 895 ctor = build_special_member_call (NULL_TREE,
896 complete_ctor_identifier,
897 &ctor_vec,
c4698a21 898 type, flags, complain);
f352a3fb 899 release_tree_vector (ctor_vec);
900 }
0a4be248 901 if (ctor)
c4698a21 902 return build_cplus_new (type, ctor, complain);
471086d6 903 }
904
c4698a21 905 if (complain & tf_error)
a7cc1549 906 {
907 /* If the conversion failed and expr was an invalid use of pointer to
908 member function, try to report a meaningful error. */
5c874cd3 909 if (invalid_nonstatic_memfn_p (loc, expr, complain))
a7cc1549 910 /* We displayed the error message. */;
911 else
4d1eda3a 912 error_at (loc, "conversion from %qH to non-scalar type %qI requested",
61f69bc9 913 TREE_TYPE (expr), type);
a7cc1549 914 }
471086d6 915 return error_mark_node;
916}
917
3ae3cb42 918/* If CALL is a call, return the callee; otherwise null. */
919
920tree
921cp_get_callee (tree call)
922{
923 if (call == NULL_TREE)
924 return call;
925 else if (TREE_CODE (call) == CALL_EXPR)
926 return CALL_EXPR_FN (call);
927 else if (TREE_CODE (call) == AGGR_INIT_EXPR)
928 return AGGR_INIT_EXPR_FN (call);
929 return NULL_TREE;
930}
931
ddd2a3d4 932/* FN is the callee of a CALL_EXPR or AGGR_INIT_EXPR; return the FUNCTION_DECL
933 if we can. */
934
935tree
936cp_get_fndecl_from_callee (tree fn)
937{
938 if (fn == NULL_TREE)
939 return fn;
940 if (TREE_CODE (fn) == FUNCTION_DECL)
941 return fn;
942 tree type = TREE_TYPE (fn);
943 if (type == unknown_type_node)
944 return NULL_TREE;
945 gcc_assert (POINTER_TYPE_P (type));
946 fn = maybe_constant_init (fn);
947 STRIP_NOPS (fn);
948 if (TREE_CODE (fn) == ADDR_EXPR)
949 {
950 fn = TREE_OPERAND (fn, 0);
951 if (TREE_CODE (fn) == FUNCTION_DECL)
952 return fn;
953 }
954 return NULL_TREE;
955}
956
957/* Like get_callee_fndecl, but handles AGGR_INIT_EXPR as well and uses the
958 constexpr machinery. */
959
960tree
961cp_get_callee_fndecl (tree call)
962{
963 return cp_get_fndecl_from_callee (cp_get_callee (call));
964}
965
966/* Subroutine of convert_to_void. Warn if we're discarding something with
967 attribute [[nodiscard]]. */
968
969static void
970maybe_warn_nodiscard (tree expr, impl_conv_void implicit)
971{
972 tree call = expr;
973 if (TREE_CODE (expr) == TARGET_EXPR)
974 call = TARGET_EXPR_INITIAL (expr);
975 location_t loc = EXPR_LOC_OR_LOC (call, input_location);
976 tree callee = cp_get_callee (call);
977 if (!callee)
978 return;
979
980 tree type = TREE_TYPE (callee);
981 if (TYPE_PTRMEMFUNC_P (type))
982 type = TYPE_PTRMEMFUNC_FN_TYPE (type);
983 if (POINTER_TYPE_P (type))
984 type = TREE_TYPE (type);
985
986 tree rettype = TREE_TYPE (type);
987 tree fn = cp_get_fndecl_from_callee (callee);
988 if (implicit != ICV_CAST && fn
989 && lookup_attribute ("nodiscard", DECL_ATTRIBUTES (fn)))
990 {
991 if (warning_at (loc, OPT_Wunused_result,
992 "ignoring return value of %qD, "
993 "declared with attribute nodiscard", fn))
994 inform (DECL_SOURCE_LOCATION (fn), "declared here");
995 }
996 else if (implicit != ICV_CAST
997 && lookup_attribute ("nodiscard", TYPE_ATTRIBUTES (rettype)))
998 {
999 if (warning_at (loc, OPT_Wunused_result,
1000 "ignoring returned value of type %qT, "
1001 "declared with attribute nodiscard", rettype))
1002 {
1003 if (fn)
1004 inform (DECL_SOURCE_LOCATION (fn),
1005 "in call to %qD, declared here", fn);
1006 inform (DECL_SOURCE_LOCATION (TYPE_NAME (rettype)),
1007 "%qT declared here", rettype);
1008 }
1009 }
1010 else if (TREE_CODE (expr) == TARGET_EXPR
1011 && lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (type)))
1012 {
1013 /* The TARGET_EXPR confuses do_warn_unused_result into thinking that the
1014 result is used, so handle that case here. */
1015 if (fn)
1016 {
1017 if (warning_at (loc, OPT_Wunused_result,
1018 "ignoring return value of %qD, "
1019 "declared with attribute warn_unused_result",
1020 fn))
1021 inform (DECL_SOURCE_LOCATION (fn), "declared here");
1022 }
1023 else
1024 warning_at (loc, OPT_Wunused_result,
1025 "ignoring return value of function "
1026 "declared with attribute warn_unused_result");
1027 }
1028}
1029
b1a8d4ce 1030/* When an expression is used in a void context, its value is discarded and
1031 no lvalue-rvalue and similar conversions happen [expr.static.cast/4,
1032 stmt.expr/1, expr.comma/1]. This permits dereferencing an incomplete type
1033 in a void context. The C++ standard does not define what an `access' to an
63eff20d 1034 object is, but there is reason to believe that it is the lvalue to rvalue
b1a8d4ce 1035 conversion -- if it were not, `*&*p = 1' would violate [expr]/4 in that it
1036 accesses `*p' not to calculate the value to be stored. But, dcl.type.cv/8
1037 indicates that volatile semantics should be the same between C and C++
1038 where ever possible. C leaves it implementation defined as to what
1039 constitutes an access to a volatile. So, we interpret `*vp' as a read of
1040 the volatile object `vp' points to, unless that is an incomplete type. For
1041 volatile references we do not do this interpretation, because that would
1042 make it impossible to ignore the reference return value from functions. We
1043 issue warnings in the confusing cases.
9031d10b 1044
dab3247a 1045 The IMPLICIT is ICV_CAST when the user is explicitly converting an expression
1046 to void via a cast. If an expression is being implicitly converted, IMPLICIT
1047 indicates the context of the implicit conversion. */
b1a8d4ce 1048
1049tree
dab3247a 1050convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain)
b1a8d4ce 1051{
3df42822 1052 location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
61f69bc9 1053
9031d10b 1054 if (expr == error_mark_node
3d411d73 1055 || TREE_TYPE (expr) == error_mark_node)
1056 return error_mark_node;
b2af2a93 1057
dab3247a 1058 if (implicit == ICV_CAST)
f94341bb 1059 mark_exp_read (expr);
1060 else
1061 {
1062 tree exprv = expr;
1063
1064 while (TREE_CODE (exprv) == COMPOUND_EXPR)
1065 exprv = TREE_OPERAND (exprv, 1);
0388391d 1066 if (DECL_P (exprv)
1067 || handled_component_p (exprv)
86ccc124 1068 || INDIRECT_REF_P (exprv))
f94341bb 1069 /* Expr is not being 'used' here, otherwise we whould have
1070 called mark_{rl}value_use use here, which would have in turn
1071 called mark_exp_read. Rather, we call mark_exp_read directly
1072 to avoid some warnings when
1073 -Wunused-but-set-{variable,parameter} is in effect. */
1074 mark_exp_read (exprv);
1075 }
b2af2a93 1076
b1a8d4ce 1077 if (!TREE_TYPE (expr))
1078 return expr;
5c874cd3 1079 if (invalid_nonstatic_memfn_p (loc, expr, complain))
334f6ce1 1080 return error_mark_node;
ed36f1cf 1081 if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
1082 {
ebd21de4 1083 if (complain & tf_error)
61f69bc9 1084 error_at (loc, "pseudo-destructor is not called");
ed36f1cf 1085 return error_mark_node;
1086 }
e3cfe3ce 1087 if (VOID_TYPE_P (TREE_TYPE (expr)))
b1a8d4ce 1088 return expr;
1089 switch (TREE_CODE (expr))
1090 {
1091 case COND_EXPR:
1092 {
653e5405 1093 /* The two parts of a cond expr might be separate lvalues. */
1094 tree op1 = TREE_OPERAND (expr,1);
1095 tree op2 = TREE_OPERAND (expr,2);
527facbb 1096 bool side_effects = ((op1 && TREE_SIDE_EFFECTS (op1))
1097 || TREE_SIDE_EFFECTS (op2));
dab3247a 1098 tree new_op1, new_op2;
527facbb 1099 new_op1 = NULL_TREE;
dab3247a 1100 if (implicit != ICV_CAST && !side_effects)
1101 {
527facbb 1102 if (op1)
1103 new_op1 = convert_to_void (op1, ICV_SECOND_OF_COND, complain);
dab3247a 1104 new_op2 = convert_to_void (op2, ICV_THIRD_OF_COND, complain);
1105 }
1106 else
1107 {
527facbb 1108 if (op1)
1109 new_op1 = convert_to_void (op1, ICV_CAST, complain);
dab3247a 1110 new_op2 = convert_to_void (op2, ICV_CAST, complain);
1111 }
9031d10b 1112
527facbb 1113 expr = build3 (COND_EXPR, TREE_TYPE (new_op2),
831d52a2 1114 TREE_OPERAND (expr, 0), new_op1, new_op2);
653e5405 1115 break;
b1a8d4ce 1116 }
9031d10b 1117
b1a8d4ce 1118 case COMPOUND_EXPR:
1119 {
653e5405 1120 /* The second part of a compound expr contains the value. */
1121 tree op1 = TREE_OPERAND (expr,1);
dab3247a 1122 tree new_op1;
1123 if (implicit != ICV_CAST && !TREE_NO_WARNING (expr))
1124 new_op1 = convert_to_void (op1, ICV_RIGHT_OF_COMMA, complain);
1125 else
1126 new_op1 = convert_to_void (op1, ICV_CAST, complain);
9031d10b 1127
653e5405 1128 if (new_op1 != op1)
e907a2e9 1129 {
831d52a2 1130 tree t = build2 (COMPOUND_EXPR, TREE_TYPE (new_op1),
1131 TREE_OPERAND (expr, 0), new_op1);
e907a2e9 1132 expr = t;
1133 }
1134
653e5405 1135 break;
b1a8d4ce 1136 }
9031d10b 1137
b1a8d4ce 1138 case NON_LVALUE_EXPR:
1139 case NOP_EXPR:
c0af329c 1140 /* These have already decayed to rvalue. */
b1a8d4ce 1141 break;
9031d10b 1142
331bc0ad 1143 case CALL_EXPR: /* We have a special meaning for volatile void fn(). */
ddd2a3d4 1144 maybe_warn_nodiscard (expr, implicit);
b1a8d4ce 1145 break;
9031d10b 1146
b1a8d4ce 1147 case INDIRECT_REF:
1148 {
653e5405 1149 tree type = TREE_TYPE (expr);
1150 int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0)))
1151 == REFERENCE_TYPE;
1152 int is_volatile = TYPE_VOLATILE (type);
1153 int is_complete = COMPLETE_TYPE_P (complete_type (type));
1154
dc02da7f 1155 /* Can't load the value if we don't know the type. */
653e5405 1156 if (is_volatile && !is_complete)
ebd21de4 1157 {
1158 if (complain & tf_warning)
dab3247a 1159 switch (implicit)
1160 {
1161 case ICV_CAST:
61f69bc9 1162 warning_at (loc, 0, "conversion to void will not access "
dab3247a 1163 "object of incomplete type %qT", type);
1164 break;
1165 case ICV_SECOND_OF_COND:
61f69bc9 1166 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1167 "incomplete type %qT in second operand "
1168 "of conditional expression", type);
1169 break;
1170 case ICV_THIRD_OF_COND:
61f69bc9 1171 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1172 "incomplete type %qT in third operand "
1173 "of conditional expression", type);
1174 break;
1175 case ICV_RIGHT_OF_COMMA:
61f69bc9 1176 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1177 "incomplete type %qT in right operand of "
1178 "comma operator", type);
1179 break;
1180 case ICV_LEFT_OF_COMMA:
61f69bc9 1181 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1182 "incomplete type %qT in left operand of "
1183 "comma operator", type);
1184 break;
1185 case ICV_STATEMENT:
61f69bc9 1186 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1187 "incomplete type %qT in statement", type);
1188 break;
1189 case ICV_THIRD_IN_FOR:
61f69bc9 1190 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1191 "incomplete type %qT in for increment "
1192 "expression", type);
1193 break;
1194 default:
1195 gcc_unreachable ();
1196 }
ebd21de4 1197 }
dc02da7f 1198 /* Don't load the value if this is an implicit dereference, or if
1199 the type needs to be handled by ctors/dtors. */
dab3247a 1200 else if (is_volatile && is_reference)
ebd21de4 1201 {
1202 if (complain & tf_warning)
dab3247a 1203 switch (implicit)
1204 {
1205 case ICV_CAST:
61f69bc9 1206 warning_at (loc, 0, "conversion to void will not access "
dab3247a 1207 "object of type %qT", type);
1208 break;
1209 case ICV_SECOND_OF_COND:
61f69bc9 1210 warning_at (loc, 0, "implicit dereference will not access "
1211 "object of type %qT in second operand of "
dab3247a 1212 "conditional expression", type);
1213 break;
1214 case ICV_THIRD_OF_COND:
61f69bc9 1215 warning_at (loc, 0, "implicit dereference will not access "
1216 "object of type %qT in third operand of "
dab3247a 1217 "conditional expression", type);
1218 break;
1219 case ICV_RIGHT_OF_COMMA:
61f69bc9 1220 warning_at (loc, 0, "implicit dereference will not access "
1221 "object of type %qT in right operand of "
dab3247a 1222 "comma operator", type);
1223 break;
1224 case ICV_LEFT_OF_COMMA:
61f69bc9 1225 warning_at (loc, 0, "implicit dereference will not access "
1226 "object of type %qT in left operand of comma "
1227 "operator", type);
dab3247a 1228 break;
1229 case ICV_STATEMENT:
61f69bc9 1230 warning_at (loc, 0, "implicit dereference will not access "
1231 "object of type %qT in statement", type);
dab3247a 1232 break;
1233 case ICV_THIRD_IN_FOR:
61f69bc9 1234 warning_at (loc, 0, "implicit dereference will not access "
1235 "object of type %qT in for increment expression",
1236 type);
dab3247a 1237 break;
1238 default:
1239 gcc_unreachable ();
1240 }
ebd21de4 1241 }
dab3247a 1242 else if (is_volatile && TREE_ADDRESSABLE (type))
1243 {
1244 if (complain & tf_warning)
1245 switch (implicit)
1246 {
1247 case ICV_CAST:
61f69bc9 1248 warning_at (loc, 0, "conversion to void will not access "
dab3247a 1249 "object of non-trivially-copyable type %qT",
61f69bc9 1250 type);
dab3247a 1251 break;
1252 case ICV_SECOND_OF_COND:
61f69bc9 1253 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1254 "non-trivially-copyable type %qT in second "
1255 "operand of conditional expression", type);
1256 break;
1257 case ICV_THIRD_OF_COND:
61f69bc9 1258 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1259 "non-trivially-copyable type %qT in third "
1260 "operand of conditional expression", type);
1261 break;
1262 case ICV_RIGHT_OF_COMMA:
61f69bc9 1263 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1264 "non-trivially-copyable type %qT in right "
1265 "operand of comma operator", type);
1266 break;
1267 case ICV_LEFT_OF_COMMA:
61f69bc9 1268 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1269 "non-trivially-copyable type %qT in left "
1270 "operand of comma operator", type);
1271 break;
1272 case ICV_STATEMENT:
61f69bc9 1273 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1274 "non-trivially-copyable type %qT in statement",
61f69bc9 1275 type);
dab3247a 1276 break;
1277 case ICV_THIRD_IN_FOR:
61f69bc9 1278 warning_at (loc, 0, "indirection will not access object of "
dab3247a 1279 "non-trivially-copyable type %qT in for "
1280 "increment expression", type);
1281 break;
1282 default:
1283 gcc_unreachable ();
1284 }
1285 }
dc02da7f 1286 if (is_reference || !is_volatile || !is_complete || TREE_ADDRESSABLE (type))
a4d4030b 1287 {
1288 /* Emit a warning (if enabled) when the "effect-less" INDIRECT_REF
1289 operation is stripped off. Note that we don't warn about
1290 - an expression with TREE_NO_WARNING set. (For an example of
1291 such expressions, see build_over_call in call.c.)
1292 - automatic dereferencing of references, since the user cannot
3d177e8c 1293 control it. (See also warn_if_unused_value() in c-common.c.) */
a4d4030b 1294 if (warn_unused_value
dab3247a 1295 && implicit != ICV_CAST
a4d4030b 1296 && (complain & tf_warning)
1297 && !TREE_NO_WARNING (expr)
1298 && !is_reference)
61f69bc9 1299 warning_at (loc, OPT_Wunused_value, "value computed is not used");
a4d4030b 1300 expr = TREE_OPERAND (expr, 0);
409bb09c 1301 if (TREE_CODE (expr) == CALL_EXPR)
1302 maybe_warn_nodiscard (expr, implicit);
a4d4030b 1303 }
653e5405 1304
1305 break;
b1a8d4ce 1306 }
9031d10b 1307
b1a8d4ce 1308 case VAR_DECL:
1309 {
653e5405 1310 /* External variables might be incomplete. */
1311 tree type = TREE_TYPE (expr);
1312 int is_complete = COMPLETE_TYPE_P (complete_type (type));
1313
ebd21de4 1314 if (TYPE_VOLATILE (type) && !is_complete && (complain & tf_warning))
dab3247a 1315 switch (implicit)
1316 {
1317 case ICV_CAST:
61f69bc9 1318 warning_at (loc, 0, "conversion to void will not access "
dab3247a 1319 "object %qE of incomplete type %qT", expr, type);
1320 break;
1321 case ICV_SECOND_OF_COND:
61f69bc9 1322 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
1323 "not be accessed in second operand of "
dab3247a 1324 "conditional expression", expr, type);
1325 break;
1326 case ICV_THIRD_OF_COND:
61f69bc9 1327 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
1328 "not be accessed in third operand of "
dab3247a 1329 "conditional expression", expr, type);
1330 break;
1331 case ICV_RIGHT_OF_COMMA:
61f69bc9 1332 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
1333 "not be accessed in right operand of comma operator",
1334 expr, type);
dab3247a 1335 break;
1336 case ICV_LEFT_OF_COMMA:
61f69bc9 1337 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
1338 "not be accessed in left operand of comma operator",
1339 expr, type);
dab3247a 1340 break;
1341 case ICV_STATEMENT:
61f69bc9 1342 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
1343 "not be accessed in statement", expr, type);
dab3247a 1344 break;
1345 case ICV_THIRD_IN_FOR:
61f69bc9 1346 warning_at (loc, 0, "variable %qE of incomplete type %qT will "
1347 "not be accessed in for increment expression",
1348 expr, type);
dab3247a 1349 break;
1350 default:
1351 gcc_unreachable ();
1352 }
1353
653e5405 1354 break;
b1a8d4ce 1355 }
d9f88785 1356
25b3017b 1357 case TARGET_EXPR:
1358 /* Don't bother with the temporary object returned from a function if
1fe75cf2 1359 we don't use it, don't need to destroy it, and won't abort in
1360 assign_temp. We'll still
25b3017b 1361 allocate space for it in expand_call or declare_return_variable,
1362 but we don't need to track it through all the tree phases. */
67bb1301 1363 if (TARGET_EXPR_IMPLICIT_P (expr)
1fe75cf2 1364 && !TREE_ADDRESSABLE (TREE_TYPE (expr)))
25b3017b 1365 {
1366 tree init = TARGET_EXPR_INITIAL (expr);
1367 if (TREE_CODE (init) == AGGR_INIT_EXPR
1368 && !AGGR_INIT_VIA_CTOR_P (init))
1369 {
c2f47e15 1370 tree fn = AGGR_INIT_EXPR_FN (init);
389dd41b 1371 expr = build_call_array_loc (input_location,
ddd2a3d4 1372 TREE_TYPE (TREE_TYPE
1373 (TREE_TYPE (fn))),
389dd41b 1374 fn,
1375 aggr_init_expr_nargs (init),
1376 AGGR_INIT_EXPR_ARGP (init));
25b3017b 1377 }
1378 }
ddd2a3d4 1379 maybe_warn_nodiscard (expr, implicit);
25b3017b 1380 break;
1381
b1a8d4ce 1382 default:;
1383 }
703eb775 1384 expr = resolve_nondeduced_context (expr, complain);
b1a8d4ce 1385 {
1386 tree probe = expr;
9031d10b 1387
b1a8d4ce 1388 if (TREE_CODE (probe) == ADDR_EXPR)
1389 probe = TREE_OPERAND (expr, 0);
2e0e6579 1390 if (type_unknown_p (probe))
1391 {
1392 /* [over.over] enumerates the places where we can take the address
1393 of an overloaded function, and this is not one of them. */
ebd21de4 1394 if (complain & tf_error)
dab3247a 1395 switch (implicit)
1396 {
1397 case ICV_CAST:
61f69bc9 1398 error_at (loc, "conversion to void "
1399 "cannot resolve address of overloaded function");
dab3247a 1400 break;
1401 case ICV_SECOND_OF_COND:
61f69bc9 1402 error_at (loc, "second operand of conditional expression "
1403 "cannot resolve address of overloaded function");
dab3247a 1404 break;
1405 case ICV_THIRD_OF_COND:
61f69bc9 1406 error_at (loc, "third operand of conditional expression "
1407 "cannot resolve address of overloaded function");
dab3247a 1408 break;
1409 case ICV_RIGHT_OF_COMMA:
61f69bc9 1410 error_at (loc, "right operand of comma operator "
1411 "cannot resolve address of overloaded function");
dab3247a 1412 break;
1413 case ICV_LEFT_OF_COMMA:
61f69bc9 1414 error_at (loc, "left operand of comma operator "
1415 "cannot resolve address of overloaded function");
dab3247a 1416 break;
1417 case ICV_STATEMENT:
61f69bc9 1418 error_at (loc, "statement "
1419 "cannot resolve address of overloaded function");
dab3247a 1420 break;
1421 case ICV_THIRD_IN_FOR:
61f69bc9 1422 error_at (loc, "for increment expression "
1423 "cannot resolve address of overloaded function");
dab3247a 1424 break;
1425 }
ebd21de4 1426 else
1427 return error_mark_node;
3ab4693e 1428 expr = void_node;
2e0e6579 1429 }
dab3247a 1430 else if (implicit != ICV_CAST && probe == expr && is_overloaded_fn (probe))
2056769e 1431 {
1432 /* Only warn when there is no &. */
ebd21de4 1433 if (complain & tf_warning)
dab3247a 1434 switch (implicit)
1435 {
1436 case ICV_SECOND_OF_COND:
61f69bc9 1437 warning_at (loc, OPT_Waddress,
1438 "second operand of conditional expression "
1439 "is a reference, not call, to function %qE", expr);
dab3247a 1440 break;
1441 case ICV_THIRD_OF_COND:
61f69bc9 1442 warning_at (loc, OPT_Waddress,
1443 "third operand of conditional expression "
1444 "is a reference, not call, to function %qE", expr);
dab3247a 1445 break;
1446 case ICV_RIGHT_OF_COMMA:
61f69bc9 1447 warning_at (loc, OPT_Waddress,
1448 "right operand of comma operator "
1449 "is a reference, not call, to function %qE", expr);
dab3247a 1450 break;
1451 case ICV_LEFT_OF_COMMA:
61f69bc9 1452 warning_at (loc, OPT_Waddress,
1453 "left operand of comma operator "
1454 "is a reference, not call, to function %qE", expr);
dab3247a 1455 break;
1456 case ICV_STATEMENT:
61f69bc9 1457 warning_at (loc, OPT_Waddress,
1458 "statement is a reference, not call, to function %qE",
1459 expr);
dab3247a 1460 break;
1461 case ICV_THIRD_IN_FOR:
61f69bc9 1462 warning_at (loc, OPT_Waddress,
1463 "for increment expression "
1464 "is a reference, not call, to function %qE", expr);
dab3247a 1465 break;
1466 default:
1467 gcc_unreachable ();
1468 }
1469
2056769e 1470 if (TREE_CODE (expr) == COMPONENT_REF)
1471 expr = TREE_OPERAND (expr, 0);
1472 }
b1a8d4ce 1473 }
9031d10b 1474
e3cfe3ce 1475 if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr)))
b1a8d4ce 1476 {
dab3247a 1477 if (implicit != ICV_CAST
5e2a4133 1478 && warn_unused_value
1479 && !TREE_NO_WARNING (expr)
1480 && !processing_template_decl)
1fe46df1 1481 {
1482 /* The middle end does not warn about expressions that have
1483 been explicitly cast to void, so we must do so here. */
ebd21de4 1484 if (!TREE_SIDE_EFFECTS (expr)) {
1485 if (complain & tf_warning)
dab3247a 1486 switch (implicit)
1487 {
1488 case ICV_SECOND_OF_COND:
61f69bc9 1489 warning_at (loc, OPT_Wunused_value,
1490 "second operand of conditional expression "
1491 "has no effect");
dab3247a 1492 break;
1493 case ICV_THIRD_OF_COND:
61f69bc9 1494 warning_at (loc, OPT_Wunused_value,
1495 "third operand of conditional expression "
1496 "has no effect");
dab3247a 1497 break;
1498 case ICV_RIGHT_OF_COMMA:
61f69bc9 1499 warning_at (loc, OPT_Wunused_value,
1500 "right operand of comma operator has no effect");
dab3247a 1501 break;
1502 case ICV_LEFT_OF_COMMA:
61f69bc9 1503 warning_at (loc, OPT_Wunused_value,
1504 "left operand of comma operator has no effect");
dab3247a 1505 break;
1506 case ICV_STATEMENT:
61f69bc9 1507 warning_at (loc, OPT_Wunused_value,
1508 "statement has no effect");
dab3247a 1509 break;
1510 case ICV_THIRD_IN_FOR:
61f69bc9 1511 warning_at (loc, OPT_Wunused_value,
1512 "for increment expression has no effect");
dab3247a 1513 break;
1514 default:
1515 gcc_unreachable ();
1516 }
ebd21de4 1517 }
9031d10b 1518 else
1519 {
1fe46df1 1520 tree e;
1521 enum tree_code code;
607a5d68 1522 enum tree_code_class tclass;
9031d10b 1523
1fe46df1 1524 e = expr;
1525 /* We might like to warn about (say) "(int) f()", as the
1526 cast has no effect, but the compiler itself will
1527 generate implicit conversions under some
324d8f2d 1528 circumstances. (For example a block copy will be
1fe46df1 1529 turned into a call to "__builtin_memcpy", with a
1530 conversion of the return value to an appropriate
1531 type.) So, to avoid false positives, we strip
416ce344 1532 conversions. Do not use STRIP_NOPs because it will
1533 not strip conversions to "void", as that is not a
1534 mode-preserving conversion. */
1535 while (TREE_CODE (e) == NOP_EXPR)
1536 e = TREE_OPERAND (e, 0);
1fe46df1 1537
1538 code = TREE_CODE (e);
607a5d68 1539 tclass = TREE_CODE_CLASS (code);
1540 if ((tclass == tcc_comparison
1541 || tclass == tcc_unary
1542 || (tclass == tcc_binary
1fe46df1 1543 && !(code == MODIFY_EXPR
1544 || code == INIT_EXPR
1545 || code == PREDECREMENT_EXPR
1546 || code == PREINCREMENT_EXPR
1547 || code == POSTDECREMENT_EXPR
9372a89d 1548 || code == POSTINCREMENT_EXPR))
1549 || code == VEC_PERM_EXPR
1550 || code == VEC_COND_EXPR)
ebd21de4 1551 && (complain & tf_warning))
61f69bc9 1552 warning_at (loc, OPT_Wunused_value, "value computed is not used");
1fe46df1 1553 }
1554 }
00fa9079 1555 expr = build1 (CONVERT_EXPR, void_type_node, expr);
b1a8d4ce 1556 }
de5ad4cb 1557 if (! TREE_SIDE_EFFECTS (expr))
3ab4693e 1558 expr = void_node;
b1a8d4ce 1559 return expr;
1560}
1561
d81e00a4 1562/* Create an expression whose value is that of EXPR,
1563 converted to type TYPE. The TREE_TYPE of the value
1564 is always TYPE. This function implements all reasonable
1565 conversions; callers should filter out those that are
c4a8ac95 1566 not permitted by the language being compiled.
1567
1568 Most of this routine is from build_reinterpret_cast.
1569
a17c2a3a 1570 The back end cannot call cp_convert (what was convert) because
c4a8ac95 1571 conversions to/from basetypes may involve memory references
1572 (vbases) and adding or subtracting small values (multiple
1573 inheritance), but it calls convert from the constant folding code
e0aa5007 1574 on subtrees of already built trees after it has ripped them apart.
c4a8ac95 1575
1576 Also, if we ever support range variables, we'll probably also have to
1577 do a little bit more work. */
d81e00a4 1578
1579tree
35771a9a 1580convert (tree type, tree expr)
d81e00a4 1581{
c4a8ac95 1582 tree intype;
1583
1584 if (type == error_mark_node || expr == error_mark_node)
1585 return error_mark_node;
1586
c4a8ac95 1587 intype = TREE_TYPE (expr);
1588
6686e84d 1589 if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype))
d2c63826 1590 return build_nop (type, expr);
c4a8ac95 1591
b981525c 1592 return ocp_convert (type, expr, CONV_BACKEND_CONVERT,
c4698a21 1593 LOOKUP_NORMAL|LOOKUP_NO_CONVERSION,
1594 tf_warning_or_error);
d81e00a4 1595}
1596
c4a8ac95 1597/* Like cp_convert, except permit conversions to take place which
471086d6 1598 are not normally allowed due to access restrictions
1599 (such as conversion from sub-type to private super-type). */
96624a9e 1600
471086d6 1601tree
c4698a21 1602convert_force (tree type, tree expr, int convtype, tsubst_flags_t complain)
471086d6 1603{
cd16867a 1604 tree e = expr;
1605 enum tree_code code = TREE_CODE (type);
471086d6 1606
1607 if (code == REFERENCE_TYPE)
d2c63826 1608 return convert_to_reference (type, e, CONV_C_CAST, 0,
1609 NULL_TREE, complain);
471086d6 1610
1611 if (code == POINTER_TYPE)
d2c63826 1612 return convert_to_pointer_force (type, e, complain);
471086d6 1613
ac9386a0 1614 /* From typeck.c convert_for_assignment */
c21c015b 1615 if (((TYPE_PTR_P (TREE_TYPE (e)) && TREE_CODE (e) == ADDR_EXPR
471086d6 1616 && TREE_CODE (TREE_TYPE (TREE_TYPE (e))) == METHOD_TYPE)
ac9386a0 1617 || integer_zerop (e)
1618 || TYPE_PTRMEMFUNC_P (TREE_TYPE (e)))
471086d6 1619 && TYPE_PTRMEMFUNC_P (type))
cb02169c 1620 /* compatible pointer to member functions. */
1621 return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1,
c4698a21 1622 /*c_cast_p=*/1, complain);
a74e8896 1623
c4698a21 1624 return ocp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL, complain);
471086d6 1625}
1626
471086d6 1627/* Convert an aggregate EXPR to type XTYPE. If a conversion
1628 exists, return the attempted conversion. This may
1629 return ERROR_MARK_NODE if the conversion is not
1630 allowed (references private members, etc).
1631 If no conversion exists, NULL_TREE is returned.
1632
ce28ee2e 1633 FIXME: Ambiguity checking is wrong. Should choose one by the implicit
1634 object parameter, or by the second standard conversion sequence if
1635 that doesn't do it. This will probably wait for an overloading rewrite.
1636 (jason 8/9/95) */
471086d6 1637
ef9571e5 1638static tree
8999978b 1639build_type_conversion (tree xtype, tree expr)
471086d6 1640{
1641 /* C++: check to see if we can convert this aggregate type
bcf789d7 1642 into the required type. */
66bbeb85 1643 return build_user_type_conversion (xtype, expr, LOOKUP_NORMAL,
1644 tf_warning_or_error);
471086d6 1645}
1646
1e66592c 1647/* Convert the given EXPR to one of a group of types suitable for use in an
1648 expression. DESIRES is a combination of various WANT_* flags (q.v.)
35771a9a 1649 which indicates which types are suitable. If COMPLAIN is true, complain
1e66592c 1650 about ambiguity; otherwise, the caller will deal with it. */
471086d6 1651
1e66592c 1652tree
35771a9a 1653build_expr_type_conversion (int desires, tree expr, bool complain)
471086d6 1654{
1e66592c 1655 tree basetype = TREE_TYPE (expr);
6a44e72e 1656 tree conv = NULL_TREE;
bdd152ce 1657 tree winner = NULL_TREE;
471086d6 1658
9031d10b 1659 if (expr == null_node
1660 && (desires & WANT_INT)
954885ed 1661 && !(desires & WANT_NULL))
db30b351 1662 {
1663 source_location loc =
1664 expansion_point_location_if_in_system_header (input_location);
1665
1666 warning_at (loc, OPT_Wconversion_null,
1667 "converting NULL to non-pointer type");
1668 }
9031d10b 1669
3d411d73 1670 if (basetype == error_mark_node)
1671 return error_mark_node;
1672
95397ff9 1673 if (! MAYBE_CLASS_TYPE_P (basetype))
bdd152ce 1674 switch (TREE_CODE (basetype))
1675 {
1676 case INTEGER_TYPE:
954885ed 1677 if ((desires & WANT_NULL) && null_ptr_cst_p (expr))
bdd152ce 1678 return expr;
e3533433 1679 /* fall through. */
bdd152ce 1680
1681 case BOOLEAN_TYPE:
1682 return (desires & WANT_INT) ? expr : NULL_TREE;
1683 case ENUMERAL_TYPE:
1684 return (desires & WANT_ENUM) ? expr : NULL_TREE;
1685 case REAL_TYPE:
1686 return (desires & WANT_FLOAT) ? expr : NULL_TREE;
1687 case POINTER_TYPE:
1688 return (desires & WANT_POINTER) ? expr : NULL_TREE;
9031d10b 1689
bdd152ce 1690 case FUNCTION_TYPE:
1691 case ARRAY_TYPE:
4405c1ad 1692 return (desires & WANT_POINTER) ? decay_conversion (expr,
1693 tf_warning_or_error)
653e5405 1694 : NULL_TREE;
96ec9e30 1695
64ec1ad6 1696 case COMPLEX_TYPE:
96ec9e30 1697 case VECTOR_TYPE:
64ec1ad6 1698 if ((desires & WANT_VECTOR_OR_COMPLEX) == 0)
96ec9e30 1699 return NULL_TREE;
1700 switch (TREE_CODE (TREE_TYPE (basetype)))
1701 {
1702 case INTEGER_TYPE:
1703 case BOOLEAN_TYPE:
1704 return (desires & WANT_INT) ? expr : NULL_TREE;
1705 case ENUMERAL_TYPE:
1706 return (desires & WANT_ENUM) ? expr : NULL_TREE;
1707 case REAL_TYPE:
1708 return (desires & WANT_FLOAT) ? expr : NULL_TREE;
1709 default:
1710 return NULL_TREE;
1711 }
1712
bdd152ce 1713 default:
1714 return NULL_TREE;
1715 }
1716
1717 /* The code for conversions from class type is currently only used for
1718 delete expressions. Other expressions are handled by build_new_op. */
a5f2d620 1719 if (!complete_type_or_maybe_complain (basetype, expr, complain))
f8182e08 1720 return error_mark_node;
1721 if (!TYPE_HAS_CONVERSION (basetype))
bdd152ce 1722 return NULL_TREE;
1723
9960d752 1724 for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv))
bdd152ce 1725 {
1726 int win = 0;
1727 tree candidate;
1728 tree cand = TREE_VALUE (conv);
6767ca9a 1729 cand = OVL_FIRST (cand);
bdd152ce 1730
1731 if (winner && winner == cand)
1732 continue;
1733
cf7aa2e5 1734 if (DECL_NONCONVERTING_P (cand))
1735 continue;
1736
ef4534a3 1737 candidate = non_reference (TREE_TYPE (TREE_TYPE (cand)));
bdd152ce 1738
1739 switch (TREE_CODE (candidate))
1740 {
1741 case BOOLEAN_TYPE:
1742 case INTEGER_TYPE:
1743 win = (desires & WANT_INT); break;
1744 case ENUMERAL_TYPE:
1745 win = (desires & WANT_ENUM); break;
1746 case REAL_TYPE:
1747 win = (desires & WANT_FLOAT); break;
1748 case POINTER_TYPE:
1749 win = (desires & WANT_POINTER); break;
1750
64ec1ad6 1751 case COMPLEX_TYPE:
96ec9e30 1752 case VECTOR_TYPE:
64ec1ad6 1753 if ((desires & WANT_VECTOR_OR_COMPLEX) == 0)
96ec9e30 1754 break;
1755 switch (TREE_CODE (TREE_TYPE (candidate)))
1756 {
1757 case BOOLEAN_TYPE:
1758 case INTEGER_TYPE:
1759 win = (desires & WANT_INT); break;
1760 case ENUMERAL_TYPE:
1761 win = (desires & WANT_ENUM); break;
1762 case REAL_TYPE:
1763 win = (desires & WANT_FLOAT); break;
1764 default:
1765 break;
1766 }
1767 break;
1768
bdd152ce 1769 default:
9c4c1195 1770 /* A wildcard could be instantiated to match any desired
1771 type, but we can't deduce the template argument. */
1772 if (WILDCARD_TYPE_P (candidate))
1773 win = true;
bdd152ce 1774 break;
1775 }
1776
1777 if (win)
1778 {
9c4c1195 1779 if (TREE_CODE (cand) == TEMPLATE_DECL)
1780 {
1781 if (complain)
1782 error ("default type conversion can't deduce template"
1783 " argument for %qD", cand);
1784 return error_mark_node;
1785 }
1786
bdd152ce 1787 if (winner)
1788 {
609c541f 1789 tree winner_type
1790 = non_reference (TREE_TYPE (TREE_TYPE (winner)));
1791
1792 if (!same_type_ignoring_top_level_qualifiers_p (winner_type,
1793 candidate))
bdd152ce 1794 {
609c541f 1795 if (complain)
1796 {
1797 error ("ambiguous default type conversion from %qT",
1798 basetype);
392214f6 1799 inform (input_location,
1800 " candidate conversions include %qD and %qD",
1801 winner, cand);
609c541f 1802 }
1803 return error_mark_node;
bdd152ce 1804 }
bdd152ce 1805 }
609c541f 1806
1807 winner = cand;
bdd152ce 1808 }
1809 }
1e66592c 1810
bdd152ce 1811 if (winner)
1812 {
ef4534a3 1813 tree type = non_reference (TREE_TYPE (TREE_TYPE (winner)));
66bbeb85 1814 return build_user_type_conversion (type, expr, LOOKUP_NORMAL,
1815 tf_warning_or_error);
471086d6 1816 }
1e66592c 1817
985e9ee0 1818 return NULL_TREE;
471086d6 1819}
bc3887cf 1820
96624a9e 1821/* Implements integral promotion (4.1) and float->double promotion. */
1822
bc3887cf 1823tree
35771a9a 1824type_promotes_to (tree type)
bc3887cf 1825{
2b3c93a3 1826 tree promoted_type;
1827
ce28ee2e 1828 if (type == error_mark_node)
1829 return error_mark_node;
1830
bc3887cf 1831 type = TYPE_MAIN_VARIANT (type);
bb0726a1 1832
2b3c93a3 1833 /* Check for promotions of target-defined types first. */
1834 promoted_type = targetm.promoted_type (type);
1835 if (promoted_type)
1836 return promoted_type;
1837
bb0726a1 1838 /* bool always promotes to int (not unsigned), even if it's the same
1839 size. */
9e1a8234 1840 if (TREE_CODE (type) == BOOLEAN_TYPE)
bb0726a1 1841 type = integer_type_node;
1842
1843 /* Normally convert enums to int, but convert wide enums to something
74b777e5 1844 wider. Scoped enums don't promote, but pretend they do for backward
1845 ABI bug compatibility wrt varargs. */
bb0726a1 1846 else if (TREE_CODE (type) == ENUMERAL_TYPE
924bbf02 1847 || type == char16_type_node
1848 || type == char32_type_node
bb0726a1 1849 || type == wchar_type_node)
6c9497b1 1850 {
1851 int precision = MAX (TYPE_PRECISION (type),
1852 TYPE_PRECISION (integer_type_node));
771d21fa 1853 tree totype = c_common_type_for_size (precision, 0);
74b777e5 1854 tree prom = type;
1855 if (TREE_CODE (prom) == ENUMERAL_TYPE)
1856 prom = ENUM_UNDERLYING_TYPE (prom);
1857 if (TYPE_UNSIGNED (prom)
1858 && ! int_fits_type_p (TYPE_MAX_VALUE (prom), totype))
1859 prom = c_common_type_for_size (precision, 1);
1860 else
1861 prom = totype;
72fc0f64 1862 if (SCOPED_ENUM_P (type))
74b777e5 1863 {
1864 if (abi_version_crosses (6)
1865 && TYPE_MODE (prom) != TYPE_MODE (type))
1866 warning (OPT_Wabi, "scoped enum %qT passed through ... as "
1867 "%qT before -fabi-version=6, %qT after",
1868 type, prom, ENUM_UNDERLYING_TYPE (type));
1869 if (!abi_version_at_least (6))
1870 type = prom;
1871 }
6c9497b1 1872 else
74b777e5 1873 type = prom;
6c9497b1 1874 }
d7aeef06 1875 else if (c_promoting_integer_type_p (type))
bc3887cf 1876 {
d0acef9e 1877 /* Retain unsignedness if really not getting bigger. */
78a8ed03 1878 if (TYPE_UNSIGNED (type)
d0acef9e 1879 && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
bc3887cf 1880 type = unsigned_type_node;
1881 else
1882 type = integer_type_node;
1883 }
1884 else if (type == float_type_node)
1885 type = double_type_node;
9031d10b 1886
a681799d 1887 return type;
bc3887cf 1888}
668ae905 1889
668ae905 1890/* The routines below this point are carefully written to conform to
1891 the standard. They use the same terminology, and follow the rules
1892 closely. Although they are used only in pt.c at the moment, they
1893 should presumably be used everywhere in the future. */
1894
0a8a2108 1895/* True iff EXPR can be converted to TYPE via a qualification conversion.
1896 Callers should check for identical types before calling this function. */
1897
1898bool
1899can_convert_qual (tree type, tree expr)
1900{
1901 tree expr_type = TREE_TYPE (expr);
1902 gcc_assert (!same_type_p (type, expr_type));
1903
1904 if (TYPE_PTR_P (type) && TYPE_PTR_P (expr_type))
1905 return comp_ptr_ttypes (TREE_TYPE (type), TREE_TYPE (expr_type));
1906 else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (expr_type))
1907 return (same_type_p (TYPE_PTRMEM_CLASS_TYPE (type),
1908 TYPE_PTRMEM_CLASS_TYPE (expr_type))
1909 && comp_ptr_ttypes (TYPE_PTRMEM_POINTED_TO_TYPE (type),
1910 TYPE_PTRMEM_POINTED_TO_TYPE (expr_type)));
1911 else
1912 return false;
1913}
1914
1146f179 1915/* Attempt to perform qualification conversions on EXPR to convert it
1916 to TYPE. Return the resulting expression, or error_mark_node if
1917 the conversion was impossible. */
1918
9031d10b 1919tree
35771a9a 1920perform_qualification_conversions (tree type, tree expr)
668ae905 1921{
1bc16cab 1922 tree expr_type;
1923
1924 expr_type = TREE_TYPE (expr);
1925
3b087710 1926 if (same_type_p (type, expr_type))
1927 return expr;
0a8a2108 1928 else if (can_convert_qual (type, expr))
1bc16cab 1929 return build_nop (type, expr);
1146f179 1930 else
1931 return error_mark_node;
668ae905 1932}
6d02e6b2 1933
1934/* True iff T is a transaction-safe function type. */
1935
1936bool
1937tx_safe_fn_type_p (tree t)
1938{
1939 if (TREE_CODE (t) != FUNCTION_TYPE
1940 && TREE_CODE (t) != METHOD_TYPE)
1941 return false;
1942 return !!lookup_attribute ("transaction_safe", TYPE_ATTRIBUTES (t));
1943}
1944
1945/* Return the transaction-unsafe variant of transaction-safe function type
1946 T. */
1947
1948tree
1949tx_unsafe_fn_variant (tree t)
1950{
1951 gcc_assert (tx_safe_fn_type_p (t));
1952 tree attrs = remove_attribute ("transaction_safe",
1953 TYPE_ATTRIBUTES (t));
1954 return cp_build_type_attribute_variant (t, attrs);
1955}
1956
1957/* Return true iff FROM can convert to TO by a transaction-safety
1958 conversion. */
1959
2e9e9363 1960static bool
6d02e6b2 1961can_convert_tx_safety (tree to, tree from)
1962{
1963 return (flag_tm && tx_safe_fn_type_p (from)
1964 && same_type_p (to, tx_unsafe_fn_variant (from)));
1965}
2e9e9363 1966
1967/* Return true iff FROM can convert to TO by dropping noexcept. */
1968
1969static bool
1970noexcept_conv_p (tree to, tree from)
1971{
1972 if (!flag_noexcept_type)
1973 return false;
1974
1975 tree t = non_reference (to);
1976 tree f = from;
1977 if (TYPE_PTRMEMFUNC_P (t)
1978 && TYPE_PTRMEMFUNC_P (f))
1979 {
1980 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
1981 f = TYPE_PTRMEMFUNC_FN_TYPE (f);
1982 }
1983 if (TREE_CODE (t) == POINTER_TYPE
1984 && TREE_CODE (f) == POINTER_TYPE)
1985 {
1986 t = TREE_TYPE (t);
1987 f = TREE_TYPE (f);
1988 }
1989 tree_code code = TREE_CODE (f);
1990 if (TREE_CODE (t) != code)
1991 return false;
1992 if (code != FUNCTION_TYPE && code != METHOD_TYPE)
1993 return false;
1994 if (!type_throw_all_p (t)
1995 || type_throw_all_p (f))
1996 return false;
1997 tree v = build_exception_variant (f, NULL_TREE);
1998 return same_type_p (t, v);
1999}
2000
2001/* Return true iff FROM can convert to TO by a function pointer conversion. */
2002
2003bool
2004fnptr_conv_p (tree to, tree from)
2005{
2006 tree t = non_reference (to);
2007 tree f = from;
2008 if (TYPE_PTRMEMFUNC_P (t)
2009 && TYPE_PTRMEMFUNC_P (f))
2010 {
2011 t = TYPE_PTRMEMFUNC_FN_TYPE (t);
2012 f = TYPE_PTRMEMFUNC_FN_TYPE (f);
2013 }
2014 if (TREE_CODE (t) == POINTER_TYPE
2015 && TREE_CODE (f) == POINTER_TYPE)
2016 {
2017 t = TREE_TYPE (t);
2018 f = TREE_TYPE (f);
2019 }
2020
2021 return (noexcept_conv_p (t, f)
2022 || can_convert_tx_safety (t, f));
2023}
2024
2104a0fd 2025/* Return FN with any NOP_EXPRs stripped that represent function pointer
2026 conversions or conversions to the same type. */
2e9e9363 2027
2028tree
2029strip_fnptr_conv (tree fn)
2030{
2031 while (TREE_CODE (fn) == NOP_EXPR)
2032 {
2033 tree op = TREE_OPERAND (fn, 0);
2104a0fd 2034 tree ft = TREE_TYPE (fn);
2035 tree ot = TREE_TYPE (op);
2036 if (same_type_p (ft, ot)
2037 || fnptr_conv_p (ft, ot))
2e9e9363 2038 fn = op;
2039 else
2040 break;
2041 }
2042 return fn;
2043}