cvt.c 37.2 KB
Newer Older
Mike Stump committed
1
/* Language-level data type conversion for GNU C++.
Jeff Law committed
2
   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3
   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Mike Stump committed
4 5
   Hacked by Michael Tiemann (tiemann@cygnus.com)

6
This file is part of GCC.
Mike Stump committed
7

8
GCC is free software; you can redistribute it and/or modify
Mike Stump committed
9 10 11 12
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

13
GCC is distributed in the hope that it will be useful,
Mike Stump committed
14 15 16 17 18
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING.  If not, write to
Kelley Cook committed
20 21
the Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.  */
Mike Stump committed
22 23


24
/* This file contains the functions for converting C++ expressions
Mike Stump committed
25 26 27 28 29
   to different data types.  The only entry point is `convert'.
   Every language front end must have a `convert' function
   but what kind of conversions it does will depend on the language.  */

#include "config.h"
30
#include "system.h"
31 32
#include "coretypes.h"
#include "tm.h"
Mike Stump committed
33 34 35 36
#include "tree.h"
#include "flags.h"
#include "cp-tree.h"
#include "convert.h"
Kaveh R. Ghazi committed
37
#include "toplev.h"
38
#include "decl.h"
39
#include "target.h"
Mike Stump committed
40

41 42 43 44
static tree cp_convert_to_pointer (tree, tree, bool);
static tree convert_to_pointer_force (tree, tree);
static tree build_up_reference (tree, tree, int, tree);
static void warn_ref_binding (tree, tree, tree);
Jason Merrill committed
45

Mike Stump committed
46 47 48 49 50 51 52 53 54 55 56 57
/* Change of width--truncation and extension of integers or reals--
   is represented with NOP_EXPR.  Proper functioning of many things
   assumes that no other conversions can be NOP_EXPRs.

   Conversion between integer and pointer is represented with CONVERT_EXPR.
   Converting integer to real uses FLOAT_EXPR
   and real to integer uses FIX_TRUNC_EXPR.

   Here is a list of all the functions that assume that widening and
   narrowing is always done with a NOP_EXPR:
     In convert.c, convert_to_integer.
     In c-typeck.c, build_binary_op_nodefault (boolean ops),
Mike Stump committed
58
	and c_common_truthvalue_conversion.
Mike Stump committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72
     In expr.c: expand_expr, for operands of a MULT_EXPR.
     In fold-const.c: fold.
     In tree.c: get_narrower and get_unwidened.

   C++: in multiple-inheritance, converting between pointers may involve
   adjusting them by a delta stored within the class definition.  */

/* Subroutines of `convert'.  */

/* if converting pointer to pointer
     if dealing with classes, check for derived->base or vice versa
     else if dealing with method pointers, delegate
     else convert blindly
   else if converting class, pass off to build_type_conversion
73 74 75
   else try C-style pointer conversion.  If FORCE is true then allow
   conversions via virtual bases (these are permitted by reinterpret_cast,
   but not static_cast).  */
Mike Stump committed
76

Mike Stump committed
77
static tree
78
cp_convert_to_pointer (tree type, tree expr, bool force)
Mike Stump committed
79
{
80 81
  tree intype = TREE_TYPE (expr);
  enum tree_code form;
82
  tree rval;
83 84
  if (intype == error_mark_node)
    return error_mark_node;
Mike Stump committed
85

Mike Stump committed
86 87 88
  if (IS_AGGR_TYPE (intype))
    {
      intype = complete_type (intype);
89
      if (!COMPLETE_TYPE_P (intype))
Mike Stump committed
90
	{
91
	  error ("can't convert from incomplete type %qT to %qT",
Mike Stump committed
92
		 intype, type);
Mike Stump committed
93 94 95
	  return error_mark_node;
	}

96
      rval = build_type_conversion (type, expr);
Mike Stump committed
97 98 99
      if (rval)
	{
	  if (rval == error_mark_node)
100
	    error ("conversion of %qE from %qT to %qT is ambiguous",
Mike Stump committed
101
		   expr, intype, type);
Mike Stump committed
102 103 104 105
	  return rval;
	}
    }

106
  /* Handle anachronistic conversions from (::*)() to cv void* or (*)().  */
107 108
  if (TREE_CODE (type) == POINTER_TYPE
      && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
109
	  || VOID_TYPE_P (TREE_TYPE (type))))
110
    {
111 112 113
      if (TYPE_PTRMEMFUNC_P (intype)
	  || TREE_CODE (intype) == METHOD_TYPE)
	return convert_member_func_to_ptr (type, expr);
114 115
      if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
	return build_nop (type, expr);
116 117 118
      intype = TREE_TYPE (expr);
    }

119 120 121
  if (expr == error_mark_node)
    return error_mark_node;

Mike Stump committed
122 123
  form = TREE_CODE (intype);

124
  if (POINTER_TYPE_P (intype))
