OSDN Git Service

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