OSDN Git Service

PR c++/14586
[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                                                    /*overloaded_p=*/NULL),
1498                             build_unary_op (code, TREE_OPERAND (t, 0), 0),
1499                             build_unary_op (code, TREE_OPERAND (t, 1), 0));
1500     }
1501
1502   return
1503     build_conditional_expr (TREE_OPERAND (t, 0),
1504                             build_unary_op (code, TREE_OPERAND (t, 1), 0),
1505                             build_unary_op (code, TREE_OPERAND (t, 2), 0));
1506 }
1507
1508 /* Given the TYPE of an anonymous union field inside T, return the
1509    FIELD_DECL for the field.  If not found return NULL_TREE.  Because
1510    anonymous unions can nest, we must also search all anonymous unions
1511    that are directly reachable.  */
1512
1513 static tree
1514 lookup_anon_field (tree t, tree type)
1515 {
1516   tree field;
1517
1518   for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field))
1519     {
1520       if (TREE_STATIC (field))
1521         continue;
1522       if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
1523         continue;
1524
1525       /* If we find it directly, return the field.  */
1526       if (DECL_NAME (field) == NULL_TREE
1527           && type == TYPE_MAIN_VARIANT (TREE_TYPE (field)))
1528         {
1529           return field;
1530         }
1531
1532       /* Otherwise, it could be nested, search harder.  */
1533       if (DECL_NAME (field) == NULL_TREE
1534           && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
1535         {
1536           tree subfield = lookup_anon_field (TREE_TYPE (field), type);
1537           if (subfield)
1538             return subfield;
1539         }
1540     }
1541   return NULL_TREE;
1542 }
1543
1544 /* Build an expression representing OBJECT.MEMBER.  OBJECT is an
1545    expression; MEMBER is a DECL or baselink.  If ACCESS_PATH is
1546    non-NULL, it indicates the path to the base used to name MEMBER.
1547    If PRESERVE_REFERENCE is true, the expression returned will have
1548    REFERENCE_TYPE if the MEMBER does.  Otherwise, the expression
1549    returned will have the type referred to by the reference. 
1550
1551    This function does not perform access control; that is either done
1552    earlier by the parser when the name of MEMBER is resolved to MEMBER
1553    itself, or later when overload resolution selects one of the
1554    functions indicated by MEMBER.  */
1555
1556 tree
1557 build_class_member_access_expr (tree object, tree member, 
1558                                 tree access_path, bool preserve_reference)
1559 {
1560   tree object_type;
1561   tree member_scope;
1562   tree result = NULL_TREE;
1563
1564   if (object == error_mark_node || member == error_mark_node)
1565     return error_mark_node;
1566
1567   if (TREE_CODE (member) == PSEUDO_DTOR_EXPR)
1568     return member;
1569
1570   my_friendly_assert (DECL_P (member) || BASELINK_P (member),
1571                       20020801);
1572
1573   /* [expr.ref]
1574
1575      The type of the first expression shall be "class object" (of a
1576      complete type).  */
1577   object_type = TREE_TYPE (object);
1578   if (!currently_open_class (object_type) 
1579       && !complete_type_or_else (object_type, object))
1580     return error_mark_node;
1581   if (!CLASS_TYPE_P (object_type))
1582     {
1583       error ("request for member `%D' in `%E', which is of non-class type `%T'", 
1584              member, object, object_type);
1585       return error_mark_node;
1586     }
1587
1588   /* The standard does not seem to actually say that MEMBER must be a
1589      member of OBJECT_TYPE.  However, that is clearly what is
1590      intended.  */
1591   if (DECL_P (member))
1592     {
1593       member_scope = DECL_CLASS_CONTEXT (member);
1594       mark_used (member);
1595       if (TREE_DEPRECATED (member))
1596         warn_deprecated_use (member);
1597     }
1598   else
1599     member_scope = BINFO_TYPE (BASELINK_BINFO (member));
1600   /* If MEMBER is from an anonymous aggregate, MEMBER_SCOPE will
1601      presently be the anonymous union.  Go outwards until we find a
1602      type related to OBJECT_TYPE.  */
1603   while (ANON_AGGR_TYPE_P (member_scope)
1604          && !same_type_ignoring_top_level_qualifiers_p (member_scope,
1605                                                         object_type))
1606     member_scope = TYPE_CONTEXT (member_scope);
1607   if (!member_scope || !DERIVED_FROM_P (member_scope, object_type))
1608     {
1609       if (TREE_CODE (member) == FIELD_DECL)
1610         error ("invalid use of nonstatic data member '%E'", member);
1611       else
1612         error ("`%D' is not a member of `%T'", member, object_type);
1613       return error_mark_node;
1614     }
1615
1616   /* Transform `(a, b).x' into `(*(a, &b)).x', `(a ? b : c).x' into
1617      `(*(a ?  &b : &c)).x', and so on.  A COND_EXPR is only an lvalue
1618      in the frontend; only _DECLs and _REFs are lvalues in the backend.  */
1619   {
1620     tree temp = unary_complex_lvalue (ADDR_EXPR, object);
1621     if (temp)
1622       object = build_indirect_ref (temp, NULL);
1623   }
1624
1625   /* In [expr.ref], there is an explicit list of the valid choices for
1626      MEMBER.  We check for each of those cases here.  */
1627   if (TREE_CODE (member) == VAR_DECL)
1628     {
1629       /* A static data member.  */
1630       result = member;
1631       /* If OBJECT has side-effects, they are supposed to occur.  */
1632       if (TREE_SIDE_EFFECTS (object))
1633         result = build (COMPOUND_EXPR, TREE_TYPE (result), object, result);
1634     }
1635   else if (TREE_CODE (member) == FIELD_DECL)
1636     {
1637       /* A non-static data member.  */
1638       bool null_object_p;
1639       int type_quals;
1640       tree member_type;
1641
1642       null_object_p = (TREE_CODE (object) == INDIRECT_REF
1643                        && integer_zerop (TREE_OPERAND (object, 0)));
1644
1645       /* Convert OBJECT to the type of MEMBER.  */
1646       if (!same_type_p (TYPE_MAIN_VARIANT (object_type),
1647                         TYPE_MAIN_VARIANT (member_scope)))
1648         {
1649           tree binfo;
1650           base_kind kind;
1651
1652           binfo = lookup_base (access_path ? access_path : object_type,
1653                                member_scope, ba_ignore,  &kind);
1654           if (binfo == error_mark_node)
1655             return error_mark_node;
1656
1657           /* It is invalid to try to get to a virtual base of a
1658              NULL object.  The most common cause is invalid use of
1659              offsetof macro.  */
1660           if (null_object_p && kind == bk_via_virtual)
1661             {
1662               error ("invalid access to non-static data member `%D' of NULL object",
1663                      member);
1664               error ("(perhaps the `offsetof' macro was used incorrectly)");
1665               return error_mark_node;
1666             }
1667
1668           /* Convert to the base.  */
1669           object = build_base_path (PLUS_EXPR, object, binfo, 
1670                                     /*nonnull=*/1);
1671           /* If we found the base successfully then we should be able
1672              to convert to it successfully.  */
1673           my_friendly_assert (object != error_mark_node,
1674                               20020801);
1675         }
1676
1677       /* Complain about other invalid uses of offsetof, even though they will
1678          give the right answer.  Note that we complain whether or not they
1679          actually used the offsetof macro, since there's no way to know at this
1680          point.  So we just give a warning, instead of a pedwarn.  */
1681       if (null_object_p && warn_invalid_offsetof
1682           && CLASSTYPE_NON_POD_P (object_type))
1683         {
1684           warning ("invalid access to non-static data member `%D' of NULL object", 
1685                    member);
1686           warning  ("(perhaps the `offsetof' macro was used incorrectly)");
1687         }
1688
1689       /* If MEMBER is from an anonymous aggregate, we have converted
1690          OBJECT so that it refers to the class containing the
1691          anonymous union.  Generate a reference to the anonymous union
1692          itself, and recur to find MEMBER.  */
1693       if (ANON_AGGR_TYPE_P (DECL_CONTEXT (member))
1694           /* When this code is called from build_field_call, the
1695              object already has the type of the anonymous union.
1696              That is because the COMPONENT_REF was already
1697              constructed, and was then disassembled before calling
1698              build_field_call.  After the function-call code is
1699              cleaned up, this waste can be eliminated.  */
1700           && (!same_type_ignoring_top_level_qualifiers_p 
1701               (TREE_TYPE (object), DECL_CONTEXT (member))))
1702         {
1703           tree anonymous_union;
1704
1705           anonymous_union = lookup_anon_field (TREE_TYPE (object),
1706                                                DECL_CONTEXT (member));
1707           object = build_class_member_access_expr (object,
1708                                                    anonymous_union,
1709                                                    /*access_path=*/NULL_TREE,
1710                                                    preserve_reference);
1711         }
1712
1713       /* Compute the type of the field, as described in [expr.ref].  */
1714       type_quals = TYPE_UNQUALIFIED;
1715       member_type = TREE_TYPE (member);
1716       if (TREE_CODE (member_type) != REFERENCE_TYPE)
1717         {
1718           type_quals = (cp_type_quals (member_type)  
1719                         | cp_type_quals (object_type));
1720           
1721           /* A field is const (volatile) if the enclosing object, or the
1722              field itself, is const (volatile).  But, a mutable field is
1723              not const, even within a const object.  */
1724           if (DECL_MUTABLE_P (member))
1725             type_quals &= ~TYPE_QUAL_CONST;
1726           member_type = cp_build_qualified_type (member_type, type_quals);
1727         }
1728
1729       result = fold (build (COMPONENT_REF, member_type, object, member));
1730
1731       /* Mark the expression const or volatile, as appropriate.  Even
1732          though we've dealt with the type above, we still have to mark the
1733          expression itself.  */
1734       if (type_quals & TYPE_QUAL_CONST)
1735         TREE_READONLY (result) = 1;
1736       else if (type_quals & TYPE_QUAL_VOLATILE)
1737         TREE_THIS_VOLATILE (result) = 1;
1738     }
1739   else if (BASELINK_P (member))
1740     {
1741       /* The member is a (possibly overloaded) member function.  */
1742       tree functions;
1743       tree type;
1744
1745       /* If the MEMBER is exactly one static member function, then we
1746          know the type of the expression.  Otherwise, we must wait
1747          until overload resolution has been performed.  */
1748       functions = BASELINK_FUNCTIONS (member);
1749       if (TREE_CODE (functions) == FUNCTION_DECL
1750           && DECL_STATIC_FUNCTION_P (functions))
1751         type = TREE_TYPE (functions);
1752       else
1753         type = unknown_type_node;
1754       /* Note that we do not convert OBJECT to the BASELINK_BINFO
1755          base.  That will happen when the function is called.  */
1756       result = build (COMPONENT_REF, type, object, member);
1757     }
1758   else if (TREE_CODE (member) == CONST_DECL)
1759     {
1760       /* The member is an enumerator.  */
1761       result = member;
1762       /* If OBJECT has side-effects, they are supposed to occur.  */
1763       if (TREE_SIDE_EFFECTS (object))
1764         result = build (COMPOUND_EXPR, TREE_TYPE (result),
1765                         object, result);
1766     }
1767   else
1768     {
1769       error ("invalid use of `%D'", member);
1770       return error_mark_node;
1771     }
1772
1773   if (!preserve_reference)
1774     /* [expr.ref]
1775        
1776        If E2 is declared to have type "reference to T", then ... the
1777        type of E1.E2 is T.  */
1778     result = convert_from_reference (result);
1779
1780   return result;
1781 }
1782
1783 /* Return the destructor denoted by OBJECT.SCOPE::~DTOR_NAME, or, if
1784    SCOPE is NULL, by OBJECT.~DTOR_NAME.  */
1785
1786 static tree
1787 lookup_destructor (tree object, tree scope, tree dtor_name)
1788 {
1789   tree object_type = TREE_TYPE (object);
1790   tree dtor_type = TREE_OPERAND (dtor_name, 0);
1791
1792   if (scope && !check_dtor_name (scope, dtor_name))
1793     {
1794       error ("qualified type `%T' does not match destructor name `~%T'",
1795              scope, dtor_type);
1796       return error_mark_node;
1797     }
1798   if (!same_type_p (dtor_type, TYPE_MAIN_VARIANT (object_type)))
1799     {
1800       error ("the type being destroyed is `%T', but the destructor refers to `%T'",
1801              TYPE_MAIN_VARIANT (object_type), dtor_type);
1802       return error_mark_node;
1803     }
1804   if (!TYPE_HAS_DESTRUCTOR (object_type))
1805     return build (PSEUDO_DTOR_EXPR, void_type_node, object, scope,
1806                   dtor_type);
1807   return lookup_member (object_type, complete_dtor_identifier,
1808                         /*protect=*/1, /*want_type=*/false);
1809 }
1810
1811 /* This function is called by the parser to process a class member
1812    access expression of the form OBJECT.NAME.  NAME is a node used by
1813    the parser to represent a name; it is not yet a DECL.  It may,
1814    however, be a BASELINK where the BASELINK_FUNCTIONS is a
1815    TEMPLATE_ID_EXPR.  Templates must be looked up by the parser, and
1816    there is no reason to do the lookup twice, so the parser keeps the
1817    BASELINK.  */
1818
1819 tree
1820 finish_class_member_access_expr (tree object, tree name)
1821 {
1822   tree expr;
1823   tree object_type;
1824   tree member;
1825   tree access_path = NULL_TREE;
1826   tree orig_object = object;
1827   tree orig_name = name;
1828
1829   if (object == error_mark_node || name == error_mark_node)
1830     return error_mark_node;
1831
1832   object_type = TREE_TYPE (object);
1833
1834   if (processing_template_decl)
1835     {
1836       if (/* If OBJECT_TYPE is dependent, so is OBJECT.NAME.  */
1837           dependent_type_p (object_type)
1838           /* If NAME is just an IDENTIFIER_NODE, then the expression
1839              is dependent.  */
1840           || TREE_CODE (object) == IDENTIFIER_NODE
1841           /* If NAME is "f<args>", where either 'f' or 'args' is
1842              dependent, then the expression is dependent.  */
1843           || (TREE_CODE (name) == TEMPLATE_ID_EXPR
1844               && dependent_template_id_p (TREE_OPERAND (name, 0),
1845                                           TREE_OPERAND (name, 1)))
1846           /* If NAME is "T::X" where "T" is dependent, then the
1847              expression is dependent.  */
1848           || (TREE_CODE (name) == SCOPE_REF
1849               && TYPE_P (TREE_OPERAND (name, 0))
1850               && dependent_type_p (TREE_OPERAND (name, 0))))
1851         return build_min_nt (COMPONENT_REF, object, name);
1852       object = build_non_dependent_expr (object);
1853     }
1854   
1855   if (TREE_CODE (object_type) == REFERENCE_TYPE)
1856     {
1857       object = convert_from_reference (object);
1858       object_type = TREE_TYPE (object);
1859     }
1860
1861   /* [expr.ref]
1862
1863      The type of the first expression shall be "class object" (of a
1864      complete type).  */
1865   if (!currently_open_class (object_type) 
1866       && !complete_type_or_else (object_type, object))
1867     return error_mark_node;
1868   if (!CLASS_TYPE_P (object_type))
1869     {
1870       error ("request for member `%D' in `%E', which is of non-class type `%T'", 
1871              name, object, object_type);
1872       return error_mark_node;
1873     }
1874
1875   if (BASELINK_P (name))
1876     {
1877       /* A member function that has already been looked up.  */
1878       my_friendly_assert ((TREE_CODE (BASELINK_FUNCTIONS (name)) 
1879                            == TEMPLATE_ID_EXPR), 
1880                           20020805);
1881       member = name;
1882     }
1883   else
1884     {
1885       bool is_template_id = false;
1886       tree template_args = NULL_TREE;
1887       tree scope;
1888
1889       if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
1890         {
1891           is_template_id = true;
1892           template_args = TREE_OPERAND (name, 1);
1893           name = TREE_OPERAND (name, 0);
1894
1895           if (TREE_CODE (name) == OVERLOAD)
1896             name = DECL_NAME (get_first_fn (name));
1897           else if (DECL_P (name))
1898             name = DECL_NAME (name);
1899         }
1900
1901       if (TREE_CODE (name) == SCOPE_REF)
1902         {
1903           /* A qualified name.  The qualifying class or namespace `S' has
1904              already been looked up; it is either a TYPE or a
1905              NAMESPACE_DECL.  The member name is either an IDENTIFIER_NODE
1906              or a BIT_NOT_EXPR.  */
1907           scope = TREE_OPERAND (name, 0);
1908           name = TREE_OPERAND (name, 1);
1909           my_friendly_assert ((CLASS_TYPE_P (scope) 
1910                                || TREE_CODE (scope) == NAMESPACE_DECL),
1911                               20020804);
1912           my_friendly_assert ((TREE_CODE (name) == IDENTIFIER_NODE
1913                                || TREE_CODE (name) == BIT_NOT_EXPR),
1914                               20020804);
1915
1916           /* If SCOPE is a namespace, then the qualified name does not
1917              name a member of OBJECT_TYPE.  */
1918           if (TREE_CODE (scope) == NAMESPACE_DECL)
1919             {
1920               error ("`%D::%D' is not a member of `%T'", 
1921                      scope, name, object_type);
1922               return error_mark_node;
1923             }
1924
1925           /* Find the base of OBJECT_TYPE corresponding to SCOPE.  */
1926           access_path = lookup_base (object_type, scope, ba_check, NULL);
1927           if (access_path == error_mark_node)
1928             return error_mark_node;
1929           if (!access_path)
1930             {
1931               error ("`%T' is not a base of `%T'", scope, object_type);
1932               return error_mark_node;
1933             }
1934         }
1935       else
1936         {
1937           scope = NULL_TREE;
1938           access_path = object_type;
1939         }
1940
1941       if (TREE_CODE (name) == BIT_NOT_EXPR)
1942         member = lookup_destructor (object, scope, name);
1943       else
1944         {
1945           /* Look up the member.  */
1946           member = lookup_member (access_path, name, /*protect=*/1, 
1947                                   /*want_type=*/false);
1948           if (member == NULL_TREE)
1949             {
1950               error ("'%D' has no member named '%E'", object_type, name);
1951               return error_mark_node;
1952             }
1953           if (member == error_mark_node)
1954             return error_mark_node;
1955         }
1956       
1957       if (is_template_id)
1958         {
1959           tree template = member;
1960           
1961           if (BASELINK_P (template))
1962             template = lookup_template_function (template, template_args);
1963           else
1964             {
1965               error ("`%D' is not a member template function", name);
1966               return error_mark_node;
1967             }
1968         }
1969     }
1970
1971   if (TREE_DEPRECATED (member))
1972     warn_deprecated_use (member);
1973
1974   expr = build_class_member_access_expr (object, member, access_path,
1975                                          /*preserve_reference=*/false);
1976   if (processing_template_decl && expr != error_mark_node)
1977     return build_min_non_dep (COMPONENT_REF, expr,
1978                               orig_object, orig_name);
1979   return expr;
1980 }
1981
1982 /* Return an expression for the MEMBER_NAME field in the internal
1983    representation of PTRMEM, a pointer-to-member function.  (Each
1984    pointer-to-member function type gets its own RECORD_TYPE so it is
1985    more convenient to access the fields by name than by FIELD_DECL.)
1986    This routine converts the NAME to a FIELD_DECL and then creates the
1987    node for the complete expression.  */
1988
1989 tree
1990 build_ptrmemfunc_access_expr (tree ptrmem, tree member_name)
1991 {
1992   tree ptrmem_type;
1993   tree member;
1994   tree member_type;
1995
1996   /* This code is a stripped down version of
1997      build_class_member_access_expr.  It does not work to use that
1998      routine directly because it expects the object to be of class
1999      type.  */
2000   ptrmem_type = TREE_TYPE (ptrmem);
2001   my_friendly_assert (TYPE_PTRMEMFUNC_P (ptrmem_type), 20020804);
2002   member = lookup_member (ptrmem_type, member_name, /*protect=*/0,
2003                           /*want_type=*/false);
2004   member_type = cp_build_qualified_type (TREE_TYPE (member),
2005                                          cp_type_quals (ptrmem_type));
2006   return fold (build (COMPONENT_REF, member_type, ptrmem, member));
2007 }
2008
2009 /* Given an expression PTR for a pointer, return an expression
2010    for the value pointed to.
2011    ERRORSTRING is the name of the operator to appear in error messages.
2012
2013    This function may need to overload OPERATOR_FNNAME.
2014    Must also handle REFERENCE_TYPEs for C++.  */
2015
2016 tree
2017 build_x_indirect_ref (tree expr, const char *errorstring)
2018 {
2019   tree orig_expr = expr;
2020   tree rval;
2021
2022   if (processing_template_decl)
2023     {
2024       if (type_dependent_expression_p (expr))
2025         return build_min_nt (INDIRECT_REF, expr);
2026       expr = build_non_dependent_expr (expr);
2027     }
2028
2029   rval = build_new_op (INDIRECT_REF, LOOKUP_NORMAL, expr, NULL_TREE,
2030                        NULL_TREE, /*overloaded_p=*/NULL);
2031   if (!rval)
2032     rval = build_indirect_ref (expr, errorstring);
2033
2034   if (processing_template_decl && rval != error_mark_node)
2035     return build_min_non_dep (INDIRECT_REF, rval, orig_expr);
2036   else
2037     return rval;
2038 }
2039
2040 tree
2041 build_indirect_ref (tree ptr, const char *errorstring)
2042 {
2043   tree pointer, type;
2044
2045   if (ptr == error_mark_node)
2046     return error_mark_node;
2047
2048   if (ptr == current_class_ptr)
2049     return current_class_ref;
2050
2051   pointer = (TREE_CODE (TREE_TYPE (ptr)) == REFERENCE_TYPE
2052              ? ptr : decay_conversion (ptr));
2053   type = TREE_TYPE (pointer);
2054
2055   if (TYPE_PTR_P (type) || TREE_CODE (type) == REFERENCE_TYPE)
2056     {
2057       /* [expr.unary.op]
2058          
2059          If the type of the expression is "pointer to T," the type
2060          of  the  result  is  "T."   
2061
2062          We must use the canonical variant because certain parts of
2063          the back end, like fold, do pointer comparisons between
2064          types.  */
2065       tree t = canonical_type_variant (TREE_TYPE (type));
2066
2067       if (VOID_TYPE_P (t))
2068         {
2069           /* A pointer to incomplete type (other than cv void) can be
2070              dereferenced [expr.unary.op]/1  */
2071           error ("`%T' is not a pointer-to-object type", type);
2072           return error_mark_node;
2073         }
2074       else if (TREE_CODE (pointer) == ADDR_EXPR
2075                && same_type_p (t, TREE_TYPE (TREE_OPERAND (pointer, 0))))
2076         /* The POINTER was something like `&x'.  We simplify `*&x' to
2077            `x'.  */
2078         return TREE_OPERAND (pointer, 0);
2079       else
2080         {
2081           tree ref = build1 (INDIRECT_REF, t, pointer);
2082
2083           /* We *must* set TREE_READONLY when dereferencing a pointer to const,
2084              so that we get the proper error message if the result is used
2085              to assign to.  Also, &* is supposed to be a no-op.  */
2086           TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
2087           TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
2088           TREE_SIDE_EFFECTS (ref)
2089             = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (pointer));
2090           return ref;
2091         }
2092     }
2093   /* `pointer' won't be an error_mark_node if we were given a
2094      pointer to member, so it's cool to check for this here.  */
2095   else if (TYPE_PTR_TO_MEMBER_P (type))
2096     error ("invalid use of `%s' on pointer to member", errorstring);
2097   else if (pointer != error_mark_node)
2098     {
2099       if (errorstring)
2100         error ("invalid type argument of `%s'", errorstring);
2101       else
2102         error ("invalid type argument");
2103     }
2104   return error_mark_node;
2105 }
2106
2107 /* This handles expressions of the form "a[i]", which denotes
2108    an array reference.
2109
2110    This is logically equivalent in C to *(a+i), but we may do it differently.
2111    If A is a variable or a member, we generate a primitive ARRAY_REF.
2112    This avoids forcing the array out of registers, and can work on
2113    arrays that are not lvalues (for example, members of structures returned
2114    by functions).
2115
2116    If INDEX is of some user-defined type, it must be converted to
2117    integer type.  Otherwise, to make a compatible PLUS_EXPR, it
2118    will inherit the type of the array, which will be some pointer type.  */
2119
2120 tree
2121 build_array_ref (tree array, tree idx)
2122 {
2123   if (idx == 0)
2124     {
2125       error ("subscript missing in array reference");
2126       return error_mark_node;
2127     }
2128
2129   if (TREE_TYPE (array) == error_mark_node
2130       || TREE_TYPE (idx) == error_mark_node)
2131     return error_mark_node;
2132
2133   /* If ARRAY is a COMPOUND_EXPR or COND_EXPR, move our reference
2134      inside it.  */
2135   switch (TREE_CODE (array))
2136     {
2137     case COMPOUND_EXPR:
2138       {
2139         tree value = build_array_ref (TREE_OPERAND (array, 1), idx);
2140         return build (COMPOUND_EXPR, TREE_TYPE (value),
2141                       TREE_OPERAND (array, 0), value);
2142       }
2143
2144     case COND_EXPR:
2145       return build_conditional_expr
2146         (TREE_OPERAND (array, 0),
2147          build_array_ref (TREE_OPERAND (array, 1), idx),
2148          build_array_ref (TREE_OPERAND (array, 2), idx));
2149
2150     default:
2151       break;
2152     }
2153
2154   if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE
2155       && TREE_CODE (array) != INDIRECT_REF)
2156     {
2157       tree rval, type;
2158
2159       /* Subscripting with type char is likely to lose
2160          on a machine where chars are signed.
2161          So warn on any machine, but optionally.
2162          Don't warn for unsigned char since that type is safe.
2163          Don't warn for signed char because anyone who uses that
2164          must have done so deliberately.  */
2165       if (warn_char_subscripts
2166           && TYPE_MAIN_VARIANT (TREE_TYPE (idx)) == char_type_node)
2167         warning ("array subscript has type `char'");
2168
2169       if (!INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (idx)))
2170         {
2171           error ("array subscript is not an integer");
2172           return error_mark_node;
2173         }
2174
2175       /* Apply integral promotions *after* noticing character types.
2176          (It is unclear why we do these promotions -- the standard
2177          does not say that we should.  In fact, the natual thing would
2178          seem to be to convert IDX to ptrdiff_t; we're performing
2179          pointer arithmetic.)  */
2180       idx = perform_integral_promotions (idx);
2181
2182       /* An array that is indexed by a non-constant
2183          cannot be stored in a register; we must be able to do
2184          address arithmetic on its address.
2185          Likewise an array of elements of variable size.  */
2186       if (TREE_CODE (idx) != INTEGER_CST
2187           || (COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (array)))
2188               && (TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))))
2189                   != INTEGER_CST)))
2190         {
2191           if (!cxx_mark_addressable (array))
2192             return error_mark_node;
2193         }
2194
2195       /* An array that is indexed by a constant value which is not within
2196          the array bounds cannot be stored in a register either; because we
2197          would get a crash in store_bit_field/extract_bit_field when trying
2198          to access a non-existent part of the register.  */
2199       if (TREE_CODE (idx) == INTEGER_CST
2200           && TYPE_VALUES (TREE_TYPE (array))
2201           && ! int_fits_type_p (idx, TYPE_VALUES (TREE_TYPE (array))))
2202         {
2203           if (!cxx_mark_addressable (array))
2204             return error_mark_node;
2205         }
2206
2207       if (pedantic && !lvalue_p (array))
2208         pedwarn ("ISO C++ forbids subscripting non-lvalue array");
2209
2210       /* Note in C++ it is valid to subscript a `register' array, since
2211          it is valid to take the address of something with that
2212          storage specification.  */
2213       if (extra_warnings)
2214         {
2215           tree foo = array;
2216           while (TREE_CODE (foo) == COMPONENT_REF)
2217             foo = TREE_OPERAND (foo, 0);
2218           if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo))
2219             warning ("subscripting array declared `register'");
2220         }
2221
2222       type = TREE_TYPE (TREE_TYPE (array));
2223       rval = build (ARRAY_REF, type, array, idx);
2224       /* Array ref is const/volatile if the array elements are
2225          or if the array is..  */
2226       TREE_READONLY (rval)
2227         |= (CP_TYPE_CONST_P (type) | TREE_READONLY (array));
2228       TREE_SIDE_EFFECTS (rval)
2229         |= (CP_TYPE_VOLATILE_P (type) | TREE_SIDE_EFFECTS (array));
2230       TREE_THIS_VOLATILE (rval)
2231         |= (CP_TYPE_VOLATILE_P (type) | TREE_THIS_VOLATILE (array));
2232       return require_complete_type (fold (rval));
2233     }
2234
2235   {
2236     tree ar = default_conversion (array);
2237     tree ind = default_conversion (idx);
2238
2239     /* Put the integer in IND to simplify error checking.  */
2240     if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE)
2241       {
2242         tree temp = ar;
2243         ar = ind;
2244         ind = temp;
2245       }
2246
2247     if (ar == error_mark_node)
2248       return ar;
2249
2250     if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE)
2251       {
2252         error ("subscripted value is neither array nor pointer");
2253         return error_mark_node;
2254       }
2255     if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
2256       {
2257         error ("array subscript is not an integer");
2258         return error_mark_node;
2259       }
2260
2261     return build_indirect_ref (cp_build_binary_op (PLUS_EXPR, ar, ind),
2262                                "array indexing");
2263   }
2264 }
2265 \f
2266 /* Resolve a pointer to member function.  INSTANCE is the object
2267    instance to use, if the member points to a virtual member.
2268
2269    This used to avoid checking for virtual functions if basetype
2270    has no virtual functions, according to an earlier ANSI draft.
2271    With the final ISO C++ rules, such an optimization is
2272    incorrect: A pointer to a derived member can be static_cast
2273    to pointer-to-base-member, as long as the dynamic object
2274    later has the right member.  */
2275
2276 tree
2277 get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function)
2278 {
2279   if (TREE_CODE (function) == OFFSET_REF)
2280     function = TREE_OPERAND (function, 1);
2281
2282   if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function)))
2283     {
2284       tree idx, delta, e1, e2, e3, vtbl, basetype;
2285       tree fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function));
2286
2287       tree instance_ptr = *instance_ptrptr;
2288       tree instance_save_expr = 0;
2289       if (instance_ptr == error_mark_node)
2290         {
2291           if (TREE_CODE (function) == PTRMEM_CST)
2292             {
2293               /* Extracting the function address from a pmf is only
2294                  allowed with -Wno-pmf-conversions. It only works for
2295                  pmf constants.  */
2296               e1 = build_addr_func (PTRMEM_CST_MEMBER (function));
2297               e1 = convert (fntype, e1);
2298               return e1;
2299             }
2300           else
2301             {
2302               error ("object missing in use of `%E'", function);
2303               return error_mark_node;
2304             }
2305         }
2306
2307       if (TREE_SIDE_EFFECTS (instance_ptr))
2308         instance_ptr = instance_save_expr = save_expr (instance_ptr);
2309
2310       if (TREE_SIDE_EFFECTS (function))
2311         function = save_expr (function);
2312
2313       /* Start by extracting all the information from the PMF itself.  */
2314       e3 = PFN_FROM_PTRMEMFUNC (function);
2315       delta = build_ptrmemfunc_access_expr (function, delta_identifier);
2316       idx = build1 (NOP_EXPR, vtable_index_type, e3);
2317       switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
2318         {
2319         case ptrmemfunc_vbit_in_pfn:
2320           e1 = cp_build_binary_op (BIT_AND_EXPR, idx, integer_one_node);
2321           idx = cp_build_binary_op (MINUS_EXPR, idx, integer_one_node);
2322           break;
2323
2324         case ptrmemfunc_vbit_in_delta:
2325           e1 = cp_build_binary_op (BIT_AND_EXPR, delta, integer_one_node);
2326           delta = cp_build_binary_op (RSHIFT_EXPR, delta, integer_one_node);
2327           break;
2328
2329         default:
2330           abort ();
2331         }
2332
2333       /* Convert down to the right base before using the instance.  First
2334          use the type...  */
2335       basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype));
2336       basetype = lookup_base (TREE_TYPE (TREE_TYPE (instance_ptr)),
2337                               basetype, ba_check, NULL);
2338       instance_ptr = build_base_path (PLUS_EXPR, instance_ptr, basetype, 1);
2339       if (instance_ptr == error_mark_node)
2340         return error_mark_node;
2341       /* ...and then the delta in the PMF.  */
2342       instance_ptr = build (PLUS_EXPR, TREE_TYPE (instance_ptr),
2343                             instance_ptr, delta);
2344
2345       /* Hand back the adjusted 'this' argument to our caller.  */
2346       *instance_ptrptr = instance_ptr;
2347
2348       /* Next extract the vtable pointer from the object.  */
2349       vtbl = build1 (NOP_EXPR, build_pointer_type (vtbl_ptr_type_node),
2350                      instance_ptr);
2351       vtbl = build_indirect_ref (vtbl, NULL);
2352
2353       /* Finally, extract the function pointer from the vtable.  */
2354       e2 = fold (build (PLUS_EXPR, TREE_TYPE (vtbl), vtbl, idx));
2355       e2 = build_indirect_ref (e2, NULL);
2356       TREE_CONSTANT (e2) = 1;
2357
2358       /* When using function descriptors, the address of the
2359          vtable entry is treated as a function pointer.  */
2360       if (TARGET_VTABLE_USES_DESCRIPTORS)
2361         e2 = build1 (NOP_EXPR, TREE_TYPE (e2),
2362                      build_unary_op (ADDR_EXPR, e2, /*noconvert=*/1));
2363
2364       TREE_TYPE (e2) = TREE_TYPE (e3);
2365       e1 = build_conditional_expr (e1, e2, e3);
2366       
2367       /* Make sure this doesn't get evaluated first inside one of the
2368          branches of the COND_EXPR.  */
2369       if (instance_save_expr)
2370         e1 = build (COMPOUND_EXPR, TREE_TYPE (e1),
2371                     instance_save_expr, e1);
2372
2373       function = e1;
2374     }
2375   return function;
2376 }
2377
2378 tree
2379 build_function_call (tree function, tree params)
2380 {
2381   tree fntype, fndecl;
2382   tree coerced_params;
2383   tree result;
2384   tree name = NULL_TREE;
2385   int is_method;
2386   tree original = function;
2387
2388   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2389      Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context.  */
2390   if (TREE_CODE (function) == NOP_EXPR
2391       && TREE_TYPE (function) == TREE_TYPE (TREE_OPERAND (function, 0)))
2392     function = TREE_OPERAND (function, 0);
2393
2394   if (TREE_CODE (function) == FUNCTION_DECL)
2395     {
2396       name = DECL_NAME (function);
2397
2398       mark_used (function);
2399       fndecl = function;
2400
2401       /* Convert anything with function type to a pointer-to-function.  */
2402       if (pedantic && DECL_MAIN_P (function))
2403         pedwarn ("ISO C++ forbids calling `::main' from within program");
2404
2405       /* Differs from default_conversion by not setting TREE_ADDRESSABLE
2406          (because calling an inline function does not mean the function
2407          needs to be separately compiled).  */
2408       
2409       if (DECL_INLINE (function))
2410         function = inline_conversion (function);
2411       else
2412         function = build_addr_func (function);
2413     }
2414   else
2415     {
2416       fndecl = NULL_TREE;
2417
2418       function = build_addr_func (function);
2419     }
2420
2421   if (function == error_mark_node)
2422     return error_mark_node;
2423
2424   fntype = TREE_TYPE (function);
2425
2426   if (TYPE_PTRMEMFUNC_P (fntype))
2427     {
2428       error ("must use .* or ->* to call pointer-to-member function in `%E (...)'",
2429                 original);
2430       return error_mark_node;
2431     }
2432
2433   is_method = (TREE_CODE (fntype) == POINTER_TYPE
2434                && TREE_CODE (TREE_TYPE (fntype)) == METHOD_TYPE);
2435
2436   if (!((TREE_CODE (fntype) == POINTER_TYPE
2437          && TREE_CODE (TREE_TYPE (fntype)) == FUNCTION_TYPE)
2438         || is_method
2439         || TREE_CODE (function) == TEMPLATE_ID_EXPR))
2440     {
2441       error ("`%E' cannot be used as a function", original);
2442       return error_mark_node;
2443     }
2444
2445   /* fntype now gets the type of function pointed to.  */
2446   fntype = TREE_TYPE (fntype);
2447
2448   /* Convert the parameters to the types declared in the
2449      function prototype, or apply default promotions.  */
2450
2451   coerced_params = convert_arguments (TYPE_ARG_TYPES (fntype),
2452                                       params, fndecl, LOOKUP_NORMAL);
2453   if (coerced_params == error_mark_node)
2454     return error_mark_node;
2455
2456   /* Check for errors in format strings.  */
2457
2458   if (warn_format)
2459     check_function_format (NULL, TYPE_ATTRIBUTES (fntype), coerced_params);
2460
2461   /* Recognize certain built-in functions so we can make tree-codes
2462      other than CALL_EXPR.  We do this when it enables fold-const.c
2463      to do something useful.  */
2464
2465   if (TREE_CODE (function) == ADDR_EXPR
2466       && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL
2467       && DECL_BUILT_IN (TREE_OPERAND (function, 0)))
2468     {
2469       result = expand_tree_builtin (TREE_OPERAND (function, 0),
2470                                     params, coerced_params);
2471       if (result)
2472         return result;
2473     }
2474
2475   return build_cxx_call (function, params, coerced_params);
2476 }
2477 \f
2478 /* Convert the actual parameter expressions in the list VALUES
2479    to the types in the list TYPELIST.
2480    If parmdecls is exhausted, or when an element has NULL as its type,
2481    perform the default conversions.
2482
2483    NAME is an IDENTIFIER_NODE or 0.  It is used only for error messages.
2484
2485    This is also where warnings about wrong number of args are generated.
2486    
2487    Return a list of expressions for the parameters as converted.
2488
2489    Both VALUES and the returned value are chains of TREE_LIST nodes
2490    with the elements of the list in the TREE_VALUE slots of those nodes.
2491
2492    In C++, unspecified trailing parameters can be filled in with their
2493    default arguments, if such were specified.  Do so here.  */
2494
2495 tree
2496 convert_arguments (tree typelist, tree values, tree fndecl, int flags)
2497 {
2498   tree typetail, valtail;
2499   tree result = NULL_TREE;
2500   const char *called_thing = 0;
2501   int i = 0;
2502
2503   /* Argument passing is always copy-initialization.  */
2504   flags |= LOOKUP_ONLYCONVERTING;
2505
2506   if (fndecl)
2507     {
2508       if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
2509         {
2510           if (DECL_NAME (fndecl) == NULL_TREE
2511               || IDENTIFIER_HAS_TYPE_VALUE (DECL_NAME (fndecl)))
2512             called_thing = "constructor";
2513           else
2514             called_thing = "member function";
2515         }
2516       else
2517         called_thing = "function";
2518     }
2519
2520   for (valtail = values, typetail = typelist;
2521        valtail;
2522        valtail = TREE_CHAIN (valtail), i++)
2523     {
2524       tree type = typetail ? TREE_VALUE (typetail) : 0;
2525       tree val = TREE_VALUE (valtail);
2526
2527       if (val == error_mark_node)
2528         return error_mark_node;
2529
2530       if (type == void_type_node)
2531         {
2532           if (fndecl)
2533             {
2534               cp_error_at ("too many arguments to %s `%+#D'", called_thing,
2535                            fndecl);
2536               error ("at this point in file");
2537             }
2538           else
2539             error ("too many arguments to function");
2540           /* In case anybody wants to know if this argument
2541              list is valid.  */
2542           if (result)
2543             TREE_TYPE (tree_last (result)) = error_mark_node;
2544           break;
2545         }
2546
2547       /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2548          Strip such NOP_EXPRs, since VAL is used in non-lvalue context.  */
2549       if (TREE_CODE (val) == NOP_EXPR
2550           && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))
2551           && (type == 0 || TREE_CODE (type) != REFERENCE_TYPE))
2552         val = TREE_OPERAND (val, 0);
2553
2554       if (type == 0 || TREE_CODE (type) != REFERENCE_TYPE)
2555         {
2556           if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE
2557               || TREE_CODE (TREE_TYPE (val)) == FUNCTION_TYPE
2558               || TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE)
2559             val = decay_conversion (val);
2560         }
2561
2562       if (val == error_mark_node)
2563         return error_mark_node;
2564
2565       if (type != 0)
2566         {
2567           /* Formal parm type is specified by a function prototype.  */
2568           tree parmval;
2569
2570           if (!COMPLETE_TYPE_P (complete_type (type)))
2571             {
2572               if (fndecl)
2573                 error ("parameter %P of `%D' has incomplete type `%T'",
2574                        i, fndecl, type);
2575               else
2576                 error ("parameter %P has incomplete type `%T'", i, type);
2577               parmval = error_mark_node;
2578             }
2579           else
2580             {
2581               parmval = convert_for_initialization
2582                 (NULL_TREE, type, val, flags,
2583                  "argument passing", fndecl, i);
2584               parmval = convert_for_arg_passing (type, parmval);
2585             }
2586
2587           if (parmval == error_mark_node)
2588             return error_mark_node;
2589
2590           result = tree_cons (NULL_TREE, parmval, result);
2591         }
2592       else
2593         {
2594           if (TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE)
2595             val = convert_from_reference (val);
2596
2597           if (fndecl && DECL_BUILT_IN (fndecl)
2598               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P)
2599             /* Don't do ellipsis conversion for __built_in_constant_p
2600                as this will result in spurious warnings for non-POD
2601                types.  */
2602             val = require_complete_type (val);
2603           else
2604             val = convert_arg_to_ellipsis (val);
2605
2606           result = tree_cons (NULL_TREE, val, result);
2607         }
2608
2609       if (typetail)
2610         typetail = TREE_CHAIN (typetail);
2611     }
2612
2613   if (typetail != 0 && typetail != void_list_node)
2614     {
2615       /* See if there are default arguments that can be used.  */
2616       if (TREE_PURPOSE (typetail) 
2617           && TREE_CODE (TREE_PURPOSE (typetail)) != DEFAULT_ARG)
2618         {
2619           for (; typetail != void_list_node; ++i)
2620             {
2621               tree parmval 
2622                 = convert_default_arg (TREE_VALUE (typetail), 
2623                                        TREE_PURPOSE (typetail), 
2624                                        fndecl, i);
2625
2626               if (parmval == error_mark_node)
2627                 return error_mark_node;
2628
2629               result = tree_cons (0, parmval, result);
2630               typetail = TREE_CHAIN (typetail);
2631               /* ends with `...'.  */
2632               if (typetail == NULL_TREE)
2633                 break;
2634             }
2635         }
2636       else
2637         {
2638           if (fndecl)
2639             {
2640               cp_error_at ("too few arguments to %s `%+#D'",
2641                            called_thing, fndecl);
2642               error ("at this point in file");
2643             }
2644           else
2645             error ("too few arguments to function");
2646           return error_mark_list;
2647         }
2648     }
2649
2650   return nreverse (result);
2651 }
2652 \f
2653 /* Build a binary-operation expression, after performing default
2654    conversions on the operands.  CODE is the kind of expression to build.  */
2655
2656 tree
2657 build_x_binary_op (enum tree_code code, tree arg1, tree arg2, 
2658                    bool *overloaded_p)
2659 {
2660   tree orig_arg1;
2661   tree orig_arg2;
2662   tree expr;
2663
2664   orig_arg1 = arg1;
2665   orig_arg2 = arg2;
2666
2667   if (processing_template_decl)
2668     {
2669       if (type_dependent_expression_p (arg1)
2670           || type_dependent_expression_p (arg2))
2671         return build_min_nt (code, arg1, arg2);
2672       arg1 = build_non_dependent_expr (arg1);
2673       arg2 = build_non_dependent_expr (arg2);
2674     }
2675
2676   if (code == DOTSTAR_EXPR)
2677     expr = build_m_component_ref (arg1, arg2);
2678   else
2679     expr = build_new_op (code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE, 
2680                          overloaded_p);
2681
2682   if (processing_template_decl && expr != error_mark_node)
2683     return build_min_non_dep (code, expr, orig_arg1, orig_arg2);
2684   
2685   return expr;
2686 }
2687
2688 /* Build a binary-operation expression without default conversions.
2689    CODE is the kind of expression to build.
2690    This function differs from `build' in several ways:
2691    the data type of the result is computed and recorded in it,
2692    warnings are generated if arg data types are invalid,
2693    special handling for addition and subtraction of pointers is known,
2694    and some optimization is done (operations on narrow ints
2695    are done in the narrower type when that gives the same result).
2696    Constant folding is also done before the result is returned.
2697
2698    Note that the operands will never have enumeral types
2699    because either they have just had the default conversions performed
2700    or they have both just been converted to some other type in which
2701    the arithmetic is to be done.
2702
2703    C++: must do special pointer arithmetic when implementing
2704    multiple inheritance, and deal with pointer to member functions.  */
2705
2706 tree
2707 build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
2708                  int convert_p ATTRIBUTE_UNUSED)
2709 {
2710   tree op0, op1;
2711   enum tree_code code0, code1;
2712   tree type0, type1;
2713
2714   /* Expression code to give to the expression when it is built.
2715      Normally this is CODE, which is what the caller asked for,
2716      but in some special cases we change it.  */
2717   enum tree_code resultcode = code;
2718
2719   /* Data type in which the computation is to be performed.
2720      In the simplest cases this is the common type of the arguments.  */
2721   tree result_type = NULL;
2722
2723   /* Nonzero means operands have already been type-converted
2724      in whatever way is necessary.
2725      Zero means they need to be converted to RESULT_TYPE.  */
2726   int converted = 0;
2727
2728   /* Nonzero means create the expression with this type, rather than
2729      RESULT_TYPE.  */
2730   tree build_type = 0;
2731
2732   /* Nonzero means after finally constructing the expression
2733      convert it to this type.  */
2734   tree final_type = 0;
2735
2736   /* Nonzero if this is an operation like MIN or MAX which can
2737      safely be computed in short if both args are promoted shorts.
2738      Also implies COMMON.
2739      -1 indicates a bitwise operation; this makes a difference
2740      in the exact conditions for when it is safe to do the operation
2741      in a narrower mode.  */
2742   int shorten = 0;
2743
2744   /* Nonzero if this is a comparison operation;
2745      if both args are promoted shorts, compare the original shorts.
2746      Also implies COMMON.  */
2747   int short_compare = 0;
2748
2749   /* Nonzero if this is a right-shift operation, which can be computed on the
2750      original short and then promoted if the operand is a promoted short.  */
2751   int short_shift = 0;
2752
2753   /* Nonzero means set RESULT_TYPE to the common type of the args.  */
2754   int common = 0;
2755
2756   /* Apply default conversions.  */
2757   op0 = orig_op0;
2758   op1 = orig_op1;
2759   
2760   if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
2761       || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
2762       || code == TRUTH_XOR_EXPR)
2763     {
2764       if (!really_overloaded_fn (op0))
2765         op0 = decay_conversion (op0);
2766       if (!really_overloaded_fn (op1))
2767         op1 = decay_conversion (op1);
2768     }
2769   else
2770     {
2771       if (!really_overloaded_fn (op0))
2772         op0 = default_conversion (op0);
2773       if (!really_overloaded_fn (op1))
2774         op1 = default_conversion (op1);
2775     }
2776
2777   /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue.  */
2778   STRIP_TYPE_NOPS (op0);
2779   STRIP_TYPE_NOPS (op1);
2780
2781   /* DTRT if one side is an overloaded function, but complain about it.  */
2782   if (type_unknown_p (op0))
2783     {
2784       tree t = instantiate_type (TREE_TYPE (op1), op0, tf_none);
2785       if (t != error_mark_node)
2786         {
2787           pedwarn ("assuming cast to type `%T' from overloaded function",
2788                       TREE_TYPE (t));
2789           op0 = t;
2790         }
2791     }
2792   if (type_unknown_p (op1))
2793     {
2794       tree t = instantiate_type (TREE_TYPE (op0), op1, tf_none);
2795       if (t != error_mark_node)
2796         {
2797           pedwarn ("assuming cast to type `%T' from overloaded function",
2798                       TREE_TYPE (t));
2799           op1 = t;
2800         }
2801     }
2802
2803   type0 = TREE_TYPE (op0);
2804   type1 = TREE_TYPE (op1);
2805
2806   /* The expression codes of the data types of the arguments tell us
2807      whether the arguments are integers, floating, pointers, etc.  */
2808   code0 = TREE_CODE (type0);
2809   code1 = TREE_CODE (type1);
2810
2811   /* If an error was already reported for one of the arguments,
2812      avoid reporting another error.  */
2813
2814   if (code0 == ERROR_MARK || code1 == ERROR_MARK)
2815     return error_mark_node;
2816
2817   switch (code)
2818     {
2819     case PLUS_EXPR:
2820       /* Handle the pointer + int case.  */
2821       if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
2822         return cp_pointer_int_sum (PLUS_EXPR, op0, op1);
2823       else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE)
2824         return cp_pointer_int_sum (PLUS_EXPR, op1, op0);
2825       else
2826         common = 1;
2827       break;
2828
2829     case MINUS_EXPR:
2830       /* Subtraction of two similar pointers.
2831          We must subtract them as integers, then divide by object size.  */
2832       if (code0 == POINTER_TYPE && code1 == POINTER_TYPE
2833           && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type0),
2834                                                         TREE_TYPE (type1)))
2835         return pointer_diff (op0, op1, common_type (type0, type1));
2836       /* Handle pointer minus int.  Just like pointer plus int.  */
2837       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
2838         return cp_pointer_int_sum (MINUS_EXPR, op0, op1);
2839       else
2840         common = 1;
2841       break;
2842
2843     case MULT_EXPR:
2844       common = 1;
2845       break;
2846
2847     case TRUNC_DIV_EXPR:
2848     case CEIL_DIV_EXPR:
2849     case FLOOR_DIV_EXPR:
2850     case ROUND_DIV_EXPR:
2851     case EXACT_DIV_EXPR:
2852       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
2853            || code0 == COMPLEX_TYPE)
2854           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
2855               || code1 == COMPLEX_TYPE))
2856         {
2857           if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
2858             warning ("division by zero in `%E / 0'", op0);
2859           else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
2860             warning ("division by zero in `%E / 0.'", op0);
2861               
2862           if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE))
2863             resultcode = RDIV_EXPR;
2864           else
2865             /* When dividing two signed integers, we have to promote to int.
2866                unless we divide by a constant != -1.  Note that default
2867                conversion will have been performed on the operands at this
2868                point, so we have to dig out the original type to find out if
2869                it was unsigned.  */
2870             shorten = ((TREE_CODE (op0) == NOP_EXPR
2871                         && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
2872                        || (TREE_CODE (op1) == INTEGER_CST
2873                            && ! integer_all_onesp (op1)));
2874
2875           common = 1;
2876         }
2877       break;
2878
2879     case BIT_AND_EXPR:
2880     case BIT_IOR_EXPR:
2881     case BIT_XOR_EXPR:
2882       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2883         shorten = -1;
2884       break;
2885
2886     case TRUNC_MOD_EXPR:
2887     case FLOOR_MOD_EXPR:
2888       if (code1 == INTEGER_TYPE && integer_zerop (op1))
2889         warning ("division by zero in `%E %% 0'", op0);
2890       else if (code1 == REAL_TYPE && real_zerop (op1))
2891         warning ("division by zero in `%E %% 0.'", op0);
2892       
2893       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2894         {
2895           /* Although it would be tempting to shorten always here, that loses
2896              on some targets, since the modulo instruction is undefined if the
2897              quotient can't be represented in the computation mode.  We shorten
2898              only if unsigned or if dividing by something we know != -1.  */
2899           shorten = ((TREE_CODE (op0) == NOP_EXPR
2900                       && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
2901                      || (TREE_CODE (op1) == INTEGER_CST
2902                          && ! integer_all_onesp (op1)));
2903           common = 1;
2904         }
2905       break;
2906
2907     case TRUTH_ANDIF_EXPR:
2908     case TRUTH_ORIF_EXPR:
2909     case TRUTH_AND_EXPR:
2910     case TRUTH_OR_EXPR:
2911       result_type = boolean_type_node;
2912       break;
2913
2914       /* Shift operations: result has same type as first operand;
2915          always convert second operand to int.
2916          Also set SHORT_SHIFT if shifting rightward.  */
2917
2918     case RSHIFT_EXPR:
2919       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2920         {
2921           result_type = type0;
2922           if (TREE_CODE (op1) == INTEGER_CST)
2923             {
2924               if (tree_int_cst_lt (op1, integer_zero_node))
2925                 warning ("right shift count is negative");
2926               else
2927                 {
2928                   if (! integer_zerop (op1))
2929                     short_shift = 1;
2930                   if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
2931                     warning ("right shift count >= width of type");
2932                 }
2933             }
2934           /* Convert the shift-count to an integer, regardless of
2935              size of value being shifted.  */
2936           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
2937             op1 = cp_convert (integer_type_node, op1);
2938           /* Avoid converting op1 to result_type later.  */
2939           converted = 1;
2940         }
2941       break;
2942
2943     case LSHIFT_EXPR:
2944       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2945         {
2946           result_type = type0;
2947           if (TREE_CODE (op1) == INTEGER_CST)
2948             {
2949               if (tree_int_cst_lt (op1, integer_zero_node))
2950                 warning ("left shift count is negative");
2951               else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
2952                 warning ("left shift count >= width of type");
2953             }
2954           /* Convert the shift-count to an integer, regardless of
2955              size of value being shifted.  */
2956           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
2957             op1 = cp_convert (integer_type_node, op1);
2958           /* Avoid converting op1 to result_type later.  */
2959           converted = 1;
2960         }
2961       break;
2962
2963     case RROTATE_EXPR:
2964     case LROTATE_EXPR:
2965       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2966         {
2967           result_type = type0;
2968           if (TREE_CODE (op1) == INTEGER_CST)
2969             {
2970               if (tree_int_cst_lt (op1, integer_zero_node))
2971                 warning ("%s rotate count is negative",
2972                          (code == LROTATE_EXPR) ? "left" : "right");
2973               else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
2974                 warning ("%s rotate count >= width of type",
2975                          (code == LROTATE_EXPR) ? "left" : "right");
2976             }
2977           /* Convert the shift-count to an integer, regardless of
2978              size of value being shifted.  */
2979           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
2980             op1 = cp_convert (integer_type_node, op1);
2981         }
2982       break;
2983
2984     case EQ_EXPR:
2985     case NE_EXPR:
2986       if (warn_float_equal && (code0 == REAL_TYPE || code1 == REAL_TYPE))
2987         warning ("comparing floating point with == or != is unsafe");
2988
2989       build_type = boolean_type_node; 
2990       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
2991            || code0 == COMPLEX_TYPE)
2992           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
2993               || code1 == COMPLEX_TYPE))
2994         short_compare = 1;
2995       else if ((code0 == POINTER_TYPE && code1 == POINTER_TYPE)
2996                || (TYPE_PTRMEM_P (type0) && TYPE_PTRMEM_P (type1)))
2997         result_type = composite_pointer_type (type0, type1, op0, op1,
2998                                               "comparison");
2999       else if ((code0 == POINTER_TYPE || TYPE_PTRMEM_P (type0))
3000                && null_ptr_cst_p (op1))
3001         result_type = type0;
3002       else if ((code1 == POINTER_TYPE || TYPE_PTRMEM_P (type1))
3003                && null_ptr_cst_p (op0))
3004         result_type = type1;
3005       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3006         {
3007           result_type = type0;
3008           error ("ISO C++ forbids comparison between pointer and integer");
3009         }
3010       else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
3011         {
3012           result_type = type1;
3013           error ("ISO C++ forbids comparison between pointer and integer");
3014         }
3015       else if (TYPE_PTRMEMFUNC_P (type0) && null_ptr_cst_p (op1))
3016         {
3017           op0 = build_ptrmemfunc_access_expr (op0, pfn_identifier);
3018           op1 = cp_convert (TREE_TYPE (op0), integer_zero_node);
3019           result_type = TREE_TYPE (op0);
3020         }
3021       else if (TYPE_PTRMEMFUNC_P (type1) && null_ptr_cst_p (op0))
3022         return cp_build_binary_op (code, op1, op0);
3023       else if (TYPE_PTRMEMFUNC_P (type0) && TYPE_PTRMEMFUNC_P (type1)
3024                && same_type_p (type0, type1))
3025         {
3026           /* E will be the final comparison.  */
3027           tree e;
3028           /* E1 and E2 are for scratch.  */
3029           tree e1;
3030           tree e2;
3031           tree pfn0;
3032           tree pfn1;
3033           tree delta0;
3034           tree delta1;
3035
3036           if (TREE_SIDE_EFFECTS (op0))
3037             op0 = save_expr (op0);
3038           if (TREE_SIDE_EFFECTS (op1))
3039             op1 = save_expr (op1);
3040
3041           /* We generate:
3042
3043              (op0.pfn == op1.pfn 
3044               && (!op0.pfn || op0.delta == op1.delta))
3045              
3046              The reason for the `!op0.pfn' bit is that a NULL
3047              pointer-to-member is any member with a zero PFN; the
3048              DELTA field is unspecified.  */
3049           pfn0 = pfn_from_ptrmemfunc (op0);
3050           pfn1 = pfn_from_ptrmemfunc (op1);
3051           delta0 = build_ptrmemfunc_access_expr (op0,
3052                                                  delta_identifier);
3053           delta1 = build_ptrmemfunc_access_expr (op1,
3054                                                  delta_identifier);
3055           e1 = cp_build_binary_op (EQ_EXPR, delta0, delta1);
3056           e2 = cp_build_binary_op (EQ_EXPR, 
3057                                    pfn0,
3058                                    cp_convert (TREE_TYPE (pfn0),
3059                                                integer_zero_node));
3060           e1 = cp_build_binary_op (TRUTH_ORIF_EXPR, e1, e2);
3061           e2 = build (EQ_EXPR, boolean_type_node, pfn0, pfn1);
3062           e = cp_build_binary_op (TRUTH_ANDIF_EXPR, e2, e1);
3063           if (code == EQ_EXPR)
3064             return e;
3065           return cp_build_binary_op (EQ_EXPR, e, integer_zero_node);
3066         }
3067       else if ((TYPE_PTRMEMFUNC_P (type0)
3068                 && same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type0), type1))
3069                || (TYPE_PTRMEMFUNC_P (type1)
3070                    && same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type1), type0)))
3071         abort ();
3072       break;
3073
3074     case MAX_EXPR:
3075     case MIN_EXPR:
3076       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3077            && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3078         shorten = 1;
3079       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3080         result_type = composite_pointer_type (type0, type1, op0, op1,
3081                                               "comparison");
3082       break;
3083
3084     case LE_EXPR:
3085     case GE_EXPR:
3086     case LT_EXPR:
3087     case GT_EXPR:
3088       build_type = boolean_type_node;
3089       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3090            && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3091         short_compare = 1;
3092       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3093         result_type = composite_pointer_type (type0, type1, op0, op1,
3094                                               "comparison");
3095       else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
3096                && integer_zerop (op1))
3097         result_type = type0;
3098       else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
3099                && integer_zerop (op0))
3100         result_type = type1;
3101       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3102         {
3103           result_type = type0;
3104           pedwarn ("ISO C++ forbids comparison between pointer and integer");
3105         }
3106       else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
3107         {
3108           result_type = type1;
3109           pedwarn ("ISO C++ forbids comparison between pointer and integer");
3110         }
3111       break;
3112
3113     case UNORDERED_EXPR:
3114     case ORDERED_EXPR:
3115     case UNLT_EXPR:
3116     case UNLE_EXPR:
3117     case UNGT_EXPR:
3118     case UNGE_EXPR:
3119     case UNEQ_EXPR:
3120       build_type = integer_type_node;
3121       if (code0 != REAL_TYPE || code1 != REAL_TYPE)
3122         {
3123           error ("unordered comparison on non-floating point argument");
3124           return error_mark_node;
3125         }
3126       common = 1;
3127       break;
3128
3129     default:
3130       break;
3131     }
3132
3133   if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
3134       &&
3135       (code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE))
3136     {
3137       int none_complex = (code0 != COMPLEX_TYPE && code1 != COMPLEX_TYPE);
3138
3139       if (shorten || common || short_compare)
3140         result_type = common_type (type0, type1);
3141
3142       /* For certain operations (which identify themselves by shorten != 0)
3143          if both args were extended from the same smaller type,
3144          do the arithmetic in that type and then extend.
3145
3146          shorten !=0 and !=1 indicates a bitwise operation.
3147          For them, this optimization is safe only if
3148          both args are zero-extended or both are sign-extended.
3149          Otherwise, we might change the result.
3150          Eg, (short)-1 | (unsigned short)-1 is (int)-1
3151          but calculated in (unsigned short) it would be (unsigned short)-1.  */
3152
3153       if (shorten && none_complex)
3154         {
3155           int unsigned0, unsigned1;
3156           tree arg0 = get_narrower (op0, &unsigned0);
3157           tree arg1 = get_narrower (op1, &unsigned1);
3158           /* UNS is 1 if the operation to be done is an unsigned one.  */
3159           int uns = TREE_UNSIGNED (result_type);
3160           tree type;
3161
3162           final_type = result_type;
3163
3164           /* Handle the case that OP0 does not *contain* a conversion
3165              but it *requires* conversion to FINAL_TYPE.  */
3166
3167           if (op0 == arg0 && TREE_TYPE (op0) != final_type)
3168             unsigned0 = TREE_UNSIGNED (TREE_TYPE (op0));
3169           if (op1 == arg1 && TREE_TYPE (op1) != final_type)
3170             unsigned1 = TREE_UNSIGNED (TREE_TYPE (op1));
3171
3172           /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE.  */
3173
3174           /* For bitwise operations, signedness of nominal type
3175              does not matter.  Consider only how operands were extended.  */
3176           if (shorten == -1)
3177             uns = unsigned0;
3178
3179           /* Note that in all three cases below we refrain from optimizing
3180              an unsigned operation on sign-extended args.
3181              That would not be valid.  */
3182
3183           /* Both args variable: if both extended in same way
3184              from same width, do it in that width.
3185              Do it unsigned if args were zero-extended.  */
3186           if ((TYPE_PRECISION (TREE_TYPE (arg0))
3187                < TYPE_PRECISION (result_type))
3188               && (TYPE_PRECISION (TREE_TYPE (arg1))
3189                   == TYPE_PRECISION (TREE_TYPE (arg0)))
3190               && unsigned0 == unsigned1
3191               && (unsigned0 || !uns))
3192             result_type = c_common_signed_or_unsigned_type
3193               (unsigned0, common_type (TREE_TYPE (arg0), TREE_TYPE (arg1)));
3194           else if (TREE_CODE (arg0) == INTEGER_CST
3195                    && (unsigned1 || !uns)
3196                    && (TYPE_PRECISION (TREE_TYPE (arg1))
3197                        < TYPE_PRECISION (result_type))
3198                    && (type = c_common_signed_or_unsigned_type
3199                        (unsigned1, TREE_TYPE (arg1)),
3200                        int_fits_type_p (arg0, type)))
3201             result_type = type;
3202           else if (TREE_CODE (arg1) == INTEGER_CST
3203                    && (unsigned0 || !uns)
3204                    && (TYPE_PRECISION (TREE_TYPE (arg0))
3205                        < TYPE_PRECISION (result_type))
3206                    && (type = c_common_signed_or_unsigned_type
3207                        (unsigned0, TREE_TYPE (arg0)),
3208                        int_fits_type_p (arg1, type)))
3209             result_type = type;
3210         }
3211
3212       /* Shifts can be shortened if shifting right.  */
3213
3214       if (short_shift)
3215         {
3216           int unsigned_arg;
3217           tree arg0 = get_narrower (op0, &unsigned_arg);
3218
3219           final_type = result_type;
3220
3221           if (arg0 == op0 && final_type == TREE_TYPE (op0))
3222             unsigned_arg = TREE_UNSIGNED (TREE_TYPE (op0));
3223
3224           if (TYPE_PRECISION (TREE_TYPE (arg0)) < TYPE_PRECISION (result_type)
3225               /* We can shorten only if the shift count is less than the
3226                  number of bits in the smaller type size.  */
3227               && compare_tree_int (op1, TYPE_PRECISION (TREE_TYPE (arg0))) < 0
3228               /* If arg is sign-extended and then unsigned-shifted,
3229                  we can simulate this with a signed shift in arg's type
3230                  only if the extended result is at least twice as wide
3231                  as the arg.  Otherwise, the shift could use up all the
3232                  ones made by sign-extension and bring in zeros.
3233                  We can't optimize that case at all, but in most machines
3234                  it never happens because available widths are 2**N.  */
3235               && (!TREE_UNSIGNED (final_type)
3236                   || unsigned_arg
3237                   || (((unsigned) 2 * TYPE_PRECISION (TREE_TYPE (arg0)))
3238                       <= TYPE_PRECISION (result_type))))
3239             {
3240               /* Do an unsigned shift if the operand was zero-extended.  */
3241               result_type
3242                 = c_common_signed_or_unsigned_type (unsigned_arg,
3243                                                     TREE_TYPE (arg0));
3244               /* Convert value-to-be-shifted to that type.  */
3245               if (TREE_TYPE (op0) != result_type)
3246                 op0 = cp_convert (result_type, op0);
3247               converted = 1;
3248             }
3249         }
3250
3251       /* Comparison operations are shortened too but differently.
3252          They identify themselves by setting short_compare = 1.  */
3253
3254       if (short_compare)
3255         {
3256           /* Don't write &op0, etc., because that would prevent op0
3257              from being kept in a register.
3258              Instead, make copies of the our local variables and
3259              pass the copies by reference, then copy them back afterward.  */
3260           tree xop0 = op0, xop1 = op1, xresult_type = result_type;
3261           enum tree_code xresultcode = resultcode;
3262           tree val 
3263             = shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
3264           if (val != 0)
3265             return cp_convert (boolean_type_node, val);
3266           op0 = xop0, op1 = xop1;
3267           converted = 1;
3268           resultcode = xresultcode;
3269         }
3270
3271       if ((short_compare || code == MIN_EXPR || code == MAX_EXPR)
3272           && warn_sign_compare
3273           /* Do not warn until the template is instantiated; we cannot
3274              bound the ranges of the arguments until that point.  */
3275           && !processing_template_decl)
3276         {
3277           int op0_signed = ! TREE_UNSIGNED (TREE_TYPE (orig_op0));
3278           int op1_signed = ! TREE_UNSIGNED (TREE_TYPE (orig_op1));
3279
3280           int unsignedp0, unsignedp1;
3281           tree primop0 = get_narrower (op0, &unsignedp0);
3282           tree primop1 = get_narrower (op1, &unsignedp1);
3283
3284           /* Check for comparison of different enum types.  */
3285           if (TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE 
3286               && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE 
3287               && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0))
3288                  != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
3289             {
3290               warning ("comparison between types `%#T' and `%#T'", 
3291                           TREE_TYPE (orig_op0), TREE_TYPE (orig_op1));
3292             }
3293
3294           /* Give warnings for comparisons between signed and unsigned
3295              quantities that may fail.  */
3296           /* Do the checking based on the original operand trees, so that
3297              casts will be considered, but default promotions won't be.  */
3298
3299           /* Do not warn if the comparison is being done in a signed type,
3300              since the signed type will only be chosen if it can represent
3301              all the values of the unsigned type.  */
3302           if (! TREE_UNSIGNED (result_type))
3303             /* OK */;
3304           /* Do not warn if both operands are unsigned.  */
3305           else if (op0_signed == op1_signed)
3306             /* OK */;
3307           /* Do not warn if the signed quantity is an unsuffixed
3308              integer literal (or some static constant expression
3309              involving such literals or a conditional expression
3310              involving such literals) and it is non-negative.  */
3311           else if ((op0_signed && tree_expr_nonnegative_p (orig_op0))
3312                    || (op1_signed && tree_expr_nonnegative_p (orig_op1)))
3313             /* OK */;
3314           /* Do not warn if the comparison is an equality operation,
3315              the unsigned quantity is an integral constant and it does
3316              not use the most significant bit of result_type.  */
3317           else if ((resultcode == EQ_EXPR || resultcode == NE_EXPR)
3318                    && ((op0_signed && TREE_CODE (orig_op1) == INTEGER_CST
3319                         && int_fits_type_p (orig_op1, c_common_signed_type
3320                                             (result_type)))
3321                         || (op1_signed && TREE_CODE (orig_op0) == INTEGER_CST
3322                             && int_fits_type_p (orig_op0, c_common_signed_type
3323                                                 (result_type)))))
3324             /* OK */;
3325           else
3326             warning ("comparison between signed and unsigned integer expressions");
3327
3328           /* Warn if two unsigned values are being compared in a size
3329              larger than their original size, and one (and only one) is the
3330              result of a `~' operator.  This comparison will always fail.
3331
3332              Also warn if one operand is a constant, and the constant does not
3333              have all bits set that are set in the ~ operand when it is
3334              extended.  */
3335
3336           if ((TREE_CODE (primop0) == BIT_NOT_EXPR)
3337               ^ (TREE_CODE (primop1) == BIT_NOT_EXPR))
3338             {
3339               if (TREE_CODE (primop0) == BIT_NOT_EXPR)
3340                 primop0 = get_narrower (TREE_OPERAND (op0, 0), &unsignedp0);
3341               if (TREE_CODE (primop1) == BIT_NOT_EXPR)
3342                 primop1 = get_narrower (TREE_OPERAND (op1, 0), &unsignedp1);
3343               
3344               if (host_integerp (primop0, 0) || host_integerp (primop1, 0))
3345                 {
3346                   tree primop;
3347                   HOST_WIDE_INT constant, mask;
3348                   int unsignedp;
3349                   unsigned int bits;
3350
3351                   if (host_integerp (primop0, 0))
3352                     {
3353                       primop = primop1;
3354                       unsignedp = unsignedp1;
3355                       constant = tree_low_cst (primop0, 0);
3356                     }
3357                   else
3358                     {
3359                       primop = primop0;
3360                       unsignedp = unsignedp0;
3361                       constant = tree_low_cst (primop1, 0);
3362                     }
3363
3364                   bits = TYPE_PRECISION (TREE_TYPE (primop));
3365                   if (bits < TYPE_PRECISION (result_type)
3366                       && bits < HOST_BITS_PER_LONG && unsignedp)
3367                     {
3368                       mask = (~ (HOST_WIDE_INT) 0) << bits;
3369                       if ((mask & constant) != mask)
3370                         warning ("comparison of promoted ~unsigned with constant");
3371                     }
3372                 }
3373               else if (unsignedp0 && unsignedp1
3374                        && (TYPE_PRECISION (TREE_TYPE (primop0))
3375                            < TYPE_PRECISION (result_type))
3376                        && (TYPE_PRECISION (TREE_TYPE (primop1))
3377                            < TYPE_PRECISION (result_type)))
3378                 warning ("comparison of promoted ~unsigned with unsigned");
3379             }
3380         }
3381     }
3382
3383   /* At this point, RESULT_TYPE must be nonzero to avoid an error message.
3384      If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
3385      Then the expression will be built.
3386      It will be given type FINAL_TYPE if that is nonzero;
3387      otherwise, it will be given type RESULT_TYPE.  */
3388
3389   if (!result_type)
3390     {
3391       error ("invalid operands of types `%T' and `%T' to binary `%O'",
3392                 TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), code);
3393       return error_mark_node;
3394     }
3395
3396   /* Issue warnings about peculiar, but valid, uses of NULL.  */
3397   if (/* It's reasonable to use pointer values as operands of &&
3398          and ||, so NULL is no exception.  */
3399       !(code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
3400       && (/* If OP0 is NULL and OP1 is not a pointer, or vice versa.  */
3401           (orig_op0 == null_node
3402            && TREE_CODE (TREE_TYPE (op1)) != POINTER_TYPE)
3403           /* Or vice versa.  */
3404           || (orig_op1 == null_node
3405               && TREE_CODE (TREE_TYPE (op0)) != POINTER_TYPE)
3406           /* Or, both are NULL and the operation was not a comparison.  */
3407           || (orig_op0 == null_node && orig_op1 == null_node 
3408               && code != EQ_EXPR && code != NE_EXPR)))
3409     /* Some sort of arithmetic operation involving NULL was
3410        performed.  Note that pointer-difference and pointer-addition
3411        have already been handled above, and so we don't end up here in
3412        that case.  */
3413     warning ("NULL used in arithmetic");
3414
3415   if (! converted)
3416     {
3417       if (TREE_TYPE (op0) != result_type)
3418         op0 = cp_convert (result_type, op0); 
3419       if (TREE_TYPE (op1) != result_type)
3420         op1 = cp_convert (result_type, op1); 
3421
3422       if (op0 == error_mark_node || op1 == error_mark_node)
3423         return error_mark_node;
3424     }
3425
3426   if (build_type == NULL_TREE)
3427     build_type = result_type;
3428
3429   {
3430     tree result = build (resultcode, build_type, op0, op1);
3431     tree folded;
3432
3433     folded = fold (result);
3434     if (folded == result)
3435       TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
3436     if (final_type != 0)
3437       return cp_convert (final_type, folded);
3438     return folded;
3439   }
3440 }
3441 \f
3442 /* Return a tree for the sum or difference (RESULTCODE says which)
3443    of pointer PTROP and integer INTOP.  */
3444
3445 static tree
3446 cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
3447 {
3448   tree res_type = TREE_TYPE (ptrop);
3449
3450   /* pointer_int_sum() uses size_in_bytes() on the TREE_TYPE(res_type)
3451      in certain circumstance (when it's valid to do so).  So we need
3452      to make sure it's complete.  We don't need to check here, if we
3453      can actually complete it at all, as those checks will be done in
3454      pointer_int_sum() anyway.  */
3455   complete_type (TREE_TYPE (res_type));
3456
3457   return pointer_int_sum (resultcode, ptrop, fold (intop));
3458 }
3459
3460 /* Return a tree for the difference of pointers OP0 and OP1.
3461    The resulting tree has type int.  */
3462
3463 static tree
3464 pointer_diff (tree op0, tree op1, tree ptrtype)
3465 {
3466   tree result, folded;
3467   tree restype = ptrdiff_type_node;
3468   tree target_type = TREE_TYPE (ptrtype);
3469
3470   if (!complete_type_or_else (target_type, NULL_TREE))
3471     return error_mark_node;
3472
3473   if (pedantic || warn_pointer_arith)
3474     {
3475       if (TREE_CODE (target_type) == VOID_TYPE)
3476         pedwarn ("ISO C++ forbids using pointer of type `void *' in subtraction");
3477       if (TREE_CODE (target_type) == FUNCTION_TYPE)
3478         pedwarn ("ISO C++ forbids using pointer to a function in subtraction");
3479       if (TREE_CODE (target_type) == METHOD_TYPE)
3480         pedwarn ("ISO C++ forbids using pointer to a method in subtraction");
3481     }
3482
3483   /* First do the subtraction as integers;
3484      then drop through to build the divide operator.  */
3485
3486   op0 = cp_build_binary_op (MINUS_EXPR, 
3487                             cp_convert (restype, op0),
3488                             cp_convert (restype, op1));
3489
3490   /* This generates an error if op1 is a pointer to an incomplete type.  */
3491   if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (op1))))
3492     error ("invalid use of a pointer to an incomplete type in pointer arithmetic");
3493
3494   op1 = (TYPE_PTROB_P (ptrtype) 
3495          ? size_in_bytes (target_type)
3496          : integer_one_node);
3497
3498   /* Do the division.  */
3499
3500   result = build (EXACT_DIV_EXPR, restype, op0, cp_convert (restype, op1));
3501
3502   folded = fold (result);
3503   if (folded == result)
3504     TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
3505   return folded;
3506 }
3507 \f
3508 /* Construct and perhaps optimize a tree representation
3509    for a unary operation.  CODE, a tree_code, specifies the operation
3510    and XARG is the operand.  */
3511
3512 tree
3513 build_x_unary_op (enum tree_code code, tree xarg)
3514 {
3515   tree orig_expr = xarg;
3516   tree exp;
3517   int ptrmem = 0;
3518   
3519   if (processing_template_decl)
3520     {
3521       if (type_dependent_expression_p (xarg))
3522         return build_min_nt (code, xarg, NULL_TREE);
3523       xarg = build_non_dependent_expr (xarg);
3524     }
3525
3526   exp = NULL_TREE;
3527
3528   /* & rec, on incomplete RECORD_TYPEs is the simple opr &, not an
3529      error message.  */
3530   if (code == ADDR_EXPR
3531       && TREE_CODE (xarg) != TEMPLATE_ID_EXPR
3532       && ((IS_AGGR_TYPE_CODE (TREE_CODE (TREE_TYPE (xarg)))
3533            && !COMPLETE_TYPE_P (TREE_TYPE (xarg)))
3534           || (TREE_CODE (xarg) == OFFSET_REF)))
3535     /* Don't look for a function.  */;
3536   else
3537     exp = build_new_op (code, LOOKUP_NORMAL, xarg, NULL_TREE, NULL_TREE,
3538                         /*overloaded_p=*/NULL);
3539   if (!exp && code == ADDR_EXPR)
3540     {
3541       /*  A pointer to member-function can be formed only by saying
3542           &X::mf.  */
3543       if (!flag_ms_extensions && TREE_CODE (TREE_TYPE (xarg)) == METHOD_TYPE
3544           && (TREE_CODE (xarg) != OFFSET_REF || !PTRMEM_OK_P (xarg)))
3545         {
3546           if (TREE_CODE (xarg) != OFFSET_REF)
3547             {
3548               error ("invalid use of '%E' to form a pointer-to-member-function.  Use a qualified-id.",
3549                      xarg);
3550               return error_mark_node;
3551             }
3552           else
3553             {
3554               error ("parenthesis around '%E' cannot be used to form a pointer-to-member-function",
3555                      xarg);
3556               PTRMEM_OK_P (xarg) = 1;
3557             }
3558         }
3559       
3560       if (TREE_CODE (xarg) == OFFSET_REF)
3561         {
3562           ptrmem = PTRMEM_OK_P (xarg);
3563           
3564           if (!ptrmem && !flag_ms_extensions
3565               && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE)
3566             {
3567               /* A single non-static member, make sure we don't allow a
3568                  pointer-to-member.  */
3569               xarg = build (OFFSET_REF, TREE_TYPE (xarg),
3570                             TREE_OPERAND (xarg, 0),
3571                             ovl_cons (TREE_OPERAND (xarg, 1), NULL_TREE));
3572               PTRMEM_OK_P (xarg) = ptrmem;
3573             }         
3574         }
3575       else if (TREE_CODE (xarg) == TARGET_EXPR)
3576         warning ("taking address of temporary");
3577       exp = build_unary_op (ADDR_EXPR, xarg, 0);
3578       if (TREE_CODE (exp) == ADDR_EXPR)
3579         PTRMEM_OK_P (exp) = ptrmem;
3580     }
3581
3582   if (processing_template_decl && exp != error_mark_node)
3583     return build_min_non_dep (code, exp, orig_expr,
3584                               /*For {PRE,POST}{INC,DEC}REMENT_EXPR*/NULL_TREE);
3585   return exp;
3586 }
3587
3588 /* Like c_common_truthvalue_conversion, but handle pointer-to-member
3589    constants, where a null value is represented by an INTEGER_CST of
3590    -1.  */
3591
3592 tree
3593 cp_truthvalue_conversion (tree expr)
3594 {
3595   tree type = TREE_TYPE (expr);
3596   if (TYPE_PTRMEM_P (type))
3597     return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
3598   else
3599     return c_common_truthvalue_conversion (expr);
3600 }
3601
3602 /* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR.  */
3603    
3604 tree
3605 condition_conversion (tree expr)
3606 {
3607   tree t;
3608   if (processing_template_decl)
3609     return expr;
3610   t = perform_implicit_conversion (boolean_type_node, expr);
3611   t = fold (build1 (CLEANUP_POINT_EXPR, boolean_type_node, t));
3612   return t;
3613 }
3614                 
3615 /* Return an ADDR_EXPR giving the address of T.  This function
3616    attempts no optimizations or simplifications; it is a low-level
3617    primitive.  */
3618
3619 tree
3620 build_address (tree t)
3621 {
3622   tree addr;
3623
3624   if (error_operand_p (t) || !cxx_mark_addressable (t))
3625     return error_mark_node;
3626
3627   addr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (t)), t);
3628   if (staticp (t))
3629     TREE_CONSTANT (addr) = 1;
3630
3631   return addr;
3632 }
3633
3634 /* Return a NOP_EXPR converting EXPR to TYPE.  */
3635
3636 tree
3637 build_nop (tree type, tree expr)
3638 {
3639   tree nop;
3640
3641   if (type == error_mark_node || error_operand_p (expr))
3642     return expr;
3643     
3644   nop = build1 (NOP_EXPR, type, expr);
3645   if (TREE_CONSTANT (expr))
3646     TREE_CONSTANT (nop) = 1;
3647   
3648   return nop;
3649 }
3650
3651 /* C++: Must handle pointers to members.
3652
3653    Perhaps type instantiation should be extended to handle conversion
3654    from aggregates to types we don't yet know we want?  (Or are those
3655    cases typically errors which should be reported?)
3656
3657    NOCONVERT nonzero suppresses the default promotions
3658    (such as from short to int).  */
3659
3660 tree
3661 build_unary_op (enum tree_code code, tree xarg, int noconvert)
3662 {
3663   /* No default_conversion here.  It causes trouble for ADDR_EXPR.  */
3664   tree arg = xarg;
3665   tree argtype = 0;
3666   const char *errstring = NULL;
3667   tree val;
3668
3669   if (arg == error_mark_node)
3670     return error_mark_node;
3671
3672   switch (code)
3673     {
3674     case CONVERT_EXPR:
3675       /* This is used for unary plus, because a CONVERT_EXPR
3676          is enough to prevent anybody from looking inside for
3677          associativity, but won't generate any code.  */
3678       if (!(arg = build_expr_type_conversion
3679             (WANT_ARITH | WANT_ENUM | WANT_POINTER, arg, true)))
3680         errstring = "wrong type argument to unary plus";
3681       else
3682         {
3683           if (!noconvert)
3684            arg = default_conversion (arg);
3685           arg = build1 (NON_LVALUE_EXPR, TREE_TYPE (arg), arg);
3686           TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
3687         }
3688       break;
3689
3690     case NEGATE_EXPR:
3691       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
3692         errstring = "wrong type argument to unary minus";
3693       else if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
3694         arg = perform_integral_promotions (arg);
3695       break;
3696
3697     case BIT_NOT_EXPR:
3698       if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
3699         {
3700           code = CONJ_EXPR;
3701           if (!noconvert)
3702             arg = default_conversion (arg);
3703         }
3704       else if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM,
3705                                                    arg, true)))
3706         errstring = "wrong type argument to bit-complement";
3707       else if (!noconvert)
3708         arg = perform_integral_promotions (arg);
3709       break;
3710
3711     case ABS_EXPR:
3712       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
3713         errstring = "wrong type argument to abs";
3714       else if (!noconvert)
3715         arg = default_conversion (arg);
3716       break;
3717
3718     case CONJ_EXPR:
3719       /* Conjugating a real value is a no-op, but allow it anyway.  */
3720       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
3721         errstring = "wrong type argument to conjugation";
3722       else if (!noconvert)
3723         arg = default_conversion (arg);
3724       break;
3725
3726     case TRUTH_NOT_EXPR:
3727       arg = perform_implicit_conversion (boolean_type_node, arg);
3728       val = invert_truthvalue (arg);
3729       if (arg != error_mark_node)
3730         return val;
3731       errstring = "in argument to unary !";
3732       break;
3733
3734     case NOP_EXPR:
3735       break;
3736       
3737     case REALPART_EXPR:
3738       if (TREE_CODE (arg) == COMPLEX_CST)
3739         return TREE_REALPART (arg);
3740       else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
3741         return fold (build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
3742       else
3743         return arg;
3744
3745     case IMAGPART_EXPR:
3746       if (TREE_CODE (arg) == COMPLEX_CST)
3747         return TREE_IMAGPART (arg);
3748       else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
3749         return fold (build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
3750       else
3751         return cp_convert (TREE_TYPE (arg), integer_zero_node);
3752       
3753     case PREINCREMENT_EXPR:
3754     case POSTINCREMENT_EXPR:
3755     case PREDECREMENT_EXPR:
3756     case POSTDECREMENT_EXPR:
3757       /* Handle complex lvalues (when permitted)
3758          by reduction to simpler cases.  */
3759
3760       val = unary_complex_lvalue (code, arg);
3761       if (val != 0)
3762         return val;
3763
3764       /* Increment or decrement the real part of the value,
3765          and don't change the imaginary part.  */
3766       if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
3767         {
3768           tree real, imag;
3769
3770           arg = stabilize_reference (arg);
3771           real = build_unary_op (REALPART_EXPR, arg, 1);
3772           imag = build_unary_op (IMAGPART_EXPR, arg, 1);
3773           return build (COMPLEX_EXPR, TREE_TYPE (arg),
3774                         build_unary_op (code, real, 1), imag);
3775         }
3776
3777       /* Report invalid types.  */
3778
3779       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_POINTER,
3780                                               arg, true)))
3781         {
3782           if (code == PREINCREMENT_EXPR)
3783             errstring ="no pre-increment operator for type";
3784           else if (code == POSTINCREMENT_EXPR)
3785             errstring ="no post-increment operator for type";
3786           else if (code == PREDECREMENT_EXPR)
3787             errstring ="no pre-decrement operator for type";
3788           else
3789             errstring ="no post-decrement operator for type";
3790           break;
3791         }
3792
3793       /* Report something read-only.  */
3794
3795       if (CP_TYPE_CONST_P (TREE_TYPE (arg))
3796           || TREE_READONLY (arg))
3797         readonly_error (arg, ((code == PREINCREMENT_EXPR
3798                                || code == POSTINCREMENT_EXPR)
3799                               ? "increment" : "decrement"),
3800                         0);
3801
3802       {
3803         tree inc;
3804         tree result_type = TREE_TYPE (arg);
3805
3806         arg = get_unwidened (arg, 0);
3807         argtype = TREE_TYPE (arg);
3808
3809         /* ARM $5.2.5 last annotation says this should be forbidden.  */
3810         if (TREE_CODE (argtype) == ENUMERAL_TYPE)
3811           pedwarn ("ISO C++ forbids %sing an enum",
3812                    (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
3813                    ? "increment" : "decrement");
3814             
3815         /* Compute the increment.  */
3816
3817         if (TREE_CODE (argtype) == POINTER_TYPE)
3818           {
3819             tree type = complete_type (TREE_TYPE (argtype));
3820             
3821             if (!COMPLETE_OR_VOID_TYPE_P (type))
3822               error ("cannot %s a pointer to incomplete type `%T'",
3823                         ((code == PREINCREMENT_EXPR
3824                           || code == POSTINCREMENT_EXPR)
3825                          ? "increment" : "decrement"), TREE_TYPE (argtype));
3826             else if ((pedantic || warn_pointer_arith)
3827                      && !TYPE_PTROB_P (argtype))
3828               pedwarn ("ISO C++ forbids %sing a pointer of type `%T'",
3829                           ((code == PREINCREMENT_EXPR
3830                             || code == POSTINCREMENT_EXPR)
3831                            ? "increment" : "decrement"), argtype);
3832             inc = cxx_sizeof_nowarn (TREE_TYPE (argtype));
3833           }
3834         else
3835           inc = integer_one_node;
3836
3837         inc = cp_convert (argtype, inc);
3838
3839         /* Handle incrementing a cast-expression.  */
3840
3841         switch (TREE_CODE (arg))
3842           {
3843           case NOP_EXPR:
3844           case CONVERT_EXPR:
3845           case FLOAT_EXPR:
3846           case FIX_TRUNC_EXPR:
3847           case FIX_FLOOR_EXPR:
3848           case FIX_ROUND_EXPR:
3849           case FIX_CEIL_EXPR:
3850             {
3851               tree incremented, modify, value, compound;
3852               if (! lvalue_p (arg) && pedantic)
3853                 pedwarn ("cast to non-reference type used as lvalue");
3854               arg = stabilize_reference (arg);
3855               if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
3856                 value = arg;
3857               else
3858                 value = save_expr (arg);
3859               incremented = build (((code == PREINCREMENT_EXPR
3860                                      || code == POSTINCREMENT_EXPR)
3861                                     ? PLUS_EXPR : MINUS_EXPR),
3862                                    argtype, value, inc);
3863
3864               modify = build_modify_expr (arg, NOP_EXPR, incremented);
3865               compound = build (COMPOUND_EXPR, TREE_TYPE (arg), modify, value);
3866
3867               /* Eliminate warning about unused result of + or -.  */
3868               TREE_NO_UNUSED_WARNING (compound) = 1;
3869               return compound;
3870             }
3871
3872           default:
3873             break;
3874           }
3875
3876         /* Complain about anything else that is not a true lvalue.  */
3877         if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
3878                                     || code == POSTINCREMENT_EXPR)
3879                                    ? "increment" : "decrement")))
3880           return error_mark_node;
3881
3882         /* Forbid using -- on `bool'.  */
3883         if (TREE_TYPE (arg) == boolean_type_node)
3884           {
3885             if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
3886               {
3887                 error ("invalid use of `--' on bool variable `%D'", arg);
3888                 return error_mark_node;
3889               }
3890             val = boolean_increment (code, arg);
3891           }
3892         else
3893           val = build (code, TREE_TYPE (arg), arg, inc);
3894
3895         TREE_SIDE_EFFECTS (val) = 1;
3896         return cp_convert (result_type, val);
3897       }
3898
3899     case ADDR_EXPR:
3900       /* Note that this operation never does default_conversion
3901          regardless of NOCONVERT.  */
3902
3903       argtype = lvalue_type (arg);
3904
3905       if (TREE_CODE (arg) == OFFSET_REF)
3906         goto offset_ref;
3907
3908       if (TREE_CODE (argtype) == REFERENCE_TYPE)
3909         {
3910           arg = build1
3911             (CONVERT_EXPR,
3912              build_pointer_type (TREE_TYPE (argtype)), arg);
3913           TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
3914           return arg;
3915         }
3916       else if (pedantic && DECL_MAIN_P (arg))
3917         /* ARM $3.4 */
3918         pedwarn ("ISO C++ forbids taking address of function `::main'");
3919
3920       /* Let &* cancel out to simplify resulting code.  */
3921       if (TREE_CODE (arg) == INDIRECT_REF)
3922         {
3923           /* We don't need to have `current_class_ptr' wrapped in a
3924              NON_LVALUE_EXPR node.  */
3925           if (arg == current_class_ref)
3926             return current_class_ptr;
3927
3928           arg = TREE_OPERAND (arg, 0);
3929           if (TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE)
3930             {
3931               arg = build1
3932                 (CONVERT_EXPR,
3933                  build_pointer_type (TREE_TYPE (TREE_TYPE (arg))), arg);
3934               TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
3935             }
3936           else if (lvalue_p (arg))
3937             /* Don't let this be an lvalue.  */
3938             return non_lvalue (arg);
3939           return arg;
3940         }
3941
3942       /* For &x[y], return x+y.  */
3943       if (TREE_CODE (arg) == ARRAY_REF)
3944         {
3945           if (!cxx_mark_addressable (TREE_OPERAND (arg, 0)))
3946             return error_mark_node;
3947           return cp_build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0),
3948                                      TREE_OPERAND (arg, 1));
3949         }
3950
3951       /* Uninstantiated types are all functions.  Taking the
3952          address of a function is a no-op, so just return the
3953          argument.  */
3954
3955       if (TREE_CODE (arg) == IDENTIFIER_NODE
3956           && IDENTIFIER_OPNAME_P (arg))
3957         {
3958           abort ();
3959           /* We don't know the type yet, so just work around the problem.
3960              We know that this will resolve to an lvalue.  */
3961           return build1 (ADDR_EXPR, unknown_type_node, arg);
3962         }
3963
3964       if (TREE_CODE (arg) == COMPONENT_REF && type_unknown_p (arg)
3965           && !really_overloaded_fn (TREE_OPERAND (arg, 1)))
3966         {
3967           /* They're trying to take the address of a unique non-static
3968              member function.  This is ill-formed (except in MS-land),
3969              but let's try to DTRT.
3970              Note: We only handle unique functions here because we don't
3971              want to complain if there's a static overload; non-unique
3972              cases will be handled by instantiate_type.  But we need to
3973              handle this case here to allow casts on the resulting PMF.
3974              We could defer this in non-MS mode, but it's easier to give
3975              a useful error here.  */
3976
3977           /* Inside constant member functions, the `this' pointer
3978              contains an extra const qualifier.  TYPE_MAIN_VARIANT
3979              is used here to remove this const from the diagnostics
3980              and the created OFFSET_REF.  */
3981           tree base = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg, 0)));
3982           tree name = DECL_NAME (get_first_fn (TREE_OPERAND (arg, 1)));
3983
3984           if (! flag_ms_extensions)
3985             {
3986               if (current_class_type
3987                   && TREE_OPERAND (arg, 0) == current_class_ref)
3988                 /* An expression like &memfn.  */
3989                 pedwarn ("ISO C++ forbids taking the address of an unqualified"
3990                          " or parenthesized non-static member function to form"
3991                          " a pointer to member function.  Say `&%T::%D'",
3992                          base, name);
3993               else
3994                 pedwarn ("ISO C++ forbids taking the address of a bound member"
3995                          " function to form a pointer to member function."
3996                          "  Say `&%T::%D'",
3997                          base, name);
3998             }
3999           arg = build_offset_ref (base, name, /*address_p=*/true);
4000         }
4001
4002     offset_ref:        
4003       if (type_unknown_p (arg))
4004         return build1 (ADDR_EXPR, unknown_type_node, arg);
4005         
4006       /* Handle complex lvalues (when permitted)
4007          by reduction to simpler cases.  */
4008       val = unary_complex_lvalue (code, arg);
4009       if (val != 0)
4010         return val;
4011
4012       switch (TREE_CODE (arg))
4013         {
4014         case NOP_EXPR:
4015         case CONVERT_EXPR:
4016         case FLOAT_EXPR:
4017         case FIX_TRUNC_EXPR:
4018         case FIX_FLOOR_EXPR:
4019         case FIX_ROUND_EXPR:
4020         case FIX_CEIL_EXPR:
4021           if (! lvalue_p (arg) && pedantic)
4022             pedwarn ("ISO C++ forbids taking the address of a cast to a non-lvalue expression");
4023           break;
4024           
4025         default:
4026           break;
4027         }
4028
4029       /* Allow the address of a constructor if all the elements
4030          are constant.  */
4031       if (TREE_CODE (arg) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (arg)
4032           && TREE_CONSTANT (arg))
4033         ;
4034       /* Anything not already handled and not a true memory reference
4035          is an error.  */
4036       else if (TREE_CODE (argtype) != FUNCTION_TYPE
4037                && TREE_CODE (argtype) != METHOD_TYPE
4038                && !lvalue_or_else (arg, "unary `&'"))
4039         return error_mark_node;
4040
4041       if (argtype != error_mark_node)
4042         argtype = build_pointer_type (argtype);
4043
4044       {
4045         tree addr;
4046
4047         if (TREE_CODE (arg) != COMPONENT_REF)
4048           addr = build_address (arg);
4049         else if (TREE_CODE (TREE_OPERAND (arg, 1)) == BASELINK)
4050           {
4051             tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1));
4052
4053             /* We can only get here with a single static member
4054                function.  */
4055             my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL
4056                                 && DECL_STATIC_FUNCTION_P (fn),
4057                                 20030906);
4058             mark_used (fn);
4059             addr = build_address (fn);
4060             if (TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
4061               /* Do not lose object's side effects.  */
4062               addr = build (COMPOUND_EXPR, TREE_TYPE (addr),
4063                             TREE_OPERAND (arg, 0), addr);
4064           }
4065         else if (DECL_C_BIT_FIELD (TREE_OPERAND (arg, 1)))
4066           {
4067             error ("attempt to take address of bit-field structure member `%D'",
4068                    TREE_OPERAND (arg, 1));
4069             return error_mark_node;
4070           }
4071         else
4072           {
4073             /* Unfortunately we cannot just build an address
4074                expression here, because we would not handle
4075                address-constant-expressions or offsetof correctly.  */
4076             tree field = TREE_OPERAND (arg, 1);
4077             tree rval = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0);
4078             tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (rval)),
4079                                       decl_type_context (field),
4080                                       ba_check, NULL);
4081             
4082             rval = build_base_path (PLUS_EXPR, rval, binfo, 1);
4083             rval = build_nop (argtype, rval);
4084             addr = fold (build (PLUS_EXPR, argtype, rval,
4085                                 cp_convert (argtype, byte_position (field))));
4086           }
4087
4088         if (TREE_CODE (argtype) == POINTER_TYPE
4089             && TREE_CODE (TREE_TYPE (argtype)) == METHOD_TYPE)
4090           {
4091             build_ptrmemfunc_type (argtype);
4092             addr = build_ptrmemfunc (argtype, addr, 0);
4093           }
4094
4095         return addr;
4096       }
4097
4098     default:
4099       break;
4100     }
4101
4102   if (!errstring)
4103     {
4104       if (argtype == 0)
4105         argtype = TREE_TYPE (arg);
4106       return fold (build1 (code, argtype, arg));
4107     }
4108
4109   error ("%s", errstring);
4110   return error_mark_node;
4111 }
4112
4113 /* Apply unary lvalue-demanding operator CODE to the expression ARG
4114    for certain kinds of expressions which are not really lvalues
4115    but which we can accept as lvalues.
4116
4117    If ARG is not a kind of expression we can handle, return zero.  */
4118    
4119 tree
4120 unary_complex_lvalue (enum tree_code code, tree arg)
4121 {
4122   /* Handle (a, b) used as an "lvalue".  */
4123   if (TREE_CODE (arg) == COMPOUND_EXPR)
4124     {
4125       tree real_result = build_unary_op (code, TREE_OPERAND (arg, 1), 0);
4126       return build (COMPOUND_EXPR, TREE_TYPE (real_result),
4127                     TREE_OPERAND (arg, 0), real_result);
4128     }
4129
4130   /* Handle (a ? b : c) used as an "lvalue".  */
4131   if (TREE_CODE (arg) == COND_EXPR
4132       || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR)
4133     return rationalize_conditional_expr (code, arg);
4134
4135   /* Handle (a = b), (++a), and (--a) used as an "lvalue".  */
4136   if (TREE_CODE (arg) == MODIFY_EXPR
4137       || TREE_CODE (arg) == PREINCREMENT_EXPR
4138       || TREE_CODE (arg) == PREDECREMENT_EXPR)
4139     {
4140       tree lvalue = TREE_OPERAND (arg, 0);
4141       if (TREE_SIDE_EFFECTS (lvalue))
4142         {
4143           lvalue = stabilize_reference (lvalue);
4144           arg = build (TREE_CODE (arg), TREE_TYPE (arg),
4145                        lvalue, TREE_OPERAND (arg, 1));
4146         }
4147       return unary_complex_lvalue
4148         (code, build (COMPOUND_EXPR, TREE_TYPE (lvalue), arg, lvalue));
4149     }
4150
4151   if (code != ADDR_EXPR)
4152     return 0;
4153
4154   /* Handle (a = b) used as an "lvalue" for `&'.  */
4155   if (TREE_CODE (arg) == MODIFY_EXPR
4156       || TREE_CODE (arg) == INIT_EXPR)
4157     {
4158       tree real_result = build_unary_op (code, TREE_OPERAND (arg, 0), 0);
4159       arg = build (COMPOUND_EXPR, TREE_TYPE (real_result), arg, real_result);
4160       TREE_NO_UNUSED_WARNING (arg) = 1;
4161       return arg;
4162     }
4163
4164   if (TREE_CODE (TREE_TYPE (arg)) == FUNCTION_TYPE
4165       || TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
4166       || TREE_CODE (arg) == OFFSET_REF)
4167     {
4168       tree t;
4169
4170       my_friendly_assert (TREE_CODE (arg) != SCOPE_REF, 313);
4171
4172       if (TREE_CODE (arg) != OFFSET_REF)
4173         return 0;
4174
4175       t = TREE_OPERAND (arg, 1);
4176
4177       /* Check all this code for right semantics.  */   
4178       if (TREE_CODE (t) == FUNCTION_DECL)
4179         {
4180           if (DECL_DESTRUCTOR_P (t))
4181             error ("taking address of destructor");
4182           return build_unary_op (ADDR_EXPR, t, 0);
4183         }
4184       if (TREE_CODE (t) == VAR_DECL)
4185         return build_unary_op (ADDR_EXPR, t, 0);
4186       else
4187         {
4188           tree type;
4189
4190           if (TREE_OPERAND (arg, 0)
4191               && ! is_dummy_object (TREE_OPERAND (arg, 0))
4192               && TREE_CODE (t) != FIELD_DECL)
4193             {
4194               error ("taking address of bound pointer-to-member expression");
4195               return error_mark_node;
4196             }
4197           if (!PTRMEM_OK_P (arg))
4198             return build_unary_op (code, arg, 0);
4199           
4200           if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
4201             {
4202               error ("cannot create pointer to reference member `%D'", t);
4203               return error_mark_node;
4204             }
4205
4206           type = build_ptrmem_type (DECL_FIELD_CONTEXT (t), TREE_TYPE (t));
4207           t = make_ptrmem_cst (type, TREE_OPERAND (arg, 1));
4208           return t;
4209         }
4210     }
4211
4212   
4213   /* We permit compiler to make function calls returning
4214      objects of aggregate type look like lvalues.  */
4215   {
4216     tree targ = arg;
4217
4218     if (TREE_CODE (targ) == SAVE_EXPR)
4219       targ = TREE_OPERAND (targ, 0);
4220
4221     if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (TREE_TYPE (targ)))
4222       {
4223         if (TREE_CODE (arg) == SAVE_EXPR)
4224           targ = arg;
4225         else
4226           targ = build_cplus_new (TREE_TYPE (arg), arg);
4227         return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), targ);
4228       }
4229
4230     if (TREE_CODE (arg) == SAVE_EXPR && TREE_CODE (targ) == INDIRECT_REF)
4231       return build (SAVE_EXPR, build_pointer_type (TREE_TYPE (arg)),
4232                      TREE_OPERAND (targ, 0), current_function_decl, NULL);
4233   }
4234
4235   /* Don't let anything else be handled specially.  */
4236   return 0;
4237 }
4238 \f
4239 /* Mark EXP saying that we need to be able to take the
4240    address of it; it should not be allocated in a register.
4241    Value is true if successful.
4242
4243    C++: we do not allow `current_class_ptr' to be addressable.  */
4244
4245 bool
4246 cxx_mark_addressable (tree exp)
4247 {
4248   tree x = exp;
4249
4250   while (1)
4251     switch (TREE_CODE (x))
4252       {
4253       case ADDR_EXPR:
4254       case COMPONENT_REF:
4255       case ARRAY_REF:
4256       case REALPART_EXPR:
4257       case IMAGPART_EXPR:
4258         x = TREE_OPERAND (x, 0);
4259         break;
4260
4261       case PARM_DECL:
4262         if (x == current_class_ptr)
4263           {
4264             error ("cannot take the address of `this', which is an rvalue expression");
4265             TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later.  */
4266             return true;
4267           }
4268         /* Fall through.  */
4269
4270       case VAR_DECL:
4271         /* Caller should not be trying to mark initialized
4272            constant fields addressable.  */
4273         my_friendly_assert (DECL_LANG_SPECIFIC (x) == 0
4274                             || DECL_IN_AGGR_P (x) == 0
4275                             || TREE_STATIC (x)
4276                             || DECL_EXTERNAL (x), 314);
4277         /* Fall through.  */
4278
4279       case CONST_DECL:
4280       case RESULT_DECL:
4281         if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
4282             && !DECL_ARTIFICIAL (x) && extra_warnings)
4283           warning ("address requested for `%D', which is declared `register'",
4284                       x);
4285         TREE_ADDRESSABLE (x) = 1;
4286         put_var_into_stack (x, /*rescan=*/true);
4287         return true;
4288
4289       case FUNCTION_DECL:
4290         TREE_ADDRESSABLE (x) = 1;
4291         TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
4292         return true;
4293
4294       case CONSTRUCTOR:
4295         TREE_ADDRESSABLE (x) = 1;
4296         return true;
4297
4298       case TARGET_EXPR:
4299         TREE_ADDRESSABLE (x) = 1;
4300         cxx_mark_addressable (TREE_OPERAND (x, 0));
4301         return true;
4302
4303       default:
4304         return true;
4305     }
4306 }
4307 \f
4308 /* Build and return a conditional expression IFEXP ? OP1 : OP2.  */
4309
4310 tree
4311 build_x_conditional_expr (tree ifexp, tree op1, tree op2)
4312 {
4313   tree orig_ifexp = ifexp;
4314   tree orig_op1 = op1;
4315   tree orig_op2 = op2;
4316   tree expr;
4317
4318   if (processing_template_decl)
4319     {
4320       /* The standard says that the expression is type-dependent if
4321          IFEXP is type-dependent, even though the eventual type of the
4322          expression doesn't dependent on IFEXP.  */
4323       if (type_dependent_expression_p (ifexp)
4324           /* As a GNU extension, the middle operand may be omitted.  */
4325           || (op1 && type_dependent_expression_p (op1))
4326           || type_dependent_expression_p (op2))
4327         return build_min_nt (COND_EXPR, ifexp, op1, op2);
4328       ifexp = build_non_dependent_expr (ifexp);
4329       if (op1)
4330         op1 = build_non_dependent_expr (op1);
4331       op2 = build_non_dependent_expr (op2);
4332     }
4333
4334   expr = build_conditional_expr (ifexp, op1, op2);
4335   if (processing_template_decl && expr != error_mark_node)
4336     return build_min_non_dep (COND_EXPR, expr, 
4337                               orig_ifexp, orig_op1, orig_op2);
4338   return expr;
4339 }
4340 \f
4341 /* Given a list of expressions, return a compound expression
4342    that performs them all and returns the value of the last of them.  */
4343
4344 tree build_x_compound_expr_from_list (tree list, const char *msg)
4345 {
4346   tree expr = TREE_VALUE (list);
4347   
4348   if (TREE_CHAIN (list))
4349     {
4350       if (msg)
4351         pedwarn ("%s expression list treated as compound expression", msg);
4352
4353       for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
4354         expr = build_x_compound_expr (expr, TREE_VALUE (list));
4355     }
4356   
4357   return expr;
4358 }
4359
4360 /* Handle overloading of the ',' operator when needed.  */
4361
4362 tree
4363 build_x_compound_expr (tree op1, tree op2)
4364 {
4365   tree result;
4366   tree orig_op1 = op1;
4367   tree orig_op2 = op2;
4368
4369   if (processing_template_decl)
4370     {
4371       if (type_dependent_expression_p (op1)
4372           || type_dependent_expression_p (op2))
4373         return build_min_nt (COMPOUND_EXPR, op1, op2);
4374       op1 = build_non_dependent_expr (op1);
4375       op2 = build_non_dependent_expr (op2);
4376     }
4377
4378   result = build_new_op (COMPOUND_EXPR, LOOKUP_NORMAL, op1, op2, NULL_TREE,
4379                          /*overloaded_p=*/NULL);
4380   if (!result)
4381     result = build_compound_expr (op1, op2);
4382
4383   if (processing_template_decl && result != error_mark_node)
4384     return build_min_non_dep (COMPOUND_EXPR, result, orig_op1, orig_op2);
4385   
4386   return result;
4387 }
4388
4389 /* Build a compound expression.  */
4390
4391 tree
4392 build_compound_expr (tree lhs, tree rhs)
4393 {
4394   lhs = decl_constant_value (lhs);
4395   lhs = convert_to_void (lhs, "left-hand operand of comma");
4396   
4397   if (lhs == error_mark_node || rhs == error_mark_node)
4398     return error_mark_node;
4399   
4400   if (TREE_CODE (rhs) == TARGET_EXPR)
4401     {
4402       /* If the rhs is a TARGET_EXPR, then build the compound
4403          expression inside the target_expr's initializer. This
4404          helps the compiler to eliminate unnecessary temporaries.  */
4405       tree init = TREE_OPERAND (rhs, 1);
4406       
4407       init = build (COMPOUND_EXPR, TREE_TYPE (init), lhs, init);
4408       TREE_OPERAND (rhs, 1) = init;
4409       
4410       return rhs;
4411     }
4412   
4413   return build (COMPOUND_EXPR, TREE_TYPE (rhs), lhs, rhs);
4414 }
4415
4416 /* Issue an error message if casting from SRC_TYPE to DEST_TYPE casts
4417    away constness.  DESCRIPTION explains what operation is taking
4418    place.  */
4419
4420 static void
4421 check_for_casting_away_constness (tree src_type, tree dest_type,
4422                                   const char *description)
4423 {
4424   if (casts_away_constness (src_type, dest_type))
4425     error ("%s from type `%T' to type `%T' casts away constness",
4426            description, src_type, dest_type);
4427 }
4428
4429 /* Return an expression representing static_cast<TYPE>(EXPR).  */
4430
4431 tree
4432 build_static_cast (tree type, tree expr)
4433 {
4434   tree intype;
4435   tree result;
4436
4437   if (type == error_mark_node || expr == error_mark_node)
4438     return error_mark_node;
4439
4440   if (processing_template_decl)
4441     {
4442       expr = build_min (STATIC_CAST_EXPR, type, expr);
4443       /* We don't know if it will or will not have side effects.  */
4444       TREE_SIDE_EFFECTS (expr) = 1;
4445       return expr;
4446     }
4447
4448   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4449      Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
4450   if (TREE_CODE (type) != REFERENCE_TYPE
4451       && TREE_CODE (expr) == NOP_EXPR
4452       && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
4453     expr = TREE_OPERAND (expr, 0);
4454
4455   intype = TREE_TYPE (expr);
4456
4457   /* [expr.static.cast]
4458
4459      An lvalue of type "cv1 B", where B is a class type, can be cast
4460      to type "reference to cv2 D", where D is a class derived (clause
4461      _class.derived_) from B, if a valid standard conversion from
4462      "pointer to D" to "pointer to B" exists (_conv.ptr_), cv2 is the
4463      same cv-qualification as, or greater cv-qualification than, cv1,
4464      and B is not a virtual base class of D.  */
4465   /* We check this case before checking the validity of "TYPE t =
4466      EXPR;" below because for this case:
4467
4468        struct B {};
4469        struct D : public B { D(const B&); };
4470        extern B& b;
4471        void f() { static_cast<const D&>(b); }
4472
4473      we want to avoid constructing a new D.  The standard is not
4474      completely clear about this issue, but our interpretation is
4475      consistent with other compilers.  */
4476   if (TREE_CODE (type) == REFERENCE_TYPE
4477       && CLASS_TYPE_P (TREE_TYPE (type))
4478       && CLASS_TYPE_P (intype)
4479       && real_lvalue_p (expr)
4480       && DERIVED_FROM_P (intype, TREE_TYPE (type))
4481       && can_convert (build_pointer_type (TYPE_MAIN_VARIANT (intype)),
4482                       build_pointer_type (TYPE_MAIN_VARIANT 
4483                                           (TREE_TYPE (type))))
4484       && at_least_as_qualified_p (TREE_TYPE (type), intype))
4485     {
4486       /* There is a standard conversion from "D*" to "B*" even if "B"
4487          is ambiguous or inaccessible.  Therefore, we ask lookup_base
4488          to check these conditions.  */
4489       tree base = lookup_base (TREE_TYPE (type), intype, ba_check, NULL);
4490
4491       /* Convert from "B*" to "D*".  This function will check that "B"
4492          is not a virtual base of "D".  */
4493       expr = build_base_path (MINUS_EXPR, build_address (expr), 
4494                               base, /*nonnull=*/false);
4495       /* Convert the pointer to a reference -- but then remember that
4496          there are no expressions with reference type in C++.  */
4497       return convert_from_reference (build_nop (type, expr));
4498     }
4499
4500   /* [expr.static.cast]
4501
4502      An expression e can be explicitly converted to a type T using a
4503      static_cast of the form static_cast<T>(e) if the declaration T
4504      t(e);" is well-formed, for some invented temporary variable
4505      t.  */
4506   result = perform_direct_initialization_if_possible (type, expr);
4507   if (result)
4508     return convert_from_reference (result);
4509   
4510   /* [expr.static.cast]
4511
4512      Any expression can be explicitly converted to type cv void.  */
4513   if (TREE_CODE (type) == VOID_TYPE)
4514     return convert_to_void (expr, /*implicit=*/NULL);
4515
4516   /* [expr.static.cast]
4517
4518      The inverse of any standard conversion sequence (clause _conv_),
4519      other than the lvalue-to-rvalue (_conv.lval_), array-to-pointer
4520      (_conv.array_), function-to-pointer (_conv.func_), and boolean
4521      (_conv.bool_) conversions, can be performed explicitly using
4522      static_cast subject to the restriction that the explicit
4523      conversion does not cast away constness (_expr.const.cast_), and
4524      the following additional rules for specific cases:  */
4525   /* For reference, the conversions not excluded are: integral
4526      promotions, floating point promotion, integral conversions,
4527      floating point conversions, floating-integral conversions,
4528      pointer conversions, and pointer to member conversions.  */
4529   if ((ARITHMETIC_TYPE_P (type) && ARITHMETIC_TYPE_P (intype))
4530       /* DR 128
4531
4532          A value of integral _or enumeration_ type can be explicitly
4533          converted to an enumeration type.  */
4534       || (INTEGRAL_OR_ENUMERATION_TYPE_P (type)
4535           && INTEGRAL_OR_ENUMERATION_TYPE_P (intype)))
4536     /* Really, build_c_cast should defer to this function rather
4537        than the other way around.  */
4538     return build_c_cast (type, expr);
4539   
4540   if (TYPE_PTR_P (type) && TYPE_PTR_P (intype)
4541       && CLASS_TYPE_P (TREE_TYPE (type))
4542       && CLASS_TYPE_P (TREE_TYPE (intype))
4543       && can_convert (build_pointer_type (TYPE_MAIN_VARIANT 
4544                                           (TREE_TYPE (intype))), 
4545                       build_pointer_type (TYPE_MAIN_VARIANT 
4546                                           (TREE_TYPE (type)))))
4547     {
4548       tree base;
4549
4550       check_for_casting_away_constness (intype, type, "static_cast");
4551       base = lookup_base (TREE_TYPE (type), TREE_TYPE (intype), ba_check, 
4552                           NULL);
4553       return build_base_path (MINUS_EXPR, expr, base, /*nonnull=*/false);
4554     }
4555   
4556   if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
4557       || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
4558     {
4559       tree c1;
4560       tree c2;
4561       tree t1;
4562       tree t2;
4563
4564       c1 = TYPE_PTRMEM_CLASS_TYPE (intype);
4565       c2 = TYPE_PTRMEM_CLASS_TYPE (type);
4566
4567       if (TYPE_PTRMEM_P (type))
4568         {
4569           t1 = (build_ptrmem_type 
4570                 (c1,
4571                  TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (intype))));
4572           t2 = (build_ptrmem_type 
4573                 (c2,
4574                  TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (type))));
4575         }
4576       else
4577         {
4578           t1 = intype;
4579           t2 = type;
4580         }
4581       if (can_convert (t1, t2))
4582         {
4583           check_for_casting_away_constness (intype, type, "static_cast");
4584           if (TYPE_PTRMEM_P (type))
4585             {
4586               tree delta;
4587
4588               if (TREE_CODE (expr) == PTRMEM_CST)
4589                 expr = cplus_expand_constant (expr);
4590               delta = get_delta_difference (c1, c2, /*force=*/1);
4591               if (!integer_zerop (delta))
4592                 expr = cp_build_binary_op (PLUS_EXPR, 
4593                                            build_nop (ptrdiff_type_node, expr),
4594                                            delta);
4595               return build_nop (type, expr);
4596             }
4597           else
4598             return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, 
4599                                      /*force=*/1);
4600         }
4601     }
4602     
4603   /* [expr.static.cast]
4604
4605      An rvalue of type "pointer to cv void" can be explicitly
4606      converted to a pointer to object type.  A value of type pointer
4607      to object converted to "pointer to cv void" and back to the
4608      original pointer type will have its original value.  */
4609   if (TREE_CODE (intype) == POINTER_TYPE 
4610       && VOID_TYPE_P (TREE_TYPE (intype))
4611       && TYPE_PTROB_P (type))
4612     {
4613       check_for_casting_away_constness (intype, type, "static_cast");
4614       return build_nop (type, expr);
4615     }
4616
4617   error ("invalid static_cast from type `%T' to type `%T'", intype, type);
4618   return error_mark_node;
4619 }
4620
4621 tree
4622 build_reinterpret_cast (tree type, tree expr)
4623 {
4624   tree intype;
4625
4626   if (type == error_mark_node || expr == error_mark_node)
4627     return error_mark_node;
4628
4629   if (processing_template_decl)
4630     {
4631       tree t = build_min (REINTERPRET_CAST_EXPR, type, expr);
4632       
4633       if (!TREE_SIDE_EFFECTS (t)
4634           && type_dependent_expression_p (expr))
4635         /* There might turn out to be side effects inside expr.  */
4636         TREE_SIDE_EFFECTS (t) = 1;
4637       return t;
4638     }
4639
4640   if (TREE_CODE (type) != REFERENCE_TYPE)
4641     {
4642       expr = decay_conversion (expr);
4643
4644       /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4645          Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
4646       if (TREE_CODE (expr) == NOP_EXPR
4647           && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
4648         expr = TREE_OPERAND (expr, 0);
4649     }
4650
4651   intype = TREE_TYPE (expr);
4652
4653   if (TREE_CODE (type) == REFERENCE_TYPE)
4654     {
4655       if (! real_lvalue_p (expr))
4656         {
4657           error ("invalid reinterpret_cast of an rvalue expression of type `%T' to type `%T'", intype, type);
4658           return error_mark_node;
4659         }
4660       expr = build_unary_op (ADDR_EXPR, expr, 0);
4661       if (expr != error_mark_node)
4662         expr = build_reinterpret_cast
4663           (build_pointer_type (TREE_TYPE (type)), expr);
4664       if (expr != error_mark_node)
4665         expr = build_indirect_ref (expr, 0);
4666       return expr;
4667     }
4668   else if (same_type_ignoring_top_level_qualifiers_p (intype, type))
4669     return build_static_cast (type, expr);
4670
4671   if (TYPE_PTR_P (type) && (TREE_CODE (intype) == INTEGER_TYPE
4672                             || TREE_CODE (intype) == ENUMERAL_TYPE))
4673     /* OK */;
4674   else if (TREE_CODE (type) == INTEGER_TYPE && TYPE_PTR_P (intype))
4675     {
4676       if (TYPE_PRECISION (type) < TYPE_PRECISION (intype))
4677         pedwarn ("reinterpret_cast from `%T' to `%T' loses precision",
4678                     intype, type);
4679     }
4680   else if ((TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype))
4681            || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
4682     {
4683       expr = decl_constant_value (expr);
4684       return fold (build1 (NOP_EXPR, type, expr));
4685     }
4686   else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
4687            || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
4688     {
4689       check_for_casting_away_constness (intype, type, "reinterpret_cast");
4690       expr = decl_constant_value (expr);
4691       return fold (build1 (NOP_EXPR, type, expr));
4692     }
4693   else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
4694            || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type)))
4695     {
4696       pedwarn ("ISO C++ forbids casting between pointer-to-function and pointer-to-object");
4697       expr = decl_constant_value (expr);
4698       return fold (build1 (NOP_EXPR, type, expr));
4699     }
4700   else
4701     {
4702       error ("invalid reinterpret_cast from type `%T' to type `%T'",
4703                 intype, type);
4704       return error_mark_node;
4705     }
4706       
4707   return cp_convert (type, expr);
4708 }
4709
4710 tree
4711 build_const_cast (tree type, tree expr)
4712 {
4713   tree intype;
4714
4715   if (type == error_mark_node || expr == error_mark_node)
4716     return error_mark_node;
4717
4718   if (processing_template_decl)
4719     {
4720       tree t = build_min (CONST_CAST_EXPR, type, expr);
4721       
4722       if (!TREE_SIDE_EFFECTS (t)
4723           && type_dependent_expression_p (expr))
4724         /* There might turn out to be side effects inside expr.  */
4725         TREE_SIDE_EFFECTS (t) = 1;
4726       return t;
4727     }
4728
4729   if (!POINTER_TYPE_P (type))
4730     error ("invalid use of const_cast with type `%T', which is not a pointer, reference, nor a pointer-to-data-member type", type);
4731   else if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
4732     {
4733       error ("invalid use of const_cast with type `%T', which is a pointer or reference to a function type", type);
4734       return error_mark_node;
4735     }
4736
4737   if (TREE_CODE (type) != REFERENCE_TYPE)
4738     {
4739       expr = decay_conversion (expr);
4740
4741       /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4742          Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
4743       if (TREE_CODE (expr) == NOP_EXPR
4744           && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
4745         expr = TREE_OPERAND (expr, 0);
4746     }
4747
4748   intype = TREE_TYPE (expr);
4749   
4750   if (same_type_ignoring_top_level_qualifiers_p (intype, type))
4751     return build_static_cast (type, expr);
4752   else if (TREE_CODE (type) == REFERENCE_TYPE)
4753     {
4754       if (! real_lvalue_p (expr))
4755         {
4756           error ("invalid const_cast of an rvalue of type `%T' to type `%T'", intype, type);
4757           return error_mark_node;
4758         }
4759
4760       if (comp_ptr_ttypes_const (TREE_TYPE (type), intype))
4761         {
4762           expr = build_unary_op (ADDR_EXPR, expr, 0);
4763           expr = build1 (NOP_EXPR, type, expr);
4764           return convert_from_reference (expr);
4765         }
4766     }
4767   else if (((TREE_CODE (type) == POINTER_TYPE
4768              && TREE_CODE (intype) == POINTER_TYPE)
4769             || (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype)))
4770            && comp_ptr_ttypes_const (TREE_TYPE (type), TREE_TYPE (intype)))
4771     return cp_convert (type, expr);
4772
4773   error ("invalid const_cast from type `%T' to type `%T'", intype, type);
4774   return error_mark_node;
4775 }
4776
4777 /* Build an expression representing a cast to type TYPE of expression EXPR.
4778
4779    ALLOW_NONCONVERTING is true if we should allow non-converting constructors
4780    when doing the cast.  */
4781
4782 tree
4783 build_c_cast (tree type, tree expr)
4784 {
4785   tree value = expr;
4786   tree otype;
4787
4788   if (type == error_mark_node || expr == error_mark_node)
4789     return error_mark_node;
4790
4791   if (processing_template_decl)
4792     {
4793       tree t = build_min (CAST_EXPR, type,
4794                           tree_cons (NULL_TREE, value, NULL_TREE));
4795       /* We don't know if it will or will not have side effects.  */
4796       TREE_SIDE_EFFECTS (t) = 1;
4797       return t;
4798     }
4799
4800   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4801      Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
4802   if (TREE_CODE (type) != REFERENCE_TYPE
4803       && TREE_CODE (value) == NOP_EXPR
4804       && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
4805     value = TREE_OPERAND (value, 0);
4806
4807   if (TREE_CODE (type) == ARRAY_TYPE)
4808     {
4809       /* Allow casting from T1* to T2[] because Cfront allows it.
4810          NIHCL uses it. It is not valid ISO C++ however.  */
4811       if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
4812         {
4813           pedwarn ("ISO C++ forbids casting to an array type `%T'", type);
4814           type = build_pointer_type (TREE_TYPE (type));
4815         }
4816       else
4817         {
4818           error ("ISO C++ forbids casting to an array type `%T'", type);
4819           return error_mark_node;
4820         }
4821     }
4822
4823   if (TREE_CODE (type) == FUNCTION_TYPE
4824       || TREE_CODE (type) == METHOD_TYPE)
4825     {
4826       error ("invalid cast to function type `%T'", type);
4827       return error_mark_node;
4828     }
4829
4830   if (TREE_CODE (type) == VOID_TYPE)
4831     {
4832       /* Conversion to void does not cause any of the normal function to
4833        * pointer, array to pointer and lvalue to rvalue decays.  */
4834       
4835       value = convert_to_void (value, /*implicit=*/NULL);
4836       return value;
4837     }
4838
4839   if (!complete_type_or_else (type, NULL_TREE))
4840     return error_mark_node;
4841
4842   /* Convert functions and arrays to pointers and
4843      convert references to their expanded types,
4844      but don't convert any other types.  If, however, we are
4845      casting to a class type, there's no reason to do this: the
4846      cast will only succeed if there is a converting constructor,
4847      and the default conversions will be done at that point.  In
4848      fact, doing the default conversion here is actually harmful
4849      in cases like this:
4850
4851      typedef int A[2];
4852      struct S { S(const A&); };
4853
4854      since we don't want the array-to-pointer conversion done.  */
4855   if (!IS_AGGR_TYPE (type))
4856     {
4857       if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE
4858           || (TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE
4859               /* Don't do the default conversion on a ->* expression.  */
4860               && ! (TREE_CODE (type) == POINTER_TYPE
4861                     && bound_pmf_p (value)))
4862           || TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE
4863           || TREE_CODE (TREE_TYPE (value)) == REFERENCE_TYPE)
4864         value = decay_conversion (value);
4865     }
4866   else if (TREE_CODE (TREE_TYPE (value)) == REFERENCE_TYPE)
4867     /* However, even for class types, we still need to strip away
4868        the reference type, since the call to convert_force below
4869        does not expect the input expression to be of reference
4870        type.  */
4871     value = convert_from_reference (value);
4872         
4873   otype = TREE_TYPE (value);
4874
4875   /* Optionally warn about potentially worrisome casts.  */
4876
4877   if (warn_cast_qual
4878       && TREE_CODE (type) == POINTER_TYPE
4879       && TREE_CODE (otype) == POINTER_TYPE
4880       && !at_least_as_qualified_p (TREE_TYPE (type),
4881                                    TREE_TYPE (otype)))
4882     warning ("cast from `%T' to `%T' discards qualifiers from pointer target type",
4883                 otype, type);
4884
4885   if (TREE_CODE (type) == INTEGER_TYPE
4886       && TYPE_PTR_P (otype)
4887       && TYPE_PRECISION (type) != TYPE_PRECISION (otype))
4888     warning ("cast from pointer to integer of different size");
4889
4890   if (TYPE_PTR_P (type)
4891       && TREE_CODE (otype) == INTEGER_TYPE
4892       && TYPE_PRECISION (type) != TYPE_PRECISION (otype)
4893       /* Don't warn about converting any constant.  */
4894       && !TREE_CONSTANT (value))
4895     warning ("cast to pointer from integer of different size");
4896
4897   if (TREE_CODE (type) == REFERENCE_TYPE)
4898     value = (convert_from_reference
4899              (convert_to_reference (type, value, CONV_C_CAST,
4900                                     LOOKUP_COMPLAIN, NULL_TREE)));
4901   else
4902     {
4903       tree ovalue;
4904
4905       value = decl_constant_value (value);
4906
4907       ovalue = value;
4908       value = convert_force (type, value, CONV_C_CAST);
4909
4910       /* Ignore any integer overflow caused by the cast.  */
4911       if (TREE_CODE (value) == INTEGER_CST)
4912         {
4913           TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue);
4914           TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
4915         }
4916     }
4917
4918   /* Warn about possible alignment problems.  Do this here when we will have
4919      instantiated any necessary template types.  */
4920   if (STRICT_ALIGNMENT && warn_cast_align
4921       && TREE_CODE (type) == POINTER_TYPE
4922       && TREE_CODE (otype) == POINTER_TYPE
4923       && TREE_CODE (TREE_TYPE (otype)) != VOID_TYPE
4924       && TREE_CODE (TREE_TYPE (otype)) != FUNCTION_TYPE
4925       && COMPLETE_TYPE_P (TREE_TYPE (otype))
4926       && COMPLETE_TYPE_P (TREE_TYPE (type))
4927       && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype)))
4928     warning ("cast from `%T' to `%T' increases required alignment of target type",
4929                 otype, type);
4930
4931     /* Always produce some operator for an explicit cast,
4932        so we can tell (for -pedantic) that the cast is no lvalue.  */
4933   if (TREE_CODE (type) != REFERENCE_TYPE && value == expr
4934       && real_lvalue_p (value))
4935     value = non_lvalue (value);
4936
4937   return value;
4938 }
4939 \f
4940 /* Build an assignment expression of lvalue LHS from value RHS.
4941    MODIFYCODE is the code for a binary operator that we use
4942    to combine the old value of LHS with RHS to get the new value.
4943    Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
4944
4945    C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed.  */
4946
4947 tree
4948 build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
4949 {
4950   tree result;
4951   tree newrhs = rhs;
4952   tree lhstype = TREE_TYPE (lhs);
4953   tree olhstype = lhstype;
4954   tree olhs = NULL_TREE;
4955
4956   /* Avoid duplicate error messages from operands that had errors.  */
4957   if (lhs == error_mark_node || rhs == error_mark_node)
4958     return error_mark_node;
4959
4960   /* Handle control structure constructs used as "lvalues".  */
4961   switch (TREE_CODE (lhs))
4962     {
4963       /* Handle --foo = 5; as these are valid constructs in C++.  */
4964     case PREDECREMENT_EXPR:
4965     case PREINCREMENT_EXPR:
4966       if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
4967         lhs = build (TREE_CODE (lhs), TREE_TYPE (lhs),
4968                      stabilize_reference (TREE_OPERAND (lhs, 0)),
4969                      TREE_OPERAND (lhs, 1));
4970       return build (COMPOUND_EXPR, lhstype,
4971                     lhs,
4972                     build_modify_expr (TREE_OPERAND (lhs, 0),
4973                                        modifycode, rhs));
4974
4975       /* Handle (a, b) used as an "lvalue".  */
4976     case COMPOUND_EXPR:
4977       newrhs = build_modify_expr (TREE_OPERAND (lhs, 1),
4978                                   modifycode, rhs);
4979       if (newrhs == error_mark_node)
4980         return error_mark_node;
4981       return build (COMPOUND_EXPR, lhstype,
4982                     TREE_OPERAND (lhs, 0), newrhs);
4983
4984     case MODIFY_EXPR:
4985       if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
4986         lhs = build (TREE_CODE (lhs), TREE_TYPE (lhs),
4987                      stabilize_reference (TREE_OPERAND (lhs, 0)),
4988                      TREE_OPERAND (lhs, 1));
4989       newrhs = build_modify_expr (TREE_OPERAND (lhs, 0), modifycode, rhs);
4990       if (newrhs == error_mark_node)
4991         return error_mark_node;
4992       return build (COMPOUND_EXPR, lhstype, lhs, newrhs);
4993
4994       /* Handle (a ? b : c) used as an "lvalue".  */
4995     case COND_EXPR:
4996       {
4997         /* Produce (a ? (b = rhs) : (c = rhs))
4998            except that the RHS goes through a save-expr
4999            so the code to compute it is only emitted once.  */
5000         tree cond;
5001         tree preeval = NULL_TREE;
5002
5003         rhs = stabilize_expr (rhs, &preeval);
5004         
5005         /* Check this here to avoid odd errors when trying to convert
5006            a throw to the type of the COND_EXPR.  */
5007         if (!lvalue_or_else (lhs, "assignment"))
5008           return error_mark_node;
5009
5010         cond = build_conditional_expr
5011           (TREE_OPERAND (lhs, 0),
5012            build_modify_expr (cp_convert (TREE_TYPE (lhs),
5013                                           TREE_OPERAND (lhs, 1)),
5014                               modifycode, rhs),
5015            build_modify_expr (cp_convert (TREE_TYPE (lhs),
5016                                           TREE_OPERAND (lhs, 2)),
5017                               modifycode, rhs));
5018
5019         if (cond == error_mark_node)
5020           return cond;
5021         /* Make sure the code to compute the rhs comes out
5022            before the split.  */
5023         return build (COMPOUND_EXPR, TREE_TYPE (lhs), preeval, cond);
5024       }
5025       
5026     default:
5027       break;
5028     }
5029
5030   if (modifycode == INIT_EXPR)
5031     {
5032       if (TREE_CODE (rhs) == CONSTRUCTOR)
5033         {
5034           if (! same_type_p (TREE_TYPE (rhs), lhstype))
5035             /* Call convert to generate an error; see PR 11063.  */
5036             rhs = convert (lhstype, rhs);
5037           result = build (INIT_EXPR, lhstype, lhs, rhs);
5038           TREE_SIDE_EFFECTS (result) = 1;
5039           return result;
5040         }
5041       else if (! IS_AGGR_TYPE (lhstype))
5042         /* Do the default thing.  */;
5043       else
5044         {
5045           result = build_special_member_call (lhs, complete_ctor_identifier,
5046                                               build_tree_list (NULL_TREE, rhs),
5047                                               TYPE_BINFO (lhstype), 
5048                                               LOOKUP_NORMAL);
5049           if (result == NULL_TREE)
5050             return error_mark_node;
5051           return result;
5052         }
5053     }
5054   else
5055     {
5056       if (TREE_CODE (lhstype) == REFERENCE_TYPE)
5057         {
5058           lhs = convert_from_reference (lhs);
5059           olhstype = lhstype = TREE_TYPE (lhs);
5060         }
5061       lhs = require_complete_type (lhs);
5062       if (lhs == error_mark_node)
5063         return error_mark_node;
5064
5065       if (modifycode == NOP_EXPR)
5066         {
5067           /* `operator=' is not an inheritable operator.  */
5068           if (! IS_AGGR_TYPE (lhstype))
5069             /* Do the default thing.  */;
5070           else
5071             {
5072               result = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL,
5073                                      lhs, rhs, make_node (NOP_EXPR),
5074                                      /*overloaded_p=*/NULL);
5075               if (result == NULL_TREE)
5076                 return error_mark_node;
5077               return result;
5078             }
5079           lhstype = olhstype;
5080         }
5081       else
5082         {
5083           /* A binary op has been requested.  Combine the old LHS
5084              value with the RHS producing the value we should actually
5085              store into the LHS.  */
5086
5087           my_friendly_assert (!PROMOTES_TO_AGGR_TYPE (lhstype, REFERENCE_TYPE),
5088                               978652);
5089           lhs = stabilize_reference (lhs);
5090           newrhs = cp_build_binary_op (modifycode, lhs, rhs);
5091           if (newrhs == error_mark_node)
5092             {
5093               error ("  in evaluation of `%Q(%#T, %#T)'", modifycode,
5094                      TREE_TYPE (lhs), TREE_TYPE (rhs));
5095               return error_mark_node;
5096             }
5097           
5098           /* Now it looks like a plain assignment.  */
5099           modifycode = NOP_EXPR;
5100         }
5101       my_friendly_assert (TREE_CODE (lhstype) != REFERENCE_TYPE, 20011220);
5102       my_friendly_assert (TREE_CODE (TREE_TYPE (newrhs)) != REFERENCE_TYPE,
5103                           20011220);
5104     }
5105
5106   /* The left-hand side must be an lvalue.  */
5107   if (!lvalue_or_else (lhs, "assignment"))
5108     return error_mark_node;
5109
5110   /* Warn about modifying something that is `const'.  Don't warn if
5111      this is initialization.  */
5112   if (modifycode != INIT_EXPR
5113       && (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype)
5114           /* Functions are not modifiable, even though they are
5115              lvalues.  */
5116           || TREE_CODE (TREE_TYPE (lhs)) == FUNCTION_TYPE
5117           || TREE_CODE (TREE_TYPE (lhs)) == METHOD_TYPE
5118           /* If it's an aggregate and any field is const, then it is
5119              effectively const.  */
5120           || (CLASS_TYPE_P (lhstype)
5121               && C_TYPE_FIELDS_READONLY (lhstype))))
5122     readonly_error (lhs, "assignment", 0);
5123
5124   /* If storing into a structure or union member, it has probably been
5125      given type `int'.  Compute the type that would go with the actual
5126      amount of storage the member occupies.  */
5127
5128   if (TREE_CODE (lhs) == COMPONENT_REF
5129       && (TREE_CODE (lhstype) == INTEGER_TYPE
5130           || TREE_CODE (lhstype) == REAL_TYPE
5131           || TREE_CODE (lhstype) == ENUMERAL_TYPE))
5132     {
5133       lhstype = TREE_TYPE (get_unwidened (lhs, 0));
5134
5135       /* If storing in a field that is in actuality a short or narrower
5136          than one, we must store in the field in its actual type.  */
5137
5138       if (lhstype != TREE_TYPE (lhs))
5139         {
5140           /* Avoid warnings converting integral types back into enums for
5141              enum bit fields.  */
5142           if (TREE_CODE (lhstype) == INTEGER_TYPE
5143               && TREE_CODE (olhstype) == ENUMERAL_TYPE)
5144             {
5145               if (TREE_SIDE_EFFECTS (lhs))
5146                 lhs = stabilize_reference (lhs);
5147               olhs = lhs;
5148             }
5149           lhs = copy_node (lhs);
5150           TREE_TYPE (lhs) = lhstype;
5151         }
5152     }
5153
5154   /* Convert new value to destination type.  */
5155
5156   if (TREE_CODE (lhstype) == ARRAY_TYPE)
5157     {
5158       int from_array;
5159       
5160       if (!same_or_base_type_p (TYPE_MAIN_VARIANT (lhstype),
5161                                 TYPE_MAIN_VARIANT (TREE_TYPE (rhs))))
5162         {
5163           error ("incompatible types in assignment of `%T' to `%T'",
5164                  TREE_TYPE (rhs), lhstype);
5165           return error_mark_node;
5166         }
5167
5168       /* Allow array assignment in compiler-generated code.  */
5169       if (! DECL_ARTIFICIAL (current_function_decl))
5170         pedwarn ("ISO C++ forbids assignment of arrays");
5171
5172       from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
5173                    ? 1 + (modifycode != INIT_EXPR): 0;
5174       return build_vec_init (lhs, NULL_TREE, newrhs, from_array);
5175     }
5176
5177   if (modifycode == INIT_EXPR)
5178     newrhs = convert_for_initialization (lhs, lhstype, newrhs, LOOKUP_NORMAL,
5179                                          "initialization", NULL_TREE, 0);
5180   else
5181     {
5182       /* Avoid warnings on enum bit fields.  */
5183       if (TREE_CODE (olhstype) == ENUMERAL_TYPE
5184           && TREE_CODE (lhstype) == INTEGER_TYPE)
5185         {
5186           newrhs = convert_for_assignment (olhstype, newrhs, "assignment",
5187                                            NULL_TREE, 0);
5188           newrhs = convert_force (lhstype, newrhs, 0);
5189         }
5190       else
5191         newrhs = convert_for_assignment (lhstype, newrhs, "assignment",
5192                                          NULL_TREE, 0);
5193       if (TREE_CODE (newrhs) == CALL_EXPR
5194           && TYPE_NEEDS_CONSTRUCTING (lhstype))
5195         newrhs = build_cplus_new (lhstype, newrhs);
5196
5197       /* Can't initialize directly from a TARGET_EXPR, since that would
5198          cause the lhs to be constructed twice, and possibly result in
5199          accidental self-initialization.  So we force the TARGET_EXPR to be
5200          expanded without a target.  */
5201       if (TREE_CODE (newrhs) == TARGET_EXPR)
5202         newrhs = build (COMPOUND_EXPR, TREE_TYPE (newrhs), newrhs,
5203                         TREE_OPERAND (newrhs, 0));
5204     }
5205
5206   if (newrhs == error_mark_node)
5207     return error_mark_node;
5208
5209   result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
5210                   lhstype, lhs, newrhs);
5211
5212   TREE_SIDE_EFFECTS (result) = 1;
5213
5214   /* If we got the LHS in a different type for storing in,
5215      convert the result back to the nominal type of LHS
5216      so that the value we return always has the same type
5217      as the LHS argument.  */
5218
5219   if (olhstype == TREE_TYPE (result))
5220     return result;
5221   if (olhs)
5222     {
5223       result = build (COMPOUND_EXPR, olhstype, result, olhs);
5224       TREE_NO_UNUSED_WARNING (result) = 1;
5225       return result;
5226     }
5227   return convert_for_assignment (olhstype, result, "assignment",
5228                                  NULL_TREE, 0);
5229 }
5230
5231 tree
5232 build_x_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
5233 {
5234   if (processing_template_decl)
5235     return build_min_nt (MODOP_EXPR, lhs,
5236                          build_min_nt (modifycode, NULL_TREE, NULL_TREE), rhs);
5237
5238   if (modifycode != NOP_EXPR)
5239     {
5240       tree rval = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL, lhs, rhs,
5241                                 make_node (modifycode),
5242                                 /*overloaded_p=*/NULL);
5243       if (rval)
5244         return rval;
5245     }
5246   return build_modify_expr (lhs, modifycode, rhs);
5247 }
5248
5249 \f
5250 /* Get difference in deltas for different pointer to member function
5251    types.  Returns an integer constant of type PTRDIFF_TYPE_NODE.  If
5252    the conversion is invalid, the constant is zero.  If FORCE is true,
5253    then allow reverse conversions as well.
5254
5255    Note that the naming of FROM and TO is kind of backwards; the return
5256    value is what we add to a TO in order to get a FROM.  They are named
5257    this way because we call this function to find out how to convert from
5258    a pointer to member of FROM to a pointer to member of TO.  */
5259
5260 static tree
5261 get_delta_difference (tree from, tree to, int force)
5262 {
5263   tree binfo;
5264   tree virt_binfo;
5265   base_kind kind;
5266   
5267   binfo = lookup_base (to, from, ba_check, &kind);
5268   if (kind == bk_inaccessible || kind == bk_ambig)
5269     {
5270       error ("   in pointer to member function conversion");
5271       goto error;
5272     }
5273   if (!binfo)
5274     {
5275       if (!force)
5276         {
5277           error_not_base_type (from, to);
5278           error ("   in pointer to member conversion");
5279           goto error;
5280         }
5281       binfo = lookup_base (from, to, ba_check, &kind);
5282       if (!binfo)
5283         goto error;
5284       virt_binfo = binfo_from_vbase (binfo);
5285       if (virt_binfo)
5286         {
5287           /* This is a reinterpret cast, we choose to do nothing.  */
5288           warning ("pointer to member cast via virtual base `%T'",
5289                    BINFO_TYPE (virt_binfo));
5290           goto error;
5291         }
5292       return convert_to_integer (ptrdiff_type_node, 
5293                                  size_diffop (size_zero_node,
5294                                               BINFO_OFFSET (binfo)));
5295     }
5296
5297   virt_binfo = binfo_from_vbase (binfo);
5298   if (!virt_binfo)
5299     return convert_to_integer (ptrdiff_type_node, BINFO_OFFSET (binfo));
5300
5301   /* This is a reinterpret cast, we choose to do nothing.  */
5302   if (force)
5303     warning ("pointer to member cast via virtual base `%T'",
5304              BINFO_TYPE (virt_binfo));
5305   else
5306     error ("pointer to member conversion via virtual base `%T'",
5307            BINFO_TYPE (virt_binfo));
5308
5309  error:
5310   return convert_to_integer(ptrdiff_type_node, integer_zero_node);
5311 }
5312
5313 /* Return a constructor for the pointer-to-member-function TYPE using
5314    the other components as specified.  */
5315
5316 tree
5317 build_ptrmemfunc1 (tree type, tree delta, tree pfn)
5318 {
5319   tree u = NULL_TREE;
5320   tree delta_field;
5321   tree pfn_field;
5322
5323   /* Pull the FIELD_DECLs out of the type.  */
5324   pfn_field = TYPE_FIELDS (type);
5325   delta_field = TREE_CHAIN (pfn_field);
5326
5327   /* Make sure DELTA has the type we want.  */
5328   delta = convert_and_check (delta_type_node, delta);
5329
5330   /* Finish creating the initializer.  */
5331   u = tree_cons (pfn_field, pfn,
5332                  build_tree_list (delta_field, delta));
5333   u = build_constructor (type, u);
5334   TREE_CONSTANT (u) = TREE_CONSTANT (pfn) && TREE_CONSTANT (delta);
5335   TREE_STATIC (u) = (TREE_CONSTANT (u)
5336                      && (initializer_constant_valid_p (pfn, TREE_TYPE (pfn))
5337                          != NULL_TREE)
5338                      && (initializer_constant_valid_p (delta, TREE_TYPE (delta)) 
5339                          != NULL_TREE));
5340   return u;
5341 }
5342
5343 /* Build a constructor for a pointer to member function.  It can be
5344    used to initialize global variables, local variable, or used
5345    as a value in expressions.  TYPE is the POINTER to METHOD_TYPE we
5346    want to be.
5347
5348    If FORCE is nonzero, then force this conversion, even if
5349    we would rather not do it.  Usually set when using an explicit
5350    cast.
5351
5352    Return error_mark_node, if something goes wrong.  */
5353
5354 tree
5355 build_ptrmemfunc (tree type, tree pfn, int force)
5356 {
5357   tree fn;
5358   tree pfn_type;
5359   tree to_type;
5360
5361   if (error_operand_p (pfn))
5362     return error_mark_node;
5363
5364   pfn_type = TREE_TYPE (pfn);
5365   to_type = build_ptrmemfunc_type (type);
5366
5367   /* Handle multiple conversions of pointer to member functions.  */
5368   if (TYPE_PTRMEMFUNC_P (pfn_type))
5369     {
5370       tree delta = NULL_TREE;
5371       tree npfn = NULL_TREE;
5372       tree n;
5373
5374       if (!force 
5375           && !can_convert_arg (to_type, TREE_TYPE (pfn), pfn))
5376         error ("invalid conversion to type `%T' from type `%T'", 
5377                   to_type, pfn_type);
5378
5379       n = get_delta_difference (TYPE_PTRMEMFUNC_OBJECT_TYPE (pfn_type),
5380                                 TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type),
5381                                 force);
5382
5383       /* We don't have to do any conversion to convert a
5384          pointer-to-member to its own type.  But, we don't want to
5385          just return a PTRMEM_CST if there's an explicit cast; that
5386          cast should make the expression an invalid template argument.  */
5387       if (TREE_CODE (pfn) != PTRMEM_CST)
5388         {
5389           if (same_type_p (to_type, pfn_type))
5390             return pfn;
5391           else if (integer_zerop (n))
5392             return build_reinterpret_cast (to_type, pfn);
5393         }
5394
5395       if (TREE_SIDE_EFFECTS (pfn))
5396         pfn = save_expr (pfn);
5397
5398       /* Obtain the function pointer and the current DELTA.  */
5399       if (TREE_CODE (pfn) == PTRMEM_CST)
5400         expand_ptrmemfunc_cst (pfn, &delta, &npfn);
5401       else
5402         {
5403           npfn = build_ptrmemfunc_access_expr (pfn, pfn_identifier);
5404           delta = build_ptrmemfunc_access_expr (pfn, delta_identifier);
5405         }
5406
5407       /* Just adjust the DELTA field.  */
5408       my_friendly_assert (TREE_TYPE (delta) == ptrdiff_type_node, 20030727);
5409       if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta)
5410         n = cp_build_binary_op (LSHIFT_EXPR, n, integer_one_node);
5411       delta = cp_build_binary_op (PLUS_EXPR, delta, n);
5412       return build_ptrmemfunc1 (to_type, delta, npfn);
5413     }
5414
5415   /* Handle null pointer to member function conversions.  */
5416   if (integer_zerop (pfn))
5417     {
5418       pfn = build_c_cast (type, integer_zero_node);
5419       return build_ptrmemfunc1 (to_type,
5420                                 integer_zero_node, 
5421                                 pfn);
5422     }
5423
5424   if (type_unknown_p (pfn))
5425     return instantiate_type (type, pfn, tf_error | tf_warning);
5426
5427   fn = TREE_OPERAND (pfn, 0);
5428   my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 0);
5429   return make_ptrmem_cst (to_type, fn);
5430 }
5431
5432 /* Return the DELTA, IDX, PFN, and DELTA2 values for the PTRMEM_CST
5433    given by CST.
5434
5435    ??? There is no consistency as to the types returned for the above
5436    values.  Some code acts as if it were a sizetype and some as if it were
5437    integer_type_node.  */
5438
5439 void
5440 expand_ptrmemfunc_cst (tree cst, tree *delta, tree *pfn)
5441 {
5442   tree type = TREE_TYPE (cst);
5443   tree fn = PTRMEM_CST_MEMBER (cst);
5444   tree ptr_class, fn_class;
5445
5446   my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 0);
5447
5448   /* The class that the function belongs to.  */
5449   fn_class = DECL_CONTEXT (fn);
5450
5451   /* The class that we're creating a pointer to member of.  */
5452   ptr_class = TYPE_PTRMEMFUNC_OBJECT_TYPE (type);
5453
5454   /* First, calculate the adjustment to the function's class.  */
5455   *delta = get_delta_difference (fn_class, ptr_class, /*force=*/0);
5456
5457   if (!DECL_VIRTUAL_P (fn))
5458     *pfn = convert (TYPE_PTRMEMFUNC_FN_TYPE (type), build_addr_func (fn));
5459   else
5460     {
5461       /* If we're dealing with a virtual function, we have to adjust 'this'
5462          again, to point to the base which provides the vtable entry for
5463          fn; the call will do the opposite adjustment.  */
5464       tree orig_class = DECL_CONTEXT (fn);
5465       tree binfo = binfo_or_else (orig_class, fn_class);
5466       *delta = fold (build (PLUS_EXPR, TREE_TYPE (*delta),
5467                             *delta, BINFO_OFFSET (binfo)));
5468
5469       /* We set PFN to the vtable offset at which the function can be
5470          found, plus one (unless ptrmemfunc_vbit_in_delta, in which
5471          case delta is shifted left, and then incremented).  */
5472       *pfn = DECL_VINDEX (fn);
5473       *pfn = fold (build (MULT_EXPR, integer_type_node, *pfn,
5474                           TYPE_SIZE_UNIT (vtable_entry_type)));
5475
5476       switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
5477         {
5478         case ptrmemfunc_vbit_in_pfn:
5479           *pfn = fold (build (PLUS_EXPR, integer_type_node, *pfn,
5480                               integer_one_node));
5481           break;
5482
5483         case ptrmemfunc_vbit_in_delta:
5484           *delta = fold (build (LSHIFT_EXPR, TREE_TYPE (*delta),
5485                                 *delta, integer_one_node));
5486           *delta = fold (build (PLUS_EXPR, TREE_TYPE (*delta),
5487                                 *delta, integer_one_node));
5488           break;
5489
5490         default:
5491           abort ();
5492         }
5493
5494       *pfn = fold (build1 (NOP_EXPR, TYPE_PTRMEMFUNC_FN_TYPE (type),
5495                            *pfn));
5496     }
5497 }
5498
5499 /* Return an expression for PFN from the pointer-to-member function
5500    given by T.  */
5501
5502 tree
5503 pfn_from_ptrmemfunc (tree t)
5504 {
5505   if (TREE_CODE (t) == PTRMEM_CST)
5506     {
5507       tree delta;
5508       tree pfn;
5509       
5510       expand_ptrmemfunc_cst (t, &delta, &pfn);
5511       if (pfn)
5512         return pfn;
5513     }
5514
5515   return build_ptrmemfunc_access_expr (t, pfn_identifier);
5516 }
5517
5518 /* Expression EXPR is about to be implicitly converted to TYPE.  Warn
5519    if this is a potentially dangerous thing to do.  Returns a possibly
5520    marked EXPR.  */
5521
5522 tree
5523 dubious_conversion_warnings (tree type, tree expr,
5524                              const char *errtype, tree fndecl, int parmnum)
5525 {
5526   type = non_reference (type);
5527   
5528   /* Issue warnings about peculiar, but valid, uses of NULL.  */
5529   if (ARITHMETIC_TYPE_P (type) && expr == null_node)
5530     {
5531       if (fndecl)
5532         warning ("passing NULL used for non-pointer %s %P of `%D'",
5533                     errtype, parmnum, fndecl);
5534       else
5535         warning ("%s to non-pointer type `%T' from NULL", errtype, type);
5536     }
5537   
5538   /* Warn about assigning a floating-point type to an integer type.  */
5539   if (TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE
5540       && TREE_CODE (type) == INTEGER_TYPE)
5541     {
5542       if (fndecl)
5543         warning ("passing `%T' for %s %P of `%D'",
5544                     TREE_TYPE (expr), errtype, parmnum, fndecl);
5545       else
5546         warning ("%s to `%T' from `%T'", errtype, type, TREE_TYPE (expr));
5547     }
5548   /* And warn about assigning a negative value to an unsigned
5549      variable.  */
5550   else if (TREE_UNSIGNED (type) && TREE_CODE (type) != BOOLEAN_TYPE)
5551     {
5552       if (TREE_CODE (expr) == INTEGER_CST
5553           && TREE_NEGATED_INT (expr))
5554         {
5555           if (fndecl)
5556             warning ("passing negative value `%E' for %s %P of `%D'",
5557                         expr, errtype, parmnum, fndecl);
5558           else
5559             warning ("%s of negative value `%E' to `%T'",
5560                         errtype, expr, type);
5561         }
5562
5563       overflow_warning (expr);
5564
5565       if (TREE_CONSTANT (expr))
5566         expr = fold (expr);
5567     }
5568   return expr;
5569 }
5570
5571 /* Convert value RHS to type TYPE as preparation for an assignment to
5572    an lvalue of type TYPE.  ERRTYPE is a string to use in error
5573    messages: "assignment", "return", etc.  If FNDECL is non-NULL, we
5574    are doing the conversion in order to pass the PARMNUMth argument of
5575    FNDECL.  */
5576
5577 static tree
5578 convert_for_assignment (tree type, tree rhs,
5579                         const char *errtype, tree fndecl, int parmnum)
5580 {
5581   tree rhstype;
5582   enum tree_code coder;
5583
5584   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
5585   if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
5586     rhs = TREE_OPERAND (rhs, 0);
5587
5588   rhstype = TREE_TYPE (rhs);
5589   coder = TREE_CODE (rhstype);
5590
5591   if (TREE_CODE (type) == VECTOR_TYPE && coder == VECTOR_TYPE
5592       && ((*targetm.vector_opaque_p) (type)
5593           || (*targetm.vector_opaque_p) (rhstype)))
5594     return convert (type, rhs);
5595
5596   if (rhs == error_mark_node || rhstype == error_mark_node)
5597     return error_mark_node;
5598   if (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node)
5599     return error_mark_node;
5600
5601   /* The RHS of an assignment cannot have void type.  */
5602   if (coder == VOID_TYPE)
5603     {
5604       error ("void value not ignored as it ought to be");
5605       return error_mark_node;
5606     }
5607
5608   /* Simplify the RHS if possible.  */
5609   if (TREE_CODE (rhs) == CONST_DECL)
5610     rhs = DECL_INITIAL (rhs);
5611   
5612   /* We do not use decl_constant_value here because of this case:
5613
5614        const char* const s = "s";
5615  
5616      The conversion rules for a string literal are more lax than for a
5617      variable; in particular, a string literal can be converted to a
5618      "char *" but the variable "s" cannot be converted in the same
5619      way.  If the conversion is allowed, the optimization should be
5620      performed while creating the converted expression.  */
5621
5622   /* [expr.ass]
5623
5624      The expression is implicitly converted (clause _conv_) to the
5625      cv-unqualified type of the left operand.
5626
5627      We allow bad conversions here because by the time we get to this point
5628      we are committed to doing the conversion.  If we end up doing a bad
5629      conversion, convert_like will complain.  */
5630   if (!can_convert_arg_bad (type, rhstype, rhs))
5631     {
5632       /* When -Wno-pmf-conversions is use, we just silently allow
5633          conversions from pointers-to-members to plain pointers.  If
5634          the conversion doesn't work, cp_convert will complain.  */
5635       if (!warn_pmf2ptr 
5636           && TYPE_PTR_P (type) 
5637           && TYPE_PTRMEMFUNC_P (rhstype))
5638         rhs = cp_convert (strip_top_quals (type), rhs);
5639       else
5640         {
5641           /* If the right-hand side has unknown type, then it is an
5642              overloaded function.  Call instantiate_type to get error
5643              messages.  */
5644           if (rhstype == unknown_type_node)
5645             instantiate_type (type, rhs, tf_error | tf_warning);
5646           else if (fndecl)
5647             error ("cannot convert `%T' to `%T' for argument `%P' to `%D'",
5648                       rhstype, type, parmnum, fndecl);
5649           else
5650             error ("cannot convert `%T' to `%T' in %s", rhstype, type, 
5651                       errtype);
5652           return error_mark_node;
5653         }
5654     }
5655   return perform_implicit_conversion (strip_top_quals (type), rhs);
5656 }
5657
5658 /* Convert RHS to be of type TYPE.
5659    If EXP is nonzero, it is the target of the initialization.
5660    ERRTYPE is a string to use in error messages.
5661
5662    Two major differences between the behavior of
5663    `convert_for_assignment' and `convert_for_initialization'
5664    are that references are bashed in the former, while
5665    copied in the latter, and aggregates are assigned in
5666    the former (operator=) while initialized in the
5667    latter (X(X&)).
5668
5669    If using constructor make sure no conversion operator exists, if one does
5670    exist, an ambiguity exists.
5671
5672    If flags doesn't include LOOKUP_COMPLAIN, don't complain about anything.  */
5673
5674 tree
5675 convert_for_initialization (tree exp, tree type, tree rhs, int flags,
5676                             const char *errtype, tree fndecl, int parmnum)
5677 {
5678   enum tree_code codel = TREE_CODE (type);
5679   tree rhstype;
5680   enum tree_code coder;
5681
5682   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5683      Strip such NOP_EXPRs, since RHS is used in non-lvalue context.  */
5684   if (TREE_CODE (rhs) == NOP_EXPR
5685       && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))
5686       && codel != REFERENCE_TYPE)
5687     rhs = TREE_OPERAND (rhs, 0);
5688
5689   if (rhs == error_mark_node
5690       || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node))
5691     return error_mark_node;
5692
5693   if (TREE_CODE (TREE_TYPE (rhs)) == REFERENCE_TYPE)
5694     rhs = convert_from_reference (rhs);
5695
5696   if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
5697        && TREE_CODE (type) != ARRAY_TYPE
5698        && (TREE_CODE (type) != REFERENCE_TYPE
5699            || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
5700       || (TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
5701           && (TREE_CODE (type) != REFERENCE_TYPE
5702               || TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE))
5703       || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
5704     rhs = decay_conversion (rhs);
5705
5706   rhstype = TREE_TYPE (rhs);
5707   coder = TREE_CODE (rhstype);
5708
5709   if (coder == ERROR_MARK)
5710     return error_mark_node;
5711
5712   /* We accept references to incomplete types, so we can
5713      return here before checking if RHS is of complete type.  */
5714      
5715   if (codel == REFERENCE_TYPE)
5716     {
5717       /* This should eventually happen in convert_arguments.  */
5718       int savew = 0, savee = 0;
5719
5720       if (fndecl)
5721         savew = warningcount, savee = errorcount;
5722       rhs = initialize_reference (type, rhs, /*decl=*/NULL_TREE,
5723                                   /*cleanup=*/NULL);
5724       if (fndecl)
5725         {
5726           if (warningcount > savew)
5727             cp_warning_at ("in passing argument %P of `%+D'", parmnum, fndecl);
5728           else if (errorcount > savee)
5729             cp_error_at ("in passing argument %P of `%+D'", parmnum, fndecl);
5730         }
5731       return rhs;
5732     }      
5733
5734   if (exp != 0)
5735     exp = require_complete_type (exp);
5736   if (exp == error_mark_node)
5737     return error_mark_node;
5738
5739   rhstype = non_reference (rhstype);
5740
5741   type = complete_type (type);
5742
5743   if (IS_AGGR_TYPE (type))
5744     return ocp_convert (type, rhs, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
5745
5746   return convert_for_assignment (type, rhs, errtype, fndecl, parmnum);
5747 }
5748 \f
5749 /* Expand an ASM statement with operands, handling output operands
5750    that are not variables or INDIRECT_REFS by transforming such
5751    cases into cases that expand_asm_operands can handle.
5752
5753    Arguments are same as for expand_asm_operands.
5754
5755    We don't do default conversions on all inputs, because it can screw
5756    up operands that are expected to be in memory.  */
5757
5758 void
5759 c_expand_asm_operands (tree string, tree outputs, tree inputs, tree clobbers,
5760                        int vol, location_t locus)
5761 {
5762   int noutputs = list_length (outputs);
5763   int i;
5764   /* o[I] is the place that output number I should be written.  */
5765   tree *o = alloca (noutputs * sizeof (tree));
5766   tree tail;
5767
5768   /* Record the contents of OUTPUTS before it is modified.  */
5769   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
5770     o[i] = TREE_VALUE (tail);
5771
5772   /* Generate the ASM_OPERANDS insn;
5773      store into the TREE_VALUEs of OUTPUTS some trees for
5774      where the values were actually stored.  */
5775   expand_asm_operands (string, outputs, inputs, clobbers, vol, locus);
5776
5777   /* Copy all the intermediate outputs into the specified outputs.  */
5778   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
5779     {
5780       if (o[i] != TREE_VALUE (tail))
5781         {
5782           expand_expr (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail)),
5783                        const0_rtx, VOIDmode, EXPAND_NORMAL);
5784           free_temp_slots ();
5785
5786           /* Restore the original value so that it's correct the next
5787              time we expand this function.  */
5788           TREE_VALUE (tail) = o[i];
5789         }
5790       /* Detect modification of read-only values.
5791          (Otherwise done by build_modify_expr.)  */
5792       else
5793         {
5794           tree type = TREE_TYPE (o[i]);
5795           if (type != error_mark_node
5796               && (CP_TYPE_CONST_P (type)
5797                   || (CLASS_TYPE_P (type) && C_TYPE_FIELDS_READONLY (type))))
5798             readonly_error (o[i], "modification by `asm'", 1);
5799         }
5800     }
5801
5802   /* Those MODIFY_EXPRs could do autoincrements.  */
5803   emit_queue ();
5804 }
5805 \f
5806 /* If RETVAL is the address of, or a reference to, a local variable or
5807    temporary give an appropriate warning.  */
5808
5809 static void
5810 maybe_warn_about_returning_address_of_local (tree retval)
5811 {
5812   tree valtype = TREE_TYPE (DECL_RESULT (current_function_decl));
5813   tree whats_returned = retval;
5814
5815   for (;;)
5816     {
5817       if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
5818         whats_returned = TREE_OPERAND (whats_returned, 1);
5819       else if (TREE_CODE (whats_returned) == CONVERT_EXPR
5820                || TREE_CODE (whats_returned) == NON_LVALUE_EXPR
5821                || TREE_CODE (whats_returned) == NOP_EXPR)
5822         whats_returned = TREE_OPERAND (whats_returned, 0);
5823       else
5824         break;
5825     }
5826
5827   if (TREE_CODE (whats_returned) != ADDR_EXPR)
5828     return;
5829   whats_returned = TREE_OPERAND (whats_returned, 0);      
5830
5831   if (TREE_CODE (valtype) == REFERENCE_TYPE)
5832     {
5833       if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
5834           || TREE_CODE (whats_returned) == TARGET_EXPR)
5835         {
5836           warning ("returning reference to temporary");
5837           return;
5838         }
5839       if (TREE_CODE (whats_returned) == VAR_DECL 
5840           && DECL_NAME (whats_returned)
5841           && TEMP_NAME_P (DECL_NAME (whats_returned)))
5842         {
5843           warning ("reference to non-lvalue returned");
5844           return;
5845         }
5846     }
5847
5848   if (DECL_P (whats_returned)
5849       && DECL_NAME (whats_returned)
5850       && DECL_FUNCTION_SCOPE_P (whats_returned)
5851       && !(TREE_STATIC (whats_returned)
5852            || TREE_PUBLIC (whats_returned)))
5853     {
5854       if (TREE_CODE (valtype) == REFERENCE_TYPE)
5855         cp_warning_at ("reference to local variable `%D' returned", 
5856                        whats_returned);
5857       else
5858         cp_warning_at ("address of local variable `%D' returned", 
5859                        whats_returned);
5860       return;
5861     }
5862 }
5863
5864 /* Check that returning RETVAL from the current function is valid.
5865    Return an expression explicitly showing all conversions required to
5866    change RETVAL into the function return type, and to assign it to
5867    the DECL_RESULT for the function.  */
5868
5869 tree
5870 check_return_expr (tree retval)
5871 {
5872   tree result;
5873   /* The type actually returned by the function, after any
5874      promotions.  */
5875   tree valtype;
5876   int fn_returns_value_p;
5877
5878   /* A `volatile' function is one that isn't supposed to return, ever.
5879      (This is a G++ extension, used to get better code for functions
5880      that call the `volatile' function.)  */
5881   if (TREE_THIS_VOLATILE (current_function_decl))
5882     warning ("function declared `noreturn' has a `return' statement");
5883
5884   /* Check for various simple errors.  */
5885   if (DECL_DESTRUCTOR_P (current_function_decl))
5886     {
5887       if (retval)
5888         error ("returning a value from a destructor");
5889       return NULL_TREE;
5890     }
5891   else if (DECL_CONSTRUCTOR_P (current_function_decl))
5892     {
5893       if (in_function_try_handler)
5894         /* If a return statement appears in a handler of the
5895            function-try-block of a constructor, the program is ill-formed.  */
5896         error ("cannot return from a handler of a function-try-block of a constructor");
5897       else if (retval)
5898         /* You can't return a value from a constructor.  */
5899         error ("returning a value from a constructor");
5900       return NULL_TREE;
5901     }
5902
5903   if (processing_template_decl)
5904     {
5905       current_function_returns_value = 1;
5906       return retval;
5907     }
5908   
5909   /* When no explicit return-value is given in a function with a named
5910      return value, the named return value is used.  */
5911   result = DECL_RESULT (current_function_decl);
5912   valtype = TREE_TYPE (result);
5913   my_friendly_assert (valtype != NULL_TREE, 19990924);
5914   fn_returns_value_p = !VOID_TYPE_P (valtype);
5915   if (!retval && DECL_NAME (result) && fn_returns_value_p)
5916     retval = result;
5917
5918   /* Check for a return statement with no return value in a function
5919      that's supposed to return a value.  */
5920   if (!retval && fn_returns_value_p)
5921     {
5922       pedwarn ("return-statement with no value, in function returning '%T'",
5923                valtype);
5924       /* Clear this, so finish_function won't say that we reach the
5925          end of a non-void function (which we don't, we gave a
5926          return!).  */
5927       current_function_returns_null = 0;
5928     }
5929   /* Check for a return statement with a value in a function that
5930      isn't supposed to return a value.  */
5931   else if (retval && !fn_returns_value_p)
5932     {     
5933       if (VOID_TYPE_P (TREE_TYPE (retval)))
5934         /* You can return a `void' value from a function of `void'
5935            type.  In that case, we have to evaluate the expression for
5936            its side-effects.  */
5937           finish_expr_stmt (retval);
5938       else
5939         pedwarn ("return-statement with a value, in function "
5940                  "returning 'void'");
5941
5942       current_function_returns_null = 1;
5943
5944       /* There's really no value to return, after all.  */
5945       return NULL_TREE;
5946     }
5947   else if (!retval)
5948     /* Remember that this function can sometimes return without a
5949        value.  */
5950     current_function_returns_null = 1;
5951   else
5952     /* Remember that this function did return a value.  */
5953     current_function_returns_value = 1;
5954
5955   /* Only operator new(...) throw(), can return NULL [expr.new/13].  */
5956   if ((DECL_OVERLOADED_OPERATOR_P (current_function_decl) == NEW_EXPR
5957        || DECL_OVERLOADED_OPERATOR_P (current_function_decl) == VEC_NEW_EXPR)
5958       && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl))
5959       && ! flag_check_new
5960       && null_ptr_cst_p (retval))
5961     warning ("`operator new' must not return NULL unless it is declared `throw()' (or -fcheck-new is in effect)");
5962
5963   /* Effective C++ rule 15.  See also start_function.  */
5964   if (warn_ecpp
5965       && DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR)
5966       && retval != current_class_ref)
5967     warning ("`operator=' should return a reference to `*this'");
5968
5969   /* The fabled Named Return Value optimization, as per [class.copy]/15:
5970
5971      [...]      For  a function with a class return type, if the expression
5972      in the return statement is the name of a local  object,  and  the  cv-
5973      unqualified  type  of  the  local  object  is the same as the function
5974      return type, an implementation is permitted to omit creating the  tem-
5975      porary  object  to  hold  the function return value [...]
5976
5977      So, if this is a value-returning function that always returns the same
5978      local variable, remember it.
5979
5980      It might be nice to be more flexible, and choose the first suitable
5981      variable even if the function sometimes returns something else, but
5982      then we run the risk of clobbering the variable we chose if the other
5983      returned expression uses the chosen variable somehow.  And people expect
5984      this restriction, anyway.  (jason 2000-11-19)
5985
5986      See finish_function, cxx_expand_function_start, and
5987      cp_copy_res_decl_for_inlining for other pieces of this
5988      optimization.  */
5989
5990   if (fn_returns_value_p && flag_elide_constructors)
5991     {
5992       if (retval != NULL_TREE
5993           && (current_function_return_value == NULL_TREE
5994               || current_function_return_value == retval)
5995           && TREE_CODE (retval) == VAR_DECL
5996           && DECL_CONTEXT (retval) == current_function_decl
5997           && ! TREE_STATIC (retval)
5998           && (DECL_ALIGN (retval)
5999               >= DECL_ALIGN (DECL_RESULT (current_function_decl)))
6000           && same_type_p ((TYPE_MAIN_VARIANT
6001                            (TREE_TYPE (retval))),
6002                           (TYPE_MAIN_VARIANT
6003                            (TREE_TYPE (TREE_TYPE (current_function_decl))))))
6004         current_function_return_value = retval;
6005       else
6006         current_function_return_value = error_mark_node;
6007     }
6008
6009   /* We don't need to do any conversions when there's nothing being
6010      returned.  */
6011   if (!retval || retval == error_mark_node)
6012     return retval;
6013
6014   /* Do any required conversions.  */
6015   if (retval == result || DECL_CONSTRUCTOR_P (current_function_decl))
6016     /* No conversions are required.  */
6017     ;
6018   else
6019     {
6020       /* The type the function is declared to return.  */
6021       tree functype = TREE_TYPE (TREE_TYPE (current_function_decl));
6022
6023       /* First convert the value to the function's return type, then
6024          to the type of return value's location to handle the
6025          case that functype is smaller than the valtype.  */
6026       retval = convert_for_initialization
6027         (NULL_TREE, functype, retval, LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING,
6028          "return", NULL_TREE, 0);
6029       retval = convert (valtype, retval);
6030
6031       /* If the conversion failed, treat this just like `return;'.  */
6032       if (retval == error_mark_node)
6033         return retval;
6034       /* We can't initialize a register from a AGGR_INIT_EXPR.  */
6035       else if (! current_function_returns_struct
6036                && TREE_CODE (retval) == TARGET_EXPR
6037                && TREE_CODE (TREE_OPERAND (retval, 1)) == AGGR_INIT_EXPR)
6038         retval = build (COMPOUND_EXPR, TREE_TYPE (retval), retval,
6039                         TREE_OPERAND (retval, 0));
6040       else
6041         maybe_warn_about_returning_address_of_local (retval);
6042     }
6043   
6044   /* Actually copy the value returned into the appropriate location.  */
6045   if (retval && retval != result)
6046     retval = build (INIT_EXPR, TREE_TYPE (result), result, retval);
6047
6048   return retval;
6049 }
6050
6051 \f
6052 /* Returns nonzero if the pointer-type FROM can be converted to the
6053    pointer-type TO via a qualification conversion.  If CONSTP is -1,
6054    then we return nonzero if the pointers are similar, and the
6055    cv-qualification signature of FROM is a proper subset of that of TO.
6056
6057    If CONSTP is positive, then all outer pointers have been
6058    const-qualified.  */
6059
6060 static int
6061 comp_ptr_ttypes_real (tree to, tree from, int constp)
6062 {
6063   bool to_more_cv_qualified = false;
6064
6065   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
6066     {
6067       if (TREE_CODE (to) != TREE_CODE (from))
6068         return 0;
6069
6070       if (TREE_CODE (from) == OFFSET_TYPE
6071           && !same_type_p (TYPE_OFFSET_BASETYPE (from),
6072                            TYPE_OFFSET_BASETYPE (to)))
6073         return 0;
6074
6075       /* Const and volatile mean something different for function types,
6076          so the usual checks are not appropriate.  */
6077       if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
6078         {
6079           if (!at_least_as_qualified_p (to, from))
6080             return 0;
6081
6082           if (!at_least_as_qualified_p (from, to))
6083             {
6084               if (constp == 0)
6085                 return 0;
6086               to_more_cv_qualified = true;
6087             }
6088
6089           if (constp > 0)
6090             constp &= TYPE_READONLY (to);
6091         }
6092
6093       if (TREE_CODE (to) != POINTER_TYPE && !TYPE_PTRMEM_P (to))
6094         return ((constp >= 0 || to_more_cv_qualified)
6095                 && same_type_ignoring_top_level_qualifiers_p (to, from));
6096     }
6097 }
6098
6099 /* When comparing, say, char ** to char const **, this function takes
6100    the 'char *' and 'char const *'.  Do not pass non-pointer/reference
6101    types to this function.  */
6102
6103 int
6104 comp_ptr_ttypes (tree to, tree from)
6105 {
6106   return comp_ptr_ttypes_real (to, from, 1);
6107 }
6108
6109 /* Returns 1 if to and from are (possibly multi-level) pointers to the same
6110    type or inheritance-related types, regardless of cv-quals.  */
6111
6112 int
6113 ptr_reasonably_similar (tree to, tree from)
6114 {
6115   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
6116     {
6117       /* Any target type is similar enough to void.  */
6118       if (TREE_CODE (to) == VOID_TYPE
6119           || TREE_CODE (from) == VOID_TYPE)
6120         return 1;
6121
6122       if (TREE_CODE (to) != TREE_CODE (from))
6123         return 0;
6124
6125       if (TREE_CODE (from) == OFFSET_TYPE
6126           && comptypes (TYPE_OFFSET_BASETYPE (to),
6127                         TYPE_OFFSET_BASETYPE (from), 
6128                         COMPARE_BASE | COMPARE_DERIVED))
6129         continue;
6130
6131       if (TREE_CODE (to) == INTEGER_TYPE
6132           && TYPE_PRECISION (to) == TYPE_PRECISION (from))
6133         return 1;
6134
6135       if (TREE_CODE (to) == FUNCTION_TYPE)
6136         return 1;
6137
6138       if (TREE_CODE (to) != POINTER_TYPE)
6139         return comptypes
6140           (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from), 
6141            COMPARE_BASE | COMPARE_DERIVED);
6142     }
6143 }
6144
6145 /* Like comp_ptr_ttypes, for const_cast.  */
6146
6147 static int
6148 comp_ptr_ttypes_const (tree to, tree from)
6149 {
6150   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
6151     {
6152       if (TREE_CODE (to) != TREE_CODE (from))
6153         return 0;
6154
6155       if (TREE_CODE (from) == OFFSET_TYPE
6156           && same_type_p (TYPE_OFFSET_BASETYPE (from),
6157                           TYPE_OFFSET_BASETYPE (to)))
6158           continue;
6159
6160       if (TREE_CODE (to) != POINTER_TYPE)
6161         return same_type_ignoring_top_level_qualifiers_p (to, from);
6162     }
6163 }
6164
6165 /* Returns the type qualifiers for this type, including the qualifiers on the
6166    elements for an array type.  */
6167
6168 int
6169 cp_type_quals (tree type)
6170 {
6171   type = strip_array_types (type);
6172   if (type == error_mark_node)
6173     return TYPE_UNQUALIFIED;
6174   return TYPE_QUALS (type);
6175 }
6176
6177 /* Returns nonzero if the TYPE contains a mutable member.  */
6178
6179 bool
6180 cp_has_mutable_p (tree type)
6181 {
6182   type = strip_array_types (type);
6183
6184   return CLASS_TYPE_P (type) && CLASSTYPE_HAS_MUTABLE (type);
6185 }
6186
6187 /* Subroutine of casts_away_constness.  Make T1 and T2 point at
6188    exemplar types such that casting T1 to T2 is casting away castness
6189    if and only if there is no implicit conversion from T1 to T2.  */
6190
6191 static void
6192 casts_away_constness_r (tree *t1, tree *t2)
6193 {
6194   int quals1;
6195   int quals2;
6196
6197   /* [expr.const.cast]
6198
6199      For multi-level pointer to members and multi-level mixed pointers
6200      and pointers to members (conv.qual), the "member" aspect of a
6201      pointer to member level is ignored when determining if a const
6202      cv-qualifier has been cast away.  */
6203   if (TYPE_PTRMEM_P (*t1))
6204     *t1 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t1));
6205   if (TYPE_PTRMEM_P (*t2))
6206     *t2 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t2));
6207
6208   /* [expr.const.cast]
6209
6210      For  two  pointer types:
6211
6212             X1 is T1cv1,1 * ... cv1,N *   where T1 is not a pointer type
6213             X2 is T2cv2,1 * ... cv2,M *   where T2 is not a pointer type
6214             K is min(N,M)
6215
6216      casting from X1 to X2 casts away constness if, for a non-pointer
6217      type T there does not exist an implicit conversion (clause
6218      _conv_) from:
6219
6220             Tcv1,(N-K+1) * cv1,(N-K+2) * ... cv1,N *
6221       
6222      to
6223
6224             Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *.  */
6225
6226   if (TREE_CODE (*t1) != POINTER_TYPE
6227       || TREE_CODE (*t2) != POINTER_TYPE)
6228     {
6229       *t1 = cp_build_qualified_type (void_type_node,
6230                                      cp_type_quals (*t1));
6231       *t2 = cp_build_qualified_type (void_type_node,
6232                                      cp_type_quals (*t2));
6233       return;
6234     }
6235   
6236   quals1 = cp_type_quals (*t1);
6237   quals2 = cp_type_quals (*t2);
6238   *t1 = TREE_TYPE (*t1);
6239   *t2 = TREE_TYPE (*t2);
6240   casts_away_constness_r (t1, t2);
6241   *t1 = build_pointer_type (*t1);
6242   *t2 = build_pointer_type (*t2);
6243   *t1 = cp_build_qualified_type (*t1, quals1);
6244   *t2 = cp_build_qualified_type (*t2, quals2);
6245 }
6246
6247 /* Returns nonzero if casting from TYPE1 to TYPE2 casts away
6248    constness.  */
6249
6250 static bool
6251 casts_away_constness (tree t1, tree t2)
6252 {
6253   if (TREE_CODE (t2) == REFERENCE_TYPE)
6254     {
6255       /* [expr.const.cast]
6256          
6257          Casting from an lvalue of type T1 to an lvalue of type T2
6258          using a reference cast casts away constness if a cast from an
6259          rvalue of type "pointer to T1" to the type "pointer to T2"
6260          casts away constness.  */
6261       t1 = (TREE_CODE (t1) == REFERENCE_TYPE ? TREE_TYPE (t1) : t1);
6262       return casts_away_constness (build_pointer_type (t1),
6263                                    build_pointer_type (TREE_TYPE (t2)));
6264     }
6265
6266   if (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
6267     /* [expr.const.cast]
6268        
6269        Casting from an rvalue of type "pointer to data member of X
6270        of type T1" to the type "pointer to data member of Y of type
6271        T2" casts away constness if a cast from an rvalue of type
6272        "pointer to T1" to the type "pointer to T2" casts away
6273        constness.  */
6274     return casts_away_constness
6275       (build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t1)),
6276        build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t2)));
6277
6278   /* Casting away constness is only something that makes sense for
6279      pointer or reference types.  */
6280   if (TREE_CODE (t1) != POINTER_TYPE 
6281       || TREE_CODE (t2) != POINTER_TYPE)
6282     return false;
6283
6284   /* Top-level qualifiers don't matter.  */
6285   t1 = TYPE_MAIN_VARIANT (t1);
6286   t2 = TYPE_MAIN_VARIANT (t2);
6287   casts_away_constness_r (&t1, &t2);
6288   if (!can_convert (t2, t1))
6289     return true;
6290
6291   return false;
6292 }
6293
6294 /* If T is a REFERENCE_TYPE return the type to which T refers.
6295    Otherwise, return T itself.  */
6296
6297 tree
6298 non_reference (tree t)
6299 {
6300   if (TREE_CODE (t) == REFERENCE_TYPE)
6301     t = TREE_TYPE (t);
6302   return t;
6303 }