cvt.c 37.4 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 Free Software Foundation, Inc.
Mike Stump committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   Hacked by Michael Tiemann (tiemann@cygnus.com)

This file is part of GNU CC.

GNU CC is free software; you can redistribute it and/or modify
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.

GNU CC is distributed in the hope that it will be useful,
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
along with GNU CC; see the file COPYING.  If not, write to
Richard Kenner committed
20 21
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */
Mike Stump committed
22 23 24 25 26 27 28 29


/* This file contains the functions for converting C expressions
   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"
Mike Stump committed
31 32 33 34
#include "tree.h"
#include "flags.h"
#include "cp-tree.h"
#include "convert.h"
Kaveh R. Ghazi committed
35
#include "toplev.h"
36
#include "decl.h"
Mike Stump committed
37

38
static tree cp_convert_to_pointer PARAMS ((tree, tree, int));
39
static tree convert_to_pointer_force PARAMS ((tree, tree));
40
static tree build_up_reference PARAMS ((tree, tree, int, tree));
41
static void warn_ref_binding PARAMS ((tree, tree, tree));
Jason Merrill committed
42

Mike Stump committed
43 44 45 46 47 48 49 50 51 52 53 54
/* 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),
55
        and c_common_truthvalue_conversion.
Mike Stump committed
56 57 58 59 60 61 62 63 64 65 66 67 68 69
     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
70 71 72
   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
73

Mike Stump committed
74
static tree
75
cp_convert_to_pointer (type, expr, force)
Mike Stump committed
76
     tree type, expr;
77
     int force;
Mike Stump committed
78 79
{
  register tree intype = TREE_TYPE (expr);
Mike Stump committed
80
  register enum tree_code form;
81
  tree rval;
Mike Stump committed
82

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

93
      rval = build_type_conversion (type, expr, 1);
Mike Stump committed
94 95 96
      if (rval)
	{
	  if (rval == error_mark_node)
97
	    error ("conversion of `%E' from `%T' to `%T' is ambiguous",
Mike Stump committed
98 99 100 101 102
		      expr, intype, type);
	  return rval;
	}
    }

103
  /* Handle anachronistic conversions from (::*)() to cv void* or (*)().  */
104 105
  if (TREE_CODE (type) == POINTER_TYPE
      && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
106
	  || VOID_TYPE_P (TREE_TYPE (type))))
107 108 109
    {
      /* Allow an implicit this pointer for pointer to member
	 functions.  */
110
      if (TYPE_PTRMEMFUNC_P (intype))
111
	{
112
	  tree fntype = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (intype));
113
	  tree decl = maybe_dummy_object (TYPE_METHOD_BASETYPE (fntype), 0);
114 115 116 117 118 119 120 121 122 123 124 125
	  expr = build (OFFSET_REF, fntype, decl, expr);
	}

      if (TREE_CODE (expr) == OFFSET_REF
	  && TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE)
	expr = resolve_offset_ref (expr);
      if (TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE)
	expr = build_addr_func (expr);
      if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
	{
	  if (TREE_CODE (TREE_TYPE (TREE_TYPE (expr))) == METHOD_TYPE)
	    if (pedantic || warn_pmf2ptr)
126
	      pedwarn ("converting from `%T' to `%T'", TREE_TYPE (expr),
127 128 129 130 131 132
			  type);
	  return build1 (NOP_EXPR, type, expr);
	}
      intype = TREE_TYPE (expr);
    }

133 134 135
  if (expr == error_mark_node)
    return error_mark_node;

Mike Stump committed
136 137
  form = TREE_CODE (intype);

138
  if (POINTER_TYPE_P (intype))
Mike Stump committed
139 140 141 142
    {
      intype = TYPE_MAIN_VARIANT (intype);

      if (TYPE_MAIN_VARIANT (type) != intype
143
	  && TREE_CODE (type) == POINTER_TYPE
Mike Stump committed
144
	  && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
145 146
	  && IS_AGGR_TYPE (TREE_TYPE (type))
	  && IS_AGGR_TYPE (TREE_TYPE (intype))
147
	  && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
Mike Stump committed
148 149
	{
	  enum tree_code code = PLUS_EXPR;
150 151
	  tree binfo;

152
	  /* Try derived to base conversion.  */
153 154 155
	  binfo = lookup_base (TREE_TYPE (intype), TREE_TYPE (type),
			       ba_check, NULL);
	  if (!binfo)
Mike Stump committed
156
	    {
157
	      /* Try base to derived conversion.  */
158 159
	      binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
				   ba_check, NULL);
Mike Stump committed
160 161
	      code = MINUS_EXPR;
	    }
162 163
	  if (binfo == error_mark_node)
	    return error_mark_node;
Mike Stump committed
164 165
	  if (binfo)
	    {
166
	      expr = build_base_path (code, expr, binfo, 0);
167
	      /* Add any qualifier conversions.  */
168 169
	      if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)),
				TREE_TYPE (type)))
