cvt.c 50 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, 2006, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
Mike Stump committed
5 6
   Hacked by Michael Tiemann (tiemann@cygnus.com)

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

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

14
GCC is distributed in the hope that it will be useful,
Mike Stump committed
15 16 17 18 19
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
20 21
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
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
#include "tree.h"
#include "flags.h"
#include "cp-tree.h"
36
#include "intl.h"
Mike Stump committed
37
#include "convert.h"
Kaveh R. Ghazi committed
38
#include "toplev.h"
39
#include "decl.h"
40
#include "target.h"
Mike Stump committed
41

42
static tree cp_convert_to_pointer (tree, tree);
43
static tree convert_to_pointer_force (tree, tree);
44
static tree build_type_conversion (tree, tree);
45 46
static tree build_up_reference (tree, tree, int, tree);
static void warn_ref_binding (tree, tree, tree);
Jason Merrill committed
47

Mike Stump committed
48 49 50 51 52 53 54 55 56 57 58 59
/* 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
60
	and c_common_truthvalue_conversion.
Mike Stump committed
61 62 63 64 65 66 67 68 69 70 71 72 73 74
     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
75
   else try C-style pointer conversion.  */
Mike Stump committed
76

Mike Stump committed
77
static tree
78
cp_convert_to_pointer (tree type, tree expr)
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

86
  if (MAYBE_CLASS_TYPE_P (intype))
Mike Stump committed
87 88
    {
      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
	  && MAYBE_CLASS_TYPE_P (TREE_TYPE (type))
	  && MAYBE_CLASS_TYPE_P (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
      return build_nop (type, expr);
    }
176 177 178
  else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
	   || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
    return convert_ptrmem (type, expr, /*allow_inverse_p=*/false,
179
			   /*c_cast_p=*/false, tf_warning_or_error);
180 181
  else if (TYPE_PTRMEMFUNC_P (intype))
    {
182 183 184 185
      if (!warn_pmf2ptr)
	{
	  if (TREE_CODE (expr) == PTRMEM_CST)
	    return cp_convert_to_pointer (type,
186
					  PTRMEM_CST_MEMBER (expr));
187 188 189 190 191 192 193
	  else if (TREE_CODE (expr) == OFFSET_REF)
	    {
	      tree object = TREE_OPERAND (expr, 0);
	      return get_member_function_from_ptrfunc (&object,
						       TREE_OPERAND (expr, 1));
	    }
	}
194
      error ("cannot convert %qE from type %qT to type %qT",
Mike Stump committed
195
	     expr, intype, type);
196 197
      return error_mark_node;
    }
Mike Stump committed
198

199
  if (null_ptr_cst_p (expr))
Mike Stump committed
200
    {
201
      if (TYPE_PTRMEMFUNC_P (type))
202
	return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 0,
203
				 /*c_cast_p=*/false, tf_warning_or_error);
204

Mark Mitchell committed
205
      if (TYPE_PTRMEM_P (type))
206 207 208
	{
	  /* A NULL pointer-to-member is represented by -1, not by
	     zero.  */
209
	  expr = build_int_cst_type (type, -1);
210
	}
211
      else
212
	expr = build_int_cst (type, 0);
213

Mike Stump committed
214 215
      return expr;
    }
216
  else if (TYPE_PTR_TO_MEMBER_P (type) && INTEGRAL_CODE_P (form))
Gabriel Dos Reis committed
217
    {
218
      error ("invalid conversion from %qT to %qT", intype, type);
Gabriel Dos Reis committed
219 220
      return error_mark_node;
    }
Mike Stump committed
221

Mike Stump committed
222
  if (INTEGRAL_CODE_P (form))
Mike Stump committed
223
    {
224
      if (TYPE_PRECISION (intype) == POINTER_SIZE)
Mike Stump committed
225
	return build1 (CONVERT_EXPR, type, expr);
226
      expr = cp_convert (c_common_type_for_size (POINTER_SIZE, 0), expr);
227 228 229 230 231
      /* 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)));
232

Mike Stump committed
233 234 235
      return convert_to_pointer (type, expr);
    }

236
  if (type_unknown_p (expr))
237
    return instantiate_type (type, expr, tf_warning_or_error);
238

239
  error ("cannot convert %qE from type %qT to type %qT",
Mike Stump committed
240
	 expr, intype, type);
Mike Stump committed
241 242 243 244 245 246
  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
247

Mike Stump committed
248
static tree
249
convert_to_pointer_force (tree type, tree expr)
Mike Stump committed
250
{
251 252
  tree intype = TREE_TYPE (expr);
  enum tree_code form = TREE_CODE (intype);
253

Mike Stump committed
254 255 256 257 258 259
  if (form == POINTER_TYPE)
    {
      intype = TYPE_MAIN_VARIANT (intype);

      if (TYPE_MAIN_VARIANT (type) != intype
	  && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
260 261
	  && MAYBE_CLASS_TYPE_P (TREE_TYPE (type))
	  && MAYBE_CLASS_TYPE_P (TREE_TYPE (intype))
Mike Stump committed
262 263 264
	  && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
	{
	  enum tree_code code = PLUS_EXPR;
265 266 267
	  tree binfo;

	  binfo = lookup_base (TREE_TYPE (intype), TREE_TYPE (type),
268
			       ba_unique, NULL);
269
	  if (!binfo)
Mike Stump committed
270
	    {
271
	      binfo = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
272
				   ba_unique, NULL);
273
	      code = MINUS_EXPR;
Mike Stump committed
274
	    }
275 276 277
	  if (binfo == error_mark_node)
	    return error_mark_node;
	  if (binfo)
Mike Stump committed
278
	    {
279
	      expr = build_base_path (code, expr, binfo, 0);
Mike Stump committed
280 281
	      if (expr == error_mark_node)
		 return error_mark_node;
282
	      /* Add any qualifier conversions.  */
283 284
	      if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)),
				TREE_TYPE (type)))
285
		expr = build_nop (type, expr);
286
	      return expr;
Mike Stump committed
287 288 289 290
	    }
	}
    }

291
  return cp_convert_to_pointer (type, expr);
Mike Stump committed
292 293 294 295 296 297 298
}

