]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/cvt.c
PR rtl-optimization/43520
[thirdparty/gcc.git] / gcc / cp / cvt.c
CommitLineData
471086d6 1/* Language-level data type conversion for GNU C++.
107c7f39 2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
f352a3fb 3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
aa139c3f 4 Free Software Foundation, Inc.
471086d6 5 Hacked by Michael Tiemann (tiemann@cygnus.com)
6
6f0d25a6 7This file is part of GCC.
471086d6 8
6f0d25a6 9GCC is free software; you can redistribute it and/or modify
471086d6 10it under the terms of the GNU General Public License as published by
aa139c3f 11the Free Software Foundation; either version 3, or (at your option)
471086d6 12any later version.
13
6f0d25a6 14GCC is distributed in the hope that it will be useful,
471086d6 15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
aa139c3f 20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
471086d6 22
23
af86cc06 24/* This file contains the functions for converting C++ expressions
471086d6 25 to different data types. The only entry point is `convert'.
26 Every language front end must have a `convert' function
27 but what kind of conversions it does will depend on the language. */
28
29#include "config.h"
b3ef7553 30#include "system.h"
805e22b2 31#include "coretypes.h"
32#include "tm.h"
471086d6 33#include "tree.h"
34#include "flags.h"
35#include "cp-tree.h"
ca82e026 36#include "intl.h"
471086d6 37#include "convert.h"
f0eaeecd 38#include "toplev.h"
2e8226f7 39#include "decl.h"
7a979707 40#include "target.h"
96624a9e 41
e5ead12a 42static tree cp_convert_to_pointer (tree, tree);
35771a9a 43static tree convert_to_pointer_force (tree, tree);
ef9571e5 44static tree build_type_conversion (tree, tree);
35771a9a 45static tree build_up_reference (tree, tree, int, tree);
46static void warn_ref_binding (tree, tree, tree);
71ccdfff 47
471086d6 48/* Change of width--truncation and extension of integers or reals--
49 is represented with NOP_EXPR. Proper functioning of many things
50 assumes that no other conversions can be NOP_EXPRs.
51
52 Conversion between integer and pointer is represented with CONVERT_EXPR.
53 Converting integer to real uses FLOAT_EXPR
54 and real to integer uses FIX_TRUNC_EXPR.
55
56 Here is a list of all the functions that assume that widening and
57 narrowing is always done with a NOP_EXPR:
58 In convert.c, convert_to_integer.
59 In c-typeck.c, build_binary_op_nodefault (boolean ops),
653e5405 60 and c_common_truthvalue_conversion.
471086d6 61 In expr.c: expand_expr, for operands of a MULT_EXPR.
62 In fold-const.c: fold.
63 In tree.c: get_narrower and get_unwidened.
64
65 C++: in multiple-inheritance, converting between pointers may involve
66 adjusting them by a delta stored within the class definition. */
67\f
68/* Subroutines of `convert'. */
69
471086d6 70/* if converting pointer to pointer
71 if dealing with classes, check for derived->base or vice versa
72 else if dealing with method pointers, delegate
73 else convert blindly
74 else if converting class, pass off to build_type_conversion
e5ead12a 75 else try C-style pointer conversion. */
96624a9e 76
471086d6 77static tree
e5ead12a 78cp_convert_to_pointer (tree type, tree expr)
471086d6 79{
cd16867a 80 tree intype = TREE_TYPE (expr);
81 enum tree_code form;
f82eeb87 82 tree rval;
8bf328bf 83 if (intype == error_mark_node)
84 return error_mark_node;
74002e1d 85
95397ff9 86 if (MAYBE_CLASS_TYPE_P (intype))
96624a9e 87 {
96624a9e 88 intype = complete_type (intype);
4b72716d 89 if (!COMPLETE_TYPE_P (intype))
96624a9e 90 {
0a25aad6 91 error ("can't convert from incomplete type %qT to %qT",
653e5405 92 intype, type);
96624a9e 93 return error_mark_node;
94 }
95
8999978b 96 rval = build_type_conversion (type, expr);
96624a9e 97 if (rval)
98 {
99 if (rval == error_mark_node)
0a25aad6 100 error ("conversion of %qE from %qT to %qT is ambiguous",
653e5405 101 expr, intype, type);
96624a9e 102 return rval;
103 }
104 }
105
860740a7 106 /* Handle anachronistic conversions from (::*)() to cv void* or (*)(). */
38281c46 107 if (TREE_CODE (type) == POINTER_TYPE
108 && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
e3cfe3ce 109 || VOID_TYPE_P (TREE_TYPE (type))))
38281c46 110 {
6ab399e8 111 if (TYPE_PTRMEMFUNC_P (intype)
112 || TREE_CODE (intype) == METHOD_TYPE)
113 return convert_member_func_to_ptr (type, expr);
a63bc44c 114 if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
115 return build_nop (type, expr);
38281c46 116 intype = TREE_TYPE (expr);
117 }
118
311e42bc 119 if (expr == error_mark_node)
120 return error_mark_node;
121
74002e1d 122 form = TREE_CODE (intype);
123
2b77484d 124 if (POINTER_TYPE_P (intype))
471086d6 125 {
126 intype = TYPE_MAIN_VARIANT (intype);
127
128 if (TYPE_MAIN_VARIANT (type) != intype
2b77484d 129 && TREE_CODE (type) == POINTER_TYPE
471086d6 130 && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
95397ff9 131 && MAYBE_CLASS_TYPE_P (TREE_TYPE (type))
132 && MAYBE_CLASS_TYPE_P (TREE_TYPE (intype))
4a2680fc 133 && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
471086d6 134 {
135 enum tree_code code = PLUS_EXPR;
4a2680fc 136 tree binfo;
8999978b 137 tree intype_class;
138 tree type_class;
139 bool same_p;
4a2680fc 140
8999978b 141 intype_class = TREE_TYPE (intype);
142 type_class = TREE_TYPE (type);
143
9031d10b 144 same_p = same_type_p (TYPE_MAIN_VARIANT (intype_class),
8999978b 145 TYPE_MAIN_VARIANT (type_class));
146 binfo = NULL_TREE;
c0af329c 147 /* Try derived to base conversion. */
8999978b 148 if (!same_p)
149 binfo = lookup_base (intype_class, type_class, ba_check, NULL);
150 if (!same_p && !binfo)
471086d6 151 {
c0af329c 152 /* Try base to derived conversion. */
8999978b 153 binfo = lookup_base (type_class, intype_class, ba_check, NULL);
471086d6 154 code = MINUS_EXPR;
155 }
4a2680fc 156 if (binfo == error_mark_node)
157 return error_mark_node;
8999978b 158 if (binfo || same_p)
471086d6 159 {
8999978b 160 if (binfo)
161 expr = build_base_path (code, expr, binfo, 0);
c0af329c 162 /* Add any qualifier conversions. */
8999978b 163 return build_nop (type, expr);
471086d6 164 }
165 }
471086d6 166
1bc16cab 167 if (TYPE_PTRMEMFUNC_P (type))
bea7d742 168 {
0a25aad6 169 error ("cannot convert %qE from type %qT to type %qT",
653e5405 170 expr, intype, type);
1bc16cab 171 return error_mark_node;
172 }
a17aefa2 173
1bc16cab 174 return build_nop (type, expr);
175 }
e5ead12a 176 else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
177 || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
178 return convert_ptrmem (type, expr, /*allow_inverse_p=*/false,
179 /*c_cast_p=*/false);
2b77484d 180 else if (TYPE_PTRMEMFUNC_P (intype))
181 {
a63bc44c 182 if (!warn_pmf2ptr)
183 {
184 if (TREE_CODE (expr) == PTRMEM_CST)
185 return cp_convert_to_pointer (type,
e5ead12a 186 PTRMEM_CST_MEMBER (expr));
a63bc44c 187 else if (TREE_CODE (expr) == OFFSET_REF)
188 {
189 tree object = TREE_OPERAND (expr, 0);
190 return get_member_function_from_ptrfunc (&object,
191 TREE_OPERAND (expr, 1));
192 }
193 }
0a25aad6 194 error ("cannot convert %qE from type %qT to type %qT",
653e5405 195 expr, intype, type);
2b77484d 196 return error_mark_node;
197 }
471086d6 198
471086d6 199 if (integer_zerop (expr))
200 {
2b77484d 201 if (TYPE_PTRMEMFUNC_P (type))
cb02169c 202 return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0,
203 /*c_cast_p=*/false);
ad63a0fc 204
606b494c 205 if (TYPE_PTRMEM_P (type))
7c446c95 206 {
207 /* A NULL pointer-to-member is represented by -1, not by
208 zero. */
697bbc3f 209 expr = build_int_cst_type (type, -1);
7c446c95 210 }
ad63a0fc 211 else
7016c612 212 expr = build_int_cst (type, 0);
9031d10b 213
471086d6 214 return expr;
215 }
1bc16cab 216 else if (TYPE_PTR_TO_MEMBER_P (type) && INTEGRAL_CODE_P (form))
de1f960a 217 {
0a25aad6 218 error ("invalid conversion from %qT to %qT", intype, type);
de1f960a 219 return error_mark_node;
220 }
471086d6 221
bb0726a1 222 if (INTEGRAL_CODE_P (form))
471086d6 223 {
c5aa1e92 224 if (TYPE_PRECISION (intype) == POINTER_SIZE)
471086d6 225 return build1 (CONVERT_EXPR, type, expr);
771d21fa 226 expr = cp_convert (c_common_type_for_size (POINTER_SIZE, 0), expr);
092b1d6f 227 /* Modes may be different but sizes should be the same. There
228 is supposed to be some integral type that is the same width
229 as a pointer. */
230 gcc_assert (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr)))
231 == GET_MODE_SIZE (TYPE_MODE (type)));
9031d10b 232
471086d6 233 return convert_to_pointer (type, expr);
234 }
235
cc4d0855 236 if (type_unknown_p (expr))
0fbca5e8 237 return instantiate_type (type, expr, tf_warning_or_error);
cc4d0855 238
0a25aad6 239 error ("cannot convert %qE from type %qT to type %qT",
653e5405 240 expr, intype, type);
471086d6 241 return error_mark_node;
242}
243
244/* Like convert, except permit conversions to take place which
245 are not normally allowed due to access restrictions
246 (such as conversion from sub-type to private super-type). */
96624a9e 247
471086d6 248static tree
35771a9a 249convert_to_pointer_force (tree type, tree expr)
471086d6 250{
cd16867a 251 tree intype = TREE_TYPE (expr);
252 enum tree_code form = TREE_CODE (intype);
9031d10b 253
471086d6 254 if (form == POINTER_TYPE)
255 {
256 intype = TYPE_MAIN_VARIANT (intype);
257
258 if (TYPE_MAIN_VARIANT (type) != intype
259 && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
95397ff9 260 && MAYBE_CLASS_TYPE_P (TREE_TYPE (type))
261 && MAYBE_CLASS_TYPE_P (TREE_TYPE (intype))
471086d6 262 && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
263 {
264 enum tree_code code = PLUS_EXPR;
4a2680fc 265 tree binfo;
266
267 binfo = lookup_base (TREE_TYPE (intype), TREE_TYPE (type),
ada40935 268 ba_unique, NULL);
4a2680fc 269 if (!binfo)
471086d6 270 {
4a2680fc 271 binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
ada40935 272 ba_unique, NULL);
4a2680fc 273 code = MINUS_EXPR;
471086d6 274 }
4a2680fc 275 if (binfo == error_mark_node)
276 return error_mark_node;
277 if (binfo)
471086d6 278 {
4a2680fc 279 expr = build_base_path (code, expr, binfo, 0);
653e5405 280 if (expr == error_mark_node)
281 return error_mark_node;
c0af329c 282 /* Add any qualifier conversions. */
4a2680fc 283 if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)),
284 TREE_TYPE (type)))
8999978b 285 expr = build_nop (type, expr);
4a2680fc 286 return expr;
471086d6 287 }
471086d6 288 }
471086d6 289 }
290
e5ead12a 291 return cp_convert_to_pointer (type, expr);
471086d6 292}
293
294/* We are passing something to a function which requires a reference.
295 The type we are interested in is in TYPE. The initial
296 value we have to begin with is in ARG.
297
298 FLAGS controls how we manage access checking.
ca106ab1 299 DIRECT_BIND in FLAGS controls how any temporaries are generated.
300 If DIRECT_BIND is set, DECL is the reference we're binding to. */
96624a9e 301
471086d6 302static tree
35771a9a 303build_up_reference (tree type, tree arg, int flags, tree decl)
471086d6 304{
c76251c1 305 tree rval;
0543e7a9 306 tree argtype = TREE_TYPE (arg);
471086d6 307 tree target_type = TREE_TYPE (type);
471086d6 308
b4df430b 309 gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
471086d6 310
c76251c1 311 if ((flags & DIRECT_BIND) && ! real_lvalue_p (arg))
471086d6 312 {
ca106ab1 313 /* Create a new temporary variable. We can't just use a TARGET_EXPR
314 here because it needs to live as long as DECL. */
c76251c1 315 tree targ = arg;
ca106ab1 316
7c09476d 317 arg = make_temporary_var_for_ref_to_temp (decl, TREE_TYPE (arg));
c23ebfdd 318
319 /* Process the initializer for the declaration. */
38281c46 320 DECL_INITIAL (arg) = targ;
d91303a6 321 cp_finish_decl (arg, targ, /*init_const_expr_p=*/false, NULL_TREE,
011310f7 322 LOOKUP_ONLYCONVERTING|DIRECT_BIND);
1ad432f2 323 }
c76251c1 324 else if (!(flags & DIRECT_BIND) && ! lvalue_p (arg))
1d8e4310 325 return get_target_expr (arg);
1ad432f2 326
ca106ab1 327 /* If we had a way to wrap this up, and say, if we ever needed its
b0df6589 328 address, transform all occurrences of the register, into a memory
329 reference we could win better. */
ebd21de4 330 rval = cp_build_unary_op (ADDR_EXPR, arg, 1, tf_warning_or_error);
15e55420 331 if (rval == error_mark_node)
332 return error_mark_node;
333
6686e84d 334 if ((flags & LOOKUP_PROTECT)
335 && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type)
95397ff9 336 && MAYBE_CLASS_TYPE_P (argtype)
337 && MAYBE_CLASS_TYPE_P (target_type))
6686e84d 338 {
7e6960e0 339 /* We go through lookup_base for the access control. */
4a2680fc 340 tree binfo = lookup_base (argtype, target_type, ba_check, NULL);
6686e84d 341 if (binfo == error_mark_node)
342 return error_mark_node;
343 if (binfo == NULL_TREE)
344 return error_not_base_type (target_type, argtype);
4a2680fc 345 rval = build_base_path (PLUS_EXPR, rval, binfo, 1);
6686e84d 346 }
c76251c1 347 else
348 rval
349 = convert_to_pointer_force (build_pointer_type (target_type), rval);
8999978b 350 return build_nop (type, rval);
471086d6 351}
352
519ba62c 353/* Subroutine of convert_to_reference. REFTYPE is the target reference type.
354 INTYPE is the original rvalue type and DECL is an optional _DECL node
355 for diagnostics.
9031d10b 356
519ba62c 357 [dcl.init.ref] says that if an rvalue is used to
358 initialize a reference, then the reference must be to a
359 non-volatile const type. */
360
361static void
35771a9a 362warn_ref_binding (tree reftype, tree intype, tree decl)
519ba62c 363{
364 tree ttl = TREE_TYPE (reftype);
9031d10b 365
519ba62c 366 if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl))
367 {
368 const char *msg;
369
370 if (CP_TYPE_VOLATILE_P (ttl) && decl)
ca82e026 371 msg = G_("initialization of volatile reference type %q#T from "
372 "rvalue of type %qT");
519ba62c 373 else if (CP_TYPE_VOLATILE_P (ttl))
ca82e026 374 msg = G_("conversion to volatile reference type %q#T "
375 "from rvalue of type %qT");
519ba62c 376 else if (decl)
ca82e026 377 msg = G_("initialization of non-const reference type %q#T from "
378 "rvalue of type %qT");
519ba62c 379 else
ca82e026 380 msg = G_("conversion to non-const reference type %q#T from "
381 "rvalue of type %qT");
519ba62c 382
2b9e3597 383 permerror (input_location, msg, reftype, intype);
519ba62c 384 }
385}
386
471086d6 387/* For C++: Only need to do one-level references, but cannot
388 get tripped up on signed/unsigned differences.
389
d81e00a4 390 DECL is either NULL_TREE or the _DECL node for a reference that is being
391 initialized. It can be error_mark_node if we don't know the _DECL but
392 we know it's an initialization. */
471086d6 393
471086d6 394tree
35771a9a 395convert_to_reference (tree reftype, tree expr, int convtype,
653e5405 396 int flags, tree decl)
471086d6 397{
cd16867a 398 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
399 tree intype;
471086d6 400 tree rval = NULL_TREE;
1a3f833b 401 tree rval_as_conversion = NULL_TREE;
1bc16cab 402 bool can_convert_intype_to_type;
1a3f833b 403
9031d10b 404 if (TREE_CODE (type) == FUNCTION_TYPE
d32df6a6 405 && TREE_TYPE (expr) == unknown_type_node)
9031d10b 406 expr = instantiate_type (type, expr,
0a3b29ad 407 (flags & LOOKUP_COMPLAIN)
0fbca5e8 408 ? tf_warning_or_error : tf_none);
0a3b29ad 409
410 if (expr == error_mark_node)
411 return error_mark_node;
412
413 intype = TREE_TYPE (expr);
cc4d0855 414
b4df430b 415 gcc_assert (TREE_CODE (intype) != REFERENCE_TYPE);
ab12ed55 416 gcc_assert (TREE_CODE (reftype) == REFERENCE_TYPE);
471086d6 417
471086d6 418 intype = TYPE_MAIN_VARIANT (intype);
419
1bc16cab 420 can_convert_intype_to_type = can_convert (type, intype);
421 if (!can_convert_intype_to_type
95397ff9 422 && (convtype & CONV_IMPLICIT) && MAYBE_CLASS_TYPE_P (intype)
1a3f833b 423 && ! (flags & LOOKUP_NO_CONVERSION))
424 {
425 /* Look for a user-defined conversion to lvalue that we can use. */
426
0a4be248 427 rval_as_conversion
8999978b 428 = build_type_conversion (reftype, expr);
1a3f833b 429
430 if (rval_as_conversion && rval_as_conversion != error_mark_node
431 && real_lvalue_p (rval_as_conversion))
432 {
433 expr = rval_as_conversion;
434 rval_as_conversion = NULL_TREE;
435 intype = type;
1bc16cab 436 can_convert_intype_to_type = 1;
1a3f833b 437 }
438 }
439
1bc16cab 440 if (((convtype & CONV_STATIC) && can_convert (intype, type))
441 || ((convtype & CONV_IMPLICIT) && can_convert_intype_to_type))
471086d6 442 {
471086d6 443 if (flags & LOOKUP_COMPLAIN)
444 {
bc3887cf 445 tree ttl = TREE_TYPE (reftype);
cb0ba4ec 446 tree ttr = lvalue_type (expr);
471086d6 447
519ba62c 448 if (! real_lvalue_p (expr))
449 warn_ref_binding (reftype, intype, decl);
9031d10b 450
519ba62c 451 if (! (convtype & CONV_CONST)
3e04bd45 452 && !at_least_as_qualified_p (ttl, ttr))
2b9e3597 453 permerror (input_location, "conversion from %qT to %qT discards qualifiers",
07317e69 454 ttr, reftype);
0543e7a9 455 }
456
ca106ab1 457 return build_up_reference (reftype, expr, flags, decl);
471086d6 458 }
c07b1ad1 459 else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr))
0543e7a9 460 {
461 /* When casting an lvalue to a reference type, just convert into
462 a pointer to the new type and deference it. This is allowed
e581f478 463 by San Diego WP section 5.2.9 paragraph 12, though perhaps it
0543e7a9 464 should be done directly (jason). (int &)ri ---> *(int*)&ri */
e581f478 465
3748625f 466 /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they
653e5405 467 meant. */
1a3f833b 468 if (TREE_CODE (intype) == POINTER_TYPE
a09db423 469 && (comptypes (TREE_TYPE (intype), type,
470 COMPARE_BASE | COMPARE_DERIVED)))
c3ceba8e 471 warning (0, "casting %qT to %qT does not dereference pointer",
00952d10 472 intype, reftype);
9031d10b 473
ebd21de4 474 rval = cp_build_unary_op (ADDR_EXPR, expr, 0, tf_warning_or_error);
0543e7a9 475 if (rval != error_mark_node)
985e9ee0 476 rval = convert_force (build_pointer_type (TREE_TYPE (reftype)),
477 rval, 0);
0543e7a9 478 if (rval != error_mark_node)
b0722fac 479 rval = build1 (NOP_EXPR, reftype, rval);
0543e7a9 480 }
0a4be248 481 else
860740a7 482 {
483 rval = convert_for_initialization (NULL_TREE, type, expr, flags,
ebd21de4 484 "converting", 0, 0,
485 tf_warning_or_error);
a66fe4cb 486 if (rval == NULL_TREE || rval == error_mark_node)
487 return rval;
519ba62c 488 warn_ref_binding (reftype, intype, decl);
ca106ab1 489 rval = build_up_reference (reftype, rval, flags, decl);
860740a7 490 }
471086d6 491
492 if (rval)
493 {
96624a9e 494 /* If we found a way to convert earlier, then use it. */
471086d6 495 return rval;
496 }
497
b248d3f7 498 if (flags & LOOKUP_COMPLAIN)
0a25aad6 499 error ("cannot convert type %qT to type %qT", intype, reftype);
b248d3f7 500
471086d6 501 return error_mark_node;
502}
503
504/* We are using a reference VAL for its value. Bash that reference all the
96624a9e 505 way down to its lowest form. */
506
471086d6 507tree
35771a9a 508convert_from_reference (tree val)
471086d6 509{
73bdcca2 510 if (TREE_TYPE (val)
511 && TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE)
729f89ff 512 {
2fb61329 513 tree t = TREE_TYPE (TREE_TYPE (val));
729f89ff 514 tree ref = build1 (INDIRECT_REF, t, val);
9031d10b 515
729f89ff 516 /* We *must* set TREE_READONLY when dereferencing a pointer to const,
517 so that we get the proper error message if the result is used
518 to assign to. Also, &* is supposed to be a no-op. */
519 TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
520 TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
521 TREE_SIDE_EFFECTS (ref)
522 = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val));
523 REFERENCE_REF_P (ref) = 1;
524 val = ref;
525 }
9031d10b 526
471086d6 527 return val;
528}
e5dab226 529
530/* Really perform an lvalue-to-rvalue conversion, including copying an
531 argument of class type into a temporary. */
532
533tree
534force_rvalue (tree expr)
535{
95397ff9 536 if (MAYBE_CLASS_TYPE_P (TREE_TYPE (expr)) && TREE_CODE (expr) != TARGET_EXPR)
e5dab226 537 expr = ocp_convert (TREE_TYPE (expr), expr,
538 CONV_IMPLICIT|CONV_FORCE_TEMP, LOOKUP_NORMAL);
539 else
540 expr = decay_conversion (expr);
541
542 return expr;
543}
f5220369 544
471086d6 545\f
f5220369 546/* Fold away simple conversions, but make sure the result is an rvalue. */
547
548tree
549cp_fold_convert (tree type, tree expr)
550{
551 return rvalue (fold_convert (type, expr));
552}
553
c4a8ac95 554/* C++ conversions, preference to static cast conversions. */
555
556tree
35771a9a 557cp_convert (tree type, tree expr)
c4a8ac95 558{
559 return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL);
560}
561
59dd8856 562/* C++ equivalent of convert_and_check but using cp_convert as the
563 conversion function.
564
565 Convert EXPR to TYPE, warning about conversion problems with constants.
566 Invoke this function on every expression that is converted implicitly,
567 i.e. because of language rules and not because of an explicit cast. */
568
569tree
570cp_convert_and_check (tree type, tree expr)
571{
572 tree result;
573
574 if (TREE_TYPE (expr) == type)
575 return expr;
576
577 result = cp_convert (type, expr);
578
48d94ede 579 if (c_inhibit_evaluation_warnings == 0
580 && !TREE_OVERFLOW_P (expr)
581 && result != error_mark_node)
59dd8856 582 warnings_for_convert_and_check (type, expr, result);
583
584 return result;
585}
586
b248d3f7 587/* Conversion...
588
589 FLAGS indicates how we should behave. */
590
471086d6 591tree
35771a9a 592ocp_convert (tree type, tree expr, int convtype, int flags)
471086d6 593{
cd16867a 594 tree e = expr;
595 enum tree_code code = TREE_CODE (type);
7a979707 596 const char *invalid_conv_diag;
2b3c93a3 597 tree e1;
471086d6 598
1bc16cab 599 if (error_operand_p (e) || type == error_mark_node)
471086d6 600 return error_mark_node;
d81e00a4 601
5b592939 602 complete_type (type);
603 complete_type (TREE_TYPE (expr));
604
7a979707 605 if ((invalid_conv_diag
606 = targetm.invalid_conversion (TREE_TYPE (expr), type)))
607 {
608 error (invalid_conv_diag);
609 return error_mark_node;
610 }
611
13f0eb20 612 e = integral_constant_value (e);
7745052b 613
95397ff9 614 if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP))
1a3f833b 615 /* We need a new temporary; don't take this shortcut. */;
930e8175 616 else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e)))
ca23ec64 617 {
daf9ff67 618 if (same_type_p (type, TREE_TYPE (e)))
ca23ec64 619 /* The call to fold will not always remove the NOP_EXPR as
620 might be expected, since if one of the types is a typedef;
755edffd 621 the comparison in fold is just equality of pointers, not a
a09db423 622 call to comptypes. We don't call fold in this case because
f699c174 623 that can result in infinite recursion; fold will call
624 convert, which will call ocp_convert, etc. */
625 return e;
372e0e29 626 /* For complex data types, we need to perform componentwise
653e5405 627 conversion. */
372e0e29 628 else if (TREE_CODE (type) == COMPLEX_TYPE)
653e5405 629 return fold_if_not_in_template (convert_to_complex (type, e));
bdb2219e 630 else if (TREE_CODE (e) == TARGET_EXPR)
631 {
632 /* Don't build a NOP_EXPR of class type. Instead, change the
930e8175 633 type of the temporary. */
bdb2219e 634 TREE_TYPE (e) = TREE_TYPE (TARGET_EXPR_SLOT (e)) = type;
635 return e;
636 }
ca23ec64 637 else
092b1d6f 638 {
639 /* We shouldn't be treating objects of ADDRESSABLE type as
640 rvalues. */
641 gcc_assert (!TREE_ADDRESSABLE (type));
5d7ed6c7 642 return fold_if_not_in_template (build_nop (type, e));
092b1d6f 643 }
ca23ec64 644 }
645
2b3c93a3 646 e1 = targetm.convert_to_type (type, e);
647 if (e1)
648 return e1;
649
d81e00a4 650 if (code == VOID_TYPE && (convtype & CONV_STATIC))
95b2ac55 651 {
ebd21de4 652 e = convert_to_void (e, /*implicit=*/NULL, tf_warning_or_error);
aeef2be5 653 return e;
95b2ac55 654 }
d81e00a4 655
bb0726a1 656 if (INTEGRAL_CODE_P (code))
471086d6 657 {
617abf06 658 tree intype = TREE_TYPE (e);
384590d4 659
660 if (TREE_CODE (type) == ENUMERAL_TYPE)
661 {
662 /* enum = enum, enum = int, enum = float, (enum)pointer are all
663 errors. */
664 if (((INTEGRAL_OR_ENUMERATION_TYPE_P (intype)
653e5405 665 || TREE_CODE (intype) == REAL_TYPE)
b312a686 666 && ! (convtype & CONV_STATIC))
384590d4 667 || TREE_CODE (intype) == POINTER_TYPE)
668 {
669 if (flags & LOOKUP_COMPLAIN)
2b9e3597 670 permerror (input_location, "conversion from %q#T to %q#T", intype, type);
471086d6 671
384590d4 672 if (!flag_permissive)
673 return error_mark_node;
674 }
675
676 /* [expr.static.cast]
677
678 8. A value of integral or enumeration type can be explicitly
679 converted to an enumeration type. The value is unchanged if
680 the original value is within the range of the enumeration
681 values. Otherwise, the resulting enumeration value is
682 unspecified. */
683 if (TREE_CODE (expr) == INTEGER_CST && !int_fits_type_p (expr, type))
684 warning (OPT_Wconversion,
685 "the result of the conversion is unspecified because "
686 "%qE is outside the range of type %qT",
687 expr, type);
471086d6 688 }
95397ff9 689 if (MAYBE_CLASS_TYPE_P (intype))
471086d6 690 {
691 tree rval;
8999978b 692 rval = build_type_conversion (type, e);
6495357a 693 if (rval)
694 return rval;
b248d3f7 695 if (flags & LOOKUP_COMPLAIN)
0a25aad6 696 error ("%q#T used where a %qT was expected", intype, type);
471086d6 697 return error_mark_node;
698 }
bb0726a1 699 if (code == BOOLEAN_TYPE)
ce871053 700 return cp_truthvalue_conversion (e);
701
5d7ed6c7 702 return fold_if_not_in_template (convert_to_integer (type, e));
471086d6 703 }
1bc16cab 704 if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type))
e5ead12a 705 return fold_if_not_in_template (cp_convert_to_pointer (type, e));
684b9d79 706 if (code == VECTOR_TYPE)
c37ff371 707 {
708 tree in_vtype = TREE_TYPE (e);
95397ff9 709 if (MAYBE_CLASS_TYPE_P (in_vtype))
c37ff371 710 {
711 tree ret_val;
712 ret_val = build_type_conversion (type, e);
653e5405 713 if (ret_val)
714 return ret_val;
715 if (flags & LOOKUP_COMPLAIN)
716 error ("%q#T used where a %qT was expected", in_vtype, type);
717 return error_mark_node;
c37ff371 718 }
5d7ed6c7 719 return fold_if_not_in_template (convert_to_vector (type, e));
c37ff371 720 }
c4a8ac95 721 if (code == REAL_TYPE || code == COMPLEX_TYPE)
471086d6 722 {
95397ff9 723 if (MAYBE_CLASS_TYPE_P (TREE_TYPE (e)))
471086d6 724 {
725 tree rval;
8999978b 726 rval = build_type_conversion (type, e);
471086d6 727 if (rval)
728 return rval;
729 else
b248d3f7 730 if (flags & LOOKUP_COMPLAIN)
0a25aad6 731 error ("%q#T used where a floating point value was expected",
b248d3f7 732 TREE_TYPE (e));
471086d6 733 }
c4a8ac95 734 if (code == REAL_TYPE)
5d7ed6c7 735 return fold_if_not_in_template (convert_to_real (type, e));
c4a8ac95 736 else if (code == COMPLEX_TYPE)
5d7ed6c7 737 return fold_if_not_in_template (convert_to_complex (type, e));
471086d6 738 }
739
740 /* New C++ semantics: since assignment is now based on
741 memberwise copying, if the rhs type is derived from the
742 lhs type, then we may still do a conversion. */
95397ff9 743 if (RECORD_OR_UNION_CODE_P (code))
471086d6 744 {
745 tree dtype = TREE_TYPE (e);
c25194fd 746 tree ctor = NULL_TREE;
471086d6 747
471086d6 748 dtype = TYPE_MAIN_VARIANT (dtype);
749
471086d6 750 /* Conversion between aggregate types. New C++ semantics allow
751 objects of derived type to be cast to objects of base type.
752 Old semantics only allowed this between pointers.
753
754 There may be some ambiguity between using a constructor
755 vs. using a type conversion operator when both apply. */
756
0a4be248 757 ctor = e;
860740a7 758
8c18e707 759 if (abstract_virtuals_error (NULL_TREE, type))
760 return error_mark_node;
6cbb4197 761
f82f1250 762 if (BRACE_ENCLOSED_INITIALIZER_P (ctor))
763 ctor = perform_implicit_conversion (type, ctor, tf_warning_or_error);
764 else if ((flags & LOOKUP_ONLYCONVERTING)
765 && ! (CLASS_TYPE_P (dtype) && DERIVED_FROM_P (type, dtype)))
fce73460 766 /* For copy-initialization, first we create a temp of the proper type
767 with a user-defined conversion sequence, then we direct-initialize
768 the target with the temp (see [dcl.init]). */
769 ctor = build_user_type_conversion (type, ctor, flags);
3eb89cd8 770 else
f352a3fb 771 {
772 VEC(tree,gc) *ctor_vec = make_tree_vector_single (ctor);
773 ctor = build_special_member_call (NULL_TREE,
774 complete_ctor_identifier,
775 &ctor_vec,
776 type, flags,
777 tf_warning_or_error);
778 release_tree_vector (ctor_vec);
779 }
0a4be248 780 if (ctor)
781 return build_cplus_new (type, ctor);
471086d6 782 }
783
b248d3f7 784 if (flags & LOOKUP_COMPLAIN)
a7cc1549 785 {
786 /* If the conversion failed and expr was an invalid use of pointer to
787 member function, try to report a meaningful error. */
788 if (invalid_nonstatic_memfn_p (expr, tf_warning_or_error))
789 /* We displayed the error message. */;
790 else
791 error ("conversion from %qT to non-scalar type %qT requested",
792 TREE_TYPE (expr), type);
793 }
471086d6 794 return error_mark_node;
795}
796
b1a8d4ce 797/* When an expression is used in a void context, its value is discarded and
798 no lvalue-rvalue and similar conversions happen [expr.static.cast/4,
799 stmt.expr/1, expr.comma/1]. This permits dereferencing an incomplete type
800 in a void context. The C++ standard does not define what an `access' to an
63eff20d 801 object is, but there is reason to believe that it is the lvalue to rvalue
b1a8d4ce 802 conversion -- if it were not, `*&*p = 1' would violate [expr]/4 in that it
803 accesses `*p' not to calculate the value to be stored. But, dcl.type.cv/8
804 indicates that volatile semantics should be the same between C and C++
805 where ever possible. C leaves it implementation defined as to what
806 constitutes an access to a volatile. So, we interpret `*vp' as a read of
807 the volatile object `vp' points to, unless that is an incomplete type. For
808 volatile references we do not do this interpretation, because that would
809 make it impossible to ignore the reference return value from functions. We
810 issue warnings in the confusing cases.
9031d10b 811
f8646185 812 IMPLICIT is non-NULL iff an expression is being implicitly converted; it
813 is NULL when the user is explicitly converting an expression to void via
814 a cast. When non-NULL, IMPLICIT is a string indicating the context of
815 the implicit conversion. */
b1a8d4ce 816
817tree
ebd21de4 818convert_to_void (tree expr, const char *implicit, tsubst_flags_t complain)
b1a8d4ce 819{
9031d10b 820 if (expr == error_mark_node
3d411d73 821 || TREE_TYPE (expr) == error_mark_node)
822 return error_mark_node;
b1a8d4ce 823 if (!TREE_TYPE (expr))
824 return expr;
ebd21de4 825 if (invalid_nonstatic_memfn_p (expr, complain))
334f6ce1 826 return error_mark_node;
ed36f1cf 827 if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
828 {
ebd21de4 829 if (complain & tf_error)
830 error ("pseudo-destructor is not called");
ed36f1cf 831 return error_mark_node;
832 }
e3cfe3ce 833 if (VOID_TYPE_P (TREE_TYPE (expr)))
b1a8d4ce 834 return expr;
835 switch (TREE_CODE (expr))
836 {
837 case COND_EXPR:
838 {
653e5405 839 /* The two parts of a cond expr might be separate lvalues. */
840 tree op1 = TREE_OPERAND (expr,1);
841 tree op2 = TREE_OPERAND (expr,2);
7e34c19d 842 bool side_effects = TREE_SIDE_EFFECTS (op1) || TREE_SIDE_EFFECTS (op2);
653e5405 843 tree new_op1 = convert_to_void
7e34c19d 844 (op1, (implicit && !side_effects
ebd21de4 845 ? "second operand of conditional" : NULL), complain);
653e5405 846 tree new_op2 = convert_to_void
7e34c19d 847 (op2, (implicit && !side_effects
ebd21de4 848 ? "third operand of conditional" : NULL), complain);
9031d10b 849
831d52a2 850 expr = build3 (COND_EXPR, TREE_TYPE (new_op1),
851 TREE_OPERAND (expr, 0), new_op1, new_op2);
653e5405 852 break;
b1a8d4ce 853 }
9031d10b 854
b1a8d4ce 855 case COMPOUND_EXPR:
856 {
653e5405 857 /* The second part of a compound expr contains the value. */
858 tree op1 = TREE_OPERAND (expr,1);
859 tree new_op1 = convert_to_void
4ee9c684 860 (op1, (implicit && !TREE_NO_WARNING (expr)
ebd21de4 861 ? "right-hand operand of comma" : NULL), complain);
9031d10b 862
653e5405 863 if (new_op1 != op1)
e907a2e9 864 {
831d52a2 865 tree t = build2 (COMPOUND_EXPR, TREE_TYPE (new_op1),
866 TREE_OPERAND (expr, 0), new_op1);
e907a2e9 867 expr = t;
868 }
869
653e5405 870 break;
b1a8d4ce 871 }
9031d10b 872
b1a8d4ce 873 case NON_LVALUE_EXPR:
874 case NOP_EXPR:
c0af329c 875 /* These have already decayed to rvalue. */
b1a8d4ce 876 break;
9031d10b 877
331bc0ad 878 case CALL_EXPR: /* We have a special meaning for volatile void fn(). */
b1a8d4ce 879 break;
9031d10b 880
b1a8d4ce 881 case INDIRECT_REF:
882 {
653e5405 883 tree type = TREE_TYPE (expr);
884 int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0)))
885 == REFERENCE_TYPE;
886 int is_volatile = TYPE_VOLATILE (type);
887 int is_complete = COMPLETE_TYPE_P (complete_type (type));
888
dc02da7f 889 /* Can't load the value if we don't know the type. */
653e5405 890 if (is_volatile && !is_complete)
ebd21de4 891 {
892 if (complain & tf_warning)
893 warning (0, "object of incomplete type %qT will not be accessed in %s",
894 type, implicit ? implicit : "void context");
895 }
dc02da7f 896 /* Don't load the value if this is an implicit dereference, or if
897 the type needs to be handled by ctors/dtors. */
898 else if (is_volatile && (is_reference || TREE_ADDRESSABLE (type)))
ebd21de4 899 {
900 if (complain & tf_warning)
901 warning (0, "object of type %qT will not be accessed in %s",
902 TREE_TYPE (TREE_OPERAND (expr, 0)),
903 implicit ? implicit : "void context");
904 }
dc02da7f 905 if (is_reference || !is_volatile || !is_complete || TREE_ADDRESSABLE (type))
a4d4030b 906 {
907 /* Emit a warning (if enabled) when the "effect-less" INDIRECT_REF
908 operation is stripped off. Note that we don't warn about
909 - an expression with TREE_NO_WARNING set. (For an example of
910 such expressions, see build_over_call in call.c.)
911 - automatic dereferencing of references, since the user cannot
912 control it. (See also warn_if_unused_value() in stmt.c.) */
913 if (warn_unused_value
f8646185 914 && implicit
a4d4030b 915 && (complain & tf_warning)
916 && !TREE_NO_WARNING (expr)
917 && !is_reference)
918 warning (OPT_Wunused_value, "value computed is not used");
919 expr = TREE_OPERAND (expr, 0);
920 }
653e5405 921
922 break;
b1a8d4ce 923 }
9031d10b 924
b1a8d4ce 925 case VAR_DECL:
926 {
653e5405 927 /* External variables might be incomplete. */
928 tree type = TREE_TYPE (expr);
929 int is_complete = COMPLETE_TYPE_P (complete_type (type));
930
ebd21de4 931 if (TYPE_VOLATILE (type) && !is_complete && (complain & tf_warning))
653e5405 932 warning (0, "object %qE of incomplete type %qT will not be accessed in %s",
933 expr, type, implicit ? implicit : "void context");
934 break;
b1a8d4ce 935 }
d9f88785 936
25b3017b 937 case TARGET_EXPR:
938 /* Don't bother with the temporary object returned from a function if
939 we don't use it and don't need to destroy it. We'll still
940 allocate space for it in expand_call or declare_return_variable,
941 but we don't need to track it through all the tree phases. */
67bb1301 942 if (TARGET_EXPR_IMPLICIT_P (expr)
25b3017b 943 && TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (expr)))
944 {
945 tree init = TARGET_EXPR_INITIAL (expr);
946 if (TREE_CODE (init) == AGGR_INIT_EXPR
947 && !AGGR_INIT_VIA_CTOR_P (init))
948 {
c2f47e15 949 tree fn = AGGR_INIT_EXPR_FN (init);
389dd41b 950 expr = build_call_array_loc (input_location,
951 TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))),
952 fn,
953 aggr_init_expr_nargs (init),
954 AGGR_INIT_EXPR_ARGP (init));
25b3017b 955 }
956 }
957 break;
958
b1a8d4ce 959 default:;
960 }
eebd67e7 961 expr = resolve_nondeduced_context (expr);
b1a8d4ce 962 {
963 tree probe = expr;
9031d10b 964
b1a8d4ce 965 if (TREE_CODE (probe) == ADDR_EXPR)
966 probe = TREE_OPERAND (expr, 0);
2e0e6579 967 if (type_unknown_p (probe))
968 {
969 /* [over.over] enumerates the places where we can take the address
970 of an overloaded function, and this is not one of them. */
ebd21de4 971 if (complain & tf_error)
972 error ("%s cannot resolve address of overloaded function",
973 implicit ? implicit : "void cast");
974 else
975 return error_mark_node;
ea720917 976 expr = void_zero_node;
2e0e6579 977 }
978 else if (implicit && probe == expr && is_overloaded_fn (probe))
2056769e 979 {
980 /* Only warn when there is no &. */
ebd21de4 981 if (complain & tf_warning)
982 warning (OPT_Waddress, "%s is a reference, not call, to function %qE",
983 implicit, expr);
2056769e 984 if (TREE_CODE (expr) == COMPONENT_REF)
985 expr = TREE_OPERAND (expr, 0);
986 }
b1a8d4ce 987 }
9031d10b 988
e3cfe3ce 989 if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr)))
b1a8d4ce 990 {
5e2a4133 991 if (implicit
992 && warn_unused_value
993 && !TREE_NO_WARNING (expr)
994 && !processing_template_decl)
1fe46df1 995 {
996 /* The middle end does not warn about expressions that have
997 been explicitly cast to void, so we must do so here. */
ebd21de4 998 if (!TREE_SIDE_EFFECTS (expr)) {
999 if (complain & tf_warning)
1000 warning (OPT_Wunused_value, "%s has no effect", implicit);
1001 }
9031d10b 1002 else
1003 {
1fe46df1 1004 tree e;
1005 enum tree_code code;
607a5d68 1006 enum tree_code_class tclass;
9031d10b 1007
1fe46df1 1008 e = expr;
1009 /* We might like to warn about (say) "(int) f()", as the
1010 cast has no effect, but the compiler itself will
1011 generate implicit conversions under some
324d8f2d 1012 circumstances. (For example a block copy will be
1fe46df1 1013 turned into a call to "__builtin_memcpy", with a
1014 conversion of the return value to an appropriate
1015 type.) So, to avoid false positives, we strip
416ce344 1016 conversions. Do not use STRIP_NOPs because it will
1017 not strip conversions to "void", as that is not a
1018 mode-preserving conversion. */
1019 while (TREE_CODE (e) == NOP_EXPR)
1020 e = TREE_OPERAND (e, 0);
1fe46df1 1021
1022 code = TREE_CODE (e);
607a5d68 1023 tclass = TREE_CODE_CLASS (code);
1024 if ((tclass == tcc_comparison
1025 || tclass == tcc_unary
1026 || (tclass == tcc_binary
1fe46df1 1027 && !(code == MODIFY_EXPR
1028 || code == INIT_EXPR
1029 || code == PREDECREMENT_EXPR
1030 || code == PREINCREMENT_EXPR
1031 || code == POSTDECREMENT_EXPR
1032 || code == POSTINCREMENT_EXPR)))
ebd21de4 1033 && (complain & tf_warning))
ced7c954 1034 warning (OPT_Wunused_value, "value computed is not used");
1fe46df1 1035 }
1036 }
00fa9079 1037 expr = build1 (CONVERT_EXPR, void_type_node, expr);
b1a8d4ce 1038 }
de5ad4cb 1039 if (! TREE_SIDE_EFFECTS (expr))
1040 expr = void_zero_node;
b1a8d4ce 1041 return expr;
1042}
1043
d81e00a4 1044/* Create an expression whose value is that of EXPR,
1045 converted to type TYPE. The TREE_TYPE of the value
1046 is always TYPE. This function implements all reasonable
1047 conversions; callers should filter out those that are
c4a8ac95 1048 not permitted by the language being compiled.
1049
1050 Most of this routine is from build_reinterpret_cast.
1051
a17c2a3a 1052 The back end cannot call cp_convert (what was convert) because
c4a8ac95 1053 conversions to/from basetypes may involve memory references
1054 (vbases) and adding or subtracting small values (multiple
1055 inheritance), but it calls convert from the constant folding code
e0aa5007 1056 on subtrees of already built trees after it has ripped them apart.
c4a8ac95 1057
1058 Also, if we ever support range variables, we'll probably also have to
1059 do a little bit more work. */
d81e00a4 1060
1061tree
35771a9a 1062convert (tree type, tree expr)
d81e00a4 1063{
c4a8ac95 1064 tree intype;
1065
1066 if (type == error_mark_node || expr == error_mark_node)
1067 return error_mark_node;
1068
c4a8ac95 1069 intype = TREE_TYPE (expr);
1070
6686e84d 1071 if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype))
13f0eb20 1072 return fold_if_not_in_template (build_nop (type, expr));
c4a8ac95 1073
1074 return ocp_convert (type, expr, CONV_OLD_CONVERT,
1075 LOOKUP_NORMAL|LOOKUP_NO_CONVERSION);
d81e00a4 1076}
1077
c4a8ac95 1078/* Like cp_convert, except permit conversions to take place which
471086d6 1079 are not normally allowed due to access restrictions
1080 (such as conversion from sub-type to private super-type). */
96624a9e 1081
471086d6 1082tree
35771a9a 1083convert_force (tree type, tree expr, int convtype)
471086d6 1084{
cd16867a 1085 tree e = expr;
1086 enum tree_code code = TREE_CODE (type);
471086d6 1087
1088 if (code == REFERENCE_TYPE)
9031d10b 1089 return (fold_if_not_in_template
5d7ed6c7 1090 (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
1091 NULL_TREE)));
471086d6 1092
1093 if (code == POINTER_TYPE)
5d7ed6c7 1094 return fold_if_not_in_template (convert_to_pointer_force (type, e));
471086d6 1095
ac9386a0 1096 /* From typeck.c convert_for_assignment */
471086d6 1097 if (((TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE && TREE_CODE (e) == ADDR_EXPR
1098 && TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE
1099 && TREE_CODE (TREE_TYPE (TREE_TYPE (e))) == METHOD_TYPE)
ac9386a0 1100 || integer_zerop (e)
1101 || TYPE_PTRMEMFUNC_P (TREE_TYPE (e)))
471086d6 1102 && TYPE_PTRMEMFUNC_P (type))
cb02169c 1103 /* compatible pointer to member functions. */
1104 return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1,
1105 /*c_cast_p=*/1);
a74e8896 1106
c4a8ac95 1107 return ocp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL);
471086d6 1108}
1109
471086d6 1110/* Convert an aggregate EXPR to type XTYPE. If a conversion
1111 exists, return the attempted conversion. This may
1112 return ERROR_MARK_NODE if the conversion is not
1113 allowed (references private members, etc).
1114 If no conversion exists, NULL_TREE is returned.
1115
ce28ee2e 1116 FIXME: Ambiguity checking is wrong. Should choose one by the implicit
1117 object parameter, or by the second standard conversion sequence if
1118 that doesn't do it. This will probably wait for an overloading rewrite.
1119 (jason 8/9/95) */
471086d6 1120
ef9571e5 1121static tree
8999978b 1122build_type_conversion (tree xtype, tree expr)
471086d6 1123{
1124 /* C++: check to see if we can convert this aggregate type
bcf789d7 1125 into the required type. */
8999978b 1126 return build_user_type_conversion (xtype, expr, LOOKUP_NORMAL);
471086d6 1127}
1128
1e66592c 1129/* Convert the given EXPR to one of a group of types suitable for use in an
1130 expression. DESIRES is a combination of various WANT_* flags (q.v.)
35771a9a 1131 which indicates which types are suitable. If COMPLAIN is true, complain
1e66592c 1132 about ambiguity; otherwise, the caller will deal with it. */
471086d6 1133
1e66592c 1134tree
35771a9a 1135build_expr_type_conversion (int desires, tree expr, bool complain)
471086d6 1136{
1e66592c 1137 tree basetype = TREE_TYPE (expr);
6a44e72e 1138 tree conv = NULL_TREE;
bdd152ce 1139 tree winner = NULL_TREE;
471086d6 1140
9031d10b 1141 if (expr == null_node
1142 && (desires & WANT_INT)
954885ed 1143 && !(desires & WANT_NULL))
8296fdaa 1144 warning_at (input_location, OPT_Wconversion_null,
1145 "converting NULL to non-pointer type");
9031d10b 1146
ce28ee2e 1147 basetype = TREE_TYPE (expr);
471086d6 1148
3d411d73 1149 if (basetype == error_mark_node)
1150 return error_mark_node;
1151
95397ff9 1152 if (! MAYBE_CLASS_TYPE_P (basetype))
bdd152ce 1153 switch (TREE_CODE (basetype))
1154 {
1155 case INTEGER_TYPE:
954885ed 1156 if ((desires & WANT_NULL) && null_ptr_cst_p (expr))
bdd152ce 1157 return expr;
1158 /* else fall through... */
1159
1160 case BOOLEAN_TYPE:
1161 return (desires & WANT_INT) ? expr : NULL_TREE;
1162 case ENUMERAL_TYPE:
1163 return (desires & WANT_ENUM) ? expr : NULL_TREE;
1164 case REAL_TYPE:
1165 return (desires & WANT_FLOAT) ? expr : NULL_TREE;
1166 case POINTER_TYPE:
1167 return (desires & WANT_POINTER) ? expr : NULL_TREE;
9031d10b 1168
bdd152ce 1169 case FUNCTION_TYPE:
1170 case ARRAY_TYPE:
a681799d 1171 return (desires & WANT_POINTER) ? decay_conversion (expr)
653e5405 1172 : NULL_TREE;
96ec9e30 1173
64ec1ad6 1174 case COMPLEX_TYPE:
96ec9e30 1175 case VECTOR_TYPE:
64ec1ad6 1176 if ((desires & WANT_VECTOR_OR_COMPLEX) == 0)
96ec9e30 1177 return NULL_TREE;
1178 switch (TREE_CODE (TREE_TYPE (basetype)))
1179 {
1180 case INTEGER_TYPE:
1181 case BOOLEAN_TYPE:
1182 return (desires & WANT_INT) ? expr : NULL_TREE;
1183 case ENUMERAL_TYPE:
1184 return (desires & WANT_ENUM) ? expr : NULL_TREE;
1185 case REAL_TYPE:
1186 return (desires & WANT_FLOAT) ? expr : NULL_TREE;
1187 default:
1188 return NULL_TREE;
1189 }
1190
bdd152ce 1191 default:
1192 return NULL_TREE;
1193 }
1194
1195 /* The code for conversions from class type is currently only used for
1196 delete expressions. Other expressions are handled by build_new_op. */
f8182e08 1197 if (!complete_type_or_else (basetype, expr))
1198 return error_mark_node;
1199 if (!TYPE_HAS_CONVERSION (basetype))
bdd152ce 1200 return NULL_TREE;
1201
8972df28 1202 for (conv = lookup_conversions (basetype, /*lookup_template_convs_p=*/true);
1203 conv;
1204 conv = TREE_CHAIN (conv))
bdd152ce 1205 {
1206 int win = 0;
1207 tree candidate;
1208 tree cand = TREE_VALUE (conv);
c1ca2f12 1209 cand = OVL_CURRENT (cand);
bdd152ce 1210
1211 if (winner && winner == cand)
1212 continue;
1213
cf7aa2e5 1214 if (DECL_NONCONVERTING_P (cand))
1215 continue;
1216
ef4534a3 1217 candidate = non_reference (TREE_TYPE (TREE_TYPE (cand)));
bdd152ce 1218
1219 switch (TREE_CODE (candidate))
1220 {
1221 case BOOLEAN_TYPE:
1222 case INTEGER_TYPE:
1223 win = (desires & WANT_INT); break;
1224 case ENUMERAL_TYPE:
1225 win = (desires & WANT_ENUM); break;
1226 case REAL_TYPE:
1227 win = (desires & WANT_FLOAT); break;
1228 case POINTER_TYPE:
1229 win = (desires & WANT_POINTER); break;
1230
64ec1ad6 1231 case COMPLEX_TYPE:
96ec9e30 1232 case VECTOR_TYPE:
64ec1ad6 1233 if ((desires & WANT_VECTOR_OR_COMPLEX) == 0)
96ec9e30 1234 break;
1235 switch (TREE_CODE (TREE_TYPE (candidate)))
1236 {
1237 case BOOLEAN_TYPE:
1238 case INTEGER_TYPE:
1239 win = (desires & WANT_INT); break;
1240 case ENUMERAL_TYPE:
1241 win = (desires & WANT_ENUM); break;
1242 case REAL_TYPE:
1243 win = (desires & WANT_FLOAT); break;
1244 default:
1245 break;
1246 }
1247 break;
1248
bdd152ce 1249 default:
1250 break;
1251 }
1252
1253 if (win)
1254 {
1255 if (winner)
1256 {
1257 if (complain)
1258 {
0a25aad6 1259 error ("ambiguous default type conversion from %qT",
653e5405 1260 basetype);
0a25aad6 1261 error (" candidate conversions include %qD and %qD",
653e5405 1262 winner, cand);
bdd152ce 1263 }
1264 return error_mark_node;
1265 }
1266 else
1267 winner = cand;
1268 }
1269 }
1e66592c 1270
bdd152ce 1271 if (winner)
1272 {
ef4534a3 1273 tree type = non_reference (TREE_TYPE (TREE_TYPE (winner)));
bdd152ce 1274 return build_user_type_conversion (type, expr, LOOKUP_NORMAL);
471086d6 1275 }
1e66592c 1276
985e9ee0 1277 return NULL_TREE;
471086d6 1278}
bc3887cf 1279
96624a9e 1280/* Implements integral promotion (4.1) and float->double promotion. */
1281
bc3887cf 1282tree
35771a9a 1283type_promotes_to (tree type)
bc3887cf 1284{
2b3c93a3 1285 tree promoted_type;
1286
ce28ee2e 1287 if (type == error_mark_node)
1288 return error_mark_node;
1289
bc3887cf 1290 type = TYPE_MAIN_VARIANT (type);
bb0726a1 1291
2b3c93a3 1292 /* Check for promotions of target-defined types first. */
1293 promoted_type = targetm.promoted_type (type);
1294 if (promoted_type)
1295 return promoted_type;
1296
bb0726a1 1297 /* bool always promotes to int (not unsigned), even if it's the same
1298 size. */
9e1a8234 1299 if (TREE_CODE (type) == BOOLEAN_TYPE)
bb0726a1 1300 type = integer_type_node;
1301
1302 /* Normally convert enums to int, but convert wide enums to something
1303 wider. */
1304 else if (TREE_CODE (type) == ENUMERAL_TYPE
924bbf02 1305 || type == char16_type_node
1306 || type == char32_type_node
bb0726a1 1307 || type == wchar_type_node)
6c9497b1 1308 {
1309 int precision = MAX (TYPE_PRECISION (type),
1310 TYPE_PRECISION (integer_type_node));
771d21fa 1311 tree totype = c_common_type_for_size (precision, 0);
78a8ed03 1312 if (TYPE_UNSIGNED (type)
6c9497b1 1313 && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype))
771d21fa 1314 type = c_common_type_for_size (precision, 1);
6c9497b1 1315 else
1316 type = totype;
1317 }
d7aeef06 1318 else if (c_promoting_integer_type_p (type))
bc3887cf 1319 {
d0acef9e 1320 /* Retain unsignedness if really not getting bigger. */
78a8ed03 1321 if (TYPE_UNSIGNED (type)
d0acef9e 1322 && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
bc3887cf 1323 type = unsigned_type_node;
1324 else
1325 type = integer_type_node;
1326 }
1327 else if (type == float_type_node)
1328 type = double_type_node;
9031d10b 1329
a681799d 1330 return type;
bc3887cf 1331}
668ae905 1332
668ae905 1333/* The routines below this point are carefully written to conform to
1334 the standard. They use the same terminology, and follow the rules
1335 closely. Although they are used only in pt.c at the moment, they
1336 should presumably be used everywhere in the future. */
1337
1146f179 1338/* Attempt to perform qualification conversions on EXPR to convert it
1339 to TYPE. Return the resulting expression, or error_mark_node if
1340 the conversion was impossible. */
1341
9031d10b 1342tree
35771a9a 1343perform_qualification_conversions (tree type, tree expr)
668ae905 1344{
1bc16cab 1345 tree expr_type;
1346
1347 expr_type = TREE_TYPE (expr);
1348
3b087710 1349 if (same_type_p (type, expr_type))
1350 return expr;
1351 else if (TYPE_PTR_P (type) && TYPE_PTR_P (expr_type)
1352 && comp_ptr_ttypes (TREE_TYPE (type), TREE_TYPE (expr_type)))
1bc16cab 1353 return build_nop (type, expr);
1354 else if (TYPE_PTR_TO_MEMBER_P (type)
1355 && TYPE_PTR_TO_MEMBER_P (expr_type)
1356 && same_type_p (TYPE_PTRMEM_CLASS_TYPE (type),
1357 TYPE_PTRMEM_CLASS_TYPE (expr_type))
1358 && comp_ptr_ttypes (TYPE_PTRMEM_POINTED_TO_TYPE (type),
1359 TYPE_PTRMEM_POINTED_TO_TYPE (expr_type)))
1360 return build_nop (type, expr);
1146f179 1361 else
1362 return error_mark_node;
668ae905 1363}