Mike Stump committed
170
		{
171 172 173
		  expr = build1 (NOP_EXPR, type, expr);
		  TREE_CONSTANT (expr) =
		    TREE_CONSTANT (TREE_OPERAND (expr, 0));
Mike Stump committed
174
		}
175
	      return expr;
Mike Stump committed
176 177 178
	    }
	}

179
      if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
Mike Stump committed
180
	{
181 182 183
	  tree b1; 
	  tree b2;
	  tree binfo;
184 185
	  enum tree_code code = PLUS_EXPR;
	  base_kind bk;
186 187 188

	  b1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (type));
	  b2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (intype));
189 190
	  binfo = lookup_base (b1, b2, ba_check, &bk);
	  if (!binfo)
191
	    {
192
	      binfo = lookup_base (b2, b1, ba_check, &bk);
193 194
	      code = MINUS_EXPR;
	    }
Mike Stump committed
195 196
	  if (binfo == error_mark_node)
	    return error_mark_node;
197

198
          if (bk == bk_via_virtual)
199
	    {
200
	      if (force)
201
	        warning ("pointer to member cast from `%T' to `%T' is via virtual base",
202
	                    TREE_TYPE (intype), TREE_TYPE (type));
203 204
              else
                {
205
		  error ("pointer to member cast from `%T' to `%T' is via virtual base",
206
			    TREE_TYPE (intype), TREE_TYPE (type));
207 208
	          return error_mark_node;
	        }
209 210 211
	      /* This is a reinterpret cast, whose result is unspecified.
	         We choose to do nothing.  */
	      return build1 (NOP_EXPR, type, expr);
212 213
	    }
	      
214 215 216
	  if (TREE_CODE (expr) == PTRMEM_CST)
	    expr = cplus_expand_constant (expr);

217 218
	  if (binfo)
	    expr = size_binop (code, convert (sizetype, expr),
219
			       BINFO_OFFSET (binfo));
Mike Stump committed
220
	}
221
      else if (TYPE_PTRMEMFUNC_P (type))
Mike Stump committed
222
	{
223
	  error ("cannot convert `%E' from type `%T' to type `%T'",
Mike Stump committed
224 225 226 227
		    expr, intype, type);
	  return error_mark_node;
	}

228 229 230
      rval = build1 (NOP_EXPR, type, expr);
      TREE_CONSTANT (rval) = TREE_CONSTANT (expr);
      return rval;
Mike Stump committed
231
    }
232
  else if (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype))
233
    return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0);
234 235
  else if (TYPE_PTRMEMFUNC_P (intype))
    {
236
      error ("cannot convert `%E' from type `%T' to type `%T'",
237 238 239
		expr, intype, type);
      return error_mark_node;
    }
Mike Stump committed
240 241 242 243 244

  my_friendly_assert (form != OFFSET_TYPE, 186);

  if (integer_zerop (expr))
    {
245
      if (TYPE_PTRMEMFUNC_P (type))
246
	return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0);
247

Mark Mitchell committed
248
      if (TYPE_PTRMEM_P (type))
249 250
	/* A NULL pointer-to-member is represented by -1, not by
	   zero.  */
251 252 253
	expr = build_int_2 (-1, -1);
      else
	expr = build_int_2 (0, 0);
Mike Stump committed
254
      TREE_TYPE (expr) = type;
255 256
      /* Fix up the representation of -1 if appropriate.  */
      force_fit_type (expr, 0);
Mike Stump committed
257 258
      return expr;
    }
Gabriel Dos Reis committed
259 260 261 262 263 264
  else if ((TYPE_PTRMEM_P (type) || TYPE_PTRMEMFUNC_P (type))
	   && INTEGRAL_CODE_P (form))
    {
      error ("invalid conversion from '%T' to '%T'", intype, type);
      return error_mark_node;
    }
Mike Stump committed
265

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

280
  if (type_unknown_p (expr))
281
    return instantiate_type (type, expr, tf_error | tf_warning);
282

283
  error ("cannot convert `%E' from type `%T' to type `%T'",
Mike Stump committed
284 285 286 287 288 289 290
	    expr, intype, type);
  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
291