/* 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.
299 300
   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
301

Mike Stump committed
302
static tree
303
build_up_reference (tree type, tree arg, int flags, tree decl)
Mike Stump committed
304
{
Mike Stump committed
305
  tree rval;
Mike Stump committed
306
  tree argtype = TREE_TYPE (arg);
Mike Stump committed
307 308
  tree target_type = TREE_TYPE (type);

309
  gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
Mike Stump committed
310

Mike Stump committed
311
  if ((flags & DIRECT_BIND) && ! real_lvalue_p (arg))
Mike Stump committed
312
    {
313 314
      /* 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
315
      tree targ = arg;
316

317
      arg = make_temporary_var_for_ref_to_temp (decl, TREE_TYPE (arg));
318 319

      /* Process the initializer for the declaration.  */
320
      DECL_INITIAL (arg) = targ;
321
      cp_finish_decl (arg, targ, /*init_const_expr_p=*/false, NULL_TREE,
322
		      LOOKUP_ONLYCONVERTING|DIRECT_BIND);
323
    }
Mike Stump committed
324
  else if (!(flags & DIRECT_BIND) && ! lvalue_p (arg))
325
    return get_target_expr (arg);
326

327
  /* If we had a way to wrap this up, and say, if we ever needed its
328 329
     address, transform all occurrences of the register, into a memory
     reference we could win better.  */
330
  rval = cp_build_addr_expr (arg, tf_warning_or_error);
331 332 333
  if (rval == error_mark_node)
    return error_mark_node;

334 335
  if ((flags & LOOKUP_PROTECT)
      && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type)
336 337
      && MAYBE_CLASS_TYPE_P (argtype)
      && MAYBE_CLASS_TYPE_P (target_type))
338
    {
339
      /* We go through lookup_base for the access control.  */
340
      tree binfo = lookup_base (argtype, target_type, ba_check, NULL);
341 342 343 344
      if (binfo == error_mark_node)
	return error_mark_node;
      if (binfo == NULL_TREE)
	return error_not_base_type (target_type, argtype);
345
      rval = build_base_path (PLUS_EXPR, rval, binfo, 1);
346
    }
Mike Stump committed
347 348 349
  else
    rval
      = convert_to_pointer_force (build_pointer_type (target_type), rval);
350
  return build_nop (type, rval);
Mike Stump committed
351 352
}

353 354 355
/* 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.
356

357 358 359 360 361
   [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
362
warn_ref_binding (tree reftype, tree intype, tree decl)
363 364
{
  tree ttl = TREE_TYPE (reftype);
365

366 367 368 369 370
  if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl))
    {
      const char *msg;

      if (CP_TYPE_VOLATILE_P (ttl) && decl)
371 372
	msg = G_("initialization of volatile reference type %q#T from "
	         "rvalue of type %qT");
373
      else if (CP_TYPE_VOLATILE_P (ttl))
374 375
	msg = G_("conversion to volatile reference type %q#T "
	         "from rvalue of type %qT");
376
      else if (decl)
377 378
	msg = G_("initialization of non-const reference type %q#T from "
	         "rvalue of type %qT");
379
      else
380 381
	msg = G_("conversion to non-const reference type %q#T from "
	         "rvalue of type %qT");
382

383
      permerror (input_location, msg, reftype, intype);
384 385 386
    }
}

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

Mike Stump committed
390 391 392
   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
393 394

tree
395
convert_to_reference (tree reftype, tree expr, int convtype,
Mike Stump committed
396
		      int flags, tree decl)
Mike Stump committed
397
{
398 399
  tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
  tree intype;
Mike Stump committed
400
  tree rval = NULL_TREE;
Mike Stump committed
401
  tree rval_as_conversion = NULL_TREE;
402
  bool can_convert_intype_to_type;
Mike Stump committed
403

404
  if (TREE_CODE (type) == FUNCTION_TYPE
405
      && TREE_TYPE (expr) == unknown_type_node)
406
    expr = instantiate_type (type, expr,
407
			     (flags & LOOKUP_COMPLAIN)
408
			     ? tf_warning_or_error : tf_none);
409 410 411 412 413

  if (expr == error_mark_node)
    return error_mark_node;

  intype = TREE_TYPE (expr);
414

415
  gcc_assert (TREE_CODE (intype) != REFERENCE_TYPE);
416
  gcc_assert (TREE_CODE (reftype) == REFERENCE_TYPE);
Mike Stump committed
417 418 419

  intype = TYPE_MAIN_VARIANT (intype);

420 421
  can_convert_intype_to_type = can_convert (type, intype);
  if (!can_convert_intype_to_type
422
      && (convtype & CONV_IMPLICIT) && MAYBE_CLASS_TYPE_P (intype)
Mike Stump committed
423 424 425 426
      && ! (flags & LOOKUP_NO_CONVERSION))
    {
      /* Look for a user-defined conversion to lvalue that we can use.  */

427
      rval_as_conversion
428
	= build_type_conversion (reftype, expr);
Mike Stump committed
429 430 431 432 433 434 435

      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;
436
	  can_convert_intype_to_type = 1;
Mike Stump committed
437 438 439
	}
    }

440 441
  if (((convtype & CONV_STATIC) && can_convert (intype, type))
      || ((convtype & CONV_IMPLICIT) && can_convert_intype_to_type))
Mike Stump committed
442 443 444
    {
      if (flags & LOOKUP_COMPLAIN)
	{
Mike Stump committed
445
	  tree ttl = TREE_TYPE (reftype);
446
	  tree ttr = lvalue_type (expr);
Mike Stump committed
447

448 449
	  if (! real_lvalue_p (expr))
	    warn_ref_binding (reftype, intype, decl);
450

451
	  if (! (convtype & CONV_CONST)
452
		   && !at_least_as_qualified_p (ttl, ttr))
453
	    permerror (input_location, "conversion from %qT to %qT discards qualifiers",
454
		       ttr, reftype);
Mike Stump committed
455 456
	}

457
      return build_up_reference (reftype, expr, flags, decl);
Mike Stump committed
458
    }
Mike Stump committed
459
  else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr))
Mike Stump committed
460 461 462
    {
      /* 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
463
	 by San Diego WP section 5.2.9 paragraph 12, though perhaps it
Mike Stump committed
464
	 should be done directly (jason).  (int &)ri ---> *(int*)&ri */
Mike Stump committed
465

Richard Kenner committed
466
      /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they
Mike Stump committed
467
	 meant.  */
Mike Stump committed
468
      if (TREE_CODE (intype) == POINTER_TYPE
469 470
	  && (comptypes (TREE_TYPE (intype), type,
			 COMPARE_BASE | COMPARE_DERIVED)))
471
	warning (0, "casting %qT to %qT does not dereference pointer",
472
		 intype, reftype);
473

474
      rval = cp_build_addr_expr (expr, tf_warning_or_error);
Mike Stump committed
475
      if (rval != error_mark_node)
476 477
	rval = convert_force (build_pointer_type (TREE_TYPE (reftype)),
			      rval, 0);
Mike Stump committed
478
      if (rval != error_mark_node)
Mike Stump committed
479
	rval = build1 (NOP_EXPR, reftype, rval);
Mike Stump committed
480
    }
