typeck.c revision 261188
1/* Build expressions with type checking for C++ compiler.
2   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4   Hacked by Michael Tiemann (tiemann@cygnus.com)
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13GCC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING.  If not, write to
20the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21Boston, MA 02110-1301, USA.  */
22
23
24/* This file is part of the C++ front end.
25   It contains routines to build C++ expressions given their operands,
26   including computing the types of the result, C and C++ specific error
27   checks, and some optimization.  */
28
29#include "config.h"
30#include "system.h"
31#include "coretypes.h"
32#include "tm.h"
33#include "tree.h"
34#include "rtl.h"
35#include "expr.h"
36#include "cp-tree.h"
37#include "tm_p.h"
38#include "flags.h"
39#include "output.h"
40#include "toplev.h"
41#include "diagnostic.h"
42#include "target.h"
43#include "convert.h"
44#include "c-common.h"
45
46static tree pfn_from_ptrmemfunc (tree);
47static tree convert_for_assignment (tree, tree, const char *, tree, int);
48static tree cp_pointer_int_sum (enum tree_code, tree, tree);
49static tree rationalize_conditional_expr (enum tree_code, tree);
50static int comp_ptr_ttypes_real (tree, tree, int);
51static bool comp_except_types (tree, tree, bool);
52static bool comp_array_types (tree, tree, bool);
53static tree common_base_type (tree, tree);
54static tree pointer_diff (tree, tree, tree);
55static tree get_delta_difference (tree, tree, bool, bool);
56static void casts_away_constness_r (tree *, tree *);
57static bool casts_away_constness (tree, tree);
58static void maybe_warn_about_returning_address_of_local (tree);
59static tree lookup_destructor (tree, tree, tree);
60/* APPLE LOCAL radar 6087117 */
61static tree convert_arguments (tree, tree, tree, int, int);
62
63/* Do `exp = require_complete_type (exp);' to make sure exp
64   does not have an incomplete type.  (That includes void types.)
65   Returns the error_mark_node if the VALUE does not have
66   complete type when this function returns.  */
67
68tree
69require_complete_type (tree value)
70{
71  tree type;
72
73  if (processing_template_decl || value == error_mark_node)
74    return value;
75
76  if (TREE_CODE (value) == OVERLOAD)
77    type = unknown_type_node;
78  else
79    type = TREE_TYPE (value);
80
81  if (type == error_mark_node)
82    return error_mark_node;
83
84  /* First, detect a valid value with a complete type.  */
85  if (COMPLETE_TYPE_P (type))
86    return value;
87
88  if (complete_type_or_else (type, value))
89    return value;
90  else
91    return error_mark_node;
92}
93
94/* Try to complete TYPE, if it is incomplete.  For example, if TYPE is
95   a template instantiation, do the instantiation.  Returns TYPE,
96   whether or not it could be completed, unless something goes
97   horribly wrong, in which case the error_mark_node is returned.  */
98
99tree
100complete_type (tree type)
101{
102  if (type == NULL_TREE)
103    /* Rather than crash, we return something sure to cause an error
104       at some point.  */
105    return error_mark_node;
106
107  if (type == error_mark_node || COMPLETE_TYPE_P (type))
108    ;
109  else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
110    {
111      tree t = complete_type (TREE_TYPE (type));
112      unsigned int needs_constructing, has_nontrivial_dtor;
113      if (COMPLETE_TYPE_P (t) && !dependent_type_p (type))
114	layout_type (type);
115      needs_constructing
116	= TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (t));
117      has_nontrivial_dtor
118	= TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TYPE_MAIN_VARIANT (t));
119      for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
120	{
121	  TYPE_NEEDS_CONSTRUCTING (t) = needs_constructing;
122	  TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = has_nontrivial_dtor;
123	}
124    }
125  else if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_INSTANTIATION (type))
126    instantiate_class_template (TYPE_MAIN_VARIANT (type));
127
128  return type;
129}
130
131/* Like complete_type, but issue an error if the TYPE cannot be completed.
132   VALUE is used for informative diagnostics.
133   Returns NULL_TREE if the type cannot be made complete.  */
134
135tree
136complete_type_or_else (tree type, tree value)
137{
138  type = complete_type (type);
139  if (type == error_mark_node)
140    /* We already issued an error.  */
141    return NULL_TREE;
142  else if (!COMPLETE_TYPE_P (type))
143    {
144      cxx_incomplete_type_diagnostic (value, type, 0);
145      return NULL_TREE;
146    }
147  else
148    return type;
149}
150
151/* Return truthvalue of whether type of EXP is instantiated.  */
152
153int
154type_unknown_p (tree exp)
155{
156  return (TREE_CODE (exp) == TREE_LIST
157	  || TREE_TYPE (exp) == unknown_type_node);
158}
159
160
161/* Return the common type of two parameter lists.
162   We assume that comptypes has already been done and returned 1;
163   if that isn't so, this may crash.
164
165   As an optimization, free the space we allocate if the parameter
166   lists are already common.  */
167
168static tree
169commonparms (tree p1, tree p2)
170{
171  tree oldargs = p1, newargs, n;
172  int i, len;
173  int any_change = 0;
174
175  len = list_length (p1);
176  newargs = tree_last (p1);
177
178  if (newargs == void_list_node)
179    i = 1;
180  else
181    {
182      i = 0;
183      newargs = 0;
184    }
185
186  for (; i < len; i++)
187    newargs = tree_cons (NULL_TREE, NULL_TREE, newargs);
188
189  n = newargs;
190
191  for (i = 0; p1;
192       p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n), i++)
193    {
194      if (TREE_PURPOSE (p1) && !TREE_PURPOSE (p2))
195	{
196	  TREE_PURPOSE (n) = TREE_PURPOSE (p1);
197	  any_change = 1;
198	}
199      else if (! TREE_PURPOSE (p1))
200	{
201	  if (TREE_PURPOSE (p2))
202	    {
203	      TREE_PURPOSE (n) = TREE_PURPOSE (p2);
204	      any_change = 1;
205	    }
206	}
207      else
208	{
209	  if (1 != simple_cst_equal (TREE_PURPOSE (p1), TREE_PURPOSE (p2)))
210	    any_change = 1;
211	  TREE_PURPOSE (n) = TREE_PURPOSE (p2);
212	}
213      if (TREE_VALUE (p1) != TREE_VALUE (p2))
214	{
215	  any_change = 1;
216	  TREE_VALUE (n) = merge_types (TREE_VALUE (p1), TREE_VALUE (p2));
217	}
218      else
219	TREE_VALUE (n) = TREE_VALUE (p1);
220    }
221  if (! any_change)
222    return oldargs;
223
224  return newargs;
225}
226
227/* Given a type, perhaps copied for a typedef,
228   find the "original" version of it.  */
229static tree
230original_type (tree t)
231{
232  int quals = cp_type_quals (t);
233  while (t != error_mark_node
234	 && TYPE_NAME (t) != NULL_TREE)
235    {
236      tree x = TYPE_NAME (t);
237      if (TREE_CODE (x) != TYPE_DECL)
238	break;
239      x = DECL_ORIGINAL_TYPE (x);
240      if (x == NULL_TREE)
241	break;
242      t = x;
243    }
244  return cp_build_qualified_type (t, quals);
245}
246
247/* T1 and T2 are arithmetic or enumeration types.  Return the type
248   that will result from the "usual arithmetic conversions" on T1 and
249   T2 as described in [expr].  */
250
251tree
252type_after_usual_arithmetic_conversions (tree t1, tree t2)
253{
254  enum tree_code code1 = TREE_CODE (t1);
255  enum tree_code code2 = TREE_CODE (t2);
256  tree attributes;
257
258  /* FIXME: Attributes.  */
259  gcc_assert (ARITHMETIC_TYPE_P (t1)
260	      || TREE_CODE (t1) == VECTOR_TYPE
261	      || TREE_CODE (t1) == ENUMERAL_TYPE);
262  gcc_assert (ARITHMETIC_TYPE_P (t2)
263	      || TREE_CODE (t2) == VECTOR_TYPE
264	      || TREE_CODE (t2) == ENUMERAL_TYPE);
265
266  /* In what follows, we slightly generalize the rules given in [expr] so
267     as to deal with `long long' and `complex'.  First, merge the
268     attributes.  */
269  attributes = (*targetm.merge_type_attributes) (t1, t2);
270
271  /* If one type is complex, form the common type of the non-complex
272     components, then make that complex.  Use T1 or T2 if it is the
273     required type.  */
274  if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE)
275    {
276      tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1;
277      tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2;
278      tree subtype
279	= type_after_usual_arithmetic_conversions (subtype1, subtype2);
280
281      if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype)
282	return build_type_attribute_variant (t1, attributes);
283      else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
284	return build_type_attribute_variant (t2, attributes);
285      else
286	return build_type_attribute_variant (build_complex_type (subtype),
287					     attributes);
288    }
289
290  if (code1 == VECTOR_TYPE)
291    {
292      /* When we get here we should have two vectors of the same size.
293	 Just prefer the unsigned one if present.  */
294      if (TYPE_UNSIGNED (t1))
295	return build_type_attribute_variant (t1, attributes);
296      else
297	return build_type_attribute_variant (t2, attributes);
298    }
299
300  /* If only one is real, use it as the result.  */
301  if (code1 == REAL_TYPE && code2 != REAL_TYPE)
302    return build_type_attribute_variant (t1, attributes);
303  if (code2 == REAL_TYPE && code1 != REAL_TYPE)
304    return build_type_attribute_variant (t2, attributes);
305
306  /* Perform the integral promotions.  */
307  if (code1 != REAL_TYPE)
308    {
309      t1 = type_promotes_to (t1);
310      t2 = type_promotes_to (t2);
311    }
312
313  /* Both real or both integers; use the one with greater precision.  */
314  if (TYPE_PRECISION (t1) > TYPE_PRECISION (t2))
315    return build_type_attribute_variant (t1, attributes);
316  else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
317    return build_type_attribute_variant (t2, attributes);
318
319  /* The types are the same; no need to do anything fancy.  */
320  if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
321    return build_type_attribute_variant (t1, attributes);
322
323  if (code1 != REAL_TYPE)
324    {
325      /* If one is a sizetype, use it so size_binop doesn't blow up.  */
326      if (TYPE_IS_SIZETYPE (t1) > TYPE_IS_SIZETYPE (t2))
327	return build_type_attribute_variant (t1, attributes);
328      if (TYPE_IS_SIZETYPE (t2) > TYPE_IS_SIZETYPE (t1))
329	return build_type_attribute_variant (t2, attributes);
330
331      /* If one is unsigned long long, then convert the other to unsigned
332	 long long.  */
333      if (same_type_p (TYPE_MAIN_VARIANT (t1), long_long_unsigned_type_node)
334	  || same_type_p (TYPE_MAIN_VARIANT (t2), long_long_unsigned_type_node))
335	return build_type_attribute_variant (long_long_unsigned_type_node,
336					     attributes);
337      /* If one is a long long, and the other is an unsigned long, and
338	 long long can represent all the values of an unsigned long, then
339	 convert to a long long.  Otherwise, convert to an unsigned long
340	 long.  Otherwise, if either operand is long long, convert the
341	 other to long long.
342
343	 Since we're here, we know the TYPE_PRECISION is the same;
344	 therefore converting to long long cannot represent all the values
345	 of an unsigned long, so we choose unsigned long long in that
346	 case.  */
347      if (same_type_p (TYPE_MAIN_VARIANT (t1), long_long_integer_type_node)
348	  || same_type_p (TYPE_MAIN_VARIANT (t2), long_long_integer_type_node))
349	{
350	  tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
351		    ? long_long_unsigned_type_node
352		    : long_long_integer_type_node);
353	  return build_type_attribute_variant (t, attributes);
354	}
355
356      /* Go through the same procedure, but for longs.  */
357      if (same_type_p (TYPE_MAIN_VARIANT (t1), long_unsigned_type_node)
358	  || same_type_p (TYPE_MAIN_VARIANT (t2), long_unsigned_type_node))
359	return build_type_attribute_variant (long_unsigned_type_node,
360					     attributes);
361      if (same_type_p (TYPE_MAIN_VARIANT (t1), long_integer_type_node)
362	  || same_type_p (TYPE_MAIN_VARIANT (t2), long_integer_type_node))
363	{
364	  tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
365		    ? long_unsigned_type_node : long_integer_type_node);
366	  return build_type_attribute_variant (t, attributes);
367	}
368      /* Otherwise prefer the unsigned one.  */
369      if (TYPE_UNSIGNED (t1))
370	return build_type_attribute_variant (t1, attributes);
371      else
372	return build_type_attribute_variant (t2, attributes);
373    }
374  else
375    {
376      if (same_type_p (TYPE_MAIN_VARIANT (t1), long_double_type_node)
377	  || same_type_p (TYPE_MAIN_VARIANT (t2), long_double_type_node))
378	return build_type_attribute_variant (long_double_type_node,
379					     attributes);
380      if (same_type_p (TYPE_MAIN_VARIANT (t1), double_type_node)
381	  || same_type_p (TYPE_MAIN_VARIANT (t2), double_type_node))
382	return build_type_attribute_variant (double_type_node,
383					     attributes);
384      if (same_type_p (TYPE_MAIN_VARIANT (t1), float_type_node)
385	  || same_type_p (TYPE_MAIN_VARIANT (t2), float_type_node))
386	return build_type_attribute_variant (float_type_node,
387					     attributes);
388
389      /* Two floating-point types whose TYPE_MAIN_VARIANTs are none of
390	 the standard C++ floating-point types.  Logic earlier in this
391	 function has already eliminated the possibility that
392	 TYPE_PRECISION (t2) != TYPE_PRECISION (t1), so there's no
393	 compelling reason to choose one or the other.  */
394      return build_type_attribute_variant (t1, attributes);
395    }
396}
397
398/* Subroutine of composite_pointer_type to implement the recursive
399   case.  See that function for documentation fo the parameters.  */
400
401static tree
402composite_pointer_type_r (tree t1, tree t2, const char* location)
403{
404  tree pointee1;
405  tree pointee2;
406  tree result_type;
407  tree attributes;
408
409  /* Determine the types pointed to by T1 and T2.  */
410  /* APPLE LOCAL blocks 6040305 */
411  if (TREE_CODE (t1) == POINTER_TYPE || TREE_CODE (t1) == BLOCK_POINTER_TYPE)
412    {
413      pointee1 = TREE_TYPE (t1);
414      pointee2 = TREE_TYPE (t2);
415    }
416  else
417    {
418      pointee1 = TYPE_PTRMEM_POINTED_TO_TYPE (t1);
419      pointee2 = TYPE_PTRMEM_POINTED_TO_TYPE (t2);
420    }
421
422  /* [expr.rel]
423
424     Otherwise, the composite pointer type is a pointer type
425     similar (_conv.qual_) to the type of one of the operands,
426     with a cv-qualification signature (_conv.qual_) that is the
427     union of the cv-qualification signatures of the operand
428     types.  */
429  if (same_type_ignoring_top_level_qualifiers_p (pointee1, pointee2))
430    result_type = pointee1;
431  else if ((TREE_CODE (pointee1) == POINTER_TYPE
432	    && TREE_CODE (pointee2) == POINTER_TYPE)
433	   || (TYPE_PTR_TO_MEMBER_P (pointee1)
434	       && TYPE_PTR_TO_MEMBER_P (pointee2)))
435    result_type = composite_pointer_type_r (pointee1, pointee2, location);
436  else
437    {
438      pedwarn ("%s between distinct pointer types %qT and %qT "
439	       "lacks a cast",
440	       location, t1, t2);
441      result_type = void_type_node;
442    }
443  result_type = cp_build_qualified_type (result_type,
444					 (cp_type_quals (pointee1)
445					  | cp_type_quals (pointee2)));
446  /* If the original types were pointers to members, so is the
447     result.  */
448  if (TYPE_PTR_TO_MEMBER_P (t1))
449    {
450      if (!same_type_p (TYPE_PTRMEM_CLASS_TYPE (t1),
451			TYPE_PTRMEM_CLASS_TYPE (t2)))
452	pedwarn ("%s between distinct pointer types %qT and %qT "
453		 "lacks a cast",
454		 location, t1, t2);
455      result_type = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
456				       result_type);
457    }
458  /* APPLE LOCAL begin blocks 6065211 */
459  else if (TREE_CODE (t1) == BLOCK_POINTER_TYPE
460     && result_type != void_type_node)
461    result_type = build_block_pointer_type (result_type);
462  else
463    result_type = build_pointer_type (result_type);
464  /* APPLE LOCAL end blocks 6065211 */
465
466  /* Merge the attributes.  */
467  attributes = (*targetm.merge_type_attributes) (t1, t2);
468  return build_type_attribute_variant (result_type, attributes);
469}
470
471/* Return the composite pointer type (see [expr.rel]) for T1 and T2.
472   ARG1 and ARG2 are the values with those types.  The LOCATION is a
473   string describing the current location, in case an error occurs.
474
475   This routine also implements the computation of a common type for
476   pointers-to-members as per [expr.eq].  */
477
478tree
479composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2,
480			const char* location)
481{
482  tree class1;
483  tree class2;
484
485  /* [expr.rel]
486
487     If one operand is a null pointer constant, the composite pointer
488     type is the type of the other operand.  */
489  if (null_ptr_cst_p (arg1))
490    return t2;
491  if (null_ptr_cst_p (arg2))
492    return t1;
493
494  /* We have:
495
496       [expr.rel]
497
498       If one of the operands has type "pointer to cv1 void*", then
499       the other has type "pointer to cv2T", and the composite pointer
500       type is "pointer to cv12 void", where cv12 is the union of cv1
501       and cv2.
502
503    If either type is a pointer to void, make sure it is T1.  */
504  if (TREE_CODE (t2) == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (t2)))
505    {
506      tree t;
507      t = t1;
508      t1 = t2;
509      t2 = t;
510    }
511
512  /* Now, if T1 is a pointer to void, merge the qualifiers.  */
513  if (TREE_CODE (t1) == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (t1)))
514    {
515      tree attributes;
516      tree result_type;
517
518      if (pedantic && TYPE_PTRFN_P (t2))
519	pedwarn ("ISO C++ forbids %s between pointer of type %<void *%> "
520		 "and pointer-to-function", location);
521      result_type
522	= cp_build_qualified_type (void_type_node,
523				   (cp_type_quals (TREE_TYPE (t1))
524				    | cp_type_quals (TREE_TYPE (t2))));
525      result_type = build_pointer_type (result_type);
526      /* Merge the attributes.  */
527      attributes = (*targetm.merge_type_attributes) (t1, t2);
528      return build_type_attribute_variant (result_type, attributes);
529    }
530
531  if (c_dialect_objc () && TREE_CODE (t1) == POINTER_TYPE
532      && TREE_CODE (t2) == POINTER_TYPE)
533    {
534      /* APPLE LOCAL radar 4229905 - radar 6231433 */
535      if (objc_have_common_type (t1, t2, -3, NULL_TREE, location))
536      /* APPLE LOCAL 4154928 */
537	return objc_common_type (t1, t2);
538    }
539
540  /* [expr.eq] permits the application of a pointer conversion to
541     bring the pointers to a common type.  */
542  if (TREE_CODE (t1) == POINTER_TYPE && TREE_CODE (t2) == POINTER_TYPE
543      && CLASS_TYPE_P (TREE_TYPE (t1))
544      && CLASS_TYPE_P (TREE_TYPE (t2))
545      && !same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (t1),
546						     TREE_TYPE (t2)))
547    {
548      class1 = TREE_TYPE (t1);
549      class2 = TREE_TYPE (t2);
550
551      if (DERIVED_FROM_P (class1, class2))
552	t2 = (build_pointer_type
553	      (cp_build_qualified_type (class1, TYPE_QUALS (class2))));
554      else if (DERIVED_FROM_P (class2, class1))
555	t1 = (build_pointer_type
556	      (cp_build_qualified_type (class2, TYPE_QUALS (class1))));
557      else
558	{
559	  error ("%s between distinct pointer types %qT and %qT "
560		 "lacks a cast", location, t1, t2);
561	  return error_mark_node;
562	}
563    }
564  /* [expr.eq] permits the application of a pointer-to-member
565     conversion to change the class type of one of the types.  */
566  else if (TYPE_PTR_TO_MEMBER_P (t1)
567	   && !same_type_p (TYPE_PTRMEM_CLASS_TYPE (t1),
568			    TYPE_PTRMEM_CLASS_TYPE (t2)))
569    {
570      class1 = TYPE_PTRMEM_CLASS_TYPE (t1);
571      class2 = TYPE_PTRMEM_CLASS_TYPE (t2);
572
573      if (DERIVED_FROM_P (class1, class2))
574	t1 = build_ptrmem_type (class2, TYPE_PTRMEM_POINTED_TO_TYPE (t1));
575      else if (DERIVED_FROM_P (class2, class1))
576	t2 = build_ptrmem_type (class1, TYPE_PTRMEM_POINTED_TO_TYPE (t2));
577      else
578	{
579	  error ("%s between distinct pointer-to-member types %qT and %qT "
580		 "lacks a cast", location, t1, t2);
581	  return error_mark_node;
582	}
583    }
584  /* APPLE LOCAL begin blocks 6065211 */
585  else if (TREE_CODE (t1) != TREE_CODE (t2))
586    {
587      error ("%s between distinct pointer types %qT and %qT "
588	     "lacks a cast", location, t1, t2);
589      return error_mark_node;
590    }
591  /* APPLE LOCAL end blocks 6065211 */
592
593  return composite_pointer_type_r (t1, t2, location);
594}
595
596/* Return the merged type of two types.
597   We assume that comptypes has already been done and returned 1;
598   if that isn't so, this may crash.
599
600   This just combines attributes and default arguments; any other
601   differences would cause the two types to compare unalike.  */
602
603tree
604merge_types (tree t1, tree t2)
605{
606  enum tree_code code1;
607  enum tree_code code2;
608  tree attributes;
609
610  /* Save time if the two types are the same.  */
611  if (t1 == t2)
612    return t1;
613  if (original_type (t1) == original_type (t2))
614    return t1;
615
616  /* If one type is nonsense, use the other.  */
617  if (t1 == error_mark_node)
618    return t2;
619  if (t2 == error_mark_node)
620    return t1;
621
622  /* Merge the attributes.  */
623  attributes = (*targetm.merge_type_attributes) (t1, t2);
624
625  if (TYPE_PTRMEMFUNC_P (t1))
626    t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
627  if (TYPE_PTRMEMFUNC_P (t2))
628    t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
629
630  code1 = TREE_CODE (t1);
631  code2 = TREE_CODE (t2);
632
633  switch (code1)
634    {
635    case POINTER_TYPE:
636    case REFERENCE_TYPE:
637      /* For two pointers, do this recursively on the target type.  */
638      {
639	tree target = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
640	int quals = cp_type_quals (t1);
641
642	if (code1 == POINTER_TYPE)
643	  t1 = build_pointer_type (target);
644	else
645	  t1 = build_reference_type (target);
646	t1 = build_type_attribute_variant (t1, attributes);
647	t1 = cp_build_qualified_type (t1, quals);
648
649	if (TREE_CODE (target) == METHOD_TYPE)
650	  t1 = build_ptrmemfunc_type (t1);
651
652	return t1;
653      }
654
655    case OFFSET_TYPE:
656      {
657	int quals;
658	tree pointee;
659	quals = cp_type_quals (t1);
660	pointee = merge_types (TYPE_PTRMEM_POINTED_TO_TYPE (t1),
661			       TYPE_PTRMEM_POINTED_TO_TYPE (t2));
662	t1 = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
663				pointee);
664	t1 = cp_build_qualified_type (t1, quals);
665	break;
666      }
667
668    case ARRAY_TYPE:
669      {
670	tree elt = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
671	/* Save space: see if the result is identical to one of the args.  */
672	if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1))
673	  return build_type_attribute_variant (t1, attributes);
674	if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2))
675	  return build_type_attribute_variant (t2, attributes);
676	/* Merge the element types, and have a size if either arg has one.  */
677	t1 = build_cplus_array_type
678	  (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
679	break;
680      }
681
682    case FUNCTION_TYPE:
683      /* Function types: prefer the one that specified arg types.
684	 If both do, merge the arg types.  Also merge the return types.  */
685      {
686	tree valtype = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
687	tree p1 = TYPE_ARG_TYPES (t1);
688	tree p2 = TYPE_ARG_TYPES (t2);
689	tree rval, raises;
690
691	/* Save space: see if the result is identical to one of the args.  */
692	if (valtype == TREE_TYPE (t1) && ! p2)
693	  return cp_build_type_attribute_variant (t1, attributes);
694	if (valtype == TREE_TYPE (t2) && ! p1)
695	  return cp_build_type_attribute_variant (t2, attributes);
696
697	/* Simple way if one arg fails to specify argument types.  */
698	if (p1 == NULL_TREE || TREE_VALUE (p1) == void_type_node)
699	  {
700	    rval = build_function_type (valtype, p2);
701	    if ((raises = TYPE_RAISES_EXCEPTIONS (t2)))
702	      rval = build_exception_variant (rval, raises);
703	    return cp_build_type_attribute_variant (rval, attributes);
704	  }
705	raises = TYPE_RAISES_EXCEPTIONS (t1);
706	if (p2 == NULL_TREE || TREE_VALUE (p2) == void_type_node)
707	  {
708	    rval = build_function_type (valtype, p1);
709	    if (raises)
710	      rval = build_exception_variant (rval, raises);
711	    return cp_build_type_attribute_variant (rval, attributes);
712	  }
713
714	rval = build_function_type (valtype, commonparms (p1, p2));
715	t1 = build_exception_variant (rval, raises);
716	break;
717      }
718
719    case METHOD_TYPE:
720      {
721	/* Get this value the long way, since TYPE_METHOD_BASETYPE
722	   is just the main variant of this.  */
723	tree basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t2)));
724	tree raises = TYPE_RAISES_EXCEPTIONS (t1);
725	tree t3;
726
727	/* If this was a member function type, get back to the
728	   original type of type member function (i.e., without
729	   the class instance variable up front.  */
730	t1 = build_function_type (TREE_TYPE (t1),
731				  TREE_CHAIN (TYPE_ARG_TYPES (t1)));
732	t2 = build_function_type (TREE_TYPE (t2),
733				  TREE_CHAIN (TYPE_ARG_TYPES (t2)));
734	t3 = merge_types (t1, t2);
735	t3 = build_method_type_directly (basetype, TREE_TYPE (t3),
736					 TYPE_ARG_TYPES (t3));
737	t1 = build_exception_variant (t3, raises);
738	break;
739      }
740
741    case TYPENAME_TYPE:
742      /* There is no need to merge attributes into a TYPENAME_TYPE.
743	 When the type is instantiated it will have whatever
744	 attributes result from the instantiation.  */
745      return t1;
746
747    default:;
748    }
749
750  if (attribute_list_equal (TYPE_ATTRIBUTES (t1), attributes))
751    return t1;
752  else if (attribute_list_equal (TYPE_ATTRIBUTES (t2), attributes))
753    return t2;
754  else
755    return cp_build_type_attribute_variant (t1, attributes);
756}
757
758/* Return the common type of two types.
759   We assume that comptypes has already been done and returned 1;
760   if that isn't so, this may crash.
761
762   This is the type for the result of most arithmetic operations
763   if the operands have the given two types.  */
764
765tree
766common_type (tree t1, tree t2)
767{
768  enum tree_code code1;
769  enum tree_code code2;
770
771  /* If one type is nonsense, bail.  */
772  if (t1 == error_mark_node || t2 == error_mark_node)
773    return error_mark_node;
774
775  code1 = TREE_CODE (t1);
776  code2 = TREE_CODE (t2);
777
778  if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE
779       || code1 == VECTOR_TYPE)
780      && (ARITHMETIC_TYPE_P (t2) || code2 == ENUMERAL_TYPE
781	  || code2 == VECTOR_TYPE))
782    return type_after_usual_arithmetic_conversions (t1, t2);
783
784  else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
785	   || (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
786	   || (TYPE_PTRMEMFUNC_P (t1) && TYPE_PTRMEMFUNC_P (t2)))
787    return composite_pointer_type (t1, t2, error_mark_node, error_mark_node,
788				   "conversion");
789  else
790    gcc_unreachable ();
791}
792
793/* Compare two exception specifier types for exactness or subsetness, if
794   allowed. Returns false for mismatch, true for match (same, or
795   derived and !exact).
796
797   [except.spec] "If a class X ... objects of class X or any class publicly
798   and unambiguously derived from X. Similarly, if a pointer type Y * ...
799   exceptions of type Y * or that are pointers to any type publicly and
800   unambiguously derived from Y. Otherwise a function only allows exceptions
801   that have the same type ..."
802   This does not mention cv qualifiers and is different to what throw
803   [except.throw] and catch [except.catch] will do. They will ignore the
804   top level cv qualifiers, and allow qualifiers in the pointer to class
805   example.
806
807   We implement the letter of the standard.  */
808
809static bool
810comp_except_types (tree a, tree b, bool exact)
811{
812  if (same_type_p (a, b))
813    return true;
814  else if (!exact)
815    {
816      if (cp_type_quals (a) || cp_type_quals (b))
817	return false;
818
819      if (TREE_CODE (a) == POINTER_TYPE
820	  && TREE_CODE (b) == POINTER_TYPE)
821	{
822	  a = TREE_TYPE (a);
823	  b = TREE_TYPE (b);
824	  if (cp_type_quals (a) || cp_type_quals (b))
825	    return false;
826	}
827
828      if (TREE_CODE (a) != RECORD_TYPE
829	  || TREE_CODE (b) != RECORD_TYPE)
830	return false;
831
832      if (PUBLICLY_UNIQUELY_DERIVED_P (a, b))
833	return true;
834    }
835  return false;
836}
837
838/* Return true if TYPE1 and TYPE2 are equivalent exception specifiers.
839   If EXACT is false, T2 can be stricter than T1 (according to 15.4/7),
840   otherwise it must be exact. Exception lists are unordered, but
841   we've already filtered out duplicates. Most lists will be in order,
842   we should try to make use of that.  */
843
844bool
845comp_except_specs (tree t1, tree t2, bool exact)
846{
847  tree probe;
848  tree base;
849  int  length = 0;
850
851  if (t1 == t2)
852    return true;
853
854  if (t1 == NULL_TREE)			   /* T1 is ...  */
855    return t2 == NULL_TREE || !exact;
856  if (!TREE_VALUE (t1))			   /* t1 is EMPTY */
857    return t2 != NULL_TREE && !TREE_VALUE (t2);
858  if (t2 == NULL_TREE)			   /* T2 is ...  */
859    return false;
860  if (TREE_VALUE (t1) && !TREE_VALUE (t2)) /* T2 is EMPTY, T1 is not */
861    return !exact;
862
863  /* Neither set is ... or EMPTY, make sure each part of T2 is in T1.
864     Count how many we find, to determine exactness. For exact matching and
865     ordered T1, T2, this is an O(n) operation, otherwise its worst case is
866     O(nm).  */
867  for (base = t1; t2 != NULL_TREE; t2 = TREE_CHAIN (t2))
868    {
869      for (probe = base; probe != NULL_TREE; probe = TREE_CHAIN (probe))
870	{
871	  tree a = TREE_VALUE (probe);
872	  tree b = TREE_VALUE (t2);
873
874	  if (comp_except_types (a, b, exact))
875	    {
876	      if (probe == base && exact)
877		base = TREE_CHAIN (probe);
878	      length++;
879	      break;
880	    }
881	}
882      if (probe == NULL_TREE)
883	return false;
884    }
885  return !exact || base == NULL_TREE || length == list_length (t1);
886}
887
888/* Compare the array types T1 and T2.  ALLOW_REDECLARATION is true if
889   [] can match [size].  */
890
891static bool
892comp_array_types (tree t1, tree t2, bool allow_redeclaration)
893{
894  tree d1;
895  tree d2;
896  tree max1, max2;
897
898  if (t1 == t2)
899    return true;
900
901  /* The type of the array elements must be the same.  */
902  if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
903    return false;
904
905  d1 = TYPE_DOMAIN (t1);
906  d2 = TYPE_DOMAIN (t2);
907
908  if (d1 == d2)
909    return true;
910
911  /* If one of the arrays is dimensionless, and the other has a
912     dimension, they are of different types.  However, it is valid to
913     write:
914
915       extern int a[];
916       int a[3];
917
918     by [basic.link]:
919
920       declarations for an array object can specify
921       array types that differ by the presence or absence of a major
922       array bound (_dcl.array_).  */
923  if (!d1 || !d2)
924    return allow_redeclaration;
925
926  /* Check that the dimensions are the same.  */
927
928  if (!cp_tree_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2)))
929    return false;
930  max1 = TYPE_MAX_VALUE (d1);
931  max2 = TYPE_MAX_VALUE (d2);
932  if (processing_template_decl && !abi_version_at_least (2)
933      && !value_dependent_expression_p (max1)
934      && !value_dependent_expression_p (max2))
935    {
936      /* With abi-1 we do not fold non-dependent array bounds, (and
937	 consequently mangle them incorrectly).  We must therefore
938	 fold them here, to verify the domains have the same
939	 value.  */
940      max1 = fold (max1);
941      max2 = fold (max2);
942    }
943
944  if (!cp_tree_equal (max1, max2))
945    return false;
946
947  return true;
948}
949
950/* Return true if T1 and T2 are related as allowed by STRICT.  STRICT
951   is a bitwise-or of the COMPARE_* flags.  */
952
953bool
954comptypes (tree t1, tree t2, int strict)
955{
956  if (t1 == t2)
957    return true;
958
959  /* Suppress errors caused by previously reported errors.  */
960  if (t1 == error_mark_node || t2 == error_mark_node)
961    return false;
962
963  gcc_assert (TYPE_P (t1) && TYPE_P (t2));
964
965  /* TYPENAME_TYPEs should be resolved if the qualifying scope is the
966     current instantiation.  */
967  if (TREE_CODE (t1) == TYPENAME_TYPE)
968    {
969      tree resolved = resolve_typename_type (t1, /*only_current_p=*/true);
970
971      if (resolved != error_mark_node)
972	t1 = resolved;
973    }
974
975  if (TREE_CODE (t2) == TYPENAME_TYPE)
976    {
977      tree resolved = resolve_typename_type (t2, /*only_current_p=*/true);
978
979      if (resolved != error_mark_node)
980	t2 = resolved;
981    }
982
983  /* If either type is the internal version of sizetype, use the
984     language version.  */
985  if (TREE_CODE (t1) == INTEGER_TYPE && TYPE_IS_SIZETYPE (t1)
986      && TYPE_ORIG_SIZE_TYPE (t1))
987    t1 = TYPE_ORIG_SIZE_TYPE (t1);
988
989  if (TREE_CODE (t2) == INTEGER_TYPE && TYPE_IS_SIZETYPE (t2)
990      && TYPE_ORIG_SIZE_TYPE (t2))
991    t2 = TYPE_ORIG_SIZE_TYPE (t2);
992
993  if (TYPE_PTRMEMFUNC_P (t1))
994    t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
995  if (TYPE_PTRMEMFUNC_P (t2))
996    t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
997
998  /* Different classes of types can't be compatible.  */
999  if (TREE_CODE (t1) != TREE_CODE (t2))
1000    return false;
1001
1002  /* Qualifiers must match.  For array types, we will check when we
1003     recur on the array element types.  */
1004  if (TREE_CODE (t1) != ARRAY_TYPE
1005      && TYPE_QUALS (t1) != TYPE_QUALS (t2))
1006    return false;
1007  if (TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2))
1008    return false;
1009
1010  /* Allow for two different type nodes which have essentially the same
1011     definition.  Note that we already checked for equality of the type
1012     qualifiers (just above).  */
1013
1014  if (TREE_CODE (t1) != ARRAY_TYPE
1015      && TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
1016    return true;
1017
1018  /* Compare the types.  Break out if they could be the same.  */
1019  switch (TREE_CODE (t1))
1020    {
1021    case TEMPLATE_TEMPLATE_PARM:
1022    case BOUND_TEMPLATE_TEMPLATE_PARM:
1023      if (TEMPLATE_TYPE_IDX (t1) != TEMPLATE_TYPE_IDX (t2)
1024	  || TEMPLATE_TYPE_LEVEL (t1) != TEMPLATE_TYPE_LEVEL (t2))
1025	return false;
1026      if (!comp_template_parms
1027	  (DECL_TEMPLATE_PARMS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t1)),
1028	   DECL_TEMPLATE_PARMS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t2))))
1029	return false;
1030      if (TREE_CODE (t1) == TEMPLATE_TEMPLATE_PARM)
1031	break;
1032      /* Don't check inheritance.  */
1033      strict = COMPARE_STRICT;
1034      /* Fall through.  */
1035
1036    case RECORD_TYPE:
1037    case UNION_TYPE:
1038      if (TYPE_TEMPLATE_INFO (t1) && TYPE_TEMPLATE_INFO (t2)
1039	  && (TYPE_TI_TEMPLATE (t1) == TYPE_TI_TEMPLATE (t2)
1040	      || TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM)
1041	  && comp_template_args (TYPE_TI_ARGS (t1), TYPE_TI_ARGS (t2)))
1042	break;
1043
1044      if ((strict & COMPARE_BASE) && DERIVED_FROM_P (t1, t2))
1045	break;
1046      else if ((strict & COMPARE_DERIVED) && DERIVED_FROM_P (t2, t1))
1047	break;
1048
1049      return false;
1050
1051    case OFFSET_TYPE:
1052      if (!comptypes (TYPE_OFFSET_BASETYPE (t1), TYPE_OFFSET_BASETYPE (t2),
1053		      strict & ~COMPARE_REDECLARATION))
1054	return false;
1055      if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1056	return false;
1057      break;
1058
1059      /* APPLE LOCAL begin blocks 6040305 */
1060      case BLOCK_POINTER_TYPE:
1061	 if (TREE_CODE (t2) == BLOCK_POINTER_TYPE)
1062	 {
1063	   tree pt1 = TREE_TYPE (t1);
1064	   tree pt2 = TREE_TYPE (t2);
1065	   if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (pt1),
1066							  TREE_TYPE (pt2)))
1067	     return false;
1068	   if (!compparms (TYPE_ARG_TYPES (pt1), TYPE_ARG_TYPES (pt2)))
1069	     return false;
1070	   break;
1071	 }
1072	 /* APPLE LOCAL end blocks 6040305 */
1073
1074    case POINTER_TYPE:
1075    case REFERENCE_TYPE:
1076      if (TYPE_MODE (t1) != TYPE_MODE (t2)
1077	  || TYPE_REF_CAN_ALIAS_ALL (t1) != TYPE_REF_CAN_ALIAS_ALL (t2)
1078	  || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1079	return false;
1080      break;
1081
1082    case METHOD_TYPE:
1083    case FUNCTION_TYPE:
1084      if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1085	return false;
1086      if (!compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)))
1087	return false;
1088      break;
1089
1090    case ARRAY_TYPE:
1091      /* Target types must match incl. qualifiers.  */
1092      if (!comp_array_types (t1, t2, !!(strict & COMPARE_REDECLARATION)))
1093	return false;
1094      break;
1095
1096    case TEMPLATE_TYPE_PARM:
1097      if (TEMPLATE_TYPE_IDX (t1) != TEMPLATE_TYPE_IDX (t2)
1098	  || TEMPLATE_TYPE_LEVEL (t1) != TEMPLATE_TYPE_LEVEL (t2))
1099	return false;
1100      break;
1101
1102    case TYPENAME_TYPE:
1103      if (!cp_tree_equal (TYPENAME_TYPE_FULLNAME (t1),
1104			  TYPENAME_TYPE_FULLNAME (t2)))
1105	return false;
1106      if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
1107	return false;
1108      break;
1109
1110    case UNBOUND_CLASS_TEMPLATE:
1111      if (!cp_tree_equal (TYPE_IDENTIFIER (t1), TYPE_IDENTIFIER (t2)))
1112	return false;
1113      if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
1114	return false;
1115      break;
1116
1117    case COMPLEX_TYPE:
1118      if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1119	return false;
1120      break;
1121
1122    case VECTOR_TYPE:
1123      if (TYPE_VECTOR_SUBPARTS (t1) != TYPE_VECTOR_SUBPARTS (t2)
1124	  || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1125	return false;
1126      break;
1127
1128    default:
1129      return false;
1130    }
1131
1132  /* If we get here, we know that from a target independent POV the
1133     types are the same.  Make sure the target attributes are also
1134     the same.  */
1135  return targetm.comp_type_attributes (t1, t2);
1136}
1137
1138/* Returns 1 if TYPE1 is at least as qualified as TYPE2.  */
1139
1140bool
1141at_least_as_qualified_p (tree type1, tree type2)
1142{
1143  int q1 = cp_type_quals (type1);
1144  int q2 = cp_type_quals (type2);
1145
1146  /* All qualifiers for TYPE2 must also appear in TYPE1.  */
1147  return (q1 & q2) == q2;
1148}
1149
1150/* Returns 1 if TYPE1 is more cv-qualified than TYPE2, -1 if TYPE2 is
1151   more cv-qualified that TYPE1, and 0 otherwise.  */
1152
1153int
1154comp_cv_qualification (tree type1, tree type2)
1155{
1156  int q1 = cp_type_quals (type1);
1157  int q2 = cp_type_quals (type2);
1158
1159  if (q1 == q2)
1160    return 0;
1161
1162  if ((q1 & q2) == q2)
1163    return 1;
1164  else if ((q1 & q2) == q1)
1165    return -1;
1166
1167  return 0;
1168}
1169
1170/* Returns 1 if the cv-qualification signature of TYPE1 is a proper
1171   subset of the cv-qualification signature of TYPE2, and the types
1172   are similar.  Returns -1 if the other way 'round, and 0 otherwise.  */
1173
1174int
1175comp_cv_qual_signature (tree type1, tree type2)
1176{
1177  if (comp_ptr_ttypes_real (type2, type1, -1))
1178    return 1;
1179  else if (comp_ptr_ttypes_real (type1, type2, -1))
1180    return -1;
1181  else
1182    return 0;
1183}
1184
1185/* If two types share a common base type, return that basetype.
1186   If there is not a unique most-derived base type, this function
1187   returns ERROR_MARK_NODE.  */
1188
1189static tree
1190common_base_type (tree tt1, tree tt2)
1191{
1192  tree best = NULL_TREE;
1193  int i;
1194
1195  /* If one is a baseclass of another, that's good enough.  */
1196  if (UNIQUELY_DERIVED_FROM_P (tt1, tt2))
1197    return tt1;
1198  if (UNIQUELY_DERIVED_FROM_P (tt2, tt1))
1199    return tt2;
1200
1201  /* Otherwise, try to find a unique baseclass of TT1
1202     that is shared by TT2, and follow that down.  */
1203  for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (tt1))-1; i >= 0; i--)
1204    {
1205      tree basetype = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (tt1), i));
1206      tree trial = common_base_type (basetype, tt2);
1207
1208      if (trial)
1209	{
1210	  if (trial == error_mark_node)
1211	    return trial;
1212	  if (best == NULL_TREE)
1213	    best = trial;
1214	  else if (best != trial)
1215	    return error_mark_node;
1216	}
1217    }
1218
1219  /* Same for TT2.  */
1220  for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (tt2))-1; i >= 0; i--)
1221    {
1222      tree basetype = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (tt2), i));
1223      tree trial = common_base_type (tt1, basetype);
1224
1225      if (trial)
1226	{
1227	  if (trial == error_mark_node)
1228	    return trial;
1229	  if (best == NULL_TREE)
1230	    best = trial;
1231	  else if (best != trial)
1232	    return error_mark_node;
1233	}
1234    }
1235  return best;
1236}
1237
1238/* Subroutines of `comptypes'.  */
1239
1240/* Return true if two parameter type lists PARMS1 and PARMS2 are
1241   equivalent in the sense that functions with those parameter types
1242   can have equivalent types.  The two lists must be equivalent,
1243   element by element.  */
1244
1245bool
1246compparms (tree parms1, tree parms2)
1247{
1248  tree t1, t2;
1249
1250  /* An unspecified parmlist matches any specified parmlist
1251     whose argument types don't need default promotions.  */
1252
1253  for (t1 = parms1, t2 = parms2;
1254       t1 || t2;
1255       t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1256    {
1257      /* If one parmlist is shorter than the other,
1258	 they fail to match.  */
1259      if (!t1 || !t2)
1260	return false;
1261      if (!same_type_p (TREE_VALUE (t1), TREE_VALUE (t2)))
1262	return false;
1263    }
1264  return true;
1265}
1266
1267
1268/* Process a sizeof or alignof expression where the operand is a
1269   type.  */
1270
1271tree
1272cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
1273{
1274  tree value;
1275  bool dependent_p;
1276
1277  gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
1278  if (type == error_mark_node)
1279    return error_mark_node;
1280
1281  type = non_reference (type);
1282  if (TREE_CODE (type) == METHOD_TYPE)
1283    {
1284      if (complain && (pedantic || warn_pointer_arith))
1285	pedwarn ("invalid application of %qs to a member function",
1286		 operator_name_info[(int) op].name);
1287      value = size_one_node;
1288    }
1289
1290  dependent_p = dependent_type_p (type);
1291  if (!dependent_p)
1292    complete_type (type);
1293  if (dependent_p
1294      /* VLA types will have a non-constant size.  In the body of an
1295	 uninstantiated template, we don't need to try to compute the
1296	 value, because the sizeof expression is not an integral
1297	 constant expression in that case.  And, if we do try to
1298	 compute the value, we'll likely end up with SAVE_EXPRs, which
1299	 the template substitution machinery does not expect to see.  */
1300      || (processing_template_decl
1301	  && COMPLETE_TYPE_P (type)
1302	  && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
1303    {
1304      value = build_min (op, size_type_node, type);
1305      TREE_READONLY (value) = 1;
1306      return value;
1307    }
1308
1309  return c_sizeof_or_alignof_type (complete_type (type),
1310				   op == SIZEOF_EXPR,
1311				   complain);
1312}
1313
1314/* Process a sizeof expression where the operand is an expression.  */
1315
1316static tree
1317cxx_sizeof_expr (tree e)
1318{
1319  if (e == error_mark_node)
1320    return error_mark_node;
1321
1322  if (processing_template_decl)
1323    {
1324      e = build_min (SIZEOF_EXPR, size_type_node, e);
1325      TREE_SIDE_EFFECTS (e) = 0;
1326      TREE_READONLY (e) = 1;
1327
1328      return e;
1329    }
1330
1331  if (TREE_CODE (e) == COMPONENT_REF
1332      && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL
1333      && DECL_C_BIT_FIELD (TREE_OPERAND (e, 1)))
1334    {
1335      error ("invalid application of %<sizeof%> to a bit-field");
1336      e = char_type_node;
1337    }
1338  else if (is_overloaded_fn (e))
1339    {
1340      pedwarn ("ISO C++ forbids applying %<sizeof%> to an expression of "
1341	       "function type");
1342      e = char_type_node;
1343    }
1344  else if (type_unknown_p (e))
1345    {
1346      cxx_incomplete_type_error (e, TREE_TYPE (e));
1347      e = char_type_node;
1348    }
1349  else
1350    e = TREE_TYPE (e);
1351
1352  return cxx_sizeof_or_alignof_type (e, SIZEOF_EXPR, true);
1353}
1354
1355/* Implement the __alignof keyword: Return the minimum required
1356   alignment of E, measured in bytes.  For VAR_DECL's and
1357   FIELD_DECL's return DECL_ALIGN (which can be set from an
1358   "aligned" __attribute__ specification).  */
1359
1360static tree
1361cxx_alignof_expr (tree e)
1362{
1363  tree t;
1364
1365  if (e == error_mark_node)
1366    return error_mark_node;
1367
1368  if (processing_template_decl)
1369    {
1370      e = build_min (ALIGNOF_EXPR, size_type_node, e);
1371      TREE_SIDE_EFFECTS (e) = 0;
1372      TREE_READONLY (e) = 1;
1373
1374      return e;
1375    }
1376
1377  if (TREE_CODE (e) == VAR_DECL)
1378    t = size_int (DECL_ALIGN_UNIT (e));
1379  else if (TREE_CODE (e) == COMPONENT_REF
1380	   && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL
1381	   && DECL_C_BIT_FIELD (TREE_OPERAND (e, 1)))
1382    {
1383      error ("invalid application of %<__alignof%> to a bit-field");
1384      t = size_one_node;
1385    }
1386  else if (TREE_CODE (e) == COMPONENT_REF
1387	   && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL)
1388    t = size_int (DECL_ALIGN_UNIT (TREE_OPERAND (e, 1)));
1389  else if (is_overloaded_fn (e))
1390    {
1391      pedwarn ("ISO C++ forbids applying %<__alignof%> to an expression of "
1392	       "function type");
1393      if (TREE_CODE (e) == FUNCTION_DECL)
1394	t = size_int (DECL_ALIGN_UNIT (e));
1395      else
1396	t = size_one_node;
1397    }
1398  else if (type_unknown_p (e))
1399    {
1400      cxx_incomplete_type_error (e, TREE_TYPE (e));
1401      t = size_one_node;
1402    }
1403  else
1404    return cxx_sizeof_or_alignof_type (TREE_TYPE (e), ALIGNOF_EXPR, true);
1405
1406  return fold_convert (size_type_node, t);
1407}
1408
1409/* Process a sizeof or alignof expression E with code OP where the operand
1410   is an expression.  */
1411
1412tree
1413cxx_sizeof_or_alignof_expr (tree e, enum tree_code op)
1414{
1415  if (op == SIZEOF_EXPR)
1416    return cxx_sizeof_expr (e);
1417  else
1418    return cxx_alignof_expr (e);
1419}
1420
1421/* EXPR is being used in a context that is not a function call.
1422   Enforce:
1423
1424     [expr.ref]
1425
1426     The expression can be used only as the left-hand operand of a
1427     member function call.
1428
1429     [expr.mptr.operator]
1430
1431     If the result of .* or ->* is a function, then that result can be
1432     used only as the operand for the function call operator ().
1433
1434   by issuing an error message if appropriate.  Returns true iff EXPR
1435   violates these rules.  */
1436
1437bool
1438invalid_nonstatic_memfn_p (tree expr)
1439{
1440  if (TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE)
1441    {
1442      error ("invalid use of non-static member function");
1443      return true;
1444    }
1445  return false;
1446}
1447
1448/* If EXP is a reference to a bitfield, and the type of EXP does not
1449   match the declared type of the bitfield, return the declared type
1450   of the bitfield.  Otherwise, return NULL_TREE.  */
1451
1452tree
1453is_bitfield_expr_with_lowered_type (tree exp)
1454{
1455  switch (TREE_CODE (exp))
1456    {
1457    case COND_EXPR:
1458      if (!is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1)))
1459	return NULL_TREE;
1460      return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 2));
1461
1462    case COMPOUND_EXPR:
1463      return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1));
1464
1465    case MODIFY_EXPR:
1466    case SAVE_EXPR:
1467      return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0));
1468
1469    case COMPONENT_REF:
1470      {
1471	tree field;
1472
1473	field = TREE_OPERAND (exp, 1);
1474	if (TREE_CODE (field) != FIELD_DECL || !DECL_C_BIT_FIELD (field))
1475	  return NULL_TREE;
1476	if (same_type_ignoring_top_level_qualifiers_p
1477	    (TREE_TYPE (exp), DECL_BIT_FIELD_TYPE (field)))
1478	  return NULL_TREE;
1479	return DECL_BIT_FIELD_TYPE (field);
1480      }
1481
1482    default:
1483      return NULL_TREE;
1484    }
1485}
1486
1487/* Like is_bitfield_with_lowered_type, except that if EXP is not a
1488   bitfield with a lowered type, the type of EXP is returned, rather
1489   than NULL_TREE.  */
1490
1491tree
1492unlowered_expr_type (tree exp)
1493{
1494  tree type;
1495
1496  type = is_bitfield_expr_with_lowered_type (exp);
1497  if (!type)
1498    type = TREE_TYPE (exp);
1499
1500  return type;
1501}
1502
1503/* Perform the conversions in [expr] that apply when an lvalue appears
1504   in an rvalue context: the lvalue-to-rvalue, array-to-pointer, and
1505   function-to-pointer conversions.  In addition, manifest constants
1506   are replaced by their values, and bitfield references are converted
1507   to their declared types.
1508
1509   Although the returned value is being used as an rvalue, this
1510   function does not wrap the returned expression in a
1511   NON_LVALUE_EXPR; the caller is expected to be mindful of the fact
1512   that the return value is no longer an lvalue.  */
1513
1514tree
1515decay_conversion (tree exp)
1516{
1517  tree type;
1518  enum tree_code code;
1519
1520  type = TREE_TYPE (exp);
1521  if (type == error_mark_node)
1522    return error_mark_node;
1523
1524  if (type_unknown_p (exp))
1525    {
1526      cxx_incomplete_type_error (exp, TREE_TYPE (exp));
1527      return error_mark_node;
1528    }
1529
1530  exp = decl_constant_value (exp);
1531  if (error_operand_p (exp))
1532    return error_mark_node;
1533
1534  /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
1535     Leave such NOP_EXPRs, since RHS is being used in non-lvalue context.  */
1536  code = TREE_CODE (type);
1537  if (code == VOID_TYPE)
1538    {
1539      error ("void value not ignored as it ought to be");
1540      return error_mark_node;
1541    }
1542  if (invalid_nonstatic_memfn_p (exp))
1543    return error_mark_node;
1544  if (code == FUNCTION_TYPE || is_overloaded_fn (exp))
1545    return build_unary_op (ADDR_EXPR, exp, 0);
1546  if (code == ARRAY_TYPE)
1547    {
1548      tree adr;
1549      tree ptrtype;
1550
1551      if (TREE_CODE (exp) == INDIRECT_REF)
1552	return build_nop (build_pointer_type (TREE_TYPE (type)),
1553			  TREE_OPERAND (exp, 0));
1554
1555      if (TREE_CODE (exp) == COMPOUND_EXPR)
1556	{
1557	  tree op1 = decay_conversion (TREE_OPERAND (exp, 1));
1558	  return build2 (COMPOUND_EXPR, TREE_TYPE (op1),
1559			 TREE_OPERAND (exp, 0), op1);
1560	}
1561
1562      if (!lvalue_p (exp)
1563	  && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp)))
1564	{
1565	  error ("invalid use of non-lvalue array");
1566	  return error_mark_node;
1567	}
1568
1569      ptrtype = build_pointer_type (TREE_TYPE (type));
1570
1571      if (TREE_CODE (exp) == VAR_DECL)
1572	{
1573	  if (!cxx_mark_addressable (exp))
1574	    return error_mark_node;
1575	  adr = build_nop (ptrtype, build_address (exp));
1576	  return adr;
1577	}
1578      /* This way is better for a COMPONENT_REF since it can
1579	 simplify the offset for a component.  */
1580      adr = build_unary_op (ADDR_EXPR, exp, 1);
1581      return cp_convert (ptrtype, adr);
1582    }
1583
1584  /* If a bitfield is used in a context where integral promotion
1585     applies, then the caller is expected to have used
1586     default_conversion.  That function promotes bitfields correctly
1587     before calling this function.  At this point, if we have a
1588     bitfield referenced, we may assume that is not subject to
1589     promotion, and that, therefore, the type of the resulting rvalue
1590     is the declared type of the bitfield.  */
1591  exp = convert_bitfield_to_declared_type (exp);
1592
1593  /* We do not call rvalue() here because we do not want to wrap EXP
1594     in a NON_LVALUE_EXPR.  */
1595
1596  /* [basic.lval]
1597
1598     Non-class rvalues always have cv-unqualified types.  */
1599  type = TREE_TYPE (exp);
1600  if (!CLASS_TYPE_P (type) && cp_type_quals (type))
1601    exp = build_nop (TYPE_MAIN_VARIANT (type), exp);
1602
1603  return exp;
1604}
1605
1606/* Perform prepatory conversions, as part of the "usual arithmetic
1607   conversions".  In particular, as per [expr]:
1608
1609     Whenever an lvalue expression appears as an operand of an
1610     operator that expects the rvalue for that operand, the
1611     lvalue-to-rvalue, array-to-pointer, or function-to-pointer
1612     standard conversions are applied to convert the expression to an
1613     rvalue.
1614
1615   In addition, we perform integral promotions here, as those are
1616   applied to both operands to a binary operator before determining
1617   what additional conversions should apply.  */
1618
1619tree
1620default_conversion (tree exp)
1621{
1622  /* Perform the integral promotions first so that bitfield
1623     expressions (which may promote to "int", even if the bitfield is
1624     declared "unsigned") are promoted correctly.  */
1625  if (INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (exp)))
1626    exp = perform_integral_promotions (exp);
1627  /* Perform the other conversions.  */
1628  exp = decay_conversion (exp);
1629
1630  return exp;
1631}
1632
1633/* EXPR is an expression with an integral or enumeration type.
1634   Perform the integral promotions in [conv.prom], and return the
1635   converted value.  */
1636
1637tree
1638perform_integral_promotions (tree expr)
1639{
1640  tree type;
1641  tree promoted_type;
1642
1643  /* [conv.prom]
1644
1645     If the bitfield has an enumerated type, it is treated as any
1646     other value of that type for promotion purposes.  */
1647  type = is_bitfield_expr_with_lowered_type (expr);
1648  if (!type || TREE_CODE (type) != ENUMERAL_TYPE)
1649    type = TREE_TYPE (expr);
1650  gcc_assert (INTEGRAL_OR_ENUMERATION_TYPE_P (type));
1651  promoted_type = type_promotes_to (type);
1652  if (type != promoted_type)
1653    expr = cp_convert (promoted_type, expr);
1654  return expr;
1655}
1656
1657/* Take the address of an inline function without setting TREE_ADDRESSABLE
1658   or TREE_USED.  */
1659
1660tree
1661inline_conversion (tree exp)
1662{
1663  if (TREE_CODE (exp) == FUNCTION_DECL)
1664    exp = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (exp)), exp);
1665
1666  return exp;
1667}
1668
1669/* Returns nonzero iff exp is a STRING_CST or the result of applying
1670   decay_conversion to one.  */
1671
1672int
1673string_conv_p (tree totype, tree exp, int warn)
1674{
1675  tree t;
1676
1677  if (TREE_CODE (totype) != POINTER_TYPE)
1678    return 0;
1679
1680  t = TREE_TYPE (totype);
1681  if (!same_type_p (t, char_type_node)
1682      && !same_type_p (t, wchar_type_node))
1683    return 0;
1684
1685  if (TREE_CODE (exp) == STRING_CST)
1686    {
1687      /* Make sure that we don't try to convert between char and wchar_t.  */
1688      if (!same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (exp))), t))
1689	return 0;
1690    }
1691  else
1692    {
1693      /* Is this a string constant which has decayed to 'const char *'?  */
1694      t = build_pointer_type (build_qualified_type (t, TYPE_QUAL_CONST));
1695      if (!same_type_p (TREE_TYPE (exp), t))
1696	return 0;
1697      STRIP_NOPS (exp);
1698      if (TREE_CODE (exp) != ADDR_EXPR
1699	  || TREE_CODE (TREE_OPERAND (exp, 0)) != STRING_CST)
1700	return 0;
1701    }
1702
1703  /* This warning is not very useful, as it complains about printf.  */
1704  if (warn)
1705    warning (OPT_Wwrite_strings,
1706	     "deprecated conversion from string constant to %qT",
1707	     totype);
1708
1709  return 1;
1710}
1711
1712/* Given a COND_EXPR, MIN_EXPR, or MAX_EXPR in T, return it in a form that we
1713   can, for example, use as an lvalue.  This code used to be in
1714   unary_complex_lvalue, but we needed it to deal with `a = (d == c) ? b : c'
1715   expressions, where we're dealing with aggregates.  But now it's again only
1716   called from unary_complex_lvalue.  The case (in particular) that led to
1717   this was with CODE == ADDR_EXPR, since it's not an lvalue when we'd
1718   get it there.  */
1719
1720static tree
1721rationalize_conditional_expr (enum tree_code code, tree t)
1722{
1723  /* For MIN_EXPR or MAX_EXPR, fold-const.c has arranged things so that
1724     the first operand is always the one to be used if both operands
1725     are equal, so we know what conditional expression this used to be.  */
1726  if (TREE_CODE (t) == MIN_EXPR || TREE_CODE (t) == MAX_EXPR)
1727    {
1728      tree op0 = TREE_OPERAND (t, 0);
1729      tree op1 = TREE_OPERAND (t, 1);
1730
1731      /* The following code is incorrect if either operand side-effects.  */
1732      gcc_assert (!TREE_SIDE_EFFECTS (op0)
1733		  && !TREE_SIDE_EFFECTS (op1));
1734      return
1735	build_conditional_expr (build_x_binary_op ((TREE_CODE (t) == MIN_EXPR
1736						    ? LE_EXPR : GE_EXPR),
1737						   op0, TREE_CODE (op0),
1738						   op1, TREE_CODE (op1),
1739						   /*overloaded_p=*/NULL),
1740			    build_unary_op (code, op0, 0),
1741			    build_unary_op (code, op1, 0));
1742    }
1743
1744  return
1745    build_conditional_expr (TREE_OPERAND (t, 0),
1746			    build_unary_op (code, TREE_OPERAND (t, 1), 0),
1747			    build_unary_op (code, TREE_OPERAND (t, 2), 0));
1748}
1749
1750/* Given the TYPE of an anonymous union field inside T, return the
1751   FIELD_DECL for the field.  If not found return NULL_TREE.  Because
1752   anonymous unions can nest, we must also search all anonymous unions
1753   that are directly reachable.  */
1754
1755tree
1756lookup_anon_field (tree t, tree type)
1757{
1758  tree field;
1759
1760  for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field))
1761    {
1762      if (TREE_STATIC (field))
1763	continue;
1764      if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
1765	continue;
1766
1767      /* If we find it directly, return the field.  */
1768      if (DECL_NAME (field) == NULL_TREE
1769	  && type == TYPE_MAIN_VARIANT (TREE_TYPE (field)))
1770	{
1771	  return field;
1772	}
1773
1774      /* Otherwise, it could be nested, search harder.  */
1775      if (DECL_NAME (field) == NULL_TREE
1776	  && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
1777	{
1778	  tree subfield = lookup_anon_field (TREE_TYPE (field), type);
1779	  if (subfield)
1780	    return subfield;
1781	}
1782    }
1783  return NULL_TREE;
1784}
1785
1786/* Build an expression representing OBJECT.MEMBER.  OBJECT is an
1787   expression; MEMBER is a DECL or baselink.  If ACCESS_PATH is
1788   non-NULL, it indicates the path to the base used to name MEMBER.
1789   If PRESERVE_REFERENCE is true, the expression returned will have
1790   REFERENCE_TYPE if the MEMBER does.  Otherwise, the expression
1791   returned will have the type referred to by the reference.
1792
1793   This function does not perform access control; that is either done
1794   earlier by the parser when the name of MEMBER is resolved to MEMBER
1795   itself, or later when overload resolution selects one of the
1796   functions indicated by MEMBER.  */
1797
1798tree
1799build_class_member_access_expr (tree object, tree member,
1800				tree access_path, bool preserve_reference)
1801{
1802  tree object_type;
1803  tree member_scope;
1804  tree result = NULL_TREE;
1805
1806  if (error_operand_p (object) || error_operand_p (member))
1807    return error_mark_node;
1808
1809  gcc_assert (DECL_P (member) || BASELINK_P (member));
1810
1811  /* [expr.ref]
1812
1813     The type of the first expression shall be "class object" (of a
1814     complete type).  */
1815  object_type = TREE_TYPE (object);
1816  if (!currently_open_class (object_type)
1817      && !complete_type_or_else (object_type, object))
1818    return error_mark_node;
1819  if (!CLASS_TYPE_P (object_type))
1820    {
1821      error ("request for member %qD in %qE, which is of non-class type %qT",
1822	     member, object, object_type);
1823      return error_mark_node;
1824    }
1825
1826  /* The standard does not seem to actually say that MEMBER must be a
1827     member of OBJECT_TYPE.  However, that is clearly what is
1828     intended.  */
1829  if (DECL_P (member))
1830    {
1831      member_scope = DECL_CLASS_CONTEXT (member);
1832      mark_used (member);
1833      if (TREE_DEPRECATED (member))
1834	warn_deprecated_use (member);
1835    }
1836  else
1837    member_scope = BINFO_TYPE (BASELINK_BINFO (member));
1838  /* If MEMBER is from an anonymous aggregate, MEMBER_SCOPE will
1839     presently be the anonymous union.  Go outwards until we find a
1840     type related to OBJECT_TYPE.  */
1841  while (ANON_AGGR_TYPE_P (member_scope)
1842	 && !same_type_ignoring_top_level_qualifiers_p (member_scope,
1843							object_type))
1844    member_scope = TYPE_CONTEXT (member_scope);
1845  if (!member_scope || !DERIVED_FROM_P (member_scope, object_type))
1846    {
1847      if (TREE_CODE (member) == FIELD_DECL)
1848	error ("invalid use of nonstatic data member %qE", member);
1849      else
1850	error ("%qD is not a member of %qT", member, object_type);
1851      return error_mark_node;
1852    }
1853
1854  /* Transform `(a, b).x' into `(*(a, &b)).x', `(a ? b : c).x' into
1855     `(*(a ?  &b : &c)).x', and so on.  A COND_EXPR is only an lvalue
1856     in the frontend; only _DECLs and _REFs are lvalues in the backend.  */
1857  {
1858    tree temp = unary_complex_lvalue (ADDR_EXPR, object);
1859    if (temp)
1860      object = build_indirect_ref (temp, NULL);
1861  }
1862
1863  /* In [expr.ref], there is an explicit list of the valid choices for
1864     MEMBER.  We check for each of those cases here.  */
1865  if (TREE_CODE (member) == VAR_DECL)
1866    {
1867      /* A static data member.  */
1868      result = member;
1869      /* If OBJECT has side-effects, they are supposed to occur.  */
1870      if (TREE_SIDE_EFFECTS (object))
1871	result = build2 (COMPOUND_EXPR, TREE_TYPE (result), object, result);
1872    }
1873  else if (TREE_CODE (member) == FIELD_DECL)
1874    {
1875      /* A non-static data member.  */
1876      bool null_object_p;
1877      int type_quals;
1878      tree member_type;
1879
1880      null_object_p = (TREE_CODE (object) == INDIRECT_REF
1881		       && integer_zerop (TREE_OPERAND (object, 0)));
1882
1883      /* Convert OBJECT to the type of MEMBER.  */
1884      if (!same_type_p (TYPE_MAIN_VARIANT (object_type),
1885			TYPE_MAIN_VARIANT (member_scope)))
1886	{
1887	  tree binfo;
1888	  base_kind kind;
1889
1890	  binfo = lookup_base (access_path ? access_path : object_type,
1891			       member_scope, ba_unique,  &kind);
1892	  if (binfo == error_mark_node)
1893	    return error_mark_node;
1894
1895	  /* It is invalid to try to get to a virtual base of a
1896	     NULL object.  The most common cause is invalid use of
1897	     offsetof macro.  */
1898	  if (null_object_p && kind == bk_via_virtual)
1899	    {
1900	      error ("invalid access to non-static data member %qD of "
1901		     "NULL object",
1902		     member);
1903	      error ("(perhaps the %<offsetof%> macro was used incorrectly)");
1904	      return error_mark_node;
1905	    }
1906
1907	  /* Convert to the base.  */
1908	  object = build_base_path (PLUS_EXPR, object, binfo,
1909				    /*nonnull=*/1);
1910	  /* If we found the base successfully then we should be able
1911	     to convert to it successfully.  */
1912	  gcc_assert (object != error_mark_node);
1913	}
1914
1915      /* Complain about other invalid uses of offsetof, even though they will
1916	 give the right answer.  Note that we complain whether or not they
1917	 actually used the offsetof macro, since there's no way to know at this
1918	 point.  So we just give a warning, instead of a pedwarn.  */
1919      /* Do not produce this warning for base class field references, because
1920	 we know for a fact that didn't come from offsetof.  This does occur
1921	 in various testsuite cases where a null object is passed where a
1922	 vtable access is required.  */
1923      if (null_object_p && warn_invalid_offsetof
1924	  && CLASSTYPE_NON_POD_P (object_type)
1925	  && !DECL_FIELD_IS_BASE (member)
1926	  && !skip_evaluation)
1927	{
1928	  warning (0, "invalid access to non-static data member %qD of NULL object",
1929		   member);
1930	  warning (0, "(perhaps the %<offsetof%> macro was used incorrectly)");
1931	}
1932
1933      /* If MEMBER is from an anonymous aggregate, we have converted
1934	 OBJECT so that it refers to the class containing the
1935	 anonymous union.  Generate a reference to the anonymous union
1936	 itself, and recur to find MEMBER.  */
1937      if (ANON_AGGR_TYPE_P (DECL_CONTEXT (member))
1938	  /* When this code is called from build_field_call, the
1939	     object already has the type of the anonymous union.
1940	     That is because the COMPONENT_REF was already
1941	     constructed, and was then disassembled before calling
1942	     build_field_call.  After the function-call code is
1943	     cleaned up, this waste can be eliminated.  */
1944	  && (!same_type_ignoring_top_level_qualifiers_p
1945	      (TREE_TYPE (object), DECL_CONTEXT (member))))
1946	{
1947	  tree anonymous_union;
1948
1949	  anonymous_union = lookup_anon_field (TREE_TYPE (object),
1950					       DECL_CONTEXT (member));
1951	  object = build_class_member_access_expr (object,
1952						   anonymous_union,
1953						   /*access_path=*/NULL_TREE,
1954						   preserve_reference);
1955	}
1956
1957      /* Compute the type of the field, as described in [expr.ref].  */
1958      type_quals = TYPE_UNQUALIFIED;
1959      member_type = TREE_TYPE (member);
1960      if (TREE_CODE (member_type) != REFERENCE_TYPE)
1961	{
1962	  type_quals = (cp_type_quals (member_type)
1963			| cp_type_quals (object_type));
1964
1965	  /* A field is const (volatile) if the enclosing object, or the
1966	     field itself, is const (volatile).  But, a mutable field is
1967	     not const, even within a const object.  */
1968	  if (DECL_MUTABLE_P (member))
1969	    type_quals &= ~TYPE_QUAL_CONST;
1970	  member_type = cp_build_qualified_type (member_type, type_quals);
1971	}
1972
1973      result = build3 (COMPONENT_REF, member_type, object, member,
1974		       NULL_TREE);
1975      result = fold_if_not_in_template (result);
1976
1977      /* Mark the expression const or volatile, as appropriate.  Even
1978	 though we've dealt with the type above, we still have to mark the
1979	 expression itself.  */
1980      if (type_quals & TYPE_QUAL_CONST)
1981	TREE_READONLY (result) = 1;
1982      if (type_quals & TYPE_QUAL_VOLATILE)
1983	TREE_THIS_VOLATILE (result) = 1;
1984    }
1985  else if (BASELINK_P (member))
1986    {
1987      /* The member is a (possibly overloaded) member function.  */
1988      tree functions;
1989      tree type;
1990
1991      /* If the MEMBER is exactly one static member function, then we
1992	 know the type of the expression.  Otherwise, we must wait
1993	 until overload resolution has been performed.  */
1994      functions = BASELINK_FUNCTIONS (member);
1995      if (TREE_CODE (functions) == FUNCTION_DECL
1996	  && DECL_STATIC_FUNCTION_P (functions))
1997	type = TREE_TYPE (functions);
1998      else
1999	type = unknown_type_node;
2000      /* Note that we do not convert OBJECT to the BASELINK_BINFO
2001	 base.  That will happen when the function is called.  */
2002      result = build3 (COMPONENT_REF, type, object, member, NULL_TREE);
2003    }
2004  else if (TREE_CODE (member) == CONST_DECL)
2005    {
2006      /* The member is an enumerator.  */
2007      result = member;
2008      /* If OBJECT has side-effects, they are supposed to occur.  */
2009      if (TREE_SIDE_EFFECTS (object))
2010	result = build2 (COMPOUND_EXPR, TREE_TYPE (result),
2011			 object, result);
2012    }
2013  else
2014    {
2015      error ("invalid use of %qD", member);
2016      return error_mark_node;
2017    }
2018
2019  if (!preserve_reference)
2020    /* [expr.ref]
2021
2022       If E2 is declared to have type "reference to T", then ... the
2023       type of E1.E2 is T.  */
2024    result = convert_from_reference (result);
2025
2026  return result;
2027}
2028
2029/* Return the destructor denoted by OBJECT.SCOPE::~DTOR_NAME, or, if
2030   SCOPE is NULL, by OBJECT.~DTOR_NAME.  */
2031
2032static tree
2033lookup_destructor (tree object, tree scope, tree dtor_name)
2034{
2035  tree object_type = TREE_TYPE (object);
2036  tree dtor_type = TREE_OPERAND (dtor_name, 0);
2037  tree expr;
2038
2039  if (scope && !check_dtor_name (scope, dtor_type))
2040    {
2041      error ("qualified type %qT does not match destructor name ~%qT",
2042	     scope, dtor_type);
2043      return error_mark_node;
2044    }
2045  if (!DERIVED_FROM_P (dtor_type, TYPE_MAIN_VARIANT (object_type)))
2046    {
2047      error ("the type being destroyed is %qT, but the destructor refers to %qT",
2048	     TYPE_MAIN_VARIANT (object_type), dtor_type);
2049      return error_mark_node;
2050    }
2051  expr = lookup_member (dtor_type, complete_dtor_identifier,
2052			/*protect=*/1, /*want_type=*/false);
2053  expr = (adjust_result_of_qualified_name_lookup
2054	  (expr, dtor_type, object_type));
2055  return expr;
2056}
2057
2058/* An expression of the form "A::template B" has been resolved to
2059   DECL.  Issue a diagnostic if B is not a template or template
2060   specialization.  */
2061
2062void
2063check_template_keyword (tree decl)
2064{
2065  /* The standard says:
2066
2067      [temp.names]
2068
2069      If a name prefixed by the keyword template is not a member
2070      template, the program is ill-formed.
2071
2072     DR 228 removed the restriction that the template be a member
2073     template.
2074
2075     DR 96, if accepted would add the further restriction that explicit
2076     template arguments must be provided if the template keyword is
2077     used, but, as of 2005-10-16, that DR is still in "drafting".  If
2078     this DR is accepted, then the semantic checks here can be
2079     simplified, as the entity named must in fact be a template
2080     specialization, rather than, as at present, a set of overloaded
2081     functions containing at least one template function.  */
2082  if (TREE_CODE (decl) != TEMPLATE_DECL
2083      && TREE_CODE (decl) != TEMPLATE_ID_EXPR)
2084    {
2085      if (!is_overloaded_fn (decl))
2086	pedwarn ("%qD is not a template", decl);
2087      else
2088	{
2089	  tree fns;
2090	  fns = decl;
2091	  if (BASELINK_P (fns))
2092	    fns = BASELINK_FUNCTIONS (fns);
2093	  while (fns)
2094	    {
2095	      tree fn = OVL_CURRENT (fns);
2096	      if (TREE_CODE (fn) == TEMPLATE_DECL
2097		  || TREE_CODE (fn) == TEMPLATE_ID_EXPR)
2098		break;
2099	      if (TREE_CODE (fn) == FUNCTION_DECL
2100		  && DECL_USE_TEMPLATE (fn)
2101		  && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (fn)))
2102		break;
2103	      fns = OVL_NEXT (fns);
2104	    }
2105	  if (!fns)
2106	    pedwarn ("%qD is not a template", decl);
2107	}
2108    }
2109}
2110
2111/* This function is called by the parser to process a class member
2112   access expression of the form OBJECT.NAME.  NAME is a node used by
2113   the parser to represent a name; it is not yet a DECL.  It may,
2114   however, be a BASELINK where the BASELINK_FUNCTIONS is a
2115   TEMPLATE_ID_EXPR.  Templates must be looked up by the parser, and
2116   there is no reason to do the lookup twice, so the parser keeps the
2117   BASELINK.  TEMPLATE_P is true iff NAME was explicitly declared to
2118   be a template via the use of the "A::template B" syntax.  */
2119
2120tree
2121finish_class_member_access_expr (tree object, tree name, bool template_p)
2122{
2123  tree expr;
2124  tree object_type;
2125  tree member;
2126  tree access_path = NULL_TREE;
2127  tree orig_object = object;
2128  tree orig_name = name;
2129
2130  if (object == error_mark_node || name == error_mark_node)
2131    return error_mark_node;
2132
2133  /* If OBJECT is an ObjC class instance, we must obey ObjC access rules.  */
2134  if (!objc_is_public (object, name))
2135    return error_mark_node;
2136
2137  object_type = TREE_TYPE (object);
2138
2139  if (processing_template_decl)
2140    {
2141      if (/* If OBJECT_TYPE is dependent, so is OBJECT.NAME.  */
2142	  dependent_type_p (object_type)
2143	  /* If NAME is just an IDENTIFIER_NODE, then the expression
2144	     is dependent.  */
2145	  || TREE_CODE (object) == IDENTIFIER_NODE
2146	  /* If NAME is "f<args>", where either 'f' or 'args' is
2147	     dependent, then the expression is dependent.  */
2148	  || (TREE_CODE (name) == TEMPLATE_ID_EXPR
2149	      && dependent_template_id_p (TREE_OPERAND (name, 0),
2150					  TREE_OPERAND (name, 1)))
2151	  /* If NAME is "T::X" where "T" is dependent, then the
2152	     expression is dependent.  */
2153	  || (TREE_CODE (name) == SCOPE_REF
2154	      && TYPE_P (TREE_OPERAND (name, 0))
2155	      && dependent_type_p (TREE_OPERAND (name, 0))))
2156	return build_min_nt (COMPONENT_REF, object, name, NULL_TREE);
2157      object = build_non_dependent_expr (object);
2158    }
2159
2160  /* [expr.ref]
2161
2162     The type of the first expression shall be "class object" (of a
2163     complete type).  */
2164  if (!currently_open_class (object_type)
2165      && !complete_type_or_else (object_type, object))
2166    return error_mark_node;
2167  if (!CLASS_TYPE_P (object_type))
2168    {
2169      error ("request for member %qD in %qE, which is of non-class type %qT",
2170	     name, object, object_type);
2171      return error_mark_node;
2172    }
2173
2174  if (BASELINK_P (name))
2175    /* A member function that has already been looked up.  */
2176    member = name;
2177  else
2178    {
2179      bool is_template_id = false;
2180      tree template_args = NULL_TREE;
2181      tree scope;
2182
2183      if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
2184	{
2185	  is_template_id = true;
2186	  template_args = TREE_OPERAND (name, 1);
2187	  name = TREE_OPERAND (name, 0);
2188
2189	  if (TREE_CODE (name) == OVERLOAD)
2190	    name = DECL_NAME (get_first_fn (name));
2191	  else if (DECL_P (name))
2192	    name = DECL_NAME (name);
2193	}
2194
2195      if (TREE_CODE (name) == SCOPE_REF)
2196	{
2197	  /* A qualified name.  The qualifying class or namespace `S'
2198	     has already been looked up; it is either a TYPE or a
2199	     NAMESPACE_DECL.  */
2200	  scope = TREE_OPERAND (name, 0);
2201	  name = TREE_OPERAND (name, 1);
2202
2203	  /* If SCOPE is a namespace, then the qualified name does not
2204	     name a member of OBJECT_TYPE.  */
2205	  if (TREE_CODE (scope) == NAMESPACE_DECL)
2206	    {
2207	      error ("%<%D::%D%> is not a member of %qT",
2208		     scope, name, object_type);
2209	      return error_mark_node;
2210	    }
2211
2212	  gcc_assert (CLASS_TYPE_P (scope));
2213	  gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE
2214		      || TREE_CODE (name) == BIT_NOT_EXPR);
2215
2216	  /* Find the base of OBJECT_TYPE corresponding to SCOPE.  */
2217	  access_path = lookup_base (object_type, scope, ba_check, NULL);
2218	  if (access_path == error_mark_node)
2219	    return error_mark_node;
2220	  if (!access_path)
2221	    {
2222	      error ("%qT is not a base of %qT", scope, object_type);
2223	      return error_mark_node;
2224	    }
2225	}
2226      else
2227	{
2228	  scope = NULL_TREE;
2229	  access_path = object_type;
2230	}
2231
2232      if (TREE_CODE (name) == BIT_NOT_EXPR)
2233	member = lookup_destructor (object, scope, name);
2234      else
2235	{
2236	  /* Look up the member.  */
2237	  member = lookup_member (access_path, name, /*protect=*/1,
2238				  /*want_type=*/false);
2239	  if (member == NULL_TREE)
2240	    {
2241	      error ("%qD has no member named %qE", object_type, name);
2242	      return error_mark_node;
2243	    }
2244	  if (member == error_mark_node)
2245	    return error_mark_node;
2246	}
2247
2248      if (is_template_id)
2249	{
2250	  tree template = member;
2251
2252	  if (BASELINK_P (template))
2253	    template = lookup_template_function (template, template_args);
2254	  else
2255	    {
2256	      error ("%qD is not a member template function", name);
2257	      return error_mark_node;
2258	    }
2259	}
2260    }
2261
2262  if (TREE_DEPRECATED (member))
2263    warn_deprecated_use (member);
2264
2265  if (template_p)
2266    check_template_keyword (member);
2267
2268  expr = build_class_member_access_expr (object, member, access_path,
2269					 /*preserve_reference=*/false);
2270  if (processing_template_decl && expr != error_mark_node)
2271    {
2272      if (BASELINK_P (member))
2273	{
2274	  if (TREE_CODE (orig_name) == SCOPE_REF)
2275	    BASELINK_QUALIFIED_P (member) = 1;
2276	  orig_name = member;
2277	}
2278      return build_min_non_dep (COMPONENT_REF, expr,
2279				orig_object, orig_name,
2280				NULL_TREE);
2281    }
2282
2283  return expr;
2284}
2285
2286/* Return an expression for the MEMBER_NAME field in the internal
2287   representation of PTRMEM, a pointer-to-member function.  (Each
2288   pointer-to-member function type gets its own RECORD_TYPE so it is
2289   more convenient to access the fields by name than by FIELD_DECL.)
2290   This routine converts the NAME to a FIELD_DECL and then creates the
2291   node for the complete expression.  */
2292
2293tree
2294build_ptrmemfunc_access_expr (tree ptrmem, tree member_name)
2295{
2296  tree ptrmem_type;
2297  tree member;
2298  tree member_type;
2299
2300  /* This code is a stripped down version of
2301     build_class_member_access_expr.  It does not work to use that
2302     routine directly because it expects the object to be of class
2303     type.  */
2304  ptrmem_type = TREE_TYPE (ptrmem);
2305  gcc_assert (TYPE_PTRMEMFUNC_P (ptrmem_type));
2306  member = lookup_member (ptrmem_type, member_name, /*protect=*/0,
2307			  /*want_type=*/false);
2308  member_type = cp_build_qualified_type (TREE_TYPE (member),
2309					 cp_type_quals (ptrmem_type));
2310  return fold_build3 (COMPONENT_REF, member_type,
2311		      ptrmem, member, NULL_TREE);
2312}
2313
2314/* Given an expression PTR for a pointer, return an expression
2315   for the value pointed to.
2316   ERRORSTRING is the name of the operator to appear in error messages.
2317
2318   This function may need to overload OPERATOR_FNNAME.
2319   Must also handle REFERENCE_TYPEs for C++.  */
2320
2321tree
2322build_x_indirect_ref (tree expr, const char *errorstring)
2323{
2324  tree orig_expr = expr;
2325  tree rval;
2326
2327  if (processing_template_decl)
2328    {
2329      if (type_dependent_expression_p (expr))
2330	return build_min_nt (INDIRECT_REF, expr);
2331      expr = build_non_dependent_expr (expr);
2332    }
2333
2334  rval = build_new_op (INDIRECT_REF, LOOKUP_NORMAL, expr, NULL_TREE,
2335		       NULL_TREE, /*overloaded_p=*/NULL);
2336  if (!rval)
2337    rval = build_indirect_ref (expr, errorstring);
2338
2339  if (processing_template_decl && rval != error_mark_node)
2340    return build_min_non_dep (INDIRECT_REF, rval, orig_expr);
2341  else
2342    return rval;
2343}
2344
2345tree
2346build_indirect_ref (tree ptr, const char *errorstring)
2347{
2348  tree pointer, type;
2349
2350  if (ptr == error_mark_node)
2351    return error_mark_node;
2352
2353  if (ptr == current_class_ptr)
2354    return current_class_ref;
2355
2356  pointer = (TREE_CODE (TREE_TYPE (ptr)) == REFERENCE_TYPE
2357	     ? ptr : decay_conversion (ptr));
2358  type = TREE_TYPE (pointer);
2359
2360  if (POINTER_TYPE_P (type))
2361    {
2362      /* [expr.unary.op]
2363
2364	 If the type of the expression is "pointer to T," the type
2365	 of  the  result  is  "T."
2366
2367	 We must use the canonical variant because certain parts of
2368	 the back end, like fold, do pointer comparisons between
2369	 types.  */
2370      tree t = canonical_type_variant (TREE_TYPE (type));
2371
2372      if (TREE_CODE (ptr) == CONVERT_EXPR
2373          || TREE_CODE (ptr) == NOP_EXPR
2374          || TREE_CODE (ptr) == VIEW_CONVERT_EXPR)
2375	{
2376	  /* If a warning is issued, mark it to avoid duplicates from
2377	     the backend.  This only needs to be done at
2378	     warn_strict_aliasing > 2.  */
2379	  if (warn_strict_aliasing > 2)
2380	    if (strict_aliasing_warning (TREE_TYPE (TREE_OPERAND (ptr, 0)),
2381					 type, TREE_OPERAND (ptr, 0)))
2382	      TREE_NO_WARNING (ptr) = 1;
2383	}
2384
2385      if (VOID_TYPE_P (t))
2386	{
2387	  /* A pointer to incomplete type (other than cv void) can be
2388	     dereferenced [expr.unary.op]/1  */
2389	  error ("%qT is not a pointer-to-object type", type);
2390	  return error_mark_node;
2391	}
2392      else if (TREE_CODE (pointer) == ADDR_EXPR
2393	       && same_type_p (t, TREE_TYPE (TREE_OPERAND (pointer, 0))))
2394	/* The POINTER was something like `&x'.  We simplify `*&x' to
2395	   `x'.  */
2396	return TREE_OPERAND (pointer, 0);
2397      else
2398	{
2399	  tree ref = build1 (INDIRECT_REF, t, pointer);
2400
2401	  /* We *must* set TREE_READONLY when dereferencing a pointer to const,
2402	     so that we get the proper error message if the result is used
2403	     to assign to.  Also, &* is supposed to be a no-op.  */
2404	  TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
2405	  TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
2406	  TREE_SIDE_EFFECTS (ref)
2407	    = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (pointer));
2408	  return ref;
2409	}
2410    }
2411  /* `pointer' won't be an error_mark_node if we were given a
2412     pointer to member, so it's cool to check for this here.  */
2413  else if (TYPE_PTR_TO_MEMBER_P (type))
2414    error ("invalid use of %qs on pointer to member", errorstring);
2415  else if (pointer != error_mark_node)
2416    {
2417      if (errorstring)
2418	error ("invalid type argument of %qs", errorstring);
2419      else
2420	error ("invalid type argument");
2421    }
2422  return error_mark_node;
2423}
2424
2425/* This handles expressions of the form "a[i]", which denotes
2426   an array reference.
2427
2428   This is logically equivalent in C to *(a+i), but we may do it differently.
2429   If A is a variable or a member, we generate a primitive ARRAY_REF.
2430   This avoids forcing the array out of registers, and can work on
2431   arrays that are not lvalues (for example, members of structures returned
2432   by functions).
2433
2434   If INDEX is of some user-defined type, it must be converted to
2435   integer type.  Otherwise, to make a compatible PLUS_EXPR, it
2436   will inherit the type of the array, which will be some pointer type.  */
2437
2438tree
2439build_array_ref (tree array, tree idx)
2440{
2441  if (idx == 0)
2442    {
2443      error ("subscript missing in array reference");
2444      return error_mark_node;
2445    }
2446
2447  if (TREE_TYPE (array) == error_mark_node
2448      || TREE_TYPE (idx) == error_mark_node)
2449    return error_mark_node;
2450
2451  /* If ARRAY is a COMPOUND_EXPR or COND_EXPR, move our reference
2452     inside it.  */
2453  switch (TREE_CODE (array))
2454    {
2455    case COMPOUND_EXPR:
2456      {
2457	tree value = build_array_ref (TREE_OPERAND (array, 1), idx);
2458	return build2 (COMPOUND_EXPR, TREE_TYPE (value),
2459		       TREE_OPERAND (array, 0), value);
2460      }
2461
2462    case COND_EXPR:
2463      return build_conditional_expr
2464	(TREE_OPERAND (array, 0),
2465	 build_array_ref (TREE_OPERAND (array, 1), idx),
2466	 build_array_ref (TREE_OPERAND (array, 2), idx));
2467
2468    default:
2469      break;
2470    }
2471
2472  if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE)
2473    {
2474      tree rval, type;
2475
2476      warn_array_subscript_with_type_char (idx);
2477
2478      if (!INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (idx)))
2479	{
2480	  error ("array subscript is not an integer");
2481	  return error_mark_node;
2482	}
2483
2484      /* Apply integral promotions *after* noticing character types.
2485	 (It is unclear why we do these promotions -- the standard
2486	 does not say that we should.  In fact, the natural thing would
2487	 seem to be to convert IDX to ptrdiff_t; we're performing
2488	 pointer arithmetic.)  */
2489      idx = perform_integral_promotions (idx);
2490
2491      /* An array that is indexed by a non-constant
2492	 cannot be stored in a register; we must be able to do
2493	 address arithmetic on its address.
2494	 Likewise an array of elements of variable size.  */
2495      if (TREE_CODE (idx) != INTEGER_CST
2496	  || (COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (array)))
2497	      && (TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))))
2498		  != INTEGER_CST)))
2499	{
2500	  if (!cxx_mark_addressable (array))
2501	    return error_mark_node;
2502	}
2503
2504      /* An array that is indexed by a constant value which is not within
2505	 the array bounds cannot be stored in a register either; because we
2506	 would get a crash in store_bit_field/extract_bit_field when trying
2507	 to access a non-existent part of the register.  */
2508      if (TREE_CODE (idx) == INTEGER_CST
2509	  && TYPE_DOMAIN (TREE_TYPE (array))
2510	  && ! int_fits_type_p (idx, TYPE_DOMAIN (TREE_TYPE (array))))
2511	{
2512	  if (!cxx_mark_addressable (array))
2513	    return error_mark_node;
2514	}
2515
2516      if (pedantic && !lvalue_p (array))
2517	pedwarn ("ISO C++ forbids subscripting non-lvalue array");
2518
2519      /* Note in C++ it is valid to subscript a `register' array, since
2520	 it is valid to take the address of something with that
2521	 storage specification.  */
2522      if (extra_warnings)
2523	{
2524	  tree foo = array;
2525	  while (TREE_CODE (foo) == COMPONENT_REF)
2526	    foo = TREE_OPERAND (foo, 0);
2527	  if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo))
2528	    warning (OPT_Wextra, "subscripting array declared %<register%>");
2529	}
2530
2531      type = TREE_TYPE (TREE_TYPE (array));
2532      rval = build4 (ARRAY_REF, type, array, idx, NULL_TREE, NULL_TREE);
2533      /* Array ref is const/volatile if the array elements are
2534	 or if the array is..  */
2535      TREE_READONLY (rval)
2536	|= (CP_TYPE_CONST_P (type) | TREE_READONLY (array));
2537      TREE_SIDE_EFFECTS (rval)
2538	|= (CP_TYPE_VOLATILE_P (type) | TREE_SIDE_EFFECTS (array));
2539      TREE_THIS_VOLATILE (rval)
2540	|= (CP_TYPE_VOLATILE_P (type) | TREE_THIS_VOLATILE (array));
2541      return require_complete_type (fold_if_not_in_template (rval));
2542    }
2543
2544  {
2545    tree ar = default_conversion (array);
2546    tree ind = default_conversion (idx);
2547
2548    /* Put the integer in IND to simplify error checking.  */
2549    if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE)
2550      {
2551	tree temp = ar;
2552	ar = ind;
2553	ind = temp;
2554      }
2555
2556    if (ar == error_mark_node)
2557      return ar;
2558
2559    if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE)
2560      {
2561	error ("subscripted value is neither array nor pointer");
2562	return error_mark_node;
2563      }
2564    if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
2565      {
2566	error ("array subscript is not an integer");
2567	return error_mark_node;
2568      }
2569
2570    return build_indirect_ref (cp_build_binary_op (PLUS_EXPR, ar, ind),
2571			       "array indexing");
2572  }
2573}
2574
2575/* Resolve a pointer to member function.  INSTANCE is the object
2576   instance to use, if the member points to a virtual member.
2577
2578   This used to avoid checking for virtual functions if basetype
2579   has no virtual functions, according to an earlier ANSI draft.
2580   With the final ISO C++ rules, such an optimization is
2581   incorrect: A pointer to a derived member can be static_cast
2582   to pointer-to-base-member, as long as the dynamic object
2583   later has the right member.  */
2584
2585tree
2586get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function)
2587{
2588  if (TREE_CODE (function) == OFFSET_REF)
2589    function = TREE_OPERAND (function, 1);
2590
2591  if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function)))
2592    {
2593      tree idx, delta, e1, e2, e3, vtbl, basetype;
2594      tree fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function));
2595
2596      tree instance_ptr = *instance_ptrptr;
2597      tree instance_save_expr = 0;
2598      if (instance_ptr == error_mark_node)
2599	{
2600	  if (TREE_CODE (function) == PTRMEM_CST)
2601	    {
2602	      /* Extracting the function address from a pmf is only
2603		 allowed with -Wno-pmf-conversions. It only works for
2604		 pmf constants.  */
2605	      e1 = build_addr_func (PTRMEM_CST_MEMBER (function));
2606	      e1 = convert (fntype, e1);
2607	      return e1;
2608	    }
2609	  else
2610	    {
2611	      error ("object missing in use of %qE", function);
2612	      return error_mark_node;
2613	    }
2614	}
2615
2616      if (TREE_SIDE_EFFECTS (instance_ptr))
2617	instance_ptr = instance_save_expr = save_expr (instance_ptr);
2618
2619      if (TREE_SIDE_EFFECTS (function))
2620	function = save_expr (function);
2621
2622      /* Start by extracting all the information from the PMF itself.  */
2623      e3 = pfn_from_ptrmemfunc (function);
2624      delta = build_ptrmemfunc_access_expr (function, delta_identifier);
2625      idx = build1 (NOP_EXPR, vtable_index_type, e3);
2626      switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
2627	{
2628	case ptrmemfunc_vbit_in_pfn:
2629	  e1 = cp_build_binary_op (BIT_AND_EXPR, idx, integer_one_node);
2630	  idx = cp_build_binary_op (MINUS_EXPR, idx, integer_one_node);
2631	  break;
2632
2633	case ptrmemfunc_vbit_in_delta:
2634	  e1 = cp_build_binary_op (BIT_AND_EXPR, delta, integer_one_node);
2635	  delta = cp_build_binary_op (RSHIFT_EXPR, delta, integer_one_node);
2636	  break;
2637
2638	default:
2639	  gcc_unreachable ();
2640	}
2641
2642      /* Convert down to the right base before using the instance.  A
2643	 special case is that in a pointer to member of class C, C may
2644	 be incomplete.  In that case, the function will of course be
2645	 a member of C, and no conversion is required.  In fact,
2646	 lookup_base will fail in that case, because incomplete
2647	 classes do not have BINFOs.  */
2648      basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype));
2649      if (!same_type_ignoring_top_level_qualifiers_p
2650	  (basetype, TREE_TYPE (TREE_TYPE (instance_ptr))))
2651	{
2652	  basetype = lookup_base (TREE_TYPE (TREE_TYPE (instance_ptr)),
2653				  basetype, ba_check, NULL);
2654	  instance_ptr = build_base_path (PLUS_EXPR, instance_ptr, basetype,
2655					  1);
2656	  if (instance_ptr == error_mark_node)
2657	    return error_mark_node;
2658	}
2659      /* ...and then the delta in the PMF.  */
2660      instance_ptr = build2 (PLUS_EXPR, TREE_TYPE (instance_ptr),
2661			     instance_ptr, delta);
2662
2663      /* Hand back the adjusted 'this' argument to our caller.  */
2664      *instance_ptrptr = instance_ptr;
2665
2666      /* Next extract the vtable pointer from the object.  */
2667      vtbl = build1 (NOP_EXPR, build_pointer_type (vtbl_ptr_type_node),
2668		     instance_ptr);
2669      vtbl = build_indirect_ref (vtbl, NULL);
2670
2671      /* Finally, extract the function pointer from the vtable.  */
2672      e2 = fold_build2 (PLUS_EXPR, TREE_TYPE (vtbl), vtbl, idx);
2673      e2 = build_indirect_ref (e2, NULL);
2674      TREE_CONSTANT (e2) = 1;
2675      TREE_INVARIANT (e2) = 1;
2676
2677      /* When using function descriptors, the address of the
2678	 vtable entry is treated as a function pointer.  */
2679      if (TARGET_VTABLE_USES_DESCRIPTORS)
2680	e2 = build1 (NOP_EXPR, TREE_TYPE (e2),
2681		     build_unary_op (ADDR_EXPR, e2, /*noconvert=*/1));
2682
2683      TREE_TYPE (e2) = TREE_TYPE (e3);
2684      e1 = build_conditional_expr (e1, e2, e3);
2685
2686      /* Make sure this doesn't get evaluated first inside one of the
2687	 branches of the COND_EXPR.  */
2688      if (instance_save_expr)
2689	e1 = build2 (COMPOUND_EXPR, TREE_TYPE (e1),
2690		     instance_save_expr, e1);
2691
2692      function = e1;
2693    }
2694  return function;
2695}
2696
2697/* APPLE LOCAL begin blocks 6040305 (cm) */
2698/* APPLE LOCAL begin radar 5847213 - radar 6329245 */
2699/**
2700 build_block_call - Routine to build a block call; as in:
2701  ((double(*)(void *, int))(BLOCK_PTR_EXP->__FuncPtr))(I, 42);
2702 FNTYPE is the original function type derived from the syntax.
2703 BLOCK_PTR_EXP is the block pointer variable.
2704 PARAMS is the parameter list.
2705*/
2706static tree
2707build_block_call (tree fntype, tree block_ptr_exp, tree params)
2708{
2709  tree function_ptr_exp;
2710  tree typelist;
2711  tree result;
2712  /* APPLE LOCAL radar 6396238 */
2713  bool block_ptr_exp_side_effect = TREE_SIDE_EFFECTS (block_ptr_exp);
2714
2715  /* First convert it to 'void *'. */
2716  block_ptr_exp = convert (ptr_type_node, block_ptr_exp);
2717  gcc_assert (generic_block_literal_struct_type);
2718  block_ptr_exp = convert (build_pointer_type (generic_block_literal_struct_type),
2719			    block_ptr_exp);
2720  if (block_ptr_exp_side_effect)
2721    block_ptr_exp = save_expr (block_ptr_exp);
2722
2723  /* BLOCK_PTR_VAR->__FuncPtr */
2724  function_ptr_exp =
2725    finish_class_member_access_expr (build_indirect_ref (block_ptr_exp, "->"),
2726					     get_identifier ("__FuncPtr"), false);
2727  gcc_assert (function_ptr_exp);
2728
2729  /* Build: result_type(*)(void *, function-arg-type-list) */
2730  typelist = TYPE_ARG_TYPES (fntype);
2731  typelist = tree_cons (NULL_TREE, ptr_type_node, typelist);
2732  fntype = build_function_type (TREE_TYPE (fntype), typelist);
2733  function_ptr_exp = convert (build_pointer_type (fntype), function_ptr_exp);
2734  params = tree_cons (NULL_TREE, block_ptr_exp, params);
2735  result = build3 (CALL_EXPR, TREE_TYPE (fntype),
2736		   function_ptr_exp, params, NULL_TREE);
2737  /* FIXME: should do more from build_cxx_call */
2738  result = convert_from_reference (result);
2739  return result;
2740}
2741/* APPLE LOCAL end radar 5847213 - radar 6329245 */
2742/* APPLE LOCAL end blocks 6040305 (cm) */
2743
2744tree
2745build_function_call (tree function, tree params)
2746{
2747  tree fntype, fndecl;
2748  tree coerced_params;
2749  tree name = NULL_TREE;
2750  int is_method;
2751  tree original = function;
2752
2753  /* For Objective-C, convert any calls via a cast to OBJC_TYPE_REF
2754     expressions, like those used for ObjC messenger dispatches.  */
2755  function = objc_rewrite_function_call (function, params);
2756
2757  /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2758     Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context.  */
2759  if (TREE_CODE (function) == NOP_EXPR
2760      && TREE_TYPE (function) == TREE_TYPE (TREE_OPERAND (function, 0)))
2761    function = TREE_OPERAND (function, 0);
2762
2763  if (TREE_CODE (function) == FUNCTION_DECL)
2764    {
2765      name = DECL_NAME (function);
2766
2767      mark_used (function);
2768      fndecl = function;
2769
2770      /* Convert anything with function type to a pointer-to-function.  */
2771      if (pedantic && DECL_MAIN_P (function))
2772	pedwarn ("ISO C++ forbids calling %<::main%> from within program");
2773
2774      /* Differs from default_conversion by not setting TREE_ADDRESSABLE
2775	 (because calling an inline function does not mean the function
2776	 needs to be separately compiled).  */
2777
2778      if (DECL_INLINE (function))
2779	function = inline_conversion (function);
2780      else
2781	function = build_addr_func (function);
2782    }
2783  else
2784    {
2785      fndecl = NULL_TREE;
2786
2787      function = build_addr_func (function);
2788    }
2789
2790  if (function == error_mark_node)
2791    return error_mark_node;
2792
2793  fntype = TREE_TYPE (function);
2794
2795  if (TYPE_PTRMEMFUNC_P (fntype))
2796    {
2797      error ("must use %<.*%> or %<->*%> to call pointer-to-member "
2798	     "function in %<%E (...)%>",
2799	     original);
2800      return error_mark_node;
2801    }
2802
2803  is_method = (TREE_CODE (fntype) == POINTER_TYPE
2804	       && TREE_CODE (TREE_TYPE (fntype)) == METHOD_TYPE);
2805
2806  /* APPLE LOCAL blocks 6040305 */
2807  if (!(((TREE_CODE (fntype) == POINTER_TYPE || TREE_CODE (fntype) == BLOCK_POINTER_TYPE)
2808	 && TREE_CODE (TREE_TYPE (fntype)) == FUNCTION_TYPE)
2809	|| is_method
2810	|| TREE_CODE (function) == TEMPLATE_ID_EXPR))
2811    {
2812      error ("%qE cannot be used as a function", original);
2813      return error_mark_node;
2814    }
2815
2816  /* fntype now gets the type of function pointed to.  */
2817  fntype = TREE_TYPE (fntype);
2818
2819  /* Convert the parameters to the types declared in the
2820     function prototype, or apply default promotions.  */
2821
2822  /* APPLE LOCAL begin radar 6087117 */
2823  coerced_params = convert_arguments (TYPE_ARG_TYPES (fntype),
2824				      params, fndecl, LOOKUP_NORMAL,
2825				      (TREE_CODE (TREE_TYPE (function)) == BLOCK_POINTER_TYPE));
2826  /* APPLE LOCAL end radar 6087117 */
2827  if (coerced_params == error_mark_node)
2828    return error_mark_node;
2829
2830  /* Check for errors in format strings and inappropriately
2831     null parameters.  */
2832
2833  check_function_arguments (TYPE_ATTRIBUTES (fntype), coerced_params,
2834			    TYPE_ARG_TYPES (fntype));
2835  /* APPLE LOCAL begin blocks 6040305 */
2836  if (TREE_CODE (TREE_TYPE (function)) == BLOCK_POINTER_TYPE)
2837    return build_block_call (fntype, function, coerced_params);
2838  /* APPLE LOCAL end blocks 6040305 */
2839
2840  return build_cxx_call (function, coerced_params);
2841}
2842
2843/* Convert the actual parameter expressions in the list VALUES
2844   to the types in the list TYPELIST.
2845   If parmdecls is exhausted, or when an element has NULL as its type,
2846   perform the default conversions.
2847
2848   NAME is an IDENTIFIER_NODE or 0.  It is used only for error messages.
2849
2850   This is also where warnings about wrong number of args are generated.
2851
2852   Return a list of expressions for the parameters as converted.
2853
2854   Both VALUES and the returned value are chains of TREE_LIST nodes
2855   with the elements of the list in the TREE_VALUE slots of those nodes.
2856
2857   In C++, unspecified trailing parameters can be filled in with their
2858   default arguments, if such were specified.  Do so here.  */
2859
2860static tree
2861/* APPLE LOCAL radar 6087117 */
2862convert_arguments (tree typelist, tree values, tree fndecl, int flags, int block_call)
2863{
2864  tree typetail, valtail;
2865  tree result = NULL_TREE;
2866  const char *called_thing = 0;
2867  int i = 0;
2868
2869  /* Argument passing is always copy-initialization.  */
2870  flags |= LOOKUP_ONLYCONVERTING;
2871
2872  if (fndecl)
2873    {
2874      if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
2875	{
2876	  if (DECL_NAME (fndecl) == NULL_TREE
2877	      || IDENTIFIER_HAS_TYPE_VALUE (DECL_NAME (fndecl)))
2878	    called_thing = "constructor";
2879	  else
2880	    called_thing = "member function";
2881	}
2882      else
2883	called_thing = "function";
2884    }
2885
2886  for (valtail = values, typetail = typelist;
2887       valtail;
2888       valtail = TREE_CHAIN (valtail), i++)
2889    {
2890      tree type = typetail ? TREE_VALUE (typetail) : 0;
2891      tree val = TREE_VALUE (valtail);
2892
2893      if (val == error_mark_node || type == error_mark_node)
2894	return error_mark_node;
2895
2896      if (type == void_type_node)
2897	{
2898	  if (fndecl)
2899	    {
2900	      error ("too many arguments to %s %q+#D", called_thing, fndecl);
2901	      error ("at this point in file");
2902	    }
2903	  else
2904	    /* APPLE LOCAL radar 6087117 */
2905	    error ("too many arguments to %s", (block_call ? "block call" : "function"));
2906	  /* In case anybody wants to know if this argument
2907	     list is valid.  */
2908	  if (result)
2909	    TREE_TYPE (tree_last (result)) = error_mark_node;
2910	  break;
2911	}
2912
2913      /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2914	 Strip such NOP_EXPRs, since VAL is used in non-lvalue context.  */
2915      if (TREE_CODE (val) == NOP_EXPR
2916	  && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))
2917	  && (type == 0 || TREE_CODE (type) != REFERENCE_TYPE))
2918	val = TREE_OPERAND (val, 0);
2919
2920      if (type == 0 || TREE_CODE (type) != REFERENCE_TYPE)
2921	{
2922	  if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE
2923	      || TREE_CODE (TREE_TYPE (val)) == FUNCTION_TYPE
2924	      || TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE)
2925	    val = decay_conversion (val);
2926	}
2927
2928      if (val == error_mark_node)
2929	return error_mark_node;
2930
2931      if (type != 0)
2932	{
2933	  /* Formal parm type is specified by a function prototype.  */
2934	  tree parmval;
2935
2936	  if (!COMPLETE_TYPE_P (complete_type (type)))
2937	    {
2938	      if (fndecl)
2939		error ("parameter %P of %qD has incomplete type %qT",
2940		       i, fndecl, type);
2941	      else
2942		error ("parameter %P has incomplete type %qT", i, type);
2943	      parmval = error_mark_node;
2944	    }
2945	  else
2946	    {
2947	      parmval = convert_for_initialization
2948		(NULL_TREE, type, val, flags,
2949		 "argument passing", fndecl, i);
2950	      parmval = convert_for_arg_passing (type, parmval);
2951	    }
2952
2953	  if (parmval == error_mark_node)
2954	    return error_mark_node;
2955
2956	  result = tree_cons (NULL_TREE, parmval, result);
2957	}
2958      else
2959	{
2960	  if (fndecl && DECL_BUILT_IN (fndecl)
2961	      && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P)
2962	    /* Don't do ellipsis conversion for __built_in_constant_p
2963	       as this will result in spurious warnings for non-POD
2964	       types.  */
2965	    val = require_complete_type (val);
2966	  else
2967	    val = convert_arg_to_ellipsis (val);
2968
2969	  result = tree_cons (NULL_TREE, val, result);
2970	}
2971
2972      if (typetail)
2973	typetail = TREE_CHAIN (typetail);
2974    }
2975
2976  if (typetail != 0 && typetail != void_list_node)
2977    {
2978      /* See if there are default arguments that can be used.  */
2979      if (TREE_PURPOSE (typetail)
2980	  && TREE_CODE (TREE_PURPOSE (typetail)) != DEFAULT_ARG)
2981	{
2982	  for (; typetail != void_list_node; ++i)
2983	    {
2984	      tree parmval
2985		= convert_default_arg (TREE_VALUE (typetail),
2986				       TREE_PURPOSE (typetail),
2987				       fndecl, i);
2988
2989	      if (parmval == error_mark_node)
2990		return error_mark_node;
2991
2992	      result = tree_cons (0, parmval, result);
2993	      typetail = TREE_CHAIN (typetail);
2994	      /* ends with `...'.  */
2995	      if (typetail == NULL_TREE)
2996		break;
2997	    }
2998	}
2999      else
3000	{
3001	  if (fndecl)
3002	    {
3003	      error ("too few arguments to %s %q+#D", called_thing, fndecl);
3004	      error ("at this point in file");
3005	    }
3006	  else
3007	    /* APPLE LOCAL radar 6087117 */
3008	    error ("too few arguments to %s", (block_call ? "block call" : "function"));
3009	  return error_mark_node;
3010	}
3011    }
3012
3013  return nreverse (result);
3014}
3015
3016/* Build a binary-operation expression, after performing default
3017   conversions on the operands.  CODE is the kind of expression to build.  */
3018
3019tree
3020build_x_binary_op (enum tree_code code, tree arg1, enum tree_code arg1_code,
3021		   tree arg2, enum tree_code arg2_code, bool *overloaded_p)
3022{
3023  tree orig_arg1;
3024  tree orig_arg2;
3025  tree expr;
3026
3027  orig_arg1 = arg1;
3028  orig_arg2 = arg2;
3029
3030  if (processing_template_decl)
3031    {
3032      if (type_dependent_expression_p (arg1)
3033	  || type_dependent_expression_p (arg2))
3034	return build_min_nt (code, arg1, arg2);
3035      arg1 = build_non_dependent_expr (arg1);
3036      arg2 = build_non_dependent_expr (arg2);
3037    }
3038
3039  if (code == DOTSTAR_EXPR)
3040    expr = build_m_component_ref (arg1, arg2);
3041  else
3042    expr = build_new_op (code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE,
3043			 overloaded_p);
3044
3045  /* Check for cases such as x+y<<z which users are likely to
3046     misinterpret.  But don't warn about obj << x + y, since that is a
3047     common idiom for I/O.  */
3048  if (warn_parentheses
3049      && !processing_template_decl
3050      && !error_operand_p (arg1)
3051      && !error_operand_p (arg2)
3052      && (code != LSHIFT_EXPR
3053	  || !IS_AGGR_TYPE (TREE_TYPE (arg1))))
3054    warn_about_parentheses (code, arg1_code, arg2_code);
3055
3056  if (processing_template_decl && expr != error_mark_node)
3057    return build_min_non_dep (code, expr, orig_arg1, orig_arg2);
3058
3059  return expr;
3060}
3061
3062/* Build a binary-operation expression without default conversions.
3063   CODE is the kind of expression to build.
3064   This function differs from `build' in several ways:
3065   the data type of the result is computed and recorded in it,
3066   warnings are generated if arg data types are invalid,
3067   special handling for addition and subtraction of pointers is known,
3068   and some optimization is done (operations on narrow ints
3069   are done in the narrower type when that gives the same result).
3070   Constant folding is also done before the result is returned.
3071
3072   Note that the operands will never have enumeral types
3073   because either they have just had the default conversions performed
3074   or they have both just been converted to some other type in which
3075   the arithmetic is to be done.
3076
3077   C++: must do special pointer arithmetic when implementing
3078   multiple inheritance, and deal with pointer to member functions.  */
3079
3080tree
3081build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
3082		 int convert_p ATTRIBUTE_UNUSED)
3083{
3084  tree op0, op1;
3085  enum tree_code code0, code1;
3086  tree type0, type1;
3087  const char *invalid_op_diag;
3088
3089  /* Expression code to give to the expression when it is built.
3090     Normally this is CODE, which is what the caller asked for,
3091     but in some special cases we change it.  */
3092  enum tree_code resultcode = code;
3093
3094  /* Data type in which the computation is to be performed.
3095     In the simplest cases this is the common type of the arguments.  */
3096  tree result_type = NULL;
3097
3098  /* Nonzero means operands have already been type-converted
3099     in whatever way is necessary.
3100     Zero means they need to be converted to RESULT_TYPE.  */
3101  int converted = 0;
3102
3103  /* Nonzero means create the expression with this type, rather than
3104     RESULT_TYPE.  */
3105  tree build_type = 0;
3106
3107  /* Nonzero means after finally constructing the expression
3108     convert it to this type.  */
3109  tree final_type = 0;
3110
3111  tree result;
3112
3113  /* Nonzero if this is an operation like MIN or MAX which can
3114     safely be computed in short if both args are promoted shorts.
3115     Also implies COMMON.
3116     -1 indicates a bitwise operation; this makes a difference
3117     in the exact conditions for when it is safe to do the operation
3118     in a narrower mode.  */
3119  int shorten = 0;
3120
3121  /* Nonzero if this is a comparison operation;
3122     if both args are promoted shorts, compare the original shorts.
3123     Also implies COMMON.  */
3124  int short_compare = 0;
3125
3126  /* Nonzero if this is a right-shift operation, which can be computed on the
3127     original short and then promoted if the operand is a promoted short.  */
3128  int short_shift = 0;
3129
3130  /* Nonzero means set RESULT_TYPE to the common type of the args.  */
3131  int common = 0;
3132
3133  /* True if both operands have arithmetic type.  */
3134  bool arithmetic_types_p;
3135
3136  /* Apply default conversions.  */
3137  op0 = orig_op0;
3138  op1 = orig_op1;
3139
3140  if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
3141      || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
3142      || code == TRUTH_XOR_EXPR)
3143    {
3144      if (!really_overloaded_fn (op0))
3145	op0 = decay_conversion (op0);
3146      if (!really_overloaded_fn (op1))
3147	op1 = decay_conversion (op1);
3148    }
3149  else
3150    {
3151      if (!really_overloaded_fn (op0))
3152	op0 = default_conversion (op0);
3153      if (!really_overloaded_fn (op1))
3154	op1 = default_conversion (op1);
3155    }
3156
3157  /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue.  */
3158  STRIP_TYPE_NOPS (op0);
3159  STRIP_TYPE_NOPS (op1);
3160
3161  /* DTRT if one side is an overloaded function, but complain about it.  */
3162  if (type_unknown_p (op0))
3163    {
3164      tree t = instantiate_type (TREE_TYPE (op1), op0, tf_none);
3165      if (t != error_mark_node)
3166	{
3167	  pedwarn ("assuming cast to type %qT from overloaded function",
3168		   TREE_TYPE (t));
3169	  op0 = t;
3170	}
3171    }
3172  if (type_unknown_p (op1))
3173    {
3174      tree t = instantiate_type (TREE_TYPE (op0), op1, tf_none);
3175      if (t != error_mark_node)
3176	{
3177	  pedwarn ("assuming cast to type %qT from overloaded function",
3178		   TREE_TYPE (t));
3179	  op1 = t;
3180	}
3181    }
3182
3183  type0 = TREE_TYPE (op0);
3184  type1 = TREE_TYPE (op1);
3185
3186  /* The expression codes of the data types of the arguments tell us
3187     whether the arguments are integers, floating, pointers, etc.  */
3188  code0 = TREE_CODE (type0);
3189  code1 = TREE_CODE (type1);
3190
3191  /* If an error was already reported for one of the arguments,
3192     avoid reporting another error.  */
3193
3194  if (code0 == ERROR_MARK || code1 == ERROR_MARK)
3195    return error_mark_node;
3196
3197  if ((invalid_op_diag
3198       = targetm.invalid_binary_op (code, type0, type1)))
3199    {
3200      error (invalid_op_diag, "");
3201      return error_mark_node;
3202    }
3203
3204  switch (code)
3205    {
3206    case MINUS_EXPR:
3207      /* Subtraction of two similar pointers.
3208	 We must subtract them as integers, then divide by object size.  */
3209      if (code0 == POINTER_TYPE && code1 == POINTER_TYPE
3210	  && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type0),
3211							TREE_TYPE (type1)))
3212	return pointer_diff (op0, op1, common_type (type0, type1));
3213      /* In all other cases except pointer - int, the usual arithmetic
3214	 rules aply.  */
3215      else if (!(code0 == POINTER_TYPE && code1 == INTEGER_TYPE))
3216	{
3217	  common = 1;
3218	  break;
3219	}
3220      /* The pointer - int case is just like pointer + int; fall
3221	 through.  */
3222    case PLUS_EXPR:
3223      if ((code0 == POINTER_TYPE || code1 == POINTER_TYPE)
3224	  && (code0 == INTEGER_TYPE || code1 == INTEGER_TYPE))
3225	{
3226	  tree ptr_operand;
3227	  tree int_operand;
3228	  ptr_operand = ((code0 == POINTER_TYPE) ? op0 : op1);
3229	  int_operand = ((code0 == INTEGER_TYPE) ? op0 : op1);
3230	  if (processing_template_decl)
3231	    {
3232	      result_type = TREE_TYPE (ptr_operand);
3233	      break;
3234	    }
3235	  return cp_pointer_int_sum (code,
3236				     ptr_operand,
3237				     int_operand);
3238	}
3239      common = 1;
3240      break;
3241
3242    case MULT_EXPR:
3243      common = 1;
3244      break;
3245
3246    case TRUNC_DIV_EXPR:
3247    case CEIL_DIV_EXPR:
3248    case FLOOR_DIV_EXPR:
3249    case ROUND_DIV_EXPR:
3250    case EXACT_DIV_EXPR:
3251      if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
3252	   || code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
3253	  && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
3254	      || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
3255	{
3256	  enum tree_code tcode0 = code0, tcode1 = code1;
3257
3258	  if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
3259	    warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0%>", op0);
3260	  else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
3261	    warning (OPT_Wdiv_by_zero, "division by zero in %<%E / 0.%>", op0);
3262
3263	  if (tcode0 == COMPLEX_TYPE || tcode0 == VECTOR_TYPE)
3264	    tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
3265	  if (tcode1 == COMPLEX_TYPE || tcode1 == VECTOR_TYPE)
3266	    tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
3267
3268	  if (!(tcode0 == INTEGER_TYPE && tcode1 == INTEGER_TYPE))
3269	    resultcode = RDIV_EXPR;
3270	  else
3271	    /* When dividing two signed integers, we have to promote to int.
3272	       unless we divide by a constant != -1.  Note that default
3273	       conversion will have been performed on the operands at this
3274	       point, so we have to dig out the original type to find out if
3275	       it was unsigned.  */
3276	    shorten = ((TREE_CODE (op0) == NOP_EXPR
3277			&& TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3278		       || (TREE_CODE (op1) == INTEGER_CST
3279			   && ! integer_all_onesp (op1)));
3280
3281	  common = 1;
3282	}
3283      break;
3284
3285    case BIT_AND_EXPR:
3286    case BIT_IOR_EXPR:
3287    case BIT_XOR_EXPR:
3288      if ((code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3289	  || (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE))
3290	shorten = -1;
3291      break;
3292
3293    case TRUNC_MOD_EXPR:
3294    case FLOOR_MOD_EXPR:
3295      if (code1 == INTEGER_TYPE && integer_zerop (op1))
3296	warning (OPT_Wdiv_by_zero, "division by zero in %<%E %% 0%>", op0);
3297      else if (code1 == REAL_TYPE && real_zerop (op1))
3298	warning (OPT_Wdiv_by_zero, "division by zero in %<%E %% 0.%>", op0);
3299
3300      if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3301	{
3302	  /* Although it would be tempting to shorten always here, that loses
3303	     on some targets, since the modulo instruction is undefined if the
3304	     quotient can't be represented in the computation mode.  We shorten
3305	     only if unsigned or if dividing by something we know != -1.  */
3306	  shorten = ((TREE_CODE (op0) == NOP_EXPR
3307		      && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3308		     || (TREE_CODE (op1) == INTEGER_CST
3309			 && ! integer_all_onesp (op1)));
3310	  common = 1;
3311	}
3312      break;
3313
3314    case TRUTH_ANDIF_EXPR:
3315    case TRUTH_ORIF_EXPR:
3316    case TRUTH_AND_EXPR:
3317    case TRUTH_OR_EXPR:
3318      result_type = boolean_type_node;
3319      break;
3320
3321      /* Shift operations: result has same type as first operand;
3322	 always convert second operand to int.
3323	 Also set SHORT_SHIFT if shifting rightward.  */
3324
3325    case RSHIFT_EXPR:
3326      if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3327	{
3328	  result_type = type0;
3329	  if (TREE_CODE (op1) == INTEGER_CST)
3330	    {
3331	      if (tree_int_cst_lt (op1, integer_zero_node))
3332		warning (0, "right shift count is negative");
3333	      else
3334		{
3335		  if (! integer_zerop (op1))
3336		    short_shift = 1;
3337		  if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
3338		    warning (0, "right shift count >= width of type");
3339		}
3340	    }
3341	  /* Convert the shift-count to an integer, regardless of
3342	     size of value being shifted.  */
3343	  if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3344	    op1 = cp_convert (integer_type_node, op1);
3345	  /* Avoid converting op1 to result_type later.  */
3346	  converted = 1;
3347	}
3348      break;
3349
3350    case LSHIFT_EXPR:
3351      if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3352	{
3353	  result_type = type0;
3354	  if (TREE_CODE (op1) == INTEGER_CST)
3355	    {
3356	      if (tree_int_cst_lt (op1, integer_zero_node))
3357		warning (0, "left shift count is negative");
3358	      else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
3359		warning (0, "left shift count >= width of type");
3360	    }
3361	  /* Convert the shift-count to an integer, regardless of
3362	     size of value being shifted.  */
3363	  if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3364	    op1 = cp_convert (integer_type_node, op1);
3365	  /* Avoid converting op1 to result_type later.  */
3366	  converted = 1;
3367	}
3368      break;
3369
3370    case RROTATE_EXPR:
3371    case LROTATE_EXPR:
3372      if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3373	{
3374	  result_type = type0;
3375	  if (TREE_CODE (op1) == INTEGER_CST)
3376	    {
3377	      if (tree_int_cst_lt (op1, integer_zero_node))
3378		warning (0, "%s rotate count is negative",
3379			 (code == LROTATE_EXPR) ? "left" : "right");
3380	      else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
3381		warning (0, "%s rotate count >= width of type",
3382			 (code == LROTATE_EXPR) ? "left" : "right");
3383	    }
3384	  /* Convert the shift-count to an integer, regardless of
3385	     size of value being shifted.  */
3386	  if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3387	    op1 = cp_convert (integer_type_node, op1);
3388	}
3389      break;
3390
3391    case EQ_EXPR:
3392    case NE_EXPR:
3393      if (code0 == REAL_TYPE || code1 == REAL_TYPE)
3394	warning (OPT_Wfloat_equal,
3395		 "comparing floating point with == or != is unsafe");
3396      if ((TREE_CODE (orig_op0) == STRING_CST && !integer_zerop (op1))
3397	  || (TREE_CODE (orig_op1) == STRING_CST && !integer_zerop (op0)))
3398	warning (OPT_Waddress,
3399                 "comparison with string literal results in unspecified behaviour");
3400
3401      build_type = boolean_type_node;
3402      if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
3403	   || code0 == COMPLEX_TYPE)
3404	  && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
3405	      || code1 == COMPLEX_TYPE))
3406	short_compare = 1;
3407      /* APPLE LOCAL begin blocks 6040305 */
3408      else if (((code0 == POINTER_TYPE || code0 == BLOCK_POINTER_TYPE)
3409      && (code1 == POINTER_TYPE || code1 == BLOCK_POINTER_TYPE))
3410	       || (TYPE_PTRMEM_P (type0) && TYPE_PTRMEM_P (type1)))
3411      /* APPLE LOCAL end blocks 6040305 */
3412	result_type = composite_pointer_type (type0, type1, op0, op1,
3413					      "comparison");
3414      /* APPLE LOCAL blocks 6040305 (cl) */
3415      else if ((code0 == POINTER_TYPE || code0 == BLOCK_POINTER_TYPE || TYPE_PTRMEM_P (type0))
3416	       && null_ptr_cst_p (op1))
3417	result_type = type0;
3418      /* APPLE LOCAL blocks 6040305 (cl) */
3419      else if ((code1 == POINTER_TYPE || code1 == BLOCK_POINTER_TYPE || TYPE_PTRMEM_P (type1))
3420	       && null_ptr_cst_p (op0))
3421	result_type = type1;
3422      /* APPLE LOCAL blocks 6040305 (cl) */
3423      else if ((code0 == POINTER_TYPE || code0 == BLOCK_POINTER_TYPE) && code1 == INTEGER_TYPE)
3424	{
3425	  result_type = type0;
3426	  error ("ISO C++ forbids comparison between pointer and integer");
3427	}
3428      /* APPLE LOCAL blocks 6040305 (cl) */
3429      else if (code0 == INTEGER_TYPE && (code1 == POINTER_TYPE || code1 == BLOCK_POINTER_TYPE))
3430	{
3431	  result_type = type1;
3432	  error ("ISO C++ forbids comparison between pointer and integer");
3433	}
3434      else if (TYPE_PTRMEMFUNC_P (type0) && null_ptr_cst_p (op1))
3435	{
3436	  op0 = build_ptrmemfunc_access_expr (op0, pfn_identifier);
3437	  op1 = cp_convert (TREE_TYPE (op0), integer_zero_node);
3438	  result_type = TREE_TYPE (op0);
3439	}
3440      else if (TYPE_PTRMEMFUNC_P (type1) && null_ptr_cst_p (op0))
3441	return cp_build_binary_op (code, op1, op0);
3442      else if (TYPE_PTRMEMFUNC_P (type0) && TYPE_PTRMEMFUNC_P (type1)
3443	       && same_type_p (type0, type1))
3444	{
3445	  /* E will be the final comparison.  */
3446	  tree e;
3447	  /* E1 and E2 are for scratch.  */
3448	  tree e1;
3449	  tree e2;
3450	  tree pfn0;
3451	  tree pfn1;
3452	  tree delta0;
3453	  tree delta1;
3454
3455	  if (TREE_SIDE_EFFECTS (op0))
3456	    op0 = save_expr (op0);
3457	  if (TREE_SIDE_EFFECTS (op1))
3458	    op1 = save_expr (op1);
3459
3460	  /* We generate:
3461
3462	     (op0.pfn == op1.pfn
3463	      && (!op0.pfn || op0.delta == op1.delta))
3464
3465	     The reason for the `!op0.pfn' bit is that a NULL
3466	     pointer-to-member is any member with a zero PFN; the
3467	     DELTA field is unspecified.  */
3468	  pfn0 = pfn_from_ptrmemfunc (op0);
3469	  pfn1 = pfn_from_ptrmemfunc (op1);
3470	  delta0 = build_ptrmemfunc_access_expr (op0,
3471						 delta_identifier);
3472	  delta1 = build_ptrmemfunc_access_expr (op1,
3473						 delta_identifier);
3474	  e1 = cp_build_binary_op (EQ_EXPR, delta0, delta1);
3475	  e2 = cp_build_binary_op (EQ_EXPR,
3476				   pfn0,
3477				   cp_convert (TREE_TYPE (pfn0),
3478					       integer_zero_node));
3479	  e1 = cp_build_binary_op (TRUTH_ORIF_EXPR, e1, e2);
3480	  e2 = build2 (EQ_EXPR, boolean_type_node, pfn0, pfn1);
3481	  e = cp_build_binary_op (TRUTH_ANDIF_EXPR, e2, e1);
3482	  if (code == EQ_EXPR)
3483	    return e;
3484	  return cp_build_binary_op (EQ_EXPR, e, integer_zero_node);
3485	}
3486      else
3487	{
3488	  gcc_assert (!TYPE_PTRMEMFUNC_P (type0)
3489		      || !same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type0),
3490				       type1));
3491	  gcc_assert (!TYPE_PTRMEMFUNC_P (type1)
3492		      || !same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type1),
3493				       type0));
3494	}
3495
3496      break;
3497
3498    case MAX_EXPR:
3499    case MIN_EXPR:
3500      if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3501	   && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3502	shorten = 1;
3503      else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3504	result_type = composite_pointer_type (type0, type1, op0, op1,
3505					      "comparison");
3506      break;
3507
3508    case LE_EXPR:
3509    case GE_EXPR:
3510    case LT_EXPR:
3511    case GT_EXPR:
3512      if (TREE_CODE (orig_op0) == STRING_CST
3513	  || TREE_CODE (orig_op1) == STRING_CST)
3514	warning (OPT_Waddress,
3515                 "comparison with string literal results in unspecified behaviour");
3516
3517      build_type = boolean_type_node;
3518      if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3519	   && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3520	short_compare = 1;
3521      else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3522	result_type = composite_pointer_type (type0, type1, op0, op1,
3523					      "comparison");
3524      else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
3525	       && integer_zerop (op1))
3526	result_type = type0;
3527      else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
3528	       && integer_zerop (op0))
3529	result_type = type1;
3530      else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3531	{
3532	  result_type = type0;
3533	  pedwarn ("ISO C++ forbids comparison between pointer and integer");
3534	}
3535      else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
3536	{
3537	  result_type = type1;
3538	  pedwarn ("ISO C++ forbids comparison between pointer and integer");
3539	}
3540      break;
3541
3542    case UNORDERED_EXPR:
3543    case ORDERED_EXPR:
3544    case UNLT_EXPR:
3545    case UNLE_EXPR:
3546    case UNGT_EXPR:
3547    case UNGE_EXPR:
3548    case UNEQ_EXPR:
3549      build_type = integer_type_node;
3550      if (code0 != REAL_TYPE || code1 != REAL_TYPE)
3551	{
3552	  error ("unordered comparison on non-floating point argument");
3553	  return error_mark_node;
3554	}
3555      common = 1;
3556      break;
3557
3558    default:
3559      break;
3560    }
3561
3562  if (((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
3563       && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
3564	   || code1 == COMPLEX_TYPE)))
3565    arithmetic_types_p = 1;
3566  else
3567    {
3568      arithmetic_types_p = 0;
3569      /* Vector arithmetic is only allowed when both sides are vectors.  */
3570      if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
3571	{
3572	  if (!tree_int_cst_equal (TYPE_SIZE (type0), TYPE_SIZE (type1))
3573	      || !same_scalar_type_ignoring_signedness (TREE_TYPE (type0),
3574							TREE_TYPE (type1)))
3575	    {
3576	      binary_op_error (code, type0, type1);
3577	      return error_mark_node;
3578	    }
3579	  arithmetic_types_p = 1;
3580	}
3581    }
3582  /* Determine the RESULT_TYPE, if it is not already known.  */
3583  if (!result_type
3584      && arithmetic_types_p
3585      && (shorten || common || short_compare))
3586    result_type = common_type (type0, type1);
3587
3588  if (!result_type)
3589    {
3590      error ("invalid operands of types %qT and %qT to binary %qO",
3591	     TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), code);
3592      return error_mark_node;
3593    }
3594
3595  /* If we're in a template, the only thing we need to know is the
3596     RESULT_TYPE.  */
3597  if (processing_template_decl)
3598    return build2 (resultcode,
3599		   build_type ? build_type : result_type,
3600		   op0, op1);
3601
3602  if (arithmetic_types_p)
3603    {
3604      int none_complex = (code0 != COMPLEX_TYPE && code1 != COMPLEX_TYPE);
3605
3606      /* For certain operations (which identify themselves by shorten != 0)
3607	 if both args were extended from the same smaller type,
3608	 do the arithmetic in that type and then extend.
3609
3610	 shorten !=0 and !=1 indicates a bitwise operation.
3611	 For them, this optimization is safe only if
3612	 both args are zero-extended or both are sign-extended.
3613	 Otherwise, we might change the result.
3614	 Eg, (short)-1 | (unsigned short)-1 is (int)-1
3615	 but calculated in (unsigned short) it would be (unsigned short)-1.  */
3616
3617      if (shorten && none_complex)
3618	{
3619	  int unsigned0, unsigned1;
3620	  tree arg0 = get_narrower (op0, &unsigned0);
3621	  tree arg1 = get_narrower (op1, &unsigned1);
3622	  /* UNS is 1 if the operation to be done is an unsigned one.  */
3623	  int uns = TYPE_UNSIGNED (result_type);
3624	  tree type;
3625
3626	  final_type = result_type;
3627
3628	  /* Handle the case that OP0 does not *contain* a conversion
3629	     but it *requires* conversion to FINAL_TYPE.  */
3630
3631	  if (op0 == arg0 && TREE_TYPE (op0) != final_type)
3632	    unsigned0 = TYPE_UNSIGNED (TREE_TYPE (op0));
3633	  if (op1 == arg1 && TREE_TYPE (op1) != final_type)
3634	    unsigned1 = TYPE_UNSIGNED (TREE_TYPE (op1));
3635
3636	  /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE.  */
3637
3638	  /* For bitwise operations, signedness of nominal type
3639	     does not matter.  Consider only how operands were extended.  */
3640	  if (shorten == -1)
3641	    uns = unsigned0;
3642
3643	  /* Note that in all three cases below we refrain from optimizing
3644	     an unsigned operation on sign-extended args.
3645	     That would not be valid.  */
3646
3647	  /* Both args variable: if both extended in same way
3648	     from same width, do it in that width.
3649	     Do it unsigned if args were zero-extended.  */
3650	  if ((TYPE_PRECISION (TREE_TYPE (arg0))
3651	       < TYPE_PRECISION (result_type))
3652	      && (TYPE_PRECISION (TREE_TYPE (arg1))
3653		  == TYPE_PRECISION (TREE_TYPE (arg0)))
3654	      && unsigned0 == unsigned1
3655	      && (unsigned0 || !uns))
3656	    result_type = c_common_signed_or_unsigned_type
3657	      (unsigned0, common_type (TREE_TYPE (arg0), TREE_TYPE (arg1)));
3658	  else if (TREE_CODE (arg0) == INTEGER_CST
3659		   && (unsigned1 || !uns)
3660		   && (TYPE_PRECISION (TREE_TYPE (arg1))
3661		       < TYPE_PRECISION (result_type))
3662		   && (type = c_common_signed_or_unsigned_type
3663		       (unsigned1, TREE_TYPE (arg1)),
3664		       int_fits_type_p (arg0, type)))
3665	    result_type = type;
3666	  else if (TREE_CODE (arg1) == INTEGER_CST
3667		   && (unsigned0 || !uns)
3668		   && (TYPE_PRECISION (TREE_TYPE (arg0))
3669		       < TYPE_PRECISION (result_type))
3670		   && (type = c_common_signed_or_unsigned_type
3671		       (unsigned0, TREE_TYPE (arg0)),
3672		       int_fits_type_p (arg1, type)))
3673	    result_type = type;
3674	}
3675
3676      /* Shifts can be shortened if shifting right.  */
3677
3678      if (short_shift)
3679	{
3680	  int unsigned_arg;
3681	  tree arg0 = get_narrower (op0, &unsigned_arg);
3682
3683	  final_type = result_type;
3684
3685	  if (arg0 == op0 && final_type == TREE_TYPE (op0))
3686	    unsigned_arg = TYPE_UNSIGNED (TREE_TYPE (op0));
3687
3688	  if (TYPE_PRECISION (TREE_TYPE (arg0)) < TYPE_PRECISION (result_type)
3689	      /* We can shorten only if the shift count is less than the
3690		 number of bits in the smaller type size.  */
3691	      && compare_tree_int (op1, TYPE_PRECISION (TREE_TYPE (arg0))) < 0
3692	      /* If arg is sign-extended and then unsigned-shifted,
3693		 we can simulate this with a signed shift in arg's type
3694		 only if the extended result is at least twice as wide
3695		 as the arg.  Otherwise, the shift could use up all the
3696		 ones made by sign-extension and bring in zeros.
3697		 We can't optimize that case at all, but in most machines
3698		 it never happens because available widths are 2**N.  */
3699	      && (!TYPE_UNSIGNED (final_type)
3700		  || unsigned_arg
3701		  || (((unsigned) 2 * TYPE_PRECISION (TREE_TYPE (arg0)))
3702		      <= TYPE_PRECISION (result_type))))
3703	    {
3704	      /* Do an unsigned shift if the operand was zero-extended.  */
3705	      result_type
3706		= c_common_signed_or_unsigned_type (unsigned_arg,
3707						    TREE_TYPE (arg0));
3708	      /* Convert value-to-be-shifted to that type.  */
3709	      if (TREE_TYPE (op0) != result_type)
3710		op0 = cp_convert (result_type, op0);
3711	      converted = 1;
3712	    }
3713	}
3714
3715      /* Comparison operations are shortened too but differently.
3716	 They identify themselves by setting short_compare = 1.  */
3717
3718      if (short_compare)
3719	{
3720	  /* Don't write &op0, etc., because that would prevent op0
3721	     from being kept in a register.
3722	     Instead, make copies of the our local variables and
3723	     pass the copies by reference, then copy them back afterward.  */
3724	  tree xop0 = op0, xop1 = op1, xresult_type = result_type;
3725	  enum tree_code xresultcode = resultcode;
3726	  tree val
3727	    = shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
3728	  if (val != 0)
3729	    return cp_convert (boolean_type_node, val);
3730	  op0 = xop0, op1 = xop1;
3731	  converted = 1;
3732	  resultcode = xresultcode;
3733	}
3734
3735      if ((short_compare || code == MIN_EXPR || code == MAX_EXPR)
3736	  && warn_sign_compare
3737	  /* Do not warn until the template is instantiated; we cannot
3738	     bound the ranges of the arguments until that point.  */
3739	  && !processing_template_decl)
3740	{
3741	  int op0_signed = !TYPE_UNSIGNED (TREE_TYPE (orig_op0));
3742	  int op1_signed = !TYPE_UNSIGNED (TREE_TYPE (orig_op1));
3743
3744	  int unsignedp0, unsignedp1;
3745	  tree primop0 = get_narrower (op0, &unsignedp0);
3746	  tree primop1 = get_narrower (op1, &unsignedp1);
3747
3748	  /* Check for comparison of different enum types.  */
3749	  if (TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
3750	      && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE
3751	      && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0))
3752		 != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
3753	    {
3754	      warning (0, "comparison between types %q#T and %q#T",
3755		       TREE_TYPE (orig_op0), TREE_TYPE (orig_op1));
3756	    }
3757
3758	  /* Give warnings for comparisons between signed and unsigned
3759	     quantities that may fail.  */
3760	  /* Do the checking based on the original operand trees, so that
3761	     casts will be considered, but default promotions won't be.  */
3762
3763	  /* Do not warn if the comparison is being done in a signed type,
3764	     since the signed type will only be chosen if it can represent
3765	     all the values of the unsigned type.  */
3766	  if (!TYPE_UNSIGNED (result_type))
3767	    /* OK */;
3768	  /* Do not warn if both operands are unsigned.  */
3769	  else if (op0_signed == op1_signed)
3770	    /* OK */;
3771	  /* Do not warn if the signed quantity is an unsuffixed
3772	     integer literal (or some static constant expression
3773	     involving such literals or a conditional expression
3774	     involving such literals) and it is non-negative.  */
3775	  else if ((op0_signed && tree_expr_nonnegative_p (orig_op0))
3776		   || (op1_signed && tree_expr_nonnegative_p (orig_op1)))
3777	    /* OK */;
3778	  /* Do not warn if the comparison is an equality operation,
3779	     the unsigned quantity is an integral constant and it does
3780	     not use the most significant bit of result_type.  */
3781	  else if ((resultcode == EQ_EXPR || resultcode == NE_EXPR)
3782		   && ((op0_signed && TREE_CODE (orig_op1) == INTEGER_CST
3783			&& int_fits_type_p (orig_op1, c_common_signed_type
3784					    (result_type)))
3785			|| (op1_signed && TREE_CODE (orig_op0) == INTEGER_CST
3786			    && int_fits_type_p (orig_op0, c_common_signed_type
3787						(result_type)))))
3788	    /* OK */;
3789	  else
3790	    warning (0, "comparison between signed and unsigned integer expressions");
3791
3792	  /* Warn if two unsigned values are being compared in a size
3793	     larger than their original size, and one (and only one) is the
3794	     result of a `~' operator.  This comparison will always fail.
3795
3796	     Also warn if one operand is a constant, and the constant does not
3797	     have all bits set that are set in the ~ operand when it is
3798	     extended.  */
3799
3800	  if ((TREE_CODE (primop0) == BIT_NOT_EXPR)
3801	      ^ (TREE_CODE (primop1) == BIT_NOT_EXPR))
3802	    {
3803	      if (TREE_CODE (primop0) == BIT_NOT_EXPR)
3804		primop0 = get_narrower (TREE_OPERAND (op0, 0), &unsignedp0);
3805	      if (TREE_CODE (primop1) == BIT_NOT_EXPR)
3806		primop1 = get_narrower (TREE_OPERAND (op1, 0), &unsignedp1);
3807
3808	      if (host_integerp (primop0, 0) || host_integerp (primop1, 0))
3809		{
3810		  tree primop;
3811		  HOST_WIDE_INT constant, mask;
3812		  int unsignedp;
3813		  unsigned int bits;
3814
3815		  if (host_integerp (primop0, 0))
3816		    {
3817		      primop = primop1;
3818		      unsignedp = unsignedp1;
3819		      constant = tree_low_cst (primop0, 0);
3820		    }
3821		  else
3822		    {
3823		      primop = primop0;
3824		      unsignedp = unsignedp0;
3825		      constant = tree_low_cst (primop1, 0);
3826		    }
3827
3828		  bits = TYPE_PRECISION (TREE_TYPE (primop));
3829		  if (bits < TYPE_PRECISION (result_type)
3830		      && bits < HOST_BITS_PER_LONG && unsignedp)
3831		    {
3832		      mask = (~ (HOST_WIDE_INT) 0) << bits;
3833		      if ((mask & constant) != mask)
3834			warning (0, "comparison of promoted ~unsigned with constant");
3835		    }
3836		}
3837	      else if (unsignedp0 && unsignedp1
3838		       && (TYPE_PRECISION (TREE_TYPE (primop0))
3839			   < TYPE_PRECISION (result_type))
3840		       && (TYPE_PRECISION (TREE_TYPE (primop1))
3841			   < TYPE_PRECISION (result_type)))
3842		warning (0, "comparison of promoted ~unsigned with unsigned");
3843	    }
3844	}
3845    }
3846
3847  /* If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
3848     Then the expression will be built.
3849     It will be given type FINAL_TYPE if that is nonzero;
3850     otherwise, it will be given type RESULT_TYPE.  */
3851
3852  /* Issue warnings about peculiar, but valid, uses of NULL.  */
3853  if (/* It's reasonable to use pointer values as operands of &&
3854	 and ||, so NULL is no exception.  */
3855      !(code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
3856      && (/* If OP0 is NULL and OP1 is not a pointer, or vice versa.  */
3857	  (orig_op0 == null_node
3858	   && TREE_CODE (TREE_TYPE (op1)) != POINTER_TYPE)
3859	  /* Or vice versa.  */
3860	  || (orig_op1 == null_node
3861	      && TREE_CODE (TREE_TYPE (op0)) != POINTER_TYPE)
3862	  /* Or, both are NULL and the operation was not a comparison.  */
3863	  || (orig_op0 == null_node && orig_op1 == null_node
3864	      && code != EQ_EXPR && code != NE_EXPR)))
3865    /* Some sort of arithmetic operation involving NULL was
3866       performed.  Note that pointer-difference and pointer-addition
3867       have already been handled above, and so we don't end up here in
3868       that case.  */
3869    warning (0, "NULL used in arithmetic");
3870
3871  if (! converted)
3872    {
3873      if (TREE_TYPE (op0) != result_type)
3874	op0 = cp_convert (result_type, op0);
3875      if (TREE_TYPE (op1) != result_type)
3876	op1 = cp_convert (result_type, op1);
3877
3878      if (op0 == error_mark_node || op1 == error_mark_node)
3879	return error_mark_node;
3880    }
3881
3882  if (build_type == NULL_TREE)
3883    build_type = result_type;
3884
3885  result = build2 (resultcode, build_type, op0, op1);
3886  result = fold_if_not_in_template (result);
3887  if (final_type != 0)
3888    result = cp_convert (final_type, result);
3889
3890  if (TREE_OVERFLOW_P (result)
3891      && !TREE_OVERFLOW_P (op0)
3892      && !TREE_OVERFLOW_P (op1))
3893    overflow_warning (result);
3894
3895  return result;
3896}
3897
3898/* Return a tree for the sum or difference (RESULTCODE says which)
3899   of pointer PTROP and integer INTOP.  */
3900
3901static tree
3902cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
3903{
3904  tree res_type = TREE_TYPE (ptrop);
3905
3906  /* pointer_int_sum() uses size_in_bytes() on the TREE_TYPE(res_type)
3907     in certain circumstance (when it's valid to do so).  So we need
3908     to make sure it's complete.  We don't need to check here, if we
3909     can actually complete it at all, as those checks will be done in
3910     pointer_int_sum() anyway.  */
3911  complete_type (TREE_TYPE (res_type));
3912
3913  return pointer_int_sum (resultcode, ptrop,
3914			  fold_if_not_in_template (intop));
3915}
3916
3917/* Return a tree for the difference of pointers OP0 and OP1.
3918   The resulting tree has type int.  */
3919
3920static tree
3921pointer_diff (tree op0, tree op1, tree ptrtype)
3922{
3923  tree result;
3924  tree restype = ptrdiff_type_node;
3925  tree target_type = TREE_TYPE (ptrtype);
3926
3927  if (!complete_type_or_else (target_type, NULL_TREE))
3928    return error_mark_node;
3929
3930  if (pedantic || warn_pointer_arith)
3931    {
3932      if (TREE_CODE (target_type) == VOID_TYPE)
3933	pedwarn ("ISO C++ forbids using pointer of type %<void *%> in subtraction");
3934      if (TREE_CODE (target_type) == FUNCTION_TYPE)
3935	pedwarn ("ISO C++ forbids using pointer to a function in subtraction");
3936      if (TREE_CODE (target_type) == METHOD_TYPE)
3937	pedwarn ("ISO C++ forbids using pointer to a method in subtraction");
3938    }
3939
3940  /* First do the subtraction as integers;
3941     then drop through to build the divide operator.  */
3942
3943  op0 = cp_build_binary_op (MINUS_EXPR,
3944			    cp_convert (restype, op0),
3945			    cp_convert (restype, op1));
3946
3947  /* This generates an error if op1 is a pointer to an incomplete type.  */
3948  if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (op1))))
3949    error ("invalid use of a pointer to an incomplete type in pointer arithmetic");
3950
3951  op1 = (TYPE_PTROB_P (ptrtype)
3952	 ? size_in_bytes (target_type)
3953	 : integer_one_node);
3954
3955  /* Do the division.  */
3956
3957  result = build2 (EXACT_DIV_EXPR, restype, op0, cp_convert (restype, op1));
3958  return fold_if_not_in_template (result);
3959}
3960
3961/* Construct and perhaps optimize a tree representation
3962   for a unary operation.  CODE, a tree_code, specifies the operation
3963   and XARG is the operand.  */
3964
3965tree
3966build_x_unary_op (enum tree_code code, tree xarg)
3967{
3968  tree orig_expr = xarg;
3969  tree exp;
3970  int ptrmem = 0;
3971
3972  if (processing_template_decl)
3973    {
3974      if (type_dependent_expression_p (xarg))
3975	return build_min_nt (code, xarg, NULL_TREE);
3976
3977      xarg = build_non_dependent_expr (xarg);
3978    }
3979
3980  exp = NULL_TREE;
3981
3982  /* [expr.unary.op] says:
3983
3984       The address of an object of incomplete type can be taken.
3985
3986     (And is just the ordinary address operator, not an overloaded
3987     "operator &".)  However, if the type is a template
3988     specialization, we must complete the type at this point so that
3989     an overloaded "operator &" will be available if required.  */
3990  if (code == ADDR_EXPR
3991      && TREE_CODE (xarg) != TEMPLATE_ID_EXPR
3992      && ((CLASS_TYPE_P (TREE_TYPE (xarg))
3993	   && !COMPLETE_TYPE_P (complete_type (TREE_TYPE (xarg))))
3994	  || (TREE_CODE (xarg) == OFFSET_REF)))
3995    /* Don't look for a function.  */;
3996  else
3997    exp = build_new_op (code, LOOKUP_NORMAL, xarg, NULL_TREE, NULL_TREE,
3998			/*overloaded_p=*/NULL);
3999  if (!exp && code == ADDR_EXPR)
4000    {
4001      /*  A pointer to member-function can be formed only by saying
4002	  &X::mf.  */
4003      if (!flag_ms_extensions && TREE_CODE (TREE_TYPE (xarg)) == METHOD_TYPE
4004	  && (TREE_CODE (xarg) != OFFSET_REF || !PTRMEM_OK_P (xarg)))
4005	{
4006	  if (TREE_CODE (xarg) != OFFSET_REF
4007	      || !TYPE_P (TREE_OPERAND (xarg, 0)))
4008	    {
4009	      error ("invalid use of %qE to form a pointer-to-member-function",
4010		     xarg);
4011	      if (TREE_CODE (xarg) != OFFSET_REF)
4012		inform ("  a qualified-id is required");
4013	      return error_mark_node;
4014	    }
4015	  else
4016	    {
4017	      error ("parentheses around %qE cannot be used to form a"
4018		     " pointer-to-member-function",
4019		     xarg);
4020	      PTRMEM_OK_P (xarg) = 1;
4021	    }
4022	}
4023
4024      if (TREE_CODE (xarg) == OFFSET_REF)
4025	{
4026	  ptrmem = PTRMEM_OK_P (xarg);
4027
4028	  if (!ptrmem && !flag_ms_extensions
4029	      && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE)
4030	    {
4031	      /* A single non-static member, make sure we don't allow a
4032		 pointer-to-member.  */
4033	      xarg = build2 (OFFSET_REF, TREE_TYPE (xarg),
4034			     TREE_OPERAND (xarg, 0),
4035			     ovl_cons (TREE_OPERAND (xarg, 1), NULL_TREE));
4036	      PTRMEM_OK_P (xarg) = ptrmem;
4037	    }
4038	}
4039      else if (TREE_CODE (xarg) == TARGET_EXPR)
4040	warning (0, "taking address of temporary");
4041      exp = build_unary_op (ADDR_EXPR, xarg, 0);
4042    }
4043
4044  if (processing_template_decl && exp != error_mark_node)
4045    exp = build_min_non_dep (code, exp, orig_expr,
4046			     /*For {PRE,POST}{INC,DEC}REMENT_EXPR*/NULL_TREE);
4047  if (TREE_CODE (exp) == ADDR_EXPR)
4048    PTRMEM_OK_P (exp) = ptrmem;
4049  return exp;
4050}
4051
4052/* Like c_common_truthvalue_conversion, but handle pointer-to-member
4053   constants, where a null value is represented by an INTEGER_CST of
4054   -1.  */
4055
4056tree
4057cp_truthvalue_conversion (tree expr)
4058{
4059  tree type = TREE_TYPE (expr);
4060  if (TYPE_PTRMEM_P (type))
4061    return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
4062  else
4063    return c_common_truthvalue_conversion (expr);
4064}
4065
4066/* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR.  */
4067
4068tree
4069condition_conversion (tree expr)
4070{
4071  tree t;
4072  if (processing_template_decl)
4073    return expr;
4074  t = perform_implicit_conversion (boolean_type_node, expr);
4075  t = fold_build_cleanup_point_expr (boolean_type_node, t);
4076  return t;
4077}
4078
4079/* Return an ADDR_EXPR giving the address of T.  This function
4080   attempts no optimizations or simplifications; it is a low-level
4081   primitive.  */
4082
4083tree
4084build_address (tree t)
4085{
4086  tree addr;
4087
4088  if (error_operand_p (t) || !cxx_mark_addressable (t))
4089    return error_mark_node;
4090
4091  addr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (t)), t);
4092
4093  return addr;
4094}
4095
4096/* Return a NOP_EXPR converting EXPR to TYPE.  */
4097
4098tree
4099build_nop (tree type, tree expr)
4100{
4101  if (type == error_mark_node || error_operand_p (expr))
4102    return expr;
4103  return build1 (NOP_EXPR, type, expr);
4104}
4105
4106/* C++: Must handle pointers to members.
4107
4108   Perhaps type instantiation should be extended to handle conversion
4109   from aggregates to types we don't yet know we want?  (Or are those
4110   cases typically errors which should be reported?)
4111
4112   NOCONVERT nonzero suppresses the default promotions
4113   (such as from short to int).  */
4114
4115tree
4116build_unary_op (enum tree_code code, tree xarg, int noconvert)
4117{
4118  /* No default_conversion here.  It causes trouble for ADDR_EXPR.  */
4119  tree arg = xarg;
4120  tree argtype = 0;
4121  const char *errstring = NULL;
4122  tree val;
4123  const char *invalid_op_diag;
4124
4125  if (arg == error_mark_node)
4126    return error_mark_node;
4127
4128  if ((invalid_op_diag
4129       = targetm.invalid_unary_op ((code == UNARY_PLUS_EXPR
4130				    ? CONVERT_EXPR
4131				    : code),
4132				   TREE_TYPE (xarg))))
4133    {
4134      error (invalid_op_diag, "");
4135      return error_mark_node;
4136    }
4137
4138  switch (code)
4139    {
4140    case UNARY_PLUS_EXPR:
4141    case NEGATE_EXPR:
4142      {
4143	int flags = WANT_ARITH | WANT_ENUM;
4144	/* Unary plus (but not unary minus) is allowed on pointers.  */
4145	if (code == UNARY_PLUS_EXPR)
4146	  flags |= WANT_POINTER;
4147	arg = build_expr_type_conversion (flags, arg, true);
4148	if (!arg)
4149	  errstring = (code == NEGATE_EXPR
4150		       ? "wrong type argument to unary minus"
4151		       : "wrong type argument to unary plus");
4152	else
4153	  {
4154	    if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
4155	      arg = perform_integral_promotions (arg);
4156
4157	    /* Make sure the result is not an lvalue: a unary plus or minus
4158	       expression is always a rvalue.  */
4159	    arg = rvalue (arg);
4160	  }
4161      }
4162      break;
4163
4164    case BIT_NOT_EXPR:
4165      if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4166	{
4167	  code = CONJ_EXPR;
4168	  if (!noconvert)
4169	    arg = default_conversion (arg);
4170	}
4171      else if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM
4172						   | WANT_VECTOR,
4173						   arg, true)))
4174	errstring = "wrong type argument to bit-complement";
4175      else if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
4176	arg = perform_integral_promotions (arg);
4177      break;
4178
4179    case ABS_EXPR:
4180      if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
4181	errstring = "wrong type argument to abs";
4182      else if (!noconvert)
4183	arg = default_conversion (arg);
4184      break;
4185
4186    case CONJ_EXPR:
4187      /* Conjugating a real value is a no-op, but allow it anyway.  */
4188      if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
4189	errstring = "wrong type argument to conjugation";
4190      else if (!noconvert)
4191	arg = default_conversion (arg);
4192      break;
4193
4194    case TRUTH_NOT_EXPR:
4195      arg = perform_implicit_conversion (boolean_type_node, arg);
4196      val = invert_truthvalue (arg);
4197      if (arg != error_mark_node)
4198	return val;
4199      errstring = "in argument to unary !";
4200      break;
4201
4202    case NOP_EXPR:
4203      break;
4204
4205    case REALPART_EXPR:
4206      if (TREE_CODE (arg) == COMPLEX_CST)
4207	return TREE_REALPART (arg);
4208      else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4209	{
4210	  arg = build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
4211	  return fold_if_not_in_template (arg);
4212	}
4213      else
4214	return arg;
4215
4216    case IMAGPART_EXPR:
4217      if (TREE_CODE (arg) == COMPLEX_CST)
4218	return TREE_IMAGPART (arg);
4219      else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4220	{
4221	  arg = build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
4222	  return fold_if_not_in_template (arg);
4223	}
4224      else
4225	return cp_convert (TREE_TYPE (arg), integer_zero_node);
4226
4227    case PREINCREMENT_EXPR:
4228    case POSTINCREMENT_EXPR:
4229    case PREDECREMENT_EXPR:
4230    case POSTDECREMENT_EXPR:
4231      /* Handle complex lvalues (when permitted)
4232	 by reduction to simpler cases.  */
4233
4234      val = unary_complex_lvalue (code, arg);
4235      if (val != 0)
4236	return val;
4237
4238      /* Increment or decrement the real part of the value,
4239	 and don't change the imaginary part.  */
4240      if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4241	{
4242	  tree real, imag;
4243
4244	  arg = stabilize_reference (arg);
4245	  real = build_unary_op (REALPART_EXPR, arg, 1);
4246	  imag = build_unary_op (IMAGPART_EXPR, arg, 1);
4247	  return build2 (COMPLEX_EXPR, TREE_TYPE (arg),
4248			 build_unary_op (code, real, 1), imag);
4249	}
4250
4251      /* Report invalid types.  */
4252
4253      if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_POINTER,
4254					      arg, true)))
4255	{
4256	  if (code == PREINCREMENT_EXPR)
4257	    errstring ="no pre-increment operator for type";
4258	  else if (code == POSTINCREMENT_EXPR)
4259	    errstring ="no post-increment operator for type";
4260	  else if (code == PREDECREMENT_EXPR)
4261	    errstring ="no pre-decrement operator for type";
4262	  else
4263	    errstring ="no post-decrement operator for type";
4264	  break;
4265	}
4266
4267      /* Report something read-only.  */
4268
4269      if (CP_TYPE_CONST_P (TREE_TYPE (arg))
4270	  || TREE_READONLY (arg))
4271	readonly_error (arg, ((code == PREINCREMENT_EXPR
4272			       || code == POSTINCREMENT_EXPR)
4273			      ? "increment" : "decrement"),
4274			0);
4275
4276      {
4277	tree inc;
4278	tree declared_type;
4279	tree result_type = TREE_TYPE (arg);
4280
4281	declared_type = unlowered_expr_type (arg);
4282
4283	arg = get_unwidened (arg, 0);
4284	argtype = TREE_TYPE (arg);
4285
4286	/* ARM $5.2.5 last annotation says this should be forbidden.  */
4287	if (TREE_CODE (argtype) == ENUMERAL_TYPE)
4288	  pedwarn ("ISO C++ forbids %sing an enum",
4289		   (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
4290		   ? "increment" : "decrement");
4291
4292	/* Compute the increment.  */
4293
4294	if (TREE_CODE (argtype) == POINTER_TYPE)
4295	  {
4296	    tree type = complete_type (TREE_TYPE (argtype));
4297
4298	    if (!COMPLETE_OR_VOID_TYPE_P (type))
4299	      error ("cannot %s a pointer to incomplete type %qT",
4300		     ((code == PREINCREMENT_EXPR
4301		       || code == POSTINCREMENT_EXPR)
4302		      ? "increment" : "decrement"), TREE_TYPE (argtype));
4303	    else if ((pedantic || warn_pointer_arith)
4304		     && !TYPE_PTROB_P (argtype))
4305	      pedwarn ("ISO C++ forbids %sing a pointer of type %qT",
4306		       ((code == PREINCREMENT_EXPR
4307			 || code == POSTINCREMENT_EXPR)
4308			? "increment" : "decrement"), argtype);
4309	    inc = cxx_sizeof_nowarn (TREE_TYPE (argtype));
4310	  }
4311	else
4312	  inc = integer_one_node;
4313
4314	inc = cp_convert (argtype, inc);
4315
4316	/* Handle incrementing a cast-expression.  */
4317
4318	switch (TREE_CODE (arg))
4319	  {
4320	  case NOP_EXPR:
4321	  case CONVERT_EXPR:
4322	  case FLOAT_EXPR:
4323	  case FIX_TRUNC_EXPR:
4324	  case FIX_FLOOR_EXPR:
4325	  case FIX_ROUND_EXPR:
4326	  case FIX_CEIL_EXPR:
4327	    {
4328	      tree incremented, modify, value, compound;
4329	      if (! lvalue_p (arg) && pedantic)
4330		pedwarn ("cast to non-reference type used as lvalue");
4331	      arg = stabilize_reference (arg);
4332	      if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
4333		value = arg;
4334	      else
4335		value = save_expr (arg);
4336	      incremented = build2 (((code == PREINCREMENT_EXPR
4337				      || code == POSTINCREMENT_EXPR)
4338				     ? PLUS_EXPR : MINUS_EXPR),
4339				    argtype, value, inc);
4340
4341	      modify = build_modify_expr (arg, NOP_EXPR, incremented);
4342	      compound = build2 (COMPOUND_EXPR, TREE_TYPE (arg),
4343				 modify, value);
4344
4345	      /* Eliminate warning about unused result of + or -.  */
4346	      TREE_NO_WARNING (compound) = 1;
4347	      return compound;
4348	    }
4349
4350	  default:
4351	    break;
4352	  }
4353
4354	/* Complain about anything else that is not a true lvalue.  */
4355	if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
4356				    || code == POSTINCREMENT_EXPR)
4357				   ? lv_increment : lv_decrement)))
4358	  return error_mark_node;
4359
4360	/* Forbid using -- on `bool'.  */
4361	if (same_type_p (declared_type, boolean_type_node))
4362	  {
4363	    if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
4364	      {
4365		error ("invalid use of %<--%> on bool variable %qD", arg);
4366		return error_mark_node;
4367	      }
4368	    val = boolean_increment (code, arg);
4369	  }
4370	else
4371	  val = build2 (code, TREE_TYPE (arg), arg, inc);
4372
4373	TREE_SIDE_EFFECTS (val) = 1;
4374	return cp_convert (result_type, val);
4375      }
4376
4377    case ADDR_EXPR:
4378      /* Note that this operation never does default_conversion
4379	 regardless of NOCONVERT.  */
4380
4381      argtype = lvalue_type (arg);
4382
4383      if (TREE_CODE (arg) == OFFSET_REF)
4384	goto offset_ref;
4385
4386      if (TREE_CODE (argtype) == REFERENCE_TYPE)
4387	{
4388	  tree type = build_pointer_type (TREE_TYPE (argtype));
4389	  arg = build1 (CONVERT_EXPR, type, arg);
4390	  return arg;
4391	}
4392      else if (pedantic && DECL_MAIN_P (arg))
4393	/* ARM $3.4 */
4394	pedwarn ("ISO C++ forbids taking address of function %<::main%>");
4395
4396      /* Let &* cancel out to simplify resulting code.  */
4397      if (TREE_CODE (arg) == INDIRECT_REF)
4398	{
4399	  /* We don't need to have `current_class_ptr' wrapped in a
4400	     NON_LVALUE_EXPR node.  */
4401	  if (arg == current_class_ref)
4402	    return current_class_ptr;
4403
4404	  arg = TREE_OPERAND (arg, 0);
4405	  if (TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE)
4406	    {
4407	      tree type = build_pointer_type (TREE_TYPE (TREE_TYPE (arg)));
4408	      arg = build1 (CONVERT_EXPR, type, arg);
4409	    }
4410	  else
4411	    /* Don't let this be an lvalue.  */
4412	    arg = rvalue (arg);
4413	  return arg;
4414	}
4415
4416      /* Uninstantiated types are all functions.  Taking the
4417	 address of a function is a no-op, so just return the
4418	 argument.  */
4419
4420      gcc_assert (TREE_CODE (arg) != IDENTIFIER_NODE
4421		  || !IDENTIFIER_OPNAME_P (arg));
4422
4423      if (TREE_CODE (arg) == COMPONENT_REF && type_unknown_p (arg)
4424	  && !really_overloaded_fn (TREE_OPERAND (arg, 1)))
4425	{
4426	  /* They're trying to take the address of a unique non-static
4427	     member function.  This is ill-formed (except in MS-land),
4428	     but let's try to DTRT.
4429	     Note: We only handle unique functions here because we don't
4430	     want to complain if there's a static overload; non-unique
4431	     cases will be handled by instantiate_type.  But we need to
4432	     handle this case here to allow casts on the resulting PMF.
4433	     We could defer this in non-MS mode, but it's easier to give
4434	     a useful error here.  */
4435
4436	  /* Inside constant member functions, the `this' pointer
4437	     contains an extra const qualifier.  TYPE_MAIN_VARIANT
4438	     is used here to remove this const from the diagnostics
4439	     and the created OFFSET_REF.  */
4440	  tree base = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg, 0)));
4441	  tree fn = get_first_fn (TREE_OPERAND (arg, 1));
4442	  mark_used (fn);
4443
4444	  if (! flag_ms_extensions)
4445	    {
4446	      tree name = DECL_NAME (fn);
4447	      if (current_class_type
4448		  && TREE_OPERAND (arg, 0) == current_class_ref)
4449		/* An expression like &memfn.  */
4450		pedwarn ("ISO C++ forbids taking the address of an unqualified"
4451			 " or parenthesized non-static member function to form"
4452			 " a pointer to member function.  Say %<&%T::%D%>",
4453			 base, name);
4454	      else
4455		pedwarn ("ISO C++ forbids taking the address of a bound member"
4456			 " function to form a pointer to member function."
4457			 "  Say %<&%T::%D%>",
4458			 base, name);
4459	    }
4460	  arg = build_offset_ref (base, fn, /*address_p=*/true);
4461	}
4462
4463    offset_ref:
4464      if (type_unknown_p (arg))
4465	return build1 (ADDR_EXPR, unknown_type_node, arg);
4466
4467      /* Handle complex lvalues (when permitted)
4468	 by reduction to simpler cases.  */
4469      val = unary_complex_lvalue (code, arg);
4470      if (val != 0)
4471	return val;
4472
4473      switch (TREE_CODE (arg))
4474	{
4475	case NOP_EXPR:
4476	case CONVERT_EXPR:
4477	case FLOAT_EXPR:
4478	case FIX_TRUNC_EXPR:
4479	case FIX_FLOOR_EXPR:
4480	case FIX_ROUND_EXPR:
4481	case FIX_CEIL_EXPR:
4482	  if (! lvalue_p (arg) && pedantic)
4483	    pedwarn ("ISO C++ forbids taking the address of a cast to a non-lvalue expression");
4484	  break;
4485
4486	case BASELINK:
4487	  arg = BASELINK_FUNCTIONS (arg);
4488	  /* Fall through.  */
4489
4490	case OVERLOAD:
4491	  arg = OVL_CURRENT (arg);
4492	  break;
4493
4494	case OFFSET_REF:
4495	  /* Turn a reference to a non-static data member into a
4496	     pointer-to-member.  */
4497	  {
4498	    tree type;
4499	    tree t;
4500
4501	    if (!PTRMEM_OK_P (arg))
4502	      return build_unary_op (code, arg, 0);
4503
4504	    t = TREE_OPERAND (arg, 1);
4505	    if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
4506	      {
4507		error ("cannot create pointer to reference member %qD", t);
4508		return error_mark_node;
4509	      }
4510
4511	    type = build_ptrmem_type (context_for_name_lookup (t),
4512				      TREE_TYPE (t));
4513	    t = make_ptrmem_cst (type, TREE_OPERAND (arg, 1));
4514	    return t;
4515	  }
4516
4517	default:
4518	  break;
4519	}
4520
4521      /* Anything not already handled and not a true memory reference
4522	 is an error.  */
4523      if (TREE_CODE (argtype) != FUNCTION_TYPE
4524	  && TREE_CODE (argtype) != METHOD_TYPE
4525	  && TREE_CODE (arg) != OFFSET_REF
4526	  && !lvalue_or_else (arg, lv_addressof))
4527	return error_mark_node;
4528
4529      if (argtype != error_mark_node)
4530	argtype = build_pointer_type (argtype);
4531
4532      /* In a template, we are processing a non-dependent expression
4533	 so we can just form an ADDR_EXPR with the correct type.  */
4534      if (processing_template_decl)
4535	{
4536	  val = build_address (arg);
4537	  if (TREE_CODE (arg) == OFFSET_REF)
4538	    PTRMEM_OK_P (val) = PTRMEM_OK_P (arg);
4539	  return val;
4540	}
4541
4542      if (TREE_CODE (arg) != COMPONENT_REF)
4543	{
4544	  val = build_address (arg);
4545	  if (TREE_CODE (arg) == OFFSET_REF)
4546	    PTRMEM_OK_P (val) = PTRMEM_OK_P (arg);
4547	}
4548      else if (TREE_CODE (TREE_OPERAND (arg, 1)) == BASELINK)
4549	{
4550	  tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1));
4551
4552	  /* We can only get here with a single static member
4553	     function.  */
4554	  gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
4555		      && DECL_STATIC_FUNCTION_P (fn));
4556	  mark_used (fn);
4557	  val = build_address (fn);
4558	  if (TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
4559	    /* Do not lose object's side effects.  */
4560	    val = build2 (COMPOUND_EXPR, TREE_TYPE (val),
4561			  TREE_OPERAND (arg, 0), val);
4562	}
4563      else if (DECL_C_BIT_FIELD (TREE_OPERAND (arg, 1)))
4564	{
4565	  error ("attempt to take address of bit-field structure member %qD",
4566		 TREE_OPERAND (arg, 1));
4567	  return error_mark_node;
4568	}
4569      else
4570	{
4571	  tree object = TREE_OPERAND (arg, 0);
4572	  tree field = TREE_OPERAND (arg, 1);
4573	  gcc_assert (same_type_ignoring_top_level_qualifiers_p
4574		      (TREE_TYPE (object), decl_type_context (field)));
4575	  val = build_address (arg);
4576	}
4577
4578      if (TREE_CODE (argtype) == POINTER_TYPE
4579	  && TREE_CODE (TREE_TYPE (argtype)) == METHOD_TYPE)
4580	{
4581	  build_ptrmemfunc_type (argtype);
4582	  val = build_ptrmemfunc (argtype, val, 0,
4583				  /*c_cast_p=*/false);
4584	}
4585
4586      return val;
4587
4588    default:
4589      break;
4590    }
4591
4592  if (!errstring)
4593    {
4594      if (argtype == 0)
4595	argtype = TREE_TYPE (arg);
4596      return fold_if_not_in_template (build1 (code, argtype, arg));
4597    }
4598
4599  error ("%s", errstring);
4600  return error_mark_node;
4601}
4602
4603/* Apply unary lvalue-demanding operator CODE to the expression ARG
4604   for certain kinds of expressions which are not really lvalues
4605   but which we can accept as lvalues.
4606
4607   If ARG is not a kind of expression we can handle, return
4608   NULL_TREE.  */
4609
4610tree
4611unary_complex_lvalue (enum tree_code code, tree arg)
4612{
4613  /* Inside a template, making these kinds of adjustments is
4614     pointless; we are only concerned with the type of the
4615     expression.  */
4616  if (processing_template_decl)
4617    return NULL_TREE;
4618
4619  /* Handle (a, b) used as an "lvalue".  */
4620  if (TREE_CODE (arg) == COMPOUND_EXPR)
4621    {
4622      tree real_result = build_unary_op (code, TREE_OPERAND (arg, 1), 0);
4623      return build2 (COMPOUND_EXPR, TREE_TYPE (real_result),
4624		     TREE_OPERAND (arg, 0), real_result);
4625    }
4626
4627  /* Handle (a ? b : c) used as an "lvalue".  */
4628  if (TREE_CODE (arg) == COND_EXPR
4629      || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR)
4630    return rationalize_conditional_expr (code, arg);
4631
4632  /* Handle (a = b), (++a), and (--a) used as an "lvalue".  */
4633  if (TREE_CODE (arg) == MODIFY_EXPR
4634      || TREE_CODE (arg) == PREINCREMENT_EXPR
4635      || TREE_CODE (arg) == PREDECREMENT_EXPR)
4636    {
4637      tree lvalue = TREE_OPERAND (arg, 0);
4638      if (TREE_SIDE_EFFECTS (lvalue))
4639	{
4640	  lvalue = stabilize_reference (lvalue);
4641	  arg = build2 (TREE_CODE (arg), TREE_TYPE (arg),
4642			lvalue, TREE_OPERAND (arg, 1));
4643	}
4644      return unary_complex_lvalue
4645	(code, build2 (COMPOUND_EXPR, TREE_TYPE (lvalue), arg, lvalue));
4646    }
4647
4648  if (code != ADDR_EXPR)
4649    return NULL_TREE;
4650
4651  /* Handle (a = b) used as an "lvalue" for `&'.  */
4652  if (TREE_CODE (arg) == MODIFY_EXPR
4653      || TREE_CODE (arg) == INIT_EXPR)
4654    {
4655      tree real_result = build_unary_op (code, TREE_OPERAND (arg, 0), 0);
4656      arg = build2 (COMPOUND_EXPR, TREE_TYPE (real_result),
4657		    arg, real_result);
4658      TREE_NO_WARNING (arg) = 1;
4659      return arg;
4660    }
4661
4662  if (TREE_CODE (TREE_TYPE (arg)) == FUNCTION_TYPE
4663      || TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
4664      || TREE_CODE (arg) == OFFSET_REF)
4665    return NULL_TREE;
4666
4667  /* We permit compiler to make function calls returning
4668     objects of aggregate type look like lvalues.  */
4669  {
4670    tree targ = arg;
4671
4672    if (TREE_CODE (targ) == SAVE_EXPR)
4673      targ = TREE_OPERAND (targ, 0);
4674
4675    if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (TREE_TYPE (targ)))
4676      {
4677	if (TREE_CODE (arg) == SAVE_EXPR)
4678	  targ = arg;
4679	else
4680	  targ = build_cplus_new (TREE_TYPE (arg), arg);
4681	return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), targ);
4682      }
4683
4684    if (TREE_CODE (arg) == SAVE_EXPR && TREE_CODE (targ) == INDIRECT_REF)
4685      return build3 (SAVE_EXPR, build_pointer_type (TREE_TYPE (arg)),
4686		     TREE_OPERAND (targ, 0), current_function_decl, NULL);
4687  }
4688
4689  /* Don't let anything else be handled specially.  */
4690  return NULL_TREE;
4691}
4692
4693/* Mark EXP saying that we need to be able to take the
4694   address of it; it should not be allocated in a register.
4695   Value is true if successful.
4696
4697   C++: we do not allow `current_class_ptr' to be addressable.  */
4698
4699bool
4700cxx_mark_addressable (tree exp)
4701{
4702  tree x = exp;
4703
4704  while (1)
4705    switch (TREE_CODE (x))
4706      {
4707      case ADDR_EXPR:
4708      case COMPONENT_REF:
4709      case ARRAY_REF:
4710      case REALPART_EXPR:
4711      case IMAGPART_EXPR:
4712	x = TREE_OPERAND (x, 0);
4713	break;
4714
4715      case PARM_DECL:
4716	if (x == current_class_ptr)
4717	  {
4718	    error ("cannot take the address of %<this%>, which is an rvalue expression");
4719	    TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later.  */
4720	    return true;
4721	  }
4722	/* Fall through.  */
4723
4724      case VAR_DECL:
4725	/* Caller should not be trying to mark initialized
4726	   constant fields addressable.  */
4727	gcc_assert (DECL_LANG_SPECIFIC (x) == 0
4728		    || DECL_IN_AGGR_P (x) == 0
4729		    || TREE_STATIC (x)
4730		    || DECL_EXTERNAL (x));
4731	/* Fall through.  */
4732
4733      case CONST_DECL:
4734      case RESULT_DECL:
4735	if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
4736	    && !DECL_ARTIFICIAL (x))
4737	  {
4738	    if (TREE_CODE (x) == VAR_DECL && DECL_HARD_REGISTER (x))
4739	      {
4740		error
4741		  ("address of explicit register variable %qD requested", x);
4742		return false;
4743	      }
4744	    else if (extra_warnings)
4745	      warning
4746		(OPT_Wextra, "address requested for %qD, which is declared %<register%>", x);
4747	  }
4748	TREE_ADDRESSABLE (x) = 1;
4749	return true;
4750
4751      case FUNCTION_DECL:
4752	TREE_ADDRESSABLE (x) = 1;
4753	return true;
4754
4755      case CONSTRUCTOR:
4756	TREE_ADDRESSABLE (x) = 1;
4757	return true;
4758
4759      case TARGET_EXPR:
4760	TREE_ADDRESSABLE (x) = 1;
4761	cxx_mark_addressable (TREE_OPERAND (x, 0));
4762	return true;
4763
4764      default:
4765	return true;
4766    }
4767}
4768
4769/* Build and return a conditional expression IFEXP ? OP1 : OP2.  */
4770
4771tree
4772build_x_conditional_expr (tree ifexp, tree op1, tree op2)
4773{
4774  tree orig_ifexp = ifexp;
4775  tree orig_op1 = op1;
4776  tree orig_op2 = op2;
4777  tree expr;
4778
4779  if (processing_template_decl)
4780    {
4781      /* The standard says that the expression is type-dependent if
4782	 IFEXP is type-dependent, even though the eventual type of the
4783	 expression doesn't dependent on IFEXP.  */
4784      if (type_dependent_expression_p (ifexp)
4785	  /* As a GNU extension, the middle operand may be omitted.  */
4786	  || (op1 && type_dependent_expression_p (op1))
4787	  || type_dependent_expression_p (op2))
4788	return build_min_nt (COND_EXPR, ifexp, op1, op2);
4789      ifexp = build_non_dependent_expr (ifexp);
4790      if (op1)
4791	op1 = build_non_dependent_expr (op1);
4792      op2 = build_non_dependent_expr (op2);
4793    }
4794
4795  expr = build_conditional_expr (ifexp, op1, op2);
4796  if (processing_template_decl && expr != error_mark_node)
4797    return build_min_non_dep (COND_EXPR, expr,
4798			      orig_ifexp, orig_op1, orig_op2);
4799  return expr;
4800}
4801
4802/* Given a list of expressions, return a compound expression
4803   that performs them all and returns the value of the last of them.  */
4804
4805tree build_x_compound_expr_from_list (tree list, const char *msg)
4806{
4807  tree expr = TREE_VALUE (list);
4808
4809  if (TREE_CHAIN (list))
4810    {
4811      if (msg)
4812	pedwarn ("%s expression list treated as compound expression", msg);
4813
4814      for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
4815	expr = build_x_compound_expr (expr, TREE_VALUE (list));
4816    }
4817
4818  return expr;
4819}
4820
4821/* Handle overloading of the ',' operator when needed.  */
4822
4823tree
4824build_x_compound_expr (tree op1, tree op2)
4825{
4826  tree result;
4827  tree orig_op1 = op1;
4828  tree orig_op2 = op2;
4829
4830  if (processing_template_decl)
4831    {
4832      if (type_dependent_expression_p (op1)
4833	  || type_dependent_expression_p (op2))
4834	return build_min_nt (COMPOUND_EXPR, op1, op2);
4835      op1 = build_non_dependent_expr (op1);
4836      op2 = build_non_dependent_expr (op2);
4837    }
4838
4839  result = build_new_op (COMPOUND_EXPR, LOOKUP_NORMAL, op1, op2, NULL_TREE,
4840			 /*overloaded_p=*/NULL);
4841  if (!result)
4842    result = build_compound_expr (op1, op2);
4843
4844  if (processing_template_decl && result != error_mark_node)
4845    return build_min_non_dep (COMPOUND_EXPR, result, orig_op1, orig_op2);
4846
4847  return result;
4848}
4849
4850/* Build a compound expression.  */
4851
4852tree
4853build_compound_expr (tree lhs, tree rhs)
4854{
4855  lhs = convert_to_void (lhs, "left-hand operand of comma");
4856
4857  if (lhs == error_mark_node || rhs == error_mark_node)
4858    return error_mark_node;
4859
4860  if (TREE_CODE (rhs) == TARGET_EXPR)
4861    {
4862      /* If the rhs is a TARGET_EXPR, then build the compound
4863	 expression inside the target_expr's initializer. This
4864	 helps the compiler to eliminate unnecessary temporaries.  */
4865      tree init = TREE_OPERAND (rhs, 1);
4866
4867      init = build2 (COMPOUND_EXPR, TREE_TYPE (init), lhs, init);
4868      TREE_OPERAND (rhs, 1) = init;
4869
4870      return rhs;
4871    }
4872
4873  return build2 (COMPOUND_EXPR, TREE_TYPE (rhs), lhs, rhs);
4874}
4875
4876/* Issue a diagnostic message if casting from SRC_TYPE to DEST_TYPE
4877   casts away constness.  DIAG_FN gives the function to call if we
4878   need to issue a diagnostic; if it is NULL, no diagnostic will be
4879   issued.  DESCRIPTION explains what operation is taking place.  */
4880
4881static void
4882check_for_casting_away_constness (tree src_type, tree dest_type,
4883				  void (*diag_fn)(const char *, ...) ATTRIBUTE_GCC_CXXDIAG(1,2),
4884				  const char *description)
4885{
4886  if (diag_fn && casts_away_constness (src_type, dest_type))
4887    diag_fn ("%s from type %qT to type %qT casts away constness",
4888	     description, src_type, dest_type);
4889}
4890
4891/* Convert EXPR (an expression with pointer-to-member type) to TYPE
4892   (another pointer-to-member type in the same hierarchy) and return
4893   the converted expression.  If ALLOW_INVERSE_P is permitted, a
4894   pointer-to-derived may be converted to pointer-to-base; otherwise,
4895   only the other direction is permitted.  If C_CAST_P is true, this
4896   conversion is taking place as part of a C-style cast.  */
4897
4898tree
4899convert_ptrmem (tree type, tree expr, bool allow_inverse_p,
4900		bool c_cast_p)
4901{
4902  if (TYPE_PTRMEM_P (type))
4903    {
4904      tree delta;
4905
4906      if (TREE_CODE (expr) == PTRMEM_CST)
4907	expr = cplus_expand_constant (expr);
4908      delta = get_delta_difference (TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (expr)),
4909				    TYPE_PTRMEM_CLASS_TYPE (type),
4910				    allow_inverse_p,
4911				    c_cast_p);
4912      if (!integer_zerop (delta))
4913	expr = cp_build_binary_op (PLUS_EXPR,
4914				   build_nop (ptrdiff_type_node, expr),
4915				   delta);
4916      return build_nop (type, expr);
4917    }
4918  else
4919    return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr,
4920			     allow_inverse_p, c_cast_p);
4921}
4922
4923/* If EXPR is an INTEGER_CST and ORIG is an arithmetic constant, return
4924   a version of EXPR that has TREE_OVERFLOW and/or TREE_CONSTANT_OVERFLOW
4925   set iff they are set in ORIG.  Otherwise, return EXPR unchanged.  */
4926
4927static tree
4928ignore_overflows (tree expr, tree orig)
4929{
4930  if (TREE_CODE (expr) == INTEGER_CST
4931      && CONSTANT_CLASS_P (orig)
4932      && TREE_CODE (orig) != STRING_CST
4933      && (TREE_OVERFLOW (expr) != TREE_OVERFLOW (orig)
4934	  || TREE_CONSTANT_OVERFLOW (expr)
4935	     != TREE_CONSTANT_OVERFLOW (orig)))
4936    {
4937      if (!TREE_OVERFLOW (orig) && !TREE_CONSTANT_OVERFLOW (orig))
4938	/* Ensure constant sharing.  */
4939	expr = build_int_cst_wide (TREE_TYPE (expr),
4940				   TREE_INT_CST_LOW (expr),
4941				   TREE_INT_CST_HIGH (expr));
4942      else
4943	{
4944	  /* Avoid clobbering a shared constant.  */
4945	  expr = copy_node (expr);
4946	  TREE_OVERFLOW (expr) = TREE_OVERFLOW (orig);
4947	  TREE_CONSTANT_OVERFLOW (expr)
4948	    = TREE_CONSTANT_OVERFLOW (orig);
4949	}
4950    }
4951  return expr;
4952}
4953
4954/* Perform a static_cast from EXPR to TYPE.  When C_CAST_P is true,
4955   this static_cast is being attempted as one of the possible casts
4956   allowed by a C-style cast.  (In that case, accessibility of base
4957   classes is not considered, and it is OK to cast away
4958   constness.)  Return the result of the cast.  *VALID_P is set to
4959   indicate whether or not the cast was valid.  */
4960
4961static tree
4962build_static_cast_1 (tree type, tree expr, bool c_cast_p,
4963		     bool *valid_p)
4964{
4965  tree intype;
4966  tree result;
4967  tree orig;
4968  void (*diag_fn)(const char*, ...) ATTRIBUTE_GCC_CXXDIAG(1,2);
4969  const char *desc;
4970
4971  /* Assume the cast is valid.  */
4972  *valid_p = true;
4973
4974  intype = TREE_TYPE (expr);
4975
4976  /* Save casted types in the function's used types hash table.  */
4977  used_types_insert (type);
4978
4979  /* Determine what to do when casting away constness.  */
4980  if (c_cast_p)
4981    {
4982      /* C-style casts are allowed to cast away constness.  With
4983	 WARN_CAST_QUAL, we still want to issue a warning.  */
4984      diag_fn = warn_cast_qual ? warning0 : NULL;
4985      desc = "cast";
4986    }
4987  else
4988    {
4989      /* A static_cast may not cast away constness.  */
4990      diag_fn = error;
4991      desc = "static_cast";
4992    }
4993
4994  /* [expr.static.cast]
4995
4996     An lvalue of type "cv1 B", where B is a class type, can be cast
4997     to type "reference to cv2 D", where D is a class derived (clause
4998     _class.derived_) from B, if a valid standard conversion from
4999     "pointer to D" to "pointer to B" exists (_conv.ptr_), cv2 is the
5000     same cv-qualification as, or greater cv-qualification than, cv1,
5001     and B is not a virtual base class of D.  */
5002  /* We check this case before checking the validity of "TYPE t =
5003     EXPR;" below because for this case:
5004
5005       struct B {};
5006       struct D : public B { D(const B&); };
5007       extern B& b;
5008       void f() { static_cast<const D&>(b); }
5009
5010     we want to avoid constructing a new D.  The standard is not
5011     completely clear about this issue, but our interpretation is
5012     consistent with other compilers.  */
5013  if (TREE_CODE (type) == REFERENCE_TYPE
5014      && CLASS_TYPE_P (TREE_TYPE (type))
5015      && CLASS_TYPE_P (intype)
5016      && real_lvalue_p (expr)
5017      && DERIVED_FROM_P (intype, TREE_TYPE (type))
5018      && can_convert (build_pointer_type (TYPE_MAIN_VARIANT (intype)),
5019		      build_pointer_type (TYPE_MAIN_VARIANT
5020					  (TREE_TYPE (type))))
5021      && (c_cast_p
5022	  || at_least_as_qualified_p (TREE_TYPE (type), intype)))
5023    {
5024      tree base;
5025
5026      /* There is a standard conversion from "D*" to "B*" even if "B"
5027	 is ambiguous or inaccessible.  If this is really a
5028	 static_cast, then we check both for inaccessibility and
5029	 ambiguity.  However, if this is a static_cast being performed
5030	 because the user wrote a C-style cast, then accessibility is
5031	 not considered.  */
5032      base = lookup_base (TREE_TYPE (type), intype,
5033			  c_cast_p ? ba_unique : ba_check,
5034			  NULL);
5035
5036      /* Convert from "B*" to "D*".  This function will check that "B"
5037	 is not a virtual base of "D".  */
5038      expr = build_base_path (MINUS_EXPR, build_address (expr),
5039			      base, /*nonnull=*/false);
5040      /* Convert the pointer to a reference -- but then remember that
5041	 there are no expressions with reference type in C++.  */
5042      return convert_from_reference (build_nop (type, expr));
5043    }
5044
5045  orig = expr;
5046
5047  /* [expr.static.cast]
5048
5049     An expression e can be explicitly converted to a type T using a
5050     static_cast of the form static_cast<T>(e) if the declaration T
5051     t(e);" is well-formed, for some invented temporary variable
5052     t.  */
5053  result = perform_direct_initialization_if_possible (type, expr,
5054						      c_cast_p);
5055  if (result)
5056    {
5057      result = convert_from_reference (result);
5058
5059      /* Ignore any integer overflow caused by the cast.  */
5060      result = ignore_overflows (result, orig);
5061
5062      /* [expr.static.cast]
5063
5064	 If T is a reference type, the result is an lvalue; otherwise,
5065	 the result is an rvalue.  */
5066      if (TREE_CODE (type) != REFERENCE_TYPE)
5067	result = rvalue (result);
5068      return result;
5069    }
5070
5071  /* [expr.static.cast]
5072
5073     Any expression can be explicitly converted to type cv void.  */
5074  if (TREE_CODE (type) == VOID_TYPE)
5075    return convert_to_void (expr, /*implicit=*/NULL);
5076
5077  /* [expr.static.cast]
5078
5079     The inverse of any standard conversion sequence (clause _conv_),
5080     other than the lvalue-to-rvalue (_conv.lval_), array-to-pointer
5081     (_conv.array_), function-to-pointer (_conv.func_), and boolean
5082     (_conv.bool_) conversions, can be performed explicitly using
5083     static_cast subject to the restriction that the explicit
5084     conversion does not cast away constness (_expr.const.cast_), and
5085     the following additional rules for specific cases:  */
5086  /* For reference, the conversions not excluded are: integral
5087     promotions, floating point promotion, integral conversions,
5088     floating point conversions, floating-integral conversions,
5089     pointer conversions, and pointer to member conversions.  */
5090  /* DR 128
5091
5092     A value of integral _or enumeration_ type can be explicitly
5093     converted to an enumeration type.  */
5094  /* The effect of all that is that any conversion between any two
5095     types which are integral, floating, or enumeration types can be
5096     performed.  */
5097  if ((INTEGRAL_TYPE_P (type) || SCALAR_FLOAT_TYPE_P (type))
5098      && (INTEGRAL_TYPE_P (intype) || SCALAR_FLOAT_TYPE_P (intype)))
5099    {
5100      expr = ocp_convert (type, expr, CONV_C_CAST, LOOKUP_NORMAL);
5101
5102      /* Ignore any integer overflow caused by the cast.  */
5103      expr = ignore_overflows (expr, orig);
5104      return expr;
5105    }
5106
5107  if (TYPE_PTR_P (type) && TYPE_PTR_P (intype)
5108      && CLASS_TYPE_P (TREE_TYPE (type))
5109      && CLASS_TYPE_P (TREE_TYPE (intype))
5110      && can_convert (build_pointer_type (TYPE_MAIN_VARIANT
5111					  (TREE_TYPE (intype))),
5112		      build_pointer_type (TYPE_MAIN_VARIANT
5113					  (TREE_TYPE (type)))))
5114    {
5115      tree base;
5116
5117      if (!c_cast_p)
5118	check_for_casting_away_constness (intype, type, diag_fn, desc);
5119      base = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
5120			  c_cast_p ? ba_unique : ba_check,
5121			  NULL);
5122      return build_base_path (MINUS_EXPR, expr, base, /*nonnull=*/false);
5123    }
5124
5125  if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
5126      || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
5127    {
5128      tree c1;
5129      tree c2;
5130      tree t1;
5131      tree t2;
5132
5133      c1 = TYPE_PTRMEM_CLASS_TYPE (intype);
5134      c2 = TYPE_PTRMEM_CLASS_TYPE (type);
5135
5136      if (TYPE_PTRMEM_P (type))
5137	{
5138	  t1 = (build_ptrmem_type
5139		(c1,
5140		 TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (intype))));
5141	  t2 = (build_ptrmem_type
5142		(c2,
5143		 TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (type))));
5144	}
5145      else
5146	{
5147	  t1 = intype;
5148	  t2 = type;
5149	}
5150      if (can_convert (t1, t2))
5151	{
5152	  if (!c_cast_p)
5153	    check_for_casting_away_constness (intype, type, diag_fn,
5154					      desc);
5155	  return convert_ptrmem (type, expr, /*allow_inverse_p=*/1,
5156				 c_cast_p);
5157	}
5158    }
5159
5160  /* [expr.static.cast]
5161
5162     An rvalue of type "pointer to cv void" can be explicitly
5163     converted to a pointer to object type.  A value of type pointer
5164     to object converted to "pointer to cv void" and back to the
5165     original pointer type will have its original value.  */
5166  if (TREE_CODE (intype) == POINTER_TYPE
5167      && VOID_TYPE_P (TREE_TYPE (intype))
5168      && TYPE_PTROB_P (type))
5169    {
5170      if (!c_cast_p)
5171	check_for_casting_away_constness (intype, type, diag_fn, desc);
5172      return build_nop (type, expr);
5173    }
5174
5175  *valid_p = false;
5176  return error_mark_node;
5177}
5178
5179/* Return an expression representing static_cast<TYPE>(EXPR).  */
5180
5181tree
5182build_static_cast (tree type, tree expr)
5183{
5184  tree result;
5185  bool valid_p;
5186
5187  if (type == error_mark_node || expr == error_mark_node)
5188    return error_mark_node;
5189
5190  if (processing_template_decl)
5191    {
5192      expr = build_min (STATIC_CAST_EXPR, type, expr);
5193      /* We don't know if it will or will not have side effects.  */
5194      TREE_SIDE_EFFECTS (expr) = 1;
5195      return convert_from_reference (expr);
5196    }
5197
5198  /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5199     Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
5200  if (TREE_CODE (type) != REFERENCE_TYPE
5201      && TREE_CODE (expr) == NOP_EXPR
5202      && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
5203    expr = TREE_OPERAND (expr, 0);
5204
5205  result = build_static_cast_1 (type, expr, /*c_cast_p=*/false, &valid_p);
5206  if (valid_p)
5207    return result;
5208
5209  error ("invalid static_cast from type %qT to type %qT",
5210	 TREE_TYPE (expr), type);
5211  return error_mark_node;
5212}
5213
5214/* EXPR is an expression with member function or pointer-to-member
5215   function type.  TYPE is a pointer type.  Converting EXPR to TYPE is
5216   not permitted by ISO C++, but we accept it in some modes.  If we
5217   are not in one of those modes, issue a diagnostic.  Return the
5218   converted expression.  */
5219
5220tree
5221convert_member_func_to_ptr (tree type, tree expr)
5222{
5223  tree intype;
5224  tree decl;
5225
5226  intype = TREE_TYPE (expr);
5227  gcc_assert (TYPE_PTRMEMFUNC_P (intype)
5228	      || TREE_CODE (intype) == METHOD_TYPE);
5229
5230  if (pedantic || warn_pmf2ptr)
5231    pedwarn ("converting from %qT to %qT", intype, type);
5232
5233  if (TREE_CODE (intype) == METHOD_TYPE)
5234    expr = build_addr_func (expr);
5235  else if (TREE_CODE (expr) == PTRMEM_CST)
5236    expr = build_address (PTRMEM_CST_MEMBER (expr));
5237  else
5238    {
5239      decl = maybe_dummy_object (TYPE_PTRMEM_CLASS_TYPE (intype), 0);
5240      decl = build_address (decl);
5241      expr = get_member_function_from_ptrfunc (&decl, expr);
5242    }
5243
5244  return build_nop (type, expr);
5245}
5246
5247/* Return a representation for a reinterpret_cast from EXPR to TYPE.
5248   If C_CAST_P is true, this reinterpret cast is being done as part of
5249   a C-style cast.  If VALID_P is non-NULL, *VALID_P is set to
5250   indicate whether or not reinterpret_cast was valid.  */
5251
5252static tree
5253build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
5254			  bool *valid_p)
5255{
5256  tree intype;
5257
5258  /* Assume the cast is invalid.  */
5259  if (valid_p)
5260    *valid_p = true;
5261
5262  if (type == error_mark_node || error_operand_p (expr))
5263    return error_mark_node;
5264
5265  intype = TREE_TYPE (expr);
5266
5267  /* Save casted types in the function's used types hash table.  */
5268  used_types_insert (type);
5269
5270  /* [expr.reinterpret.cast]
5271     An lvalue expression of type T1 can be cast to the type
5272     "reference to T2" if an expression of type "pointer to T1" can be
5273     explicitly converted to the type "pointer to T2" using a
5274     reinterpret_cast.  */
5275  if (TREE_CODE (type) == REFERENCE_TYPE)
5276    {
5277      if (! real_lvalue_p (expr))
5278	{
5279	  error ("invalid cast of an rvalue expression of type "
5280		 "%qT to type %qT",
5281		 intype, type);
5282	  return error_mark_node;
5283	}
5284
5285      /* Warn about a reinterpret_cast from "A*" to "B&" if "A" and
5286	 "B" are related class types; the reinterpret_cast does not
5287	 adjust the pointer.  */
5288      if (TYPE_PTR_P (intype)
5289	  && (comptypes (TREE_TYPE (intype), TREE_TYPE (type),
5290			 COMPARE_BASE | COMPARE_DERIVED)))
5291	warning (0, "casting %qT to %qT does not dereference pointer",
5292		 intype, type);
5293
5294      expr = build_unary_op (ADDR_EXPR, expr, 0);
5295      if (expr != error_mark_node)
5296	expr = build_reinterpret_cast_1
5297	  (build_pointer_type (TREE_TYPE (type)), expr, c_cast_p,
5298	   valid_p);
5299      if (expr != error_mark_node)
5300	expr = build_indirect_ref (expr, 0);
5301      return expr;
5302    }
5303
5304  /* As a G++ extension, we consider conversions from member
5305     functions, and pointers to member functions to
5306     pointer-to-function and pointer-to-void types.  If
5307     -Wno-pmf-conversions has not been specified,
5308     convert_member_func_to_ptr will issue an error message.  */
5309  if ((TYPE_PTRMEMFUNC_P (intype)
5310       || TREE_CODE (intype) == METHOD_TYPE)
5311      && TYPE_PTR_P (type)
5312      && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
5313	  || VOID_TYPE_P (TREE_TYPE (type))))
5314    return convert_member_func_to_ptr (type, expr);
5315
5316  /* If the cast is not to a reference type, the lvalue-to-rvalue,
5317     array-to-pointer, and function-to-pointer conversions are
5318     performed.  */
5319  expr = decay_conversion (expr);
5320
5321  /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5322     Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
5323  if (TREE_CODE (expr) == NOP_EXPR
5324      && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
5325    expr = TREE_OPERAND (expr, 0);
5326
5327  if (error_operand_p (expr))
5328    return error_mark_node;
5329
5330  intype = TREE_TYPE (expr);
5331
5332  /* [expr.reinterpret.cast]
5333     A pointer can be converted to any integral type large enough to
5334     hold it.  */
5335  if (CP_INTEGRAL_TYPE_P (type) && TYPE_PTR_P (intype))
5336    {
5337      if (TYPE_PRECISION (type) < TYPE_PRECISION (intype))
5338	pedwarn ("cast from %qT to %qT loses precision",
5339		 intype, type);
5340    }
5341  /* [expr.reinterpret.cast]
5342     A value of integral or enumeration type can be explicitly
5343     converted to a pointer.  */
5344  else if (TYPE_PTR_P (type) && INTEGRAL_OR_ENUMERATION_TYPE_P (intype))
5345    /* OK */
5346    ;
5347  /* APPLE LOCAL begin blocks 6040305 (ck) */
5348  else if (TREE_CODE (type) == INTEGER_TYPE && TREE_CODE (intype) == BLOCK_POINTER_TYPE)
5349    {
5350      if (TYPE_PRECISION (type) < TYPE_PRECISION (intype))
5351	pedwarn ("cast from %qT to %qT loses precision",
5352		 intype, type);
5353    }
5354  else if (TREE_CODE (type) == BLOCK_POINTER_TYPE && TREE_CODE (intype) == INTEGER_TYPE)
5355    /* OK */
5356    ;
5357  else if (TREE_CODE (type) == BLOCK_POINTER_TYPE && TREE_CODE (intype) == BLOCK_POINTER_TYPE)
5358    /* OK */
5359    ;
5360  else if (TREE_CODE (intype) == BLOCK_POINTER_TYPE
5361	   && (objc_is_id (type)
5362	       || (TREE_CODE (type) == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (type)))))
5363    /* OK */
5364    ;
5365  else if (TREE_CODE (type) == BLOCK_POINTER_TYPE
5366	   && TREE_CODE (intype) == POINTER_TYPE
5367	   && (objc_is_id (intype) || VOID_TYPE_P (TREE_TYPE (intype))))
5368    /* OK */
5369    ;
5370  /* APPLE LOCAL end blocks 6040305 (ck) */
5371  else if ((TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype))
5372	   || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
5373    return fold_if_not_in_template (build_nop (type, expr));
5374  else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
5375	   || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
5376    {
5377      tree sexpr = expr;
5378
5379      if (!c_cast_p)
5380	check_for_casting_away_constness (intype, type, error,
5381					  "reinterpret_cast");
5382      /* Warn about possible alignment problems.  */
5383      if (STRICT_ALIGNMENT && warn_cast_align
5384	  && !VOID_TYPE_P (type)
5385	  && TREE_CODE (TREE_TYPE (intype)) != FUNCTION_TYPE
5386	  && COMPLETE_TYPE_P (TREE_TYPE (type))
5387	  && COMPLETE_TYPE_P (TREE_TYPE (intype))
5388	  && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (intype)))
5389	warning (0, "cast from %qT to %qT increases required alignment of "
5390		 "target type",
5391		 intype, type);
5392
5393      /* We need to strip nops here, because the frontend likes to
5394	 create (int *)&a for array-to-pointer decay, instead of &a[0].  */
5395      STRIP_NOPS (sexpr);
5396      if (warn_strict_aliasing <= 2)
5397	strict_aliasing_warning (intype, type, sexpr);
5398
5399      return fold_if_not_in_template (build_nop (type, expr));
5400    }
5401  else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
5402	   || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type)))
5403    {
5404      if (pedantic)
5405	/* Only issue a warning, as we have always supported this
5406	   where possible, and it is necessary in some cases.  DR 195
5407	   addresses this issue, but as of 2004/10/26 is still in
5408	   drafting.  */
5409	warning (0, "ISO C++ forbids casting between pointer-to-function and pointer-to-object");
5410      return fold_if_not_in_template (build_nop (type, expr));
5411    }
5412  else if (TREE_CODE (type) == VECTOR_TYPE)
5413    return fold_if_not_in_template (convert_to_vector (type, expr));
5414  else if (TREE_CODE (intype) == VECTOR_TYPE && INTEGRAL_TYPE_P (type))
5415    return fold_if_not_in_template (convert_to_integer (type, expr));
5416  else
5417    {
5418      if (valid_p)
5419	*valid_p = false;
5420      error ("invalid cast from type %qT to type %qT", intype, type);
5421      return error_mark_node;
5422    }
5423
5424  /* APPLE LOCAL begin don't sign-extend pointers cast to integers */
5425  if (TREE_CODE (type) == INTEGER_TYPE
5426      && TREE_CODE (intype) == POINTER_TYPE
5427      && TYPE_PRECISION (type) > TYPE_PRECISION (intype)
5428      && TYPE_UNSIGNED (type))
5429    expr = cp_convert (c_common_type_for_size (POINTER_SIZE, 1), expr);
5430  /* APPLE LOCAL end don't sign-extend pointers cast to integers */
5431
5432  return cp_convert (type, expr);
5433}
5434
5435tree
5436build_reinterpret_cast (tree type, tree expr)
5437{
5438  if (type == error_mark_node || expr == error_mark_node)
5439    return error_mark_node;
5440
5441  if (processing_template_decl)
5442    {
5443      tree t = build_min (REINTERPRET_CAST_EXPR, type, expr);
5444
5445      if (!TREE_SIDE_EFFECTS (t)
5446	  && type_dependent_expression_p (expr))
5447	/* There might turn out to be side effects inside expr.  */
5448	TREE_SIDE_EFFECTS (t) = 1;
5449      return convert_from_reference (t);
5450    }
5451
5452  return build_reinterpret_cast_1 (type, expr, /*c_cast_p=*/false,
5453				   /*valid_p=*/NULL);
5454}
5455
5456/* Perform a const_cast from EXPR to TYPE.  If the cast is valid,
5457   return an appropriate expression.  Otherwise, return
5458   error_mark_node.  If the cast is not valid, and COMPLAIN is true,
5459   then a diagnostic will be issued.  If VALID_P is non-NULL, we are
5460   performing a C-style cast, its value upon return will indicate
5461   whether or not the conversion succeeded.  */
5462
5463static tree
5464build_const_cast_1 (tree dst_type, tree expr, bool complain,
5465		    bool *valid_p)
5466{
5467  tree src_type;
5468  tree reference_type;
5469
5470  /* Callers are responsible for handling error_mark_node as a
5471     destination type.  */
5472  gcc_assert (dst_type != error_mark_node);
5473  /* In a template, callers should be building syntactic
5474     representations of casts, not using this machinery.  */
5475  gcc_assert (!processing_template_decl);
5476
5477  /* Assume the conversion is invalid.  */
5478  if (valid_p)
5479    *valid_p = false;
5480
5481  if (!POINTER_TYPE_P (dst_type) && !TYPE_PTRMEM_P (dst_type))
5482    {
5483      if (complain)
5484	error ("invalid use of const_cast with type %qT, "
5485	       "which is not a pointer, "
5486	       "reference, nor a pointer-to-data-member type", dst_type);
5487      return error_mark_node;
5488    }
5489
5490  if (TREE_CODE (TREE_TYPE (dst_type)) == FUNCTION_TYPE)
5491    {
5492      if (complain)
5493	error ("invalid use of const_cast with type %qT, which is a pointer "
5494	       "or reference to a function type", dst_type);
5495      return error_mark_node;
5496    }
5497
5498  /* Save casted types in the function's used types hash table.  */
5499  used_types_insert (dst_type);
5500
5501  src_type = TREE_TYPE (expr);
5502  /* Expressions do not really have reference types.  */
5503  if (TREE_CODE (src_type) == REFERENCE_TYPE)
5504    src_type = TREE_TYPE (src_type);
5505
5506  /* [expr.const.cast]
5507
5508     An lvalue of type T1 can be explicitly converted to an lvalue of
5509     type T2 using the cast const_cast<T2&> (where T1 and T2 are object
5510     types) if a pointer to T1 can be explicitly converted to the type
5511     pointer to T2 using a const_cast.  */
5512  if (TREE_CODE (dst_type) == REFERENCE_TYPE)
5513    {
5514      reference_type = dst_type;
5515      if (! real_lvalue_p (expr))
5516	{
5517	  if (complain)
5518	    error ("invalid const_cast of an rvalue of type %qT to type %qT",
5519		   src_type, dst_type);
5520	  return error_mark_node;
5521	}
5522      dst_type = build_pointer_type (TREE_TYPE (dst_type));
5523      src_type = build_pointer_type (src_type);
5524    }
5525  else
5526    {
5527      reference_type = NULL_TREE;
5528      /* If the destination type is not a reference type, the
5529	 lvalue-to-rvalue, array-to-pointer, and function-to-pointer
5530	 conversions are performed.  */
5531      src_type = type_decays_to (src_type);
5532      if (src_type == error_mark_node)
5533	return error_mark_node;
5534    }
5535
5536  if ((TYPE_PTR_P (src_type) || TYPE_PTRMEM_P (src_type))
5537      && comp_ptr_ttypes_const (dst_type, src_type))
5538    {
5539      if (valid_p)
5540	{
5541	  *valid_p = true;
5542	  /* This cast is actually a C-style cast.  Issue a warning if
5543	     the user is making a potentially unsafe cast.  */
5544	  if (warn_cast_qual)
5545	    check_for_casting_away_constness (src_type, dst_type,
5546					      warning0,
5547					      "cast");
5548	}
5549      if (reference_type)
5550	{
5551	  expr = build_unary_op (ADDR_EXPR, expr, 0);
5552	  expr = build_nop (reference_type, expr);
5553	  return convert_from_reference (expr);
5554	}
5555      else
5556	{
5557	  expr = decay_conversion (expr);
5558	  /* build_c_cast puts on a NOP_EXPR to make the result not an
5559	     lvalue.  Strip such NOP_EXPRs if VALUE is being used in
5560	     non-lvalue context.  */
5561	  if (TREE_CODE (expr) == NOP_EXPR
5562	      && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
5563	    expr = TREE_OPERAND (expr, 0);
5564	  return build_nop (dst_type, expr);
5565	}
5566    }
5567
5568  if (complain)
5569    error ("invalid const_cast from type %qT to type %qT",
5570	   src_type, dst_type);
5571  return error_mark_node;
5572}
5573
5574tree
5575build_const_cast (tree type, tree expr)
5576{
5577  if (type == error_mark_node || error_operand_p (expr))
5578    return error_mark_node;
5579
5580  if (processing_template_decl)
5581    {
5582      tree t = build_min (CONST_CAST_EXPR, type, expr);
5583
5584      if (!TREE_SIDE_EFFECTS (t)
5585	  && type_dependent_expression_p (expr))
5586	/* There might turn out to be side effects inside expr.  */
5587	TREE_SIDE_EFFECTS (t) = 1;
5588      return convert_from_reference (t);
5589    }
5590
5591  return build_const_cast_1 (type, expr, /*complain=*/true,
5592			     /*valid_p=*/NULL);
5593}
5594
5595/* Build an expression representing an explicit C-style cast to type
5596   TYPE of expression EXPR.  */
5597
5598tree
5599build_c_cast (tree type, tree expr)
5600{
5601  tree value = expr;
5602  tree result;
5603  bool valid_p;
5604
5605  if (type == error_mark_node || error_operand_p (expr))
5606    return error_mark_node;
5607
5608  if (processing_template_decl)
5609    {
5610      tree t = build_min (CAST_EXPR, type,
5611			  tree_cons (NULL_TREE, value, NULL_TREE));
5612      /* We don't know if it will or will not have side effects.  */
5613      TREE_SIDE_EFFECTS (t) = 1;
5614      return convert_from_reference (t);
5615    }
5616
5617  /* Casts to a (pointer to a) specific ObjC class (or 'id' or
5618     'Class') should always be retained, because this information aids
5619     in method lookup.  */
5620  if (objc_is_object_ptr (type)
5621      && objc_is_object_ptr (TREE_TYPE (expr)))
5622    return build_nop (type, expr);
5623
5624  /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5625     Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
5626  if (TREE_CODE (type) != REFERENCE_TYPE
5627      && TREE_CODE (value) == NOP_EXPR
5628      && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
5629    value = TREE_OPERAND (value, 0);
5630
5631  if (TREE_CODE (type) == ARRAY_TYPE)
5632    {
5633      /* Allow casting from T1* to T2[] because Cfront allows it.
5634	 NIHCL uses it. It is not valid ISO C++ however.  */
5635      if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
5636	{
5637	  pedwarn ("ISO C++ forbids casting to an array type %qT", type);
5638	  type = build_pointer_type (TREE_TYPE (type));
5639	}
5640      else
5641	{
5642	  error ("ISO C++ forbids casting to an array type %qT", type);
5643	  return error_mark_node;
5644	}
5645    }
5646
5647  if (TREE_CODE (type) == FUNCTION_TYPE
5648      || TREE_CODE (type) == METHOD_TYPE)
5649    {
5650      error ("invalid cast to function type %qT", type);
5651      return error_mark_node;
5652    }
5653
5654  /* A C-style cast can be a const_cast.  */
5655  result = build_const_cast_1 (type, value, /*complain=*/false,
5656			       &valid_p);
5657  if (valid_p)
5658    return result;
5659
5660  /* Or a static cast.  */
5661  result = build_static_cast_1 (type, value, /*c_cast_p=*/true,
5662				&valid_p);
5663  /* Or a reinterpret_cast.  */
5664  if (!valid_p)
5665    result = build_reinterpret_cast_1 (type, value, /*c_cast_p=*/true,
5666				       &valid_p);
5667  /* The static_cast or reinterpret_cast may be followed by a
5668     const_cast.  */
5669  if (valid_p
5670      /* A valid cast may result in errors if, for example, a
5671	 conversion to am ambiguous base class is required.  */
5672      && !error_operand_p (result))
5673    {
5674      tree result_type;
5675
5676      /* Non-class rvalues always have cv-unqualified type.  */
5677      if (!CLASS_TYPE_P (type))
5678	type = TYPE_MAIN_VARIANT (type);
5679      result_type = TREE_TYPE (result);
5680      if (!CLASS_TYPE_P (result_type))
5681	result_type = TYPE_MAIN_VARIANT (result_type);
5682      /* If the type of RESULT does not match TYPE, perform a
5683	 const_cast to make it match.  If the static_cast or
5684	 reinterpret_cast succeeded, we will differ by at most
5685	 cv-qualification, so the follow-on const_cast is guaranteed
5686	 to succeed.  */
5687      if (!same_type_p (non_reference (type), non_reference (result_type)))
5688	{
5689	  result = build_const_cast_1 (type, result, false, &valid_p);
5690	  gcc_assert (valid_p);
5691	}
5692      return result;
5693    }
5694
5695  return error_mark_node;
5696}
5697
5698/* Build an assignment expression of lvalue LHS from value RHS.
5699   MODIFYCODE is the code for a binary operator that we use
5700   to combine the old value of LHS with RHS to get the new value.
5701   Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
5702
5703   C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed.  */
5704
5705tree
5706build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
5707{
5708  tree result;
5709  tree newrhs = rhs;
5710  tree lhstype = TREE_TYPE (lhs);
5711  tree olhstype = lhstype;
5712  tree olhs = NULL_TREE;
5713  bool plain_assign = (modifycode == NOP_EXPR);
5714
5715  /* Avoid duplicate error messages from operands that had errors.  */
5716  if (error_operand_p (lhs) || error_operand_p (rhs))
5717    return error_mark_node;
5718
5719  /* Handle control structure constructs used as "lvalues".  */
5720  switch (TREE_CODE (lhs))
5721    {
5722      /* Handle --foo = 5; as these are valid constructs in C++.  */
5723    case PREDECREMENT_EXPR:
5724    case PREINCREMENT_EXPR:
5725      if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
5726	lhs = build2 (TREE_CODE (lhs), TREE_TYPE (lhs),
5727		      stabilize_reference (TREE_OPERAND (lhs, 0)),
5728		      TREE_OPERAND (lhs, 1));
5729      return build2 (COMPOUND_EXPR, lhstype,
5730		     lhs,
5731		     build_modify_expr (TREE_OPERAND (lhs, 0),
5732					modifycode, rhs));
5733
5734      /* Handle (a, b) used as an "lvalue".  */
5735    case COMPOUND_EXPR:
5736      newrhs = build_modify_expr (TREE_OPERAND (lhs, 1),
5737				  modifycode, rhs);
5738      if (newrhs == error_mark_node)
5739	return error_mark_node;
5740      return build2 (COMPOUND_EXPR, lhstype,
5741		     TREE_OPERAND (lhs, 0), newrhs);
5742
5743    case MODIFY_EXPR:
5744      if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
5745	lhs = build2 (TREE_CODE (lhs), TREE_TYPE (lhs),
5746		      stabilize_reference (TREE_OPERAND (lhs, 0)),
5747		      TREE_OPERAND (lhs, 1));
5748      newrhs = build_modify_expr (TREE_OPERAND (lhs, 0), modifycode, rhs);
5749      if (newrhs == error_mark_node)
5750	return error_mark_node;
5751      return build2 (COMPOUND_EXPR, lhstype, lhs, newrhs);
5752
5753    case MIN_EXPR:
5754    case MAX_EXPR:
5755      /* MIN_EXPR and MAX_EXPR are currently only permitted as lvalues,
5756	 when neither operand has side-effects.  */
5757      if (!lvalue_or_else (lhs, lv_assign))
5758	return error_mark_node;
5759
5760      gcc_assert (!TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0))
5761		  && !TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 1)));
5762
5763      lhs = build3 (COND_EXPR, TREE_TYPE (lhs),
5764		    build2 (TREE_CODE (lhs) == MIN_EXPR ? LE_EXPR : GE_EXPR,
5765			    boolean_type_node,
5766			    TREE_OPERAND (lhs, 0),
5767			    TREE_OPERAND (lhs, 1)),
5768		    TREE_OPERAND (lhs, 0),
5769		    TREE_OPERAND (lhs, 1));
5770      /* Fall through.  */
5771
5772      /* Handle (a ? b : c) used as an "lvalue".  */
5773    case COND_EXPR:
5774      {
5775	/* Produce (a ? (b = rhs) : (c = rhs))
5776	   except that the RHS goes through a save-expr
5777	   so the code to compute it is only emitted once.  */
5778	tree cond;
5779	tree preeval = NULL_TREE;
5780
5781	if (VOID_TYPE_P (TREE_TYPE (rhs)))
5782	  {
5783	    error ("void value not ignored as it ought to be");
5784	    return error_mark_node;
5785	  }
5786
5787	rhs = stabilize_expr (rhs, &preeval);
5788
5789	/* Check this here to avoid odd errors when trying to convert
5790	   a throw to the type of the COND_EXPR.  */
5791	if (!lvalue_or_else (lhs, lv_assign))
5792	  return error_mark_node;
5793
5794	cond = build_conditional_expr
5795	  (TREE_OPERAND (lhs, 0),
5796	   build_modify_expr (TREE_OPERAND (lhs, 1),
5797			      modifycode, rhs),
5798	   build_modify_expr (TREE_OPERAND (lhs, 2),
5799			      modifycode, rhs));
5800
5801	if (cond == error_mark_node)
5802	  return cond;
5803	/* Make sure the code to compute the rhs comes out
5804	   before the split.  */
5805	if (preeval)
5806	  cond = build2 (COMPOUND_EXPR, TREE_TYPE (lhs), preeval, cond);
5807	return cond;
5808      }
5809
5810    default:
5811      break;
5812    }
5813
5814  if (modifycode == INIT_EXPR)
5815    {
5816      if (TREE_CODE (rhs) == CONSTRUCTOR)
5817	{
5818	  if (! same_type_p (TREE_TYPE (rhs), lhstype))
5819	    /* Call convert to generate an error; see PR 11063.  */
5820	    rhs = convert (lhstype, rhs);
5821	  result = build2 (INIT_EXPR, lhstype, lhs, rhs);
5822	  TREE_SIDE_EFFECTS (result) = 1;
5823	  return result;
5824	}
5825      else if (! IS_AGGR_TYPE (lhstype))
5826	/* Do the default thing.  */;
5827      else
5828	{
5829	  result = build_special_member_call (lhs, complete_ctor_identifier,
5830					      build_tree_list (NULL_TREE, rhs),
5831					      lhstype, LOOKUP_NORMAL);
5832	  if (result == NULL_TREE)
5833	    return error_mark_node;
5834	  return result;
5835	}
5836    }
5837  else
5838    {
5839      lhs = require_complete_type (lhs);
5840      if (lhs == error_mark_node)
5841	return error_mark_node;
5842
5843      if (modifycode == NOP_EXPR)
5844	{
5845	  /* `operator=' is not an inheritable operator.  */
5846	  if (! IS_AGGR_TYPE (lhstype))
5847	    /* Do the default thing.  */;
5848	  else
5849	    {
5850	      result = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL,
5851				     lhs, rhs, make_node (NOP_EXPR),
5852				     /*overloaded_p=*/NULL);
5853	      if (result == NULL_TREE)
5854		return error_mark_node;
5855	      return result;
5856	    }
5857	  /* APPLE LOCAL end C* property (Radar 4436866) */
5858	  /* `operator=' is not an inheritable operator.  */
5859	  if (! IS_AGGR_TYPE (lhstype))
5860	    /* Do the default thing.  */;
5861	  else
5862	    {
5863	      result = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL,
5864				     lhs, rhs, make_node (NOP_EXPR),
5865				     /*overloaded_p=*/NULL);
5866	      if (result == NULL_TREE)
5867		return error_mark_node;
5868	      return result;
5869	    }
5870	  lhstype = olhstype;
5871	}
5872      else
5873	{
5874	  /* A binary op has been requested.  Combine the old LHS
5875	     value with the RHS producing the value we should actually
5876	     store into the LHS.  */
5877
5878	  gcc_assert (!PROMOTES_TO_AGGR_TYPE (lhstype, REFERENCE_TYPE));
5879	  lhs = stabilize_reference (lhs);
5880	  newrhs = cp_build_binary_op (modifycode, lhs, rhs);
5881	  if (newrhs == error_mark_node)
5882	    {
5883	      error ("  in evaluation of %<%Q(%#T, %#T)%>", modifycode,
5884		     TREE_TYPE (lhs), TREE_TYPE (rhs));
5885	      return error_mark_node;
5886	    }
5887
5888	  /* Now it looks like a plain assignment.  */
5889	  modifycode = NOP_EXPR;
5890	  lhstype = olhstype;
5891	}
5892      gcc_assert (TREE_CODE (lhstype) != REFERENCE_TYPE);
5893      gcc_assert (TREE_CODE (TREE_TYPE (newrhs)) != REFERENCE_TYPE);
5894    }
5895
5896  /* The left-hand side must be an lvalue.  */
5897  if (!lvalue_or_else (lhs, lv_assign))
5898    return error_mark_node;
5899
5900  /* Warn about modifying something that is `const'.  Don't warn if
5901     this is initialization.  */
5902  if (modifycode != INIT_EXPR
5903      && (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype)
5904	  /* Functions are not modifiable, even though they are
5905	     lvalues.  */
5906	  || TREE_CODE (TREE_TYPE (lhs)) == FUNCTION_TYPE
5907	  || TREE_CODE (TREE_TYPE (lhs)) == METHOD_TYPE
5908	  /* If it's an aggregate and any field is const, then it is
5909	     effectively const.  */
5910	  || (CLASS_TYPE_P (lhstype)
5911	      && C_TYPE_FIELDS_READONLY (lhstype))))
5912    readonly_error (lhs, "assignment", 0);
5913
5914  /* If storing into a structure or union member, it has probably been
5915     given type `int'.  Compute the type that would go with the actual
5916     amount of storage the member occupies.  */
5917
5918  if (TREE_CODE (lhs) == COMPONENT_REF
5919      && (TREE_CODE (lhstype) == INTEGER_TYPE
5920	  || TREE_CODE (lhstype) == REAL_TYPE
5921	  || TREE_CODE (lhstype) == ENUMERAL_TYPE))
5922    {
5923      lhstype = TREE_TYPE (get_unwidened (lhs, 0));
5924
5925      /* If storing in a field that is in actuality a short or narrower
5926	 than one, we must store in the field in its actual type.  */
5927
5928      if (lhstype != TREE_TYPE (lhs))
5929	{
5930	  /* Avoid warnings converting integral types back into enums for
5931	     enum bit fields.  */
5932	  if (TREE_CODE (lhstype) == INTEGER_TYPE
5933	      && TREE_CODE (olhstype) == ENUMERAL_TYPE)
5934	    {
5935	      if (TREE_SIDE_EFFECTS (lhs))
5936		lhs = stabilize_reference (lhs);
5937	      olhs = lhs;
5938	    }
5939	  lhs = copy_node (lhs);
5940	  TREE_TYPE (lhs) = lhstype;
5941	}
5942    }
5943
5944  /* Convert new value to destination type.  */
5945
5946  if (TREE_CODE (lhstype) == ARRAY_TYPE)
5947    {
5948      int from_array;
5949
5950      if (!same_or_base_type_p (TYPE_MAIN_VARIANT (lhstype),
5951				TYPE_MAIN_VARIANT (TREE_TYPE (rhs))))
5952	{
5953	  error ("incompatible types in assignment of %qT to %qT",
5954		 TREE_TYPE (rhs), lhstype);
5955	  return error_mark_node;
5956	}
5957
5958      /* Allow array assignment in compiler-generated code.  */
5959      if (! DECL_ARTIFICIAL (current_function_decl))
5960	{
5961          /* This routine is used for both initialization and assignment.
5962             Make sure the diagnostic message differentiates the context.  */
5963          if (modifycode == INIT_EXPR)
5964            error ("array used as initializer");
5965          else
5966            error ("invalid array assignment");
5967	  return error_mark_node;
5968	}
5969
5970      from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
5971		   ? 1 + (modifycode != INIT_EXPR): 0;
5972      return build_vec_init (lhs, NULL_TREE, newrhs,
5973			     /*explicit_default_init_p=*/false,
5974			     from_array);
5975    }
5976
5977  if (modifycode == INIT_EXPR)
5978    newrhs = convert_for_initialization (lhs, lhstype, newrhs, LOOKUP_NORMAL,
5979					 "initialization", NULL_TREE, 0);
5980  else
5981    {
5982      /* Avoid warnings on enum bit fields.  */
5983      if (TREE_CODE (olhstype) == ENUMERAL_TYPE
5984	  && TREE_CODE (lhstype) == INTEGER_TYPE)
5985	{
5986	  newrhs = convert_for_assignment (olhstype, newrhs, "assignment",
5987					   NULL_TREE, 0);
5988	  newrhs = convert_force (lhstype, newrhs, 0);
5989	}
5990      else
5991	newrhs = convert_for_assignment (lhstype, newrhs, "assignment",
5992					 NULL_TREE, 0);
5993      if (TREE_CODE (newrhs) == CALL_EXPR
5994	  && TYPE_NEEDS_CONSTRUCTING (lhstype))
5995	newrhs = build_cplus_new (lhstype, newrhs);
5996
5997      /* Can't initialize directly from a TARGET_EXPR, since that would
5998	 cause the lhs to be constructed twice, and possibly result in
5999	 accidental self-initialization.  So we force the TARGET_EXPR to be
6000	 expanded without a target.  */
6001      if (TREE_CODE (newrhs) == TARGET_EXPR)
6002	newrhs = build2 (COMPOUND_EXPR, TREE_TYPE (newrhs), newrhs,
6003			 TREE_OPERAND (newrhs, 0));
6004    }
6005
6006  if (newrhs == error_mark_node)
6007    return error_mark_node;
6008
6009  if (c_dialect_objc () && flag_objc_gc)
6010    {
6011      result = objc_generate_write_barrier (lhs, modifycode, newrhs);
6012
6013      if (result)
6014	return result;
6015    }
6016
6017  result = build2 (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
6018		   lhstype, lhs, newrhs);
6019
6020  TREE_SIDE_EFFECTS (result) = 1;
6021  if (!plain_assign)
6022    TREE_NO_WARNING (result) = 1;
6023
6024  /* If we got the LHS in a different type for storing in,
6025     convert the result back to the nominal type of LHS
6026     so that the value we return always has the same type
6027     as the LHS argument.  */
6028
6029  if (olhstype == TREE_TYPE (result))
6030    return result;
6031  if (olhs)
6032    {
6033      result = build2 (COMPOUND_EXPR, olhstype, result, olhs);
6034      TREE_NO_WARNING (result) = 1;
6035      return result;
6036    }
6037  return convert_for_assignment (olhstype, result, "assignment",
6038				 NULL_TREE, 0);
6039}
6040
6041tree
6042build_x_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
6043{
6044  /* APPLE LOCAL __block assign sequence point 6639533 */
6045  bool insert_sequence_point = false;
6046
6047  if (processing_template_decl)
6048    return build_min_nt (MODOP_EXPR, lhs,
6049			 build_min_nt (modifycode, NULL_TREE, NULL_TREE), rhs);
6050
6051  /* APPLE LOCAL begin __block assign sequence point 6639533 */
6052  /* For byref = x;, we have to transform this into ({ typeof(x) x' =
6053     x; byref = x`; )} to ensure there is a sequence point before the
6054     evaluation of the byref, inorder to ensure that the access
6055     expression for byref doesn't start running before x is evaluated,
6056     as it will access the __forwarding pointer and that must be done
6057     after x is evaluated.  */
6058  /* First we check to see if lhs is a byref...  byrefs look like:
6059	__Block_byref_X.__forwarding->x  */
6060  if (TREE_CODE (lhs) == COMPONENT_REF)
6061    {
6062      tree inner = TREE_OPERAND (lhs, 0);
6063      /* now check for -> */
6064      if (TREE_CODE (inner) == INDIRECT_REF)
6065	{
6066	  inner = TREE_OPERAND (inner, 0);
6067	  if (TREE_CODE (inner) == COMPONENT_REF)
6068	    {
6069	      inner = TREE_OPERAND (inner, 0);
6070	      if (TREE_CODE (inner) == VAR_DECL
6071		  && COPYABLE_BYREF_LOCAL_VAR (inner))
6072		{
6073		  tree old_rhs = rhs;
6074		  /* then we save the rhs.  */
6075		  rhs = save_expr (rhs);
6076		  if (rhs != old_rhs)
6077		    /* And arrange for the sequence point to be inserted.  */
6078		    insert_sequence_point = true;
6079		}
6080	    }
6081	}
6082    }
6083  /* APPLE LOCAL end __block assign sequence point 6639533 */
6084
6085  if (modifycode != NOP_EXPR)
6086    {
6087      tree rval = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL, lhs, rhs,
6088				make_node (modifycode),
6089				/*overloaded_p=*/NULL);
6090      if (rval)
6091	{
6092	  /* APPLE LOCAL begin __block assign sequence point 6639533 */
6093	  if (insert_sequence_point)
6094	    rval = build2 (COMPOUND_EXPR, TREE_TYPE (rval), rhs, rval);
6095	  /* APPLE LOCAL end __block assign sequence point 6639533 */
6096	  TREE_NO_WARNING (rval) = 1;
6097	  return rval;
6098	}
6099    }
6100  lhs = build_modify_expr (lhs, modifycode, rhs);
6101  /* APPLE LOCAL begin __block assign sequence point 6639533 */
6102  if (insert_sequence_point)
6103    lhs = build2 (COMPOUND_EXPR, TREE_TYPE (lhs), rhs, lhs);
6104  /* APPLE LOCAL end __block assign sequence point 6639533 */
6105  return lhs;
6106}
6107
6108
6109/* Get difference in deltas for different pointer to member function
6110   types.  Returns an integer constant of type PTRDIFF_TYPE_NODE.  If
6111   the conversion is invalid, the constant is zero.  If
6112   ALLOW_INVERSE_P is true, then allow reverse conversions as well.
6113   If C_CAST_P is true this conversion is taking place as part of a
6114   C-style cast.
6115
6116   Note that the naming of FROM and TO is kind of backwards; the return
6117   value is what we add to a TO in order to get a FROM.  They are named
6118   this way because we call this function to find out how to convert from
6119   a pointer to member of FROM to a pointer to member of TO.  */
6120
6121static tree
6122get_delta_difference (tree from, tree to,
6123		      bool allow_inverse_p,
6124		      bool c_cast_p)
6125{
6126  tree binfo;
6127  base_kind kind;
6128  tree result;
6129
6130  /* Assume no conversion is required.  */
6131  result = integer_zero_node;
6132  binfo = lookup_base (to, from, c_cast_p ? ba_unique : ba_check, &kind);
6133  if (kind == bk_inaccessible || kind == bk_ambig)
6134    error ("   in pointer to member function conversion");
6135  else if (binfo)
6136    {
6137      if (kind != bk_via_virtual)
6138	result = BINFO_OFFSET (binfo);
6139      else
6140	{
6141	  tree virt_binfo = binfo_from_vbase (binfo);
6142
6143	  /* This is a reinterpret cast, we choose to do nothing.  */
6144	  if (allow_inverse_p)
6145	    warning (0, "pointer to member cast via virtual base %qT",
6146		     BINFO_TYPE (virt_binfo));
6147	  else
6148	    error ("pointer to member conversion via virtual base %qT",
6149		   BINFO_TYPE (virt_binfo));
6150	}
6151    }
6152  else if (same_type_ignoring_top_level_qualifiers_p (from, to))
6153    /* Pointer to member of incomplete class is permitted*/;
6154  else if (!allow_inverse_p)
6155    {
6156      error_not_base_type (from, to);
6157      error ("   in pointer to member conversion");
6158    }
6159  else
6160    {
6161      binfo = lookup_base (from, to, c_cast_p ? ba_unique : ba_check, &kind);
6162      if (binfo)
6163	{
6164	  if (kind != bk_via_virtual)
6165	    result = size_diffop (size_zero_node, BINFO_OFFSET (binfo));
6166	  else
6167	    {
6168	      /* This is a reinterpret cast, we choose to do nothing.  */
6169	      tree virt_binfo = binfo_from_vbase (binfo);
6170
6171	      warning (0, "pointer to member cast via virtual base %qT",
6172		       BINFO_TYPE (virt_binfo));
6173	    }
6174	}
6175    }
6176
6177  return fold_if_not_in_template (convert_to_integer (ptrdiff_type_node,
6178						      result));
6179}
6180
6181/* Return a constructor for the pointer-to-member-function TYPE using
6182   the other components as specified.  */
6183
6184tree
6185build_ptrmemfunc1 (tree type, tree delta, tree pfn)
6186{
6187  tree u = NULL_TREE;
6188  tree delta_field;
6189  tree pfn_field;
6190  VEC(constructor_elt, gc) *v;
6191
6192  /* Pull the FIELD_DECLs out of the type.  */
6193  pfn_field = TYPE_FIELDS (type);
6194  delta_field = TREE_CHAIN (pfn_field);
6195
6196  /* Make sure DELTA has the type we want.  */
6197  delta = convert_and_check (delta_type_node, delta);
6198
6199  /* Finish creating the initializer.  */
6200  v = VEC_alloc(constructor_elt, gc, 2);
6201  CONSTRUCTOR_APPEND_ELT(v, pfn_field, pfn);
6202  CONSTRUCTOR_APPEND_ELT(v, delta_field, delta);
6203  u = build_constructor (type, v);
6204  TREE_CONSTANT (u) = TREE_CONSTANT (pfn) & TREE_CONSTANT (delta);
6205  TREE_INVARIANT (u) = TREE_INVARIANT (pfn) & TREE_INVARIANT (delta);
6206  TREE_STATIC (u) = (TREE_CONSTANT (u)
6207		     && (initializer_constant_valid_p (pfn, TREE_TYPE (pfn))
6208			 != NULL_TREE)
6209		     && (initializer_constant_valid_p (delta, TREE_TYPE (delta))
6210			 != NULL_TREE));
6211  return u;
6212}
6213
6214/* Build a constructor for a pointer to member function.  It can be
6215   used to initialize global variables, local variable, or used
6216   as a value in expressions.  TYPE is the POINTER to METHOD_TYPE we
6217   want to be.
6218
6219   If FORCE is nonzero, then force this conversion, even if
6220   we would rather not do it.  Usually set when using an explicit
6221   cast.  A C-style cast is being processed iff C_CAST_P is true.
6222
6223   Return error_mark_node, if something goes wrong.  */
6224
6225tree
6226build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p)
6227{
6228  tree fn;
6229  tree pfn_type;
6230  tree to_type;
6231
6232  if (error_operand_p (pfn))
6233    return error_mark_node;
6234
6235  pfn_type = TREE_TYPE (pfn);
6236  to_type = build_ptrmemfunc_type (type);
6237
6238  /* Handle multiple conversions of pointer to member functions.  */
6239  if (TYPE_PTRMEMFUNC_P (pfn_type))
6240    {
6241      tree delta = NULL_TREE;
6242      tree npfn = NULL_TREE;
6243      tree n;
6244
6245      if (!force
6246	  && !can_convert_arg (to_type, TREE_TYPE (pfn), pfn, LOOKUP_NORMAL))
6247	error ("invalid conversion to type %qT from type %qT",
6248	       to_type, pfn_type);
6249
6250      n = get_delta_difference (TYPE_PTRMEMFUNC_OBJECT_TYPE (pfn_type),
6251				TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type),
6252				force,
6253				c_cast_p);
6254
6255      /* We don't have to do any conversion to convert a
6256	 pointer-to-member to its own type.  But, we don't want to
6257	 just return a PTRMEM_CST if there's an explicit cast; that
6258	 cast should make the expression an invalid template argument.  */
6259      if (TREE_CODE (pfn) != PTRMEM_CST)
6260	{
6261	  if (same_type_p (to_type, pfn_type))
6262	    return pfn;
6263	  else if (integer_zerop (n))
6264	    return build_reinterpret_cast (to_type, pfn);
6265	}
6266
6267      if (TREE_SIDE_EFFECTS (pfn))
6268	pfn = save_expr (pfn);
6269
6270      /* Obtain the function pointer and the current DELTA.  */
6271      if (TREE_CODE (pfn) == PTRMEM_CST)
6272	expand_ptrmemfunc_cst (pfn, &delta, &npfn);
6273      else
6274	{
6275	  npfn = build_ptrmemfunc_access_expr (pfn, pfn_identifier);
6276	  delta = build_ptrmemfunc_access_expr (pfn, delta_identifier);
6277	}
6278
6279      /* Just adjust the DELTA field.  */
6280      gcc_assert  (same_type_ignoring_top_level_qualifiers_p
6281		   (TREE_TYPE (delta), ptrdiff_type_node));
6282      if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta)
6283	n = cp_build_binary_op (LSHIFT_EXPR, n, integer_one_node);
6284      delta = cp_build_binary_op (PLUS_EXPR, delta, n);
6285      return build_ptrmemfunc1 (to_type, delta, npfn);
6286    }
6287
6288  /* Handle null pointer to member function conversions.  */
6289  if (integer_zerop (pfn))
6290    {
6291      pfn = build_c_cast (type, integer_zero_node);
6292      return build_ptrmemfunc1 (to_type,
6293				integer_zero_node,
6294				pfn);
6295    }
6296
6297  if (type_unknown_p (pfn))
6298    return instantiate_type (type, pfn, tf_warning_or_error);
6299
6300  fn = TREE_OPERAND (pfn, 0);
6301  gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
6302	      /* In a template, we will have preserved the
6303		 OFFSET_REF.  */
6304	      || (processing_template_decl && TREE_CODE (fn) == OFFSET_REF));
6305  return make_ptrmem_cst (to_type, fn);
6306}
6307
6308/* Return the DELTA, IDX, PFN, and DELTA2 values for the PTRMEM_CST
6309   given by CST.
6310
6311   ??? There is no consistency as to the types returned for the above
6312   values.  Some code acts as if it were a sizetype and some as if it were
6313   integer_type_node.  */
6314
6315void
6316expand_ptrmemfunc_cst (tree cst, tree *delta, tree *pfn)
6317{
6318  tree type = TREE_TYPE (cst);
6319  tree fn = PTRMEM_CST_MEMBER (cst);
6320  tree ptr_class, fn_class;
6321
6322  gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
6323
6324  /* The class that the function belongs to.  */
6325  fn_class = DECL_CONTEXT (fn);
6326
6327  /* The class that we're creating a pointer to member of.  */
6328  ptr_class = TYPE_PTRMEMFUNC_OBJECT_TYPE (type);
6329
6330  /* First, calculate the adjustment to the function's class.  */
6331  *delta = get_delta_difference (fn_class, ptr_class, /*force=*/0,
6332				 /*c_cast_p=*/0);
6333
6334  if (!DECL_VIRTUAL_P (fn))
6335    *pfn = convert (TYPE_PTRMEMFUNC_FN_TYPE (type), build_addr_func (fn));
6336  else
6337    {
6338      /* If we're dealing with a virtual function, we have to adjust 'this'
6339	 again, to point to the base which provides the vtable entry for
6340	 fn; the call will do the opposite adjustment.  */
6341      tree orig_class = DECL_CONTEXT (fn);
6342      tree binfo = binfo_or_else (orig_class, fn_class);
6343      *delta = build2 (PLUS_EXPR, TREE_TYPE (*delta),
6344		       *delta, BINFO_OFFSET (binfo));
6345      *delta = fold_if_not_in_template (*delta);
6346
6347      /* We set PFN to the vtable offset at which the function can be
6348	 found, plus one (unless ptrmemfunc_vbit_in_delta, in which
6349	 case delta is shifted left, and then incremented).  */
6350      *pfn = DECL_VINDEX (fn);
6351      *pfn = build2 (MULT_EXPR, integer_type_node, *pfn,
6352		     TYPE_SIZE_UNIT (vtable_entry_type));
6353      *pfn = fold_if_not_in_template (*pfn);
6354
6355      switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
6356	{
6357	case ptrmemfunc_vbit_in_pfn:
6358	  *pfn = build2 (PLUS_EXPR, integer_type_node, *pfn,
6359			 integer_one_node);
6360	  *pfn = fold_if_not_in_template (*pfn);
6361	  break;
6362
6363	case ptrmemfunc_vbit_in_delta:
6364	  *delta = build2 (LSHIFT_EXPR, TREE_TYPE (*delta),
6365			   *delta, integer_one_node);
6366	  *delta = fold_if_not_in_template (*delta);
6367	  *delta = build2 (PLUS_EXPR, TREE_TYPE (*delta),
6368			   *delta, integer_one_node);
6369	  *delta = fold_if_not_in_template (*delta);
6370	  break;
6371
6372	default:
6373	  gcc_unreachable ();
6374	}
6375
6376      *pfn = build_nop (TYPE_PTRMEMFUNC_FN_TYPE (type), *pfn);
6377      *pfn = fold_if_not_in_template (*pfn);
6378    }
6379}
6380
6381/* Return an expression for PFN from the pointer-to-member function
6382   given by T.  */
6383
6384static tree
6385pfn_from_ptrmemfunc (tree t)
6386{
6387  if (TREE_CODE (t) == PTRMEM_CST)
6388    {
6389      tree delta;
6390      tree pfn;
6391
6392      expand_ptrmemfunc_cst (t, &delta, &pfn);
6393      if (pfn)
6394	return pfn;
6395    }
6396
6397  return build_ptrmemfunc_access_expr (t, pfn_identifier);
6398}
6399
6400/* Convert value RHS to type TYPE as preparation for an assignment to
6401   an lvalue of type TYPE.  ERRTYPE is a string to use in error
6402   messages: "assignment", "return", etc.  If FNDECL is non-NULL, we
6403   are doing the conversion in order to pass the PARMNUMth argument of
6404   FNDECL.  */
6405
6406static tree
6407convert_for_assignment (tree type, tree rhs,
6408			const char *errtype, tree fndecl, int parmnum)
6409{
6410  tree rhstype;
6411  enum tree_code coder;
6412  /* APPLE LOCAL radar 4874632 */
6413  tree new_rhs = NULL_TREE;
6414
6415  /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
6416  if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
6417    rhs = TREE_OPERAND (rhs, 0);
6418
6419  rhstype = TREE_TYPE (rhs);
6420  coder = TREE_CODE (rhstype);
6421
6422  if (TREE_CODE (type) == VECTOR_TYPE && coder == VECTOR_TYPE
6423      && vector_types_convertible_p (type, rhstype, true))
6424    return convert (type, rhs);
6425
6426  if (rhs == error_mark_node || rhstype == error_mark_node)
6427    return error_mark_node;
6428  if (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node)
6429    return error_mark_node;
6430
6431  /* The RHS of an assignment cannot have void type.  */
6432  if (coder == VOID_TYPE)
6433    {
6434      error ("void value not ignored as it ought to be");
6435      return error_mark_node;
6436    }
6437
6438  /* Simplify the RHS if possible.  */
6439  if (TREE_CODE (rhs) == CONST_DECL)
6440    rhs = DECL_INITIAL (rhs);
6441
6442  if (c_dialect_objc ())
6443    {
6444      int parmno;
6445      tree rname = fndecl;
6446
6447      if (!strcmp (errtype, "assignment"))
6448	parmno = -1;
6449      else if (!strcmp (errtype, "initialization"))
6450	parmno = -2;
6451      else
6452	{
6453	  tree selector = objc_message_selector ();
6454
6455	  parmno = parmnum;
6456
6457	  if (selector && parmno > 1)
6458	    {
6459	      rname = selector;
6460	      parmno -= 1;
6461	    }
6462	}
6463
6464      /* APPLE LOCAL file radar 6231433 */
6465      if (objc_compare_types (type, rhstype, parmno, rname, "comparison"))
6466	/* APPLE LOCAL radar 4874632 */
6467	new_rhs = convert (type, rhs);
6468    }
6469
6470  /* [expr.ass]
6471
6472     The expression is implicitly converted (clause _conv_) to the
6473     cv-unqualified type of the left operand.
6474
6475     We allow bad conversions here because by the time we get to this point
6476     we are committed to doing the conversion.  If we end up doing a bad
6477     conversion, convert_like will complain.  */
6478  if (!can_convert_arg_bad (type, rhstype, rhs))
6479    {
6480      /* When -Wno-pmf-conversions is use, we just silently allow
6481	 conversions from pointers-to-members to plain pointers.  If
6482	 the conversion doesn't work, cp_convert will complain.  */
6483      if (!warn_pmf2ptr
6484	  && TYPE_PTR_P (type)
6485	  && TYPE_PTRMEMFUNC_P (rhstype))
6486	rhs = cp_convert (strip_top_quals (type), rhs);
6487      else
6488	{
6489	  /* If the right-hand side has unknown type, then it is an
6490	     overloaded function.  Call instantiate_type to get error
6491	     messages.  */
6492	  if (rhstype == unknown_type_node)
6493	    instantiate_type (type, rhs, tf_warning_or_error);
6494	  else if (fndecl)
6495	    error ("cannot convert %qT to %qT for argument %qP to %qD",
6496		   rhstype, type, parmnum, fndecl);
6497	  else
6498	    error ("cannot convert %qT to %qT in %s", rhstype, type, errtype);
6499	  return error_mark_node;
6500	}
6501    }
6502  if (warn_missing_format_attribute)
6503    {
6504      const enum tree_code codel = TREE_CODE (type);
6505      if ((codel == POINTER_TYPE || codel == REFERENCE_TYPE)
6506	  && coder == codel
6507	  && check_missing_format_attribute (type, rhstype))
6508	warning (OPT_Wmissing_format_attribute,
6509		 "%s might be a candidate for a format attribute",
6510		 errtype);
6511    }
6512
6513  /* If -Wparentheses, warn about a = b = c when a has type bool and b
6514     does not.  */
6515  if (warn_parentheses
6516      && type == boolean_type_node
6517      && TREE_CODE (rhs) == MODIFY_EXPR
6518      && !TREE_NO_WARNING (rhs)
6519      && TREE_TYPE (rhs) != boolean_type_node)
6520    {
6521      warning (OPT_Wparentheses,
6522	       "suggest parentheses around assignment used as truth value");
6523      TREE_NO_WARNING (rhs) = 1;
6524    }
6525
6526  return perform_implicit_conversion (strip_top_quals (type), rhs);
6527}
6528
6529/* Convert RHS to be of type TYPE.
6530   If EXP is nonzero, it is the target of the initialization.
6531   ERRTYPE is a string to use in error messages.
6532
6533   Two major differences between the behavior of
6534   `convert_for_assignment' and `convert_for_initialization'
6535   are that references are bashed in the former, while
6536   copied in the latter, and aggregates are assigned in
6537   the former (operator=) while initialized in the
6538   latter (X(X&)).
6539
6540   If using constructor make sure no conversion operator exists, if one does
6541   exist, an ambiguity exists.
6542
6543   If flags doesn't include LOOKUP_COMPLAIN, don't complain about anything.  */
6544
6545tree
6546convert_for_initialization (tree exp, tree type, tree rhs, int flags,
6547			    const char *errtype, tree fndecl, int parmnum)
6548{
6549  enum tree_code codel = TREE_CODE (type);
6550  tree rhstype;
6551  enum tree_code coder;
6552
6553  /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
6554     Strip such NOP_EXPRs, since RHS is used in non-lvalue context.  */
6555  if (TREE_CODE (rhs) == NOP_EXPR
6556      && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))
6557      && codel != REFERENCE_TYPE)
6558    rhs = TREE_OPERAND (rhs, 0);
6559
6560  if (type == error_mark_node
6561      || rhs == error_mark_node
6562      || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node))
6563    return error_mark_node;
6564
6565  if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
6566       && TREE_CODE (type) != ARRAY_TYPE
6567       && (TREE_CODE (type) != REFERENCE_TYPE
6568	   || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
6569      || (TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
6570	  && (TREE_CODE (type) != REFERENCE_TYPE
6571	      || TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE))
6572      || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
6573    rhs = decay_conversion (rhs);
6574
6575  rhstype = TREE_TYPE (rhs);
6576  coder = TREE_CODE (rhstype);
6577
6578  if (coder == ERROR_MARK)
6579    return error_mark_node;
6580
6581  /* We accept references to incomplete types, so we can
6582     return here before checking if RHS is of complete type.  */
6583
6584  if (codel == REFERENCE_TYPE)
6585    {
6586      /* This should eventually happen in convert_arguments.  */
6587      int savew = 0, savee = 0;
6588
6589      if (fndecl)
6590	savew = warningcount, savee = errorcount;
6591      rhs = initialize_reference (type, rhs, /*decl=*/NULL_TREE,
6592				  /*cleanup=*/NULL);
6593      if (fndecl)
6594	{
6595	  if (warningcount > savew)
6596	    warning (0, "in passing argument %P of %q+D", parmnum, fndecl);
6597	  else if (errorcount > savee)
6598	    error ("in passing argument %P of %q+D", parmnum, fndecl);
6599	}
6600      return rhs;
6601    }
6602
6603  if (exp != 0)
6604    exp = require_complete_type (exp);
6605  if (exp == error_mark_node)
6606    return error_mark_node;
6607
6608  rhstype = non_reference (rhstype);
6609
6610  type = complete_type (type);
6611
6612  if (IS_AGGR_TYPE (type))
6613    return ocp_convert (type, rhs, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
6614
6615  return convert_for_assignment (type, rhs, errtype, fndecl, parmnum);
6616}
6617
6618/* If RETVAL is the address of, or a reference to, a local variable or
6619   temporary give an appropriate warning.  */
6620
6621static void
6622maybe_warn_about_returning_address_of_local (tree retval)
6623{
6624  tree valtype = TREE_TYPE (DECL_RESULT (current_function_decl));
6625  tree whats_returned = retval;
6626
6627  for (;;)
6628    {
6629      if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
6630	whats_returned = TREE_OPERAND (whats_returned, 1);
6631      else if (TREE_CODE (whats_returned) == CONVERT_EXPR
6632	       || TREE_CODE (whats_returned) == NON_LVALUE_EXPR
6633	       || TREE_CODE (whats_returned) == NOP_EXPR)
6634	whats_returned = TREE_OPERAND (whats_returned, 0);
6635      else
6636	break;
6637    }
6638
6639  if (TREE_CODE (whats_returned) != ADDR_EXPR)
6640    return;
6641  whats_returned = TREE_OPERAND (whats_returned, 0);
6642
6643  if (TREE_CODE (valtype) == REFERENCE_TYPE)
6644    {
6645      if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
6646	  || TREE_CODE (whats_returned) == TARGET_EXPR)
6647	{
6648	  warning (0, "returning reference to temporary");
6649	  return;
6650	}
6651      if (TREE_CODE (whats_returned) == VAR_DECL
6652	  && DECL_NAME (whats_returned)
6653	  && TEMP_NAME_P (DECL_NAME (whats_returned)))
6654	{
6655	  warning (0, "reference to non-lvalue returned");
6656	  return;
6657	}
6658    }
6659
6660  while (TREE_CODE (whats_returned) == COMPONENT_REF
6661	 || TREE_CODE (whats_returned) == ARRAY_REF)
6662    whats_returned = TREE_OPERAND (whats_returned, 0);
6663
6664  if (DECL_P (whats_returned)
6665      && DECL_NAME (whats_returned)
6666      && DECL_FUNCTION_SCOPE_P (whats_returned)
6667      && !(TREE_STATIC (whats_returned)
6668	   || TREE_PUBLIC (whats_returned)))
6669    {
6670      if (TREE_CODE (valtype) == REFERENCE_TYPE)
6671	warning (0, "reference to local variable %q+D returned",
6672		 whats_returned);
6673      /* APPLE LOCAL begin blocks 6040305 (cn) */
6674      else if (TREE_CODE (valtype) == BLOCK_POINTER_TYPE)
6675	error ("returning block that lives on the local stack");
6676      /* APPLE LOCAL end blocks 6040305 (cn) */
6677      else
6678	warning (0, "address of local variable %q+D returned",
6679		 whats_returned);
6680      return;
6681    }
6682}
6683
6684/* APPLE LOCAL begin blocks 6040305 (cm) */
6685static bool
6686types_are_block_compatible (tree t1, tree t2)
6687{
6688  return comptypes (t1, t2, COMPARE_STRICT);
6689}
6690/* APPLE LOCAL end blocks 6040305 (cm) */
6691
6692/* Check that returning RETVAL from the current function is valid.
6693   Return an expression explicitly showing all conversions required to
6694   change RETVAL into the function return type, and to assign it to
6695   the DECL_RESULT for the function.  Set *NO_WARNING to true if
6696   code reaches end of non-void function warning shouldn't be issued
6697   on this RETURN_EXPR.  */
6698
6699tree
6700check_return_expr (tree retval, bool *no_warning)
6701{
6702  tree result;
6703  /* The type actually returned by the function, after any
6704     promotions.  */
6705  tree valtype;
6706  int fn_returns_value_p;
6707
6708  *no_warning = false;
6709
6710  /* A `volatile' function is one that isn't supposed to return, ever.
6711     (This is a G++ extension, used to get better code for functions
6712     that call the `volatile' function.)  */
6713  if (TREE_THIS_VOLATILE (current_function_decl))
6714    warning (0, "function declared %<noreturn%> has a %<return%> statement");
6715
6716  /* Check for various simple errors.  */
6717  if (DECL_DESTRUCTOR_P (current_function_decl))
6718    {
6719      if (retval)
6720	error ("returning a value from a destructor");
6721      return NULL_TREE;
6722    }
6723  else if (DECL_CONSTRUCTOR_P (current_function_decl))
6724    {
6725      if (in_function_try_handler)
6726	/* If a return statement appears in a handler of the
6727	   function-try-block of a constructor, the program is ill-formed.  */
6728	error ("cannot return from a handler of a function-try-block of a constructor");
6729      else if (retval)
6730	/* You can't return a value from a constructor.  */
6731	error ("returning a value from a constructor");
6732      return NULL_TREE;
6733    }
6734
6735  /* APPLE LOCAL begin blocks 6040305 (cm) */
6736  /* APPLE LOCAL radar 6185344 */
6737  if (cur_block && !cur_block->block_has_return_type)
6738    {
6739      /* If this is the first return we've seen in the block, infer the type of
6740   the block from it. */
6741      if (cur_block->return_type == NULL_TREE)
6742  {
6743    if (retval)
6744      {
6745	 tree restype;
6746	 retval = decay_conversion (retval);
6747	 restype = TYPE_MAIN_VARIANT (TREE_TYPE (retval));
6748	 TREE_TYPE (current_function_decl)
6749      = build_function_type (restype,
6750		       TYPE_ARG_TYPES (TREE_TYPE (current_function_decl)));
6751	 TREE_TYPE (DECL_RESULT (current_function_decl)) = restype;
6752	 relayout_decl (DECL_RESULT (current_function_decl));
6753	 cur_block->return_type = restype;
6754      }
6755    else
6756      cur_block->return_type = void_type_node;
6757  }
6758
6759      /* Verify that this result type matches the previous one.  We
6760   are pickier with blocks than for normal functions because
6761   this is a new feature and we set the rules. */
6762      if (TREE_CODE (cur_block->return_type) == VOID_TYPE)
6763  {
6764    if (retval)
6765      {
6766	 error ("void block should not return a value");
6767	 return error_mark_node;
6768      }
6769  }
6770      else if (!retval)
6771  {
6772    error ("non-void block should return a value");
6773    return error_mark_node;
6774  }
6775
6776      if (retval)
6777  {
6778    /* We have a non-void block with an expression, continue checking.  */
6779    valtype = TREE_TYPE (retval);
6780
6781    /* For now, restrict multiple return statements in a block to have
6782	strict compatible types only. */
6783    if (!types_are_block_compatible (cur_block->return_type, valtype))
6784      {
6785	 error ("incompatible type returning %qT, expected %qT",
6786	    valtype, cur_block->return_type);
6787	 return error_mark_node;
6788      }
6789  }
6790    }
6791  /* APPLE LOCAL end blocks 6040305 (cm) */
6792
6793  if (processing_template_decl)
6794    {
6795      current_function_returns_value = 1;
6796      return retval;
6797    }
6798
6799  /* When no explicit return-value is given in a function with a named
6800     return value, the named return value is used.  */
6801  result = DECL_RESULT (current_function_decl);
6802  valtype = TREE_TYPE (result);
6803  gcc_assert (valtype != NULL_TREE);
6804  fn_returns_value_p = !VOID_TYPE_P (valtype);
6805  if (!retval && DECL_NAME (result) && fn_returns_value_p)
6806    retval = result;
6807
6808  /* Check for a return statement with no return value in a function
6809     that's supposed to return a value.  */
6810  if (!retval && fn_returns_value_p)
6811    {
6812      pedwarn ("return-statement with no value, in function returning %qT",
6813	       valtype);
6814      /* Clear this, so finish_function won't say that we reach the
6815	 end of a non-void function (which we don't, we gave a
6816	 return!).  */
6817      current_function_returns_null = 0;
6818      /* And signal caller that TREE_NO_WARNING should be set on the
6819	 RETURN_EXPR to avoid control reaches end of non-void function
6820	 warnings in tree-cfg.c.  */
6821      *no_warning = true;
6822    }
6823  /* Check for a return statement with a value in a function that
6824     isn't supposed to return a value.  */
6825  else if (retval && !fn_returns_value_p)
6826    {
6827      if (VOID_TYPE_P (TREE_TYPE (retval)))
6828	/* You can return a `void' value from a function of `void'
6829	   type.  In that case, we have to evaluate the expression for
6830	   its side-effects.  */
6831	  finish_expr_stmt (retval);
6832      else
6833	pedwarn ("return-statement with a value, in function "
6834		 "returning 'void'");
6835
6836      current_function_returns_null = 1;
6837
6838      /* There's really no value to return, after all.  */
6839      return NULL_TREE;
6840    }
6841  else if (!retval)
6842    /* Remember that this function can sometimes return without a
6843       value.  */
6844    current_function_returns_null = 1;
6845  else
6846    /* Remember that this function did return a value.  */
6847    current_function_returns_value = 1;
6848
6849  /* Check for erroneous operands -- but after giving ourselves a
6850     chance to provide an error about returning a value from a void
6851     function.  */
6852  if (error_operand_p (retval))
6853    {
6854      current_function_return_value = error_mark_node;
6855      return error_mark_node;
6856    }
6857
6858  /* Only operator new(...) throw(), can return NULL [expr.new/13].  */
6859  if ((DECL_OVERLOADED_OPERATOR_P (current_function_decl) == NEW_EXPR
6860       || DECL_OVERLOADED_OPERATOR_P (current_function_decl) == VEC_NEW_EXPR)
6861      && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl))
6862      && ! flag_check_new
6863      && null_ptr_cst_p (retval))
6864    warning (0, "%<operator new%> must not return NULL unless it is "
6865	     "declared %<throw()%> (or -fcheck-new is in effect)");
6866
6867  /* Effective C++ rule 15.  See also start_function.  */
6868  if (warn_ecpp
6869      && DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR))
6870    {
6871      bool warn = true;
6872
6873      /* The function return type must be a reference to the current
6874	class.  */
6875      if (TREE_CODE (valtype) == REFERENCE_TYPE
6876	  && same_type_ignoring_top_level_qualifiers_p
6877	      (TREE_TYPE (valtype), TREE_TYPE (current_class_ref)))
6878	{
6879	  /* Returning '*this' is obviously OK.  */
6880	  if (retval == current_class_ref)
6881	    warn = false;
6882	  /* If we are calling a function whose return type is the same of
6883	     the current class reference, it is ok.  */
6884	  else if (TREE_CODE (retval) == INDIRECT_REF
6885		   && TREE_CODE (TREE_OPERAND (retval, 0)) == CALL_EXPR)
6886	    warn = false;
6887	}
6888
6889      if (warn)
6890	warning (OPT_Weffc__, "%<operator=%> should return a reference to %<*this%>");
6891    }
6892
6893  /* The fabled Named Return Value optimization, as per [class.copy]/15:
6894
6895     [...]      For  a function with a class return type, if the expression
6896     in the return statement is the name of a local  object,  and  the  cv-
6897     unqualified  type  of  the  local  object  is the same as the function
6898     return type, an implementation is permitted to omit creating the  tem-
6899     porary  object  to  hold  the function return value [...]
6900
6901     So, if this is a value-returning function that always returns the same
6902     local variable, remember it.
6903
6904     It might be nice to be more flexible, and choose the first suitable
6905     variable even if the function sometimes returns something else, but
6906     then we run the risk of clobbering the variable we chose if the other
6907     returned expression uses the chosen variable somehow.  And people expect
6908     this restriction, anyway.  (jason 2000-11-19)
6909
6910     See finish_function and finalize_nrv for the rest of this optimization.  */
6911
6912  if (fn_returns_value_p && flag_elide_constructors)
6913    {
6914      if (retval != NULL_TREE
6915	  && (current_function_return_value == NULL_TREE
6916	      || current_function_return_value == retval)
6917	  && TREE_CODE (retval) == VAR_DECL
6918	  && DECL_CONTEXT (retval) == current_function_decl
6919	  && ! TREE_STATIC (retval)
6920	  && ! DECL_ANON_UNION_VAR_P (retval)
6921	  && (DECL_ALIGN (retval)
6922	      >= DECL_ALIGN (DECL_RESULT (current_function_decl)))
6923	  && same_type_p ((TYPE_MAIN_VARIANT
6924			   (TREE_TYPE (retval))),
6925			  (TYPE_MAIN_VARIANT
6926			   (TREE_TYPE (TREE_TYPE (current_function_decl))))))
6927	current_function_return_value = retval;
6928      else
6929	current_function_return_value = error_mark_node;
6930    }
6931
6932  /* We don't need to do any conversions when there's nothing being
6933     returned.  */
6934  if (!retval)
6935    return NULL_TREE;
6936
6937  /* Do any required conversions.  */
6938  if (retval == result || DECL_CONSTRUCTOR_P (current_function_decl))
6939    /* No conversions are required.  */
6940    ;
6941  else
6942    {
6943      /* The type the function is declared to return.  */
6944      tree functype = TREE_TYPE (TREE_TYPE (current_function_decl));
6945
6946      /* The functype's return type will have been set to void, if it
6947	 was an incomplete type.  Just treat this as 'return;' */
6948      if (VOID_TYPE_P (functype))
6949	return error_mark_node;
6950
6951      /* First convert the value to the function's return type, then
6952	 to the type of return value's location to handle the
6953	 case that functype is smaller than the valtype.  */
6954      retval = convert_for_initialization
6955	(NULL_TREE, functype, retval, LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING,
6956	 "return", NULL_TREE, 0);
6957      retval = convert (valtype, retval);
6958
6959      /* If the conversion failed, treat this just like `return;'.  */
6960      if (retval == error_mark_node)
6961	return retval;
6962      /* We can't initialize a register from a AGGR_INIT_EXPR.  */
6963      else if (! current_function_returns_struct
6964	       && TREE_CODE (retval) == TARGET_EXPR
6965	       && TREE_CODE (TREE_OPERAND (retval, 1)) == AGGR_INIT_EXPR)
6966	retval = build2 (COMPOUND_EXPR, TREE_TYPE (retval), retval,
6967			 TREE_OPERAND (retval, 0));
6968      else
6969	maybe_warn_about_returning_address_of_local (retval);
6970    }
6971
6972  /* Actually copy the value returned into the appropriate location.  */
6973  if (retval && retval != result)
6974    retval = build2 (INIT_EXPR, TREE_TYPE (result), result, retval);
6975
6976  return retval;
6977}
6978
6979
6980/* Returns nonzero if the pointer-type FROM can be converted to the
6981   pointer-type TO via a qualification conversion.  If CONSTP is -1,
6982   then we return nonzero if the pointers are similar, and the
6983   cv-qualification signature of FROM is a proper subset of that of TO.
6984
6985   If CONSTP is positive, then all outer pointers have been
6986   const-qualified.  */
6987
6988static int
6989comp_ptr_ttypes_real (tree to, tree from, int constp)
6990{
6991  bool to_more_cv_qualified = false;
6992
6993  for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
6994    {
6995      if (TREE_CODE (to) != TREE_CODE (from))
6996	return 0;
6997
6998      if (TREE_CODE (from) == OFFSET_TYPE
6999	  && !same_type_p (TYPE_OFFSET_BASETYPE (from),
7000			   TYPE_OFFSET_BASETYPE (to)))
7001	return 0;
7002
7003      /* Const and volatile mean something different for function types,
7004	 so the usual checks are not appropriate.  */
7005      if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
7006	{
7007	  /* In Objective-C++, some types may have been 'volatilized' by
7008	     the compiler for EH; when comparing them here, the volatile
7009	     qualification must be ignored.  */
7010	  bool objc_quals_match = objc_type_quals_match (to, from);
7011
7012	  if (!at_least_as_qualified_p (to, from) && !objc_quals_match)
7013	    return 0;
7014
7015	  if (!at_least_as_qualified_p (from, to) && !objc_quals_match)
7016	    {
7017	      if (constp == 0)
7018		return 0;
7019	      to_more_cv_qualified = true;
7020	    }
7021
7022	  if (constp > 0)
7023	    constp &= TYPE_READONLY (to);
7024	}
7025
7026      if (TREE_CODE (to) != POINTER_TYPE && !TYPE_PTRMEM_P (to))
7027	return ((constp >= 0 || to_more_cv_qualified)
7028		&& same_type_ignoring_top_level_qualifiers_p (to, from));
7029    }
7030}
7031
7032/* When comparing, say, char ** to char const **, this function takes
7033   the 'char *' and 'char const *'.  Do not pass non-pointer/reference
7034   types to this function.  */
7035
7036int
7037comp_ptr_ttypes (tree to, tree from)
7038{
7039  return comp_ptr_ttypes_real (to, from, 1);
7040}
7041
7042/* Returns 1 if to and from are (possibly multi-level) pointers to the same
7043   type or inheritance-related types, regardless of cv-quals.  */
7044
7045int
7046ptr_reasonably_similar (tree to, tree from)
7047{
7048  for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7049    {
7050      /* Any target type is similar enough to void.  */
7051      if (TREE_CODE (to) == VOID_TYPE
7052	  || TREE_CODE (from) == VOID_TYPE)
7053	return 1;
7054
7055      if (TREE_CODE (to) != TREE_CODE (from))
7056	return 0;
7057
7058      if (TREE_CODE (from) == OFFSET_TYPE
7059	  && comptypes (TYPE_OFFSET_BASETYPE (to),
7060			TYPE_OFFSET_BASETYPE (from),
7061			COMPARE_BASE | COMPARE_DERIVED))
7062	continue;
7063
7064      if (TREE_CODE (to) == VECTOR_TYPE
7065	  && vector_types_convertible_p (to, from, false))
7066	return 1;
7067
7068      if (TREE_CODE (to) == INTEGER_TYPE
7069	  && TYPE_PRECISION (to) == TYPE_PRECISION (from))
7070	return 1;
7071
7072      if (TREE_CODE (to) == FUNCTION_TYPE)
7073	return 1;
7074
7075      if (TREE_CODE (to) != POINTER_TYPE)
7076	return comptypes
7077	  (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
7078	   COMPARE_BASE | COMPARE_DERIVED);
7079    }
7080}
7081
7082/* Return true if TO and FROM (both of which are POINTER_TYPEs or
7083   pointer-to-member types) are the same, ignoring cv-qualification at
7084   all levels.  */
7085
7086bool
7087comp_ptr_ttypes_const (tree to, tree from)
7088{
7089  for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7090    {
7091      if (TREE_CODE (to) != TREE_CODE (from))
7092	return false;
7093
7094      if (TREE_CODE (from) == OFFSET_TYPE
7095	  && same_type_p (TYPE_OFFSET_BASETYPE (from),
7096			  TYPE_OFFSET_BASETYPE (to)))
7097	  continue;
7098
7099      if (TREE_CODE (to) != POINTER_TYPE)
7100	return same_type_ignoring_top_level_qualifiers_p (to, from);
7101    }
7102}
7103
7104/* Returns the type qualifiers for this type, including the qualifiers on the
7105   elements for an array type.  */
7106
7107int
7108cp_type_quals (tree type)
7109{
7110  type = strip_array_types (type);
7111  if (type == error_mark_node)
7112    return TYPE_UNQUALIFIED;
7113  return TYPE_QUALS (type);
7114}
7115
7116/* Returns nonzero if the TYPE is const from a C++ perspective: look inside
7117   arrays.  */
7118
7119bool
7120cp_type_readonly (tree type)
7121{
7122  type = strip_array_types (type);
7123  return TYPE_READONLY (type);
7124}
7125
7126/* Returns nonzero if the TYPE contains a mutable member.  */
7127
7128bool
7129cp_has_mutable_p (tree type)
7130{
7131  type = strip_array_types (type);
7132
7133  return CLASS_TYPE_P (type) && CLASSTYPE_HAS_MUTABLE (type);
7134}
7135
7136/* Apply the TYPE_QUALS to the new DECL.  */
7137void
7138cp_apply_type_quals_to_decl (int type_quals, tree decl)
7139{
7140  tree type = TREE_TYPE (decl);
7141
7142  if (type == error_mark_node)
7143    return;
7144
7145  if (TREE_CODE (type) == FUNCTION_TYPE
7146      && type_quals != TYPE_UNQUALIFIED)
7147    {
7148      /* This was an error in C++98 (cv-qualifiers cannot be added to
7149	 a function type), but DR 295 makes the code well-formed by
7150	 dropping the extra qualifiers. */
7151      if (pedantic)
7152	{
7153	  tree bad_type = build_qualified_type (type, type_quals);
7154	  pedwarn ("ignoring %qV qualifiers added to function type %qT",
7155		   bad_type, type);
7156	}
7157
7158      TREE_TYPE (decl) = TYPE_MAIN_VARIANT (type);
7159      return;
7160    }
7161
7162  /* Avoid setting TREE_READONLY incorrectly.  */
7163  if (/* If the object has a constructor, the constructor may modify
7164	 the object.  */
7165      TYPE_NEEDS_CONSTRUCTING (type)
7166      /* If the type isn't complete, we don't know yet if it will need
7167	 constructing.  */
7168      || !COMPLETE_TYPE_P (type)
7169      /* If the type has a mutable component, that component might be
7170	 modified.  */
7171      || TYPE_HAS_MUTABLE_P (type))
7172    type_quals &= ~TYPE_QUAL_CONST;
7173
7174  c_apply_type_quals_to_decl (type_quals, decl);
7175}
7176
7177/* Subroutine of casts_away_constness.  Make T1 and T2 point at
7178   exemplar types such that casting T1 to T2 is casting away constness
7179   if and only if there is no implicit conversion from T1 to T2.  */
7180
7181static void
7182casts_away_constness_r (tree *t1, tree *t2)
7183{
7184  int quals1;
7185  int quals2;
7186
7187  /* [expr.const.cast]
7188
7189     For multi-level pointer to members and multi-level mixed pointers
7190     and pointers to members (conv.qual), the "member" aspect of a
7191     pointer to member level is ignored when determining if a const
7192     cv-qualifier has been cast away.  */
7193  /* [expr.const.cast]
7194
7195     For  two  pointer types:
7196
7197	    X1 is T1cv1,1 * ... cv1,N *   where T1 is not a pointer type
7198	    X2 is T2cv2,1 * ... cv2,M *   where T2 is not a pointer type
7199	    K is min(N,M)
7200
7201     casting from X1 to X2 casts away constness if, for a non-pointer
7202     type T there does not exist an implicit conversion (clause
7203     _conv_) from:
7204
7205	    Tcv1,(N-K+1) * cv1,(N-K+2) * ... cv1,N *
7206
7207     to
7208
7209	    Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *.  */
7210  if ((!TYPE_PTR_P (*t1) && !TYPE_PTRMEM_P (*t1))
7211      || (!TYPE_PTR_P (*t2) && !TYPE_PTRMEM_P (*t2)))
7212    {
7213      *t1 = cp_build_qualified_type (void_type_node,
7214				     cp_type_quals (*t1));
7215      *t2 = cp_build_qualified_type (void_type_node,
7216				     cp_type_quals (*t2));
7217      return;
7218    }
7219
7220  quals1 = cp_type_quals (*t1);
7221  quals2 = cp_type_quals (*t2);
7222
7223  if (TYPE_PTRMEM_P (*t1))
7224    *t1 = TYPE_PTRMEM_POINTED_TO_TYPE (*t1);
7225  else
7226    *t1 = TREE_TYPE (*t1);
7227  if (TYPE_PTRMEM_P (*t2))
7228    *t2 = TYPE_PTRMEM_POINTED_TO_TYPE (*t2);
7229  else
7230    *t2 = TREE_TYPE (*t2);
7231
7232  casts_away_constness_r (t1, t2);
7233  *t1 = build_pointer_type (*t1);
7234  *t2 = build_pointer_type (*t2);
7235  *t1 = cp_build_qualified_type (*t1, quals1);
7236  *t2 = cp_build_qualified_type (*t2, quals2);
7237}
7238
7239/* Returns nonzero if casting from TYPE1 to TYPE2 casts away
7240   constness.  */
7241
7242static bool
7243casts_away_constness (tree t1, tree t2)
7244{
7245  if (TREE_CODE (t2) == REFERENCE_TYPE)
7246    {
7247      /* [expr.const.cast]
7248
7249	 Casting from an lvalue of type T1 to an lvalue of type T2
7250	 using a reference cast casts away constness if a cast from an
7251	 rvalue of type "pointer to T1" to the type "pointer to T2"
7252	 casts away constness.  */
7253      t1 = (TREE_CODE (t1) == REFERENCE_TYPE ? TREE_TYPE (t1) : t1);
7254      return casts_away_constness (build_pointer_type (t1),
7255				   build_pointer_type (TREE_TYPE (t2)));
7256    }
7257
7258  if (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
7259    /* [expr.const.cast]
7260
7261       Casting from an rvalue of type "pointer to data member of X
7262       of type T1" to the type "pointer to data member of Y of type
7263       T2" casts away constness if a cast from an rvalue of type
7264       "pointer to T1" to the type "pointer to T2" casts away
7265       constness.  */
7266    return casts_away_constness
7267      (build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t1)),
7268       build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t2)));
7269
7270  /* Casting away constness is only something that makes sense for
7271     pointer or reference types.  */
7272  if (TREE_CODE (t1) != POINTER_TYPE
7273      || TREE_CODE (t2) != POINTER_TYPE)
7274    return false;
7275
7276  /* Top-level qualifiers don't matter.  */
7277  t1 = TYPE_MAIN_VARIANT (t1);
7278  t2 = TYPE_MAIN_VARIANT (t2);
7279  casts_away_constness_r (&t1, &t2);
7280  if (!can_convert (t2, t1))
7281    return true;
7282
7283  return false;
7284}
7285
7286/* If T is a REFERENCE_TYPE return the type to which T refers.
7287   Otherwise, return T itself.  */
7288
7289tree
7290non_reference (tree t)
7291{
7292  if (TREE_CODE (t) == REFERENCE_TYPE)
7293    t = TREE_TYPE (t);
7294  return t;
7295}
7296
7297
7298/* Return nonzero if REF is an lvalue valid for this language;
7299   otherwise, print an error message and return zero.  USE says
7300   how the lvalue is being used and so selects the error message.  */
7301
7302int
7303lvalue_or_else (tree ref, enum lvalue_use use)
7304{
7305  int win = lvalue_p (ref);
7306
7307  if (!win)
7308    lvalue_error (use);
7309
7310  return win;
7311}
7312