Mike Stump committed
292 293 294 295 296 297 298 299 300 301 302 303 304
static tree
convert_to_pointer_force (type, expr)
     tree type, expr;
{
  register tree intype = TREE_TYPE (expr);
  register enum tree_code form = TREE_CODE (intype);
  
  if (form == POINTER_TYPE)
    {
      intype = TYPE_MAIN_VARIANT (intype);

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

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

339
  return cp_convert_to_pointer (type, expr, 1);
Mike Stump committed
340 341 342 343 344 345 346
}

/* 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.
347 348
   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
349

Mike Stump committed
350
static tree
351 352
build_up_reference (type, arg, flags, decl)
     tree type, arg, decl;
Kaveh R. Ghazi committed
353
     int flags;
Mike Stump committed
354
{
Mike Stump committed
355
  tree rval;
Mike Stump committed
356
  tree argtype = TREE_TYPE (arg);
Mike Stump committed
357
  tree target_type = TREE_TYPE (type);
358
  tree stmt_expr = NULL_TREE;
Mike Stump committed
359 360 361

  my_friendly_assert (TREE_CODE (type) == REFERENCE_TYPE, 187);

Mike Stump committed
362
  if ((flags & DIRECT_BIND) && ! real_lvalue_p (arg))
Mike Stump committed
363
    {
364 365
      /* 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
366
      tree targ = arg;
367 368 369 370 371 372 373 374 375 376 377 378 379 380

      arg = build_decl (VAR_DECL, NULL_TREE, argtype);
      DECL_ARTIFICIAL (arg) = 1;
      TREE_USED (arg) = 1;
      TREE_STATIC (arg) = TREE_STATIC (decl);

      if (TREE_STATIC (decl))
	{
	  /* Namespace-scope or local static; give it a mangled name.  */
	  tree name = mangle_ref_init_variable (decl);
	  DECL_NAME (arg) = name;
	  SET_DECL_ASSEMBLER_NAME (arg, name);
	  arg = pushdecl_top_level (arg);
	}
Mike Stump committed
381 382
      else
	{
Jason Merrill committed
383
	  /* Automatic; make sure we handle the cleanup properly.  */
384
	  maybe_push_cleanup_level (argtype);
385
	  arg = pushdecl (arg);
386
	}
387 388

      /* Process the initializer for the declaration.  */
389
      DECL_INITIAL (arg) = targ;
390
      cp_finish_decl (arg, targ, NULL_TREE, 
391
		      LOOKUP_ONLYCONVERTING|DIRECT_BIND);
392
    }
Mike Stump committed
393
  else if (!(flags & DIRECT_BIND) && ! lvalue_p (arg))
394
    return get_target_expr (arg);
395

396
  /* If we had a way to wrap this up, and say, if we ever needed its
397 398
     address, transform all occurrences of the register, into a memory
     reference we could win better.  */
Mike Stump committed
399
  rval = build_unary_op (ADDR_EXPR, arg, 1);
400 401 402
  if (rval == error_mark_node)
    return error_mark_node;

403 404 405 406 407
  if ((flags & LOOKUP_PROTECT)
      && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type)
      && IS_AGGR_TYPE (argtype)
      && IS_AGGR_TYPE (target_type))
    {
408
      /* We go through lookup_base for the access control.  */
409
      tree binfo = lookup_base (argtype, target_type, ba_check, NULL);
410 411 412 413
      if (binfo == error_mark_node)
	return error_mark_node;
      if (binfo == NULL_TREE)
	return error_not_base_type (target_type, argtype);
414
      rval = build_base_path (PLUS_EXPR, rval, binfo, 1);
415
    }
Mike Stump committed
416 417 418
  else
    rval
      = convert_to_pointer_force (build_pointer_type (target_type), rval);
419
  rval = build1 (NOP_EXPR, type, rval);
Mike Stump committed
420
  TREE_CONSTANT (rval) = TREE_CONSTANT (TREE_OPERAND (rval, 0));
421 422 423 424 425 426 427

  /* If we created and initialized a new temporary variable, add the
     representation of that initialization to the RVAL.  */
  if (stmt_expr)
    rval = build (COMPOUND_EXPR, TREE_TYPE (rval), stmt_expr, rval);

  /* And return the result.  */
Mike Stump committed
428 429 430
  return rval;
}