Mike Stump committed
125 126 127 128
    {
      intype = TYPE_MAIN_VARIANT (intype);

      if (TYPE_MAIN_VARIANT (type) != intype
129
	  && TREE_CODE (type) == POINTER_TYPE
Mike Stump committed
130
	  && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
131 132
	  && IS_AGGR_TYPE (TREE_TYPE (type))
	  && IS_AGGR_TYPE (TREE_TYPE (intype))
133
	  && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
Mike Stump committed
134 135
	{
	  enum tree_code code = PLUS_EXPR;
136
	  tree binfo;
137 138 139
	  tree intype_class;
	  tree type_class;
	  bool same_p;
140

141 142 143
	  intype_class = TREE_TYPE (intype);
	  type_class = TREE_TYPE (type);

144
	  same_p = same_type_p (TYPE_MAIN_VARIANT (intype_class),
145 146
				TYPE_MAIN_VARIANT (type_class));
	  binfo = NULL_TREE;
147
	  /* Try derived to base conversion.  */
148 149 150
	  if (!same_p)
	    binfo = lookup_base (intype_class, type_class, ba_check, NULL);
	  if (!same_p && !binfo)
Mike Stump committed
151
	    {
152
	      /* Try base to derived conversion.  */
153
	      binfo = lookup_base (type_class, intype_class, ba_check, NULL);
Mike Stump committed
154 155
	      code = MINUS_EXPR;
	    }
156 157
	  if (binfo == error_mark_node)
	    return error_mark_node;
158
	  if (binfo || same_p)
Mike Stump committed
159
	    {
160 161
	      if (binfo)
		expr = build_base_path (code, expr, binfo, 0);
162
	      /* Add any qualifier conversions.  */
163
	      return build_nop (type, expr);
Mike Stump committed
164 165 166
	    }
	}

167
      if (TYPE_PTRMEMFUNC_P (type))
Mike Stump committed
168
	{
169
	  error ("cannot convert %qE from type %qT to type %qT",
Mike Stump committed
170
		 expr, intype, type);
171 172
	  return error_mark_node;
	}
173

174 175 176 177
      return build_nop (type, expr);
    }
  else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
    {
178
      tree b1;
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
      tree b2;
      tree binfo;
      enum tree_code code = PLUS_EXPR;
      base_kind bk;

      b1 = TYPE_PTRMEM_CLASS_TYPE (type);
      b2 = TYPE_PTRMEM_CLASS_TYPE (intype);
      binfo = lookup_base (b1, b2, ba_check, &bk);
      if (!binfo)
	{
	  binfo = lookup_base (b2, b1, ba_check, &bk);
	  code = MINUS_EXPR;
	}
      if (binfo == error_mark_node)
	return error_mark_node;
194

195 196 197
      if (bk == bk_via_virtual)
	{
	  if (force)
198
	    warning (0, "pointer to member cast from %qT to %qT is via"
Mike Stump committed
199
		     " virtual base", intype, type);
200
	  else
201
	    {
202
	      error ("pointer to member cast from %qT to %qT is"
Mike Stump committed
203
		     " via virtual base", intype, type);
204
	      return error_mark_node;
205
	    }
206 207 208
	  /* This is a reinterpret cast, whose result is unspecified.
	     We choose to do nothing.  */
	  return build1 (NOP_EXPR, type, expr);
Mike Stump committed
209 210
	}

211 212 213 214
      if (TREE_CODE (expr) == PTRMEM_CST)
	expr = cplus_expand_constant (expr);

      if (binfo && !integer_zerop (BINFO_OFFSET (binfo)))
215
	expr = size_binop (code,
216 217
			   build_nop (sizetype, expr),
			   BINFO_OFFSET (binfo));
218
      return build_nop (type, expr);
Mike Stump committed
219
    }
220
  else if (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype))
221 222
    return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0,
			     /*c_cast_p=*/false);
223 224
  else if (TYPE_PTRMEMFUNC_P (intype))
    {
225 226 227 228 229 230 231 232 233 234 235 236 237
      if (!warn_pmf2ptr)
	{
	  if (TREE_CODE (expr) == PTRMEM_CST)
	    return cp_convert_to_pointer (type,
					  PTRMEM_CST_MEMBER (expr),
					  force);
	  else if (TREE_CODE (expr) == OFFSET_REF)
	    {
	      tree object = TREE_OPERAND (expr, 0);
	      return get_member_function_from_ptrfunc (&object,
						       TREE_OPERAND (expr, 1));
	    }
	}
238
      error ("cannot convert %qE from type %qT to type %qT",
Mike Stump committed
239
	     expr, intype, type);
240 241
      return error_mark_node;
    }
Mike Stump committed
242 243 244

  if (integer_zerop (expr))
    {
245
      if (TYPE_PTRMEMFUNC_P (type))
246 247
	return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0,
				 /*c_cast_p=*/false);
248

Mark Mitchell committed
249
      if (TYPE_PTRMEM_P (type))
250 251 252
	{
	  /* A NULL pointer-to-member is represented by -1, not by
	     zero.  */
253
	  expr = build_int_cst (type, -1);
254 255 256
	  /* Fix up the representation of -1 if appropriate.  */
	  expr = force_fit_type (expr, 0, false, false);
	}
257
      else
258
	expr = build_int_cst (type, 0);
259

Mike Stump committed
260 261
      return expr;
    }
262
  else if (TYPE_PTR_TO_MEMBER_P (type) && INTEGRAL_CODE_P (form))
Gabriel Dos Reis committed
263
    {
264
      error ("invalid conversion from %qT to %qT", intype, type);
Gabriel Dos Reis committed
265 266
      return error_mark_node;
    }
Mike Stump committed
267

Mike Stump committed
268
  if (INTEGRAL_CODE_P (form))
Mike Stump committed
269
    {
270
      if (TYPE_PRECISION (intype) == POINTER_SIZE)
Mike Stump committed
271
	return build1 (CONVERT_EXPR, type, expr);
272
      expr = cp_convert (c_common_type_for_size (POINTER_SIZE, 0), expr);
273 274 275 276 277
      /* Modes may be different but sizes should be the same.  There
	 is supposed to be some integral type that is the same width
	 as a pointer.  */
      gcc_assert (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr)))
		  == GET_MODE_SIZE (TYPE_MODE (type)));
278

Mike Stump committed
279 280 281
      return convert_to_pointer (type, expr);
    }

282
  if (type_unknown_p (expr))
283
    return instantiate_type (type, expr, tf_error | tf_warning);
284

285
  error ("cannot convert %qE from type %qT to type %qT",
Mike Stump committed
286
	 expr, intype, type);
Mike Stump committed
287 288 289 290 291 292
  return error_mark_node;
}

/* Like convert, except permit conversions to take place which
   are not normally allowed due to access restrictions
   (such as conversion from sub-type to private super-type).  */
Mike Stump committed
293

Mike Stump committed
294
static tree
295
convert_to_pointer_force (tree type, tree expr)
Mike Stump committed
296
{
297 298
  tree intype = TREE_TYPE (expr);
  enum tree_code form = TREE_CODE (intype);
299

Mike Stump committed
300 301 302 303 304 305
  if (form == POINTER_TYPE)
    {
      intype = TYPE_MAIN_VARIANT (intype);

      if (TYPE_MAIN_VARIANT (type) != intype
	  && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
306 307
	  && IS_AGGR_TYPE (TREE_TYPE (type))
	  && IS_AGGR_TYPE (TREE_TYPE (intype))
Mike Stump committed
308 309 310
	  && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
	{
	  enum tree_code code = PLUS_EXPR;
311 312 313
	  tree binfo;

	  binfo = lookup_base (TREE_TYPE (intype), TREE_TYPE (type),
314
			       ba_unique, NULL);
315
	  if (!binfo)
Mike Stump committed
316
	    {
317
	      binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
318
				   ba_unique, NULL);
319
	      code = MINUS_EXPR;
Mike Stump committed
320
	    }
321 322 323
	  if (binfo == error_mark_node)
	    return error_mark_node;
	  if (binfo)
Mike Stump committed
324
	    {
325
	      expr = build_base_path (code, expr, binfo, 0);
Mike Stump committed
326 327
	      if (expr == error_mark_node)
		 return error_mark_node;
328
	      /* Add any qualifier conversions.  */
329 330
	      if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)),
				TREE_TYPE (type)))