481
  else
482 483
    {
      rval = convert_for_initialization (NULL_TREE, type, expr, flags,
484
					 ICR_CONVERTING, 0, 0,
485
                                         tf_warning_or_error);
486 487
      if (rval == NULL_TREE || rval == error_mark_node)
	return rval;
488
      warn_ref_binding (reftype, intype, decl);
489
      rval = build_up_reference (reftype, rval, flags, decl);
490
    }
Mike Stump committed
491 492 493

  if (rval)
    {
Mike Stump committed
494
      /* If we found a way to convert earlier, then use it.  */
Mike Stump committed
495 496 497
      return rval;
    }

Mike Stump committed
498
  if (flags & LOOKUP_COMPLAIN)
499
    error ("cannot convert type %qT to type %qT", intype, reftype);
Mike Stump committed
500

Mike Stump committed
501 502 503 504
  return error_mark_node;
}

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

Mike Stump committed
507
tree
508
convert_from_reference (tree val)
Mike Stump committed
509
{
510 511
  if (TREE_TYPE (val)
      && TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE)
512
    {
Dodji Seketeli committed
513
      tree t = TREE_TYPE (TREE_TYPE (val));
514
      tree ref = build1 (INDIRECT_REF, t, val);
515

516 517 518 519 520 521 522 523 524 525
       /* 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;
    }
526

Mike Stump committed
527 528
  return val;
}
529 530 531 532 533 534 535

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

tree
force_rvalue (tree expr)
{
536
  if (MAYBE_CLASS_TYPE_P (TREE_TYPE (expr)) && TREE_CODE (expr) != TARGET_EXPR)
537 538 539 540 541 542 543
    expr = ocp_convert (TREE_TYPE (expr), expr,
			CONV_IMPLICIT|CONV_FORCE_TEMP, LOOKUP_NORMAL);
  else
    expr = decay_conversion (expr);

  return expr;
}
544

Mike Stump committed
545

546 547 548 549 550 551 552 553
/* Fold away simple conversions, but make sure the result is an rvalue.  */

tree
cp_fold_convert (tree type, tree expr)
{
  return rvalue (fold_convert (type, expr));
}

554 555 556
/* C++ conversions, preference to static cast conversions.  */

tree
557
cp_convert (tree type, tree expr)
558 559 560 561
{
  return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL);
}

562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578
/* C++ equivalent of convert_and_check but using cp_convert as the
   conversion function.

   Convert EXPR to TYPE, warning about conversion problems with constants.
   Invoke this function on every expression that is converted implicitly,
   i.e. because of language rules and not because of an explicit cast.  */

tree
cp_convert_and_check (tree type, tree expr)
{
  tree result;

  if (TREE_TYPE (expr) == type)
    return expr;
  
  result = cp_convert (type, expr);

579 580 581
  if (c_inhibit_evaluation_warnings == 0
      && !TREE_OVERFLOW_P (expr)
      && result != error_mark_node)
582 583 584 585 586
    warnings_for_convert_and_check (type, expr, result);

  return result;
}

Mike Stump committed
587 588 589 590
/* Conversion...

   FLAGS indicates how we should behave.  */

Mike Stump committed
591
tree
592
ocp_convert (tree type, tree expr, int convtype, int flags)
Mike Stump committed
593
{
594 595
  tree e = expr;
  enum tree_code code = TREE_CODE (type);
596
  const char *invalid_conv_diag;
597
  tree e1;
Mike Stump committed
598

599
  if (error_operand_p (e) || type == error_mark_node)
Mike Stump committed
600
    return error_mark_node;
Mike Stump committed
601

602 603 604
  complete_type (type);
  complete_type (TREE_TYPE (expr));

605 606 607 608 609 610 611
  if ((invalid_conv_diag
       = targetm.invalid_conversion (TREE_TYPE (expr), type)))
    {
      error (invalid_conv_diag);
      return error_mark_node;
    }

612
  e = integral_constant_value (e);
613 614
  if (error_operand_p (e))
    return error_mark_node;
615

616
  if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP))
Mike Stump committed
617
    /* We need a new temporary; don't take this shortcut.  */;
618
  else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e)))
619
    {
620
      if (same_type_p (type, TREE_TYPE (e)))
621 622
	/* 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
623
	   the comparison in fold is just equality of pointers, not a
624
	   call to comptypes.  We don't call fold in this case because
625 626 627
	   that can result in infinite recursion; fold will call
	   convert, which will call ocp_convert, etc.  */
	return e;
628
      /* For complex data types, we need to perform componentwise
Mike Stump committed
629
	 conversion.  */
630
      else if (TREE_CODE (type) == COMPLEX_TYPE)
Mike Stump committed
631
	return fold_if_not_in_template (convert_to_complex (type, e));
632 633 634
      else if (TREE_CODE (e) == TARGET_EXPR)
	{
	  /* Don't build a NOP_EXPR of class type.  Instead, change the
635
	     type of the temporary.  */
636 637 638
	  TREE_TYPE (e) = TREE_TYPE (TARGET_EXPR_SLOT (e)) = type;
	  return e;
	}
639
      else
640 641 642 643
	{
	  /* We shouldn't be treating objects of ADDRESSABLE type as
	     rvalues.  */
	  gcc_assert (!TREE_ADDRESSABLE (type));
644
	  return fold_if_not_in_template (build_nop (type, e));
645
	}
646 647
    }

648 649 650 651
  e1 = targetm.convert_to_type (type, e);
  if (e1)
    return e1;

Mike Stump committed
652
  if (code == VOID_TYPE && (convtype & CONV_STATIC))
653
    {
654
      e = convert_to_void (e, ICV_CAST, tf_warning_or_error);
655
      return e;
656
    }
Mike Stump committed
657

Mike Stump committed
658
  if (INTEGRAL_CODE_P (code))