431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457
/* 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.
   
   [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
warn_ref_binding (reftype, intype, decl)
     tree reftype, intype, decl;
{
  tree ttl = TREE_TYPE (reftype);
  
  if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl))
    {
      const char *msg;

      if (CP_TYPE_VOLATILE_P (ttl) && decl)
	  msg = "initialization of volatile reference type `%#T' from rvalue of type `%T'";
      else if (CP_TYPE_VOLATILE_P (ttl))
	  msg = "conversion to volatile reference type `%#T' from rvalue of type `%T'";
      else if (decl)
	  msg = "initialization of non-const reference type `%#T' from rvalue of type `%T'";
      else
	  msg = "conversion to non-const reference type `%#T' from rvalue of type `%T'";

458
      pedwarn (msg, reftype, intype);
459 460 461
    }
}

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

Mike Stump committed
465 466 467
   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
468 469

tree
Mike Stump committed
470
convert_to_reference (reftype, expr, convtype, flags, decl)
Mike Stump committed
471
     tree reftype, expr;
Mike Stump committed
472 473
     int convtype, flags;
     tree decl;
Mike Stump committed
474 475
{
  register tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
476
  register tree intype;
Mike Stump committed
477
  tree rval = NULL_TREE;
Mike Stump committed
478 479 480
  tree rval_as_conversion = NULL_TREE;
  int i;

481 482
  if (TREE_CODE (type) == FUNCTION_TYPE 
      && TREE_TYPE (expr) == unknown_type_node)
483
    {
484
      expr = instantiate_type (type, expr, 
485
			       (flags & LOOKUP_COMPLAIN)
486
	                       ? tf_error | tf_warning : tf_none);
487 488 489
      if (expr == error_mark_node)
	return error_mark_node;

490 491
      intype = TREE_TYPE (expr);
    }
492 493 494 495 496
  else
    {
      expr = convert_from_reference (expr);
      intype = TREE_TYPE (expr);
    }
497

498
  my_friendly_assert (TREE_CODE (intype) != REFERENCE_TYPE, 364);
Mike Stump committed
499 500 501

  intype = TYPE_MAIN_VARIANT (intype);

Mike Stump committed
502 503 504 505 506 507 508
  i = comp_target_types (type, intype, 0);

  if (i <= 0 && (convtype & CONV_IMPLICIT) && IS_AGGR_TYPE (intype)
      && ! (flags & LOOKUP_NO_CONVERSION))
    {
      /* Look for a user-defined conversion to lvalue that we can use.  */

509
      rval_as_conversion
510
	= build_type_conversion (reftype, expr, 1);
Mike Stump committed
511 512 513 514 515 516 517 518 519 520 521 522 523

      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;
	  i = 1;
	}
    }

  if (((convtype & CONV_STATIC) && i == -1)
      || ((convtype & CONV_IMPLICIT) && i == 1))
Mike Stump committed
524 525 526
    {
      if (flags & LOOKUP_COMPLAIN)
	{
Mike Stump committed
527
	  tree ttl = TREE_TYPE (reftype);
528
	  tree ttr = lvalue_type (expr);
Mike Stump committed
529

530 531 532 533
	  if (! real_lvalue_p (expr))
	    warn_ref_binding (reftype, intype, decl);
	  
	  if (! (convtype & CONV_CONST)
534
		   && !at_least_as_qualified_p (ttl, ttr))
535
	    pedwarn ("conversion from `%T' to `%T' discards qualifiers",
536
			ttr, reftype);
Mike Stump committed
537 538
	}

539
      return build_up_reference (reftype, expr, flags, decl);
Mike Stump committed
540
    }
Mike Stump committed
541
  else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr))
Mike Stump committed
542 543 544
    {
      /* 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
545
	 by San Diego WP section 5.2.9 paragraph 12, though perhaps it
Mike Stump committed
546
	 should be done directly (jason).  (int &)ri ---> *(int*)&ri */
Mike Stump committed
547

Richard Kenner committed
548
      /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they
Mike Stump committed
549
         meant.  */
Mike Stump committed
550
      if (TREE_CODE (intype) == POINTER_TYPE
551 552
	  && (comptypes (TREE_TYPE (intype), type, 
			 COMPARE_BASE | COMPARE_RELAXED )))
553
	warning ("casting `%T' to `%T' does not dereference pointer",
Mike Stump committed
554 555
		    intype, reftype);
	  
Mike Stump committed
556 557
      rval = build_unary_op (ADDR_EXPR, expr, 0);
      if (rval != error_mark_node)
558 559
	rval = convert_force (build_pointer_type (TREE_TYPE (reftype)),
			      rval, 0);
Mike Stump committed
560
      if (rval != error_mark_node)
Mike Stump committed
561
	rval = build1 (NOP_EXPR, reftype, rval);
Mike Stump committed
562
    }
563
  else
564 565 566
    {
      rval = convert_for_initialization (NULL_TREE, type, expr, flags,
					 "converting", 0, 0);
567 568
      if (rval == NULL_TREE || rval == error_mark_node)
	return rval;
569
      warn_ref_binding (reftype, intype, decl);
570
      rval = build_up_reference (reftype, rval, flags, decl);
571
    }
Mike Stump committed
572 573 574

  if (rval)
    {
Mike Stump committed
575
      /* If we found a way to convert earlier, then use it.  */
Mike Stump committed
576 577 578
      return rval;
    }

Mike Stump committed
579
  my_friendly_assert (TREE_CODE (intype) != OFFSET_TYPE, 189);
Mike Stump committed
580

Mike Stump committed
581
  if (flags & LOOKUP_COMPLAIN)
582
    error ("cannot convert type `%T' to type `%T'", intype, reftype);
Mike Stump committed
583

Mike Stump committed
584 585 586 587 588 589 590
  if (flags & LOOKUP_SPECULATIVELY)
    return NULL_TREE;

  return error_mark_node;
}

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