331
		expr = build_nop (type, expr);
332
	      return expr;
Mike Stump committed
333 334 335 336
	    }
	}
    }

337
  return cp_convert_to_pointer (type, expr, true);
Mike Stump committed
338 339 340 341 342 343 344
}

/* We are passing something to a function which requires a reference.
   The type we are interested in is in TYPE. The initial
   value we have to begin with is in ARG.

   FLAGS controls how we manage access checking.
345 346
   DIRECT_BIND in FLAGS controls how any temporaries are generated.
     If DIRECT_BIND is set, DECL is the reference we're binding to.  */
Mike Stump committed
347

Mike Stump committed
348
static tree
349
build_up_reference (tree type, tree arg, int flags, tree decl)
Mike Stump committed
350
{
Mike Stump committed
351
  tree rval;
Mike Stump committed
352
  tree argtype = TREE_TYPE (arg);
Mike Stump committed
353 354
  tree target_type = TREE_TYPE (type);

355
  gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
Mike Stump committed
356

Mike Stump committed
357
  if ((flags & DIRECT_BIND) && ! real_lvalue_p (arg))
Mike Stump committed
358
    {
359 360
      /* Create a new temporary variable.  We can't just use a TARGET_EXPR
	 here because it needs to live as long as DECL.  */
Mike Stump committed
361
      tree targ = arg;
362

363
      arg = make_temporary_var_for_ref_to_temp (decl, TREE_TYPE (arg));
364 365

      /* Process the initializer for the declaration.  */
366
      DECL_INITIAL (arg) = targ;
367
      cp_finish_decl (arg, targ, NULL_TREE,
368
		      LOOKUP_ONLYCONVERTING|DIRECT_BIND);
369
    }
Mike Stump committed
370
  else if (!(flags & DIRECT_BIND) && ! lvalue_p (arg))
371
    return get_target_expr (arg);
372

373
  /* If we had a way to wrap this up, and say, if we ever needed its
374 375
     address, transform all occurrences of the register, into a memory
     reference we could win better.  */
Mike Stump committed
376
  rval = build_unary_op (ADDR_EXPR, arg, 1);
377 378 379
  if (rval == error_mark_node)
    return error_mark_node;

380 381 382 383 384
  if ((flags & LOOKUP_PROTECT)
      && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type)
      && IS_AGGR_TYPE (argtype)
      && IS_AGGR_TYPE (target_type))
    {
385
      /* We go through lookup_base for the access control.  */
386
      tree binfo = lookup_base (argtype, target_type, ba_check, NULL);
387 388 389 390
      if (binfo == error_mark_node)
	return error_mark_node;
      if (binfo == NULL_TREE)
	return error_not_base_type (target_type, argtype);
391
      rval = build_base_path (PLUS_EXPR, rval, binfo, 1);
392
    }
Mike Stump committed
393 394 395
  else
    rval
      = convert_to_pointer_force (build_pointer_type (target_type), rval);
396
  return build_nop (type, rval);
Mike Stump committed
397 398
}

399 400 401
/* Subroutine of convert_to_reference. REFTYPE is the target reference type.
   INTYPE is the original rvalue type and DECL is an optional _DECL node
   for diagnostics.
402

403 404 405 406 407
   [dcl.init.ref] says that if an rvalue is used to
   initialize a reference, then the reference must be to a
   non-volatile const type.  */

static void
408
warn_ref_binding (tree reftype, tree intype, tree decl)
409 410
{
  tree ttl = TREE_TYPE (reftype);
411

412 413 414 415 416
  if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl))
    {
      const char *msg;

      if (CP_TYPE_VOLATILE_P (ttl) && decl)
417
	  msg = "initialization of volatile reference type %q#T from"
Mike Stump committed
418
	    " rvalue of type %qT";
419
      else if (CP_TYPE_VOLATILE_P (ttl))
420
	  msg = "conversion to volatile reference type %q#T "
Mike Stump committed
421
	    " from rvalue of type %qT";
422
      else if (decl)
423
	  msg = "initialization of non-const reference type %q#T from"
Mike Stump committed
424
	    " rvalue of type %qT";
425
      else
426
	  msg = "conversion to non-const reference type %q#T from"
Mike Stump committed
427
	    " rvalue of type %qT";
428

429
      pedwarn (msg, reftype, intype);
430 431 432
    }
}

Mike Stump committed
433 434 435
/* For C++: Only need to do one-level references, but cannot
   get tripped up on signed/unsigned differences.

Mike Stump committed
436 437 438
   DECL is either NULL_TREE or the _DECL node for a reference that is being
   initialized.  It can be error_mark_node if we don't know the _DECL but
   we know it's an initialization.  */
Mike Stump committed
439 440

tree
441
convert_to_reference (tree reftype, tree expr, int convtype,
Mike Stump committed
442
		      int flags, tree decl)
Mike Stump committed
443
{
444 445
  tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
  tree intype;
Mike Stump committed
446
  tree rval = NULL_TREE;
Mike Stump committed
447
  tree rval_as_conversion = NULL_TREE;
448
  bool can_convert_intype_to_type;
Mike Stump committed
449

450
  if (TREE_CODE (type) == FUNCTION_TYPE
451
      && TREE_TYPE (expr) == unknown_type_node)
452
    expr = instantiate_type (type, expr,
453 454 455 456 457 458 459
			     (flags & LOOKUP_COMPLAIN)
			     ? tf_error | tf_warning : tf_none);

  if (expr == error_mark_node)
    return error_mark_node;

  intype = TREE_TYPE (expr);
460

461
  gcc_assert (TREE_CODE (intype) != REFERENCE_TYPE);
Mike Stump committed
462 463 464

  intype = TYPE_MAIN_VARIANT (intype);

465 466 467
  can_convert_intype_to_type = can_convert (type, intype);
  if (!can_convert_intype_to_type
      && (convtype & CONV_IMPLICIT) && IS_AGGR_TYPE (intype)
Mike Stump committed
468 469 470 471
      && ! (flags & LOOKUP_NO_CONVERSION))
    {
      /* Look for a user-defined conversion to lvalue that we can use.  */

472
      rval_as_conversion
473
	= build_type_conversion (reftype, expr);
Mike Stump committed
474 475 476 477 478 479 480

      if (rval_as_conversion && rval_as_conversion != error_mark_node
	  && real_lvalue_p (rval_as_conversion))
	{
	  expr = rval_as_conversion;
	  rval_as_conversion = NULL_TREE;
	  intype = type;
481
	  can_convert_intype_to_type = 1;
Mike Stump committed
482 483 484
	}
    }

485 486
  if (((convtype & CONV_STATIC) && can_convert (intype, type))
      || ((convtype & CONV_IMPLICIT) && can_convert_intype_to_type))
Mike Stump committed
487 488 489
    {
      if (flags & LOOKUP_COMPLAIN)
	{
Mike Stump committed
490
	  tree ttl = TREE_TYPE (reftype);
491
	  tree ttr = lvalue_type (expr);
Mike Stump committed
492

493 494
	  if (! real_lvalue_p (expr))
	    warn_ref_binding (reftype, intype, decl);
495

496
	  if (! (convtype & CONV_CONST)
497
		   && !at_least_as_qualified_p (ttl, ttr))
498
	    pedwarn ("conversion from %qT to %qT discards qualifiers",
Mike Stump committed
499
		     ttr, reftype);
Mike Stump committed
500 501
	}

502
      return build_up_reference (reftype, expr, flags, decl);
Mike Stump committed
503
    }
Mike Stump committed
504
  else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr))