Mike Stump committed
659
    {
Mike Stump committed
660
      tree intype = TREE_TYPE (e);
661 662 663 664 665 666

      if (TREE_CODE (type) == ENUMERAL_TYPE)
	{
	  /* enum = enum, enum = int, enum = float, (enum)pointer are all
	     errors.  */
	  if (((INTEGRAL_OR_ENUMERATION_TYPE_P (intype)
Mike Stump committed
667
		|| TREE_CODE (intype) == REAL_TYPE)
Giovanni Bajo committed
668
	       && ! (convtype & CONV_STATIC))
669 670 671
	      || TREE_CODE (intype) == POINTER_TYPE)
	    {
	      if (flags & LOOKUP_COMPLAIN)
672
		permerror (input_location, "conversion from %q#T to %q#T", intype, type);
Mike Stump committed
673

674 675 676 677 678 679 680 681 682 683 684
	      if (!flag_permissive)
		return error_mark_node;
	    }

	  /* [expr.static.cast]

	     8. A value of integral or enumeration type can be explicitly
	     converted to an enumeration type. The value is unchanged if
	     the original value is within the range of the enumeration
	     values. Otherwise, the resulting enumeration value is
	     unspecified.  */
685 686
	  if (TREE_CODE (expr) == INTEGER_CST
	      && !int_fits_type_p (expr, ENUM_UNDERLYING_TYPE (type)))
687 688 689 690
	    warning (OPT_Wconversion, 
		     "the result of the conversion is unspecified because "
		     "%qE is outside the range of type %qT",
		     expr, type);
Mike Stump committed
691
	}
692
      if (MAYBE_CLASS_TYPE_P (intype))
Mike Stump committed
693 694
	{
	  tree rval;
695
	  rval = build_type_conversion (type, e);
Mike Stump committed
696 697
	  if (rval)
	    return rval;
Mike Stump committed
698
	  if (flags & LOOKUP_COMPLAIN)
699
	    error ("%q#T used where a %qT was expected", intype, type);
Mike Stump committed
700 701
	  return error_mark_node;
	}
Mike Stump committed
702
      if (code == BOOLEAN_TYPE)
703 704
	return cp_truthvalue_conversion (e);

705
      return fold_if_not_in_template (convert_to_integer (type, e));
Mike Stump committed
706
    }
707
  if (NULLPTR_TYPE_P (type) && e && null_ptr_cst_p (e))
708
    return nullptr_node;
709
  if (POINTER_TYPE_P (type) || TYPE_PTR_TO_MEMBER_P (type))
710
    return fold_if_not_in_template (cp_convert_to_pointer (type, e));
711
  if (code == VECTOR_TYPE)
712 713
    {
      tree in_vtype = TREE_TYPE (e);
714
      if (MAYBE_CLASS_TYPE_P (in_vtype))
715 716 717
	{
	  tree ret_val;
	  ret_val = build_type_conversion (type, e);
Mike Stump committed
718 719 720 721 722
	  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;
723
	}
724
      return fold_if_not_in_template (convert_to_vector (type, e));
725
    }
726
  if (code == REAL_TYPE || code == COMPLEX_TYPE)
Mike Stump committed
727
    {
728
      if (MAYBE_CLASS_TYPE_P (TREE_TYPE (e)))
Mike Stump committed
729 730
	{
	  tree rval;
731
	  rval = build_type_conversion (type, e);
Mike Stump committed
732 733 734
	  if (rval)
	    return rval;
	  else
Mike Stump committed
735
	    if (flags & LOOKUP_COMPLAIN)
736
	      error ("%q#T used where a floating point value was expected",
Mike Stump committed
737
			TREE_TYPE (e));
Mike Stump committed
738
	}
739
      if (code == REAL_TYPE)
740
	return fold_if_not_in_template (convert_to_real (type, e));
741
      else if (code == COMPLEX_TYPE)
742
	return fold_if_not_in_template (convert_to_complex (type, e));
Mike Stump committed
743 744 745 746 747
    }

  /* 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.  */
748
  if (RECORD_OR_UNION_CODE_P (code))
Mike Stump committed
749 750
    {
      tree dtype = TREE_TYPE (e);
Mike Stump committed
751
      tree ctor = NULL_TREE;
Mike Stump committed
752 753 754 755 756 757 758 759 760 761

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

762
      ctor = e;
763

764 765
      if (abstract_virtuals_error (NULL_TREE, type))
	return error_mark_node;
766

767 768 769 770
      if (BRACE_ENCLOSED_INITIALIZER_P (ctor))
	ctor = perform_implicit_conversion (type, ctor, tf_warning_or_error);
      else if ((flags & LOOKUP_ONLYCONVERTING)
	       && ! (CLASS_TYPE_P (dtype) && DERIVED_FROM_P (type, dtype)))
771 772 773 774
	/* 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);
775
      else
776 777 778 779 780 781 782 783 784
	{
	  VEC(tree,gc) *ctor_vec = make_tree_vector_single (ctor);
	  ctor = build_special_member_call (NULL_TREE,
					    complete_ctor_identifier,
					    &ctor_vec,
					    type, flags,
					    tf_warning_or_error);
	  release_tree_vector (ctor_vec);
	}
785 786
      if (ctor)
	return build_cplus_new (type, ctor);
Mike Stump committed
787 788
    }

Mike Stump committed
789
  if (flags & LOOKUP_COMPLAIN)
790 791 792 793 794 795 796 797 798
    {
      /* If the conversion failed and expr was an invalid use of pointer to
	 member function, try to report a meaningful error.  */
      if (invalid_nonstatic_memfn_p (expr, tf_warning_or_error))
	/* We displayed the error message.  */;
      else
	error ("conversion from %qT to non-scalar type %qT requested",
	       TREE_TYPE (expr), type);
    }
Mike Stump committed
799 800 801
  return error_mark_node;
}

802 803 804 805
/* 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
806
   object is, but there is reason to believe that it is the lvalue to rvalue
807 808 809 810 811 812 813 814 815
   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.
816

817 818 819
   The IMPLICIT is ICV_CAST when the user is explicitly converting an expression
   to void via a cast. If an expression is being implicitly converted, IMPLICIT
   indicates the context of the implicit conversion.  */
820 821