Mike Stump committed
593 594 595 596 597 598 599 600
tree
convert_from_reference (val)
     tree val;
{
  tree type = TREE_TYPE (val);

  if (TREE_CODE (type) == OFFSET_TYPE)
    type = TREE_TYPE (type);
Mike Stump committed
601
  if (TREE_CODE (type) == REFERENCE_TYPE)
602
    return build_indirect_ref (val, NULL);
Mike Stump committed
603 604
  return val;
}
605 606 607 608 609 610 611 612 613 614 615 616 617 618

/* Implicitly convert the lvalue EXPR to another lvalue of type TOTYPE,
   preserving cv-qualification.  */

tree
convert_lvalue (totype, expr)
     tree totype, expr;
{
  totype = cp_build_qualified_type (totype, TYPE_QUALS (TREE_TYPE (expr)));
  totype = build_reference_type (totype);
  expr = convert_to_reference (totype, expr, CONV_IMPLICIT, LOOKUP_NORMAL,
			       NULL_TREE);
  return convert_from_reference (expr);
}
Mike Stump committed
619

620 621 622 623 624 625 626 627 628
/* C++ conversions, preference to static cast conversions.  */

tree
cp_convert (type, expr)
     tree type, expr;
{
  return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL);
}

Mike Stump committed
629 630 631 632
/* Conversion...

   FLAGS indicates how we should behave.  */

Mike Stump committed
633
tree
634
ocp_convert (type, expr, convtype, flags)
Mike Stump committed
635
     tree type, expr;
Mike Stump committed
636
     int convtype, flags;
Mike Stump committed
637 638 639 640
{
  register tree e = expr;
  register enum tree_code code = TREE_CODE (type);

641 642
  if (e == error_mark_node
      || TREE_TYPE (e) == error_mark_node)
Mike Stump committed
643
    return error_mark_node;
Mike Stump committed
644

645 646 647
  complete_type (type);
  complete_type (TREE_TYPE (expr));

648
  e = decl_constant_value (e);
649

650 651 652 653 654
  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
655 656
    /* We need a new temporary; don't take this shortcut.  */;
  else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (e)))
657
    {
658
      if (same_type_p (type, TREE_TYPE (e)))
659 660 661
	/* The call to fold will not always remove the NOP_EXPR as
	   might be expected, since if one of the types is a typedef;
	   the comparsion in fold is just equality of pointers, not a
662 663 664 665
	   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;
666 667 668 669
      /* For complex data types, we need to perform componentwise
         conversion.  */
      else if (TREE_CODE (type) == COMPLEX_TYPE)
        return fold (convert_to_complex (type, e));
670
      else
671
	return fold (build1 (NOP_EXPR, type, e));
672 673
    }

Mike Stump committed
674
  if (code == VOID_TYPE && (convtype & CONV_STATIC))
675
    {
676
      e = convert_to_void (e, /*implicit=*/NULL);
677
      return e;
678
    }
Mike Stump committed
679

Mike Stump committed
680 681 682 683 684 685 686
  /* Just convert to the type of the member.  */
  if (code == OFFSET_TYPE)
    {
      type = TREE_TYPE (type);
      code = TREE_CODE (type);
    }

Mike Stump committed
687 688 689
  if (TREE_CODE (e) == OFFSET_REF)
    e = resolve_offset_ref (e);

Mike Stump committed
690
  if (INTEGRAL_CODE_P (code))
Mike Stump committed
691
    {
Mike Stump committed
692
      tree intype = TREE_TYPE (e);
693 694
      /* enum = enum, enum = int, enum = float, (enum)pointer are all
         errors.  */
695
      if (TREE_CODE (type) == ENUMERAL_TYPE
696 697
	  && ((ARITHMETIC_TYPE_P (intype) && ! (convtype & CONV_STATIC))
	      || (TREE_CODE (intype) == POINTER_TYPE)))
Mike Stump committed
698
	{
699
	  pedwarn ("conversion from `%#T' to `%#T'", intype, type);
Mike Stump committed
700 701 702 703

	  if (flag_pedantic_errors)
	    return error_mark_node;
	}
Mike Stump committed
704
      if (IS_AGGR_TYPE (intype))
Mike Stump committed
705 706
	{
	  tree rval;
707
	  rval = build_type_conversion (type, e, 1);
Mike Stump committed
708 709
	  if (rval)
	    return rval;
Mike Stump committed
710
	  if (flags & LOOKUP_COMPLAIN)
711
	    error ("`%#T' used where a `%T' was expected", intype, type);
Mike Stump committed
712 713
	  if (flags & LOOKUP_SPECULATIVELY)
	    return NULL_TREE;
Mike Stump committed
714 715
	  return error_mark_node;
	}
Mike Stump committed
716
      if (code == BOOLEAN_TYPE)
Mike Stump committed
717
	{
718 719
	  tree fn = NULL_TREE;

Mike Stump committed
720 721 722
	  /* Common Ada/Pascal programmer's mistake.  We always warn
             about this since it is so bad.  */
	  if (TREE_CODE (expr) == FUNCTION_DECL)
723 724 725 726
	    fn = expr;
	  else if (TREE_CODE (expr) == ADDR_EXPR 
		   && TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL)
	    fn = TREE_OPERAND (expr, 0);
727
	  if (fn && !DECL_WEAK (fn))
728
	    warning ("the address of `%D', will always be `true'", fn);
729
	  return cp_truthvalue_conversion (e);
Mike Stump committed
730
	}
Mike Stump committed
731 732
      return fold (convert_to_integer (type, e));
    }
