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