Mike Stump committed
505 506 507
    {
      /* When casting an lvalue to a reference type, just convert into
	 a pointer to the new type and deference it.  This is allowed
Mike Stump committed
508
	 by San Diego WP section 5.2.9 paragraph 12, though perhaps it
Mike Stump committed
509
	 should be done directly (jason).  (int &)ri ---> *(int*)&ri */
Mike Stump committed
510

Richard Kenner committed
511
      /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they
Mike Stump committed
512
	 meant.  */
Mike Stump committed
513
      if (TREE_CODE (intype) == POINTER_TYPE
514 515
	  && (comptypes (TREE_TYPE (intype), type,
			 COMPARE_BASE | COMPARE_DERIVED)))
516
	warning (0, "casting %qT to %qT does not dereference pointer",
517
		 intype, reftype);
518

Mike Stump committed
519 520
      rval = build_unary_op (ADDR_EXPR, expr, 0);
      if (rval != error_mark_node)
521 522
	rval = convert_force (build_pointer_type (TREE_TYPE (reftype)),
			      rval, 0);
Mike Stump committed
523
      if (rval != error_mark_node)
Mike Stump committed
524
	rval = build1 (NOP_EXPR, reftype, rval);
Mike Stump committed
525
    }
526
  else
527 528 529
    {
      rval = convert_for_initialization (NULL_TREE, type, expr, flags,
					 "converting", 0, 0);
530 531
      if (rval == NULL_TREE || rval == error_mark_node)
	return rval;
532
      warn_ref_binding (reftype, intype, decl);
533
      rval = build_up_reference (reftype, rval, flags, decl);
534
    }
Mike Stump committed
535 536 537

  if (rval)
    {
Mike Stump committed
538
      /* If we found a way to convert earlier, then use it.  */
Mike Stump committed
539 540 541
      return rval;
    }

Mike Stump committed
542
  if (flags & LOOKUP_COMPLAIN)
543
    error ("cannot convert type %qT to type %qT", intype, reftype);
Mike Stump committed
544

Mike Stump committed
545 546 547 548
  return error_mark_node;
}

/* We are using a reference VAL for its value. Bash that reference all the
Mike Stump committed
549 550
   way down to its lowest form.  */

Mike Stump committed
551
tree
552
convert_from_reference (tree val)
Mike Stump committed
553
{
554
  if (TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE)
555 556 557
    {
      tree t = canonical_type_variant (TREE_TYPE (TREE_TYPE (val)));
      tree ref = build1 (INDIRECT_REF, t, val);
558

559 560 561 562 563 564 565 566 567 568
       /* We *must* set TREE_READONLY when dereferencing a pointer to const,
	  so that we get the proper error message if the result is used
	  to assign to.  Also, &* is supposed to be a no-op.  */
      TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
      TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
      TREE_SIDE_EFFECTS (ref)
	= (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val));
      REFERENCE_REF_P (ref) = 1;
      val = ref;
    }
569

Mike Stump committed
570 571
  return val;
}
572 573 574 575 576 577 578 579 580 581 582 583 584 585 586

/* Really perform an lvalue-to-rvalue conversion, including copying an
   argument of class type into a temporary.  */

tree
force_rvalue (tree expr)
{
  if (IS_AGGR_TYPE (TREE_TYPE (expr)) && TREE_CODE (expr) != TARGET_EXPR)
    expr = ocp_convert (TREE_TYPE (expr), expr,
			CONV_IMPLICIT|CONV_FORCE_TEMP, LOOKUP_NORMAL);
  else
    expr = decay_conversion (expr);

  return expr;
}
Mike Stump committed
587

588 589 590
/* C++ conversions, preference to static cast conversions.  */

tree
591
cp_convert (tree type, tree expr)
592 593 594 595
{
  return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL);
}

Mike Stump committed
596 597 598 599
/* Conversion...

   FLAGS indicates how we should behave.  */

Mike Stump committed
600
tree
601
ocp_convert (tree type, tree expr, int convtype, int flags)
Mike Stump committed
602
{
603 604
  tree e = expr;
  enum tree_code code = TREE_CODE (type);
605
  const char *invalid_conv_diag;
Mike Stump committed
606

607
  if (error_operand_p (e) || type == error_mark_node)
Mike Stump committed
608
    return error_mark_node;
Mike Stump committed
609

610 611 612
  complete_type (type);
  complete_type (TREE_TYPE (expr));

613 614 615 616 617 618 619
  if ((invalid_conv_diag
       = targetm.invalid_conversion (TREE_TYPE (expr), type)))
    {
      error (invalid_conv_diag);
      return error_mark_node;
    }

620
  e = integral_constant_value (e);
621

622 623 624 625 626
  if (IS_AGGR_TYPE (type) && (convtype & CONV_FORCE_TEMP)
      /* Some internal structures (vtable_entry_type, sigtbl_ptr_type)
	 don't go through finish_struct, so they don't have the synthesized
	 constructors.  So don't force a temporary.  */
      && TYPE_HAS_CONSTRUCTOR (type))
Mike Stump committed
627 628
    /* We need a new temporary; don't take this shortcut.  */;
  else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (e)))