Mike Stump committed
733 734
  if (code == POINTER_TYPE || code == REFERENCE_TYPE
      || TYPE_PTRMEMFUNC_P (type))
735
    return fold (cp_convert_to_pointer (type, e, 0));
736 737
  if (code == VECTOR_TYPE)
    return fold (convert_to_vector (type, e));
738
  if (code == REAL_TYPE || code == COMPLEX_TYPE)
Mike Stump committed
739 740 741 742
    {
      if (IS_AGGR_TYPE (TREE_TYPE (e)))
	{
	  tree rval;
743
	  rval = build_type_conversion (type, e, 1);
Mike Stump committed
744 745 746
	  if (rval)
	    return rval;
	  else
Mike Stump committed
747
	    if (flags & LOOKUP_COMPLAIN)
748
	      error ("`%#T' used where a floating point value was expected",
Mike Stump committed
749
			TREE_TYPE (e));
Mike Stump committed
750
	}
751 752 753 754
      if (code == REAL_TYPE)
	return fold (convert_to_real (type, e));
      else if (code == COMPLEX_TYPE)
	return fold (convert_to_complex (type, e));
Mike Stump committed
755 756 757 758 759 760 761 762
    }

  /* 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
763
      tree ctor = NULL_TREE;
Mike Stump committed
764 765 766 767 768 769 770 771 772 773

      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.  */

774
      ctor = e;
775

776 777
      if (abstract_virtuals_error (NULL_TREE, type))
	return error_mark_node;
778

779 780
      if ((flags & LOOKUP_ONLYCONVERTING)
	  && ! (IS_AGGR_TYPE (dtype) && DERIVED_FROM_P (type, dtype)))
781 782 783 784
	/* 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);
785
      else
786 787 788 789
	ctor = build_special_member_call (NULL_TREE, 
					  complete_ctor_identifier,
					  build_tree_list (NULL_TREE, ctor),
					  TYPE_BINFO (type), flags);
790 791
      if (ctor)
	return build_cplus_new (type, ctor);
Mike Stump committed
792 793
    }

Mike Stump committed
794
  if (flags & LOOKUP_COMPLAIN)
795
    error ("conversion from `%T' to non-scalar type `%T' requested",
Mike Stump committed
796 797 798
	      TREE_TYPE (expr), type);
  if (flags & LOOKUP_SPECULATIVELY)
    return NULL_TREE;
Mike Stump committed
799 800 801
  return error_mark_node;
}

802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823
/* 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
   object is, but there is reason to beleive that it is the lvalue to rvalue
   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.
   
   IMPLICIT is tells us the context of an implicit void conversion.  */

tree
convert_to_void (expr, implicit)
     tree expr;
     const char *implicit;
{
824 825 826
  if (expr == error_mark_node 
      || TREE_TYPE (expr) == error_mark_node)
    return error_mark_node;
827 828
  if (!TREE_TYPE (expr))
    return expr;
829
  if (VOID_TYPE_P (TREE_TYPE (expr)))
830 831 832 833 834 835 836 837 838 839 840
    return expr;
  switch (TREE_CODE (expr))
    {
    case COND_EXPR:
      {
        /* 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 (op1, implicit);
        tree new_op2 = convert_to_void (op2, implicit);
        
841
	expr = build (COND_EXPR, TREE_TYPE (new_op1),
Jason Merrill committed
842
		      TREE_OPERAND (expr, 0), new_op1, new_op2);
843 844 845 846 847 848 849 850 851 852
        break;
      }
    
    case COMPOUND_EXPR:
      {
        /* The second part of a compound expr contains the value.  */
        tree op1 = TREE_OPERAND (expr,1);
        tree new_op1 = convert_to_void (op1, implicit);
        
        if (new_op1 != op1)
853 854 855 856
	  {
	    tree t = build (COMPOUND_EXPR, TREE_TYPE (new_op1),
			    TREE_OPERAND (expr, 0), new_op1);
	    TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (expr);
857
	    TREE_NO_UNUSED_WARNING (t) = TREE_NO_UNUSED_WARNING (expr);
858 859 860
	    expr = t;
	  }

861 862 863 864 865
        break;
      }
    
    case NON_LVALUE_EXPR:
    case NOP_EXPR:
866
      /* These have already decayed to rvalue.  */
867 868 869 870 871 872 873 874 875 876 877
      break;
    
    case CALL_EXPR:   /* we have a special meaning for volatile void fn() */
      break;
    
    case INDIRECT_REF:
      {
        tree type = TREE_TYPE (expr);
        int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0)))
                           == REFERENCE_TYPE;
        int is_volatile = TYPE_VOLATILE (type);