tree
822
convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain)
823
{
824
  if (expr == error_mark_node
825 826
      || TREE_TYPE (expr) == error_mark_node)
    return error_mark_node;
827

828
  if (implicit == ICV_CAST)
829 830 831 832 833 834 835
    mark_exp_read (expr);
  else
    {
      tree exprv = expr;

      while (TREE_CODE (exprv) == COMPOUND_EXPR)
	exprv = TREE_OPERAND (exprv, 1);
836 837 838
      if (DECL_P (exprv)
	  || handled_component_p (exprv)
	  || TREE_CODE (exprv) == INDIRECT_REF)
839 840 841 842 843 844 845
	/* Expr is not being 'used' here, otherwise we whould have
	   called mark_{rl}value_use use here, which would have in turn
	   called mark_exp_read.  Rather, we call mark_exp_read directly
	   to avoid some warnings when
	   -Wunused-but-set-{variable,parameter} is in effect.  */
	mark_exp_read (exprv);
    }
846

847 848
  if (!TREE_TYPE (expr))
    return expr;
849
  if (invalid_nonstatic_memfn_p (expr, complain))
850
    return error_mark_node;
851 852
  if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
    {
853 854
      if (complain & tf_error)
        error ("pseudo-destructor is not called");
855 856
      return error_mark_node;
    }
857
  if (VOID_TYPE_P (TREE_TYPE (expr)))
858 859 860 861 862
    return expr;
  switch (TREE_CODE (expr))
    {
    case COND_EXPR:
      {
Mike Stump committed
863 864 865
	/* The two parts of a cond expr might be separate lvalues.  */
	tree op1 = TREE_OPERAND (expr,1);
	tree op2 = TREE_OPERAND (expr,2);
866
	bool side_effects = TREE_SIDE_EFFECTS (op1) || TREE_SIDE_EFFECTS (op2);
867 868 869 870 871 872 873 874 875 876 877
	tree new_op1, new_op2;
	if (implicit != ICV_CAST && !side_effects)
	  {
	    new_op1 = convert_to_void (op1, ICV_SECOND_OF_COND, complain);
	    new_op2 = convert_to_void (op2, ICV_THIRD_OF_COND, complain);
	  }
	else
	  {
	    new_op1 = convert_to_void (op1, ICV_CAST, complain);
	    new_op2 = convert_to_void (op2, ICV_CAST, complain);
	  }
878

879 880
	expr = build3 (COND_EXPR, TREE_TYPE (new_op1),
		       TREE_OPERAND (expr, 0), new_op1, new_op2);
Mike Stump committed
881
	break;
882
      }
883

884 885
    case COMPOUND_EXPR:
      {
Mike Stump committed
886 887
	/* The second part of a compound expr contains the value.  */
	tree op1 = TREE_OPERAND (expr,1);
888 889 890 891 892
	tree new_op1;
	if (implicit != ICV_CAST && !TREE_NO_WARNING (expr))
	  new_op1 = convert_to_void (op1, ICV_RIGHT_OF_COMMA, complain);
	else
	  new_op1 = convert_to_void (op1, ICV_CAST, complain);
893

Mike Stump committed
894
	if (new_op1 != op1)
895
	  {
896 897
	    tree t = build2 (COMPOUND_EXPR, TREE_TYPE (new_op1),
			     TREE_OPERAND (expr, 0), new_op1);
898 899 900
	    expr = t;
	  }

Mike Stump committed
901
	break;
902
      }
903

904 905
    case NON_LVALUE_EXPR:
    case NOP_EXPR:
906
      /* These have already decayed to rvalue.  */
907
      break;
908

909
    case CALL_EXPR:   /* We have a special meaning for volatile void fn().  */
910
      break;
911

912 913
    case INDIRECT_REF:
      {
Mike Stump committed
914 915 916 917 918 919
	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));

920
	/* Can't load the value if we don't know the type.  */
Mike Stump committed
921
	if (is_volatile && !is_complete)
922 923
          {
            if (complain & tf_warning)
924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961
	      switch (implicit)
		{
	      	  case ICV_CAST:
		    warning (0, "conversion to void will not access "
				"object of incomplete type %qT", type);
		    break;
		  case ICV_SECOND_OF_COND:
		    warning (0, "indirection will not access object of "
				"incomplete type %qT in second operand "
				"of conditional expression", type);
		    break;
		  case ICV_THIRD_OF_COND:
		    warning (0, "indirection will not access object of "
				"incomplete type %qT in third operand "
				"of conditional expression", type);
		    break;
		  case ICV_RIGHT_OF_COMMA:
		    warning (0, "indirection will not access object of "
				"incomplete type %qT in right operand of "
				"comma operator", type);
		    break;
		  case ICV_LEFT_OF_COMMA:
		    warning (0, "indirection will not access object of "
				"incomplete type %qT in left operand of "
				"comma operator", type);
		    break;
		  case ICV_STATEMENT:
		    warning (0, "indirection will not access object of "
				"incomplete type %qT in statement", type);
		     break;
		  case ICV_THIRD_IN_FOR:
		    warning (0, "indirection will not access object of "
				"incomplete type %qT in for increment "
				"expression", type);
		    break;
		  default:
		    gcc_unreachable ();
		}
962
          }
963 964
	/* Don't load the value if this is an implicit dereference, or if
	   the type needs to be handled by ctors/dtors.  */
965
	else if (is_volatile && is_reference)
966 967
          {
            if (complain & tf_warning)
968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
	      switch (implicit)
		{
	      	  case ICV_CAST:
		    warning (0, "conversion to void will not access "
				"object of type %qT", type);
		    break;
		  case ICV_SECOND_OF_COND:
		    warning (0, "implicit dereference will not access object "
				"of type %qT in second operand of "
				"conditional expression", type);
		    break;
		  case ICV_THIRD_OF_COND:
		    warning (0, "implicit dereference will not access object "
		  	      	"of type %qT in third operand of "
				"conditional expression", type);
		    break;
		  case ICV_RIGHT_OF_COMMA:
		    warning (0, "implicit dereference will not access object "
		    		"of type %qT in right operand of "
				"comma operator", type);
		    break;
		  case ICV_LEFT_OF_COMMA:
		    warning (0, "implicit dereference will not access object "
		    		"of type %qT in left operand of comma operator",
			     type);
		    break;
		  case ICV_STATEMENT:
		    warning (0, "implicit dereference will not access object "
		     		"of type %qT in statement",  type);
		     break;
		  case ICV_THIRD_IN_FOR:
		    warning (0, "implicit dereference will not access object "
		    		"of type %qT in for increment expression",
			     type);
		    break;
		  default:
		    gcc_unreachable ();
		}
1006
          }
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050
	else if (is_volatile && TREE_ADDRESSABLE (type))
	  {
	    if (complain & tf_warning)
	      switch (implicit)
		{
	      	  case ICV_CAST:
		    warning (0, "conversion to void will not access "
				"object of non-trivially-copyable type %qT",
			     type);
		    break;
		  case ICV_SECOND_OF_COND:
		    warning (0, "indirection will not access object of "
				"non-trivially-copyable type %qT in second "
				"operand of conditional expression", type);
		    break;
		  case ICV_THIRD_OF_COND:
		    warning (0, "indirection will not access object of "
		  	      	"non-trivially-copyable type %qT in third "
				"operand of conditional expression", type);
		    break;
		  case ICV_RIGHT_OF_COMMA:
		    warning (0, "indirection will not access object of "
		    		"non-trivially-copyable type %qT in right "
				"operand of comma operator", type);
		    break;
		  case ICV_LEFT_OF_COMMA:
		    warning (0, "indirection will not access object of "
		    		"non-trivially-copyable type %qT in left "
				"operand of comma operator", type);
		    break;
		  case ICV_STATEMENT:
		    warning (0, "indirection will not access object of "
		     		"non-trivially-copyable type %qT in statement",
			      type);
		     break;
		  case ICV_THIRD_IN_FOR:
		    warning (0, "indirection will not access object of "
		    		"non-trivially-copyable type %qT in for "
				"increment expression", type);
		    break;
		  default:
		    gcc_unreachable ();
		}
	  }
1051
	if (is_reference || !is_volatile || !is_complete || TREE_ADDRESSABLE (type))
1052 1053 1054 1055 1056 1057 1058 1059
          {
            /* Emit a warning (if enabled) when the "effect-less" INDIRECT_REF
               operation is stripped off. Note that we don't warn about
               - an expression with TREE_NO_WARNING set. (For an example of
                 such expressions, see build_over_call in call.c.)
               - automatic dereferencing of references, since the user cannot
                 control it. (See also warn_if_unused_value() in stmt.c.)  */
            if (warn_unused_value
1060
		&& implicit != ICV_CAST
1061 1062 1063 1064 1065 1066
                && (complain & tf_warning)
                && !TREE_NO_WARNING (expr)
                && !is_reference)
              warning (OPT_Wunused_value, "value computed is not used");
            expr = TREE_OPERAND (expr, 0);
          }
Mike Stump committed
1067 1068

	break;
1069
      }