629
    {
630
      if (same_type_p (type, TREE_TYPE (e)))
631 632
	/* The call to fold will not always remove the NOP_EXPR as
	   might be expected, since if one of the types is a typedef;
Kazu Hirata committed
633
	   the comparison in fold is just equality of pointers, not a
634 635 636 637
	   call to comptypes.  We don't call fold in this case because
	   that can result in infinite recursion; fold will call
	   convert, which will call ocp_convert, etc.  */
	return e;
638
      /* For complex data types, we need to perform componentwise
Mike Stump committed
639
	 conversion.  */
640
      else if (TREE_CODE (type) == COMPLEX_TYPE)
Mike Stump committed
641
	return fold_if_not_in_template (convert_to_complex (type, e));
642 643 644 645 646
      else if (TREE_CODE (e) == TARGET_EXPR)
	{
	  /* Don't build a NOP_EXPR of class type.  Instead, change the
	     type of the temporary.  Only allow this for cv-qual changes,
	     though.  */
647 648
	  gcc_assert (same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (e)),
				   TYPE_MAIN_VARIANT (type)));
649 650 651
	  TREE_TYPE (e) = TREE_TYPE (TARGET_EXPR_SLOT (e)) = type;
	  return e;
	}
652
      else
653 654 655 656
	{
	  /* We shouldn't be treating objects of ADDRESSABLE type as
	     rvalues.  */
	  gcc_assert (!TREE_ADDRESSABLE (type));
657
	  return fold_if_not_in_template (build_nop (type, e));
658
	}
659 660
    }

Mike Stump committed
661
  if (code == VOID_TYPE && (convtype & CONV_STATIC))
662
    {
663
      e = convert_to_void (e, /*implicit=*/NULL);
664
      return e;
665
    }
Mike Stump committed
666

Mike Stump committed
667
  if (INTEGRAL_CODE_P (code))
Mike Stump committed
668
    {
Mike Stump committed
669
      tree intype = TREE_TYPE (e);
670
      /* enum = enum, enum = int, enum = float, (enum)pointer are all
Mike Stump committed
671
	 errors.  */
672
      if (TREE_CODE (type) == ENUMERAL_TYPE
Giovanni Bajo committed
673
	  && (((INTEGRAL_OR_ENUMERATION_TYPE_P (intype)
Mike Stump committed
674
		|| TREE_CODE (intype) == REAL_TYPE)
Giovanni Bajo committed
675 676
	       && ! (convtype & CONV_STATIC))
	      || TREE_CODE (intype) == POINTER_TYPE))
Mike Stump committed
677
	{
Giovanni Bajo committed
678 679
	  if (flags & LOOKUP_COMPLAIN)
	    pedwarn ("conversion from %q#T to %q#T", intype, type);
Mike Stump committed
680 681 682 683

	  if (flag_pedantic_errors)
	    return error_mark_node;
	}
Mike Stump committed
684
      if (IS_AGGR_TYPE (intype))
Mike Stump committed
685 686
	{
	  tree rval;
687
	  rval = build_type_conversion (type, e);
Mike Stump committed
688 689
	  if (rval)
	    return rval;
Mike Stump committed
690
	  if (flags & LOOKUP_COMPLAIN)
691
	    error ("%q#T used where a %qT was expected", intype, type);
Mike Stump committed
692 693
	  return error_mark_node;
	}
Mike Stump committed
694
      if (code == BOOLEAN_TYPE)
695 696
	return cp_truthvalue_conversion (e);

697
      return fold_if_not_in_template (convert_to_integer (type, e));
Mike Stump committed
698
    }
699
  if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type))
700
    return fold_if_not_in_template (cp_convert_to_pointer (type, e, false));
701
  if (code == VECTOR_TYPE)
702 703 704 705 706 707
    {
      tree in_vtype = TREE_TYPE (e);
      if (IS_AGGR_TYPE (in_vtype))
	{
	  tree ret_val;
	  ret_val = build_type_conversion (type, e);
Mike Stump committed
708 709 710 711 712
	  if (ret_val)
	    return ret_val;
	  if (flags & LOOKUP_COMPLAIN)
	    error ("%q#T used where a %qT was expected", in_vtype, type);
	  return error_mark_node;
713
	}
714
      return fold_if_not_in_template (convert_to_vector (type, e));
715
    }
716
  if (code == REAL_TYPE || code == COMPLEX_TYPE)
Mike Stump committed
717 718 719 720
    {
      if (IS_AGGR_TYPE (TREE_TYPE (e)))
	{
	  tree rval;
721
	  rval = build_type_conversion (type, e);
Mike Stump committed
722 723 724
	  if (rval)
	    return rval;
	  else
Mike Stump committed
725
	    if (flags & LOOKUP_COMPLAIN)
726
	      error ("%q#T used where a floating point value was expected",
Mike Stump committed
727
			TREE_TYPE (e));
Mike Stump committed
728
	}
729
      if (code == REAL_TYPE)
730
	return fold_if_not_in_template (convert_to_real (type, e));
731
      else if (code == COMPLEX_TYPE)
732
	return fold_if_not_in_template (convert_to_complex (type, e));
Mike Stump committed
733 734 735 736 737 738 739 740
    }

  /* New C++ semantics:  since assignment is now based on
     memberwise copying,  if the rhs type is derived from the
     lhs type, then we may still do a conversion.  */
  if (IS_AGGR_TYPE_CODE (code))
    {
      tree dtype = TREE_TYPE (e);
Mike Stump committed
741
      tree ctor = NULL_TREE;
Mike Stump committed
742 743 744 745 746 747 748 749 750 751

      dtype = TYPE_MAIN_VARIANT (dtype);

      /* Conversion between aggregate types.  New C++ semantics allow
	 objects of derived type to be cast to objects of base type.
	 Old semantics only allowed this between pointers.

	 There may be some ambiguity between using a constructor
	 vs. using a type conversion operator when both apply.  */

752
      ctor = e;
753

754 755
      if (abstract_virtuals_error (NULL_TREE, type))
	return error_mark_node;
756

757 758
      if ((flags & LOOKUP_ONLYCONVERTING)
	  && ! (IS_AGGR_TYPE (dtype) && DERIVED_FROM_P (type, dtype)))
759 760 761 762
	/* For copy-initialization, first we create a temp of the proper type
	   with a user-defined conversion sequence, then we direct-initialize
	   the target with the temp (see [dcl.init]).  */
	ctor = build_user_type_conversion (type, ctor, flags);
763
      else
764
	ctor = build_special_member_call (NULL_TREE,
765 766
					  complete_ctor_identifier,
					  build_tree_list (NULL_TREE, ctor),
767
					  type, flags);
768 769
      if (ctor)
	return build_cplus_new (type, ctor);
Mike Stump committed
770 771
    }

