Update in-tree GCC to 3.4.4.
[dragonfly.git] / contrib / gcc-3.4 / gcc / cp / typeck.c
1 /* Build expressions with type checking for C++ compiler.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4    Hacked by Michael Tiemann (tiemann@cygnus.com)
5
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
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
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
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
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
163 type_unknown_p (tree exp)
164 {
165   return (TREE_CODE (exp) == TREE_LIST
166           || TREE_TYPE (exp) == unknown_type_node);
167 }
168
169 \f
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
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
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
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
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 
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
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
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 \f
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
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
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
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
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
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
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
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
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
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 \f
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
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 \f
1205 /* Process a sizeof or alignof expression where the operand is a
1206    type.  */
1207
1208 tree
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 (dependent_type_p (type))
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
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 \f
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 \f
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
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
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 \f
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
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 \f
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
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
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_if_not_in_template (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 \f
3470 /* Return a tree for the sum or difference (RESULTCODE says which)
3471    of pointer PTROP and integer INTOP.  */
3472
3473 static tree
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
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 \f
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
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       xarg = build_non_dependent_expr (xarg);
3553     }
3554
3555   exp = NULL_TREE;
3556
3557   /* [expr.unary.op] says:
3558
3559        The address of an object of incomplete type can be taken.
3560
3561      (And is just the ordinary address operator, not an overloaded
3562      "operator &".)  However, if the type is a template
3563      specialization, we must complete the type at this point so that
3564      an overloaded "operator &" will be available if required.  */
3565   if (code == ADDR_EXPR
3566       && TREE_CODE (xarg) != TEMPLATE_ID_EXPR
3567       && ((CLASS_TYPE_P (TREE_TYPE (xarg))
3568            && !COMPLETE_TYPE_P (complete_type (TREE_TYPE (xarg))))
3569           || (TREE_CODE (xarg) == OFFSET_REF)))
3570     /* Don't look for a function.  */;
3571   else
3572     exp = build_new_op (code, LOOKUP_NORMAL, xarg, NULL_TREE, NULL_TREE,
3573                         /*overloaded_p=*/NULL);
3574   if (!exp && code == ADDR_EXPR)
3575     {
3576       /*  A pointer to member-function can be formed only by saying
3577           &X::mf.  */
3578       if (!flag_ms_extensions && TREE_CODE (TREE_TYPE (xarg)) == METHOD_TYPE
3579           && (TREE_CODE (xarg) != OFFSET_REF || !PTRMEM_OK_P (xarg)))
3580         {
3581           if (TREE_CODE (xarg) != OFFSET_REF)
3582             {
3583               error ("invalid use of '%E' to form a pointer-to-member-function.  Use a qualified-id.",
3584                      xarg);
3585               return error_mark_node;
3586             }
3587           else
3588             {
3589               error ("parenthesis around '%E' cannot be used to form a pointer-to-member-function",
3590                      xarg);
3591               PTRMEM_OK_P (xarg) = 1;
3592             }
3593         }
3594       
3595       if (TREE_CODE (xarg) == OFFSET_REF)
3596         {
3597           ptrmem = PTRMEM_OK_P (xarg);
3598           
3599           if (!ptrmem && !flag_ms_extensions
3600               && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE)
3601             {
3602               /* A single non-static member, make sure we don't allow a
3603                  pointer-to-member.  */
3604               xarg = build (OFFSET_REF, TREE_TYPE (xarg),
3605                             TREE_OPERAND (xarg, 0),
3606                             ovl_cons (TREE_OPERAND (xarg, 1), NULL_TREE));
3607               PTRMEM_OK_P (xarg) = ptrmem;
3608             }         
3609         }
3610       else if (TREE_CODE (xarg) == TARGET_EXPR)
3611         warning ("taking address of temporary");
3612       exp = build_unary_op (ADDR_EXPR, xarg, 0);
3613     }
3614
3615   if (processing_template_decl && exp != error_mark_node)
3616     exp = build_min_non_dep (code, exp, orig_expr,
3617                              /*For {PRE,POST}{INC,DEC}REMENT_EXPR*/NULL_TREE);
3618   if (TREE_CODE (exp) == ADDR_EXPR)
3619     PTRMEM_OK_P (exp) = ptrmem;
3620   return exp;
3621 }
3622
3623 /* Like c_common_truthvalue_conversion, but handle pointer-to-member
3624    constants, where a null value is represented by an INTEGER_CST of
3625    -1.  */
3626
3627 tree
3628 cp_truthvalue_conversion (tree expr)
3629 {
3630   tree type = TREE_TYPE (expr);
3631   if (TYPE_PTRMEM_P (type))
3632     return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
3633   else
3634     return c_common_truthvalue_conversion (expr);
3635 }
3636
3637 /* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR.  */
3638    
3639 tree
3640 condition_conversion (tree expr)
3641 {
3642   tree t;
3643   if (processing_template_decl)
3644     return expr;
3645   t = perform_implicit_conversion (boolean_type_node, expr);
3646   t = fold (build1 (CLEANUP_POINT_EXPR, boolean_type_node, t));
3647   return t;
3648 }
3649                 
3650 /* Return an ADDR_EXPR giving the address of T.  This function
3651    attempts no optimizations or simplifications; it is a low-level
3652    primitive.  */
3653
3654 tree
3655 build_address (tree t)
3656 {
3657   tree addr;
3658
3659   if (error_operand_p (t) || !cxx_mark_addressable (t))
3660     return error_mark_node;
3661
3662   addr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (t)), t);
3663   if (staticp (t))
3664     TREE_CONSTANT (addr) = 1;
3665
3666   return addr;
3667 }
3668
3669 /* Return a NOP_EXPR converting EXPR to TYPE.  */
3670
3671 tree
3672 build_nop (tree type, tree expr)
3673 {
3674   tree nop;
3675
3676   if (type == error_mark_node || error_operand_p (expr))
3677     return expr;
3678     
3679   nop = build1 (NOP_EXPR, type, expr);
3680   if (TREE_CONSTANT (expr))
3681     TREE_CONSTANT (nop) = 1;
3682   
3683   return nop;
3684 }
3685
3686 /* C++: Must handle pointers to members.
3687
3688    Perhaps type instantiation should be extended to handle conversion
3689    from aggregates to types we don't yet know we want?  (Or are those
3690    cases typically errors which should be reported?)
3691
3692    NOCONVERT nonzero suppresses the default promotions
3693    (such as from short to int).  */
3694
3695 tree
3696 build_unary_op (enum tree_code code, tree xarg, int noconvert)
3697 {
3698   /* No default_conversion here.  It causes trouble for ADDR_EXPR.  */
3699   tree arg = xarg;
3700   tree argtype = 0;
3701   const char *errstring = NULL;
3702   tree val;
3703
3704   if (arg == error_mark_node)
3705     return error_mark_node;
3706
3707   switch (code)
3708     {
3709     case CONVERT_EXPR:
3710       /* This is used for unary plus, because a CONVERT_EXPR
3711          is enough to prevent anybody from looking inside for
3712          associativity, but won't generate any code.  */
3713       if (!(arg = build_expr_type_conversion
3714             (WANT_ARITH | WANT_ENUM | WANT_POINTER, arg, true)))
3715         errstring = "wrong type argument to unary plus";
3716       else
3717         {
3718           if (!noconvert)
3719            arg = default_conversion (arg);
3720           arg = build1 (NON_LVALUE_EXPR, TREE_TYPE (arg), arg);
3721           TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
3722         }
3723       break;
3724
3725     case NEGATE_EXPR:
3726       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
3727         errstring = "wrong type argument to unary minus";
3728       else if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
3729         arg = perform_integral_promotions (arg);
3730       break;
3731
3732     case BIT_NOT_EXPR:
3733       if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
3734         {
3735           code = CONJ_EXPR;
3736           if (!noconvert)
3737             arg = default_conversion (arg);
3738         }
3739       else if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM,
3740                                                    arg, true)))
3741         errstring = "wrong type argument to bit-complement";
3742       else if (!noconvert)
3743         arg = perform_integral_promotions (arg);
3744       break;
3745
3746     case ABS_EXPR:
3747       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
3748         errstring = "wrong type argument to abs";
3749       else if (!noconvert)
3750         arg = default_conversion (arg);
3751       break;
3752
3753     case CONJ_EXPR:
3754       /* Conjugating a real value is a no-op, but allow it anyway.  */
3755       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
3756         errstring = "wrong type argument to conjugation";
3757       else if (!noconvert)
3758         arg = default_conversion (arg);
3759       break;
3760
3761     case TRUTH_NOT_EXPR:
3762       arg = perform_implicit_conversion (boolean_type_node, arg);
3763       val = invert_truthvalue (arg);
3764       if (arg != error_mark_node)
3765         return val;
3766       errstring = "in argument to unary !";
3767       break;
3768
3769     case NOP_EXPR:
3770       break;
3771       
3772     case REALPART_EXPR:
3773       if (TREE_CODE (arg) == COMPLEX_CST)
3774         return TREE_REALPART (arg);
3775       else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
3776         return fold (build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
3777       else
3778         return arg;
3779
3780     case IMAGPART_EXPR:
3781       if (TREE_CODE (arg) == COMPLEX_CST)
3782         return TREE_IMAGPART (arg);
3783       else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
3784         return fold (build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
3785       else
3786         return cp_convert (TREE_TYPE (arg), integer_zero_node);
3787       
3788     case PREINCREMENT_EXPR:
3789     case POSTINCREMENT_EXPR:
3790     case PREDECREMENT_EXPR:
3791     case POSTDECREMENT_EXPR:
3792       /* Handle complex lvalues (when permitted)
3793          by reduction to simpler cases.  */
3794
3795       val = unary_complex_lvalue (code, arg);
3796       if (val != 0)
3797         return val;
3798
3799       /* Increment or decrement the real part of the value,
3800          and don't change the imaginary part.  */
3801       if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
3802         {
3803           tree real, imag;
3804
3805           arg = stabilize_reference (arg);
3806           real = build_unary_op (REALPART_EXPR, arg, 1);
3807           imag = build_unary_op (IMAGPART_EXPR, arg, 1);
3808           return build (COMPLEX_EXPR, TREE_TYPE (arg),
3809                         build_unary_op (code, real, 1), imag);
3810         }
3811
3812       /* Report invalid types.  */
3813
3814       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_POINTER,
3815                                               arg, true)))
3816         {
3817           if (code == PREINCREMENT_EXPR)
3818             errstring ="no pre-increment operator for type";
3819           else if (code == POSTINCREMENT_EXPR)
3820             errstring ="no post-increment operator for type";
3821           else if (code == PREDECREMENT_EXPR)
3822             errstring ="no pre-decrement operator for type";
3823           else
3824             errstring ="no post-decrement operator for type";
3825           break;
3826         }
3827
3828       /* Report something read-only.  */
3829
3830       if (CP_TYPE_CONST_P (TREE_TYPE (arg))
3831           || TREE_READONLY (arg))
3832         readonly_error (arg, ((code == PREINCREMENT_EXPR
3833                                || code == POSTINCREMENT_EXPR)
3834                               ? "increment" : "decrement"),
3835                         0);
3836
3837       {
3838         tree inc;
3839         tree result_type = TREE_TYPE (arg);
3840
3841         arg = get_unwidened (arg, 0);
3842         argtype = TREE_TYPE (arg);
3843
3844         /* ARM $5.2.5 last annotation says this should be forbidden.  */
3845         if (TREE_CODE (argtype) == ENUMERAL_TYPE)
3846           pedwarn ("ISO C++ forbids %sing an enum",
3847                    (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
3848                    ? "increment" : "decrement");
3849             
3850         /* Compute the increment.  */
3851
3852         if (TREE_CODE (argtype) == POINTER_TYPE)
3853           {
3854             tree type = complete_type (TREE_TYPE (argtype));
3855             
3856             if (!COMPLETE_OR_VOID_TYPE_P (type))
3857               error ("cannot %s a pointer to incomplete type `%T'",
3858                         ((code == PREINCREMENT_EXPR
3859                           || code == POSTINCREMENT_EXPR)
3860                          ? "increment" : "decrement"), TREE_TYPE (argtype));
3861             else if ((pedantic || warn_pointer_arith)
3862                      && !TYPE_PTROB_P (argtype))
3863               pedwarn ("ISO C++ forbids %sing a pointer of type `%T'",
3864                           ((code == PREINCREMENT_EXPR
3865                             || code == POSTINCREMENT_EXPR)
3866                            ? "increment" : "decrement"), argtype);
3867             inc = cxx_sizeof_nowarn (TREE_TYPE (argtype));
3868           }
3869         else
3870           inc = integer_one_node;
3871
3872         inc = cp_convert (argtype, inc);
3873
3874         /* Handle incrementing a cast-expression.  */
3875
3876         switch (TREE_CODE (arg))
3877           {
3878           case NOP_EXPR:
3879           case CONVERT_EXPR:
3880           case FLOAT_EXPR:
3881           case FIX_TRUNC_EXPR:
3882           case FIX_FLOOR_EXPR:
3883           case FIX_ROUND_EXPR:
3884           case FIX_CEIL_EXPR:
3885             {
3886               tree incremented, modify, value, compound;
3887               if (! lvalue_p (arg) && pedantic)
3888                 pedwarn ("cast to non-reference type used as lvalue");
3889               arg = stabilize_reference (arg);
3890               if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
3891                 value = arg;
3892               else
3893                 value = save_expr (arg);
3894               incremented = build (((code == PREINCREMENT_EXPR
3895                                      || code == POSTINCREMENT_EXPR)
3896                                     ? PLUS_EXPR : MINUS_EXPR),
3897                                    argtype, value, inc);
3898
3899               modify = build_modify_expr (arg, NOP_EXPR, incremented);
3900               compound = build (COMPOUND_EXPR, TREE_TYPE (arg), modify, value);
3901
3902               /* Eliminate warning about unused result of + or -.  */
3903               TREE_NO_UNUSED_WARNING (compound) = 1;
3904               return compound;
3905             }
3906
3907           default:
3908             break;
3909           }
3910
3911         /* Complain about anything else that is not a true lvalue.  */
3912         if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
3913                                     || code == POSTINCREMENT_EXPR)
3914                                    ? "increment" : "decrement")))
3915           return error_mark_node;
3916
3917         /* Forbid using -- on `bool'.  */
3918         if (TREE_TYPE (arg) == boolean_type_node)
3919           {
3920             if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
3921               {
3922                 error ("invalid use of `--' on bool variable `%D'", arg);
3923                 return error_mark_node;
3924               }
3925             val = boolean_increment (code, arg);
3926           }
3927         else
3928           val = build (code, TREE_TYPE (arg), arg, inc);
3929
3930         TREE_SIDE_EFFECTS (val) = 1;
3931         return cp_convert (result_type, val);
3932       }
3933
3934     case ADDR_EXPR:
3935       /* Note that this operation never does default_conversion
3936          regardless of NOCONVERT.  */
3937
3938       argtype = lvalue_type (arg);
3939
3940       if (TREE_CODE (arg) == OFFSET_REF)
3941         goto offset_ref;
3942
3943       if (TREE_CODE (argtype) == REFERENCE_TYPE)
3944         {
3945           arg = build1
3946             (CONVERT_EXPR,
3947              build_pointer_type (TREE_TYPE (argtype)), arg);
3948           TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
3949           return arg;
3950         }
3951       else if (pedantic && DECL_MAIN_P (arg))
3952         /* ARM $3.4 */
3953         pedwarn ("ISO C++ forbids taking address of function `::main'");
3954
3955       /* Let &* cancel out to simplify resulting code.  */
3956       if (TREE_CODE (arg) == INDIRECT_REF)
3957         {
3958           /* We don't need to have `current_class_ptr' wrapped in a
3959              NON_LVALUE_EXPR node.  */
3960           if (arg == current_class_ref)
3961             return current_class_ptr;
3962
3963           arg = TREE_OPERAND (arg, 0);
3964           if (TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE)
3965             {
3966               arg = build1
3967                 (CONVERT_EXPR,
3968                  build_pointer_type (TREE_TYPE (TREE_TYPE (arg))), arg);
3969               TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
3970             }
3971           else if (lvalue_p (arg))
3972             /* Don't let this be an lvalue.  */
3973             return non_lvalue (arg);
3974           return arg;
3975         }
3976
3977       /* For &x[y], return x+y.  But, in a template, ARG may be an
3978          ARRAY_REF representing a non-dependent expression.  In that
3979          case, there may be an overloaded "operator []" that will be
3980          chosen at instantiation time; we must not try to optimize
3981          here.  */
3982       if (TREE_CODE (arg) == ARRAY_REF && !processing_template_decl)
3983         {
3984           if (!cxx_mark_addressable (TREE_OPERAND (arg, 0)))
3985             return error_mark_node;
3986           return cp_build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0),
3987                                      TREE_OPERAND (arg, 1));
3988         }
3989
3990       /* Uninstantiated types are all functions.  Taking the
3991          address of a function is a no-op, so just return the
3992          argument.  */
3993
3994       if (TREE_CODE (arg) == IDENTIFIER_NODE
3995           && IDENTIFIER_OPNAME_P (arg))
3996         {
3997           abort ();
3998           /* We don't know the type yet, so just work around the problem.
3999              We know that this will resolve to an lvalue.  */
4000           return build1 (ADDR_EXPR, unknown_type_node, arg);
4001         }
4002
4003       if (TREE_CODE (arg) == COMPONENT_REF && type_unknown_p (arg)
4004           && !really_overloaded_fn (TREE_OPERAND (arg, 1)))
4005         {
4006           /* They're trying to take the address of a unique non-static
4007              member function.  This is ill-formed (except in MS-land),
4008              but let's try to DTRT.
4009              Note: We only handle unique functions here because we don't
4010              want to complain if there's a static overload; non-unique
4011              cases will be handled by instantiate_type.  But we need to
4012              handle this case here to allow casts on the resulting PMF.
4013              We could defer this in non-MS mode, but it's easier to give
4014              a useful error here.  */
4015
4016           /* Inside constant member functions, the `this' pointer
4017              contains an extra const qualifier.  TYPE_MAIN_VARIANT
4018              is used here to remove this const from the diagnostics
4019              and the created OFFSET_REF.  */
4020           tree base = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg, 0)));
4021           tree name = DECL_NAME (get_first_fn (TREE_OPERAND (arg, 1)));
4022
4023           if (! flag_ms_extensions)
4024             {
4025               if (current_class_type
4026                   && TREE_OPERAND (arg, 0) == current_class_ref)
4027                 /* An expression like &memfn.  */
4028                 pedwarn ("ISO C++ forbids taking the address of an unqualified"
4029                          " or parenthesized non-static member function to form"
4030                          " a pointer to member function.  Say `&%T::%D'",
4031                          base, name);
4032               else
4033                 pedwarn ("ISO C++ forbids taking the address of a bound member"
4034                          " function to form a pointer to member function."
4035                          "  Say `&%T::%D'",
4036                          base, name);
4037             }
4038           arg = build_offset_ref (base, name, /*address_p=*/true);
4039         }
4040
4041     offset_ref:        
4042       if (type_unknown_p (arg))
4043         return build1 (ADDR_EXPR, unknown_type_node, arg);
4044         
4045       /* Handle complex lvalues (when permitted)
4046          by reduction to simpler cases.  */
4047       val = unary_complex_lvalue (code, arg);
4048       if (val != 0)
4049         return val;
4050
4051       switch (TREE_CODE (arg))
4052         {
4053         case NOP_EXPR:
4054         case CONVERT_EXPR:
4055         case FLOAT_EXPR:
4056         case FIX_TRUNC_EXPR:
4057         case FIX_FLOOR_EXPR:
4058         case FIX_ROUND_EXPR:
4059         case FIX_CEIL_EXPR:
4060           if (! lvalue_p (arg) && pedantic)
4061             pedwarn ("ISO C++ forbids taking the address of a cast to a non-lvalue expression");
4062           break;
4063
4064         case OVERLOAD:
4065           arg = OVL_CURRENT (arg);
4066           break;
4067
4068         default:
4069           break;
4070         }
4071
4072       /* Allow the address of a constructor if all the elements
4073          are constant.  */
4074       if (TREE_CODE (arg) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (arg)
4075           && TREE_CONSTANT (arg))
4076         ;
4077       /* Anything not already handled and not a true memory reference
4078          is an error.  */
4079       else if (TREE_CODE (argtype) != FUNCTION_TYPE
4080                && TREE_CODE (argtype) != METHOD_TYPE
4081                && TREE_CODE (arg) != OFFSET_REF
4082                && !lvalue_or_else (arg, "unary `&'"))
4083         return error_mark_node;
4084
4085       if (argtype != error_mark_node)
4086         argtype = build_pointer_type (argtype);
4087
4088       {
4089         tree addr;
4090
4091         if (TREE_CODE (arg) != COMPONENT_REF
4092             /* Inside a template, we are processing a non-dependent
4093                expression so we can just form an ADDR_EXPR with the
4094                correct type.  */
4095             || processing_template_decl)
4096           {
4097             addr = build_address (arg);
4098             if (TREE_CODE (arg) == OFFSET_REF)
4099               PTRMEM_OK_P (addr) = PTRMEM_OK_P (arg);
4100           }
4101         else if (TREE_CODE (TREE_OPERAND (arg, 1)) == BASELINK)
4102           {
4103             tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1));
4104
4105             /* We can only get here with a single static member
4106                function.  */
4107             my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL
4108                                 && DECL_STATIC_FUNCTION_P (fn),
4109                                 20030906);
4110             mark_used (fn);
4111             addr = build_address (fn);
4112             if (TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
4113               /* Do not lose object's side effects.  */
4114               addr = build (COMPOUND_EXPR, TREE_TYPE (addr),
4115                             TREE_OPERAND (arg, 0), addr);
4116           }
4117         else if (DECL_C_BIT_FIELD (TREE_OPERAND (arg, 1)))
4118           {
4119             error ("attempt to take address of bit-field structure member `%D'",
4120                    TREE_OPERAND (arg, 1));
4121             return error_mark_node;
4122           }
4123         else
4124           {
4125             /* Unfortunately we cannot just build an address
4126                expression here, because we would not handle
4127                address-constant-expressions or offsetof correctly.  */
4128             tree field = TREE_OPERAND (arg, 1);
4129             tree rval = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0);
4130             tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (rval)),
4131                                       decl_type_context (field),
4132                                       ba_check, NULL);
4133             
4134             rval = build_base_path (PLUS_EXPR, rval, binfo, 1);
4135             rval = build_nop (argtype, rval);
4136             addr = fold (build (PLUS_EXPR, argtype, rval,
4137                                 cp_convert (argtype, byte_position (field))));
4138           }
4139
4140         if (TREE_CODE (argtype) == POINTER_TYPE
4141             && TREE_CODE (TREE_TYPE (argtype)) == METHOD_TYPE)
4142           {
4143             build_ptrmemfunc_type (argtype);
4144             addr = build_ptrmemfunc (argtype, addr, 0);
4145           }
4146
4147         return addr;
4148       }
4149
4150     default:
4151       break;
4152     }
4153
4154   if (!errstring)
4155     {
4156       if (argtype == 0)
4157         argtype = TREE_TYPE (arg);
4158       return fold (build1 (code, argtype, arg));
4159     }
4160
4161   error ("%s", errstring);
4162   return error_mark_node;
4163 }
4164
4165 /* Apply unary lvalue-demanding operator CODE to the expression ARG
4166    for certain kinds of expressions which are not really lvalues
4167    but which we can accept as lvalues.
4168
4169    If ARG is not a kind of expression we can handle, return
4170    NULL_TREE.  */
4171    
4172 tree
4173 unary_complex_lvalue (enum tree_code code, tree arg)
4174 {
4175   /* Handle (a, b) used as an "lvalue".  */
4176   if (TREE_CODE (arg) == COMPOUND_EXPR)
4177     {
4178       tree real_result = build_unary_op (code, TREE_OPERAND (arg, 1), 0);
4179       return build (COMPOUND_EXPR, TREE_TYPE (real_result),
4180                     TREE_OPERAND (arg, 0), real_result);
4181     }
4182
4183   /* Handle (a ? b : c) used as an "lvalue".  */
4184   if (TREE_CODE (arg) == COND_EXPR
4185       || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR)
4186     return rationalize_conditional_expr (code, arg);
4187
4188   /* Handle (a = b), (++a), and (--a) used as an "lvalue".  */
4189   if (TREE_CODE (arg) == MODIFY_EXPR
4190       || TREE_CODE (arg) == PREINCREMENT_EXPR
4191       || TREE_CODE (arg) == PREDECREMENT_EXPR)
4192     {
4193       tree lvalue = TREE_OPERAND (arg, 0);
4194       if (TREE_SIDE_EFFECTS (lvalue))
4195         {
4196           lvalue = stabilize_reference (lvalue);
4197           arg = build (TREE_CODE (arg), TREE_TYPE (arg),
4198                        lvalue, TREE_OPERAND (arg, 1));
4199         }
4200       return unary_complex_lvalue
4201         (code, build (COMPOUND_EXPR, TREE_TYPE (lvalue), arg, lvalue));
4202     }
4203
4204   if (code != ADDR_EXPR)
4205     return 0;
4206
4207   /* Handle (a = b) used as an "lvalue" for `&'.  */
4208   if (TREE_CODE (arg) == MODIFY_EXPR
4209       || TREE_CODE (arg) == INIT_EXPR)
4210     {
4211       tree real_result = build_unary_op (code, TREE_OPERAND (arg, 0), 0);
4212       arg = build (COMPOUND_EXPR, TREE_TYPE (real_result), arg, real_result);
4213       TREE_NO_UNUSED_WARNING (arg) = 1;
4214       return arg;
4215     }
4216
4217   if (TREE_CODE (TREE_TYPE (arg)) == FUNCTION_TYPE
4218       || TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
4219       || TREE_CODE (arg) == OFFSET_REF)
4220     {
4221       tree t;
4222
4223       my_friendly_assert (TREE_CODE (arg) != SCOPE_REF, 313);
4224
4225       if (TREE_CODE (arg) != OFFSET_REF)
4226         return 0;
4227
4228       t = TREE_OPERAND (arg, 1);
4229
4230       /* Check all this code for right semantics.  */   
4231       if (TREE_CODE (t) == FUNCTION_DECL)
4232         {
4233           if (DECL_DESTRUCTOR_P (t))
4234             error ("taking address of destructor");
4235           return build_unary_op (ADDR_EXPR, t, 0);
4236         }
4237       if (TREE_CODE (t) == VAR_DECL)
4238         return build_unary_op (ADDR_EXPR, t, 0);
4239       else
4240         {
4241           tree type;
4242
4243           if (TREE_OPERAND (arg, 0)
4244               && ! is_dummy_object (TREE_OPERAND (arg, 0))
4245               && TREE_CODE (t) != FIELD_DECL)
4246             {
4247               error ("taking address of bound pointer-to-member expression");
4248               return error_mark_node;
4249             }
4250           if (!PTRMEM_OK_P (arg))
4251             return build_unary_op (code, arg, 0);
4252           
4253           if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
4254             {
4255               error ("cannot create pointer to reference member `%D'", t);
4256               return error_mark_node;
4257             }
4258
4259           type = build_ptrmem_type (context_for_name_lookup (t), 
4260                                     TREE_TYPE (t));
4261           t = make_ptrmem_cst (type, TREE_OPERAND (arg, 1));
4262           return t;
4263         }
4264     }
4265
4266   
4267   /* We permit compiler to make function calls returning
4268      objects of aggregate type look like lvalues.  */
4269   {
4270     tree targ = arg;
4271
4272     if (TREE_CODE (targ) == SAVE_EXPR)
4273       targ = TREE_OPERAND (targ, 0);
4274
4275     if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (TREE_TYPE (targ)))
4276       {
4277         if (TREE_CODE (arg) == SAVE_EXPR)
4278           targ = arg;
4279         else
4280           targ = build_cplus_new (TREE_TYPE (arg), arg);
4281         return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), targ);
4282       }
4283
4284     if (TREE_CODE (arg) == SAVE_EXPR && TREE_CODE (targ) == INDIRECT_REF)
4285       return build (SAVE_EXPR, build_pointer_type (TREE_TYPE (arg)),
4286                      TREE_OPERAND (targ, 0), current_function_decl, NULL);
4287   }
4288
4289   /* Don't let anything else be handled specially.  */
4290   return 0;
4291 }
4292 \f
4293 /* Mark EXP saying that we need to be able to take the
4294    address of it; it should not be allocated in a register.
4295    Value is true if successful.
4296
4297    C++: we do not allow `current_class_ptr' to be addressable.  */
4298
4299 bool
4300 cxx_mark_addressable (tree exp)
4301 {
4302   tree x = exp;
4303
4304   while (1)
4305     switch (TREE_CODE (x))
4306       {
4307       case ADDR_EXPR:
4308       case COMPONENT_REF:
4309       case ARRAY_REF:
4310       case REALPART_EXPR:
4311       case IMAGPART_EXPR:
4312         x = TREE_OPERAND (x, 0);
4313         break;
4314
4315       case PARM_DECL:
4316         if (x == current_class_ptr)
4317           {
4318             error ("cannot take the address of `this', which is an rvalue expression");
4319             TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later.  */
4320             return true;
4321           }
4322         /* Fall through.  */
4323
4324       case VAR_DECL:
4325         /* Caller should not be trying to mark initialized
4326            constant fields addressable.  */
4327         my_friendly_assert (DECL_LANG_SPECIFIC (x) == 0
4328                             || DECL_IN_AGGR_P (x) == 0
4329                             || TREE_STATIC (x)
4330                             || DECL_EXTERNAL (x), 314);
4331         /* Fall through.  */
4332
4333       case CONST_DECL:
4334       case RESULT_DECL:
4335         if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
4336             && !DECL_ARTIFICIAL (x) && extra_warnings)
4337           warning ("address requested for `%D', which is declared `register'",
4338                       x);
4339         TREE_ADDRESSABLE (x) = 1;
4340         put_var_into_stack (x, /*rescan=*/true);
4341         return true;
4342
4343       case FUNCTION_DECL:
4344         TREE_ADDRESSABLE (x) = 1;
4345         TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
4346         return true;
4347
4348       case CONSTRUCTOR:
4349         TREE_ADDRESSABLE (x) = 1;
4350         return true;
4351
4352       case TARGET_EXPR:
4353         TREE_ADDRESSABLE (x) = 1;
4354         cxx_mark_addressable (TREE_OPERAND (x, 0));
4355         return true;
4356
4357       default:
4358         return true;
4359     }
4360 }
4361 \f
4362 /* Build and return a conditional expression IFEXP ? OP1 : OP2.  */
4363
4364 tree
4365 build_x_conditional_expr (tree ifexp, tree op1, tree op2)
4366 {
4367   tree orig_ifexp = ifexp;
4368   tree orig_op1 = op1;
4369   tree orig_op2 = op2;
4370   tree expr;
4371
4372   if (processing_template_decl)
4373     {
4374       /* The standard says that the expression is type-dependent if
4375          IFEXP is type-dependent, even though the eventual type of the
4376          expression doesn't dependent on IFEXP.  */
4377       if (type_dependent_expression_p (ifexp)
4378           /* As a GNU extension, the middle operand may be omitted.  */
4379           || (op1 && type_dependent_expression_p (op1))
4380           || type_dependent_expression_p (op2))
4381         return build_min_nt (COND_EXPR, ifexp, op1, op2);
4382       ifexp = build_non_dependent_expr (ifexp);
4383       if (op1)
4384         op1 = build_non_dependent_expr (op1);
4385       op2 = build_non_dependent_expr (op2);
4386     }
4387
4388   expr = build_conditional_expr (ifexp, op1, op2);
4389   if (processing_template_decl && expr != error_mark_node)
4390     return build_min_non_dep (COND_EXPR, expr, 
4391                               orig_ifexp, orig_op1, orig_op2);
4392   return expr;
4393 }
4394 \f
4395 /* Given a list of expressions, return a compound expression
4396    that performs them all and returns the value of the last of them.  */
4397
4398 tree build_x_compound_expr_from_list (tree list, const char *msg)
4399 {
4400   tree expr = TREE_VALUE (list);
4401   
4402   if (TREE_CHAIN (list))
4403     {
4404       if (msg)
4405         pedwarn ("%s expression list treated as compound expression", msg);
4406
4407       for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
4408         expr = build_x_compound_expr (expr, TREE_VALUE (list));
4409     }
4410   
4411   return expr;
4412 }
4413
4414 /* Handle overloading of the ',' operator when needed.  */
4415
4416 tree
4417 build_x_compound_expr (tree op1, tree op2)
4418 {
4419   tree result;
4420   tree orig_op1 = op1;
4421   tree orig_op2 = op2;
4422
4423   if (processing_template_decl)
4424     {
4425       if (type_dependent_expression_p (op1)
4426           || type_dependent_expression_p (op2))
4427         return build_min_nt (COMPOUND_EXPR, op1, op2);
4428       op1 = build_non_dependent_expr (op1);
4429       op2 = build_non_dependent_expr (op2);
4430     }
4431
4432   result = build_new_op (COMPOUND_EXPR, LOOKUP_NORMAL, op1, op2, NULL_TREE,
4433                          /*overloaded_p=*/NULL);
4434   if (!result)
4435     result = build_compound_expr (op1, op2);
4436
4437   if (processing_template_decl && result != error_mark_node)
4438     return build_min_non_dep (COMPOUND_EXPR, result, orig_op1, orig_op2);
4439   
4440   return result;
4441 }
4442
4443 /* Build a compound expression.  */
4444
4445 tree
4446 build_compound_expr (tree lhs, tree rhs)
4447 {
4448   lhs = decl_constant_value (lhs);
4449   lhs = convert_to_void (lhs, "left-hand operand of comma");
4450   
4451   if (lhs == error_mark_node || rhs == error_mark_node)
4452     return error_mark_node;
4453   
4454   if (TREE_CODE (rhs) == TARGET_EXPR)
4455     {
4456       /* If the rhs is a TARGET_EXPR, then build the compound
4457          expression inside the target_expr's initializer. This
4458          helps the compiler to eliminate unnecessary temporaries.  */
4459       tree init = TREE_OPERAND (rhs, 1);
4460       
4461       init = build (COMPOUND_EXPR, TREE_TYPE (init), lhs, init);
4462       TREE_OPERAND (rhs, 1) = init;
4463       
4464       return rhs;
4465     }
4466   
4467   return build (COMPOUND_EXPR, TREE_TYPE (rhs), lhs, rhs);
4468 }
4469
4470 /* Issue an error message if casting from SRC_TYPE to DEST_TYPE casts
4471    away constness.  DESCRIPTION explains what operation is taking
4472    place.  */
4473
4474 static void
4475 check_for_casting_away_constness (tree src_type, tree dest_type,
4476                                   const char *description)
4477 {
4478   if (casts_away_constness (src_type, dest_type))
4479     error ("%s from type `%T' to type `%T' casts away constness",
4480            description, src_type, dest_type);
4481 }
4482
4483 /* Return an expression representing static_cast<TYPE>(EXPR).  */
4484
4485 tree
4486 build_static_cast (tree type, tree expr)
4487 {
4488   tree intype;
4489   tree result;
4490
4491   if (type == error_mark_node || expr == error_mark_node)
4492     return error_mark_node;
4493
4494   if (processing_template_decl)
4495     {
4496       expr = build_min (STATIC_CAST_EXPR, type, expr);
4497       /* We don't know if it will or will not have side effects.  */
4498       TREE_SIDE_EFFECTS (expr) = 1;
4499       return expr;
4500     }
4501
4502   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4503      Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
4504   if (TREE_CODE (type) != REFERENCE_TYPE
4505       && TREE_CODE (expr) == NOP_EXPR
4506       && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
4507     expr = TREE_OPERAND (expr, 0);
4508
4509   intype = TREE_TYPE (expr);
4510
4511   /* [expr.static.cast]
4512
4513      An lvalue of type "cv1 B", where B is a class type, can be cast
4514      to type "reference to cv2 D", where D is a class derived (clause
4515      _class.derived_) from B, if a valid standard conversion from
4516      "pointer to D" to "pointer to B" exists (_conv.ptr_), cv2 is the
4517      same cv-qualification as, or greater cv-qualification than, cv1,
4518      and B is not a virtual base class of D.  */
4519   /* We check this case before checking the validity of "TYPE t =
4520      EXPR;" below because for this case:
4521
4522        struct B {};
4523        struct D : public B { D(const B&); };
4524        extern B& b;
4525        void f() { static_cast<const D&>(b); }
4526
4527      we want to avoid constructing a new D.  The standard is not
4528      completely clear about this issue, but our interpretation is
4529      consistent with other compilers.  */
4530   if (TREE_CODE (type) == REFERENCE_TYPE
4531       && CLASS_TYPE_P (TREE_TYPE (type))
4532       && CLASS_TYPE_P (intype)
4533       && real_lvalue_p (expr)
4534       && DERIVED_FROM_P (intype, TREE_TYPE (type))
4535       && can_convert (build_pointer_type (TYPE_MAIN_VARIANT (intype)),
4536                       build_pointer_type (TYPE_MAIN_VARIANT 
4537                                           (TREE_TYPE (type))))
4538       && at_least_as_qualified_p (TREE_TYPE (type), intype))
4539     {
4540       /* There is a standard conversion from "D*" to "B*" even if "B"
4541          is ambiguous or inaccessible.  Therefore, we ask lookup_base
4542          to check these conditions.  */
4543       tree base = lookup_base (TREE_TYPE (type), intype, ba_check, NULL);
4544
4545       /* Convert from "B*" to "D*".  This function will check that "B"
4546          is not a virtual base of "D".  */
4547       expr = build_base_path (MINUS_EXPR, build_address (expr), 
4548                               base, /*nonnull=*/false);
4549       /* Convert the pointer to a reference -- but then remember that
4550          there are no expressions with reference type in C++.  */
4551       return convert_from_reference (build_nop (type, expr));
4552     }
4553
4554   /* [expr.static.cast]
4555
4556      An expression e can be explicitly converted to a type T using a
4557      static_cast of the form static_cast<T>(e) if the declaration T
4558      t(e);" is well-formed, for some invented temporary variable
4559      t.  */
4560   result = perform_direct_initialization_if_possible (type, expr);
4561   if (result)
4562     {
4563       result = convert_from_reference (result);
4564       /* [expr.static.cast]
4565
4566          If T is a reference type, the result is an lvalue; otherwise,
4567          the result is an rvalue.  */
4568       if (TREE_CODE (type) != REFERENCE_TYPE
4569           && real_lvalue_p (result))
4570         result = build1 (NON_LVALUE_EXPR, TREE_TYPE (result), result);
4571       return result;
4572     }
4573   
4574   /* [expr.static.cast]
4575
4576      Any expression can be explicitly converted to type cv void.  */
4577   if (TREE_CODE (type) == VOID_TYPE)
4578     return convert_to_void (expr, /*implicit=*/NULL);
4579
4580   /* [expr.static.cast]
4581
4582      The inverse of any standard conversion sequence (clause _conv_),
4583      other than the lvalue-to-rvalue (_conv.lval_), array-to-pointer
4584      (_conv.array_), function-to-pointer (_conv.func_), and boolean
4585      (_conv.bool_) conversions, can be performed explicitly using
4586      static_cast subject to the restriction that the explicit
4587      conversion does not cast away constness (_expr.const.cast_), and
4588      the following additional rules for specific cases:  */
4589   /* For reference, the conversions not excluded are: integral
4590      promotions, floating point promotion, integral conversions,
4591      floating point conversions, floating-integral conversions,
4592      pointer conversions, and pointer to member conversions.  */
4593   if ((ARITHMETIC_TYPE_P (type) && ARITHMETIC_TYPE_P (intype))
4594       /* DR 128
4595
4596          A value of integral _or enumeration_ type can be explicitly
4597          converted to an enumeration type.  */
4598       || (INTEGRAL_OR_ENUMERATION_TYPE_P (type)
4599           && INTEGRAL_OR_ENUMERATION_TYPE_P (intype)))
4600     /* Really, build_c_cast should defer to this function rather
4601        than the other way around.  */
4602     return build_c_cast (type, expr);
4603   
4604   if (TYPE_PTR_P (type) && TYPE_PTR_P (intype)
4605       && CLASS_TYPE_P (TREE_TYPE (type))
4606       && CLASS_TYPE_P (TREE_TYPE (intype))
4607       && can_convert (build_pointer_type (TYPE_MAIN_VARIANT 
4608                                           (TREE_TYPE (intype))), 
4609                       build_pointer_type (TYPE_MAIN_VARIANT 
4610                                           (TREE_TYPE (type)))))
4611     {
4612       tree base;
4613
4614       check_for_casting_away_constness (intype, type, "static_cast");
4615       base = lookup_base (TREE_TYPE (type), TREE_TYPE (intype), ba_check, 
4616                           NULL);
4617       return build_base_path (MINUS_EXPR, expr, base, /*nonnull=*/false);
4618     }
4619   
4620   if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
4621       || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
4622     {
4623       tree c1;
4624       tree c2;
4625       tree t1;
4626       tree t2;
4627
4628       c1 = TYPE_PTRMEM_CLASS_TYPE (intype);
4629       c2 = TYPE_PTRMEM_CLASS_TYPE (type);
4630
4631       if (TYPE_PTRMEM_P (type))
4632         {
4633           t1 = (build_ptrmem_type 
4634                 (c1,
4635                  TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (intype))));
4636           t2 = (build_ptrmem_type 
4637                 (c2,
4638                  TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (type))));
4639         }
4640       else
4641         {
4642           t1 = intype;
4643           t2 = type;
4644         }
4645       if (can_convert (t1, t2))
4646         {
4647           check_for_casting_away_constness (intype, type, "static_cast");
4648           if (TYPE_PTRMEM_P (type))
4649             {
4650               tree delta;
4651
4652               if (TREE_CODE (expr) == PTRMEM_CST)
4653                 expr = cplus_expand_constant (expr);
4654               delta = get_delta_difference (c1, c2, /*force=*/1);
4655               if (!integer_zerop (delta))
4656                 expr = cp_build_binary_op (PLUS_EXPR, 
4657                                            build_nop (ptrdiff_type_node, expr),
4658                                            delta);
4659               return build_nop (type, expr);
4660             }
4661           else
4662             return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 
4663                                      /*force=*/1);
4664         }
4665     }
4666     
4667   /* [expr.static.cast]
4668
4669      An rvalue of type "pointer to cv void" can be explicitly
4670      converted to a pointer to object type.  A value of type pointer
4671      to object converted to "pointer to cv void" and back to the
4672      original pointer type will have its original value.  */
4673   if (TREE_CODE (intype) == POINTER_TYPE 
4674       && VOID_TYPE_P (TREE_TYPE (intype))
4675       && TYPE_PTROB_P (type))
4676     {
4677       check_for_casting_away_constness (intype, type, "static_cast");
4678       return build_nop (type, expr);
4679     }
4680
4681   error ("invalid static_cast from type `%T' to type `%T'", intype, type);
4682   return error_mark_node;
4683 }
4684
4685 tree
4686 build_reinterpret_cast (tree type, tree expr)
4687 {
4688   tree intype;
4689
4690   if (type == error_mark_node || expr == error_mark_node)
4691     return error_mark_node;
4692
4693   if (processing_template_decl)
4694     {
4695       tree t = build_min (REINTERPRET_CAST_EXPR, type, expr);
4696       
4697       if (!TREE_SIDE_EFFECTS (t)
4698           && type_dependent_expression_p (expr))
4699         /* There might turn out to be side effects inside expr.  */
4700         TREE_SIDE_EFFECTS (t) = 1;
4701       return t;
4702     }
4703
4704   if (TREE_CODE (type) != REFERENCE_TYPE)
4705     {
4706       expr = decay_conversion (expr);
4707
4708       /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4709          Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
4710       if (TREE_CODE (expr) == NOP_EXPR
4711           && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
4712         expr = TREE_OPERAND (expr, 0);
4713     }
4714
4715   intype = TREE_TYPE (expr);
4716
4717   if (TREE_CODE (type) == REFERENCE_TYPE)
4718     {
4719       if (! real_lvalue_p (expr))
4720         {
4721           error ("invalid reinterpret_cast of an rvalue expression of type `%T' to type `%T'", intype, type);
4722           return error_mark_node;
4723         }
4724       expr = build_unary_op (ADDR_EXPR, expr, 0);
4725       if (expr != error_mark_node)
4726         expr = build_reinterpret_cast
4727           (build_pointer_type (TREE_TYPE (type)), expr);
4728       if (expr != error_mark_node)
4729         expr = build_indirect_ref (expr, 0);
4730       return expr;
4731     }
4732   else if (same_type_ignoring_top_level_qualifiers_p (intype, type))
4733     return build_static_cast (type, expr);
4734
4735   if (TYPE_PTR_P (type) && (TREE_CODE (intype) == INTEGER_TYPE
4736                             || TREE_CODE (intype) == ENUMERAL_TYPE))
4737     /* OK */;
4738   else if (TREE_CODE (type) == INTEGER_TYPE && TYPE_PTR_P (intype))
4739     {
4740       if (TYPE_PRECISION (type) < TYPE_PRECISION (intype))
4741         pedwarn ("reinterpret_cast from `%T' to `%T' loses precision",
4742                     intype, type);
4743     }
4744   else if ((TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype))
4745            || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
4746     {
4747       expr = decl_constant_value (expr);
4748       return fold (build1 (NOP_EXPR, type, expr));
4749     }
4750   else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
4751            || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
4752     {
4753       check_for_casting_away_constness (intype, type, "reinterpret_cast");
4754       expr = decl_constant_value (expr);
4755       return fold (build1 (NOP_EXPR, type, expr));
4756     }
4757   else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
4758            || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type)))
4759     {
4760       pedwarn ("ISO C++ forbids casting between pointer-to-function and pointer-to-object");
4761       expr = decl_constant_value (expr);
4762       return fold (build1 (NOP_EXPR, type, expr));
4763     }
4764   else
4765     {
4766       error ("invalid reinterpret_cast from type `%T' to type `%T'",
4767                 intype, type);
4768       return error_mark_node;
4769     }
4770       
4771   return cp_convert (type, expr);
4772 }
4773
4774 tree
4775 build_const_cast (tree type, tree expr)
4776 {
4777   tree intype;
4778
4779   if (type == error_mark_node || expr == error_mark_node)
4780     return error_mark_node;
4781
4782   if (processing_template_decl)
4783     {
4784       tree t = build_min (CONST_CAST_EXPR, type, expr);
4785       
4786       if (!TREE_SIDE_EFFECTS (t)
4787           && type_dependent_expression_p (expr))
4788         /* There might turn out to be side effects inside expr.  */
4789         TREE_SIDE_EFFECTS (t) = 1;
4790       return t;
4791     }
4792
4793   if (!POINTER_TYPE_P (type) && !TYPE_PTRMEM_P (type))
4794     error ("invalid use of const_cast with type `%T', which is not a pointer, reference, nor a pointer-to-data-member type", type);
4795   else if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
4796     {
4797       error ("invalid use of const_cast with type `%T', which is a pointer or reference to a function type", type);
4798       return error_mark_node;
4799     }
4800
4801   if (TREE_CODE (type) != REFERENCE_TYPE)
4802     {
4803       expr = decay_conversion (expr);
4804
4805       /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4806          Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
4807       if (TREE_CODE (expr) == NOP_EXPR
4808           && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
4809         expr = TREE_OPERAND (expr, 0);
4810     }
4811
4812   intype = TREE_TYPE (expr);
4813   
4814   if (same_type_ignoring_top_level_qualifiers_p (intype, type))
4815     return build_static_cast (type, expr);
4816   else if (TREE_CODE (type) == REFERENCE_TYPE)
4817     {
4818       if (! real_lvalue_p (expr))
4819         {
4820           error ("invalid const_cast of an rvalue of type `%T' to type `%T'", intype, type);
4821           return error_mark_node;
4822         }
4823
4824       if (comp_ptr_ttypes_const (TREE_TYPE (type), intype))
4825         {
4826           expr = build_unary_op (ADDR_EXPR, expr, 0);
4827           expr = build1 (NOP_EXPR, type, expr);
4828           return convert_from_reference (expr);
4829         }
4830     }
4831   else if (((TREE_CODE (type) == POINTER_TYPE
4832              && TREE_CODE (intype) == POINTER_TYPE)
4833             || (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype)))
4834            && comp_ptr_ttypes_const (TREE_TYPE (type), TREE_TYPE (intype)))
4835     return cp_convert (type, expr);
4836
4837   error ("invalid const_cast from type `%T' to type `%T'", intype, type);
4838   return error_mark_node;
4839 }
4840
4841 /* Build an expression representing a cast to type TYPE of expression EXPR.
4842
4843    ALLOW_NONCONVERTING is true if we should allow non-converting constructors
4844    when doing the cast.  */
4845
4846 tree
4847 build_c_cast (tree type, tree expr)
4848 {
4849   tree value = expr;
4850   tree otype;
4851
4852   if (type == error_mark_node || expr == error_mark_node)
4853     return error_mark_node;
4854
4855   if (processing_template_decl)
4856     {
4857       tree t = build_min (CAST_EXPR, type,
4858                           tree_cons (NULL_TREE, value, NULL_TREE));
4859       /* We don't know if it will or will not have side effects.  */
4860       TREE_SIDE_EFFECTS (t) = 1;
4861       return t;
4862     }
4863
4864   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4865      Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
4866   if (TREE_CODE (type) != REFERENCE_TYPE
4867       && TREE_CODE (value) == NOP_EXPR
4868       && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
4869     value = TREE_OPERAND (value, 0);
4870
4871   if (TREE_CODE (type) == ARRAY_TYPE)
4872     {
4873       /* Allow casting from T1* to T2[] because Cfront allows it.
4874          NIHCL uses it. It is not valid ISO C++ however.  */
4875       if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
4876         {
4877           pedwarn ("ISO C++ forbids casting to an array type `%T'", type);
4878           type = build_pointer_type (TREE_TYPE (type));
4879         }
4880       else
4881         {
4882           error ("ISO C++ forbids casting to an array type `%T'", type);
4883           return error_mark_node;
4884         }
4885     }
4886
4887   if (TREE_CODE (type) == FUNCTION_TYPE
4888       || TREE_CODE (type) == METHOD_TYPE)
4889     {
4890       error ("invalid cast to function type `%T'", type);
4891       return error_mark_node;
4892     }
4893
4894   if (TREE_CODE (type) == VOID_TYPE)
4895     {
4896       /* Conversion to void does not cause any of the normal function to
4897        * pointer, array to pointer and lvalue to rvalue decays.  */
4898       
4899       value = convert_to_void (value, /*implicit=*/NULL);
4900       return value;
4901     }
4902
4903   if (!complete_type_or_else (type, NULL_TREE))
4904     return error_mark_node;
4905
4906   /* Convert functions and arrays to pointers and
4907      convert references to their expanded types,
4908      but don't convert any other types.  If, however, we are
4909      casting to a class type, there's no reason to do this: the
4910      cast will only succeed if there is a converting constructor,
4911      and the default conversions will be done at that point.  In
4912      fact, doing the default conversion here is actually harmful
4913      in cases like this:
4914
4915      typedef int A[2];
4916      struct S { S(const A&); };
4917
4918      since we don't want the array-to-pointer conversion done.  */
4919   if (!IS_AGGR_TYPE (type))
4920     {
4921       if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE
4922           || (TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE
4923               /* Don't do the default conversion on a ->* expression.  */
4924               && ! (TREE_CODE (type) == POINTER_TYPE
4925                     && bound_pmf_p (value)))
4926           || TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE
4927           || TREE_CODE (TREE_TYPE (value)) == REFERENCE_TYPE)
4928         value = decay_conversion (value);
4929     }
4930   else if (TREE_CODE (TREE_TYPE (value)) == REFERENCE_TYPE)
4931     /* However, even for class types, we still need to strip away
4932        the reference type, since the call to convert_force below
4933        does not expect the input expression to be of reference
4934        type.  */
4935     value = convert_from_reference (value);
4936         
4937   otype = TREE_TYPE (value);
4938
4939   /* Optionally warn about potentially worrisome casts.  */
4940
4941   if (warn_cast_qual
4942       && TREE_CODE (type) == POINTER_TYPE
4943       && TREE_CODE (otype) == POINTER_TYPE
4944       && !at_least_as_qualified_p (TREE_TYPE (type),
4945                                    TREE_TYPE (otype)))
4946     warning ("cast from `%T' to `%T' discards qualifiers from pointer target type",
4947                 otype, type);
4948
4949   if (TREE_CODE (type) == INTEGER_TYPE
4950       && TYPE_PTR_P (otype)
4951       && TYPE_PRECISION (type) != TYPE_PRECISION (otype))
4952     warning ("cast from pointer to integer of different size");
4953
4954   if (TYPE_PTR_P (type)
4955       && TREE_CODE (otype) == INTEGER_TYPE
4956       && TYPE_PRECISION (type) != TYPE_PRECISION (otype)
4957       /* Don't warn about converting any constant.  */
4958       && !TREE_CONSTANT (value))
4959     warning ("cast to pointer from integer of different size");
4960
4961   if (TREE_CODE (type) == REFERENCE_TYPE)
4962     value = (convert_from_reference
4963              (convert_to_reference (type, value, CONV_C_CAST,
4964                                     LOOKUP_COMPLAIN, NULL_TREE)));
4965   else
4966     {
4967       tree ovalue;
4968
4969       value = decl_constant_value (value);
4970
4971       ovalue = value;
4972       value = convert_force (type, value, CONV_C_CAST);
4973
4974       /* Ignore any integer overflow caused by the cast.  */
4975       if (TREE_CODE (value) == INTEGER_CST)
4976         {
4977           TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue);
4978           TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
4979         }
4980     }
4981
4982   /* Warn about possible alignment problems.  Do this here when we will have
4983      instantiated any necessary template types.  */
4984   if (STRICT_ALIGNMENT && warn_cast_align
4985       && TREE_CODE (type) == POINTER_TYPE
4986       && TREE_CODE (otype) == POINTER_TYPE
4987       && TREE_CODE (TREE_TYPE (otype)) != VOID_TYPE
4988       && TREE_CODE (TREE_TYPE (otype)) != FUNCTION_TYPE
4989       && COMPLETE_TYPE_P (TREE_TYPE (otype))
4990       && COMPLETE_TYPE_P (TREE_TYPE (type))
4991       && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype)))
4992     warning ("cast from `%T' to `%T' increases required alignment of target type",
4993                 otype, type);
4994
4995     /* Always produce some operator for an explicit cast,
4996        so we can tell (for -pedantic) that the cast is no lvalue.  */
4997   if (TREE_CODE (type) != REFERENCE_TYPE && value == expr
4998       && real_lvalue_p (value))
4999     value = non_lvalue (value);
5000
5001   return value;
5002 }
5003 \f
5004 /* Build an assignment expression of lvalue LHS from value RHS.
5005    MODIFYCODE is the code for a binary operator that we use
5006    to combine the old value of LHS with RHS to get the new value.
5007    Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
5008
5009    C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed.  */
5010
5011 tree
5012 build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
5013 {
5014   tree result;
5015   tree newrhs = rhs;
5016   tree lhstype = TREE_TYPE (lhs);
5017   tree olhstype = lhstype;
5018   tree olhs = NULL_TREE;
5019
5020   /* Avoid duplicate error messages from operands that had errors.  */
5021   if (lhs == error_mark_node || rhs == error_mark_node)
5022     return error_mark_node;
5023
5024   /* Handle control structure constructs used as "lvalues".  */
5025   switch (TREE_CODE (lhs))
5026     {
5027       /* Handle --foo = 5; as these are valid constructs in C++.  */
5028     case PREDECREMENT_EXPR:
5029     case PREINCREMENT_EXPR:
5030       if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
5031         lhs = build (TREE_CODE (lhs), TREE_TYPE (lhs),
5032                      stabilize_reference (TREE_OPERAND (lhs, 0)),
5033                      TREE_OPERAND (lhs, 1));
5034       return build (COMPOUND_EXPR, lhstype,
5035                     lhs,
5036                     build_modify_expr (TREE_OPERAND (lhs, 0),
5037                                        modifycode, rhs));
5038
5039       /* Handle (a, b) used as an "lvalue".  */
5040     case COMPOUND_EXPR:
5041       newrhs = build_modify_expr (TREE_OPERAND (lhs, 1),
5042                                   modifycode, rhs);
5043       if (newrhs == error_mark_node)
5044         return error_mark_node;
5045       return build (COMPOUND_EXPR, lhstype,
5046                     TREE_OPERAND (lhs, 0), newrhs);
5047
5048     case MODIFY_EXPR:
5049       if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
5050         lhs = build (TREE_CODE (lhs), TREE_TYPE (lhs),
5051                      stabilize_reference (TREE_OPERAND (lhs, 0)),
5052                      TREE_OPERAND (lhs, 1));
5053       newrhs = build_modify_expr (TREE_OPERAND (lhs, 0), modifycode, rhs);
5054       if (newrhs == error_mark_node)
5055         return error_mark_node;
5056       return build (COMPOUND_EXPR, lhstype, lhs, newrhs);
5057
5058       /* Handle (a ? b : c) used as an "lvalue".  */
5059     case COND_EXPR:
5060       {
5061         /* Produce (a ? (b = rhs) : (c = rhs))
5062            except that the RHS goes through a save-expr
5063            so the code to compute it is only emitted once.  */
5064         tree cond;
5065         tree preeval = NULL_TREE;
5066
5067         rhs = stabilize_expr (rhs, &preeval);
5068         
5069         /* Check this here to avoid odd errors when trying to convert
5070            a throw to the type of the COND_EXPR.  */
5071         if (!lvalue_or_else (lhs, "assignment"))
5072           return error_mark_node;
5073
5074         cond = build_conditional_expr
5075           (TREE_OPERAND (lhs, 0),
5076            build_modify_expr (cp_convert (TREE_TYPE (lhs),
5077                                           TREE_OPERAND (lhs, 1)),
5078                               modifycode, rhs),
5079            build_modify_expr (cp_convert (TREE_TYPE (lhs),
5080                                           TREE_OPERAND (lhs, 2)),
5081                               modifycode, rhs));
5082
5083         if (cond == error_mark_node)
5084           return cond;
5085         /* Make sure the code to compute the rhs comes out
5086            before the split.  */
5087         if (preeval)
5088           cond = build (COMPOUND_EXPR, TREE_TYPE (lhs), preeval, cond);
5089         return cond;
5090       }
5091       
5092     default:
5093       break;
5094     }
5095
5096   if (modifycode == INIT_EXPR)
5097     {
5098       if (TREE_CODE (rhs) == CONSTRUCTOR)
5099         {
5100           if (! same_type_p (TREE_TYPE (rhs), lhstype))
5101             /* Call convert to generate an error; see PR 11063.  */
5102             rhs = convert (lhstype, rhs);
5103           result = build (INIT_EXPR, lhstype, lhs, rhs);
5104           TREE_SIDE_EFFECTS (result) = 1;
5105           return result;
5106         }
5107       else if (! IS_AGGR_TYPE (lhstype))
5108         /* Do the default thing.  */;
5109       else
5110         {
5111           result = build_special_member_call (lhs, complete_ctor_identifier,
5112                                               build_tree_list (NULL_TREE, rhs),
5113                                               TYPE_BINFO (lhstype), 
5114                                               LOOKUP_NORMAL);
5115           if (result == NULL_TREE)
5116             return error_mark_node;
5117           return result;
5118         }
5119     }
5120   else
5121     {
5122       if (TREE_CODE (lhstype) == REFERENCE_TYPE)
5123         {
5124           lhs = convert_from_reference (lhs);
5125           olhstype = lhstype = TREE_TYPE (lhs);
5126         }
5127       lhs = require_complete_type (lhs);
5128       if (lhs == error_mark_node)
5129         return error_mark_node;
5130
5131       if (modifycode == NOP_EXPR)
5132         {
5133           /* `operator=' is not an inheritable operator.  */
5134           if (! IS_AGGR_TYPE (lhstype))
5135             /* Do the default thing.  */;
5136           else
5137             {
5138               result = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL,
5139                                      lhs, rhs, make_node (NOP_EXPR),
5140                                      /*overloaded_p=*/NULL);
5141               if (result == NULL_TREE)
5142                 return error_mark_node;
5143               return result;
5144             }
5145           lhstype = olhstype;
5146         }
5147       else
5148         {
5149           /* A binary op has been requested.  Combine the old LHS
5150              value with the RHS producing the value we should actually
5151              store into the LHS.  */
5152
5153           my_friendly_assert (!PROMOTES_TO_AGGR_TYPE (lhstype, REFERENCE_TYPE),
5154                               978652);
5155           lhs = stabilize_reference (lhs);
5156           newrhs = cp_build_binary_op (modifycode, lhs, rhs);
5157           if (newrhs == error_mark_node)
5158             {
5159               error ("  in evaluation of `%Q(%#T, %#T)'", modifycode,
5160                      TREE_TYPE (lhs), TREE_TYPE (rhs));
5161               return error_mark_node;
5162             }
5163           
5164           /* Now it looks like a plain assignment.  */
5165           modifycode = NOP_EXPR;
5166         }
5167       my_friendly_assert (TREE_CODE (lhstype) != REFERENCE_TYPE, 20011220);
5168       my_friendly_assert (TREE_CODE (TREE_TYPE (newrhs)) != REFERENCE_TYPE,
5169                           20011220);
5170     }
5171
5172   /* Handle a cast used as an "lvalue".
5173      We have already performed any binary operator using the value as cast.
5174      Now convert the result to the cast type of the lhs,
5175      and then true type of the lhs and store it there;
5176      then convert result back to the cast type to be the value
5177      of the assignment.  */
5178
5179   switch (TREE_CODE (lhs))
5180     {
5181     case NOP_EXPR:
5182     case CONVERT_EXPR:
5183     case FLOAT_EXPR:
5184     case FIX_TRUNC_EXPR:
5185     case FIX_FLOOR_EXPR:
5186     case FIX_ROUND_EXPR:
5187     case FIX_CEIL_EXPR:
5188       {
5189         tree inner_lhs = TREE_OPERAND (lhs, 0);
5190         tree result;
5191
5192         if (TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
5193             || TREE_CODE (TREE_TYPE (newrhs)) == FUNCTION_TYPE
5194             || TREE_CODE (TREE_TYPE (newrhs)) == METHOD_TYPE
5195             || TREE_CODE (TREE_TYPE (newrhs)) == OFFSET_TYPE)
5196           newrhs = decay_conversion (newrhs);
5197         
5198         /* ISO C++ 5.4/1: The result is an lvalue if T is a reference
5199            type, otherwise the result is an rvalue.  */
5200         if (! lvalue_p (lhs))
5201           pedwarn ("ISO C++ forbids cast to non-reference type used as lvalue");
5202
5203         result = build_modify_expr (inner_lhs, NOP_EXPR,
5204                                     cp_convert (TREE_TYPE (inner_lhs),
5205                                                 cp_convert (lhstype, newrhs)));
5206         if (result == error_mark_node)
5207           return result;
5208         return cp_convert (TREE_TYPE (lhs), result);
5209       }
5210
5211     default:
5212       break;
5213     }
5214
5215   /* Now we have handled acceptable kinds of LHS that are not truly lvalues.
5216      Reject anything strange now.  */
5217
5218   if (!lvalue_or_else (lhs, "assignment"))
5219     return error_mark_node;
5220
5221   /* Warn about modifying something that is `const'.  Don't warn if
5222      this is initialization.  */
5223   if (modifycode != INIT_EXPR
5224       && (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype)
5225           /* Functions are not modifiable, even though they are
5226              lvalues.  */
5227           || TREE_CODE (TREE_TYPE (lhs)) == FUNCTION_TYPE
5228           || TREE_CODE (TREE_TYPE (lhs)) == METHOD_TYPE
5229           /* If it's an aggregate and any field is const, then it is
5230              effectively const.  */
5231           || (CLASS_TYPE_P (lhstype)
5232               && C_TYPE_FIELDS_READONLY (lhstype))))
5233     readonly_error (lhs, "assignment", 0);
5234
5235   /* If storing into a structure or union member, it has probably been
5236      given type `int'.  Compute the type that would go with the actual
5237      amount of storage the member occupies.  */
5238
5239   if (TREE_CODE (lhs) == COMPONENT_REF
5240       && (TREE_CODE (lhstype) == INTEGER_TYPE
5241           || TREE_CODE (lhstype) == REAL_TYPE
5242           || TREE_CODE (lhstype) == ENUMERAL_TYPE))
5243     {
5244       lhstype = TREE_TYPE (get_unwidened (lhs, 0));
5245
5246       /* If storing in a field that is in actuality a short or narrower
5247          than one, we must store in the field in its actual type.  */
5248
5249       if (lhstype != TREE_TYPE (lhs))
5250         {
5251           /* Avoid warnings converting integral types back into enums for
5252              enum bit fields.  */
5253           if (TREE_CODE (lhstype) == INTEGER_TYPE
5254               && TREE_CODE (olhstype) == ENUMERAL_TYPE)
5255             {
5256               if (TREE_SIDE_EFFECTS (lhs))
5257                 lhs = stabilize_reference (lhs);
5258               olhs = lhs;
5259             }
5260           lhs = copy_node (lhs);
5261           TREE_TYPE (lhs) = lhstype;
5262         }
5263     }
5264
5265   /* Convert new value to destination type.  */
5266
5267   if (TREE_CODE (lhstype) == ARRAY_TYPE)
5268     {
5269       int from_array;
5270       
5271       if (!same_or_base_type_p (TYPE_MAIN_VARIANT (lhstype),
5272                                 TYPE_MAIN_VARIANT (TREE_TYPE (rhs))))
5273         {
5274           error ("incompatible types in assignment of `%T' to `%T'",
5275                  TREE_TYPE (rhs), lhstype);
5276           return error_mark_node;
5277         }
5278
5279       /* Allow array assignment in compiler-generated code.  */
5280       if (! DECL_ARTIFICIAL (current_function_decl))
5281         pedwarn ("ISO C++ forbids assignment of arrays");
5282
5283       from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
5284                    ? 1 + (modifycode != INIT_EXPR): 0;
5285       return build_vec_init (lhs, NULL_TREE, newrhs, from_array);
5286     }
5287
5288   if (modifycode == INIT_EXPR)
5289     newrhs = convert_for_initialization (lhs, lhstype, newrhs, LOOKUP_NORMAL,
5290                                          "initialization", NULL_TREE, 0);
5291   else
5292     {
5293       /* Avoid warnings on enum bit fields.  */
5294       if (TREE_CODE (olhstype) == ENUMERAL_TYPE
5295           && TREE_CODE (lhstype) == INTEGER_TYPE)
5296         {
5297           newrhs = convert_for_assignment (olhstype, newrhs, "assignment",
5298                                            NULL_TREE, 0);
5299           newrhs = convert_force (lhstype, newrhs, 0);
5300         }
5301       else
5302         newrhs = convert_for_assignment (lhstype, newrhs, "assignment",
5303                                          NULL_TREE, 0);
5304       if (TREE_CODE (newrhs) == CALL_EXPR
5305           && TYPE_NEEDS_CONSTRUCTING (lhstype))
5306         newrhs = build_cplus_new (lhstype, newrhs);
5307
5308       /* Can't initialize directly from a TARGET_EXPR, since that would
5309          cause the lhs to be constructed twice, and possibly result in
5310          accidental self-initialization.  So we force the TARGET_EXPR to be
5311          expanded without a target.  */
5312       if (TREE_CODE (newrhs) == TARGET_EXPR)
5313         newrhs = build (COMPOUND_EXPR, TREE_TYPE (newrhs), newrhs,
5314                         TREE_OPERAND (newrhs, 0));
5315     }
5316
5317   if (newrhs == error_mark_node)
5318     return error_mark_node;
5319
5320   result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
5321                   lhstype, lhs, newrhs);
5322
5323   TREE_SIDE_EFFECTS (result) = 1;
5324
5325   /* If we got the LHS in a different type for storing in,
5326      convert the result back to the nominal type of LHS
5327      so that the value we return always has the same type
5328      as the LHS argument.  */
5329
5330   if (olhstype == TREE_TYPE (result))
5331     return result;
5332   if (olhs)
5333     {
5334       result = build (COMPOUND_EXPR, olhstype, result, olhs);
5335       TREE_NO_UNUSED_WARNING (result) = 1;
5336       return result;
5337     }
5338   return convert_for_assignment (olhstype, result, "assignment",
5339                                  NULL_TREE, 0);
5340 }
5341
5342 tree
5343 build_x_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
5344 {
5345   if (processing_template_decl)
5346     return build_min_nt (MODOP_EXPR, lhs,
5347                          build_min_nt (modifycode, NULL_TREE, NULL_TREE), rhs);
5348
5349   if (modifycode != NOP_EXPR)
5350     {
5351       tree rval = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL, lhs, rhs,
5352                                 make_node (modifycode),
5353                                 /*overloaded_p=*/NULL);
5354       if (rval)
5355         return rval;
5356     }
5357   return build_modify_expr (lhs, modifycode, rhs);
5358 }
5359
5360 \f
5361 /* Get difference in deltas for different pointer to member function
5362    types.  Returns an integer constant of type PTRDIFF_TYPE_NODE.  If
5363    the conversion is invalid, the constant is zero.  If FORCE is true,
5364    then allow reverse conversions as well.
5365
5366    Note that the naming of FROM and TO is kind of backwards; the return
5367    value is what we add to a TO in order to get a FROM.  They are named
5368    this way because we call this function to find out how to convert from
5369    a pointer to member of FROM to a pointer to member of TO.  */
5370
5371 static tree
5372 get_delta_difference (tree from, tree to, int force)
5373 {
5374   tree binfo;
5375   tree virt_binfo;
5376   base_kind kind;
5377   
5378   binfo = lookup_base (to, from, ba_check, &kind);
5379   if (kind == bk_inaccessible || kind == bk_ambig)
5380     {
5381       error ("   in pointer to member function conversion");
5382       goto error;
5383     }
5384   if (!binfo)
5385     {
5386       if (!force)
5387         {
5388           error_not_base_type (from, to);
5389           error ("   in pointer to member conversion");
5390           goto error;
5391         }
5392       binfo = lookup_base (from, to, ba_check, &kind);
5393       if (!binfo)
5394         goto error;
5395       virt_binfo = binfo_from_vbase (binfo);
5396       if (virt_binfo)
5397         {
5398           /* This is a reinterpret cast, we choose to do nothing.  */
5399           warning ("pointer to member cast via virtual base `%T'",
5400                    BINFO_TYPE (virt_binfo));
5401           goto error;
5402         }
5403       return fold (convert_to_integer (ptrdiff_type_node, 
5404                                        size_diffop (size_zero_node,
5405                                                     BINFO_OFFSET (binfo))));
5406     }
5407
5408   virt_binfo = binfo_from_vbase (binfo);
5409   if (!virt_binfo)
5410     return fold (convert_to_integer (ptrdiff_type_node, BINFO_OFFSET (binfo)));
5411
5412   /* This is a reinterpret cast, we choose to do nothing.  */
5413   if (force)
5414     warning ("pointer to member cast via virtual base `%T'",
5415              BINFO_TYPE (virt_binfo));
5416   else
5417     error ("pointer to member conversion via virtual base `%T'",
5418            BINFO_TYPE (virt_binfo));
5419
5420  error:
5421   return fold (convert_to_integer(ptrdiff_type_node, integer_zero_node));
5422 }
5423
5424 /* Return a constructor for the pointer-to-member-function TYPE using
5425    the other components as specified.  */
5426
5427 tree
5428 build_ptrmemfunc1 (tree type, tree delta, tree pfn)
5429 {
5430   tree u = NULL_TREE;
5431   tree delta_field;
5432   tree pfn_field;
5433
5434   /* Pull the FIELD_DECLs out of the type.  */
5435   pfn_field = TYPE_FIELDS (type);
5436   delta_field = TREE_CHAIN (pfn_field);
5437
5438   /* Make sure DELTA has the type we want.  */
5439   delta = convert_and_check (delta_type_node, delta);
5440
5441   /* Finish creating the initializer.  */
5442   u = tree_cons (pfn_field, pfn,
5443                  build_tree_list (delta_field, delta));
5444   u = build_constructor (type, u);
5445   TREE_CONSTANT (u) = TREE_CONSTANT (pfn) && TREE_CONSTANT (delta);
5446   TREE_STATIC (u) = (TREE_CONSTANT (u)
5447                      && (initializer_constant_valid_p (pfn, TREE_TYPE (pfn))
5448                          != NULL_TREE)
5449                      && (initializer_constant_valid_p (delta, TREE_TYPE (delta)) 
5450                          != NULL_TREE));
5451   return u;
5452 }
5453
5454 /* Build a constructor for a pointer to member function.  It can be
5455    used to initialize global variables, local variable, or used
5456    as a value in expressions.  TYPE is the POINTER to METHOD_TYPE we
5457    want to be.
5458
5459    If FORCE is nonzero, then force this conversion, even if
5460    we would rather not do it.  Usually set when using an explicit
5461    cast.
5462
5463    Return error_mark_node, if something goes wrong.  */
5464
5465 tree
5466 build_ptrmemfunc (tree type, tree pfn, int force)
5467 {
5468   tree fn;
5469   tree pfn_type;
5470   tree to_type;
5471
5472   if (error_operand_p (pfn))
5473     return error_mark_node;
5474
5475   pfn_type = TREE_TYPE (pfn);
5476   to_type = build_ptrmemfunc_type (type);
5477
5478   /* Handle multiple conversions of pointer to member functions.  */
5479   if (TYPE_PTRMEMFUNC_P (pfn_type))
5480     {
5481       tree delta = NULL_TREE;
5482       tree npfn = NULL_TREE;
5483       tree n;
5484
5485       if (!force 
5486           && !can_convert_arg (to_type, TREE_TYPE (pfn), pfn))
5487         error ("invalid conversion to type `%T' from type `%T'", 
5488                   to_type, pfn_type);
5489
5490       n = get_delta_difference (TYPE_PTRMEMFUNC_OBJECT_TYPE (pfn_type),
5491                                 TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type),
5492                                 force);
5493
5494       /* We don't have to do any conversion to convert a
5495          pointer-to-member to its own type.  But, we don't want to
5496          just return a PTRMEM_CST if there's an explicit cast; that
5497          cast should make the expression an invalid template argument.  */
5498       if (TREE_CODE (pfn) != PTRMEM_CST)
5499         {
5500           if (same_type_p (to_type, pfn_type))
5501             return pfn;
5502           else if (integer_zerop (n))
5503             return build_reinterpret_cast (to_type, pfn);
5504         }
5505
5506       if (TREE_SIDE_EFFECTS (pfn))
5507         pfn = save_expr (pfn);
5508
5509       /* Obtain the function pointer and the current DELTA.  */
5510       if (TREE_CODE (pfn) == PTRMEM_CST)
5511         expand_ptrmemfunc_cst (pfn, &delta, &npfn);
5512       else
5513         {
5514           npfn = build_ptrmemfunc_access_expr (pfn, pfn_identifier);
5515           delta = build_ptrmemfunc_access_expr (pfn, delta_identifier);
5516         }
5517
5518       /* Just adjust the DELTA field.  */
5519       my_friendly_assert 
5520         (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (delta),
5521                                                     ptrdiff_type_node), 
5522          20030727);
5523       if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta)
5524         n = cp_build_binary_op (LSHIFT_EXPR, n, integer_one_node);
5525       delta = cp_build_binary_op (PLUS_EXPR, delta, n);
5526       return build_ptrmemfunc1 (to_type, delta, npfn);
5527     }
5528
5529   /* Handle null pointer to member function conversions.  */
5530   if (integer_zerop (pfn))
5531     {
5532       pfn = build_c_cast (type, integer_zero_node);
5533       return build_ptrmemfunc1 (to_type,
5534                                 integer_zero_node, 
5535                                 pfn);
5536     }
5537
5538   if (type_unknown_p (pfn))
5539     return instantiate_type (type, pfn, tf_error | tf_warning);
5540
5541   fn = TREE_OPERAND (pfn, 0);
5542   my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 0);
5543   return make_ptrmem_cst (to_type, fn);
5544 }
5545
5546 /* Return the DELTA, IDX, PFN, and DELTA2 values for the PTRMEM_CST
5547    given by CST.
5548
5549    ??? There is no consistency as to the types returned for the above
5550    values.  Some code acts as if its a sizetype and some as if its
5551    integer_type_node.  */
5552
5553 void
5554 expand_ptrmemfunc_cst (tree cst, tree *delta, tree *pfn)
5555 {
5556   tree type = TREE_TYPE (cst);
5557   tree fn = PTRMEM_CST_MEMBER (cst);
5558   tree ptr_class, fn_class;
5559
5560   my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 0);
5561
5562   /* The class that the function belongs to.  */
5563   fn_class = DECL_CONTEXT (fn);
5564
5565   /* The class that we're creating a pointer to member of.  */
5566   ptr_class = TYPE_PTRMEMFUNC_OBJECT_TYPE (type);
5567
5568   /* First, calculate the adjustment to the function's class.  */
5569   *delta = get_delta_difference (fn_class, ptr_class, /*force=*/0);
5570
5571   if (!DECL_VIRTUAL_P (fn))
5572     *pfn = convert (TYPE_PTRMEMFUNC_FN_TYPE (type), build_addr_func (fn));
5573   else
5574     {
5575       /* If we're dealing with a virtual function, we have to adjust 'this'
5576          again, to point to the base which provides the vtable entry for
5577          fn; the call will do the opposite adjustment.  */
5578       tree orig_class = DECL_CONTEXT (fn);
5579       tree binfo = binfo_or_else (orig_class, fn_class);
5580       *delta = fold (build (PLUS_EXPR, TREE_TYPE (*delta),
5581                             *delta, BINFO_OFFSET (binfo)));
5582
5583       /* We set PFN to the vtable offset at which the function can be
5584          found, plus one (unless ptrmemfunc_vbit_in_delta, in which
5585          case delta is shifted left, and then incremented).  */
5586       *pfn = DECL_VINDEX (fn);
5587       *pfn = fold (build (MULT_EXPR, integer_type_node, *pfn,
5588                           TYPE_SIZE_UNIT (vtable_entry_type)));
5589
5590       switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
5591         {
5592         case ptrmemfunc_vbit_in_pfn:
5593           *pfn = fold (build (PLUS_EXPR, integer_type_node, *pfn,
5594                               integer_one_node));
5595           break;
5596
5597         case ptrmemfunc_vbit_in_delta:
5598           *delta = fold (build (LSHIFT_EXPR, TREE_TYPE (*delta),
5599                                 *delta, integer_one_node));
5600           *delta = fold (build (PLUS_EXPR, TREE_TYPE (*delta),
5601                                 *delta, integer_one_node));
5602           break;
5603
5604         default:
5605           abort ();
5606         }
5607
5608       *pfn = fold (build1 (NOP_EXPR, TYPE_PTRMEMFUNC_FN_TYPE (type),
5609                            *pfn));
5610     }
5611 }
5612
5613 /* Return an expression for PFN from the pointer-to-member function
5614    given by T.  */
5615
5616 tree
5617 pfn_from_ptrmemfunc (tree t)
5618 {
5619   if (TREE_CODE (t) == PTRMEM_CST)
5620     {
5621       tree delta;
5622       tree pfn;
5623       
5624       expand_ptrmemfunc_cst (t, &delta, &pfn);
5625       if (pfn)
5626         return pfn;
5627     }
5628
5629   return build_ptrmemfunc_access_expr (t, pfn_identifier);
5630 }
5631
5632 /* Expression EXPR is about to be implicitly converted to TYPE.  Warn
5633    if this is a potentially dangerous thing to do.  Returns a possibly
5634    marked EXPR.  */
5635
5636 tree
5637 dubious_conversion_warnings (tree type, tree expr,
5638                              const char *errtype, tree fndecl, int parmnum)
5639 {
5640   type = non_reference (type);
5641   
5642   /* Issue warnings about peculiar, but valid, uses of NULL.  */
5643   if (ARITHMETIC_TYPE_P (type) && expr == null_node)
5644     {
5645       if (fndecl)
5646         warning ("passing NULL used for non-pointer %s %P of `%D'",
5647                     errtype, parmnum, fndecl);
5648       else
5649         warning ("%s to non-pointer type `%T' from NULL", errtype, type);
5650     }
5651   
5652   /* Warn about assigning a floating-point type to an integer type.  */
5653   if (TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE
5654       && TREE_CODE (type) == INTEGER_TYPE)
5655     {
5656       if (fndecl)
5657         warning ("passing `%T' for %s %P of `%D'",
5658                     TREE_TYPE (expr), errtype, parmnum, fndecl);
5659       else
5660         warning ("%s to `%T' from `%T'", errtype, type, TREE_TYPE (expr));
5661     }
5662   /* And warn about assigning a negative value to an unsigned
5663      variable.  */
5664   else if (TREE_UNSIGNED (type) && TREE_CODE (type) != BOOLEAN_TYPE)
5665     {
5666       if (TREE_CODE (expr) == INTEGER_CST
5667           && TREE_NEGATED_INT (expr))
5668         {
5669           if (fndecl)
5670             warning ("passing negative value `%E' for %s %P of `%D'",
5671                         expr, errtype, parmnum, fndecl);
5672           else
5673             warning ("%s of negative value `%E' to `%T'",
5674                         errtype, expr, type);
5675         }
5676
5677       overflow_warning (expr);
5678
5679       if (TREE_CONSTANT (expr))
5680         expr = fold (expr);
5681     }
5682   return expr;
5683 }
5684
5685 /* Convert value RHS to type TYPE as preparation for an assignment to
5686    an lvalue of type TYPE.  ERRTYPE is a string to use in error
5687    messages: "assignment", "return", etc.  If FNDECL is non-NULL, we
5688    are doing the conversion in order to pass the PARMNUMth argument of
5689    FNDECL.  */
5690
5691 static tree
5692 convert_for_assignment (tree type, tree rhs,
5693                         const char *errtype, tree fndecl, int parmnum)
5694 {
5695   tree rhstype;
5696   enum tree_code coder;
5697
5698   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
5699   if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
5700     rhs = TREE_OPERAND (rhs, 0);
5701
5702   rhstype = TREE_TYPE (rhs);
5703   coder = TREE_CODE (rhstype);
5704
5705   if (TREE_CODE (type) == VECTOR_TYPE && coder == VECTOR_TYPE
5706       && ((*targetm.vector_opaque_p) (type)
5707           || (*targetm.vector_opaque_p) (rhstype)))
5708     return convert (type, rhs);
5709
5710   if (rhs == error_mark_node || rhstype == error_mark_node)
5711     return error_mark_node;
5712   if (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node)
5713     return error_mark_node;
5714
5715   /* The RHS of an assignment cannot have void type.  */
5716   if (coder == VOID_TYPE)
5717     {
5718       error ("void value not ignored as it ought to be");
5719       return error_mark_node;
5720     }
5721
5722   /* Simplify the RHS if possible.  */
5723   if (TREE_CODE (rhs) == CONST_DECL)
5724     rhs = DECL_INITIAL (rhs);
5725   
5726   /* We do not use decl_constant_value here because of this case:
5727
5728        const char* const s = "s";
5729  
5730      The conversion rules for a string literal are more lax than for a
5731      variable; in particular, a string literal can be converted to a
5732      "char *" but the variable "s" cannot be converted in the same
5733      way.  If the conversion is allowed, the optimization should be
5734      performed while creating the converted expression.  */
5735
5736   /* [expr.ass]
5737
5738      The expression is implicitly converted (clause _conv_) to the
5739      cv-unqualified type of the left operand.
5740
5741      We allow bad conversions here because by the time we get to this point
5742      we are committed to doing the conversion.  If we end up doing a bad
5743      conversion, convert_like will complain.  */
5744   if (!can_convert_arg_bad (type, rhstype, rhs))
5745     {
5746       /* When -Wno-pmf-conversions is use, we just silently allow
5747          conversions from pointers-to-members to plain pointers.  If
5748          the conversion doesn't work, cp_convert will complain.  */
5749       if (!warn_pmf2ptr 
5750           && TYPE_PTR_P (type) 
5751           && TYPE_PTRMEMFUNC_P (rhstype))
5752         rhs = cp_convert (strip_top_quals (type), rhs);
5753       else
5754         {
5755           /* If the right-hand side has unknown type, then it is an
5756              overloaded function.  Call instantiate_type to get error
5757              messages.  */
5758           if (rhstype == unknown_type_node)
5759             instantiate_type (type, rhs, tf_error | tf_warning);
5760           else if (fndecl)
5761             error ("cannot convert `%T' to `%T' for argument `%P' to `%D'",
5762                       rhstype, type, parmnum, fndecl);
5763           else
5764             error ("cannot convert `%T' to `%T' in %s", rhstype, type, 
5765                       errtype);
5766           return error_mark_node;
5767         }
5768     }
5769   return perform_implicit_conversion (strip_top_quals (type), rhs);
5770 }
5771
5772 /* Convert RHS to be of type TYPE.
5773    If EXP is nonzero, it is the target of the initialization.
5774    ERRTYPE is a string to use in error messages.
5775
5776    Two major differences between the behavior of
5777    `convert_for_assignment' and `convert_for_initialization'
5778    are that references are bashed in the former, while
5779    copied in the latter, and aggregates are assigned in
5780    the former (operator=) while initialized in the
5781    latter (X(X&)).
5782
5783    If using constructor make sure no conversion operator exists, if one does
5784    exist, an ambiguity exists.
5785
5786    If flags doesn't include LOOKUP_COMPLAIN, don't complain about anything.  */
5787
5788 tree
5789 convert_for_initialization (tree exp, tree type, tree rhs, int flags,
5790                             const char *errtype, tree fndecl, int parmnum)
5791 {
5792   enum tree_code codel = TREE_CODE (type);
5793   tree rhstype;
5794   enum tree_code coder;
5795
5796   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5797      Strip such NOP_EXPRs, since RHS is used in non-lvalue context.  */
5798   if (TREE_CODE (rhs) == NOP_EXPR
5799       && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))
5800       && codel != REFERENCE_TYPE)
5801     rhs = TREE_OPERAND (rhs, 0);
5802
5803   if (rhs == error_mark_node
5804       || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node))
5805     return error_mark_node;
5806
5807   if (TREE_CODE (TREE_TYPE (rhs)) == REFERENCE_TYPE)
5808     rhs = convert_from_reference (rhs);
5809
5810   if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
5811        && TREE_CODE (type) != ARRAY_TYPE
5812        && (TREE_CODE (type) != REFERENCE_TYPE
5813            || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
5814       || (TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
5815           && (TREE_CODE (type) != REFERENCE_TYPE
5816               || TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE))
5817       || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
5818     rhs = decay_conversion (rhs);
5819
5820   rhstype = TREE_TYPE (rhs);
5821   coder = TREE_CODE (rhstype);
5822
5823   if (coder == ERROR_MARK)
5824     return error_mark_node;
5825
5826   /* We accept references to incomplete types, so we can
5827      return here before checking if RHS is of complete type.  */
5828      
5829   if (codel == REFERENCE_TYPE)
5830     {
5831       /* This should eventually happen in convert_arguments.  */
5832       int savew = 0, savee = 0;
5833
5834       if (fndecl)
5835         savew = warningcount, savee = errorcount;
5836       rhs = initialize_reference (type, rhs, /*decl=*/NULL_TREE,
5837                                   /*cleanup=*/NULL);
5838       if (fndecl)
5839         {
5840           if (warningcount > savew)
5841             cp_warning_at ("in passing argument %P of `%+D'", parmnum, fndecl);
5842           else if (errorcount > savee)
5843             cp_error_at ("in passing argument %P of `%+D'", parmnum, fndecl);
5844         }
5845       return rhs;
5846     }      
5847
5848   if (exp != 0)
5849     exp = require_complete_type (exp);
5850   if (exp == error_mark_node)
5851     return error_mark_node;
5852
5853   rhstype = non_reference (rhstype);
5854
5855   type = complete_type (type);
5856
5857   if (IS_AGGR_TYPE (type))
5858     return ocp_convert (type, rhs, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
5859
5860   return convert_for_assignment (type, rhs, errtype, fndecl, parmnum);
5861 }
5862 \f
5863 /* Expand an ASM statement with operands, handling output operands
5864    that are not variables or INDIRECT_REFS by transforming such
5865    cases into cases that expand_asm_operands can handle.
5866
5867    Arguments are same as for expand_asm_operands.
5868
5869    We don't do default conversions on all inputs, because it can screw
5870    up operands that are expected to be in memory.  */
5871
5872 void
5873 c_expand_asm_operands (tree string, tree outputs, tree inputs, tree clobbers,
5874                        int vol, location_t locus)
5875 {
5876   int noutputs = list_length (outputs);
5877   int i;
5878   /* o[I] is the place that output number I should be written.  */
5879   tree *o = alloca (noutputs * sizeof (tree));
5880   tree tail;
5881
5882   /* Record the contents of OUTPUTS before it is modified.  */
5883   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
5884     o[i] = TREE_VALUE (tail);
5885
5886   /* Generate the ASM_OPERANDS insn;
5887      store into the TREE_VALUEs of OUTPUTS some trees for
5888      where the values were actually stored.  */
5889   expand_asm_operands (string, outputs, inputs, clobbers, vol, locus);
5890
5891   /* Copy all the intermediate outputs into the specified outputs.  */
5892   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
5893     {
5894       if (o[i] != TREE_VALUE (tail))
5895         {
5896           expand_expr (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail)),
5897                        const0_rtx, VOIDmode, EXPAND_NORMAL);
5898           free_temp_slots ();
5899
5900           /* Restore the original value so that it's correct the next
5901              time we expand this function.  */
5902           TREE_VALUE (tail) = o[i];
5903         }
5904       /* Detect modification of read-only values.
5905          (Otherwise done by build_modify_expr.)  */
5906       else
5907         {
5908           tree type = TREE_TYPE (o[i]);
5909           if (type != error_mark_node
5910               && (CP_TYPE_CONST_P (type)
5911                   || (CLASS_TYPE_P (type) && C_TYPE_FIELDS_READONLY (type))))
5912             readonly_error (o[i], "modification by `asm'", 1);
5913         }
5914     }
5915
5916   /* Those MODIFY_EXPRs could do autoincrements.  */
5917   emit_queue ();
5918 }
5919 \f
5920 /* If RETVAL is the address of, or a reference to, a local variable or
5921    temporary give an appropriate warning.  */
5922
5923 static void
5924 maybe_warn_about_returning_address_of_local (tree retval)
5925 {
5926   tree valtype = TREE_TYPE (DECL_RESULT (current_function_decl));
5927   tree whats_returned = retval;
5928
5929   for (;;)
5930     {
5931       if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
5932         whats_returned = TREE_OPERAND (whats_returned, 1);
5933       else if (TREE_CODE (whats_returned) == CONVERT_EXPR
5934                || TREE_CODE (whats_returned) == NON_LVALUE_EXPR
5935                || TREE_CODE (whats_returned) == NOP_EXPR)
5936         whats_returned = TREE_OPERAND (whats_returned, 0);
5937       else
5938         break;
5939     }
5940
5941   if (TREE_CODE (whats_returned) != ADDR_EXPR)
5942     return;
5943   whats_returned = TREE_OPERAND (whats_returned, 0);      
5944
5945   if (TREE_CODE (valtype) == REFERENCE_TYPE)
5946     {
5947       if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
5948           || TREE_CODE (whats_returned) == TARGET_EXPR)
5949         {
5950           warning ("returning reference to temporary");
5951           return;
5952         }
5953       if (TREE_CODE (whats_returned) == VAR_DECL 
5954           && DECL_NAME (whats_returned)
5955           && TEMP_NAME_P (DECL_NAME (whats_returned)))
5956         {
5957           warning ("reference to non-lvalue returned");
5958           return;
5959         }
5960     }
5961
5962   if (TREE_CODE (whats_returned) == VAR_DECL
5963       && DECL_NAME (whats_returned)
5964       && DECL_FUNCTION_SCOPE_P (whats_returned)
5965       && !(TREE_STATIC (whats_returned)
5966            || TREE_PUBLIC (whats_returned)))
5967     {
5968       if (TREE_CODE (valtype) == REFERENCE_TYPE)
5969         cp_warning_at ("reference to local variable `%D' returned", 
5970                        whats_returned);
5971       else
5972         cp_warning_at ("address of local variable `%D' returned", 
5973                        whats_returned);
5974       return;
5975     }
5976 }
5977
5978 /* Check that returning RETVAL from the current function is valid.
5979    Return an expression explicitly showing all conversions required to
5980    change RETVAL into the function return type, and to assign it to
5981    the DECL_RESULT for the function.  */
5982
5983 tree
5984 check_return_expr (tree retval)
5985 {
5986   tree result;
5987   /* The type actually returned by the function, after any
5988      promotions.  */
5989   tree valtype;
5990   int fn_returns_value_p;
5991
5992   /* A `volatile' function is one that isn't supposed to return, ever.
5993      (This is a G++ extension, used to get better code for functions
5994      that call the `volatile' function.)  */
5995   if (TREE_THIS_VOLATILE (current_function_decl))
5996     warning ("function declared `noreturn' has a `return' statement");
5997
5998   /* Check for various simple errors.  */
5999   if (DECL_DESTRUCTOR_P (current_function_decl))
6000     {
6001       if (retval)
6002         error ("returning a value from a destructor");
6003       return NULL_TREE;
6004     }
6005   else if (DECL_CONSTRUCTOR_P (current_function_decl))
6006     {
6007       if (in_function_try_handler)
6008         /* If a return statement appears in a handler of the
6009            function-try-block of a constructor, the program is ill-formed.  */
6010         error ("cannot return from a handler of a function-try-block of a constructor");
6011       else if (retval)
6012         /* You can't return a value from a constructor.  */
6013         error ("returning a value from a constructor");
6014       return NULL_TREE;
6015     }
6016
6017   if (processing_template_decl)
6018     {
6019       current_function_returns_value = 1;
6020       return retval;
6021     }
6022   
6023   /* When no explicit return-value is given in a function with a named
6024      return value, the named return value is used.  */
6025   result = DECL_RESULT (current_function_decl);
6026   valtype = TREE_TYPE (result);
6027   my_friendly_assert (valtype != NULL_TREE, 19990924);
6028   fn_returns_value_p = !VOID_TYPE_P (valtype);
6029   if (!retval && DECL_NAME (result) && fn_returns_value_p)
6030     retval = result;
6031
6032   /* Check for a return statement with no return value in a function
6033      that's supposed to return a value.  */
6034   if (!retval && fn_returns_value_p)
6035     {
6036       pedwarn ("return-statement with no value, in function returning '%T'",
6037                valtype);
6038       /* Clear this, so finish_function won't say that we reach the
6039          end of a non-void function (which we don't, we gave a
6040          return!).  */
6041       current_function_returns_null = 0;
6042     }
6043   /* Check for a return statement with a value in a function that
6044      isn't supposed to return a value.  */
6045   else if (retval && !fn_returns_value_p)
6046     {     
6047       if (VOID_TYPE_P (TREE_TYPE (retval)))
6048         /* You can return a `void' value from a function of `void'
6049            type.  In that case, we have to evaluate the expression for
6050            its side-effects.  */
6051           finish_expr_stmt (retval);
6052       else
6053         pedwarn ("return-statement with a value, in function "
6054                  "returning 'void'");
6055
6056       current_function_returns_null = 1;
6057
6058       /* There's really no value to return, after all.  */
6059       return NULL_TREE;
6060     }
6061   else if (!retval)
6062     /* Remember that this function can sometimes return without a
6063        value.  */
6064     current_function_returns_null = 1;
6065   else
6066     /* Remember that this function did return a value.  */
6067     current_function_returns_value = 1;
6068
6069   /* Only operator new(...) throw(), can return NULL [expr.new/13].  */
6070   if ((DECL_OVERLOADED_OPERATOR_P (current_function_decl) == NEW_EXPR
6071        || DECL_OVERLOADED_OPERATOR_P (current_function_decl) == VEC_NEW_EXPR)
6072       && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl))
6073       && ! flag_check_new
6074       && null_ptr_cst_p (retval))
6075     warning ("`operator new' must not return NULL unless it is declared `throw()' (or -fcheck-new is in effect)");
6076
6077   /* Effective C++ rule 15.  See also start_function.  */
6078   if (warn_ecpp
6079       && DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR)
6080       && retval != current_class_ref)
6081     warning ("`operator=' should return a reference to `*this'");
6082
6083   /* The fabled Named Return Value optimization, as per [class.copy]/15:
6084
6085      [...]      For  a function with a class return type, if the expression
6086      in the return statement is the name of a local  object,  and  the  cv-
6087      unqualified  type  of  the  local  object  is the same as the function
6088      return type, an implementation is permitted to omit creating the  tem-
6089      porary  object  to  hold  the function return value [...]
6090
6091      So, if this is a value-returning function that always returns the same
6092      local variable, remember it.
6093
6094      It might be nice to be more flexible, and choose the first suitable
6095      variable even if the function sometimes returns something else, but
6096      then we run the risk of clobbering the variable we chose if the other
6097      returned expression uses the chosen variable somehow.  And people expect
6098      this restriction, anyway.  (jason 2000-11-19)
6099
6100      See finish_function, cxx_expand_function_start, and
6101      cp_copy_res_decl_for_inlining for other pieces of this
6102      optimization.  */
6103
6104   if (fn_returns_value_p && flag_elide_constructors)
6105     {
6106       if (retval != NULL_TREE
6107           && (current_function_return_value == NULL_TREE
6108               || current_function_return_value == retval)
6109           && TREE_CODE (retval) == VAR_DECL
6110           && DECL_CONTEXT (retval) == current_function_decl
6111           && ! TREE_STATIC (retval)
6112           && (DECL_ALIGN (retval)
6113               >= DECL_ALIGN (DECL_RESULT (current_function_decl)))
6114           && same_type_p ((TYPE_MAIN_VARIANT
6115                            (TREE_TYPE (retval))),
6116                           (TYPE_MAIN_VARIANT
6117                            (TREE_TYPE (TREE_TYPE (current_function_decl))))))
6118         current_function_return_value = retval;
6119       else
6120         current_function_return_value = error_mark_node;
6121     }
6122
6123   /* We don't need to do any conversions when there's nothing being
6124      returned.  */
6125   if (!retval || retval == error_mark_node)
6126     return retval;
6127
6128   /* Do any required conversions.  */
6129   if (retval == result || DECL_CONSTRUCTOR_P (current_function_decl))
6130     /* No conversions are required.  */
6131     ;
6132   else
6133     {
6134       /* The type the function is declared to return.  */
6135       tree functype = TREE_TYPE (TREE_TYPE (current_function_decl));
6136
6137       /* First convert the value to the function's return type, then
6138          to the type of return value's location to handle the
6139          case that functype is smaller than the valtype.  */
6140       retval = convert_for_initialization
6141         (NULL_TREE, functype, retval, LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING,
6142          "return", NULL_TREE, 0);
6143       retval = convert (valtype, retval);
6144
6145       /* If the conversion failed, treat this just like `return;'.  */
6146       if (retval == error_mark_node)
6147         return retval;
6148       /* We can't initialize a register from a AGGR_INIT_EXPR.  */
6149       else if (! current_function_returns_struct
6150                && TREE_CODE (retval) == TARGET_EXPR
6151                && TREE_CODE (TREE_OPERAND (retval, 1)) == AGGR_INIT_EXPR)
6152         retval = build (COMPOUND_EXPR, TREE_TYPE (retval), retval,
6153                         TREE_OPERAND (retval, 0));
6154       else
6155         maybe_warn_about_returning_address_of_local (retval);
6156     }
6157   
6158   /* Actually copy the value returned into the appropriate location.  */
6159   if (retval && retval != result)
6160     retval = build (INIT_EXPR, TREE_TYPE (result), result, retval);
6161
6162   return retval;
6163 }
6164
6165 \f
6166 /* Returns nonzero if the pointer-type FROM can be converted to the
6167    pointer-type TO via a qualification conversion.  If CONSTP is -1,
6168    then we return nonzero if the pointers are similar, and the
6169    cv-qualification signature of FROM is a proper subset of that of TO.
6170
6171    If CONSTP is positive, then all outer pointers have been
6172    const-qualified.  */
6173
6174 static int
6175 comp_ptr_ttypes_real (tree to, tree from, int constp)
6176 {
6177   bool to_more_cv_qualified = false;
6178
6179   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
6180     {
6181       if (TREE_CODE (to) != TREE_CODE (from))
6182         return 0;
6183
6184       if (TREE_CODE (from) == OFFSET_TYPE
6185           && !same_type_p (TYPE_OFFSET_BASETYPE (from),
6186                            TYPE_OFFSET_BASETYPE (to)))
6187         return 0;
6188
6189       /* Const and volatile mean something different for function types,
6190          so the usual checks are not appropriate.  */
6191       if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
6192         {
6193           if (!at_least_as_qualified_p (to, from))
6194             return 0;
6195
6196           if (!at_least_as_qualified_p (from, to))
6197             {
6198               if (constp == 0)
6199                 return 0;
6200               to_more_cv_qualified = true;
6201             }
6202
6203           if (constp > 0)
6204             constp &= TYPE_READONLY (to);
6205         }
6206
6207       if (TREE_CODE (to) != POINTER_TYPE && !TYPE_PTRMEM_P (to))
6208         return ((constp >= 0 || to_more_cv_qualified)
6209                 && same_type_ignoring_top_level_qualifiers_p (to, from));
6210     }
6211 }
6212
6213 /* When comparing, say, char ** to char const **, this function takes
6214    the 'char *' and 'char const *'.  Do not pass non-pointer/reference
6215    types to this function.  */
6216
6217 int
6218 comp_ptr_ttypes (tree to, tree from)
6219 {
6220   return comp_ptr_ttypes_real (to, from, 1);
6221 }
6222
6223 /* Returns 1 if to and from are (possibly multi-level) pointers to the same
6224    type or inheritance-related types, regardless of cv-quals.  */
6225
6226 int
6227 ptr_reasonably_similar (tree to, tree from)
6228 {
6229   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
6230     {
6231       /* Any target type is similar enough to void.  */
6232       if (TREE_CODE (to) == VOID_TYPE
6233           || TREE_CODE (from) == VOID_TYPE)
6234         return 1;
6235
6236       if (TREE_CODE (to) != TREE_CODE (from))
6237         return 0;
6238
6239       if (TREE_CODE (from) == OFFSET_TYPE
6240           && comptypes (TYPE_OFFSET_BASETYPE (to),
6241                         TYPE_OFFSET_BASETYPE (from), 
6242                         COMPARE_BASE | COMPARE_DERIVED))
6243         continue;
6244
6245       if (TREE_CODE (to) == INTEGER_TYPE
6246           && TYPE_PRECISION (to) == TYPE_PRECISION (from))
6247         return 1;
6248
6249       if (TREE_CODE (to) == FUNCTION_TYPE)
6250         return 1;
6251
6252       if (TREE_CODE (to) != POINTER_TYPE)
6253         return comptypes
6254           (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from), 
6255            COMPARE_BASE | COMPARE_DERIVED);
6256     }
6257 }
6258
6259 /* Like comp_ptr_ttypes, for const_cast.  */
6260
6261 static int
6262 comp_ptr_ttypes_const (tree to, tree from)
6263 {
6264   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
6265     {
6266       if (TREE_CODE (to) != TREE_CODE (from))
6267         return 0;
6268
6269       if (TREE_CODE (from) == OFFSET_TYPE
6270           && same_type_p (TYPE_OFFSET_BASETYPE (from),
6271                           TYPE_OFFSET_BASETYPE (to)))
6272           continue;
6273
6274       if (TREE_CODE (to) != POINTER_TYPE)
6275         return same_type_ignoring_top_level_qualifiers_p (to, from);
6276     }
6277 }
6278
6279 /* Returns the type qualifiers for this type, including the qualifiers on the
6280    elements for an array type.  */
6281
6282 int
6283 cp_type_quals (tree type)
6284 {
6285   type = strip_array_types (type);
6286   if (type == error_mark_node)
6287     return TYPE_UNQUALIFIED;
6288   return TYPE_QUALS (type);
6289 }
6290
6291 /* Returns nonzero if the TYPE contains a mutable member.  */
6292
6293 bool
6294 cp_has_mutable_p (tree type)
6295 {
6296   type = strip_array_types (type);
6297
6298   return CLASS_TYPE_P (type) && CLASSTYPE_HAS_MUTABLE (type);
6299 }
6300
6301 /* Subroutine of casts_away_constness.  Make T1 and T2 point at
6302    exemplar types such that casting T1 to T2 is casting away castness
6303    if and only if there is no implicit conversion from T1 to T2.  */
6304
6305 static void
6306 casts_away_constness_r (tree *t1, tree *t2)
6307 {
6308   int quals1;
6309   int quals2;
6310
6311   /* [expr.const.cast]
6312
6313      For multi-level pointer to members and multi-level mixed pointers
6314      and pointers to members (conv.qual), the "member" aspect of a
6315      pointer to member level is ignored when determining if a const
6316      cv-qualifier has been cast away.  */
6317   if (TYPE_PTRMEM_P (*t1))
6318     *t1 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t1));
6319   if (TYPE_PTRMEM_P (*t2))
6320     *t2 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t2));
6321
6322   /* [expr.const.cast]
6323
6324      For  two  pointer types:
6325
6326             X1 is T1cv1,1 * ... cv1,N *   where T1 is not a pointer type
6327             X2 is T2cv2,1 * ... cv2,M *   where T2 is not a pointer type
6328             K is min(N,M)
6329
6330      casting from X1 to X2 casts away constness if, for a non-pointer
6331      type T there does not exist an implicit conversion (clause
6332      _conv_) from:
6333
6334             Tcv1,(N-K+1) * cv1,(N-K+2) * ... cv1,N *
6335       
6336      to
6337
6338             Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *.  */
6339
6340   if (TREE_CODE (*t1) != POINTER_TYPE
6341       || TREE_CODE (*t2) != POINTER_TYPE)
6342     {
6343       *t1 = cp_build_qualified_type (void_type_node,
6344                                      cp_type_quals (*t1));
6345       *t2 = cp_build_qualified_type (void_type_node,
6346                                      cp_type_quals (*t2));
6347       return;
6348     }
6349   
6350   quals1 = cp_type_quals (*t1);
6351   quals2 = cp_type_quals (*t2);
6352   *t1 = TREE_TYPE (*t1);
6353   *t2 = TREE_TYPE (*t2);
6354   casts_away_constness_r (t1, t2);
6355   *t1 = build_pointer_type (*t1);
6356   *t2 = build_pointer_type (*t2);
6357   *t1 = cp_build_qualified_type (*t1, quals1);
6358   *t2 = cp_build_qualified_type (*t2, quals2);
6359 }
6360
6361 /* Returns nonzero if casting from TYPE1 to TYPE2 casts away
6362    constness.  */
6363
6364 static bool
6365 casts_away_constness (tree t1, tree t2)
6366 {
6367   if (TREE_CODE (t2) == REFERENCE_TYPE)
6368     {
6369       /* [expr.const.cast]
6370          
6371          Casting from an lvalue of type T1 to an lvalue of type T2
6372          using a reference cast casts away constness if a cast from an
6373          rvalue of type "pointer to T1" to the type "pointer to T2"
6374          casts away constness.  */
6375       t1 = (TREE_CODE (t1) == REFERENCE_TYPE ? TREE_TYPE (t1) : t1);
6376       return casts_away_constness (build_pointer_type (t1),
6377                                    build_pointer_type (TREE_TYPE (t2)));
6378     }
6379
6380   if (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
6381     /* [expr.const.cast]
6382        
6383        Casting from an rvalue of type "pointer to data member of X
6384        of type T1" to the type "pointer to data member of Y of type
6385        T2" casts away constness if a cast from an rvalue of type
6386        "pointer to T1" to the type "pointer to T2" casts away
6387        constness.  */
6388     return casts_away_constness
6389       (build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t1)),
6390        build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t2)));
6391
6392   /* Casting away constness is only something that makes sense for
6393      pointer or reference types.  */
6394   if (TREE_CODE (t1) != POINTER_TYPE 
6395       || TREE_CODE (t2) != POINTER_TYPE)
6396     return false;
6397
6398   /* Top-level qualifiers don't matter.  */
6399   t1 = TYPE_MAIN_VARIANT (t1);
6400   t2 = TYPE_MAIN_VARIANT (t2);
6401   casts_away_constness_r (&t1, &t2);
6402   if (!can_convert (t2, t1))
6403     return true;
6404
6405   return false;
6406 }
6407
6408 /* If T is a REFERENCE_TYPE return the type to which T refers.
6409    Otherwise, return T itself.  */
6410
6411 tree
6412 non_reference (tree t)
6413 {
6414   if (TREE_CODE (t) == REFERENCE_TYPE)
6415     t = TREE_TYPE (t);
6416   return t;
6417 }