1070

1071 1072
    case VAR_DECL:
      {
Mike Stump committed
1073 1074 1075 1076
	/* External variables might be incomplete.  */
	tree type = TREE_TYPE (expr);
	int is_complete = COMPLETE_TYPE_P (complete_type (type));

1077
	if (TYPE_VOLATILE (type) && !is_complete && (complain & tf_warning))
1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 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
	  switch (implicit)
	    {
	      case ICV_CAST:
		warning (0, "conversion to void will not access "
			    "object %qE of incomplete type %qT", expr, type);
		break;
	      case ICV_SECOND_OF_COND:
	        warning (0, "variable %qE of incomplete type %qT will not "
			    "be accessed in second operand of "
			    "conditional expression", expr, type);
		break;
	      case ICV_THIRD_OF_COND:
	        warning (0, "variable %qE of incomplete type %qT will not "
			    "be accessed in third operand of "
			    "conditional expression", expr, type);
		break;
	      case ICV_RIGHT_OF_COMMA:
	        warning (0, "variable %qE of incomplete type %qT will not "
			    "be accessed in right operand of comma operator",
			 expr, type);
		break;
	      case ICV_LEFT_OF_COMMA:
	        warning (0, "variable %qE of incomplete type %qT will not "
			    "be accessed in left operand of comma operator",
			 expr, type);
		break;
	      case ICV_STATEMENT:
	        warning (0, "variable %qE of incomplete type %qT will not "
		            "be accessed in statement", expr, type);
		break;
	      case ICV_THIRD_IN_FOR:
	        warning (0, "variable %qE of incomplete type %qT will not "
			    "be accessed in for increment expression",
		         expr, type);
		break;
	      default:
	        gcc_unreachable ();
	    }

Mike Stump committed
1117
	break;
1118
      }
1119

1120 1121 1122 1123 1124
    case TARGET_EXPR:
      /* Don't bother with the temporary object returned from a function if
	 we don't use it and don't need to destroy it.  We'll still
	 allocate space for it in expand_call or declare_return_variable,
	 but we don't need to track it through all the tree phases.  */
1125
      if (TARGET_EXPR_IMPLICIT_P (expr)
1126 1127 1128 1129 1130 1131
	  && TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (expr)))
	{
	  tree init = TARGET_EXPR_INITIAL (expr);
	  if (TREE_CODE (init) == AGGR_INIT_EXPR
	      && !AGGR_INIT_VIA_CTOR_P (init))
	    {
1132
	      tree fn = AGGR_INIT_EXPR_FN (init);
1133 1134 1135 1136 1137
	      expr = build_call_array_loc (input_location,
					   TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))),
					   fn,
					   aggr_init_expr_nargs (init),
					   AGGR_INIT_EXPR_ARGP (init));
1138 1139 1140 1141
	    }
	}
      break;

1142 1143
    default:;
    }
1144
  expr = resolve_nondeduced_context (expr);
1145 1146
  {
    tree probe = expr;
1147

1148 1149
    if (TREE_CODE (probe) == ADDR_EXPR)
      probe = TREE_OPERAND (expr, 0);
1150 1151 1152 1153
    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.  */
1154
	if (complain & tf_error)
1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185
	  switch (implicit)
	    {
	      case ICV_CAST:
		error ("conversion to void "
		       "cannot resolve address of overloaded function");
		break;
	      case ICV_SECOND_OF_COND:
		error ("second operand of conditional expression "
		       "cannot resolve address of overloaded function");
		break;
	      case ICV_THIRD_OF_COND:
		error ("third operand of conditional expression "
		       "cannot resolve address of overloaded function");
		break;
	      case ICV_RIGHT_OF_COMMA:
		error ("right operand of comma operator "
		       "cannot resolve address of overloaded function");
		break;
	      case ICV_LEFT_OF_COMMA:
		error ("left operand of comma operator "
		       "cannot resolve address of overloaded function");
		break;
	      case ICV_STATEMENT:
		error ("statement "
		       "cannot resolve address of overloaded function");
		break;
	      case ICV_THIRD_IN_FOR:
		error ("for increment expression "
		       "cannot resolve address of overloaded function");
		break;
	    }
1186 1187
	else
	  return error_mark_node;
1188
	expr = void_zero_node;
1189
      }
1190
    else if (implicit != ICV_CAST && probe == expr && is_overloaded_fn (probe))