Mike Stump committed
772
  if (flags & LOOKUP_COMPLAIN)
773
    error ("conversion from %qT to non-scalar type %qT requested",
Mike Stump committed
774
	   TREE_TYPE (expr), type);
Mike Stump committed
775 776 777
  return error_mark_node;
}

778 779 780 781
/* When an expression is used in a void context, its value is discarded and
   no lvalue-rvalue and similar conversions happen [expr.static.cast/4,
   stmt.expr/1, expr.comma/1].  This permits dereferencing an incomplete type
   in a void context. The C++ standard does not define what an `access' to an
Kazu Hirata committed
782
   object is, but there is reason to believe that it is the lvalue to rvalue
783 784 785 786 787 788 789 790 791
   conversion -- if it were not, `*&*p = 1' would violate [expr]/4 in that it
   accesses `*p' not to calculate the value to be stored. But, dcl.type.cv/8
   indicates that volatile semantics should be the same between C and C++
   where ever possible. C leaves it implementation defined as to what
   constitutes an access to a volatile. So, we interpret `*vp' as a read of
   the volatile object `vp' points to, unless that is an incomplete type. For
   volatile references we do not do this interpretation, because that would
   make it impossible to ignore the reference return value from functions. We
   issue warnings in the confusing cases.
792

793 794 795
   IMPLICIT is tells us the context of an implicit void conversion.  */

tree
796
convert_to_void (tree expr, const char *implicit)
797
{
798
  if (expr == error_mark_node
799 800
      || TREE_TYPE (expr) == error_mark_node)
    return error_mark_node;
801 802
  if (!TREE_TYPE (expr))
    return expr;
803 804
  if (invalid_nonstatic_memfn_p (expr))
    return error_mark_node;
805 806 807 808 809
  if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
    {
      error ("pseudo-destructor is not called");
      return error_mark_node;
    }
810
  if (VOID_TYPE_P (TREE_TYPE (expr)))
811 812 813 814 815
    return expr;
  switch (TREE_CODE (expr))
    {
    case COND_EXPR:
      {
Mike Stump committed
816 817 818 819
	/* The two parts of a cond expr might be separate lvalues.  */
	tree op1 = TREE_OPERAND (expr,1);
	tree op2 = TREE_OPERAND (expr,2);
	tree new_op1 = convert_to_void
820 821
	  (op1, (implicit && !TREE_SIDE_EFFECTS (op2)
		 ? "second operand of conditional" : NULL));
Mike Stump committed
822
	tree new_op2 = convert_to_void
823 824
	  (op2, (implicit && !TREE_SIDE_EFFECTS (op1)
		 ? "third operand of conditional" : NULL));
825

826 827
	expr = build3 (COND_EXPR, TREE_TYPE (new_op1),
		       TREE_OPERAND (expr, 0), new_op1, new_op2);
Mike Stump committed
828
	break;
829
      }
830

831 832
    case COMPOUND_EXPR:
      {
Mike Stump committed
833 834 835
	/* The second part of a compound expr contains the value.  */
	tree op1 = TREE_OPERAND (expr,1);
	tree new_op1 = convert_to_void
836
	  (op1, (implicit && !TREE_NO_WARNING (expr)
837
		 ? "right-hand operand of comma" : NULL));
838

Mike Stump committed
839
	if (new_op1 != op1)
840
	  {
841 842
	    tree t = build2 (COMPOUND_EXPR, TREE_TYPE (new_op1),
			     TREE_OPERAND (expr, 0), new_op1);
843 844 845
	    expr = t;
	  }

Mike Stump committed
846
	break;
847
      }
848

849 850
    case NON_LVALUE_EXPR:
    case NOP_EXPR:
851
      /* These have already decayed to rvalue.  */
852
      break;
853

854
    case CALL_EXPR:   /* We have a special meaning for volatile void fn().  */
855
      break;
856

857 858
    case INDIRECT_REF:
      {
Mike Stump committed
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
	tree type = TREE_TYPE (expr);
	int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0)))
			   == REFERENCE_TYPE;
	int is_volatile = TYPE_VOLATILE (type);
	int is_complete = COMPLETE_TYPE_P (complete_type (type));

	if (is_volatile && !is_complete)
	  warning (0, "object of incomplete type %qT will not be accessed in %s",
		   type, implicit ? implicit : "void context");
	else if (is_reference && is_volatile)
	  warning (0, "object of type %qT will not be accessed in %s",
		   TREE_TYPE (TREE_OPERAND (expr, 0)),
		   implicit ? implicit : "void context");
	if (is_reference || !is_volatile || !is_complete)
	  expr = TREE_OPERAND (expr, 0);

	break;
876
      }
877

878 879
    case VAR_DECL:
      {
Mike Stump committed
880 881 882 883 884 885 886 887
	/* External variables might be incomplete.  */
	tree type = TREE_TYPE (expr);
	int is_complete = COMPLETE_TYPE_P (complete_type (type));

	if (TYPE_VOLATILE (type) && !is_complete)
	  warning (0, "object %qE of incomplete type %qT will not be accessed in %s",
		   expr, type, implicit ? implicit : "void context");
	break;
888
      }
889

890 891 892 893
    default:;
    }
  {
    tree probe = expr;
894

895 896
    if (TREE_CODE (probe) == ADDR_EXPR)
      probe = TREE_OPERAND (expr, 0);
897 898 899 900
    if (type_unknown_p (probe))
      {
	/* [over.over] enumerates the places where we can take the address
	   of an overloaded function, and this is not one of them.  */
901
	pedwarn ("%s cannot resolve address of overloaded function",
902
		    implicit ? implicit : "void cast");
903
	expr = void_zero_node;
904 905
      }
    else if (implicit && probe == expr && is_overloaded_fn (probe))
906
      /* Only warn when there is no &.  */
907
      warning (0, "%s is a reference, not call, to function %qE",
908
		  implicit, expr);
909
  }
910

911
  if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr)))