878
        int is_complete = COMPLETE_TYPE_P (complete_type (type));
879 880
        
        if (is_volatile && !is_complete)
881
          warning ("object of incomplete type `%T' will not be accessed in %s",
882 883
                      type, implicit ? implicit : "void context");
        else if (is_reference && is_volatile)
884
          warning ("object of type `%T' will not be accessed in %s",
885 886 887 888 889 890 891 892 893 894 895 896
                      TREE_TYPE (TREE_OPERAND (expr, 0)),
                      implicit ? implicit : "void context");
        if (is_reference || !is_volatile || !is_complete)
          expr = TREE_OPERAND (expr, 0);
      
        break;
      }
    
    case VAR_DECL:
      {
        /* External variables might be incomplete.  */
        tree type = TREE_TYPE (expr);
897
        int is_complete = COMPLETE_TYPE_P (complete_type (type));
898 899
        
        if (TYPE_VOLATILE (type) && !is_complete)
900
          warning ("object `%E' of incomplete type `%T' will not be accessed in %s",
901 902 903
                      expr, type, implicit ? implicit : "void context");
        break;
      }
904 905 906 907 908

    case OFFSET_REF:
      expr = resolve_offset_ref (expr);
      break;

909 910 911 912 913 914 915
    default:;
    }
  {
    tree probe = expr;
  
    if (TREE_CODE (probe) == ADDR_EXPR)
      probe = TREE_OPERAND (expr, 0);
916 917 918 919
    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.  */
920
	pedwarn ("%s cannot resolve address of overloaded function",
921 922 923
		    implicit ? implicit : "void cast");
      }
    else if (implicit && probe == expr && is_overloaded_fn (probe))
924
      /* Only warn when there is no &.  */
925
      warning ("%s is a reference, not call, to function `%E'",
926
		  implicit, expr);
927 928
  }
  
929
  if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr)))
930 931 932 933 934 935 936 937 938 939 940 941
    {
      /* FIXME: This is where we should check for expressions with no
         effects.  At the moment we do that in both build_x_component_expr
         and expand_expr_stmt -- inconsistently too.  For the moment
         leave implicit void conversions unadorned so that expand_expr_stmt
         has a chance of detecting some of the cases.  */
      if (!implicit)
        expr = build1 (CONVERT_EXPR, void_type_node, expr);
    }
  return expr;
}

Mike Stump committed
942 943 944 945
/* 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
946 947 948 949 950 951 952 953
   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
954
   on subtrees of already built trees after it has ripped them apart.
955 956 957

   Also, if we ever support range variables, we'll probably also have to
   do a little bit more work.  */
Mike Stump committed
958 959 960 961 962

tree
convert (type, expr)
     tree type, expr;
{
963 964 965 966 967 968 969
  tree intype;

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

  intype = TREE_TYPE (expr);

970
  if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype))
971
    {
972
      expr = decl_constant_value (expr);
973 974 975 976 977
      return fold (build1 (NOP_EXPR, type, expr));
    }

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

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

Mike Stump committed
984
tree
Mike Stump committed
985
convert_force (type, expr, convtype)
Mike Stump committed
986 987
     tree type;
     tree expr;
Mike Stump committed
988
     int convtype;
Mike Stump committed
989 990 991 992 993
{
  register tree e = expr;
  register enum tree_code code = TREE_CODE (type);

  if (code == REFERENCE_TYPE)
Mike Stump committed
994 995
    return fold (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
				       NULL_TREE));
Mike Stump committed
996 997 998 999 1000 1001
  else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE)
    e = convert_from_reference (e);

  if (code == POINTER_TYPE)
    return fold (convert_to_pointer_force (type, e));

Mike Stump committed
1002
  /* From typeck.c convert_for_assignment */
Mike Stump committed
1003 1004 1005
  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
1006 1007
       || integer_zerop (e)
       || TYPE_PTRMEMFUNC_P (TREE_TYPE (e)))
Mike Stump committed
1008 1009
      && TYPE_PTRMEMFUNC_P (type))
    {
Mike Stump committed
1010
      /* compatible pointer to member functions.  */
Mike Stump committed
1011
      return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1);
Mike Stump committed
1012
    }
Mike Stump committed
1013

1014
  return ocp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL);
Mike Stump committed
1015 1016 1017 1018 1019 1020 1021 1022
}

