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