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