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