1191 1192
      {
	/* Only warn when there is no &.  */
1193
	if (complain & tf_warning)
1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229
	  switch (implicit)
	    {
	      case ICV_SECOND_OF_COND:
	        warning (OPT_Waddress,
			 "second operand of conditional expression "
			 "is a reference, not call, to function %qE", expr);
		break;
	      case ICV_THIRD_OF_COND:
	        warning (OPT_Waddress,
			 "third operand of conditional expression "
			 "is a reference, not call, to function %qE", expr);
		break;
	      case ICV_RIGHT_OF_COMMA:
	        warning (OPT_Waddress,
			 "right operand of comma operator "
			 "is a reference, not call, to function %qE", expr);
		break;
	      case ICV_LEFT_OF_COMMA:
	        warning (OPT_Waddress,
			 "left operand of comma operator "
			 "is a reference, not call, to function %qE", expr);
		break;
	      case ICV_STATEMENT:
	        warning (OPT_Waddress,
			 "statement is a reference, not call, to function %qE",
			 expr);
		break;
	      case ICV_THIRD_IN_FOR:
	        warning (OPT_Waddress,
			 "for increment expression "
			 "is a reference, not call, to function %qE", expr);
		break;
	      default:
	        gcc_unreachable ();
	    }

1230 1231 1232
	if (TREE_CODE (expr) == COMPONENT_REF)
	  expr = TREE_OPERAND (expr, 0);
      }
1233
  }
1234

1235
  if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr)))
1236
    {
1237
      if (implicit != ICV_CAST
1238 1239 1240
	  && warn_unused_value
	  && !TREE_NO_WARNING (expr)
	  && !processing_template_decl)
1241 1242 1243
	{
	  /* The middle end does not warn about expressions that have
	     been explicitly cast to void, so we must do so here.  */
1244 1245
	  if (!TREE_SIDE_EFFECTS (expr)) {
            if (complain & tf_warning)
1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274
	      switch (implicit)
		{
		  case ICV_SECOND_OF_COND:
		    warning (OPT_Wunused_value,
			     "second operand of conditional expression has no effect");
		    break;
		  case ICV_THIRD_OF_COND:
		    warning (OPT_Wunused_value,
		    	     "third operand of conditional expression has no effect");
		    break;
		  case ICV_RIGHT_OF_COMMA:
		    warning (OPT_Wunused_value,
		    	     "right operand of comma operator has no effect");
		    break;
		  case ICV_LEFT_OF_COMMA:
		    warning (OPT_Wunused_value,
		    	     "left operand of comma operator has no effect");
		    break;
		  case ICV_STATEMENT:
		    warning (OPT_Wunused_value,
		    	     "statement has no effect");
		    break;
		  case ICV_THIRD_IN_FOR:
		    warning (OPT_Wunused_value,
		    	     "for increment expression has no effect");
		    break;
		  default:
		    gcc_unreachable ();
		}
1275
          }
1276 1277
	  else
	    {
1278 1279
	      tree e;
	      enum tree_code code;
1280
	      enum tree_code_class tclass;
1281

1282 1283 1284 1285
	      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
1286
		 circumstances.  (For example a block copy will be
1287 1288 1289
		 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
1290 1291 1292 1293 1294
		 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);
1295 1296

	      code = TREE_CODE (e);
1297 1298 1299 1300
	      tclass = TREE_CODE_CLASS (code);
	      if ((tclass == tcc_comparison
		   || tclass == tcc_unary
		   || (tclass == tcc_binary
1301 1302 1303 1304 1305 1306
		       && !(code == MODIFY_EXPR
			    || code == INIT_EXPR
			    || code == PREDECREMENT_EXPR
			    || code == PREINCREMENT_EXPR
			    || code == POSTDECREMENT_EXPR
			    || code == POSTINCREMENT_EXPR)))
1307
                  && (complain & tf_warning))
1308
		warning (OPT_Wunused_value, "value computed is not used");
1309 1310
	    }
	}
1311
      expr = build1 (CONVERT_EXPR, void_type_node, expr);
1312
    }
1313 1314
  if (! TREE_SIDE_EFFECTS (expr))
    expr = void_zero_node;
1315 1316 1317
  return expr;
}

Mike Stump committed
1318 1319 1320 1321
/* 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
1322 1323 1324 1325
   not permitted by the language being compiled.

   Most of this routine is from build_reinterpret_cast.

1326
   The back end cannot call cp_convert (what was convert) because
1327 1328 1329
   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
1330
   on subtrees of already built trees after it has ripped them apart.
1331 1332 1333

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

tree
1336
convert (tree type, tree expr)
Mike Stump committed
1337
{
1338 1339 1340 1341 1342 1343 1344
  tree intype;

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

  intype = TREE_TYPE (expr);

1345
  if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype))
1346
    return fold_if_not_in_template (build_nop (type, expr));
1347 1348 1349

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

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

Mike Stump committed
1356
tree
1357
convert_force (tree type, tree expr, int convtype)
Mike Stump committed
1358
{
1359 1360
  tree e = expr;
  enum tree_code code = TREE_CODE (type);
Mike Stump committed
1361 1362

  if (code == REFERENCE_TYPE)
1363
    return (fold_if_not_in_template
1364 1365
	    (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
				   NULL_TREE)));
Mike Stump committed
1366 1367

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

Mike Stump committed
1370
  /* From typeck.c convert_for_assignment */
Mike Stump committed
1371 1372 1373
  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
1374 1375
       || integer_zerop (e)
       || TYPE_PTRMEMFUNC_P (TREE_TYPE (e)))
Mike Stump committed
1376
      && TYPE_PTRMEMFUNC_P (type))
1377 1378
    /* compatible pointer to member functions.  */
    return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1,
1379
			     /*c_cast_p=*/1, tf_warning_or_error);
Mike Stump committed
1380

1381
  return ocp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL);
Mike Stump committed
1382 1383 1384 1385 1386 1387 1388 1389
}

/* 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
1390 1391 1392 1393
   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
1394

1395
static tree
1396
build_type_conversion (tree xtype, tree expr)
Mike Stump committed
1397 1398
{
  /* C++: check to see if we can convert this aggregate type
Mike Stump committed
1399
     into the required type.  */
1400
  return build_user_type_conversion (xtype, expr, LOOKUP_NORMAL);
Mike Stump committed
1401 1402
}

Mike Stump committed
1403 1404
/* 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.)
1405
   which indicates which types are suitable.  If COMPLAIN is true, complain
Mike Stump committed
1406
   about ambiguity; otherwise, the caller will deal with it.  */
Mike Stump committed
1407