/* 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.

1023
   If (FOR_SURE & 1) is nonzero, then we allow this type conversion
Mike Stump committed
1024
   to take place immediately.  Otherwise, we build a SAVE_EXPR
Mike Stump committed
1025 1026 1027 1028 1029 1030 1031 1032
   which can be evaluated if the results are ever needed.

   Changes to this functions should be mirrored in user_harshness.

   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
1033 1034

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

Mike Stump committed
1045 1046 1047 1048
/* 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.)
   which indicates which types are suitable.  If COMPLAIN is 1, complain
   about ambiguity; otherwise, the caller will deal with it.  */
Mike Stump committed
1049

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

1060 1061 1062
  if (expr == null_node 
      && (desires & WANT_INT) 
      && !(desires & WANT_NULL))
1063
    warning ("converting NULL to non-pointer type");
1064
    
1065
  if (TREE_CODE (expr) == OFFSET_REF)
Mike Stump committed
1066 1067 1068
    expr = resolve_offset_ref (expr);
  expr = convert_from_reference (expr);
  basetype = TREE_TYPE (expr);
Mike Stump committed
1069

1070 1071 1072
  if (basetype == error_mark_node)
    return error_mark_node;

1073 1074 1075 1076
  if (! IS_AGGR_TYPE (basetype))
    switch (TREE_CODE (basetype))
      {
      case INTEGER_TYPE:
1077
	if ((desires & WANT_NULL) && null_ptr_cst_p (expr))
1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
	  return expr;
	/* else fall through...  */

      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;
1089
	
1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138
      case FUNCTION_TYPE:
      case ARRAY_TYPE:
	return (desires & WANT_POINTER) ? default_conversion (expr)
     	                                : NULL_TREE;
      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.  */

  if (! TYPE_HAS_CONVERSION (basetype))
    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;

      candidate = TREE_TYPE (TREE_TYPE (cand));
      if (TREE_CODE (candidate) == REFERENCE_TYPE)
	candidate = TREE_TYPE (candidate);

      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)
		{
1139
		  error ("ambiguous default type conversion from `%T'",
1140
			    basetype);
1141
		  error ("  candidate conversions include `%D' and `%D'",
1142 1143 1144 1145 1146 1147 1148 1149
			    winner, cand);
		}
	      return error_mark_node;
	    }
	  else
	    winner = cand;
	}
    }
Mike Stump committed
1150

1151 1152 1153 1154 1155 1156
  if (winner)
    {
      tree type = TREE_TYPE (TREE_TYPE (winner));
      if (TREE_CODE (type) == REFERENCE_TYPE)
	type = TREE_TYPE (type);
      return build_user_type_conversion (type, expr, LOOKUP_NORMAL);
Mike Stump committed
1157
    }
Mike Stump committed
1158

1159
  return NULL_TREE;
Mike Stump committed
1160
}
Mike Stump committed
1161

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

Mike Stump committed
1164 1165 1166 1167
tree
type_promotes_to (type)
     tree type;
{
1168
  int type_quals;
Mike Stump committed
1169 1170 1171 1172

  if (type == error_mark_node)
    return error_mark_node;

1173
  type_quals = cp_type_quals (type);
Mike Stump committed
1174
  type = TYPE_MAIN_VARIANT (type);
Mike Stump committed
1175 1176 1177

  /* bool always promotes to int (not unsigned), even if it's the same
     size.  */
Jason Merrill committed
1178
  if (type == boolean_type_node)
Mike Stump committed
1179 1180 1181 1182 1183 1184
    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)
1185 1186 1187
    {
      int precision = MAX (TYPE_PRECISION (type),
			   TYPE_PRECISION (integer_type_node));
1188
      tree totype = c_common_type_for_size (precision, 0);
1189 1190
      if (TREE_UNSIGNED (type)
	  && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype))
1191
	type = c_common_type_for_size (precision, 1);
1192 1193 1194
      else
	type = totype;
    }
1195
  else if (c_promoting_integer_type_p (type))
Mike Stump committed
1196
    {
1197
      /* Retain unsignedness if really not getting bigger.  */
Mike Stump committed
1198
      if (TREE_UNSIGNED (type)
1199
	  && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
Mike Stump committed
1200 1201 1202 1203 1204 1205 1206
	type = unsigned_type_node;
      else
	type = integer_type_node;
    }
  else if (type == float_type_node)
    type = double_type_node;

1207
  return cp_build_qualified_type (type, type_quals);
Mike Stump committed
1208
}
1209 1210 1211 1212 1213 1214

/* 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.  */

1215 1216 1217 1218
/* 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.  */

1219 1220 1221 1222 1223
tree 
perform_qualification_conversions (type, expr)
     tree type;
     tree expr;
{
1224 1225 1226
  if (TREE_CODE (type) == POINTER_TYPE
      && TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE
      && comp_ptr_ttypes (TREE_TYPE (type), TREE_TYPE (TREE_TYPE (expr))))
1227 1228 1229
    return build1 (NOP_EXPR, type, expr);
  else
    return error_mark_node;
1230
}