OSDN Git Service

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