Mike Stump committed
1408
tree
1409
build_expr_type_conversion (int desires, tree expr, bool complain)
Mike Stump committed
1410
{
Mike Stump committed
1411
  tree basetype = TREE_TYPE (expr);
Kaveh R. Ghazi committed
1412
  tree conv = NULL_TREE;
1413
  tree winner = NULL_TREE;
Mike Stump committed
1414

1415 1416
  if (expr == null_node
      && (desires & WANT_INT)
1417
      && !(desires & WANT_NULL))
1418 1419
    warning_at (input_location, OPT_Wconversion_null,
		"converting NULL to non-pointer type");
1420

Mike Stump committed
1421
  basetype = TREE_TYPE (expr);
Mike Stump committed
1422

1423 1424 1425
  if (basetype == error_mark_node)
    return error_mark_node;

1426
  if (! MAYBE_CLASS_TYPE_P (basetype))
1427 1428 1429
    switch (TREE_CODE (basetype))
      {
      case INTEGER_TYPE:
1430
	if ((desires & WANT_NULL) && null_ptr_cst_p (expr))
1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441
	  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;
1442

1443 1444
      case FUNCTION_TYPE:
      case ARRAY_TYPE:
1445
	return (desires & WANT_POINTER) ? decay_conversion (expr)
Mike Stump committed
1446
					: NULL_TREE;
1447

1448
      case COMPLEX_TYPE:
1449
      case VECTOR_TYPE:
1450
	if ((desires & WANT_VECTOR_OR_COMPLEX) == 0)
1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464
	  return NULL_TREE;
	switch (TREE_CODE (TREE_TYPE (basetype)))
	  {
	  case INTEGER_TYPE:
	  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;
	  default:
	    return NULL_TREE;
	  }

1465 1466 1467 1468 1469 1470
      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.  */
1471
  if (!complete_type_or_maybe_complain (basetype, expr, complain))
1472 1473
    return error_mark_node;
  if (!TYPE_HAS_CONVERSION (basetype))
1474 1475
    return NULL_TREE;

1476 1477 1478
  for (conv = lookup_conversions (basetype, /*lookup_template_convs_p=*/true);
       conv;
       conv = TREE_CHAIN (conv))
1479 1480 1481 1482
    {
      int win = 0;
      tree candidate;
      tree cand = TREE_VALUE (conv);
1483
      cand = OVL_CURRENT (cand);
1484 1485 1486 1487

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

1488 1489 1490
      if (DECL_NONCONVERTING_P (cand))
	continue;

1491
      candidate = non_reference (TREE_TYPE (TREE_TYPE (cand)));
1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504

      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;

1505
	case COMPLEX_TYPE:
1506
	case VECTOR_TYPE:
1507
	  if ((desires & WANT_VECTOR_OR_COMPLEX) == 0)
1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522
	    break;
	  switch (TREE_CODE (TREE_TYPE (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;
	    default:
	      break;
	    }
	  break;

1523 1524 1525 1526 1527 1528 1529 1530 1531 1532
	default:
	  break;
	}

      if (win)
	{
	  if (winner)
	    {
	      if (complain)
		{
1533
		  error ("ambiguous default type conversion from %qT",
Mike Stump committed
1534
			 basetype);
1535
		  error ("  candidate conversions include %qD and %qD",
Mike Stump committed
1536
			 winner, cand);
1537 1538 1539 1540 1541 1542 1543
		}
	      return error_mark_node;
	    }
	  else
	    winner = cand;
	}
    }
Mike Stump committed
1544

1545 1546
  if (winner)
    {
1547
      tree type = non_reference (TREE_TYPE (TREE_TYPE (winner)));
1548
      return build_user_type_conversion (type, expr, LOOKUP_NORMAL);
Mike Stump committed
1549
    }
Mike Stump committed
1550

1551
  return NULL_TREE;
Mike Stump committed
1552
}
Mike Stump committed
1553

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

Mike Stump committed
1556
tree
1557
type_promotes_to (tree type)
Mike Stump committed
1558
{
1559 1560
  tree promoted_type;

Mike Stump committed
1561 1562 1563
  if (type == error_mark_node)
    return error_mark_node;

Mike Stump committed
1564
  type = TYPE_MAIN_VARIANT (type);
Mike Stump committed
1565

1566 1567 1568 1569 1570
  /* Check for promotions of target-defined types first.  */
  promoted_type = targetm.promoted_type (type);
  if (promoted_type)
    return promoted_type;

Mike Stump committed
1571 1572
  /* bool always promotes to int (not unsigned), even if it's the same
     size.  */
1573
  if (TREE_CODE (type) == BOOLEAN_TYPE)
Mike Stump committed
1574 1575 1576 1577 1578
    type = integer_type_node;

  /* Normally convert enums to int, but convert wide enums to something
     wider.  */
  else if (TREE_CODE (type) == ENUMERAL_TYPE
1579 1580
	   || type == char16_type_node
	   || type == char32_type_node
Mike Stump committed
1581
	   || type == wchar_type_node)
1582 1583 1584
    {
      int precision = MAX (TYPE_PRECISION (type),
			   TYPE_PRECISION (integer_type_node));
1585
      tree totype = c_common_type_for_size (precision, 0);
1586 1587
      if (TREE_CODE (type) == ENUMERAL_TYPE)
	type = ENUM_UNDERLYING_TYPE (type);
1588
      if (TYPE_UNSIGNED (type)
1589
	  && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype))
1590
	type = c_common_type_for_size (precision, 1);
1591 1592 1593
      else
	type = totype;
    }
1594
  else if (c_promoting_integer_type_p (type))
Mike Stump committed
1595
    {
1596
      /* Retain unsignedness if really not getting bigger.  */
1597
      if (TYPE_UNSIGNED (type)
1598
	  && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
Mike Stump committed
1599 1600 1601 1602 1603 1604
	type = unsigned_type_node;
      else
	type = integer_type_node;
    }
  else if (type == float_type_node)
    type = double_type_node;
1605

1606
  return type;
Mike Stump committed
1607
}
1608 1609 1610 1611 1612 1613

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

1614 1615 1616 1617
/* 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.  */

1618
tree
1619
perform_qualification_conversions (tree type, tree expr)
1620
{
1621 1622 1623 1624
  tree expr_type;

  expr_type = TREE_TYPE (expr);

1625 1626 1627 1628
  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)))
1629 1630 1631 1632 1633 1634 1635 1636
    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);
1637 1638
  else
    return error_mark_node;
1639
}