OSDN Git Service

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