912
    {
913 914 915 916
      if (implicit
	  && warn_unused_value
	  && !TREE_NO_WARNING (expr)
	  && !processing_template_decl)
917 918 919 920
	{
	  /* The middle end does not warn about expressions that have
	     been explicitly cast to void, so we must do so here.  */
	  if (!TREE_SIDE_EFFECTS (expr))
921
	    warning (0, "%s has no effect", implicit);
922 923
	  else
	    {
924 925 926
	      tree e;
	      enum tree_code code;
	      enum tree_code_class class;
927

928 929 930 931
	      e = expr;
	      /* We might like to warn about (say) "(int) f()", as the
		 cast has no effect, but the compiler itself will
		 generate implicit conversions under some
932
		 circumstances.  (For example a block copy will be
933 934 935
		 turned into a call to "__builtin_memcpy", with a
		 conversion of the return value to an appropriate
		 type.)  So, to avoid false positives, we strip
936 937 938 939 940
		 conversions.  Do not use STRIP_NOPs because it will
		 not strip conversions to "void", as that is not a
		 mode-preserving conversion.  */
	      while (TREE_CODE (e) == NOP_EXPR)
		e = TREE_OPERAND (e, 0);
941 942 943 944 945

	      code = TREE_CODE (e);
	      class = TREE_CODE_CLASS (code);
	      if (class == tcc_comparison
		   || class == tcc_unary
946
		   || (class == tcc_binary
947 948 949 950 951 952
		       && !(code == MODIFY_EXPR
			    || code == INIT_EXPR
			    || code == PREDECREMENT_EXPR
			    || code == PREINCREMENT_EXPR
			    || code == POSTDECREMENT_EXPR
			    || code == POSTINCREMENT_EXPR)))
953
		warning (0, "value computed is not used");
954 955
	    }
	}
956
      expr = build1 (CONVERT_EXPR, void_type_node, expr);
957 958 959 960
    }
  return expr;
}

Mike Stump committed
961 962 963 964
/* Create an expression whose value is that of EXPR,
   converted to type TYPE.  The TREE_TYPE of the value
   is always TYPE.  This function implements all reasonable
   conversions; callers should filter out those that are
965 966 967 968 969 970 971 972
   not permitted by the language being compiled.

   Most of this routine is from build_reinterpret_cast.

   The backend cannot call cp_convert (what was convert) because
   conversions to/from basetypes may involve memory references
   (vbases) and adding or subtracting small values (multiple
   inheritance), but it calls convert from the constant folding code
Jason Merrill committed
973
   on subtrees of already built trees after it has ripped them apart.
974 975 976

   Also, if we ever support range variables, we'll probably also have to
   do a little bit more work.  */
Mike Stump committed
977 978

tree
979
convert (tree type, tree expr)
Mike Stump committed
980
{
981 982 983 984 985 986 987
  tree intype;

  if (type == error_mark_node || expr == error_mark_node)
    return error_mark_node;

  intype = TREE_TYPE (expr);

988
  if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype))
989
    return fold_if_not_in_template (build_nop (type, expr));
990 991 992

  return ocp_convert (type, expr, CONV_OLD_CONVERT,
		      LOOKUP_NORMAL|LOOKUP_NO_CONVERSION);
Mike Stump committed
993 994
}

995
/* Like cp_convert, except permit conversions to take place which
Mike Stump committed
996 997
   are not normally allowed due to access restrictions
   (such as conversion from sub-type to private super-type).  */
Mike Stump committed
998

Mike Stump committed
999
tree
1000
convert_force (tree type, tree expr, int convtype)
Mike Stump committed
1001
{
1002 1003
  tree e = expr;
  enum tree_code code = TREE_CODE (type);
Mike Stump committed
1004 1005

  if (code == REFERENCE_TYPE)
1006
    return (fold_if_not_in_template
1007 1008
	    (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
				   NULL_TREE)));
Mike Stump committed
1009 1010

  if (code == POINTER_TYPE)
1011
    return fold_if_not_in_template (convert_to_pointer_force (type, e));
Mike Stump committed
1012

Mike Stump committed
1013
  /* From typeck.c convert_for_assignment */
Mike Stump committed
1014 1015 1016
  if (((TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE && TREE_CODE (e) == ADDR_EXPR
	&& TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE
	&& TREE_CODE (TREE_TYPE (TREE_TYPE (e))) == METHOD_TYPE)
Mike Stump committed
1017 1018
       || integer_zerop (e)
       || TYPE_PTRMEMFUNC_P (TREE_TYPE (e)))
Mike Stump committed
1019
      && TYPE_PTRMEMFUNC_P (type))
1020 1021 1022
    /* compatible pointer to member functions.  */
    return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1,
			     /*c_cast_p=*/1);
Mike Stump committed
1023

1024
  return ocp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL);
Mike Stump committed
1025 1026 1027 1028 1029 1030 1031 1032
}

/* Convert an aggregate EXPR to type XTYPE.  If a conversion
   exists, return the attempted conversion.  This may
   return ERROR_MARK_NODE if the conversion is not
   allowed (references private members, etc).
   If no conversion exists, NULL_TREE is returned.

Mike Stump committed
1033 1034 1035 1036
   FIXME: Ambiguity checking is wrong.  Should choose one by the implicit
   object parameter, or by the second standard conversion sequence if
   that doesn't do it.  This will probably wait for an overloading rewrite.
   (jason 8/9/95)  */
Mike Stump committed
1037 1038

tree
1039
build_type_conversion (tree xtype, tree expr)
Mike Stump committed
1040 1041
{
  /* C++: check to see if we can convert this aggregate type
Mike Stump committed
1042
     into the required type.  */
1043
  return build_user_type_conversion (xtype, expr, LOOKUP_NORMAL);
Mike Stump committed
1044 1045
}

Mike Stump committed
1046 1047
/* Convert the given EXPR to one of a group of types suitable for use in an
   expression.  DESIRES is a combination of various WANT_* flags (q.v.)
1048
   which indicates which types are suitable.  If COMPLAIN is true, complain
Mike Stump committed
1049
   about ambiguity; otherwise, the caller will deal with it.  */
Mike Stump committed
1050

Mike Stump committed
1051
tree
1052
build_expr_type_conversion (int desires, tree expr, bool complain)
Mike Stump committed
1053
{
Mike Stump committed
1054
  tree basetype = TREE_TYPE (expr);
Kaveh R. Ghazi committed
1055
  tree conv = NULL_TREE;
1056
  tree winner = NULL_TREE;
Mike Stump committed
1057

1058 1059
  if (expr == null_node
      && (desires & WANT_INT)
1060
      && !(desires & WANT_NULL))
1061
    warning (0, "converting NULL to non-pointer type");
1062

Mike Stump committed
1063
  basetype = TREE_TYPE (expr);
Mike Stump committed
1064

1065 1066 1067
  if (basetype == error_mark_node)
    return error_mark_node;

1068 1069 1070 1071
  if (! IS_AGGR_TYPE (basetype))
    switch (TREE_CODE (basetype))
      {
      case INTEGER_TYPE:
1072
	if ((desires & WANT_NULL) && null_ptr_cst_p (expr))
1073 1074 1075
	  return expr;
	/* else fall through...  */

1076
      case VECTOR_TYPE:
1077 1078 1079 1080 1081 1082 1083 1084
      case BOOLEAN_TYPE:
	return (desires & WANT_INT) ? expr : NULL_TREE;
      case ENUMERAL_TYPE:
	return (desires & WANT_ENUM) ? expr : NULL_TREE;
      case REAL_TYPE:
	return (desires & WANT_FLOAT) ? expr : NULL_TREE;
      case POINTER_TYPE:
	return (desires & WANT_POINTER) ? expr : NULL_TREE;
1085

1086 1087
      case FUNCTION_TYPE:
      case ARRAY_TYPE:
1088
	return (desires & WANT_POINTER) ? decay_conversion (expr)
Mike Stump committed
1089
					: NULL_TREE;
1090 1091 1092 1093 1094 1095
      default:
	return NULL_TREE;
      }

  /* The code for conversions from class type is currently only used for
     delete expressions.  Other expressions are handled by build_new_op.  */
1096 1097 1098
  if (!complete_type_or_else (basetype, expr))
    return error_mark_node;
  if (!TYPE_HAS_CONVERSION (basetype))
1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109
    return NULL_TREE;

  for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv))
    {
      int win = 0;
      tree candidate;
      tree cand = TREE_VALUE (conv);

      if (winner && winner == cand)
	continue;

1110
      candidate = non_reference (TREE_TYPE (TREE_TYPE (cand)));
1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133

      switch (TREE_CODE (candidate))
	{
	case BOOLEAN_TYPE:
	case INTEGER_TYPE:
	  win = (desires & WANT_INT); break;
	case ENUMERAL_TYPE:
	  win = (desires & WANT_ENUM); break;
	case REAL_TYPE:
	  win = (desires & WANT_FLOAT); break;
	case POINTER_TYPE:
	  win = (desires & WANT_POINTER); break;

	default:
	  break;
	}

      if (win)
	{
	  if (winner)
	    {
	      if (complain)
		{
1134
		  error ("ambiguous default type conversion from %qT",
Mike Stump committed
1135
			 basetype);
1136
		  error ("  candidate conversions include %qD and %qD",
Mike Stump committed
1137
			 winner, cand);
1138 1139 1140 1141 1142 1143 1144
		}
	      return error_mark_node;
	    }
	  else
	    winner = cand;
	}
    }
Mike Stump committed
1145

1146 1147
  if (winner)
    {
1148
      tree type = non_reference (TREE_TYPE (TREE_TYPE (winner)));
1149
      return build_user_type_conversion (type, expr, LOOKUP_NORMAL);
Mike Stump committed
1150
    }
Mike Stump committed
1151

1152
  return NULL_TREE;
Mike Stump committed
1153
}
Mike Stump committed
1154

Mike Stump committed
1155 1156
/* Implements integral promotion (4.1) and float->double promotion.  */

Mike Stump committed
1157
tree
1158
type_promotes_to (tree type)
Mike Stump committed
1159
{
Mike Stump committed
1160 1161 1162
  if (type == error_mark_node)
    return error_mark_node;

Mike Stump committed
1163
  type = TYPE_MAIN_VARIANT (type);
Mike Stump committed
1164 1165 1166

  /* bool always promotes to int (not unsigned), even if it's the same
     size.  */
Jason Merrill committed
1167
  if (type == boolean_type_node)
Mike Stump committed
1168 1169 1170 1171 1172 1173
    type = integer_type_node;

  /* Normally convert enums to int, but convert wide enums to something
     wider.  */
  else if (TREE_CODE (type) == ENUMERAL_TYPE
	   || type == wchar_type_node)
1174 1175 1176
    {
      int precision = MAX (TYPE_PRECISION (type),
			   TYPE_PRECISION (integer_type_node));
1177
      tree totype = c_common_type_for_size (precision, 0);
1178
      if (TYPE_UNSIGNED (type)
1179
	  && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype))
1180
	type = c_common_type_for_size (precision, 1);
1181 1182 1183
      else
	type = totype;
    }
1184
  else if (c_promoting_integer_type_p (type))
Mike Stump committed
1185
    {
1186
      /* Retain unsignedness if really not getting bigger.  */
1187
      if (TYPE_UNSIGNED (type)
1188
	  && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
Mike Stump committed
1189 1190 1191 1192 1193 1194
	type = unsigned_type_node;
      else
	type = integer_type_node;
    }
  else if (type == float_type_node)
    type = double_type_node;
1195

1196
  return type;
Mike Stump committed
1197
}
1198 1199 1200 1201 1202 1203

/* The routines below this point are carefully written to conform to
   the standard.  They use the same terminology, and follow the rules
   closely.  Although they are used only in pt.c at the moment, they
   should presumably be used everywhere in the future.  */

1204 1205 1206 1207
/* Attempt to perform qualification conversions on EXPR to convert it
   to TYPE.  Return the resulting expression, or error_mark_node if
   the conversion was impossible.  */

1208
tree
1209
perform_qualification_conversions (tree type, tree expr)
1210
{
1211 1212 1213 1214
  tree expr_type;

  expr_type = TREE_TYPE (expr);

1215 1216 1217 1218
  if (same_type_p (type, expr_type))
    return expr;
  else if (TYPE_PTR_P (type) && TYPE_PTR_P (expr_type)
	   && comp_ptr_ttypes (TREE_TYPE (type), TREE_TYPE (expr_type)))
1219 1220 1221 1222 1223 1224 1225 1226
    return build_nop (type, expr);
  else if (TYPE_PTR_TO_MEMBER_P (type)
	   && TYPE_PTR_TO_MEMBER_P (expr_type)
	   && same_type_p (TYPE_PTRMEM_CLASS_TYPE (type),
			   TYPE_PTRMEM_CLASS_TYPE (expr_type))
	   && comp_ptr_ttypes (TYPE_PTRMEM_POINTED_TO_TYPE (type),
			       TYPE_PTRMEM_POINTED_TO_TYPE (expr_type)))
    return build_nop (type, expr);
1227 1228
  else
    return error_mark_node;
1229
}