OSDN Git Service

40th Cygnus<->FSF merge
[pf3gnuchains/gcc-fork.git] / gcc / cp / typeck.c
1 /* Build expressions with type checking for C++ compiler.
2    Copyright (C) 1987, 88, 89, 92, 93, 1994 Free Software Foundation, Inc.
3    Hacked by Michael Tiemann (tiemann@cygnus.com)
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21
22 /* This file is part of the C++ front end.
23    It contains routines to build C++ expressions given their operands,
24    including computing the types of the result, C and C++ specific error
25    checks, and some optimization.
26
27    There are also routines to build RETURN_STMT nodes and CASE_STMT nodes,
28    and to process initializations in declarations (since they work
29    like a strange sort of assignment).  */
30
31 extern void error ();
32 extern void warning ();
33
34 #include "config.h"
35 #include <stdio.h>
36 #include "tree.h"
37 #include "rtl.h"
38 #include "cp-tree.h"
39 #include "flags.h"
40
41 int mark_addressable ();
42 static tree convert_for_assignment ();
43 /* static */ tree convert_for_initialization ();
44 extern tree shorten_compare ();
45 extern void binary_op_error ();
46 static tree pointer_int_sum ();
47 static tree pointer_diff ();
48 static tree convert_sequence ();
49 /* static */ tree unary_complex_lvalue ();
50
51 extern rtx original_result_rtx;
52
53 /* Return the target type of TYPE, which meas return T for:
54    T*, T&, T[], T (...), and otherwise, just T.  */
55
56 tree
57 target_type (type)
58      tree type;
59 {
60   if (TREE_CODE (type) == REFERENCE_TYPE)
61     type = TREE_TYPE (type);
62   while (TREE_CODE (type) == POINTER_TYPE
63          || TREE_CODE (type) == ARRAY_TYPE
64          || TREE_CODE (type) == FUNCTION_TYPE
65          || TREE_CODE (type) == METHOD_TYPE
66          || TREE_CODE (type) == OFFSET_TYPE)
67     type = TREE_TYPE (type);
68   return type;
69 }
70
71 /* Do `exp = require_complete_type (exp);' to make sure exp
72    does not have an incomplete type.  (That includes void types.)  */
73
74 tree
75 require_complete_type (value)
76      tree value;
77 {
78   tree type = TREE_TYPE (value);
79
80   /* First, detect a valid value with a complete type.  */
81   if (TYPE_SIZE (type) != 0
82       && type != void_type_node
83       && ! (TYPE_LANG_SPECIFIC (type)
84             && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type))
85             && TYPE_SIZE (SIGNATURE_TYPE (type)) == 0))
86     return value;
87
88   /* If we see X::Y, we build an OFFSET_TYPE which has
89      not been laid out.  Try to avoid an error by interpreting
90      it as this->X::Y, if reasonable.  */
91   if (TREE_CODE (value) == OFFSET_REF
92       && C_C_D != 0
93       && TREE_OPERAND (value, 0) == C_C_D)
94     {
95       tree base, member = TREE_OPERAND (value, 1);
96       tree basetype = TYPE_OFFSET_BASETYPE (type);
97       my_friendly_assert (TREE_CODE (member) == FIELD_DECL, 305);
98       base = convert_pointer_to (basetype, current_class_decl);
99       value = build (COMPONENT_REF, TREE_TYPE (member),
100                      build_indirect_ref (base, NULL_PTR), member);
101       return require_complete_type (value);
102     }
103
104   incomplete_type_error (value, type);
105   return error_mark_node;
106 }
107
108 /* Return truthvalue of whether type of EXP is instantiated.  */
109 int
110 type_unknown_p (exp)
111      tree exp;
112 {
113   return (TREE_CODE (exp) == TREE_LIST
114           || TREE_TYPE (exp) == unknown_type_node
115           || (TREE_CODE (TREE_TYPE (exp)) == OFFSET_TYPE
116               && TREE_TYPE (TREE_TYPE (exp)) == unknown_type_node));
117 }
118
119 /* Return truthvalue of whether T is function (or pfn) type.  */
120 int
121 fntype_p (t)
122      tree t;
123 {
124   return (TREE_CODE (t) == FUNCTION_TYPE || TREE_CODE (t) == METHOD_TYPE
125           || (TREE_CODE (t) == POINTER_TYPE
126               && (TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE
127                   || TREE_CODE (TREE_TYPE (t)) == METHOD_TYPE)));
128 }
129
130 /* Do `exp = require_instantiated_type (type, exp);' to make sure EXP
131    does not have an uninstantiated type.
132    TYPE is type to instantiate with, if uninstantiated.  */
133 tree
134 require_instantiated_type (type, exp, errval)
135      tree type, exp, errval;
136 {
137   if (TREE_TYPE (exp) == NULL_TREE)
138     {
139       error ("argument list may not have an initializer list");
140       return errval;
141     }
142
143   if (TREE_TYPE (exp) == unknown_type_node
144       || (TREE_CODE (TREE_TYPE (exp)) == OFFSET_TYPE
145           && TREE_TYPE (TREE_TYPE (exp)) == unknown_type_node))
146     {
147       exp = instantiate_type (type, exp, 1);
148       if (TREE_TYPE (exp) == error_mark_node)
149         return errval;
150     }
151   return exp;
152 }
153
154 /* Return a variant of TYPE which has all the type qualifiers of LIKE
155    as well as those of TYPE.  */
156
157 static tree
158 qualify_type (type, like)
159      tree type, like;
160 {
161   int constflag = TYPE_READONLY (type) || TYPE_READONLY (like);
162   int volflag = TYPE_VOLATILE (type) || TYPE_VOLATILE (like);
163   /* @@ Must do member pointers here.  */
164   return build_type_variant (type, constflag, volflag);
165 }
166 \f
167 /* Return the common type of two parameter lists.
168    We assume that comptypes has already been done and returned 1;
169    if that isn't so, this may crash.
170
171    As an optimization, free the space we allocate if the parameter
172    lists are already common.  */
173
174 tree
175 commonparms (p1, p2)
176      tree p1, p2;
177 {
178   tree oldargs = p1, newargs, n;
179   int i, len;
180   int any_change = 0;
181   char *first_obj = (char *) oballoc (0);
182
183   len = list_length (p1);
184   newargs = tree_last (p1);
185
186   if (newargs == void_list_node)
187     i = 1;
188   else
189     {
190       i = 0;
191       newargs = 0;
192     }
193
194   for (; i < len; i++)
195     newargs = tree_cons (NULL_TREE, NULL_TREE, newargs);
196
197   n = newargs;
198
199   for (i = 0; p1;
200        p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n), i++)
201     {
202       if (TREE_PURPOSE (p1) && !TREE_PURPOSE (p2))
203         {
204           /* We used to give a warning here that advised about a default
205              argument being given in the prototype but not in the function's
206              declaration.  It's best not to bother.  */
207           TREE_PURPOSE (n) = TREE_PURPOSE (p1);
208           any_change = 1;
209         }
210       else if (! TREE_PURPOSE (p1))
211         {
212           if (TREE_PURPOSE (p2))
213             {
214               TREE_PURPOSE (n) = TREE_PURPOSE (p2);
215               any_change = 1;
216             }
217         }
218       else
219         {
220           int cmp = simple_cst_equal (TREE_PURPOSE (p1), TREE_PURPOSE (p2));
221           if (cmp < 0)
222             my_friendly_abort (111);
223           if (cmp == 0)
224             any_change = 1;
225           TREE_PURPOSE (n) = TREE_PURPOSE (p2);
226         }
227       if (TREE_VALUE (p1) != TREE_VALUE (p2))
228         {
229           any_change = 1;
230           TREE_VALUE (n) = common_type (TREE_VALUE (p1), TREE_VALUE (p2));
231         }
232       else
233         TREE_VALUE (n) = TREE_VALUE (p1);
234     }
235   if (! any_change)
236     {
237       obfree (first_obj);
238       return oldargs;
239     }
240
241   return newargs;
242 }
243
244 /* Return the common type of two types.
245    We assume that comptypes has already been done and returned 1;
246    if that isn't so, this may crash.
247
248    This is the type for the result of most arithmetic operations
249    if the operands have the given two types.
250
251    We do not deal with enumeral types here because they have already been
252    converted to integer types.  */
253
254 tree
255 common_type (t1, t2)
256      tree t1, t2;
257 {
258   register enum tree_code code1;
259   register enum tree_code code2;
260   tree attributes;
261
262   /* Save time if the two types are the same.  */
263
264   if (t1 == t2) return t1;
265
266   /* If one type is nonsense, use the other.  */
267   if (t1 == error_mark_node)
268     return t2;
269   if (t2 == error_mark_node)
270     return t1;
271
272   /* Merge the attributes */
273
274   { register tree a1, a2;
275     a1 = TYPE_ATTRIBUTES (t1);
276     a2 = TYPE_ATTRIBUTES (t2);
277
278     /* Either one unset?  Take the set one.  */
279
280     if (!(attributes = a1))
281        attributes = a2;
282
283     /* One that completely contains the other?  Take it.  */
284
285     else if (a2 && !attribute_list_contained (a1, a2))
286        if (attribute_list_contained (a2, a1))
287           attributes = a2;
288        else
289         {
290           /* Pick the longest list, and hang on the other
291              list.  */
292         
293           if (list_length (a1) < list_length (a2))
294              attributes = a2, a2 = a1;
295
296           for (; a2; a2 = TREE_CHAIN (a2))
297              if (!value_member (attributes, a2))
298               {
299                 a1 = copy_node (a2);
300                 TREE_CHAIN (a1) = attributes;
301                 attributes = a1;
302               }
303         }
304   }
305
306   /* Treat an enum type as the unsigned integer type of the same width.  */
307
308   if (TREE_CODE (t1) == ENUMERAL_TYPE)
309     t1 = type_for_size (TYPE_PRECISION (t1), 1);
310   if (TREE_CODE (t2) == ENUMERAL_TYPE)
311     t2 = type_for_size (TYPE_PRECISION (t2), 1);
312
313   code1 = TREE_CODE (t1);
314   code2 = TREE_CODE (t2);
315
316   switch (code1)
317     {
318     case INTEGER_TYPE:
319     case REAL_TYPE:
320       /* If only one is real, use it as the result.  */
321
322       if (code1 == REAL_TYPE && code2 != REAL_TYPE)
323         return build_type_attribute_variant (t1, attributes);
324
325       if (code2 == REAL_TYPE && code1 != REAL_TYPE)
326         return build_type_attribute_variant (t2, attributes);
327
328       /* Both real or both integers; use the one with greater precision.  */
329
330       if (TYPE_PRECISION (t1) > TYPE_PRECISION (t2))
331         return build_type_attribute_variant (t1, attributes);
332       else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
333         return build_type_attribute_variant (t2, attributes);
334
335       /* Same precision.  Prefer longs to ints even when same size.  */
336   
337       if (TYPE_MAIN_VARIANT (t1) == long_unsigned_type_node
338           || TYPE_MAIN_VARIANT (t2) == long_unsigned_type_node)
339         return build_type_attribute_variant (long_unsigned_type_node,
340                                              attributes);
341
342       if (TYPE_MAIN_VARIANT (t1) == long_integer_type_node
343           || TYPE_MAIN_VARIANT (t2) == long_integer_type_node)
344         {
345           /* But preserve unsignedness from the other type,
346              since long cannot hold all the values of an unsigned int.  */
347           if (TREE_UNSIGNED (t1) || TREE_UNSIGNED (t2))
348              t1 = long_unsigned_type_node;
349           else
350              t1 = long_integer_type_node;
351           return build_type_attribute_variant (t1, attributes);
352         }
353
354       /* Otherwise prefer the unsigned one.  */
355
356       if (TREE_UNSIGNED (t1))
357         return build_type_attribute_variant (t1, attributes);
358       else
359         return build_type_attribute_variant (t2, attributes);
360
361     case POINTER_TYPE:
362     case REFERENCE_TYPE:
363       /* For two pointers, do this recursively on the target type,
364          and combine the qualifiers of the two types' targets.  */
365       /* This code was turned off; I don't know why.
366          But ANSI C++ specifies doing this with the qualifiers.
367          So I turned it on again.  */
368       {
369         tree target = common_type (TYPE_MAIN_VARIANT (TREE_TYPE (t1)),
370                                    TYPE_MAIN_VARIANT (TREE_TYPE (t2)));
371         int constp
372           = TYPE_READONLY (TREE_TYPE (t1)) || TYPE_READONLY (TREE_TYPE (t2));
373         int volatilep
374           = TYPE_VOLATILE (TREE_TYPE (t1)) || TYPE_VOLATILE (TREE_TYPE (t2));
375         target = build_type_variant (target, constp, volatilep);
376         if (code1 == POINTER_TYPE)
377           t1 = build_pointer_type (target);
378         else
379           t1 = build_reference_type (target);
380         return build_type_attribute_variant (t1, attributes);
381       }
382 #if 0
383     case POINTER_TYPE:
384       t1 = build_pointer_type (common_type (TREE_TYPE (t1), TREE_TYPE (t2)));
385       return build_type_attribute_variant (t1, attributes);
386
387     case REFERENCE_TYPE:
388       t1 = build_reference_type (common_type (TREE_TYPE (t1), TREE_TYPE (t2)));
389       return build_type_attribute_variant (t1, attributes);
390 #endif
391
392     case ARRAY_TYPE:
393       {
394         tree elt = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
395         /* Save space: see if the result is identical to one of the args.  */
396         if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1))
397           return build_type_attribute_variant (t1, attributes);
398         if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2))
399           return build_type_attribute_variant (t2, attributes);
400         /* Merge the element types, and have a size if either arg has one.  */
401         t1 = build_array_type (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
402         return build_type_attribute_variant (t1, attributes);
403       }
404
405     case FUNCTION_TYPE:
406       /* Function types: prefer the one that specified arg types.
407          If both do, merge the arg types.  Also merge the return types.  */
408       {
409         tree valtype = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
410         tree p1 = TYPE_ARG_TYPES (t1);
411         tree p2 = TYPE_ARG_TYPES (t2);
412         tree rval, raises;
413
414         /* Save space: see if the result is identical to one of the args.  */
415         if (valtype == TREE_TYPE (t1) && ! p2)
416           return build_type_attribute_variant (t1, attributes);
417         if (valtype == TREE_TYPE (t2) && ! p1)
418           return build_type_attribute_variant (t2, attributes);
419
420         /* Simple way if one arg fails to specify argument types.  */
421         if (p1 == NULL_TREE || TREE_VALUE (p1) == void_type_node)
422           {
423             rval = build_function_type (valtype, p2);
424             if ((raises = TYPE_RAISES_EXCEPTIONS (t2)))
425               rval = build_exception_variant (NULL_TREE, rval, raises);
426             return build_type_attribute_variant (rval, attributes);
427           }
428         raises = TYPE_RAISES_EXCEPTIONS (t1);
429         if (p2 == NULL_TREE || TREE_VALUE (p2) == void_type_node)
430           {
431             rval = build_function_type (valtype, p1);
432             if (raises)
433               rval = build_exception_variant (NULL_TREE, rval, raises);
434             return build_type_attribute_variant (rval, attributes);
435           }
436
437         rval = build_function_type (valtype, commonparms (p1, p2));
438         rval = build_exception_variant (NULL_TREE, rval, raises);
439         return build_type_attribute_variant (rval, attributes);
440       }
441
442     case RECORD_TYPE:
443     case UNION_TYPE:
444       my_friendly_assert (TYPE_MAIN_VARIANT (t1) == t1
445                           && TYPE_MAIN_VARIANT (t2) == t2, 306);
446
447       if (! binfo_or_else (t1, t2))
448          compiler_error ("common_type called with uncommon aggregate types");
449       return build_type_attribute_variant (t1, attributes);
450
451     case METHOD_TYPE:
452       if (comptypes (TYPE_METHOD_BASETYPE (t1), TYPE_METHOD_BASETYPE (t2), 1)
453           && TREE_CODE (TREE_TYPE (t1)) == TREE_CODE (TREE_TYPE (t2)))
454         {
455           /* Get this value the long way, since TYPE_METHOD_BASETYPE
456              is just the main variant of this.  */
457           tree basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t1)));
458           tree raises, t3;
459
460           raises = TYPE_RAISES_EXCEPTIONS (t1);
461
462           /* If this was a member function type, get back to the
463              original type of type member function (i.e., without
464              the class instance variable up front.  */
465           t1 = build_function_type (TREE_TYPE (t1), TREE_CHAIN (TYPE_ARG_TYPES (t1)));
466           t2 = build_function_type (TREE_TYPE (t2), TREE_CHAIN (TYPE_ARG_TYPES (t2)));
467           t3 = common_type (t1, t2);
468           t3 = build_cplus_method_type (basetype, TREE_TYPE (t3), TYPE_ARG_TYPES (t3));
469           t1 = build_exception_variant (basetype, t3, raises);
470         }
471       else
472         compiler_error ("common_type called with uncommon method types");
473
474       return build_type_attribute_variant (t1, attributes);
475
476     case OFFSET_TYPE:
477       if (TYPE_OFFSET_BASETYPE (t1) == TYPE_OFFSET_BASETYPE (t2)
478           && TREE_CODE (TREE_TYPE (t1)) == TREE_CODE (TREE_TYPE (t2)))
479         {
480           tree basetype = TYPE_OFFSET_BASETYPE (t1);
481           t1 = build_offset_type (basetype,
482                                     common_type (TREE_TYPE (t1), TREE_TYPE (t2)));
483         }
484       else
485         compiler_error ("common_type called with uncommon member types");
486
487       /* ... falls through ... */
488
489     default:
490       return build_type_attribute_variant (t1, attributes);
491     }
492 }
493 \f
494 /* Return 1 if TYPE1 and TYPE2 raise the same exceptions.  */
495 int
496 compexcepttypes (t1, t2, strict)
497      tree t1, t2;
498      int strict;
499 {
500   return TYPE_RAISES_EXCEPTIONS (t1) == TYPE_RAISES_EXCEPTIONS (t2);
501 }
502
503 static int
504 comp_array_types (cmp, t1, t2, strict)
505      register int (*cmp)();
506      tree t1, t2;
507      int strict;
508 {
509   tree d1 = TYPE_DOMAIN (t1);
510   tree d2 = TYPE_DOMAIN (t2);
511
512   /* Target types must match incl. qualifiers.  */
513   if (!(TREE_TYPE (t1) == TREE_TYPE (t2)
514         || (*cmp) (TREE_TYPE (t1), TREE_TYPE (t2), strict)))
515     return 0;
516
517   /* Sizes must match unless one is missing or variable.  */
518   if (d1 == 0 || d2 == 0 || d1 == d2
519       || TREE_CODE (TYPE_MIN_VALUE (d1)) != INTEGER_CST
520       || TREE_CODE (TYPE_MIN_VALUE (d2)) != INTEGER_CST
521       || TREE_CODE (TYPE_MAX_VALUE (d1)) != INTEGER_CST
522       || TREE_CODE (TYPE_MAX_VALUE (d2)) != INTEGER_CST)
523     return 1;
524
525   return ((TREE_INT_CST_LOW (TYPE_MIN_VALUE (d1))
526            == TREE_INT_CST_LOW (TYPE_MIN_VALUE (d2)))
527           && (TREE_INT_CST_HIGH (TYPE_MIN_VALUE (d1))
528               == TREE_INT_CST_HIGH (TYPE_MIN_VALUE (d2)))
529           && (TREE_INT_CST_LOW (TYPE_MAX_VALUE (d1))
530               == TREE_INT_CST_LOW (TYPE_MAX_VALUE (d2)))
531           && (TREE_INT_CST_HIGH (TYPE_MAX_VALUE (d1))
532               == TREE_INT_CST_HIGH (TYPE_MAX_VALUE (d2))));
533 }
534
535 /* Return 1 if TYPE1 and TYPE2 are compatible types for assignment
536    or various other operations.  This is what ANSI C++ speaks of as
537    "being the same".
538
539    For C++: argument STRICT says we should be strict about this
540    comparison:
541
542         2 : strict, except that if one type is a reference and
543             the other is not, compare the target type of the
544             reference to the type that's not a reference (ARM, p308).
545             This is used for checking for illegal overloading.
546         1 : strict (compared according to ANSI C)
547             This is used for checking whether two function decls match.
548         0 : <= (compared according to C++)
549         -1: <= or >= (relaxed)
550
551    Otherwise, pointers involving base classes and derived classes
552    can be mixed as legal: i.e. a pointer to a base class may be assigned
553    to a pointer to one of its derived classes, as per C++. A pointer to
554    a derived class may be passed as a parameter to a function expecting a
555    pointer to a base classes. These allowances do not commute. In this
556    case, TYPE1 is assumed to be the base class, and TYPE2 is assumed to
557    be the derived class.  */
558 int
559 comptypes (type1, type2, strict)
560      tree type1, type2;
561      int strict;
562 {
563   register tree t1 = type1;
564   register tree t2 = type2;
565   int attrval, val;
566
567   /* Suppress errors caused by previously reported errors */
568
569   if (t1 == t2)
570     return 1;
571
572   /* This should never happen.  */
573   my_friendly_assert (t1 != error_mark_node, 307);
574
575   if (t2 == error_mark_node)
576     return 0;
577
578   if (strict < 0)
579     {
580       /* Treat an enum type as the unsigned integer type of the same width.  */
581
582       if (TREE_CODE (t1) == ENUMERAL_TYPE)
583         t1 = type_for_size (TYPE_PRECISION (t1), 1);
584       if (TREE_CODE (t2) == ENUMERAL_TYPE)
585         t2 = type_for_size (TYPE_PRECISION (t2), 1);
586
587       if (t1 == t2)
588         return 1;
589     }
590
591   /* Different classes of types can't be compatible.  */
592
593   if (TREE_CODE (t1) != TREE_CODE (t2))
594     {
595       if (strict == 2
596           && ((TREE_CODE (t1) == REFERENCE_TYPE)
597               ^ (TREE_CODE (t2) == REFERENCE_TYPE)))
598         {
599           if (TREE_CODE (t1) == REFERENCE_TYPE)
600             return comptypes (TREE_TYPE (t1), t2, 1);
601           return comptypes (t1, TREE_TYPE (t2), 1);
602         }
603
604       return 0;
605     }
606   if (strict > 1)
607     strict = 1;
608
609   /* Qualifiers must match.  */
610
611   if (TYPE_READONLY (t1) != TYPE_READONLY (t2))
612     return 0;
613   if (TYPE_VOLATILE (t1) != TYPE_VOLATILE (t2))
614     return 0;
615
616   /* Allow for two different type nodes which have essentially the same
617      definition.  Note that we already checked for equality of the type
618      type qualifiers (just above).  */
619
620   if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
621     return 1;
622
623 #ifdef COMP_TYPE_ATTRIBUTES
624   if (! (attrval = COMP_TYPE_ATTRIBUTES (t1, t2)))
625      return 0;
626 #else
627   /* 1 if no need for warning yet, 2 if warning cause has been seen.  */
628   attrval = 1;
629 #endif
630
631   /* 1 if no need for warning yet, 2 if warning cause has been seen.  */
632   val = 0;
633
634   switch (TREE_CODE (t1))
635     {
636     case RECORD_TYPE:
637     case UNION_TYPE:
638       if (strict <= 0)
639         goto look_hard;
640       return 0;
641
642     case OFFSET_TYPE:
643       val = (comptypes (TYPE_POINTER_TO (TYPE_OFFSET_BASETYPE (t1)),
644                          TYPE_POINTER_TO (TYPE_OFFSET_BASETYPE (t2)), strict)
645               && comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict));
646       break;
647
648     case METHOD_TYPE:
649       if (! compexcepttypes (t1, t2, strict))
650         return 0;
651
652       /* This case is anti-symmetrical!
653          One can pass a base member (or member function)
654          to something expecting a derived member (or member function),
655          but not vice-versa!  */
656
657       val = (comptypes (TYPE_POINTER_TO (TYPE_METHOD_BASETYPE (t2)),
658                          TYPE_POINTER_TO (TYPE_METHOD_BASETYPE (t1)), strict)
659               && comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)
660               && compparms (TREE_CHAIN (TYPE_ARG_TYPES (t1)),
661                             TREE_CHAIN (TYPE_ARG_TYPES (t2)), strict));
662       break;
663
664     case POINTER_TYPE:
665     case REFERENCE_TYPE:
666       t1 = TREE_TYPE (t1);
667       t2 = TREE_TYPE (t2);
668       if (t1 == t2)
669         {
670           val = 1;
671           break;
672         }
673       if (strict <= 0)
674         {
675           if (TREE_CODE (t1) == RECORD_TYPE && TREE_CODE (t2) == RECORD_TYPE)
676             {
677               int rval;
678             look_hard:
679               rval = t1 == t2 || UNIQUELY_DERIVED_FROM_P (t1, t2);
680
681               if (rval)
682                 {
683                   val = 1;
684                   break;
685                 }
686               if (strict < 0)
687                 {
688                   val = UNIQUELY_DERIVED_FROM_P (t2, t1);
689                   break;
690                 }
691             }
692           return 0;
693         }
694       else
695         val = comptypes (t1, t2, strict);
696       break;
697
698     case FUNCTION_TYPE:
699       if (! compexcepttypes (t1, t2, strict))
700         return 0;
701
702       val = ((TREE_TYPE (t1) == TREE_TYPE (t2)
703               || comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict))
704              && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2), strict));
705       break;
706
707     case ARRAY_TYPE:
708       /* Target types must match incl. qualifiers.  */
709       val = comp_array_types (comptypes, t1, t2, strict);
710       break;
711
712     case TEMPLATE_TYPE_PARM:
713       return 1;
714
715     case UNINSTANTIATED_P_TYPE:
716       return UPT_TEMPLATE (t1) == UPT_TEMPLATE (t2);
717     }
718   return attrval == 2 && val == 1 ? 2 : val;
719 }
720
721 /* Return 1 if TTL and TTR are pointers to types that are equivalent,
722    ignoring their qualifiers.
723
724    NPTRS is the number of pointers we can strip off and keep cool.
725    This is used to permit (for aggr A, aggr B) A, B* to convert to A*,
726    but to not permit B** to convert to A**.  */
727
728 int
729 comp_target_types (ttl, ttr, nptrs)
730      tree ttl, ttr;
731      int nptrs;
732 {
733   ttl = TYPE_MAIN_VARIANT (ttl);
734   ttr = TYPE_MAIN_VARIANT (ttr);
735   if (ttl == ttr)
736     return 1;
737   if (TREE_CODE (ttr) == TEMPLATE_TYPE_PARM)
738     return 1;
739
740   if (TREE_CODE (ttr) != TREE_CODE (ttl))
741     return 0;
742
743   if (TREE_CODE (ttr) == POINTER_TYPE)
744     {
745       if (TREE_CODE (TREE_TYPE (ttl)) == POINTER_TYPE
746           || TREE_CODE (TREE_TYPE (ttl)) == ARRAY_TYPE)
747         return comp_ptr_ttypes (TREE_TYPE (ttl), TREE_TYPE (ttr));
748       else
749         return comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), nptrs - 1);
750     }
751
752   if (TREE_CODE (ttr) == REFERENCE_TYPE)
753     return comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), nptrs);
754   if (TREE_CODE (ttr) == ARRAY_TYPE)
755     return comp_array_types (comp_target_types, ttl, ttr, 0);
756   else if (TREE_CODE (ttr) == FUNCTION_TYPE || TREE_CODE (ttr) == METHOD_TYPE)
757     if (comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), nptrs))
758       switch (comp_target_parms (TYPE_ARG_TYPES (ttl), TYPE_ARG_TYPES (ttr), 1))
759         {
760         case 0:
761           return 0;
762         case 1:
763           return 1;
764         case 2:
765           cp_pedwarn ("converting `%T' to `%T' is a contravariance violation",
766                       ttr, ttl);
767           return 1;
768         default:
769           my_friendly_abort (112);
770         }
771     else
772       return 0;
773
774   /* for C++ */
775   else if (TREE_CODE (ttr) == OFFSET_TYPE)
776     {
777       /* Contravariance: we can assign a pointer to base member to a pointer
778          to derived member.  Note difference from simple pointer case, where
779          we can pass a pointer to derived to a pointer to base.  */
780       if (comptypes (TYPE_OFFSET_BASETYPE (ttr), TYPE_OFFSET_BASETYPE (ttl), 0))
781         return comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), nptrs);
782       else if (comptypes (TYPE_OFFSET_BASETYPE (ttl), TYPE_OFFSET_BASETYPE (ttr), 0)
783                && comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), nptrs))
784         {
785           cp_pedwarn ("converting `%T' to `%T' is a contravariance violation",
786                       ttr, ttl);
787           return 1;
788         }
789     }
790   else if (IS_AGGR_TYPE (ttl))
791     {
792       if (nptrs < 0)
793         return 0;
794       return comptypes (TYPE_POINTER_TO (ttl), TYPE_POINTER_TO (ttr), 0);
795     }
796
797   return 0;
798 }
799
800 /* If two types share a common base type, return that basetype.
801    If there is not a unique most-derived base type, this function
802    returns ERROR_MARK_NODE.  */
803 tree
804 common_base_type (tt1, tt2)
805      tree tt1, tt2;
806 {
807   tree best = NULL_TREE, tmp;
808   int i;
809
810   /* If one is a baseclass of another, that's good enough.  */
811   if (UNIQUELY_DERIVED_FROM_P (tt1, tt2))
812     return tt1;
813   if (UNIQUELY_DERIVED_FROM_P (tt2, tt1))
814     return tt2;
815
816   /* If they share a virtual baseclass, that's good enough.  */
817   for (tmp = CLASSTYPE_VBASECLASSES (tt1); tmp; tmp = TREE_CHAIN (tmp))
818     {
819       if (binfo_member (BINFO_TYPE (tmp), CLASSTYPE_VBASECLASSES (tt2)))
820         return BINFO_TYPE (tmp);
821     }
822
823   /* Otherwise, try to find a unique baseclass of TT1
824      that is shared by TT2, and follow that down.  */
825   for (i = CLASSTYPE_N_BASECLASSES (tt1)-1; i >= 0; i--)
826     {
827       tree basetype = TYPE_BINFO_BASETYPE (tt1, i);
828       tree trial = common_base_type (basetype, tt2);
829       if (trial)
830         {
831           if (trial == error_mark_node)
832             return trial;
833           if (best == NULL_TREE)
834             best = trial;
835           else if (best != trial)
836             return error_mark_node;
837         }
838     }
839
840   /* Same for TT2.  */
841   for (i = CLASSTYPE_N_BASECLASSES (tt2)-1; i >= 0; i--)
842     {
843       tree basetype = TYPE_BINFO_BASETYPE (tt2, i);
844       tree trial = common_base_type (tt1, basetype);
845       if (trial)
846         {
847           if (trial == error_mark_node)
848             return trial;
849           if (best == NULL_TREE)
850             best = trial;
851           else if (best != trial)
852             return error_mark_node;
853         }
854     }
855   return best;
856 }
857 \f
858 /* Subroutines of `comptypes'.  */
859
860 /* Return 1 if two parameter type lists PARMS1 and PARMS2
861    are equivalent in the sense that functions with those parameter types
862    can have equivalent types.
863    If either list is empty, we win.
864    Otherwise, the two lists must be equivalent, element by element.
865
866    C++: See comment above about TYPE1, TYPE2, STRICT.
867    If STRICT == 3, it means checking is strict, but do not compare
868    default parameter values.  */
869 int
870 compparms (parms1, parms2, strict)
871      tree parms1, parms2;
872      int strict;
873 {
874   register tree t1 = parms1, t2 = parms2;
875
876   /* An unspecified parmlist matches any specified parmlist
877      whose argument types don't need default promotions.  */
878
879   if (strict <= 0 && t1 == 0)
880         return self_promoting_args_p (t2);
881   if (strict < 0 && t2 == 0)
882         return self_promoting_args_p (t1);
883
884   while (1)
885     {
886       if (t1 == 0 && t2 == 0)
887         return 1;
888       /* If one parmlist is shorter than the other,
889          they fail to match, unless STRICT is <= 0.  */
890       if (t1 == 0 || t2 == 0)
891         {
892           if (strict > 0)
893             return 0;
894           if (strict < 0)
895             return 1;
896           if (strict == 0)
897             return t1 && TREE_PURPOSE (t1);
898         }
899       if (! comptypes (TREE_VALUE (t2), TREE_VALUE (t1), strict))
900         {
901           if (strict > 0)
902             return 0;
903           if (strict == 0)
904             return t2 == void_list_node && TREE_PURPOSE (t1);
905           return TREE_PURPOSE (t1) || TREE_PURPOSE (t2);
906         }
907       if (strict != 3 && TREE_PURPOSE (t1) && TREE_PURPOSE (t2))
908         {
909           int cmp = simple_cst_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2));
910           if (cmp < 0)
911             my_friendly_abort (113);
912           if (cmp == 0)
913             return 0;
914         }
915
916       t1 = TREE_CHAIN (t1);
917       t2 = TREE_CHAIN (t2);
918     }
919 }
920
921 /* This really wants return whether or not parameter type lists
922    would make their owning functions assignment compatible or not.  */
923 int
924 comp_target_parms (parms1, parms2, strict)
925      tree parms1, parms2;
926      int strict;
927 {
928   register tree t1 = parms1, t2 = parms2;
929   int warn_contravariance = 0;
930
931   /* An unspecified parmlist matches any specified parmlist
932      whose argument types don't need default promotions.
933      @@@ see 13.3.3 for a counterexample...  */
934
935   if (t1 == 0 && t2 != 0)
936     {
937       cp_pedwarn ("ANSI C++ prohibits conversion from `(%#T)' to `(...)'",
938                   parms2);
939       return self_promoting_args_p (t2);
940     }
941   if (t2 == 0)
942     return self_promoting_args_p (t1);
943
944   for (; t1 || t2; t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
945     {
946       tree p1, p2;
947
948       /* If one parmlist is shorter than the other,
949          they fail to match, unless STRICT is <= 0.  */
950       if (t1 == 0 || t2 == 0)
951         {
952           if (strict > 0)
953             return 0;
954           if (strict < 0)
955             return 1 + warn_contravariance;
956           return ((t1 && TREE_PURPOSE (t1)) + warn_contravariance);
957         }
958       p1 = TREE_VALUE (t1);
959       p2 = TREE_VALUE (t2);
960       if (p1 == p2)
961         continue;
962       if (TREE_CODE (p2) == TEMPLATE_TYPE_PARM)
963         continue;
964
965       if ((TREE_CODE (p1) == POINTER_TYPE && TREE_CODE (p2) == POINTER_TYPE)
966           || (TREE_CODE (p1) == REFERENCE_TYPE && TREE_CODE (p2) == REFERENCE_TYPE))
967         {
968           if (strict <= 0
969               && (TYPE_MAIN_VARIANT (TREE_TYPE (p1))
970                   == TYPE_MAIN_VARIANT (TREE_TYPE (p2))))
971             continue;
972
973           if (TREE_CODE (TREE_TYPE (p2)) == TEMPLATE_TYPE_PARM)
974             continue;
975
976           /* The following is wrong for contravariance,
977              but many programs depend on it.  */
978           if (TREE_TYPE (p1) == void_type_node)
979             continue;
980           if (TREE_TYPE (p2) == void_type_node)
981             {
982               warn_contravariance = 1;
983               continue;
984             }
985           if (IS_AGGR_TYPE (TREE_TYPE (p1)))
986             {
987               if (comptypes (p2, p1, 0) == 0)
988                 {
989                   if (comptypes (p1, p2, 0) != 0)
990                     warn_contravariance = 1;
991                   else
992                     return 0;
993                 }
994               continue;
995             }
996         }
997       /* Note backwards order due to contravariance.  */
998       if (comp_target_types (p2, p1, 1) == 0)
999         {
1000           if (comp_target_types (p1, p2, 1))
1001             {
1002               warn_contravariance = 1;
1003               continue;
1004             }
1005           if (strict != 0)
1006             return 0;
1007 #if 0
1008           /* What good do these cases do?  */
1009           if (strict == 0)
1010             return p2 == void_type_node && TREE_PURPOSE (t1);
1011           return TREE_PURPOSE (t1) || TREE_PURPOSE (t2);
1012 #endif
1013         }
1014       /* Target types are compatible--just make sure that if
1015          we use parameter lists, that they are ok as well.  */
1016       if (TREE_CODE (p1) == FUNCTION_TYPE || TREE_CODE (p1) == METHOD_TYPE)
1017         switch (comp_target_parms (TYPE_ARG_TYPES (p1),
1018                                    TYPE_ARG_TYPES (p2),
1019                                    strict))
1020           {
1021           case 0:
1022             return 0;
1023           case 1:
1024             break;
1025           case 2:
1026             warn_contravariance = 1;
1027           }
1028
1029       if (TREE_PURPOSE (t1) && TREE_PURPOSE (t2))
1030         {
1031           int cmp = simple_cst_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2));
1032           if (cmp < 0)
1033             my_friendly_abort (114);
1034           if (cmp == 0)
1035             return 0;
1036         }
1037     }
1038   return 1 + warn_contravariance;
1039 }
1040
1041 /* Return 1 if PARMS specifies a fixed number of parameters
1042    and none of their types is affected by default promotions.  */
1043
1044 int
1045 self_promoting_args_p (parms)
1046      tree parms;
1047 {
1048   register tree t;
1049   for (t = parms; t; t = TREE_CHAIN (t))
1050     {
1051       register tree type = TREE_VALUE (t);
1052
1053       if (TREE_CHAIN (t) == 0 && type != void_type_node)
1054         return 0;
1055
1056       if (TYPE_MAIN_VARIANT (type) == float_type_node)
1057         return 0;
1058
1059       if (type == 0)
1060         return 0;
1061
1062       if (C_PROMOTING_INTEGER_TYPE_P (type))
1063         return 0;
1064     }
1065   return 1;
1066 }
1067 \f
1068 /* Return an unsigned type the same as TYPE in other respects.
1069
1070    C++: must make these work for type variants as well.  */
1071
1072 tree
1073 unsigned_type (type)
1074      tree type;
1075 {
1076   tree type1 = TYPE_MAIN_VARIANT (type);
1077   if (type1 == signed_char_type_node || type1 == char_type_node)
1078     return unsigned_char_type_node;
1079   if (type1 == integer_type_node)
1080     return unsigned_type_node;
1081   if (type1 == short_integer_type_node)
1082     return short_unsigned_type_node;
1083   if (type1 == long_integer_type_node)
1084     return long_unsigned_type_node;
1085   if (type1 == long_long_integer_type_node)
1086     return long_long_unsigned_type_node;
1087   return type;
1088 }
1089
1090 /* Return a signed type the same as TYPE in other respects.  */
1091
1092 tree
1093 signed_type (type)
1094      tree type;
1095 {
1096   tree type1 = TYPE_MAIN_VARIANT (type);
1097   if (type1 == unsigned_char_type_node || type1 == char_type_node)
1098     return signed_char_type_node;
1099   if (type1 == unsigned_type_node)
1100     return integer_type_node;
1101   if (type1 == short_unsigned_type_node)
1102     return short_integer_type_node;
1103   if (type1 == long_unsigned_type_node)
1104     return long_integer_type_node;
1105   if (type1 == long_long_unsigned_type_node)
1106     return long_long_integer_type_node;
1107   return type;
1108 }
1109
1110 /* Return a type the same as TYPE except unsigned or
1111    signed according to UNSIGNEDP.  */
1112
1113 tree
1114 signed_or_unsigned_type (unsignedp, type)
1115      int unsignedp;
1116      tree type;
1117 {
1118   if (! INTEGRAL_TYPE_P (type))
1119     return type;
1120   if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
1121     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1122   if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)) 
1123     return unsignedp ? unsigned_type_node : integer_type_node;
1124   if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node)) 
1125     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1126   if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node)) 
1127     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1128   if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node)) 
1129     return (unsignedp ? long_long_unsigned_type_node
1130             : long_long_integer_type_node);
1131   return type;
1132 }
1133
1134 tree
1135 c_sizeof (type)
1136      tree type;
1137 {
1138   enum tree_code code = TREE_CODE (type);
1139   tree t;
1140
1141   if (code == FUNCTION_TYPE)
1142     {
1143       if (pedantic || warn_pointer_arith)
1144         pedwarn ("ANSI C++ forbids taking the sizeof a function type");
1145       return size_int (1);
1146     }
1147   if (code == METHOD_TYPE)
1148     {
1149       if (pedantic || warn_pointer_arith)
1150         pedwarn ("ANSI C++ forbids taking the sizeof a method type");
1151       return size_int (1);
1152     }
1153   if (code == VOID_TYPE)
1154     {
1155       if (pedantic || warn_pointer_arith)
1156         pedwarn ("ANSI C++ forbids taking the sizeof a void type");
1157       return size_int (1);
1158     }
1159   if (code == ERROR_MARK)
1160     return size_int (1);
1161
1162   /* ARM $5.3.2: ``When applied to a reference, the result is the size of the
1163      referenced object.'' */
1164   if (code == REFERENCE_TYPE)
1165     type = TREE_TYPE (type);
1166
1167   /* We couldn't find anything in the ARM or the draft standard that says,
1168      one way or the other, if doing sizeof on something that doesn't have
1169      an object associated with it is correct or incorrect.  For example, if
1170      you declare `struct S { char str[16]; };', and in your program do
1171      a `sizeof (S::str)', should we flag that as an error or should we give
1172      the size of it?  Since it seems like a reasonable thing to do, we'll go
1173      with giving the value.  */
1174   if (code == OFFSET_TYPE)
1175     type = TREE_TYPE (type);
1176
1177   /* @@ This also produces an error for a signature ref.
1178         In that case we should be able to do better.  */
1179   if (IS_SIGNATURE (type))
1180     {
1181       error ("`sizeof' applied to a signature type");
1182       return size_int (0);
1183     }
1184
1185   if (TYPE_SIZE (type) == 0)
1186     {
1187       error ("`sizeof' applied to an incomplete type");
1188       return size_int (0);
1189     }
1190
1191   /* Convert in case a char is more than one unit.  */
1192   t = size_binop (CEIL_DIV_EXPR, TYPE_SIZE (type), 
1193                   size_int (TYPE_PRECISION (char_type_node)));
1194   /* size_binop does not put the constant in range, so do it now.  */
1195   if (TREE_CODE (t) == INTEGER_CST && force_fit_type (t, 0))
1196     TREE_CONSTANT_OVERFLOW (t) = TREE_OVERFLOW (t) = 1;
1197   return t;
1198 }
1199
1200 tree
1201 c_sizeof_nowarn (type)
1202      tree type;
1203 {
1204   enum tree_code code = TREE_CODE (type);
1205   tree t;
1206
1207   if (code == FUNCTION_TYPE
1208       || code == METHOD_TYPE
1209       || code == VOID_TYPE
1210       || code == ERROR_MARK)
1211     return size_int (1);
1212   if (code == REFERENCE_TYPE)
1213     type = TREE_TYPE (type);
1214
1215   if (TYPE_SIZE (type) == 0)
1216     {
1217 #if 0
1218       /* ??? Tiemann, why have any diagnostic here?
1219          There is none in the corresponding function for C.  */
1220       warning ("sizeof applied to an incomplete type");
1221 #endif
1222       return size_int (0);
1223     }
1224
1225   /* Convert in case a char is more than one unit.  */
1226   t = size_binop (CEIL_DIV_EXPR, TYPE_SIZE (type), 
1227                      size_int (TYPE_PRECISION (char_type_node)));
1228   force_fit_type (t, 0);
1229   return t;
1230 }
1231
1232 /* Implement the __alignof keyword: Return the minimum required
1233    alignment of TYPE, measured in bytes.  */
1234
1235 tree
1236 c_alignof (type)
1237      tree type;
1238 {
1239   enum tree_code code = TREE_CODE (type);
1240   tree t;
1241
1242   if (code == FUNCTION_TYPE || code == METHOD_TYPE)
1243     return size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1244
1245   if (code == VOID_TYPE || code == ERROR_MARK)
1246     return size_int (1);
1247
1248   /* C++: this is really correct!  */
1249   if (code == REFERENCE_TYPE)
1250     type = TREE_TYPE (type);
1251
1252   /* @@ This also produces an error for a signature ref.
1253         In that case we should be able to do better.  */
1254   if (IS_SIGNATURE (type))
1255     {
1256       error ("`__alignof' applied to a signature type");
1257       return size_int (1);
1258     }
1259
1260   t = size_int (TYPE_ALIGN (type) / BITS_PER_UNIT);
1261   force_fit_type (t, 0);
1262   return t;
1263 }
1264 \f
1265 /* Perform default promotions for C data used in expressions.
1266    Arrays and functions are converted to pointers;
1267    enumeral types or short or char, to int.
1268    In addition, manifest constants symbols are replaced by their values.
1269
1270    C++: this will automatically bash references to their target type.  */
1271
1272 tree
1273 default_conversion (exp)
1274      tree exp;
1275 {
1276   register tree type = TREE_TYPE (exp);
1277   register enum tree_code code = TREE_CODE (type);
1278
1279   if (code == OFFSET_TYPE /* || TREE_CODE (exp) == OFFSET_REF */ )
1280     {
1281       if (TREE_CODE (exp) == OFFSET_REF)
1282         return default_conversion (resolve_offset_ref (exp));
1283
1284       type = TREE_TYPE (type);
1285       code = TREE_CODE (type);
1286     }
1287
1288   if (code == REFERENCE_TYPE)
1289     {
1290       exp = convert_from_reference (exp);
1291       type = TREE_TYPE (exp);
1292       code = TREE_CODE (type);
1293     }
1294
1295   /* Constants can be used directly unless they're not loadable.  */
1296   if (TREE_CODE (exp) == CONST_DECL)
1297     exp = DECL_INITIAL (exp);
1298   /* Replace a nonvolatile const static variable with its value.  */
1299   else if (TREE_READONLY_DECL_P (exp) && DECL_MODE (exp) != BLKmode)
1300     {
1301       exp = decl_constant_value (exp);
1302       type = TREE_TYPE (exp);
1303     }
1304
1305   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
1306      Leave such NOP_EXPRs, since RHS is being used in non-lvalue context.  */
1307
1308   if (INTEGRAL_CODE_P (code))
1309     {
1310       tree t = type_promotes_to (type);
1311       if (t != TYPE_MAIN_VARIANT (type))
1312         return convert (t, exp);
1313     }
1314   if (flag_traditional
1315       && TYPE_MAIN_VARIANT (type) == float_type_node)
1316     return convert (double_type_node, exp);
1317   if (code == VOID_TYPE)
1318     {
1319       error ("void value not ignored as it ought to be");
1320       return error_mark_node;
1321     }
1322   if (code == FUNCTION_TYPE)
1323     {
1324       return build_unary_op (ADDR_EXPR, exp, 0);
1325     }
1326   if (code == METHOD_TYPE)
1327     {
1328       if (TREE_CODE (exp) == OFFSET_REF)
1329         {
1330           my_friendly_assert (TREE_CODE (TREE_OPERAND (exp, 1)) == FUNCTION_DECL,
1331                               308);
1332           return build_unary_op (ADDR_EXPR, TREE_OPERAND (exp, 1), 0);
1333         }
1334       return build_unary_op (ADDR_EXPR, exp, 0);
1335     }
1336   if (code == ARRAY_TYPE)
1337     {
1338       register tree adr;
1339       tree restype;
1340       tree ptrtype;
1341       int constp, volatilep;
1342
1343       if (TREE_CODE (exp) == INDIRECT_REF)
1344         {
1345           /* Stripping away the INDIRECT_REF is not the right
1346              thing to do for references...  */
1347           tree inner = TREE_OPERAND (exp, 0);
1348           if (TREE_CODE (TREE_TYPE (inner)) == REFERENCE_TYPE)
1349             {
1350               inner = build1 (CONVERT_EXPR,
1351                               build_pointer_type (TREE_TYPE (TREE_TYPE (inner))),
1352                               inner);
1353               TREE_REFERENCE_EXPR (inner) = 1;
1354             }
1355           return convert (TYPE_POINTER_TO (TREE_TYPE (type)), inner);
1356         }
1357
1358       if (TREE_CODE (exp) == COMPOUND_EXPR)
1359         {
1360           tree op1 = default_conversion (TREE_OPERAND (exp, 1));
1361           return build (COMPOUND_EXPR, TREE_TYPE (op1),
1362                         TREE_OPERAND (exp, 0), op1);
1363         }
1364
1365       if (!lvalue_p (exp)
1366           && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp)))
1367         {
1368           error ("invalid use of non-lvalue array");
1369           return error_mark_node;
1370         }
1371
1372       constp = volatilep = 0;
1373       if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'r'
1374           || TREE_CODE_CLASS (TREE_CODE (exp)) == 'd')
1375         {
1376           constp = TREE_READONLY (exp);
1377           volatilep = TREE_THIS_VOLATILE (exp);
1378         }
1379
1380       restype = TREE_TYPE (type);
1381       if (TYPE_READONLY (type) || TYPE_VOLATILE (type)
1382           || constp || volatilep)
1383         restype = build_type_variant (restype,
1384                                       TYPE_READONLY (type) || constp,
1385                                       TYPE_VOLATILE (type) || volatilep);
1386       ptrtype = build_pointer_type (restype);
1387
1388       if (TREE_CODE (exp) == VAR_DECL)
1389         {
1390           /* ??? This is not really quite correct
1391              in that the type of the operand of ADDR_EXPR
1392              is not the target type of the type of the ADDR_EXPR itself.
1393              Question is, can this lossage be avoided?  */
1394           adr = build1 (ADDR_EXPR, ptrtype, exp);
1395           if (mark_addressable (exp) == 0)
1396             return error_mark_node;
1397           TREE_CONSTANT (adr) = staticp (exp);
1398           TREE_SIDE_EFFECTS (adr) = 0;   /* Default would be, same as EXP.  */
1399           return adr;
1400         }
1401       /* This way is better for a COMPONENT_REF since it can
1402          simplify the offset for a component.  */
1403       adr = build_unary_op (ADDR_EXPR, exp, 1);
1404       return convert (ptrtype, adr);
1405     }
1406   return exp;
1407 }
1408 \f
1409 tree
1410 build_object_ref (datum, basetype, field)
1411      tree datum, basetype, field;
1412 {
1413   if (datum == error_mark_node)
1414     return error_mark_node;
1415   else if (IS_SIGNATURE (IDENTIFIER_TYPE_VALUE (basetype)))
1416     {
1417       warning ("signature name in scope resolution ignored");
1418       return build_component_ref (datum, field, NULL_TREE, 1);
1419     }
1420   else if (is_aggr_typedef (basetype, 1))
1421     {
1422       tree real_basetype = IDENTIFIER_TYPE_VALUE (basetype);
1423       tree binfo = binfo_or_else (real_basetype, TREE_TYPE (datum));
1424       if (binfo)
1425         return build_component_ref (build_scoped_ref (datum, basetype),
1426                                     field, binfo, 1);
1427     }
1428   return error_mark_node;
1429 }
1430
1431 /* Like `build_component_ref, but uses an already found field.
1432    Must compute access for C_C_D.  Otherwise, ok.  */
1433 tree
1434 build_component_ref_1 (datum, field, protect)
1435      tree datum, field;
1436      int protect;
1437 {
1438   register tree basetype = TREE_TYPE (datum);
1439   register enum tree_code code = TREE_CODE (basetype);
1440   register tree ref;
1441
1442   if (code == REFERENCE_TYPE)
1443     {
1444       datum = convert_from_reference (datum);
1445       basetype = TREE_TYPE (datum);
1446       code = TREE_CODE (basetype);
1447     }
1448
1449   if (! IS_AGGR_TYPE_CODE (code))
1450     {
1451       if (code != ERROR_MARK)
1452         cp_error ("request for member `%D' in `%E', which is of non-aggregate type `%T'",
1453                   field, datum, basetype);
1454       return error_mark_node;
1455     }
1456
1457   if (TYPE_SIZE (basetype) == 0)
1458     {
1459       incomplete_type_error (0, basetype);
1460       return error_mark_node;
1461     }
1462
1463   /* Look up component name in the structure type definition.  */
1464
1465   if (field == error_mark_node)
1466     my_friendly_abort (115);
1467
1468   if (TREE_STATIC (field))
1469     return field;
1470
1471   if (datum == C_C_D)
1472     {
1473       enum access_type access
1474         = compute_access (TYPE_BINFO (current_class_type), field);
1475
1476       if (access == access_private)
1477         {
1478           cp_error ("field `%D' is private", field);
1479           return error_mark_node;
1480         }
1481       else if (access == access_protected)
1482         {
1483           cp_error ("field `%D' is protected", field);
1484           return error_mark_node;
1485         }
1486     }
1487
1488   ref = build (COMPONENT_REF, TREE_TYPE (field), datum, field);
1489
1490   if (TREE_READONLY (datum) || TREE_READONLY (field))
1491     TREE_READONLY (ref) = 1;
1492   if (TREE_THIS_VOLATILE (datum) || TREE_THIS_VOLATILE (field))
1493     TREE_THIS_VOLATILE (ref) = 1;
1494   if (DECL_MUTABLE_P (field))
1495     TREE_READONLY (ref) = 0;
1496
1497   return ref;
1498 }
1499
1500 /* Given a COND_EXPR in T, return it in a form that we can, for
1501    example, use as an lvalue.  This code used to be in unary_complex_lvalue,
1502    but we needed it to deal with `a = (d == c) ? b : c' expressions, where
1503    we're dealing with aggregates.  So, we now call this in unary_complex_lvalue,
1504    and in build_modify_expr.  The case (in particular) that led to this was
1505    with CODE == ADDR_EXPR, since it's not an lvalue when we'd get it there.  */
1506 static tree
1507 rationalize_conditional_expr (code, t)
1508      enum tree_code code;
1509      tree t;
1510 {
1511   return
1512     build_conditional_expr (TREE_OPERAND (t, 0),
1513                             build_unary_op (code, TREE_OPERAND (t, 1), 0),
1514                             build_unary_op (code, TREE_OPERAND (t, 2), 0));
1515 }
1516
1517 tree
1518 build_component_ref (datum, component, basetype_path, protect)
1519      tree datum, component, basetype_path;
1520      int protect;
1521 {
1522   register tree basetype = TREE_TYPE (datum);
1523   register enum tree_code code = TREE_CODE (basetype);
1524   register tree field = NULL;
1525   register tree ref;
1526
1527   /* If DATUM is a COMPOUND_EXPR or COND_EXPR, move our reference inside it
1528      unless we are not to support things not strictly ANSI.  */
1529   switch (TREE_CODE (datum))
1530     {
1531     case COMPOUND_EXPR:
1532       {
1533         tree value = build_component_ref (TREE_OPERAND (datum, 1), component,
1534                                           basetype_path, protect);
1535         return build (COMPOUND_EXPR, TREE_TYPE (value),
1536                       TREE_OPERAND (datum, 0), value);
1537       }
1538     case COND_EXPR:
1539       return build_conditional_expr
1540         (TREE_OPERAND (datum, 0),
1541          build_component_ref (TREE_OPERAND (datum, 1), component,
1542                               basetype_path, protect),
1543          build_component_ref (TREE_OPERAND (datum, 2), component,
1544                               basetype_path, protect));
1545     }
1546
1547   if (code == REFERENCE_TYPE)
1548     {
1549 #if 0
1550       /* TREE_REFERENCE_EXPRs are not converted by `convert_from_reference'.
1551          @@ Maybe that is not right.  */
1552       if (TREE_REFERENCE_EXPR (datum))
1553         datum = build1 (INDIRECT_REF, TREE_TYPE (basetype), datum);
1554       else
1555 #endif
1556         datum = convert_from_reference (datum);
1557       basetype = TREE_TYPE (datum);
1558       code = TREE_CODE (basetype);
1559     }
1560
1561   /* First, see if there is a field or component with name COMPONENT. */
1562   if (TREE_CODE (component) == TREE_LIST)
1563     {
1564       my_friendly_assert (!(TREE_CHAIN (component) == NULL_TREE
1565                 && DECL_CHAIN (TREE_VALUE (component)) == NULL_TREE), 309);
1566       return build (COMPONENT_REF, TREE_TYPE (component), datum, component);
1567     }
1568 #if 0
1569   if (TREE_CODE (component) == TYPE_EXPR)
1570     return build_component_type_expr (datum, component, NULL_TREE, protect);
1571 #endif
1572
1573   if (! IS_AGGR_TYPE_CODE (code))
1574     {
1575       if (code != ERROR_MARK)
1576         cp_error ("request for member `%D' in `%E', which is of non-aggregate type `%T'",
1577                   component, datum, basetype);
1578       return error_mark_node;
1579     }
1580
1581   if (TYPE_SIZE (basetype) == 0)
1582     {
1583       incomplete_type_error (0, basetype);
1584       return error_mark_node;
1585     }
1586
1587   if (TREE_CODE (component) == BIT_NOT_EXPR)
1588     {
1589       if (TYPE_IDENTIFIER (basetype) != TREE_OPERAND (component, 0))
1590         {
1591           cp_error ("destructor specifier `%T::~%T' must have matching names",
1592                     basetype, TREE_OPERAND (component, 0));
1593           return error_mark_node;
1594         }
1595       if (! TYPE_HAS_DESTRUCTOR (basetype))
1596         {
1597           cp_error ("type `%T' has no destructor", basetype);
1598           return error_mark_node;
1599         }
1600       return TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 0);
1601     }
1602
1603   /* Look up component name in the structure type definition.  */
1604   if (CLASSTYPE_VFIELD (basetype)
1605       && DECL_NAME (CLASSTYPE_VFIELD (basetype)) == component)
1606     /* Special-case this because if we use normal lookups in an ambiguous
1607        hierarchy, the compiler will abort (because vptr lookups are
1608        not supposed to be ambiguous.  */
1609     field = CLASSTYPE_VFIELD (basetype);
1610   else
1611     {
1612       if (basetype_path == NULL_TREE)
1613         basetype_path = TYPE_BINFO (basetype);
1614       field = lookup_field (basetype_path, component,
1615                             protect && ! VFIELD_NAME_P (component), 0);
1616       if (field == error_mark_node)
1617         return error_mark_node;
1618
1619       if (field == NULL_TREE)
1620         {
1621           /* Not found as a data field, look for it as a method.  If found,
1622              then if this is the only possible one, return it, else
1623              report ambiguity error.  */
1624           tree fndecls = lookup_fnfields (basetype_path, component, 1);
1625           if (fndecls == error_mark_node)
1626             return error_mark_node;
1627           if (fndecls)
1628             {
1629               if (TREE_CHAIN (fndecls) == NULL_TREE
1630                   && DECL_CHAIN (TREE_VALUE (fndecls)) == NULL_TREE)
1631                 {
1632                   enum access_type access;
1633                   tree fndecl;
1634
1635                   /* Unique, so use this one now.  */
1636                   basetype = TREE_PURPOSE (fndecls);
1637                   fndecl = TREE_VALUE (fndecls);
1638                   access = compute_access (TREE_PURPOSE (fndecls), fndecl);
1639                   if (access == access_public)
1640                     {
1641                       if (DECL_VINDEX (fndecl)
1642                           && ! resolves_to_fixed_type_p (datum, 0))
1643                         {
1644                           tree addr = build_unary_op (ADDR_EXPR, datum, 0);
1645                           addr = convert_pointer_to (DECL_CONTEXT (fndecl), addr);
1646                           datum = build_indirect_ref (addr, NULL_PTR);
1647                           my_friendly_assert (datum != error_mark_node, 310);
1648                           fndecl = build_vfn_ref (&addr, datum, DECL_VINDEX (fndecl));
1649                         }
1650                       return fndecl;
1651                     }
1652                   if (access == access_protected)
1653                     cp_error ("member function `%D' is protected", fndecl);
1654                   else
1655                     cp_error ("member function `%D' is private", fndecl);
1656                   return error_mark_node;
1657                 }
1658               else
1659                 return build (COMPONENT_REF, unknown_type_node, datum, fndecls);
1660             }
1661
1662 #if 0
1663           if (component == ansi_opname[(int) TYPE_EXPR])
1664             cp_error ("`%#T' has no such type conversion operator", basetype);
1665           else
1666 #endif
1667             cp_error ("`%#T' has no member named `%D'", basetype, component);
1668           return error_mark_node;
1669         }
1670       else if (TREE_TYPE (field) == error_mark_node)
1671         return error_mark_node;
1672
1673       if (TREE_CODE (field) != FIELD_DECL)
1674         {
1675           if (TREE_CODE (field) == TYPE_DECL)
1676             {
1677               cp_error ("invalid use of type decl `%#D' as expression", field);
1678               return error_mark_node;
1679             }
1680           if (DECL_RTL (field) != 0)
1681             assemble_external (field);
1682           TREE_USED (field) = 1;
1683           return field;
1684         }
1685     }
1686
1687   if (DECL_FIELD_CONTEXT (field) != basetype
1688       && TYPE_USES_COMPLEX_INHERITANCE (basetype))
1689     {
1690       tree addr = build_unary_op (ADDR_EXPR, datum, 0);
1691       if (integer_zerop (addr))
1692         {
1693           error ("invalid reference to NULL ptr, use ptr-to-member instead");
1694           return error_mark_node;
1695         }
1696       addr = convert_pointer_to (DECL_FIELD_CONTEXT (field), addr);
1697       datum = build_indirect_ref (addr, NULL_PTR);
1698       my_friendly_assert (datum != error_mark_node, 311);
1699     }
1700   ref = build (COMPONENT_REF, TREE_TYPE (field), break_out_cleanups (datum), field);
1701
1702   if (TREE_READONLY (datum) || TREE_READONLY (field))
1703     TREE_READONLY (ref) = 1;
1704   if (TREE_THIS_VOLATILE (datum) || TREE_THIS_VOLATILE (field))
1705     TREE_THIS_VOLATILE (ref) = 1;
1706   if (DECL_MUTABLE_P (field))
1707     TREE_READONLY (ref) = 0;
1708
1709   return ref;
1710 }
1711 \f
1712 /* Given an expression PTR for a pointer, return an expression
1713    for the value pointed to.
1714    ERRORSTRING is the name of the operator to appear in error messages.
1715
1716    This function may need to overload OPERATOR_FNNAME.
1717    Must also handle REFERENCE_TYPEs for C++.  */
1718
1719 tree
1720 build_x_indirect_ref (ptr, errorstring)
1721      tree ptr;
1722      char *errorstring;
1723 {
1724   tree rval = build_opfncall (INDIRECT_REF, LOOKUP_NORMAL, ptr, NULL_TREE, NULL_TREE);
1725   if (rval)
1726     return rval;
1727   return build_indirect_ref (ptr, errorstring);
1728 }
1729
1730 tree
1731 build_indirect_ref (ptr, errorstring)
1732      tree ptr;
1733      char *errorstring;
1734 {
1735   register tree pointer = default_conversion (ptr);
1736   register tree type = TREE_TYPE (pointer);
1737
1738   if (ptr == current_class_decl)
1739     return C_C_D;
1740
1741   if (TREE_CODE (type) == POINTER_TYPE || TREE_CODE (type) == REFERENCE_TYPE)
1742     {
1743       if (TREE_CODE (pointer) == ADDR_EXPR
1744           && (TREE_TYPE (TREE_OPERAND (pointer, 0))
1745               == TREE_TYPE (type)))
1746         return TREE_OPERAND (pointer, 0);
1747       else
1748         {
1749           tree t = TREE_TYPE (type);
1750           register tree ref = build1 (INDIRECT_REF,
1751                                       TYPE_MAIN_VARIANT (t), pointer);
1752
1753           TREE_READONLY (ref) = TYPE_READONLY (t);
1754           TREE_THIS_VOLATILE (ref) = TYPE_VOLATILE (t);
1755           TREE_SIDE_EFFECTS (ref)
1756             = TYPE_VOLATILE (t) || TREE_SIDE_EFFECTS (pointer);
1757           return ref;
1758         }
1759     }
1760   /* `pointer' won't be an error_mark_node if we were given a
1761      pointer to member, so it's cool to check for this here.  */
1762   else if (TYPE_PTRMEMFUNC_P (type))
1763     error ("invalid use of `%s' on pointer to member function", errorstring);
1764   else if (TREE_CODE (type) == RECORD_TYPE
1765            && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type)))
1766     error ("cannot dereference signature pointer/reference");
1767   else if (pointer != error_mark_node)
1768     {
1769       if (errorstring)
1770         error ("invalid type argument of `%s'", errorstring);
1771       else
1772         error ("invalid type argument");
1773     }
1774   return error_mark_node;
1775 }
1776
1777 /* This handles expressions of the form "a[i]", which denotes
1778    an array reference.
1779
1780    This is logically equivalent in C to *(a+i), but we may do it differently.
1781    If A is a variable or a member, we generate a primitive ARRAY_REF.
1782    This avoids forcing the array out of registers, and can work on
1783    arrays that are not lvalues (for example, members of structures returned
1784    by functions).
1785
1786    If INDEX is of some user-defined type, it must be converted to
1787    integer type.  Otherwise, to make a compatible PLUS_EXPR, it
1788    will inherit the type of the array, which will be some pointer type.  */
1789
1790 tree
1791 build_x_array_ref (array, index)
1792      tree array, index;
1793 {
1794   tree rval = build_opfncall (ARRAY_REF, LOOKUP_NORMAL, array, index, NULL_TREE);
1795   if (rval)
1796     return rval;
1797   return build_array_ref (array, index);
1798 }
1799
1800 tree
1801 build_array_ref (array, idx)
1802      tree array, idx;
1803 {
1804   tree itype;
1805
1806   if (idx == 0)
1807     {
1808       error ("subscript missing in array reference");
1809       return error_mark_node;
1810     }
1811
1812   if (TREE_TYPE (array) == error_mark_node
1813       || TREE_TYPE (idx) == error_mark_node)
1814     return error_mark_node;
1815
1816   itype = TREE_TYPE (idx);
1817   /* We must check here for the reference, so we can do the possible
1818      conversions immediately afterwards.  */
1819   if (TREE_CODE (itype) == REFERENCE_TYPE)
1820     {
1821       idx = convert_from_reference (idx);
1822       itype = TREE_TYPE (idx);
1823     }
1824
1825   if (IS_AGGR_TYPE (itype))
1826     {
1827       if (TYPE_HAS_INT_CONVERSION (itype))
1828         idx = build_type_conversion (CONVERT_EXPR,
1829                                      integer_type_node, idx, 1);
1830       else
1831         {
1832           error_with_aggr_type (itype,
1833                                 "type `%s' requires integer conversion for array indexing");
1834           return error_mark_node;
1835         }
1836     }
1837
1838   if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE
1839       && TREE_CODE (array) != INDIRECT_REF)
1840     {
1841       tree rval, type;
1842
1843       /* Subscripting with type char is likely to lose
1844          on a machine where chars are signed.
1845          So warn on any machine, but optionally.
1846          Don't warn for unsigned char since that type is safe.
1847          Don't warn for signed char because anyone who uses that
1848          must have done so deliberately.  */
1849       if (warn_char_subscripts
1850           && TYPE_MAIN_VARIANT (TREE_TYPE (idx)) == char_type_node)
1851         warning ("array subscript has type `char'");
1852
1853       /* Apply default promotions *after* noticing character types.  */
1854       idx = default_conversion (idx);
1855
1856       if (TREE_CODE (TREE_TYPE (idx)) != INTEGER_TYPE)
1857         {
1858           error ("array subscript is not an integer");
1859           return error_mark_node;
1860         }
1861
1862       /* An array that is indexed by a non-constant
1863          cannot be stored in a register; we must be able to do
1864          address arithmetic on its address.
1865          Likewise an array of elements of variable size.  */
1866       if (TREE_CODE (idx) != INTEGER_CST
1867           || (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))) != 0
1868               && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array)))) != INTEGER_CST))
1869         {
1870           if (mark_addressable (array) == 0)
1871             return error_mark_node;
1872         }
1873       /* An array that is indexed by a constant value which is not within
1874          the array bounds cannot be stored in a register either; because we
1875          would get a crash in store_bit_field/extract_bit_field when trying
1876          to access a non-existent part of the register.  */
1877       if (TREE_CODE (idx) == INTEGER_CST
1878           && TYPE_VALUES (TREE_TYPE (array))
1879           && ! int_fits_type_p (idx, TYPE_VALUES (TREE_TYPE (array))))
1880         {
1881           if (mark_addressable (array) == 0)
1882             return error_mark_node;
1883         }
1884
1885       /* Note in C++ we don't bother warning about subscripting a
1886          `register' array, since it's legal in C++ to take the address
1887          of something with that storage specification.  */
1888       if (pedantic && !lvalue_p (array))
1889         pedwarn ("ANSI C++ forbids subscripting non-lvalue array");
1890
1891       if (pedantic)
1892         {
1893           tree foo = array;
1894           while (TREE_CODE (foo) == COMPONENT_REF)
1895             foo = TREE_OPERAND (foo, 0);
1896           if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo))
1897             pedwarn ("ANSI C++ forbids subscripting non-lvalue array");
1898         }
1899
1900       type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (array)));
1901       rval = build (ARRAY_REF, type, array, idx);
1902       /* Array ref is const/volatile if the array elements are
1903          or if the array is..  */
1904       TREE_READONLY (rval)
1905         |= (TYPE_READONLY (TREE_TYPE (TREE_TYPE (array)))
1906             | TREE_READONLY (array));
1907       TREE_SIDE_EFFECTS (rval)
1908         |= (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (array)))
1909             | TREE_SIDE_EFFECTS (array));
1910       TREE_THIS_VOLATILE (rval)
1911         |= (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (array)))
1912             /* This was added by rms on 16 Nov 91.
1913                It fixes  vol struct foo *a;  a->elts[1] 
1914                in an inline function.
1915                Hope it doesn't break something else.  */
1916             | TREE_THIS_VOLATILE (array));
1917       return require_complete_type (fold (rval));
1918     }
1919
1920   {
1921     tree ar = default_conversion (array);
1922     tree ind = default_conversion (idx);
1923
1924     /* Put the integer in IND to simplify error checking.  */
1925     if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE)
1926       {
1927         tree temp = ar;
1928         ar = ind;
1929         ind = temp;
1930       }
1931
1932     if (ar == error_mark_node)
1933       return ar;
1934
1935     if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE)
1936       {
1937         error ("subscripted value is neither array nor pointer");
1938         return error_mark_node;
1939       }
1940     if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
1941       {
1942         error ("array subscript is not an integer");
1943         return error_mark_node;
1944       }
1945
1946     return build_indirect_ref (build_binary_op_nodefault (PLUS_EXPR, ar, ind, PLUS_EXPR),
1947                                "array indexing");
1948   }
1949 }
1950 \f
1951 /* Build a function call to function FUNCTION with parameters PARAMS.
1952    PARAMS is a list--a chain of TREE_LIST nodes--in which the
1953    TREE_VALUE of each node is a parameter-expression.
1954    FUNCTION's data type may be a function type or a pointer-to-function.
1955
1956    For C++: If FUNCTION's data type is a TREE_LIST, then the tree list
1957    is the list of possible methods that FUNCTION could conceivably
1958    be.  If the list of methods comes from a class, then it will be
1959    a list of lists (where each element is associated with the class
1960    that produced it), otherwise it will be a simple list (for
1961    functions overloaded in global scope).
1962
1963    In the first case, TREE_VALUE (function) is the head of one of those
1964    lists, and TREE_PURPOSE is the name of the function.
1965
1966    In the second case, TREE_PURPOSE (function) is the function's
1967    name directly.
1968
1969    DECL is the class instance variable, usually CURRENT_CLASS_DECL.  */
1970
1971 /*
1972  * [eichin:19911015.1726EST] actually return a possibly incomplete
1973  * type
1974  */
1975 tree
1976 build_x_function_call (function, params, decl)
1977      tree function, params, decl;
1978 {
1979   tree type;
1980   int is_method;
1981
1982   if (function == error_mark_node)
1983     return error_mark_node;
1984
1985   type = TREE_TYPE (function);
1986   is_method = ((TREE_CODE (function) == TREE_LIST
1987                 && current_class_type != NULL_TREE
1988                 && IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (function)) == function)
1989                || TREE_CODE (function) == IDENTIFIER_NODE
1990                || TREE_CODE (type) == METHOD_TYPE
1991                || TYPE_PTRMEMFUNC_P (type));
1992
1993   /* Handle methods, friends, and overloaded functions, respectively.  */
1994   if (is_method)
1995     {
1996       if (TREE_CODE (function) == FUNCTION_DECL)
1997         {
1998           if (DECL_NAME (function))
1999             function = DECL_NAME (function);
2000           else
2001             function = TYPE_IDENTIFIER (DECL_CLASS_CONTEXT (function));
2002         }
2003       else if (TREE_CODE (function) == TREE_LIST)
2004         {
2005 #if 0
2006           if (TREE_CODE (TREE_VALUE (function)) == TREE_LIST)
2007             function = TREE_PURPOSE (TREE_VALUE (function));
2008           else
2009             function = TREE_PURPOSE (function);
2010 #else
2011           my_friendly_assert (TREE_CODE (TREE_VALUE (function)) == FUNCTION_DECL, 312);
2012           function = TREE_PURPOSE (function);
2013 #endif
2014         }
2015       else if (TREE_CODE (function) != IDENTIFIER_NODE)
2016         {
2017           if (TREE_CODE (function) == OFFSET_REF)
2018             {
2019               if (TREE_OPERAND (function, 0))
2020                 decl = TREE_OPERAND (function, 0);
2021             }
2022           /* Call via a pointer to member function.  */
2023           if (decl == NULL_TREE)
2024             {
2025               error ("pointer to member function called, but not in class scope");
2026               return error_mark_node;
2027             }
2028           /* What other type of POINTER_TYPE could this be? */
2029           if (TREE_CODE (TREE_TYPE (function)) != POINTER_TYPE
2030               && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (function))
2031               && TREE_CODE (function) != OFFSET_REF)
2032             function = build (OFFSET_REF, TREE_TYPE (type), NULL_TREE, function);
2033           goto do_x_function;
2034         }
2035
2036       /* this is an abbreviated method call.
2037          must go through here in case it is a virtual function.
2038          @@ Perhaps this could be optimized.  */
2039
2040       if (decl == NULL_TREE)
2041         {
2042           if (current_class_type == NULL_TREE)
2043             {
2044               error ("object missing in call to method `%s'",
2045                      IDENTIFIER_POINTER (function));
2046               return error_mark_node;
2047             }
2048           /* Yow: call from a static member function.  */
2049           decl = build1 (NOP_EXPR, TYPE_POINTER_TO (current_class_type),
2050                          error_mark_node);
2051           decl = build_indirect_ref (decl, NULL_PTR);
2052         }
2053
2054       return build_method_call (decl, function, params,
2055                                 NULL_TREE, LOOKUP_NORMAL);
2056     }
2057   else if (TREE_CODE (function) == COMPONENT_REF
2058            && type == unknown_type_node)
2059     {
2060       /* Should we undo what was done in build_component_ref? */
2061       if (TREE_CODE (TREE_PURPOSE (TREE_OPERAND (function, 1))) == TREE_VEC)
2062         /* Get the name that build_component_ref hid. */
2063         function = DECL_NAME (TREE_VALUE (TREE_OPERAND (function, 1)));
2064       else
2065         function = TREE_PURPOSE (TREE_OPERAND (function, 1));
2066       return build_method_call (decl, function, params,
2067                                 NULL_TREE, LOOKUP_NORMAL);
2068     }
2069   else if (TREE_CODE (function) == TREE_LIST)
2070     {
2071       if (TREE_VALUE (function) == NULL_TREE)
2072         {
2073           cp_error ("function `%D' declared overloaded, but no definitions appear with which to resolve it?!?",
2074                     TREE_PURPOSE (function));
2075           return error_mark_node;
2076         }
2077       else
2078         {
2079           tree id = TREE_PURPOSE (function);
2080           function = TREE_VALUE (function);
2081
2082           if (TREE_CODE (function) == TEMPLATE_DECL)
2083             return build_overload_call_maybe
2084               (id, params, LOOKUP_COMPLAIN, (struct candidate *)0);
2085           else if (DECL_CHAIN (function) != NULL_TREE)
2086             return build_overload_call
2087               (id, params, LOOKUP_COMPLAIN, (struct candidate *)0);
2088           /* else fall out */
2089         }
2090     }
2091
2092  do_x_function:
2093   if (TREE_CODE (function) == OFFSET_REF)
2094     {
2095       /* If the component is a data element (or a virtual function), we play
2096          games here to make things work.  */
2097       tree decl_addr;
2098
2099       if (TREE_OPERAND (function, 0))
2100         decl = TREE_OPERAND (function, 0);
2101       else
2102         decl = C_C_D;
2103
2104       decl_addr = build_unary_op (ADDR_EXPR, decl, 0);
2105       function = get_member_function_from_ptrfunc (&decl_addr, decl,
2106                                                    TREE_OPERAND (function, 1));
2107       params = tree_cons (NULL_TREE, decl_addr, params);
2108       return build_function_call (function, params);
2109     }
2110
2111   type = TREE_TYPE (function);
2112   if (type != error_mark_node)
2113     {
2114       if (TREE_CODE (type) == REFERENCE_TYPE)
2115         type = TREE_TYPE (type);
2116
2117       if (TYPE_LANG_SPECIFIC (type) && TYPE_OVERLOADS_CALL_EXPR (type))
2118         return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, function, params, NULL_TREE);
2119     }
2120
2121   if (is_method)
2122     {
2123       tree fntype = TREE_TYPE (function);
2124       tree ctypeptr;
2125
2126       /* Explicitly named method?  */
2127       if (TREE_CODE (function) == FUNCTION_DECL)
2128         ctypeptr = TYPE_POINTER_TO (DECL_CLASS_CONTEXT (function));
2129       /* Expression with ptr-to-method type?  It could either be a plain
2130          usage, or it might be a case where the ptr-to-method is being
2131          passed in as an argument.  */
2132       else if (TYPE_PTRMEMFUNC_P (fntype))
2133         {
2134           tree rec = TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (fntype)));
2135           ctypeptr = TYPE_POINTER_TO (rec);
2136         }
2137       /* Unexpected node type?  */
2138       else
2139         my_friendly_abort (116);
2140       if (decl == NULL_TREE)
2141         {
2142           if (current_function_decl
2143               && DECL_STATIC_FUNCTION_P (current_function_decl))
2144             error ("invalid call to member function needing `this' in static member function scope");
2145           else
2146             error ("pointer to member function called, but not in class scope");
2147           return error_mark_node;
2148         }
2149       if (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
2150           && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (decl)))
2151         {
2152           decl = build_unary_op (ADDR_EXPR, decl, 0);
2153           decl = convert_pointer_to (TREE_TYPE (ctypeptr), decl);
2154         }
2155       else
2156         decl = build_c_cast (ctypeptr, decl);
2157       params = tree_cons (NULL_TREE, decl, params);
2158     }
2159
2160   return build_function_call (function, params);
2161 }
2162
2163 /* Resolve a pointer to member function.  INSTANCE is the object
2164    instance to use, if the member points to a virtual member.  */
2165
2166 tree
2167 get_member_function_from_ptrfunc (instance_ptrptr, instance, function)
2168      tree *instance_ptrptr;
2169      tree instance;
2170      tree function;
2171 {
2172   if (TREE_CODE (function) == OFFSET_REF)
2173     {
2174       function = TREE_OPERAND (function, 1);
2175     }
2176
2177   if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function)))
2178     {
2179       tree fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function));
2180       tree index = save_expr (convert (integer_type_node,
2181                                        build_component_ref (function,
2182                                                             index_identifier,
2183                                                             0, 0)));
2184       tree e1 = build (GT_EXPR, integer_type_node, index, integer_zero_node);
2185       tree delta = build_component_ref (function, delta_identifier, 0, 0);
2186       tree delta2 = DELTA2_FROM_PTRMEMFUNC (function);
2187       tree e2;
2188       tree e3;
2189       tree aref, vtbl;
2190
2191       /* convert down to the right base, before using the instance. */
2192       instance = convert_pointer_to_real (TYPE_METHOD_BASETYPE (TREE_TYPE (fntype)),
2193                                           build_unary_op (ADDR_EXPR, instance, 0));
2194       if (instance == error_mark_node)
2195         return instance;
2196
2197       vtbl = convert_pointer_to (ptr_type_node, instance);
2198       vtbl
2199         = build (PLUS_EXPR,
2200                  build_pointer_type (build_pointer_type (vtable_entry_type)),
2201                  vtbl, convert (sizetype, delta2));
2202       vtbl = build_indirect_ref (vtbl, NULL_PTR);
2203       aref = build_array_ref (vtbl, size_binop (MINUS_EXPR,
2204                                                 index,
2205                                                 integer_one_node));
2206       if (! flag_vtable_thunks)
2207         {
2208           aref = save_expr (aref);
2209
2210           /* Save the intermediate result in a SAVE_EXPR so we don't have to
2211              compute each component of the virtual function pointer twice.  */ 
2212           if (/* !building_cleanup && */ TREE_CODE (aref) == INDIRECT_REF)
2213             TREE_OPERAND (aref, 0) = save_expr (TREE_OPERAND (aref, 0));
2214       
2215           delta = build (PLUS_EXPR, integer_type_node,
2216                          build_conditional_expr (e1, build_component_ref (aref, delta_identifier, 0, 0), integer_zero_node),
2217                          delta);
2218         }
2219
2220       *instance_ptrptr = build (PLUS_EXPR, TREE_TYPE (*instance_ptrptr),
2221                                 *instance_ptrptr,
2222                                 convert (integer_type_node, delta));
2223       if (flag_vtable_thunks)
2224         e2 = aref;
2225       else
2226         e2 = build_component_ref (aref, pfn_identifier, 0, 0);
2227
2228       e3 = PFN_FROM_PTRMEMFUNC (function);
2229       TREE_TYPE (e2) = TREE_TYPE (e3);
2230       function = build_conditional_expr (e1, e2, e3);
2231     }
2232   return function;
2233 }
2234
2235 tree
2236 build_function_call_real (function, params, require_complete, flags)
2237      tree function, params;
2238      int require_complete, flags;
2239 {
2240   register tree fntype, fndecl;
2241   register tree value_type;
2242   register tree coerced_params;
2243   tree name = NULL_TREE, assembler_name = NULL_TREE;
2244   int is_method;
2245
2246   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2247      Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context.  */
2248   if (TREE_CODE (function) == NOP_EXPR
2249       && TREE_TYPE (function) == TREE_TYPE (TREE_OPERAND (function, 0)))
2250     function = TREE_OPERAND (function, 0);
2251
2252   if (TREE_CODE (function) == FUNCTION_DECL)
2253     {
2254       name = DECL_NAME (function);
2255       assembler_name = DECL_ASSEMBLER_NAME (function);
2256
2257       GNU_xref_call (current_function_decl,
2258                      IDENTIFIER_POINTER (name ? name
2259                                          : TYPE_IDENTIFIER (DECL_CLASS_CONTEXT (function))));
2260       assemble_external (function);
2261       fndecl = function;
2262
2263       /* Convert anything with function type to a pointer-to-function.  */
2264       if (pedantic
2265           && name
2266           && IDENTIFIER_LENGTH (name) == 4
2267           && ! strcmp (IDENTIFIER_POINTER (name), "main")
2268           && DECL_CONTEXT (function) == NULL_TREE)
2269         {
2270           pedwarn ("ANSI C++ forbids calling `main' from within program");
2271         }
2272
2273       /* Differs from default_conversion by not setting TREE_ADDRESSABLE
2274          (because calling an inline function does not mean the function
2275          needs to be separately compiled).  */
2276
2277       if (DECL_INLINE (function))
2278         {
2279           fntype = build_type_variant (TREE_TYPE (function),
2280                                        TREE_READONLY (function),
2281                                        TREE_THIS_VOLATILE (function));
2282           function = build1 (ADDR_EXPR, build_pointer_type (fntype), function);
2283         }
2284       else
2285         {
2286           assemble_external (function);
2287           TREE_USED (function) = 1;
2288           function = default_conversion (function);
2289         }
2290     }
2291   else
2292     {
2293       fndecl = NULL_TREE;
2294
2295       /* Convert anything with function type to a pointer-to-function.  */
2296       if (function == error_mark_node)
2297         return error_mark_node;
2298       function = default_conversion (function);
2299     }
2300
2301   fntype = TREE_TYPE (function);
2302
2303   if (TYPE_PTRMEMFUNC_P (fntype))
2304     {
2305       tree instance_ptr = build_unary_op (ADDR_EXPR, C_C_D, 0);
2306       fntype = TYPE_PTRMEMFUNC_FN_TYPE (fntype);
2307       function = get_member_function_from_ptrfunc (&instance_ptr, C_C_D, function);
2308     }
2309
2310   is_method = (TREE_CODE (fntype) == POINTER_TYPE
2311                && TREE_CODE (TREE_TYPE (fntype)) == METHOD_TYPE);
2312
2313   if (!((TREE_CODE (fntype) == POINTER_TYPE
2314          && TREE_CODE (TREE_TYPE (fntype)) == FUNCTION_TYPE)
2315         || is_method))
2316     {
2317       error ("called object is not a function");
2318       return error_mark_node;
2319     }
2320
2321   /* fntype now gets the type of function pointed to.  */
2322   fntype = TREE_TYPE (fntype);
2323
2324   /* Convert the parameters to the types declared in the
2325      function prototype, or apply default promotions.  */
2326
2327   if (flags & LOOKUP_COMPLAIN)
2328     coerced_params = convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
2329                                         params, fndecl, LOOKUP_NORMAL);
2330   else
2331     coerced_params = convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
2332                                         params, fndecl, 0);
2333
2334   /* Check for errors in format strings.  */
2335
2336   if (warn_format && (name || assembler_name))
2337     check_function_format (name, assembler_name, coerced_params);
2338
2339   /* Recognize certain built-in functions so we can make tree-codes
2340      other than CALL_EXPR.  We do this when it enables fold-const.c
2341      to do something useful.  */
2342
2343   if (TREE_CODE (function) == ADDR_EXPR
2344       && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL
2345       && DECL_BUILT_IN (TREE_OPERAND (function, 0)))
2346     switch (DECL_FUNCTION_CODE (TREE_OPERAND (function, 0)))
2347       {
2348       case BUILT_IN_ABS:
2349       case BUILT_IN_LABS:
2350       case BUILT_IN_FABS:
2351         if (coerced_params == 0)
2352           return integer_zero_node;
2353         return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
2354       }
2355
2356   /* C++ */
2357   value_type = TREE_TYPE (fntype) ? TREE_TYPE (fntype) : void_type_node;
2358   {
2359     register tree result = 
2360       build (CALL_EXPR, value_type,
2361              function, coerced_params, NULL_TREE);
2362
2363     TREE_SIDE_EFFECTS (result) = 1;
2364     /* Remove this sometime. */
2365     TREE_RAISES (result) |= !! TYPE_RAISES_EXCEPTIONS (fntype);
2366     if (! require_complete)
2367       return result;
2368     if (value_type == void_type_node)
2369       return result;
2370     return require_complete_type (result);
2371   }
2372 }
2373
2374 tree
2375 build_function_call (function, params)
2376      tree function, params;
2377 {
2378   return build_function_call_real (function, params, 1, LOOKUP_NORMAL);
2379 }
2380      
2381 tree
2382 build_function_call_maybe (function, params)
2383      tree function, params;
2384 {
2385   return build_function_call_real (function, params, 0, 0);
2386 }
2387
2388 \f
2389 /* Convert the actual parameter expressions in the list VALUES
2390    to the types in the list TYPELIST.
2391    If parmdecls is exhausted, or when an element has NULL as its type,
2392    perform the default conversions.
2393
2394    RETURN_LOC is the location of the return value, if known, NULL_TREE
2395    otherwise.  This is useful in the case where we can avoid creating
2396    a temporary variable in the case where we can initialize the return
2397    value directly.  If we are not eliding constructors, then we set this
2398    to NULL_TREE to avoid this avoidance.
2399
2400    NAME is an IDENTIFIER_NODE or 0.  It is used only for error messages.
2401
2402    This is also where warnings about wrong number of args are generated.
2403    
2404    Return a list of expressions for the parameters as converted.
2405
2406    Both VALUES and the returned value are chains of TREE_LIST nodes
2407    with the elements of the list in the TREE_VALUE slots of those nodes.
2408
2409    In C++, unspecified trailing parameters can be filled in with their
2410    default arguments, if such were specified.  Do so here.  */
2411
2412 tree
2413 convert_arguments (return_loc, typelist, values, fndecl, flags)
2414      tree return_loc, typelist, values, fndecl;
2415      int flags;
2416 {
2417   extern tree gc_protect_fndecl;
2418   register tree typetail, valtail;
2419   register tree result = NULL_TREE;
2420   char *called_thing;
2421   int maybe_raises = 0;
2422   int i = 0;
2423
2424   if (! flag_elide_constructors)
2425     return_loc = 0;
2426
2427   if (fndecl)
2428     {
2429       if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
2430         {
2431           if (DECL_NAME (fndecl) == NULL_TREE
2432               || IDENTIFIER_HAS_TYPE_VALUE (DECL_NAME (fndecl)))
2433             called_thing = "constructor";
2434           else
2435             called_thing = "member function";
2436         }
2437       else
2438         called_thing = "function";
2439     }
2440
2441   for (valtail = values, typetail = typelist;
2442        valtail;
2443        valtail = TREE_CHAIN (valtail), i++)
2444     {
2445       register tree type = typetail ? TREE_VALUE (typetail) : 0;
2446       register tree val = TREE_VALUE (valtail);
2447
2448       if (type == void_type_node)
2449         {
2450           if (fndecl)
2451             {
2452               char *buf = (char *)alloca (40 + strlen (called_thing));
2453               sprintf (buf, "too many arguments to %s `%%s'", called_thing);
2454               error_with_decl (fndecl, buf);
2455               error ("at this point in file");
2456             }
2457           else
2458             error ("too many arguments to function");
2459           /* In case anybody wants to know if this argument
2460              list is valid.  */
2461           if (result)
2462             TREE_TYPE (tree_last (result)) = error_mark_node;
2463           break;
2464         }
2465
2466       /* The tree type of the parameter being passed may not yet be
2467          known.  In this case, its type is TYPE_UNKNOWN, and will
2468          be instantiated by the type given by TYPE.  If TYPE
2469          is also NULL, the tree type of VAL is ERROR_MARK_NODE.  */
2470       if (type && type_unknown_p (val))
2471         val = require_instantiated_type (type, val, integer_zero_node);
2472       else if (type_unknown_p (val))
2473         {
2474           /* Strip the `&' from an overloaded FUNCTION_DECL.  */
2475           if (TREE_CODE (val) == ADDR_EXPR)
2476             val = TREE_OPERAND (val, 0);
2477           if (TREE_CODE (val) == TREE_LIST
2478               && TREE_CHAIN (val) == NULL_TREE
2479               && TREE_TYPE (TREE_VALUE (val)) != NULL_TREE
2480               && (TREE_TYPE (val) == unknown_type_node
2481                   || DECL_CHAIN (TREE_VALUE (val)) == NULL_TREE))
2482             /* Instantiates automatically.  */
2483             val = TREE_VALUE (val);
2484           else
2485             {
2486               error ("insufficient type information in parameter list");
2487               val = integer_zero_node;
2488             }
2489         }
2490       else if (TREE_CODE (val) == OFFSET_REF
2491             && TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE)
2492         {
2493           /* This is unclean.  Should be handled elsewhere. */
2494           val = build_unary_op (ADDR_EXPR, val, 0);
2495         }
2496       else if (TREE_CODE (val) == OFFSET_REF)
2497         val = resolve_offset_ref (val);
2498
2499       {
2500 #if 0
2501         /* This code forces the assumption that if we have a ptr-to-func
2502            type in an arglist, that every routine that wants to check
2503            its validity has done so, and thus we need not do any
2504            more conversion.  I don't remember why this is necessary.  */
2505         else if (TREE_CODE (ttype) == FUNCTION_TYPE
2506                  && (type == NULL
2507                      || TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
2508                      || TREE_CODE (TREE_TYPE (type)) == VOID_TYPE))
2509           {
2510             type = build_pointer_type (ttype);
2511           }
2512 #endif
2513       }
2514
2515       /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2516          Strip such NOP_EXPRs, since VAL is used in non-lvalue context.  */
2517       if (TREE_CODE (val) == NOP_EXPR
2518           && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))
2519           && (type == 0 || TREE_CODE (type) != REFERENCE_TYPE))
2520         val = TREE_OPERAND (val, 0);
2521
2522       if ((type == 0 || TREE_CODE (type) != REFERENCE_TYPE)
2523           && (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE
2524               || TREE_CODE (TREE_TYPE (val)) == FUNCTION_TYPE
2525               || TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE))
2526         val = default_conversion (val);
2527
2528       val = require_complete_type (val);
2529
2530       if (val == error_mark_node)
2531         continue;
2532
2533       maybe_raises |= TREE_RAISES (val);
2534
2535       if (type != 0)
2536         {
2537           /* Formal parm type is specified by a function prototype.  */
2538           tree parmval;
2539
2540           if (TYPE_SIZE (type) == 0)
2541             {
2542               error ("parameter type of called function is incomplete");
2543               parmval = val;
2544             }
2545           else
2546             {
2547 #ifdef PROMOTE_PROTOTYPES
2548               /* Rather than truncating and then reextending,
2549                  convert directly to int, if that's the type we will want.  */
2550               if (! flag_traditional
2551                   && (TREE_CODE (type) == INTEGER_TYPE
2552                       || TREE_CODE (type) == ENUMERAL_TYPE)
2553                   && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
2554                 type = integer_type_node;
2555 #endif
2556               parmval = convert_for_initialization (return_loc, type, val, flags,
2557                                                     "argument passing", fndecl, i);
2558 #ifdef PROMOTE_PROTOTYPES
2559               if ((TREE_CODE (type) == INTEGER_TYPE
2560                    || TREE_CODE (type) == ENUMERAL_TYPE)
2561                   && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
2562                 parmval = default_conversion (parmval);
2563 #endif
2564             }
2565           result = tree_cons (NULL_TREE, parmval, result);
2566         }
2567       else
2568         {
2569           if (TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE)
2570             val = convert_from_reference (val);
2571
2572           if (TREE_CODE (TREE_TYPE (val)) == REAL_TYPE
2573               && (TYPE_PRECISION (TREE_TYPE (val))
2574                   < TYPE_PRECISION (double_type_node)))
2575             /* Convert `float' to `double'.  */
2576             result = tree_cons (NULL_TREE, convert (double_type_node, val), result);
2577           else if (TYPE_LANG_SPECIFIC (TREE_TYPE (val))
2578                    && (TYPE_HAS_INIT_REF (TREE_TYPE (val))
2579                        || TYPE_HAS_ASSIGN_REF (TREE_TYPE (val))))
2580             {
2581               cp_warning ("cannot pass objects of type `%T' through `...'",
2582                           TREE_TYPE (val));
2583               result = tree_cons (NULL_TREE, val, result);
2584             }
2585           else
2586             /* Convert `short' and `char' to full-size `int'.  */
2587             result = tree_cons (NULL_TREE, default_conversion (val), result);
2588         }
2589
2590       if (flag_gc
2591           /* There are certain functions for which we don't need
2592              to protect our arguments.  GC_PROTECT_FNDECL is one.  */
2593           && fndecl != gc_protect_fndecl
2594           && type_needs_gc_entry (TREE_TYPE (TREE_VALUE (result)))
2595           && ! value_safe_from_gc (NULL_TREE, TREE_VALUE (result)))
2596         /* This will build a temporary variable whose cleanup is
2597            to clear the obstack entry.  */
2598         TREE_VALUE (result) = protect_value_from_gc (NULL_TREE,
2599                                                      TREE_VALUE (result));
2600
2601       if (typetail)
2602         typetail = TREE_CHAIN (typetail);
2603     }
2604
2605   if (typetail != 0 && typetail != void_list_node)
2606     {
2607       /* See if there are default arguments that can be used */
2608       if (TREE_PURPOSE (typetail))
2609         {
2610           while (typetail != void_list_node)
2611             {
2612               tree type = TREE_VALUE (typetail);
2613               tree val = TREE_PURPOSE (typetail);
2614               tree parmval;
2615
2616               if (val == NULL_TREE)
2617                 parmval = error_mark_node;
2618               else if (TREE_CODE (val) == CONSTRUCTOR)
2619                 {
2620                   parmval = digest_init (type, val, (tree *)0);
2621                   parmval = convert_for_initialization (return_loc, type, parmval, flags,
2622                                                         "default constructor", fndecl, i);
2623                 }
2624               else
2625                 {
2626                   /* This could get clobbered by the following call.  */
2627                   if (TREE_HAS_CONSTRUCTOR (val))
2628                     val = copy_node (val);
2629
2630                   parmval = convert_for_initialization (return_loc, type, val, flags,
2631                                                         "default argument", fndecl, i);
2632 #ifdef PROMOTE_PROTOTYPES
2633                   if ((TREE_CODE (type) == INTEGER_TYPE
2634                        || TREE_CODE (type) == ENUMERAL_TYPE)
2635                       && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
2636                     parmval = default_conversion (parmval);
2637 #endif
2638                 }
2639               maybe_raises |= TREE_RAISES (parmval);
2640
2641               if (flag_gc
2642                   && type_needs_gc_entry (TREE_TYPE (parmval))
2643                   && ! value_safe_from_gc (NULL_TREE, parmval))
2644                 parmval = protect_value_from_gc (NULL_TREE, parmval);
2645
2646               result = tree_cons (0, parmval, result);
2647               typetail = TREE_CHAIN (typetail);
2648               /* ends with `...'.  */
2649               if (typetail == NULL_TREE)
2650                 break;
2651             }
2652         }
2653       else
2654         {
2655           if (fndecl)
2656             {
2657               char *buf = (char *)alloca (32 + strlen (called_thing));
2658               sprintf (buf, "too few arguments to %s `%%#D'", called_thing);
2659               cp_error_at (buf, fndecl);
2660               error ("at this point in file");
2661             }
2662           else
2663             error ("too few arguments to function");
2664           return error_mark_list;
2665         }
2666     }
2667   if (result)
2668     TREE_RAISES (result) = maybe_raises;
2669
2670   return nreverse (result);
2671 }
2672 \f
2673 /* Build a binary-operation expression, after performing default
2674    conversions on the operands.  CODE is the kind of expression to build.  */
2675
2676 tree
2677 build_x_binary_op (code, arg1, arg2)
2678      enum tree_code code;
2679      tree arg1, arg2;
2680 {
2681   tree rval = build_opfncall (code, LOOKUP_SPECULATIVELY,
2682                               arg1, arg2, NULL_TREE);
2683   if (rval)
2684     return build_opfncall (code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE);
2685   if (code == MEMBER_REF)
2686     return build_m_component_ref (build_indirect_ref (arg1, NULL_PTR),
2687                                   arg2);
2688   return build_binary_op (code, arg1, arg2, 1);
2689 }
2690
2691 tree
2692 build_binary_op (code, arg1, arg2, convert_p)
2693      enum tree_code code;
2694      tree arg1, arg2;
2695      int convert_p;
2696 {
2697   tree type1, type2;
2698   tree args[2];
2699
2700   args[0] = arg1;
2701   args[1] = arg2;
2702
2703   if (convert_p)
2704     {
2705       args[0] = default_conversion (args[0]);
2706       args[1] = default_conversion (args[1]);
2707
2708       if (type_unknown_p (args[0]))
2709         {
2710           args[0] = instantiate_type (TREE_TYPE (args[1]), args[0], 1);
2711           args[0] = default_conversion (args[0]);
2712         }
2713       else if (type_unknown_p (args[1]))
2714         {
2715           args[1] = require_instantiated_type (TREE_TYPE (args[0]),
2716                                                args[1],
2717                                                error_mark_node);
2718           args[1] = default_conversion (args[1]);
2719         }
2720
2721       type1 = TREE_TYPE (args[0]);
2722       type2 = TREE_TYPE (args[1]);
2723
2724       if (IS_AGGR_TYPE_2 (type1, type2) && ! TYPE_PTRMEMFUNC_P (type1))
2725         {
2726           /* Try to convert this to something reasonable.  */
2727           if (! build_default_binary_type_conversion(code, &args[0], &args[1]))
2728             return error_mark_node;
2729         }
2730       else if ((IS_AGGR_TYPE (type1) && ! TYPE_PTRMEMFUNC_P (type1))
2731                || (IS_AGGR_TYPE (type2) && ! TYPE_PTRMEMFUNC_P (type2)))
2732         {
2733           int convert_index = IS_AGGR_TYPE (type2);
2734           /* Avoid being tripped up by things like (ARG1 != 0).  */
2735           tree types[2], try;
2736           
2737           types[0] = type1; types[1] = type2;
2738           if (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
2739             try = build_type_conversion (code, bool_type_node,
2740                                          args[convert_index], 1);
2741           else
2742             {
2743               try = build_type_conversion (code, types[convert_index ^ 1],
2744                                            args[convert_index], 1);
2745           
2746               if (try == 0
2747                   && args[1] == integer_zero_node
2748                   && (code == NE_EXPR || code == EQ_EXPR))
2749                 try = build_type_conversion (code, ptr_type_node,
2750                                              args[convert_index], 1);
2751             }
2752
2753           if (try == 0)
2754             {
2755               cp_error ("no match for `%O(%#T, %#T)'", code,
2756                         types[convert_index], types[convert_index ^ 1]);
2757               return error_mark_node;
2758             }
2759           if (try == error_mark_node)
2760             error ("ambiguous pointer conversion");
2761           args[convert_index] = try;
2762         }
2763     }
2764   return build_binary_op_nodefault (code, args[0], args[1], code);
2765 }
2766
2767 /* Build a binary-operation expression without default conversions.
2768    CODE is the kind of expression to build.
2769    This function differs from `build' in several ways:
2770    the data type of the result is computed and recorded in it,
2771    warnings are generated if arg data types are invalid,
2772    special handling for addition and subtraction of pointers is known,
2773    and some optimization is done (operations on narrow ints
2774    are done in the narrower type when that gives the same result).
2775    Constant folding is also done before the result is returned.
2776
2777    ERROR_CODE is the code that determines what to say in error messages.
2778    It is usually, but not always, the same as CODE.
2779
2780    Note that the operands will never have enumeral types
2781    because either they have just had the default conversions performed
2782    or they have both just been converted to some other type in which
2783    the arithmetic is to be done.
2784
2785    C++: must do special pointer arithmetic when implementing
2786    multiple inheritance, and deal with pointer to member functions.  */
2787
2788 tree
2789 build_binary_op_nodefault (code, orig_op0, orig_op1, error_code)
2790      enum tree_code code;
2791      tree orig_op0, orig_op1;
2792      enum tree_code error_code;
2793 {
2794   tree op0, op1;
2795   register enum tree_code code0, code1;
2796   tree type0, type1;
2797
2798   /* Expression code to give to the expression when it is built.
2799      Normally this is CODE, which is what the caller asked for,
2800      but in some special cases we change it.  */
2801   register enum tree_code resultcode = code;
2802
2803   /* Data type in which the computation is to be performed.
2804      In the simplest cases this is the common type of the arguments.  */
2805   register tree result_type = NULL;
2806
2807   /* Nonzero means operands have already been type-converted
2808      in whatever way is necessary.
2809      Zero means they need to be converted to RESULT_TYPE.  */
2810   int converted = 0;
2811
2812   /* Nonzero means after finally constructing the expression
2813      give it this type.  Otherwise, give it type RESULT_TYPE.  */
2814   tree final_type = 0;
2815
2816   /* Nonzero if this is an operation like MIN or MAX which can
2817      safely be computed in short if both args are promoted shorts.
2818      Also implies COMMON.
2819      -1 indicates a bitwise operation; this makes a difference
2820      in the exact conditions for when it is safe to do the operation
2821      in a narrower mode.  */
2822   int shorten = 0;
2823
2824   /* Nonzero if this is a comparison operation;
2825      if both args are promoted shorts, compare the original shorts.
2826      Also implies COMMON.  */
2827   int short_compare = 0;
2828
2829   /* Nonzero if this is a right-shift operation, which can be computed on the
2830      original short and then promoted if the operand is a promoted short.  */
2831   int short_shift = 0;
2832
2833   /* Nonzero means set RESULT_TYPE to the common type of the args.  */
2834   int common = 0;
2835
2836   /* Apply default conversions.  */
2837   op0 = default_conversion (orig_op0);
2838   op1 = default_conversion (orig_op1);
2839
2840   type0 = TREE_TYPE (op0);
2841   type1 = TREE_TYPE (op1);
2842
2843   /* The expression codes of the data types of the arguments tell us
2844      whether the arguments are integers, floating, pointers, etc.  */
2845   code0 = TREE_CODE (type0);
2846   code1 = TREE_CODE (type1);
2847
2848   /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue.  */
2849   STRIP_TYPE_NOPS (op0);
2850   STRIP_TYPE_NOPS (op1);
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 pointer_int_sum (PLUS_EXPR, op0, op1);
2864       else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE)
2865         return 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           && comp_target_types (type0, type1, 1))
2875         return pointer_diff (op0, op1);
2876       /* Handle pointer minus int.  Just like pointer plus int.  */
2877       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
2878         return pointer_int_sum (MINUS_EXPR, op0, op1);
2879       else
2880         common = 1;
2881       break;
2882
2883     case MULT_EXPR:
2884       common = 1;
2885       break;
2886
2887     case TRUNC_DIV_EXPR:
2888     case CEIL_DIV_EXPR:
2889     case FLOOR_DIV_EXPR:
2890     case ROUND_DIV_EXPR:
2891     case EXACT_DIV_EXPR:
2892       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
2893           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
2894         {
2895           if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
2896             {
2897               error ("division by zero");
2898               op1 = integer_one_node;
2899             }
2900           else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
2901             {
2902               error ("division by zero");
2903               op1 = build_real (TREE_TYPE (op1), dconst1);
2904             }
2905               
2906           if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE))
2907             resultcode = RDIV_EXPR;
2908           else
2909             /* When dividing two signed integers, we have to promote to int.
2910                unless we divide by a conatant != -1.  Note that default
2911                conversion will have been performed on the operands at this
2912                point, so we have to dig out the original type to find out if
2913                it was unsigned.  */
2914             shorten = ((TREE_CODE (op0) == NOP_EXPR
2915                         && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
2916                        || (TREE_CODE (op1) == INTEGER_CST
2917                            && (TREE_INT_CST_LOW (op1) != -1
2918                                || TREE_INT_CST_HIGH (op1) != -1)));
2919           common = 1;
2920         }
2921       break;
2922
2923     case BIT_AND_EXPR:
2924     case BIT_ANDTC_EXPR:
2925     case BIT_IOR_EXPR:
2926     case BIT_XOR_EXPR:
2927       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2928         shorten = -1;
2929       /* If one operand is a constant, and the other is a short type
2930          that has been converted to an int,
2931          really do the work in the short type and then convert the
2932          result to int.  If we are lucky, the constant will be 0 or 1
2933          in the short type, making the entire operation go away.  */
2934       if (TREE_CODE (op0) == INTEGER_CST
2935           && TREE_CODE (op1) == NOP_EXPR
2936           && TYPE_PRECISION (type1) > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op1, 0)))
2937           && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op1, 0))))
2938         {
2939           final_type = result_type;
2940           op1 = TREE_OPERAND (op1, 0);
2941           result_type = TREE_TYPE (op1);
2942         }
2943       if (TREE_CODE (op1) == INTEGER_CST
2944           && TREE_CODE (op0) == NOP_EXPR
2945           && TYPE_PRECISION (type0) > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))
2946           && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
2947         {
2948           final_type = result_type;
2949           op0 = TREE_OPERAND (op0, 0);
2950           result_type = TREE_TYPE (op0);
2951         }
2952       break;
2953
2954     case TRUNC_MOD_EXPR:
2955     case FLOOR_MOD_EXPR:
2956       if (code1 == INTEGER_TYPE && integer_zerop (op1))
2957         {
2958           error ("division by zero");
2959           op1 = integer_one_node;
2960         }
2961       else if (code1 == REAL_TYPE && real_zerop (op1))
2962         {
2963           error ("division by zero");
2964           op1 = build_real (TREE_TYPE (op1), dconst1);
2965         }
2966       
2967       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2968         {
2969           /* Although it would be tempting to shorten always here, that loses
2970              on some targets, since the modulo instruction is undefined if the
2971              quotient can't be represented in the computation mode.  We shorten
2972              only if unsigned or if dividing by something we know != -1.  */
2973           shorten = ((TREE_CODE (op0) == NOP_EXPR
2974                       && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
2975                      || (TREE_CODE (op1) == INTEGER_CST
2976                          && (TREE_INT_CST_LOW (op1) != -1
2977                              || TREE_INT_CST_HIGH (op1) != -1)));
2978           common = 1;
2979         }
2980       break;
2981
2982     case TRUTH_ANDIF_EXPR:
2983     case TRUTH_ORIF_EXPR:
2984     case TRUTH_AND_EXPR:
2985     case TRUTH_OR_EXPR:
2986       result_type = bool_type_node;
2987       op0 = bool_truthvalue_conversion (op0);
2988       op1 = bool_truthvalue_conversion (op1);
2989       converted = 1;
2990       break;
2991
2992       /* Shift operations: result has same type as first operand;
2993          always convert second operand to int.
2994          Also set SHORT_SHIFT if shifting rightward.  */
2995
2996     case RSHIFT_EXPR:
2997       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2998         {
2999           result_type = type0;
3000           if (TREE_CODE (op1) == INTEGER_CST)
3001             {
3002               if (tree_int_cst_lt (op1, integer_zero_node))
3003                 warning ("right shift count is negative");
3004               else
3005                 {
3006                   if (TREE_INT_CST_LOW (op1) | TREE_INT_CST_HIGH (op1))
3007                     short_shift = 1;
3008                   if (TREE_INT_CST_HIGH (op1) != 0
3009                       || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1)
3010                           >= TYPE_PRECISION (type0)))
3011                     warning ("right shift count >= width of type");
3012                 }
3013             }
3014           /* Convert the shift-count to an integer, regardless of
3015              size of value being shifted.  */
3016           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3017             op1 = convert (integer_type_node, op1);
3018           /* Avoid converting op1 to result_type later.  */
3019           converted = 1;
3020         }
3021       break;
3022
3023     case LSHIFT_EXPR:
3024       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3025         {
3026           result_type = type0;
3027           if (TREE_CODE (op1) == INTEGER_CST)
3028             {
3029               if (tree_int_cst_lt (op1, integer_zero_node))
3030                 warning ("left shift count is negative");
3031               else if (TREE_INT_CST_HIGH (op1) != 0
3032                        || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1)
3033                            >= TYPE_PRECISION (type0)))
3034                 warning ("left shift count >= width of type");
3035             }
3036           /* Convert the shift-count to an integer, regardless of
3037              size of value being shifted.  */
3038           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3039             op1 = convert (integer_type_node, op1);
3040           /* Avoid converting op1 to result_type later.  */
3041           converted = 1;
3042         }
3043       break;
3044
3045     case RROTATE_EXPR:
3046     case LROTATE_EXPR:
3047       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3048         {
3049           result_type = type0;
3050           if (TREE_CODE (op1) == INTEGER_CST)
3051             {
3052               if (tree_int_cst_lt (op1, integer_zero_node))
3053                 warning ("%s rotate count is negative",
3054                          (code == LROTATE_EXPR) ? "left" : "right");
3055               else if (TREE_INT_CST_HIGH (op1) != 0
3056                        || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1)
3057                            >= TYPE_PRECISION (type0)))
3058                 warning ("%s rotate count >= width of type",
3059                          (code == LROTATE_EXPR) ? "left" : "right");
3060             }
3061           /* Convert the shift-count to an integer, regardless of
3062              size of value being shifted.  */
3063           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3064             op1 = convert (integer_type_node, op1);
3065         }
3066       break;
3067
3068     case EQ_EXPR:
3069     case NE_EXPR:
3070       result_type = bool_type_node;
3071       converted = 1;
3072       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3073           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3074         short_compare = 1;
3075       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3076         {
3077           register tree tt0 = TYPE_MAIN_VARIANT (TREE_TYPE (type0));
3078           register tree tt1 = TYPE_MAIN_VARIANT (TREE_TYPE (type1));
3079           /* Anything compares with void *.  void * compares with anything.
3080              Otherwise, the targets must be the same.  */
3081           if (tt0 != tt1 && TREE_CODE (tt0) == RECORD_TYPE
3082               && TREE_CODE (tt1) == RECORD_TYPE)
3083             {
3084               tree base = common_base_type (tt0, tt1);
3085               if (base == NULL_TREE)
3086                 cp_warning ("comparison of distinct object pointer types `%T' and `%T'", type0, type1);
3087               else if (base == error_mark_node)
3088                 {
3089                   cp_error ("comparison of pointer types `%T' and `%T' requires conversion to ambiguous supertype", type0, type1);
3090                   return error_mark_node;
3091                 }
3092               else
3093                 {
3094                   if (integer_zerop (op0))
3095                     op0 = null_pointer_node;
3096                   else
3097                     op0 = convert_pointer_to (base, op0);
3098                   if (integer_zerop (op1))
3099                     op1 = null_pointer_node;
3100                   else
3101                     op1 = convert_pointer_to (base, op1);
3102                 }
3103             }
3104           else if (comp_target_types (type0, type1, 1))
3105             ;
3106           else if (tt0 == void_type_node)
3107             {
3108               if (pedantic && TREE_CODE (tt1) == FUNCTION_TYPE
3109                   && tree_int_cst_lt (TYPE_SIZE (type0), TYPE_SIZE (type1)))
3110                 pedwarn ("ANSI C++ forbids comparison of `void *' with function pointer");
3111             }
3112           else if (tt1 == void_type_node)
3113             {
3114               if (pedantic && TREE_CODE (tt0) == FUNCTION_TYPE
3115                   && tree_int_cst_lt (TYPE_SIZE (type1), TYPE_SIZE (type0)))
3116                 pedwarn ("ANSI C++ forbids comparison of `void *' with function pointer");
3117             }
3118           else if ((TYPE_SIZE (tt0) != 0) != (TYPE_SIZE (tt1) != 0))
3119             cp_pedwarn ("comparison of %scomplete and %scomplete pointers `%T' and `%T'",
3120                         TYPE_SIZE (tt0) == 0 ? "in" : "",
3121                         TYPE_SIZE (tt1) == 0 ? "in" : "",
3122                         type0, type1);
3123           else
3124             cp_pedwarn ("comparison of distinct pointer types `%T' and `%T' lacks a cast",
3125                         type0, type1);
3126         }
3127       else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
3128                && integer_zerop (op1))
3129         op1 = null_pointer_node;
3130       else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
3131                && integer_zerop (op0))
3132         op0 = null_pointer_node;
3133       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3134         {
3135           error ("ANSI C++ forbids comparison between pointer and integer");
3136           op1 = convert (TREE_TYPE (op0), op1);
3137         }
3138       else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
3139         {
3140           error ("ANSI C++ forbids comparison between pointer and integer");
3141           op0 = convert (TREE_TYPE (op1), op0);
3142         }
3143       else if (TYPE_PTRMEMFUNC_P (type0) && TREE_CODE (op1) == INTEGER_CST
3144                && integer_zerop (op1))
3145         {
3146           op0 = build_component_ref (op0, index_identifier, 0, 0);
3147           op1 = integer_zero_node;
3148         }
3149       else if (TYPE_PTRMEMFUNC_P (type1) && TREE_CODE (op0) == INTEGER_CST
3150                && integer_zerop (op0))
3151         {
3152           op0 = build_component_ref (op1, index_identifier, 0, 0);
3153           op1 = integer_zero_node;
3154         }
3155       else if (TYPE_PTRMEMFUNC_P (type0) && TYPE_PTRMEMFUNC_P (type1)
3156                && (TYPE_PTRMEMFUNC_FN_TYPE (type0)
3157                    == TYPE_PTRMEMFUNC_FN_TYPE (type1)))
3158         {
3159           /* The code we generate for the test is:
3160
3161           (op0.index == op1.index
3162            && ((op1.index != -1 && op0.delta2 == op1.delta2)
3163                || op0.pfn == op1.pfn)) */
3164
3165           tree index0 = build_component_ref (op0, index_identifier, 0, 0);
3166           tree index1 = save_expr (build_component_ref (op1, index_identifier, 0, 0));
3167           tree pfn0 = PFN_FROM_PTRMEMFUNC (op0);
3168           tree pfn1 = PFN_FROM_PTRMEMFUNC (op1);
3169           tree delta20 = DELTA2_FROM_PTRMEMFUNC (op0);
3170           tree delta21 = DELTA2_FROM_PTRMEMFUNC (op1);
3171           tree e1, e2, e3;
3172           tree integer_neg_one_node
3173             = size_binop (MINUS_EXPR, integer_zero_node, integer_one_node);
3174           e1 = build_binary_op (EQ_EXPR, index0, index1, 1);
3175           e2 = build_binary_op (NE_EXPR, index1, integer_neg_one_node, 1);
3176           e2 = build_binary_op (TRUTH_ANDIF_EXPR, e2, build_binary_op (EQ_EXPR, delta20, delta21, 1), 1);
3177           e3 = build_binary_op (EQ_EXPR, pfn0, pfn1, 1);
3178           e2 = build_binary_op (TRUTH_ORIF_EXPR, e2, e3, 1);
3179           e2 = build_binary_op (TRUTH_ANDIF_EXPR, e1, e2, 1);
3180           if (code == EQ_EXPR)
3181             return e2;
3182           return build_binary_op (EQ_EXPR, e2, integer_zero_node, 1);
3183         }
3184       else if (TYPE_PTRMEMFUNC_P (type0)
3185                && TYPE_PTRMEMFUNC_FN_TYPE (type0) == type1)
3186         {
3187           tree index0 = build_component_ref (op0, index_identifier, 0, 0);
3188           tree index1;
3189           tree pfn0 = PFN_FROM_PTRMEMFUNC (op0);
3190           tree delta20 = DELTA2_FROM_PTRMEMFUNC (op0);
3191           tree delta21 = integer_zero_node;
3192           tree e1, e2, e3;
3193           tree integer_neg_one_node
3194             = size_binop (MINUS_EXPR, integer_zero_node, integer_one_node);
3195           if (TREE_CODE (TREE_OPERAND (op1, 0)) == FUNCTION_DECL
3196               && DECL_VINDEX (TREE_OPERAND (op1, 0)))
3197             {
3198               /* Map everything down one to make room for the null pointer to member.  */
3199               index1 = size_binop (PLUS_EXPR,
3200                                    DECL_VINDEX (TREE_OPERAND (op1, 0)),
3201                                    integer_one_node);
3202               op1 = integer_zero_node;
3203               delta21 = CLASSTYPE_VFIELD (TYPE_METHOD_BASETYPE (TREE_TYPE (type1)));
3204               delta21 = DECL_FIELD_BITPOS (delta21);
3205               delta21 = size_binop (FLOOR_DIV_EXPR, delta21, size_int (BITS_PER_UNIT));
3206             }
3207           else
3208             index1 = integer_neg_one_node;
3209           {
3210             tree nop1 = build1 (NOP_EXPR, TYPE_PTRMEMFUNC_FN_TYPE (type0), op1);
3211             TREE_CONSTANT (nop1) = TREE_CONSTANT (op1);
3212             op1 = nop1;
3213           }
3214           e1 = build_binary_op (EQ_EXPR, index0, index1, 1);
3215           e2 = build_binary_op (NE_EXPR, index1, integer_neg_one_node, 1);
3216           e2 = build_binary_op (TRUTH_ANDIF_EXPR, e2, build_binary_op (EQ_EXPR, delta20, delta21, 1), 1);
3217           e3 = build_binary_op (EQ_EXPR, pfn0, op1, 1);
3218           e2 = build_binary_op (TRUTH_ORIF_EXPR, e2, e3, 1);
3219           e2 = build_binary_op (TRUTH_ANDIF_EXPR, e1, e2, 1);
3220           if (code == EQ_EXPR)
3221             return e2;
3222           return build_binary_op (EQ_EXPR, e2, integer_zero_node, 1);
3223         }
3224       else if (TYPE_PTRMEMFUNC_P (type1)
3225                && TYPE_PTRMEMFUNC_FN_TYPE (type1) == type0)
3226         {
3227           return build_binary_op (code, op1, op0, 1);
3228         }
3229       else
3230         /* If args are not valid, clear out RESULT_TYPE
3231            to cause an error message later.  */
3232         result_type = 0;
3233       break;
3234
3235     case MAX_EXPR:
3236     case MIN_EXPR:
3237       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3238            && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3239         shorten = 1;
3240       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3241         {
3242           if (! comp_target_types (type0, type1, 1))
3243             cp_pedwarn ("comparison of distinct pointer types `%T' and `%T' lacks a cast",
3244                         type0, type1);
3245           else if ((TYPE_SIZE (TREE_TYPE (type0)) != 0)
3246                    != (TYPE_SIZE (TREE_TYPE (type1)) != 0))
3247             cp_pedwarn ("comparison of %scomplete and %scomplete pointers",
3248                         TYPE_SIZE (TREE_TYPE (type0)) == 0 ? "in" : "",
3249                         TYPE_SIZE (TREE_TYPE (type1)) == 0 ? "in" : "",
3250                         type0, type1);
3251           else if (pedantic
3252                    && TREE_CODE (TREE_TYPE (type0)) == FUNCTION_TYPE)
3253             pedwarn ("ANSI C++ forbids ordered comparisons of pointers to functions");
3254           result_type = common_type (type0, type1);
3255         }
3256       break;
3257
3258     case LE_EXPR:
3259     case GE_EXPR:
3260     case LT_EXPR:
3261     case GT_EXPR:
3262       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3263            && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3264         short_compare = 1;
3265       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3266         {
3267           if (! comp_target_types (type0, type1, 1))
3268             cp_pedwarn ("comparison of distinct pointer types `%T' and `%T' lacks a cast",
3269                         type0, type1);
3270           else if ((TYPE_SIZE (TREE_TYPE (type0)) != 0)
3271                    != (TYPE_SIZE (TREE_TYPE (type1)) != 0))
3272             cp_pedwarn ("comparison of %scomplete and %scomplete pointers",
3273                         TYPE_SIZE (TREE_TYPE (type0)) == 0 ? "in" : "",
3274                         TYPE_SIZE (TREE_TYPE (type1)) == 0 ? "in" : "",
3275                         type0, type1);
3276           else if (pedantic 
3277                    && TREE_CODE (TREE_TYPE (type0)) == FUNCTION_TYPE)
3278             pedwarn ("ANSI C++ forbids ordered comparisons of pointers to functions");
3279         }
3280       else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
3281                && integer_zerop (op1))
3282         {
3283           op1 = null_pointer_node;
3284           if (pedantic)
3285             pedwarn ("ordered comparison of pointer with integer zero");
3286         }
3287       else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
3288                && integer_zerop (op0))
3289         {
3290           op0 = null_pointer_node;
3291           if (pedantic)
3292             pedwarn ("ANSI C++ forbids ordered comparison of pointer with integer zero");
3293         }
3294       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3295         {
3296           if (pedantic)
3297             pedwarn ("ANSI C++ forbids comparison between pointer and integer");
3298           else if (! flag_traditional)
3299             warning ("comparison between pointer and integer");
3300           op1 = convert (TREE_TYPE (op0), op1);
3301         }
3302       else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
3303         {
3304           if (pedantic)
3305             pedwarn ("ANSI C++ forbids comparison between pointer and integer");
3306           else if (! flag_traditional)
3307             warning ("comparison between pointer and integer");
3308           op0 = convert (TREE_TYPE (op1), op0);
3309         }
3310       result_type = bool_type_node;
3311       converted = 1;
3312       break;
3313     }
3314
3315   if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3316       && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3317     {
3318       if (shorten || common || short_compare)
3319         result_type = common_type (type0, type1);
3320
3321       /* For certain operations (which identify themselves by shorten != 0)
3322          if both args were extended from the same smaller type,
3323          do the arithmetic in that type and then extend.
3324
3325          shorten !=0 and !=1 indicates a bitwise operation.
3326          For them, this optimization is safe only if
3327          both args are zero-extended or both are sign-extended.
3328          Otherwise, we might change the result.
3329          Eg, (short)-1 | (unsigned short)-1 is (int)-1
3330          but calculated in (unsigned short) it would be (unsigned short)-1.  */
3331
3332       if (shorten)
3333         {
3334           int unsigned0, unsigned1;
3335           tree arg0 = get_narrower (op0, &unsigned0);
3336           tree arg1 = get_narrower (op1, &unsigned1);
3337           /* UNS is 1 if the operation to be done is an unsigned one.  */
3338           int uns = TREE_UNSIGNED (result_type);
3339           tree type;
3340
3341           final_type = result_type;
3342
3343           /* Handle the case that OP0 does not *contain* a conversion
3344              but it *requires* conversion to FINAL_TYPE.  */
3345
3346           if (op0 == arg0 && TREE_TYPE (op0) != final_type)
3347             unsigned0 = TREE_UNSIGNED (TREE_TYPE (op0));
3348           if (op1 == arg1 && TREE_TYPE (op1) != final_type)
3349             unsigned1 = TREE_UNSIGNED (TREE_TYPE (op1));
3350
3351           /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE.  */
3352
3353           /* For bitwise operations, signedness of nominal type
3354              does not matter.  Consider only how operands were extended.  */
3355           if (shorten == -1)
3356             uns = unsigned0;
3357
3358           /* Note that in all three cases below we refrain from optimizing
3359              an unsigned operation on sign-extended args.
3360              That would not be valid.  */
3361
3362           /* Both args variable: if both extended in same way
3363              from same width, do it in that width.
3364              Do it unsigned if args were zero-extended.  */
3365           if ((TYPE_PRECISION (TREE_TYPE (arg0))
3366                < TYPE_PRECISION (result_type))
3367               && (TYPE_PRECISION (TREE_TYPE (arg1))
3368                   == TYPE_PRECISION (TREE_TYPE (arg0)))
3369               && unsigned0 == unsigned1
3370               && (unsigned0 || !uns))
3371             result_type
3372               = signed_or_unsigned_type (unsigned0,
3373                                          common_type (TREE_TYPE (arg0), TREE_TYPE (arg1)));
3374           else if (TREE_CODE (arg0) == INTEGER_CST
3375                    && (unsigned1 || !uns)
3376                    && (TYPE_PRECISION (TREE_TYPE (arg1))
3377                        < TYPE_PRECISION (result_type))
3378                    && (type = signed_or_unsigned_type (unsigned1,
3379                                                        TREE_TYPE (arg1)),
3380                        int_fits_type_p (arg0, type)))
3381             result_type = type;
3382           else if (TREE_CODE (arg1) == INTEGER_CST
3383                    && (unsigned0 || !uns)
3384                    && (TYPE_PRECISION (TREE_TYPE (arg0))
3385                        < TYPE_PRECISION (result_type))
3386                    && (type = signed_or_unsigned_type (unsigned0,
3387                                                        TREE_TYPE (arg0)),
3388                        int_fits_type_p (arg1, type)))
3389             result_type = type;
3390         }
3391
3392       /* Shifts can be shortened if shifting right.  */
3393
3394       if (short_shift)
3395         {
3396           int unsigned_arg;
3397           tree arg0 = get_narrower (op0, &unsigned_arg);
3398
3399           final_type = result_type;
3400
3401           if (arg0 == op0 && final_type == TREE_TYPE (op0))
3402             unsigned_arg = TREE_UNSIGNED (TREE_TYPE (op0));
3403
3404           if (TYPE_PRECISION (TREE_TYPE (arg0)) < TYPE_PRECISION (result_type)
3405               /* If arg is sign-extended and then unsigned-shifted,
3406                  we can simulate this with a signed shift in arg's type
3407                  only if the extended result is at least twice as wide
3408                  as the arg.  Otherwise, the shift could use up all the
3409                  ones made by sign-extension and bring in zeros.
3410                  We can't optimize that case at all, but in most machines
3411                  it never happens because available widths are 2**N.  */
3412               && (!TREE_UNSIGNED (final_type)
3413                   || unsigned_arg
3414                   || ((unsigned) 2 * TYPE_PRECISION (TREE_TYPE (arg0))
3415                       <= TYPE_PRECISION (result_type))))
3416             {
3417               /* Do an unsigned shift if the operand was zero-extended.  */
3418               result_type
3419                 = signed_or_unsigned_type (unsigned_arg,
3420                                            TREE_TYPE (arg0));
3421               /* Convert value-to-be-shifted to that type.  */
3422               if (TREE_TYPE (op0) != result_type)
3423                 op0 = convert (result_type, op0);
3424               converted = 1;
3425             }
3426         }
3427
3428       /* Comparison operations are shortened too but differently.
3429          They identify themselves by setting short_compare = 1.  */
3430
3431       if (short_compare)
3432         {
3433           /* Don't write &op0, etc., because that would prevent op0
3434              from being kept in a register.
3435              Instead, make copies of the our local variables and
3436              pass the copies by reference, then copy them back afterward.  */
3437           tree xop0 = op0, xop1 = op1, xresult_type = result_type;
3438           enum tree_code xresultcode = resultcode;
3439           tree val 
3440             = shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
3441           if (val != 0)
3442             return convert (bool_type_node, val);
3443           op0 = xop0, op1 = xop1, result_type = bool_type_node;
3444           resultcode = xresultcode;
3445         }
3446
3447       if (short_compare && extra_warnings)
3448         {
3449           int unsignedp0, unsignedp1;
3450           tree primop0 = get_narrower (op0, &unsignedp0);
3451           tree primop1 = get_narrower (op1, &unsignedp1);
3452
3453           /* Warn if signed and unsigned are being compared in a size larger
3454              than their original size, as this will always fail.  */
3455
3456           if (unsignedp0 != unsignedp1
3457               && (TYPE_PRECISION (TREE_TYPE (primop0))
3458                   < TYPE_PRECISION (result_type))
3459               && (TYPE_PRECISION (TREE_TYPE (primop1))
3460                   < TYPE_PRECISION (result_type)))
3461             warning ("comparison between promoted unsigned and signed");
3462
3463           /* Warn if two unsigned values are being compared in a size
3464              larger than their original size, and one (and only one) is the
3465              result of a `~' operator.  This comparison will always fail.
3466
3467              Also warn if one operand is a constant, and the constant does not
3468              have all bits set that are set in the ~ operand when it is
3469              extended.  */
3470
3471           else if (TREE_CODE (primop0) == BIT_NOT_EXPR
3472                    ^ TREE_CODE (primop1) == BIT_NOT_EXPR)
3473             {
3474               if (TREE_CODE (primop0) == BIT_NOT_EXPR)
3475                 primop0 = get_narrower (TREE_OPERAND (op0, 0), &unsignedp0);
3476               if (TREE_CODE (primop1) == BIT_NOT_EXPR)
3477                 primop1 = get_narrower (TREE_OPERAND (op1, 0), &unsignedp1);
3478               
3479               if (TREE_CODE (primop0) == INTEGER_CST
3480                   || TREE_CODE (primop1) == INTEGER_CST)
3481                 {
3482                   tree primop;
3483                   HOST_WIDE_INT constant, mask;
3484                   int unsignedp;
3485                   unsigned bits;
3486
3487                   if (TREE_CODE (primop0) == INTEGER_CST)
3488                     {
3489                       primop = primop1;
3490                       unsignedp = unsignedp1;
3491                       constant = TREE_INT_CST_LOW (primop0);
3492                     }
3493                   else
3494                     {
3495                       primop = primop0;
3496                       unsignedp = unsignedp0;
3497                       constant = TREE_INT_CST_LOW (primop1);
3498                     }
3499
3500                   bits = TYPE_PRECISION (TREE_TYPE (primop));
3501                   if (bits < TYPE_PRECISION (result_type)
3502                       && bits < HOST_BITS_PER_LONG && unsignedp)
3503                     {
3504                       mask = (~ (HOST_WIDE_INT) 0) << bits;
3505                       if ((mask & constant) != mask)
3506                         warning ("comparison of promoted ~unsigned with constant");
3507                     }
3508                 }
3509               else if (unsignedp0 && unsignedp1
3510                        && (TYPE_PRECISION (TREE_TYPE (primop0))
3511                            < TYPE_PRECISION (result_type))
3512                        && (TYPE_PRECISION (TREE_TYPE (primop1))
3513                            < TYPE_PRECISION (result_type)))
3514                 warning ("comparison of promoted ~unsigned with unsigned");
3515             }
3516         }
3517     }
3518
3519   /* At this point, RESULT_TYPE must be nonzero to avoid an error message.
3520      If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
3521      Then the expression will be built.
3522      It will be given type FINAL_TYPE if that is nonzero;
3523      otherwise, it will be given type RESULT_TYPE.  */
3524
3525   if (!result_type)
3526     {
3527       binary_op_error (error_code);
3528       return error_mark_node;
3529     }
3530
3531   if (! converted)
3532     {
3533       if (TREE_TYPE (op0) != result_type)
3534         op0 = convert (result_type, op0); 
3535       if (TREE_TYPE (op1) != result_type)
3536         op1 = convert (result_type, op1); 
3537     }
3538
3539   {
3540     register tree result = build (resultcode, result_type, op0, op1);
3541     register tree folded;
3542
3543     folded = fold (result);
3544     if (folded == result)
3545       TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
3546     if (final_type != 0)
3547       return convert (final_type, folded);
3548     return folded;
3549   }
3550 }
3551 \f
3552 /* Return a tree for the sum or difference (RESULTCODE says which)
3553    of pointer PTROP and integer INTOP.  */
3554
3555 static tree
3556 pointer_int_sum (resultcode, ptrop, intop)
3557      enum tree_code resultcode;
3558      register tree ptrop, intop;
3559 {
3560   tree size_exp;
3561
3562   register tree result;
3563   register tree folded = fold (intop);
3564
3565   /* The result is a pointer of the same type that is being added.  */
3566
3567   register tree result_type = TREE_TYPE (ptrop);
3568
3569   if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
3570     {
3571       if (pedantic || warn_pointer_arith)
3572         pedwarn ("ANSI C++ forbids using pointer of type `void *' in arithmetic");
3573       size_exp = integer_one_node;
3574     }
3575   else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
3576     {
3577       if (pedantic || warn_pointer_arith)
3578         pedwarn ("ANSI C++ forbids using pointer to a function in arithmetic");
3579       size_exp = integer_one_node;
3580     }
3581   else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
3582     {
3583       if (pedantic || warn_pointer_arith)
3584         pedwarn ("ANSI C++ forbids using pointer to a method in arithmetic");
3585       size_exp = integer_one_node;
3586     }
3587   else if (TREE_CODE (TREE_TYPE (result_type)) == OFFSET_TYPE)
3588     {
3589       if (pedantic)
3590         pedwarn ("ANSI C++ forbids using pointer to a member in arithmetic");
3591       size_exp = integer_one_node;
3592     }
3593   else
3594     size_exp = size_in_bytes (TREE_TYPE (result_type));
3595
3596   /* Needed to make OOPS V2R3 work.  */
3597   intop = folded;
3598   if (TREE_CODE (intop) == INTEGER_CST
3599       && TREE_INT_CST_LOW (intop) == 0
3600       && TREE_INT_CST_HIGH (intop) == 0)
3601     return ptrop;
3602
3603   /* If what we are about to multiply by the size of the elements
3604      contains a constant term, apply distributive law
3605      and multiply that constant term separately.
3606      This helps produce common subexpressions.  */
3607
3608   if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
3609       && ! TREE_CONSTANT (intop)
3610       && TREE_CONSTANT (TREE_OPERAND (intop, 1))
3611       && TREE_CONSTANT (size_exp))
3612     {
3613       enum tree_code subcode = resultcode;
3614       if (TREE_CODE (intop) == MINUS_EXPR)
3615         subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
3616       ptrop = build_binary_op (subcode, ptrop, TREE_OPERAND (intop, 1), 1);
3617       intop = TREE_OPERAND (intop, 0);
3618     }
3619
3620   /* Convert the integer argument to a type the same size as a pointer
3621      so the multiply won't overflow spuriously.  */
3622
3623   if (TYPE_PRECISION (TREE_TYPE (intop)) != POINTER_SIZE)
3624     intop = convert (type_for_size (POINTER_SIZE, 0), intop);
3625
3626   /* Replace the integer argument with a suitable product by the object size.
3627      Do this multiplication as signed, then convert to the appropriate
3628      pointer type (actually unsigned integral).  */
3629
3630   intop = convert (result_type,
3631                    build_binary_op (MULT_EXPR, intop,
3632                                     convert (TREE_TYPE (intop), size_exp), 1));
3633
3634   /* Create the sum or difference.  */
3635
3636   result = build (resultcode, result_type, ptrop, intop);
3637
3638   folded = fold (result);
3639   if (folded == result)
3640     TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop);
3641   return folded;
3642 }
3643
3644 /* Return a tree for the difference of pointers OP0 and OP1.
3645    The resulting tree has type int.  */
3646
3647 static tree
3648 pointer_diff (op0, op1)
3649      register tree op0, op1;
3650 {
3651   register tree result, folded;
3652   tree restype = ptrdiff_type_node;
3653   tree target_type = TREE_TYPE (TREE_TYPE (op0));
3654
3655   if (pedantic)
3656     {
3657       if (TREE_CODE (target_type) == VOID_TYPE)
3658         pedwarn ("ANSI C++ forbids using pointer of type `void *' in subtraction");
3659       if (TREE_CODE (target_type) == FUNCTION_TYPE)
3660         pedwarn ("ANSI C++ forbids using pointer to a function in subtraction");
3661       if (TREE_CODE (target_type) == METHOD_TYPE)
3662         pedwarn ("ANSI C++ forbids using pointer to a method in subtraction");
3663       if (TREE_CODE (target_type) == OFFSET_TYPE)
3664         pedwarn ("ANSI C++ forbids using pointer to a member in subtraction");
3665     }
3666
3667   /* First do the subtraction as integers;
3668      then drop through to build the divide operator.  */
3669
3670   op0 = build_binary_op (MINUS_EXPR,
3671                          convert (restype, op0), convert (restype, op1), 1);
3672
3673   /* This generates an error if op1 is a pointer to an incomplete type.  */
3674   if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (op1))) == 0)
3675     error ("arithmetic on pointer to an incomplete type");
3676
3677   op1 = ((TREE_CODE (target_type) == VOID_TYPE
3678           || TREE_CODE (target_type) == FUNCTION_TYPE
3679           || TREE_CODE (target_type) == METHOD_TYPE
3680           || TREE_CODE (target_type) == OFFSET_TYPE)
3681          ? integer_one_node
3682          : size_in_bytes (target_type));
3683
3684   /* Do the division.  */
3685
3686   result = build (EXACT_DIV_EXPR, restype, op0, convert (restype, op1));
3687
3688   folded = fold (result);
3689   if (folded == result)
3690     TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
3691   return folded;
3692 }
3693 \f
3694 /* Handle the case of taking the address of a COMPONENT_REF.
3695    Called by `build_unary_op' and `build_up_reference'.
3696
3697    ARG is the COMPONENT_REF whose address we want.
3698    ARGTYPE is the pointer type that this address should have.
3699    MSG is an error message to print if this COMPONENT_REF is not
3700    addressable (such as a bitfield).  */
3701
3702 tree
3703 build_component_addr (arg, argtype, msg)
3704      tree arg, argtype;
3705      char *msg;
3706 {
3707   tree field = TREE_OPERAND (arg, 1);
3708   tree basetype = decl_type_context (field);
3709   tree rval = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0);
3710
3711   if (DECL_BIT_FIELD (field))
3712     {
3713       error (msg, IDENTIFIER_POINTER (DECL_NAME (field)));
3714       return error_mark_node;
3715     }
3716
3717   if (flag_gc)
3718     cp_warning ("address of `%T::%D' taken", basetype, field);
3719
3720   if (TREE_CODE (field) == FIELD_DECL
3721       && TYPE_USES_COMPLEX_INHERITANCE (basetype))
3722     {
3723       /* Can't convert directly to ARGTYPE, since that
3724          may have the same pointer type as one of our
3725          baseclasses.  */
3726       rval = build1 (NOP_EXPR, argtype,
3727                      convert_pointer_to (basetype, rval));
3728       TREE_CONSTANT (rval) = TREE_CONSTANT (TREE_OPERAND (rval, 0));
3729     }
3730   else
3731     /* This conversion is harmless.  */
3732     rval = convert (argtype, rval);
3733
3734   if (! integer_zerop (DECL_FIELD_BITPOS (field)))
3735     {
3736       tree offset = size_binop (EASY_DIV_EXPR, DECL_FIELD_BITPOS (field),
3737                                 size_int (BITS_PER_UNIT));
3738       int flag = TREE_CONSTANT (rval);
3739       rval = fold (build (PLUS_EXPR, argtype,
3740                           rval, convert (argtype, offset)));
3741       TREE_CONSTANT (rval) = flag;
3742     }
3743   return rval;
3744 }
3745    
3746 /* Construct and perhaps optimize a tree representation
3747    for a unary operation.  CODE, a tree_code, specifies the operation
3748    and XARG is the operand.  */
3749
3750 tree
3751 build_x_unary_op (code, xarg)
3752      enum tree_code code;
3753      tree xarg;
3754 {
3755   /* & rec, on incomplete RECORD_TYPEs is the simple opr &, not an
3756      error message. */
3757   if (code != ADDR_EXPR || TREE_CODE (TREE_TYPE (xarg)) != RECORD_TYPE
3758       || TYPE_SIZE (TREE_TYPE (xarg)))
3759     {
3760       tree rval = build_opfncall (code, LOOKUP_SPECULATIVELY, xarg,
3761                                   NULL_TREE, NULL_TREE);
3762       if (rval)
3763         return build_opfncall (code, LOOKUP_NORMAL, xarg,
3764                                NULL_TREE, NULL_TREE);
3765     }
3766   return build_unary_op (code, xarg, 0);
3767 }
3768
3769 /* Just like truthvalue_conversion, but we want a BOOLEAN_TYPE */
3770 tree
3771 bool_truthvalue_conversion (expr)
3772      tree expr;
3773 {
3774   /* We really want to preform the optimizations in truthvalue_conversion
3775      but, not this way. */
3776   /* expr = truthvalue_conversion (expr); */
3777   return convert (bool_type_node, expr);
3778 }
3779
3780 /* C++: Must handle pointers to members.
3781
3782    Perhaps type instantiation should be extended to handle conversion
3783    from aggregates to types we don't yet know we want?  (Or are those
3784    cases typically errors which should be reported?)
3785
3786    NOCONVERT nonzero suppresses the default promotions
3787    (such as from short to int).  */
3788 tree
3789 build_unary_op (code, xarg, noconvert)
3790      enum tree_code code;
3791      tree xarg;
3792      int noconvert;
3793 {
3794   /* No default_conversion here.  It causes trouble for ADDR_EXPR.  */
3795   register tree arg = xarg;
3796   register tree argtype = 0;
3797   register enum tree_code typecode = TREE_CODE (TREE_TYPE (arg));
3798   char *errstring = NULL;
3799   tree val;
3800   int isaggrtype;
3801
3802   if (typecode == ERROR_MARK)
3803     return error_mark_node;
3804
3805   if (typecode == REFERENCE_TYPE && code != ADDR_EXPR && ! noconvert)
3806     {
3807       arg = convert_from_reference (arg);
3808       typecode = TREE_CODE (TREE_TYPE (arg));
3809     }
3810
3811   if (typecode == ENUMERAL_TYPE)
3812     typecode = INTEGER_TYPE;
3813
3814   isaggrtype = IS_AGGR_TYPE_CODE (typecode);
3815
3816   switch (code)
3817     {
3818     case CONVERT_EXPR:
3819       /* This is used for unary plus, because a CONVERT_EXPR
3820          is enough to prevent anybody from looking inside for
3821          associativity, but won't generate any code.  */
3822       if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE))
3823         errstring = "wrong type argument to unary plus";
3824       else if (!noconvert)
3825         arg = default_conversion (arg);
3826       break;
3827
3828     case NEGATE_EXPR:
3829       if (isaggrtype)
3830         {
3831           if (!noconvert)
3832             arg = default_conversion (arg);
3833           else
3834             {
3835               cp_error ("type conversion for type `%T' not allowed",
3836                           TREE_TYPE (arg));
3837               return error_mark_node;
3838             }
3839           typecode = TREE_CODE (TREE_TYPE (arg));
3840           noconvert = 1;
3841         }
3842
3843       if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE))
3844         errstring = "wrong type argument to unary minus";
3845       else if (!noconvert)
3846         arg = default_conversion (arg);
3847       break;
3848
3849     case BIT_NOT_EXPR:
3850       if (isaggrtype)
3851         {
3852           if (!noconvert)
3853             arg = default_conversion (arg);
3854           else
3855             {
3856               cp_error ("type conversion for type `%T' not allowed",
3857                           TREE_TYPE (arg));
3858               return error_mark_node;
3859             }
3860           typecode = TREE_CODE (TREE_TYPE (arg));
3861           noconvert = 1;
3862         }
3863
3864       if (typecode != INTEGER_TYPE)
3865         errstring = "wrong type argument to bit-complement";
3866       else if (!noconvert)
3867         arg = default_conversion (arg);
3868       break;
3869
3870     case ABS_EXPR:
3871       if (isaggrtype)
3872         {
3873           if (!noconvert)
3874             arg = default_conversion (arg);
3875           else
3876             {
3877               cp_error ("type conversion for type `%T' not allowed",
3878                           TREE_TYPE (arg));
3879               return error_mark_node;
3880             }
3881           typecode = TREE_CODE (TREE_TYPE (arg));
3882           noconvert = 1;
3883         }
3884
3885       if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE))
3886         errstring = "wrong type argument to abs";
3887       else if (!noconvert)
3888         arg = default_conversion (arg);
3889       break;
3890
3891     case TRUTH_NOT_EXPR:
3892       arg = bool_truthvalue_conversion (arg);
3893       val = invert_truthvalue (arg);
3894       if (arg != error_mark_node)
3895         return val;
3896       errstring = "in argument to unary !";
3897       break;
3898
3899     case NOP_EXPR:
3900       break;
3901       
3902     case PREINCREMENT_EXPR:
3903     case POSTINCREMENT_EXPR:
3904     case PREDECREMENT_EXPR:
3905     case POSTDECREMENT_EXPR:
3906       /* Handle complex lvalues (when permitted)
3907          by reduction to simpler cases.  */
3908
3909       val = unary_complex_lvalue (code, arg);
3910       if (val != 0)
3911         return val;
3912
3913       /* Report invalid types.  */
3914
3915       if (isaggrtype)
3916         {
3917           arg = default_conversion (arg);
3918           typecode = TREE_CODE (TREE_TYPE (arg));
3919         }
3920
3921       if (typecode != POINTER_TYPE
3922           && typecode != INTEGER_TYPE && typecode != REAL_TYPE)
3923         {
3924           if (code == PREINCREMENT_EXPR)
3925             errstring ="no pre-increment operator for type";
3926           else if (code == POSTINCREMENT_EXPR)
3927             errstring ="no post-increment operator for type";
3928           else if (code == PREDECREMENT_EXPR)
3929             errstring ="no pre-decrement operator for type";
3930           else
3931             errstring ="no post-decrement operator for type";
3932           break;
3933         }
3934
3935       /* Report something read-only.  */
3936
3937       if (TYPE_READONLY (TREE_TYPE (arg))
3938           || TREE_READONLY (arg))
3939         readonly_error (arg, ((code == PREINCREMENT_EXPR
3940                                || code == POSTINCREMENT_EXPR)
3941                               ? "increment" : "decrement"),
3942                         0);
3943
3944       {
3945         register tree inc;
3946         tree result_type = TREE_TYPE (arg);
3947
3948         arg = get_unwidened (arg, 0);
3949         argtype = TREE_TYPE (arg);
3950
3951         /* ARM $5.2.5 last annotation says this should be forbidden.  */
3952         if (TREE_CODE (argtype) == ENUMERAL_TYPE)
3953           pedwarn ("ANSI C++ forbids %sing an enum",
3954                    (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
3955                    ? "increment" : "decrement");
3956             
3957         /* Compute the increment.  */
3958
3959         if (typecode == POINTER_TYPE)
3960           {
3961             enum tree_code tmp = TREE_CODE (TREE_TYPE (argtype));
3962             if (TYPE_SIZE (TREE_TYPE (argtype)) == 0)
3963               cp_error ("cannot %s a pointer to incomplete type `%T'",
3964                         ((code == PREINCREMENT_EXPR
3965                           || code == POSTINCREMENT_EXPR)
3966                          ? "increment" : "decrement"), TREE_TYPE (argtype));
3967             else if (tmp == FUNCTION_TYPE || tmp == METHOD_TYPE
3968                      || tmp == VOID_TYPE || tmp == OFFSET_TYPE)
3969               cp_pedwarn ("ANSI C++ forbids %sing a pointer of type `%T'",
3970                           ((code == PREINCREMENT_EXPR
3971                             || code == POSTINCREMENT_EXPR)
3972                            ? "increment" : "decrement"), argtype);
3973             inc = c_sizeof_nowarn (TREE_TYPE (argtype));
3974           }
3975         else
3976           inc = integer_one_node;
3977
3978         inc = convert (argtype, inc);
3979
3980         /* Handle incrementing a cast-expression.  */
3981
3982         switch (TREE_CODE (arg))
3983           {
3984           case NOP_EXPR:
3985           case CONVERT_EXPR:
3986           case FLOAT_EXPR:
3987           case FIX_TRUNC_EXPR:
3988           case FIX_FLOOR_EXPR:
3989           case FIX_ROUND_EXPR:
3990           case FIX_CEIL_EXPR:
3991             {
3992               tree incremented, modify, value;
3993               if (! lvalue_p (arg) && pedantic)
3994                 pedwarn ("cast to non-reference type used as lvalue");
3995               arg = stabilize_reference (arg);
3996               if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
3997                 value = arg;
3998               else
3999                 value = save_expr (arg);
4000               incremented = build (((code == PREINCREMENT_EXPR
4001                                      || code == POSTINCREMENT_EXPR)
4002                                     ? PLUS_EXPR : MINUS_EXPR),
4003                                    argtype, value, inc);
4004               TREE_SIDE_EFFECTS (incremented) = 1;
4005               modify = build_modify_expr (arg, NOP_EXPR, incremented);
4006               return build (COMPOUND_EXPR, TREE_TYPE (arg), modify, value);
4007             }
4008           }
4009
4010         if (TREE_CODE (arg) == OFFSET_REF)
4011           arg = resolve_offset_ref (arg);
4012
4013         /* Complain about anything else that is not a true lvalue.  */
4014         if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
4015                                     || code == POSTINCREMENT_EXPR)
4016                                    ? "increment" : "decrement")))
4017           return error_mark_node;
4018
4019         val = build (code, TREE_TYPE (arg), arg, inc);
4020         TREE_SIDE_EFFECTS (val) = 1;
4021         return convert (result_type, val);
4022       }
4023
4024     case ADDR_EXPR:
4025       /* Note that this operation never does default_conversion
4026          regardless of NOCONVERT.  */
4027
4028       if (typecode == REFERENCE_TYPE)
4029         {
4030           arg = build1 (CONVERT_EXPR, build_pointer_type (TREE_TYPE (TREE_TYPE (arg))), arg);
4031           TREE_REFERENCE_EXPR (arg) = 1;
4032           return arg;
4033         }
4034       else if (pedantic
4035                && TREE_CODE (arg) == FUNCTION_DECL
4036                && DECL_NAME (arg)
4037                && DECL_CONTEXT (arg) == NULL_TREE
4038                && IDENTIFIER_LENGTH (DECL_NAME (arg)) == 4
4039                && IDENTIFIER_POINTER (DECL_NAME (arg))[0] == 'm'
4040                && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (arg)), "main"))
4041         /* ARM $3.4 */
4042         pedwarn ("taking address of function `main'");
4043
4044       /* Let &* cancel out to simplify resulting code.  */
4045       if (TREE_CODE (arg) == INDIRECT_REF)
4046         {
4047           /* We don't need to have `current_class_decl' wrapped in a
4048              NON_LVALUE_EXPR node.  */
4049           if (arg == C_C_D)
4050             return current_class_decl;
4051
4052           /* Keep `default_conversion' from converting if
4053              ARG is of REFERENCE_TYPE.  */
4054           arg = TREE_OPERAND (arg, 0);
4055           if (TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE)
4056             {
4057               if (TREE_CODE (arg) == VAR_DECL && DECL_INITIAL (arg)
4058                   && !TREE_SIDE_EFFECTS (DECL_INITIAL (arg)))
4059                 arg = DECL_INITIAL (arg);
4060               arg = build1 (CONVERT_EXPR, build_pointer_type (TREE_TYPE (TREE_TYPE (arg))), arg);
4061               TREE_REFERENCE_EXPR (arg) = 1;
4062               TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
4063             }
4064           else if (lvalue_p (arg))
4065             /* Don't let this be an lvalue.  */
4066             return non_lvalue (arg);
4067           return arg;
4068         }
4069
4070       /* For &x[y], return x+y */
4071       if (TREE_CODE (arg) == ARRAY_REF)
4072         {
4073           if (mark_addressable (TREE_OPERAND (arg, 0)) == 0)
4074             return error_mark_node;
4075           return build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0),
4076                                   TREE_OPERAND (arg, 1), 1);
4077         }
4078
4079       /* For &(++foo), we are really taking the address of the variable
4080          being acted upon by the increment/decrement operator.  ARM $5.3.1
4081          However, according to ARM $5.2.5, we don't allow postfix ++ and
4082          --, since the prefix operators return lvalues, but the postfix
4083          operators do not.  */
4084       if (TREE_CODE (arg) == PREINCREMENT_EXPR
4085           || TREE_CODE (arg) == PREDECREMENT_EXPR)
4086         arg = TREE_OPERAND (arg, 0);
4087
4088       /* Uninstantiated types are all functions.  Taking the
4089          address of a function is a no-op, so just return the
4090          argument.  */
4091
4092       if (TREE_CODE (arg) == IDENTIFIER_NODE
4093           && IDENTIFIER_OPNAME_P (arg))
4094         {
4095           my_friendly_abort (117);
4096           /* We don't know the type yet, so just work around the problem.
4097              We know that this will resolve to an lvalue.  */
4098           return build1 (ADDR_EXPR, unknown_type_node, arg);
4099         }
4100
4101       if (TREE_CODE (arg) == TREE_LIST)
4102         {
4103           /* Look at methods with only this name.  */
4104           if (TREE_CODE (TREE_VALUE (arg)) == FUNCTION_DECL)
4105             {
4106               tree targ = TREE_VALUE (arg);
4107
4108               /* If this function is unique, or it is a unique
4109                  constructor, we can take its address easily.  */
4110               if (DECL_CHAIN (targ) == NULL_TREE
4111                   || (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (targ))
4112                       && DECL_CHAIN (DECL_CHAIN (targ)) == NULL_TREE))
4113                 {
4114                   if (DECL_CHAIN (targ))
4115                     targ = DECL_CHAIN (targ);
4116                   if (DECL_CLASS_CONTEXT (targ))
4117                     targ = build (OFFSET_REF, TREE_TYPE (targ), C_C_D, targ);
4118
4119                   val = unary_complex_lvalue (ADDR_EXPR, targ);
4120                   if (val)
4121                     return val;
4122                 }
4123
4124               /* This possible setting of TREE_CONSTANT is what makes it possible
4125                  with an initializer list to emit the entire thing in the data
4126                  section, rather than a run-time initialization.  */
4127               arg = build1 (ADDR_EXPR, unknown_type_node, arg);
4128               if (staticp (targ))
4129                 TREE_CONSTANT (arg) = 1;
4130               return arg;
4131             }
4132           if (TREE_CHAIN (arg) == NULL_TREE
4133               && TREE_CODE (TREE_VALUE (arg)) == TREE_LIST
4134               && DECL_CHAIN (TREE_VALUE (TREE_VALUE (arg))) == NULL_TREE)
4135             {
4136               /* Unique overloaded member function.  */
4137               return build_unary_op (ADDR_EXPR, TREE_VALUE (TREE_VALUE (arg)), 0);
4138             }
4139           return build1 (ADDR_EXPR, unknown_type_node, arg);
4140         }
4141
4142       /* Handle complex lvalues (when permitted)
4143          by reduction to simpler cases.  */
4144       val = unary_complex_lvalue (code, arg);
4145       if (val != 0)
4146         return val;
4147
4148       switch (TREE_CODE (arg))
4149         {
4150         case NOP_EXPR:
4151         case CONVERT_EXPR:
4152         case FLOAT_EXPR:
4153         case FIX_TRUNC_EXPR:
4154         case FIX_FLOOR_EXPR:
4155         case FIX_ROUND_EXPR:
4156         case FIX_CEIL_EXPR:
4157           if (! lvalue_p (arg) && pedantic)
4158             pedwarn ("taking the address of a cast to non-reference type");
4159         }
4160
4161       /* Allow the address of a constructor if all the elements
4162          are constant.  */
4163       if (TREE_CODE (arg) == CONSTRUCTOR && TREE_CONSTANT (arg))
4164         ;
4165       /* Anything not already handled and not a true memory reference
4166          is an error.  */
4167       else if (typecode != FUNCTION_TYPE
4168                && typecode != METHOD_TYPE
4169                && !lvalue_or_else (arg, "unary `&'"))
4170         return error_mark_node;
4171
4172       /* Ordinary case; arg is a COMPONENT_REF or a decl.  */
4173       argtype = TREE_TYPE (arg);
4174       /* If the lvalue is const or volatile,
4175          merge that into the type that the address will point to.  */
4176       if (TREE_CODE_CLASS (TREE_CODE (arg)) == 'd'
4177           || TREE_CODE_CLASS (TREE_CODE (arg)) == 'r')
4178         {
4179           if (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg))
4180             argtype = build_type_variant (argtype,
4181                                           TREE_READONLY (arg),
4182                                           TREE_THIS_VOLATILE (arg));
4183         }
4184
4185       argtype = build_pointer_type (argtype);
4186
4187       if (mark_addressable (arg) == 0)
4188         return error_mark_node;
4189
4190       {
4191         tree addr;
4192
4193         if (TREE_CODE (arg) == COMPONENT_REF)
4194           addr = build_component_addr (arg, argtype,
4195                                        "attempt to take address of bit-field structure member `%s'");
4196         else
4197           addr = build1 (code, argtype, arg);
4198
4199         /* Address of a static or external variable or
4200            function counts as a constant */
4201         if (staticp (arg))
4202           TREE_CONSTANT (addr) = 1;
4203         return addr;
4204       }
4205     }
4206
4207   if (!errstring)
4208     {
4209       if (argtype == 0)
4210         argtype = TREE_TYPE (arg);
4211       return fold (build1 (code, argtype, arg));
4212     }
4213
4214   error (errstring);
4215   return error_mark_node;
4216 }
4217
4218 /* If CONVERSIONS is a conversion expression or a nested sequence of such,
4219    convert ARG with the same conversions in the same order
4220    and return the result.  */
4221
4222 static tree
4223 convert_sequence (conversions, arg)
4224      tree conversions;
4225      tree arg;
4226 {
4227   switch (TREE_CODE (conversions))
4228     {
4229     case NOP_EXPR:
4230     case CONVERT_EXPR:
4231     case FLOAT_EXPR:
4232     case FIX_TRUNC_EXPR:
4233     case FIX_FLOOR_EXPR:
4234     case FIX_ROUND_EXPR:
4235     case FIX_CEIL_EXPR:
4236       return convert (TREE_TYPE (conversions),
4237                       convert_sequence (TREE_OPERAND (conversions, 0),
4238                                         arg));
4239
4240     default:
4241       return arg;
4242     }
4243 }
4244
4245 /* Apply unary lvalue-demanding operator CODE to the expression ARG
4246    for certain kinds of expressions which are not really lvalues
4247    but which we can accept as lvalues.
4248
4249    If ARG is not a kind of expression we can handle, return zero.  */
4250    
4251 tree
4252 unary_complex_lvalue (code, arg)
4253      enum tree_code code;
4254      tree arg;
4255 {
4256   /* Handle (a, b) used as an "lvalue".  */
4257   if (TREE_CODE (arg) == COMPOUND_EXPR)
4258     {
4259       tree real_result = build_unary_op (code, TREE_OPERAND (arg, 1), 0);
4260       return build (COMPOUND_EXPR, TREE_TYPE (real_result),
4261                     TREE_OPERAND (arg, 0), real_result);
4262     }
4263
4264   /* Handle (a ? b : c) used as an "lvalue".  */
4265   if (TREE_CODE (arg) == COND_EXPR)
4266     return rationalize_conditional_expr (code, arg);
4267
4268   if (TREE_CODE (arg) == MODIFY_EXPR)
4269     return unary_complex_lvalue
4270       (code, build (COMPOUND_EXPR, TREE_TYPE (TREE_OPERAND (arg, 0)),
4271                     arg, TREE_OPERAND (arg, 0)));
4272
4273   if (code != ADDR_EXPR)
4274     return 0;
4275
4276   /* Handle (a = b) used as an "lvalue" for `&'.  */
4277   if (TREE_CODE (arg) == MODIFY_EXPR
4278       || TREE_CODE (arg) == INIT_EXPR)
4279     {
4280       tree real_result = build_unary_op (code, TREE_OPERAND (arg, 0), 0);
4281       return build (COMPOUND_EXPR, TREE_TYPE (real_result), arg, real_result);
4282     }
4283
4284   if (TREE_CODE (arg) == WITH_CLEANUP_EXPR)
4285     {
4286       tree real_result = build_unary_op (code, TREE_OPERAND (arg, 0), 0);
4287       real_result = build (WITH_CLEANUP_EXPR, TREE_TYPE (real_result),
4288                            real_result, 0, TREE_OPERAND (arg, 2));
4289       return real_result;
4290     }
4291
4292   if (TREE_CODE (TREE_TYPE (arg)) == FUNCTION_TYPE
4293       || TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
4294       || TREE_CODE (TREE_TYPE (arg)) == OFFSET_TYPE)
4295     {
4296       /* The representation of something of type OFFSET_TYPE
4297          is really the representation of a pointer to it.
4298          Here give the representation its true type.  */
4299       tree t;
4300       tree offset;
4301
4302       my_friendly_assert (TREE_CODE (arg) != SCOPE_REF, 313);
4303
4304       if (TREE_CODE (arg) != OFFSET_REF)
4305         return 0;
4306
4307       t = TREE_OPERAND (arg, 1);
4308
4309       if (TREE_CODE (t) == FUNCTION_DECL) /* Check all this code for right semantics. */
4310         return build_unary_op (ADDR_EXPR, t, 0);
4311       if (TREE_CODE (t) == VAR_DECL)
4312         return build_unary_op (ADDR_EXPR, t, 0);
4313       else
4314         {
4315           /* Can't build a pointer to member if the member must
4316              go through virtual base classes.  */
4317           if (virtual_member (DECL_FIELD_CONTEXT (t),
4318                               CLASSTYPE_VBASECLASSES (TREE_TYPE (TREE_OPERAND (arg, 0)))))
4319             {
4320               sorry ("pointer to member via virtual baseclass");
4321               return error_mark_node;
4322             }
4323
4324           if (TREE_OPERAND (arg, 0)
4325               && (TREE_CODE (TREE_OPERAND (arg, 0)) != NOP_EXPR
4326                   || TREE_OPERAND (TREE_OPERAND (arg, 0), 0) != error_mark_node))
4327             {
4328               /* Don't know if this should return address to just
4329                  _DECL, or actual address resolved in this expression.  */
4330               sorry ("address of bound pointer-to-member expression");
4331               return error_mark_node;
4332             }
4333
4334           return convert (build_pointer_type (TREE_TYPE (arg)),
4335                           size_binop (EASY_DIV_EXPR, 
4336                                       DECL_FIELD_BITPOS (t),
4337                                       size_int (BITS_PER_UNIT)));
4338         }
4339     }
4340
4341   if (TREE_CODE (arg) == OFFSET_REF)
4342     {
4343       tree left = TREE_OPERAND (arg, 0), left_addr;
4344       tree right_addr = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 1), 0);
4345
4346       if (left == 0)
4347         if (current_class_decl)
4348           left_addr = current_class_decl;
4349         else
4350           {
4351             error ("no `this' for pointer to member");
4352             return error_mark_node;
4353           }
4354       else
4355         left_addr = build_unary_op (ADDR_EXPR, left, 0);
4356
4357       return build (PLUS_EXPR, build_pointer_type (TREE_TYPE (arg)),
4358                     build1 (NOP_EXPR, integer_type_node, left_addr),
4359                     build1 (NOP_EXPR, integer_type_node, right_addr));
4360     }
4361
4362   /* We permit compiler to make function calls returning
4363      objects of aggregate type look like lvalues.  */
4364   {
4365     tree targ = arg;
4366
4367     if (TREE_CODE (targ) == SAVE_EXPR)
4368       targ = TREE_OPERAND (targ, 0);
4369
4370     if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (TREE_TYPE (targ)))
4371       {
4372         if (TREE_CODE (arg) == SAVE_EXPR)
4373           targ = arg;
4374         else
4375           targ = build_cplus_new (TREE_TYPE (arg), arg, 1);
4376         return build1 (ADDR_EXPR, TYPE_POINTER_TO (TREE_TYPE (arg)), targ);
4377       }
4378
4379     if (TREE_CODE (arg) == SAVE_EXPR && TREE_CODE (targ) == INDIRECT_REF)
4380       return build (SAVE_EXPR, TYPE_POINTER_TO (TREE_TYPE (arg)),
4381                      TREE_OPERAND (targ, 0), current_function_decl, NULL);
4382
4383     /* We shouldn't wrap WITH_CLEANUP_EXPRs inside of SAVE_EXPRs, but in case
4384        we do, here's how to handle it.  */
4385     if (TREE_CODE (arg) == SAVE_EXPR && TREE_CODE (targ) == WITH_CLEANUP_EXPR)
4386       {
4387 #if 0
4388         /* Not really a bug, but something to turn on when testing.  */
4389         compiler_error ("WITH_CLEANUP_EXPR wrapped in SAVE_EXPR");
4390 #endif
4391         return unary_complex_lvalue (ADDR_EXPR, targ);
4392       }
4393   }
4394
4395   /* Don't let anything else be handled specially.  */
4396   return 0;
4397 }
4398 \f
4399 /* Mark EXP saying that we need to be able to take the
4400    address of it; it should not be allocated in a register.
4401    Value is 1 if successful.
4402
4403    C++: we do not allow `current_class_decl' to be addressable.  */
4404
4405 int
4406 mark_addressable (exp)
4407      tree exp;
4408 {
4409   register tree x = exp;
4410
4411   if (TREE_ADDRESSABLE (x) == 1)
4412     return 1;
4413
4414   while (1)
4415     switch (TREE_CODE (x))
4416       {
4417       case ADDR_EXPR:
4418       case COMPONENT_REF:
4419       case ARRAY_REF:
4420         x = TREE_OPERAND (x, 0);
4421         break;
4422
4423       case PARM_DECL:
4424         if (x == current_class_decl)
4425           {
4426             error ("address of `this' not available");
4427             TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later */
4428             put_var_into_stack (x);
4429             return 1;
4430           }
4431       case VAR_DECL:
4432         if (TREE_STATIC (x)
4433             && TREE_READONLY (x)
4434             && DECL_RTL (x) != 0
4435             && ! decl_in_memory_p (x))
4436           {
4437             /* We thought this would make a good constant variable,
4438                but we were wrong.  */
4439             push_obstacks_nochange ();
4440             end_temporary_allocation ();
4441
4442             TREE_ASM_WRITTEN (x) = 0;
4443             DECL_RTL (x) = 0;
4444             rest_of_decl_compilation (x, 0, IDENTIFIER_LOCAL_VALUE (x) == 0, 0);
4445             TREE_ADDRESSABLE (x) = 1;
4446
4447             pop_obstacks ();
4448
4449             return 1;
4450           }
4451         /* Caller should not be trying to mark initialized
4452            constant fields addressable.  */
4453         my_friendly_assert (DECL_LANG_SPECIFIC (x) == 0
4454                             || DECL_IN_AGGR_P (x) == 0
4455                             || TREE_STATIC (x)
4456                             || DECL_EXTERNAL (x), 314);
4457
4458       case CONST_DECL:
4459       case RESULT_DECL:
4460         /* For C++, we don't warn about taking the address of a register
4461            variable for CONST_DECLs; ARM p97 explicitly says it's okay.  */
4462         put_var_into_stack (x);
4463         TREE_ADDRESSABLE (x) = 1;
4464         return 1;
4465
4466       case FUNCTION_DECL:
4467         /* We have to test both conditions here.  The first may
4468            be non-zero in the case of processing a default function.
4469            The second may be non-zero in the case of a template function.  */
4470         x = DECL_MAIN_VARIANT (x);
4471         if ((DECL_INLINE (x) || DECL_PENDING_INLINE_INFO (x))
4472             && (DECL_CONTEXT (x) == NULL_TREE
4473                 || TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (x))) != 't'
4474                 || ! CLASSTYPE_INTERFACE_ONLY (DECL_CONTEXT (x))))
4475           {
4476             mark_inline_for_output (x);
4477             if (x == current_function_decl)
4478               DECL_EXTERNAL (x) = 0;
4479           }
4480         TREE_ADDRESSABLE (x) = 1;
4481         TREE_USED (x) = 1;
4482         TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
4483         return 1;
4484
4485       default:
4486         return 1;
4487     }
4488 }
4489 \f
4490 /* Build and return a conditional expression IFEXP ? OP1 : OP2.  */
4491
4492 tree
4493 build_x_conditional_expr (ifexp, op1, op2)
4494      tree ifexp, op1, op2;
4495 {
4496   tree rval = NULL_TREE;
4497
4498   /* See comments in `build_x_binary_op'.  */
4499   if (op1 != 0)
4500     rval = build_opfncall (COND_EXPR, LOOKUP_SPECULATIVELY, ifexp, op1, op2);
4501   if (rval)
4502     return build_opfncall (COND_EXPR, LOOKUP_NORMAL, ifexp, op1, op2);
4503   
4504   return build_conditional_expr (ifexp, op1, op2);
4505 }
4506
4507 tree
4508 build_conditional_expr (ifexp, op1, op2)
4509      tree ifexp, op1, op2;
4510 {
4511   register tree type1;
4512   register tree type2;
4513   register enum tree_code code1;
4514   register enum tree_code code2;
4515   register tree result_type = NULL_TREE;
4516   tree orig_op1 = op1, orig_op2 = op2;
4517
4518   /* If second operand is omitted, it is the same as the first one;
4519      make sure it is calculated only once.  */
4520   if (op1 == 0)
4521     {
4522       if (pedantic)
4523         pedwarn ("ANSI C++ forbids omitting the middle term of a ?: expression");
4524       ifexp = op1 = save_expr (ifexp);
4525     }
4526
4527   ifexp = bool_truthvalue_conversion (default_conversion (ifexp));
4528
4529   if (TREE_CODE (ifexp) == ERROR_MARK)
4530     return error_mark_node;
4531
4532   op1 = require_instantiated_type (TREE_TYPE (op2), op1, error_mark_node);
4533   if (op1 == error_mark_node)
4534     return error_mark_node;
4535   op2 = require_instantiated_type (TREE_TYPE (op1), op2, error_mark_node);
4536   if (op2 == error_mark_node)
4537     return error_mark_node;
4538
4539   /* C++: REFERENCE_TYPES must be dereferenced.  */
4540   type1 = TREE_TYPE (op1);
4541   code1 = TREE_CODE (type1);
4542   type2 = TREE_TYPE (op2);
4543   code2 = TREE_CODE (type2);
4544
4545   if (code1 == REFERENCE_TYPE)
4546     {
4547       op1 = convert_from_reference (op1);
4548       type1 = TREE_TYPE (op1);
4549       code1 = TREE_CODE (type1);
4550     }
4551   if (code2 == REFERENCE_TYPE)
4552     {
4553       op2 = convert_from_reference (op2);
4554       type2 = TREE_TYPE (op2);
4555       code2 = TREE_CODE (type2);
4556     }
4557
4558 #if 1 /* Produces wrong result if within sizeof.  Sorry.  */
4559   /* Don't promote the operands separately if they promote
4560      the same way.  Return the unpromoted type and let the combined
4561      value get promoted if necessary.  */
4562
4563   if (TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2)
4564       && code2 != ARRAY_TYPE
4565 #if 0
4566       /* For C++, let the enumeral type come through.  */
4567       && code2 != ENUMERAL_TYPE
4568 #endif
4569       && code2 != FUNCTION_TYPE
4570       && code2 != METHOD_TYPE)
4571     {
4572       tree result;
4573
4574       if (TREE_CONSTANT (ifexp)
4575           && (TREE_CODE (ifexp) == INTEGER_CST
4576               || TREE_CODE (ifexp) == ADDR_EXPR))
4577         return (integer_zerop (ifexp) ? op2 : op1);
4578
4579       if (TREE_CODE (op1) == CONST_DECL)
4580         op1 = DECL_INITIAL (op1);
4581       else if (TREE_READONLY_DECL_P (op1))
4582         op1 = decl_constant_value (op1);
4583       if (TREE_CODE (op2) == CONST_DECL)
4584         op2 = DECL_INITIAL (op2);
4585       else if (TREE_READONLY_DECL_P (op2))
4586         op2 = decl_constant_value (op2);
4587       if (type1 != type2)
4588         type1 = build_type_variant
4589                         (type1,
4590                          TREE_READONLY (op1) || TREE_READONLY (op2),
4591                          TREE_THIS_VOLATILE (op1) || TREE_THIS_VOLATILE (op2));
4592       /* ??? This is a kludge to deal with the fact that
4593          we don't sort out integers and enums properly, yet.  */
4594       result = fold (build (COND_EXPR, type1, ifexp, op1, op2));
4595       if (TREE_TYPE (result) != type1)
4596         result = build1 (NOP_EXPR, type1, result);
4597       return result;
4598     }
4599 #endif
4600
4601   /* They don't match; promote them both and then try to reconcile them.
4602      But don't permit mismatching enum types.  */
4603   if (code1 == ENUMERAL_TYPE)
4604     {
4605       if (code2 == ENUMERAL_TYPE)
4606         {
4607           message_2_types (error, "enumeral mismatch in conditional expression: `%s' vs `%s'", type1, type2);
4608           return error_mark_node;
4609         }
4610       else if (extra_warnings && ! IS_AGGR_TYPE_CODE (code2))
4611         warning ("enumeral and non-enumeral type in conditional expression");
4612     }
4613   else if (extra_warnings
4614            && code2 == ENUMERAL_TYPE && ! IS_AGGR_TYPE_CODE (code1))
4615     warning ("enumeral and non-enumeral type in conditional expression");
4616
4617   if (code1 != VOID_TYPE)
4618     {
4619       op1 = default_conversion (op1);
4620       type1 = TREE_TYPE (op1);
4621       code1 = TREE_CODE (type1);
4622     }
4623   if (code2 != VOID_TYPE)
4624     {
4625       op2 = default_conversion (op2);
4626       type2 = TREE_TYPE (op2);
4627       code2 = TREE_CODE (type2);
4628     }
4629
4630   /* Quickly detect the usual case where op1 and op2 have the same type
4631      after promotion.  */
4632   if (TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2))
4633     {
4634       if (type1 == type2)
4635         result_type = type1;
4636       else
4637         result_type = build_type_variant
4638                         (type1,
4639                          TREE_READONLY (op1) || TREE_READONLY (op2),
4640                          TREE_THIS_VOLATILE (op1) || TREE_THIS_VOLATILE (op2));
4641     }
4642   else if ((code1 == INTEGER_TYPE || code1 == REAL_TYPE)
4643            && (code2 == INTEGER_TYPE || code2 == REAL_TYPE))
4644     {
4645       result_type = common_type (type1, type2);
4646     }
4647   else if (code1 == VOID_TYPE || code2 == VOID_TYPE)
4648     {
4649       if (pedantic && (code1 != VOID_TYPE || code2 != VOID_TYPE))
4650         pedwarn ("ANSI C++ forbids conditional expr with only one void side");
4651       result_type = void_type_node;
4652     }
4653   else if (code1 == POINTER_TYPE && code2 == POINTER_TYPE)
4654     {
4655       if (comp_target_types (type1, type2, 1))
4656         result_type = common_type (type1, type2);
4657       else if (integer_zerop (op1) && TREE_TYPE (type1) == void_type_node
4658                && TREE_CODE (orig_op1) != NOP_EXPR)
4659         result_type = qualify_type (type2, type1);
4660       else if (integer_zerop (op2) && TREE_TYPE (type2) == void_type_node
4661                && TREE_CODE (orig_op2) != NOP_EXPR)
4662         result_type = qualify_type (type1, type2);
4663       else if (TYPE_MAIN_VARIANT (TREE_TYPE (type1)) == void_type_node)
4664         {
4665           if (pedantic && TREE_CODE (type2) == FUNCTION_TYPE)
4666             pedwarn ("ANSI C++ forbids conditional expr between `void *' and function pointer");
4667           result_type = qualify_type (type1, type2);
4668         }
4669       else if (TYPE_MAIN_VARIANT (TREE_TYPE (type2)) == void_type_node)
4670         {
4671           if (pedantic && TREE_CODE (type1) == FUNCTION_TYPE)
4672             pedwarn ("ANSI C++ forbids conditional expr between `void *' and function pointer");
4673           result_type = qualify_type (type2, type1);
4674         }
4675       /* C++ */
4676       else if (comptypes (type2, type1, 0))
4677         result_type = type2;
4678       else if (IS_AGGR_TYPE (TREE_TYPE (type1))
4679                && IS_AGGR_TYPE (TREE_TYPE (type2))
4680                && (result_type = common_base_type (TREE_TYPE (type1), TREE_TYPE (type2))))
4681         {
4682           if (result_type == error_mark_node)
4683             {
4684               message_2_types (error, "common base type of types `%s' and `%s' is ambiguous",
4685                                TREE_TYPE (type1), TREE_TYPE (type2));
4686               result_type = ptr_type_node;
4687             }
4688           else result_type = TYPE_POINTER_TO (result_type);
4689         }
4690       else
4691         {
4692           pedwarn ("pointer type mismatch in conditional expression");
4693           result_type = ptr_type_node;
4694         }
4695     }
4696   else if (code1 == POINTER_TYPE && code2 == INTEGER_TYPE)
4697     {
4698       if (!integer_zerop (op2))
4699         pedwarn ("pointer/integer type mismatch in conditional expression");
4700       else
4701         {
4702           op2 = null_pointer_node;
4703 #if 0                           /* Sez who? */
4704           if (pedantic && TREE_CODE (type1) == FUNCTION_TYPE)
4705             pedwarn ("ANSI C++ forbids conditional expr between 0 and function pointer");
4706 #endif
4707         }
4708       result_type = type1;
4709     }
4710   else if (code2 == POINTER_TYPE && code1 == INTEGER_TYPE)
4711     {
4712       if (!integer_zerop (op1))
4713         pedwarn ("pointer/integer type mismatch in conditional expression");
4714       else
4715         {
4716           op1 = null_pointer_node;
4717 #if 0                           /* Sez who? */
4718           if (pedantic && TREE_CODE (type2) == FUNCTION_TYPE)
4719             pedwarn ("ANSI C++ forbids conditional expr between 0 and function pointer");
4720 #endif
4721         }
4722       result_type = type2;
4723     }
4724
4725   if (!result_type)
4726     {
4727       /* The match does not look good.  If either is
4728          an aggregate value, try converting to a scalar type.  */
4729       if (code1 == RECORD_TYPE && code2 == RECORD_TYPE)
4730         {
4731           message_2_types (error, "aggregate mismatch in conditional expression: `%s' vs `%s'", type1, type2);
4732           return error_mark_node;
4733         }
4734       if (code1 == RECORD_TYPE && TYPE_HAS_CONVERSION (type1))
4735         {
4736           tree tmp = build_type_conversion (CONVERT_EXPR, type2, op1, 0);
4737           if (tmp == NULL_TREE)
4738             {
4739               cp_error ("aggregate type `%T' could not convert on lhs of `:'", type1);
4740               return error_mark_node;
4741             }
4742           if (tmp == error_mark_node)
4743             error ("ambiguous pointer conversion");
4744           result_type = type2;
4745           op1 = tmp;
4746         }
4747       else if (code2 == RECORD_TYPE && TYPE_HAS_CONVERSION (type2))
4748         {
4749           tree tmp = build_type_conversion (CONVERT_EXPR, type1, op2, 0);
4750           if (tmp == NULL_TREE)
4751             {
4752               cp_error ("aggregate type `%T' could not convert on rhs of `:'", type2);
4753               return error_mark_node;
4754             }
4755           if (tmp == error_mark_node)
4756             error ("ambiguous pointer conversion");
4757           result_type = type1;
4758           op2 = tmp;
4759         }
4760       else if (flag_cond_mismatch)
4761         result_type = void_type_node;
4762       else
4763         {
4764           error ("type mismatch in conditional expression");
4765           return error_mark_node;
4766         }
4767     }
4768
4769   if (result_type != TREE_TYPE (op1))
4770     op1 = convert_and_check (result_type, op1);
4771   if (result_type != TREE_TYPE (op2))
4772     op2 = convert_and_check (result_type, op2);
4773
4774 #if 0
4775   /* XXX delete me, I've been here for years.  */
4776   if (IS_AGGR_TYPE_CODE (code1))
4777     {
4778       result_type = TREE_TYPE (op1);
4779       if (TREE_CONSTANT (ifexp))
4780         return (integer_zerop (ifexp) ? op2 : op1);
4781
4782       if (TYPE_MODE (result_type) == BLKmode)
4783         {
4784           register tree tempvar
4785             = build_decl (VAR_DECL, NULL_TREE, result_type);
4786           register tree xop1 = build_modify_expr (tempvar, NOP_EXPR, op1);
4787           register tree xop2 = build_modify_expr (tempvar, NOP_EXPR, op2);
4788           register tree result = fold (build (COND_EXPR, result_type,
4789                                               ifexp, xop1, xop2));
4790
4791           layout_decl (tempvar, 0);
4792           /* No way to handle variable-sized objects here.
4793              I fear that the entire handling of BLKmode conditional exprs
4794              needs to be redone.  */
4795           my_friendly_assert (TREE_CONSTANT (DECL_SIZE (tempvar)), 315);
4796           DECL_RTL (tempvar)
4797             = assign_stack_local (DECL_MODE (tempvar),
4798                                   (TREE_INT_CST_LOW (DECL_SIZE (tempvar))
4799                                    + BITS_PER_UNIT - 1)
4800                                   / BITS_PER_UNIT,
4801                                   0);
4802
4803           TREE_SIDE_EFFECTS (result)
4804             = TREE_SIDE_EFFECTS (ifexp) | TREE_SIDE_EFFECTS (op1)
4805               | TREE_SIDE_EFFECTS (op2);
4806           return build (COMPOUND_EXPR, result_type, result, tempvar);
4807         }
4808     }
4809 #endif /* 0 */
4810
4811   if (TREE_CONSTANT (ifexp))
4812     return integer_zerop (ifexp) ? op2 : op1;
4813
4814   return fold (build (COND_EXPR, result_type, ifexp, op1, op2));
4815 }
4816 \f
4817 /* Handle overloading of the ',' operator when needed.  Otherwise,
4818    this function just builds an expression list.  */
4819 tree
4820 build_x_compound_expr (list)
4821      tree list;
4822 {
4823   tree rest = TREE_CHAIN (list);
4824   tree result;
4825
4826   if (rest == NULL_TREE)
4827     return build_compound_expr (list);
4828
4829   result = build_opfncall (COMPOUND_EXPR, LOOKUP_NORMAL,
4830                            TREE_VALUE (list), TREE_VALUE (rest), NULL_TREE);
4831   if (result)
4832     return build_x_compound_expr (tree_cons (NULL_TREE, result, TREE_CHAIN (rest)));
4833   return build_compound_expr (tree_cons (NULL_TREE, TREE_VALUE (list),
4834                                          build_tree_list (NULL_TREE, build_x_compound_expr (rest))));
4835 }
4836
4837 /* Given a list of expressions, return a compound expression
4838    that performs them all and returns the value of the last of them.  */
4839
4840 tree
4841 build_compound_expr (list)
4842      tree list;
4843 {
4844   register tree rest;
4845
4846   if (TREE_READONLY_DECL_P (TREE_VALUE (list)))
4847     TREE_VALUE (list) = decl_constant_value (TREE_VALUE (list));
4848
4849   if (TREE_CHAIN (list) == 0)
4850     {
4851       /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4852          Strip such NOP_EXPRs, since LIST is used in non-lvalue context.  */
4853       if (TREE_CODE (list) == NOP_EXPR
4854           && TREE_TYPE (list) == TREE_TYPE (TREE_OPERAND (list, 0)))
4855         list = TREE_OPERAND (list, 0);
4856
4857       /* Convert arrays to pointers.  */
4858       if (TREE_CODE (TREE_TYPE (TREE_VALUE (list))) == ARRAY_TYPE)
4859         return default_conversion (TREE_VALUE (list));
4860       else
4861         return TREE_VALUE (list);
4862     }
4863
4864   rest = build_compound_expr (TREE_CHAIN (list));
4865
4866   /* When pedantic, a compound expression can be neither an lvalue
4867      nor an integer constant expression.  */
4868   if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)) && ! pedantic)
4869     return rest;
4870
4871   return build (COMPOUND_EXPR, TREE_TYPE (rest),
4872                 break_out_cleanups (TREE_VALUE (list)), rest);
4873 }
4874
4875 tree build_static_cast (type, expr)
4876    tree type, expr;
4877 {
4878   return build_c_cast (type, expr);
4879 }
4880
4881 tree build_reinterpret_cast (type, expr)
4882    tree type, expr;
4883 {
4884   return build_c_cast (type, expr);
4885 }
4886
4887 tree build_const_cast (type, expr)
4888    tree type, expr;
4889 {
4890   return build_c_cast (type, expr);
4891 }
4892
4893 /* Build an expression representing a cast to type TYPE of expression EXPR.  */
4894
4895 tree
4896 build_c_cast (type, expr)
4897      register tree type;
4898      tree expr;
4899 {
4900   register tree value = expr;
4901
4902   if (type == error_mark_node || expr == error_mark_node)
4903     return error_mark_node;
4904
4905   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4906      Strip such NOP_EXPRs, since VALUE is being used in non-lvalue context.  */
4907   if (TREE_CODE (value) == NOP_EXPR
4908       && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
4909     value = TREE_OPERAND (value, 0);
4910
4911   if (TREE_TYPE (expr)
4912       && TREE_CODE (TREE_TYPE (expr)) == OFFSET_TYPE
4913       && TREE_CODE (type) != OFFSET_TYPE)
4914     value = resolve_offset_ref (value);
4915
4916   if (TREE_CODE (type) == ARRAY_TYPE)
4917     {
4918       /* Allow casting from T1* to T2[] because Cfront allows it.
4919          NIHCL uses it. It is not valid ANSI C however, and hence, not
4920          valid ANSI C++.  */
4921       if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
4922         {
4923           if (pedantic)
4924             pedwarn ("ANSI C++ forbids casting to an array type");
4925           type = build_pointer_type (TREE_TYPE (type));
4926         }
4927       else
4928         {
4929           error ("ANSI C++ forbids casting to an array type");
4930           return error_mark_node;
4931         }
4932     }
4933
4934   if (TREE_CODE (type) == FUNCTION_TYPE
4935       || TREE_CODE (type) == METHOD_TYPE)
4936     {
4937       cp_error ("casting to function type `%T'", type);
4938       return error_mark_node;
4939     }
4940
4941   if (IS_SIGNATURE (type))
4942     {
4943       error ("cast specifies signature type");
4944       return error_mark_node;
4945     }
4946
4947   /* If there's only one function in the overloaded space,
4948      just take it.  */
4949   if (TREE_CODE (value) == TREE_LIST
4950       && TREE_CHAIN (value) == NULL_TREE)
4951     value = TREE_VALUE (value);
4952
4953   if (TREE_CODE (type) == VOID_TYPE)
4954     value = build1 (NOP_EXPR, type, value);
4955   else if (TREE_TYPE (value) == NULL_TREE
4956       || type_unknown_p (value))
4957     {
4958       value = instantiate_type (type, value, 1);
4959       /* Did we lose?  */
4960       if (value == error_mark_node)
4961         return error_mark_node;
4962     }
4963   else
4964     {
4965       tree otype, ovalue;
4966
4967       /* Convert functions and arrays to pointers and
4968          convert references to their expanded types,
4969          but don't convert any other types.  */
4970       if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE
4971           || TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE
4972           || TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE
4973           || TREE_CODE (TREE_TYPE (value)) == REFERENCE_TYPE)
4974         value = default_conversion (value);
4975       otype = TREE_TYPE (value);
4976
4977       /* Optionally warn about potentially worrisome casts.  */
4978
4979       if (warn_cast_qual
4980           && TREE_CODE (type) == POINTER_TYPE
4981           && TREE_CODE (otype) == POINTER_TYPE)
4982         {
4983           /* For C++ we make these regular warnings, rather than
4984              softening them into pedwarns.  */
4985           if (TYPE_VOLATILE (TREE_TYPE (otype))
4986               && ! TYPE_VOLATILE (TREE_TYPE (type)))
4987             warning ("cast discards `volatile' from pointer target type");
4988           if (TYPE_READONLY (TREE_TYPE (otype))
4989               && ! TYPE_READONLY (TREE_TYPE (type)))
4990             warning ("cast discards `const' from pointer target type");
4991         }
4992
4993       /* Warn about possible alignment problems.  */
4994       if (STRICT_ALIGNMENT && warn_cast_align
4995           && TREE_CODE (type) == POINTER_TYPE
4996           && TREE_CODE (otype) == POINTER_TYPE
4997           && TREE_CODE (TREE_TYPE (otype)) != VOID_TYPE
4998           && TREE_CODE (TREE_TYPE (otype)) != FUNCTION_TYPE
4999           && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype)))
5000         warning ("cast increases required alignment of target type");
5001
5002 #if 0
5003       if (TREE_CODE (type) == INTEGER_TYPE
5004           && TREE_CODE (otype) == POINTER_TYPE
5005           && TYPE_PRECISION (type) != TYPE_PRECISION (otype))
5006         warning ("cast from pointer to integer of different size");
5007
5008       if (TREE_CODE (type) == POINTER_TYPE
5009           && TREE_CODE (otype) == INTEGER_TYPE
5010           && TYPE_PRECISION (type) != TYPE_PRECISION (otype)
5011           /* Don't warn about converting 0 to pointer,
5012              provided the 0 was explicit--not cast or made by folding.  */
5013           && !(TREE_CODE (value) == INTEGER_CST && integer_zerop (value)))
5014         warning ("cast to pointer from integer of different size");
5015 #endif
5016
5017       ovalue = value;
5018       value = convert_force (type, value);
5019
5020       /* Ignore any integer overflow caused by the cast.  */
5021       if (TREE_CODE (value) == INTEGER_CST)
5022         {
5023           TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue);
5024           TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
5025         }
5026     }
5027
5028     /* Always produce some operator for an explicit cast,
5029        so we can tell (for -pedantic) that the cast is no lvalue.
5030        Also, pedantically, don't let (void *) (FOO *) 0 be a null
5031        pointer constant.  */
5032   if (value == expr
5033       || (pedantic
5034           && TREE_CODE (value) == INTEGER_CST
5035           && TREE_CODE (expr) == INTEGER_CST
5036           && TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE))
5037     {
5038       tree nvalue = build1 (NOP_EXPR, type, value);
5039       TREE_CONSTANT (nvalue) = TREE_CONSTANT (value);
5040       return nvalue;
5041     }
5042
5043   return value;
5044 }
5045 \f
5046 #if 0
5047 /* Build an assignment expression of lvalue LHS from value RHS.
5048
5049    In C++, if the left hand side of the assignment is a REFERENCE_TYPE,
5050    that reference becomes deferenced down to it base type. */
5051
5052 /* Return a reference to the BASE_INDEX part of EXPR.  TYPE is
5053    the type to which BASE_INDEX applies.  */
5054 static tree
5055 get_base_ref (type, base_index, expr)
5056      tree type;
5057      int base_index;
5058      tree expr;
5059 {
5060   tree binfos = TYPE_BINFO_BASETYPES (type);
5061   tree base_binfo = TREE_VEC_ELT (binfos, base_index);
5062   tree ref;
5063
5064   if (TREE_CODE (expr) == ARRAY_REF
5065       || ! BINFO_OFFSET_ZEROP (base_binfo)
5066       || TREE_VIA_VIRTUAL (base_binfo)
5067       || TYPE_MODE (type) != TYPE_MODE (BINFO_TYPE (base_binfo)))
5068     {
5069       tree addr = build_unary_op (ADDR_EXPR, expr, 0);
5070       ref = build_indirect_ref (convert_pointer_to (base_binfo, addr),
5071                                 NULL_PTR);
5072     }
5073   else
5074     {
5075       ref = copy_node (expr);
5076       TREE_TYPE (ref) = BINFO_TYPE (base_binfo);
5077     }
5078   return ref;
5079 }
5080
5081 /* Build an assignment expression of lvalue LHS from value RHS.
5082    MODIFYCODE is the code for a binary operator that we use
5083    to combine the old value of LHS with RHS to get the new value.
5084    Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
5085
5086    C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed.
5087
5088    `build_modify_expr_1' implements recursive part of memberwise
5089    assignment operation.  */
5090 static tree
5091 build_modify_expr_1 (lhs, modifycode, rhs, basetype_path)
5092      tree lhs, rhs;
5093      enum tree_code modifycode;
5094      tree basetype_path;
5095 {
5096   register tree result;
5097   tree newrhs = rhs;
5098   tree lhstype = TREE_TYPE (lhs);
5099   tree olhstype = lhstype;
5100
5101   /* Avoid duplicate error messages from operands that had errors.  */
5102   if (TREE_CODE (lhs) == ERROR_MARK || TREE_CODE (rhs) == ERROR_MARK)
5103     return error_mark_node;
5104
5105   /* If a binary op has been requested, combine the old LHS value with the RHS
5106      producing the value we should actually store into the LHS.  */
5107
5108   if (modifycode == INIT_EXPR)
5109     ;
5110   else if (modifycode == NOP_EXPR)
5111     {
5112       /* must deal with overloading of `operator=' here.  */
5113       if (TREE_CODE (lhstype) == REFERENCE_TYPE)
5114         lhstype = TREE_TYPE (lhstype);
5115       else
5116         lhstype = olhstype;
5117     }
5118   else
5119     {
5120       lhs = stabilize_reference (lhs);
5121       newrhs = build_binary_op (modifycode, lhs, rhs, 1);
5122       modifycode = NOP_EXPR;
5123     }
5124
5125   /* If storing into a structure or union member,
5126      it has probably been given type `int'.
5127      Compute the type that would go with
5128      the actual amount of storage the member occupies.  */
5129
5130   if (TREE_CODE (lhs) == COMPONENT_REF
5131       && (TREE_CODE (lhstype) == INTEGER_TYPE
5132           || TREE_CODE (lhstype) == REAL_TYPE
5133           || TREE_CODE (lhstype) == ENUMERAL_TYPE))
5134     lhstype = TREE_TYPE (get_unwidened (lhs, 0));
5135
5136   /* C++: The semantics of C++ differ from those of C when an
5137      assignment of an aggregate is desired.  Assignment in C++ is
5138      now defined as memberwise assignment of non-static members
5139      and base class objects.  This rule applies recursively
5140      until a member of a built-in type is found.
5141
5142      Also, we cannot do a bit-wise copy of aggregates which
5143      contain virtual function table pointers.  Those
5144      pointer values must be preserved through the copy.
5145      However, this is handled in expand_expr, and not here.
5146      This is because much better code can be generated at
5147      that stage than this one.  */
5148   if (TREE_CODE (lhstype) == RECORD_TYPE
5149       && TYPE_LANG_SPECIFIC (lhstype)
5150       && TYPE_MAIN_VARIANT (lhstype) == TYPE_MAIN_VARIANT (TREE_TYPE (newrhs)))
5151     {
5152       register tree elt;
5153       int i;
5154
5155       /* Perform operation on object.  */
5156       if (modifycode == INIT_EXPR && TYPE_HAS_INIT_REF (lhstype))
5157         {
5158           result = build_method_call (lhs, constructor_name_full (lhstype),
5159                                       build_tree_list (NULL_TREE, rhs),
5160                                       basetype_path, LOOKUP_NORMAL);
5161           return build_indirect_ref (result, NULL_PTR);
5162         }
5163       else if (modifycode == NOP_EXPR)
5164         {
5165           /* `operator=' is not an inheritable operator; see 13.4.3.  */
5166           if (TYPE_LANG_SPECIFIC (lhstype) && TYPE_HAS_ASSIGNMENT (lhstype))
5167             {
5168               result = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL,
5169                                        lhs, rhs, make_node (NOP_EXPR));
5170               if (result == NULL_TREE)
5171                 return error_mark_node;
5172               return result;
5173             }
5174         }
5175
5176       if (TYPE_USES_VIRTUAL_BASECLASSES (lhstype)
5177           || (modifycode == NOP_EXPR && TYPE_GETS_ASSIGNMENT (lhstype))
5178           || (modifycode == INIT_EXPR && TYPE_GETS_INIT_REF (lhstype)))
5179         {
5180           tree binfos = BINFO_BASETYPES (TYPE_BINFO (lhstype));
5181           result = NULL_TREE;
5182
5183           if (binfos != NULL_TREE)
5184             /* Perform operation on each member, depth-first, left-right.  */
5185             for (i = 0; i <= TREE_VEC_LENGTH (binfos)-1; i++)
5186               {
5187                 tree base_binfo = TREE_VEC_ELT (binfos, i);
5188                 tree base_lhs, base_rhs;
5189                 tree new_result;
5190
5191                 /* Assignments from virtual baseclasses handled elsewhere.  */
5192                 if (TREE_VIA_VIRTUAL (base_binfo))
5193                   continue;
5194
5195                 base_lhs = get_base_ref (lhstype, i, lhs);
5196                 base_rhs = get_base_ref (lhstype, i, newrhs);
5197
5198                 BINFO_INHERITANCE_CHAIN (base_binfo) = basetype_path;
5199                 new_result
5200                   = build_modify_expr_1 (base_lhs, modifycode, base_rhs,
5201                                          base_binfo);
5202
5203                 /* We either get back a compound stmt, or a simple one.  */
5204                 if (new_result && TREE_CODE (new_result) == TREE_LIST)
5205                   new_result = build_compound_expr (new_result);
5206                 result = tree_cons (NULL_TREE, new_result, result);
5207               }
5208
5209           for (elt = TYPE_FIELDS (lhstype); elt; elt = TREE_CHAIN (elt))
5210             {
5211               tree vbases = NULL_TREE;
5212               tree elt_lhs, elt_rhs;
5213
5214               if (TREE_CODE (elt) != FIELD_DECL)
5215                 continue;
5216               if (DECL_NAME (elt)
5217                   && (VFIELD_NAME_P (DECL_NAME (elt))
5218                       || VBASE_NAME_P (DECL_NAME (elt))))
5219                 continue;
5220
5221               if (TREE_READONLY (elt)
5222                   || TREE_CODE (TREE_TYPE (elt)) == REFERENCE_TYPE)
5223                 {
5224                   cp_error ("cannot generate default `%T::operator ='",
5225                             lhstype);
5226                   if (TREE_CODE (TREE_TYPE (elt)) == REFERENCE_TYPE)
5227                     cp_error_at ("because member `%#D' is a reference", elt);
5228                   else
5229                     cp_error_at ("because member `%#D' is const", elt);
5230
5231                   return error_mark_node;
5232                 }
5233
5234               if (IS_AGGR_TYPE (TREE_TYPE (elt))
5235                   && TYPE_LANG_SPECIFIC (TREE_TYPE (elt)))
5236                 vbases = CLASSTYPE_VBASECLASSES (TREE_TYPE (elt));
5237
5238               elt_lhs = build (COMPONENT_REF, TREE_TYPE (elt), lhs, elt);
5239               elt_rhs = build (COMPONENT_REF, TREE_TYPE (elt), newrhs, elt);
5240               /* It is not always safe to go through `build_modify_expr_1'
5241                  when performing element-wise copying.  This is because
5242                  an element may be of ARRAY_TYPE, which will not
5243                  be properly copied as a naked element.  */
5244               if (TREE_CODE (TREE_TYPE (elt)) == RECORD_TYPE
5245                   && TYPE_LANG_SPECIFIC (TREE_TYPE (elt)))
5246                 basetype_path = TYPE_BINFO (TREE_TYPE (elt));
5247
5248               while (vbases)
5249                 {
5250                   tree elt_lhs_addr = build_unary_op (ADDR_EXPR, elt_lhs, 0);
5251                   tree elt_rhs_addr = build_unary_op (ADDR_EXPR, elt_rhs, 0);
5252
5253                   elt_lhs_addr = convert_pointer_to (vbases, elt_lhs_addr);
5254                   elt_rhs_addr = convert_pointer_to (vbases, elt_rhs_addr);
5255                   result
5256                     = tree_cons (NULL_TREE,
5257                                  build_modify_expr_1
5258                                  (build_indirect_ref (elt_lhs_addr, NULL_PTR),
5259                                   modifycode,
5260                                   build_indirect_ref (elt_rhs_addr, NULL_PTR),
5261                                   basetype_path),
5262                                  result);
5263                   if (TREE_VALUE (result) == error_mark_node)
5264                     return error_mark_node;
5265                   vbases = TREE_CHAIN (vbases);
5266                 }
5267               elt_lhs = build_modify_expr_1 (elt_lhs, modifycode, elt_rhs,
5268                                              basetype_path);
5269               result = tree_cons (NULL_TREE, elt_lhs, result);
5270             }
5271
5272           if (result)
5273             return build_compound_expr (result);
5274           /* No fields to move.  */
5275           return integer_zero_node;
5276         }
5277       else
5278         {
5279           result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
5280                           void_type_node, lhs, rhs);
5281           TREE_SIDE_EFFECTS (result) = 1;
5282           return result;
5283         }
5284     }
5285
5286   result = build_modify_expr (lhs, modifycode, newrhs);
5287   /* ARRAY_TYPEs cannot be converted to anything meaningful,
5288      and leaving it there screws up `build_compound_expr' when
5289      it tries to defaultly convert everything.  */
5290   if (TREE_CODE (TREE_TYPE (result)) == ARRAY_TYPE)
5291     TREE_TYPE (result) = void_type_node;
5292   return result;
5293 }
5294 #endif
5295
5296 /* Taken from expr.c:
5297    Subroutine of expand_expr:
5298    record the non-copied parts (LIST) of an expr (LHS), and return a list
5299    which specifies the initial values of these parts.  */
5300
5301 static tree
5302 init_noncopied_parts (lhs, list)
5303      tree lhs;
5304      tree list;
5305 {
5306   tree tail;
5307   tree parts = 0;
5308
5309   for (tail = list; tail; tail = TREE_CHAIN (tail))
5310     if (TREE_CODE (TREE_VALUE (tail)) == TREE_LIST)
5311       parts = chainon (parts, init_noncopied_parts (lhs, TREE_VALUE (tail)));
5312     else
5313       {
5314         tree part = TREE_VALUE (tail);
5315         tree part_type = TREE_TYPE (part);
5316         tree to_be_initialized = build (COMPONENT_REF, part_type, lhs, part);
5317         parts = tree_cons (TREE_PURPOSE (tail), to_be_initialized, parts);
5318       }
5319   return parts;
5320 }
5321
5322 /* Build an assignment expression of lvalue LHS from value RHS.
5323    MODIFYCODE is the code for a binary operator that we use
5324    to combine the old value of LHS with RHS to get the new value.
5325    Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
5326
5327    C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed.
5328 */
5329 tree
5330 build_modify_expr (lhs, modifycode, rhs)
5331      tree lhs;
5332      enum tree_code modifycode;
5333      tree rhs;
5334 {
5335   register tree result;
5336   tree newrhs = rhs;
5337   tree lhstype = TREE_TYPE (lhs);
5338   tree olhstype = lhstype;
5339
5340   /* Types that aren't fully specified cannot be used in assignments.  */
5341   lhs = require_complete_type (lhs);
5342
5343   /* Avoid duplicate error messages from operands that had errors.  */
5344   if (TREE_CODE (lhs) == ERROR_MARK || TREE_CODE (rhs) == ERROR_MARK)
5345     return error_mark_node;
5346
5347   /* Decide early if we are going to protect RHS from GC
5348      before assigning it to LHS.  */
5349   if (type_needs_gc_entry (TREE_TYPE (rhs))
5350       && ! value_safe_from_gc (lhs, rhs))
5351     rhs = protect_value_from_gc (lhs, rhs);
5352
5353   newrhs = rhs;
5354
5355   /* Handle assignment to signature pointers/refs.  */
5356
5357   if (TYPE_LANG_SPECIFIC (lhstype) &&
5358       (IS_SIGNATURE_POINTER (lhstype) || IS_SIGNATURE_REFERENCE (lhstype)))
5359     {
5360       return build_signature_pointer_constructor (lhs, rhs);
5361     }
5362
5363   /* Handle control structure constructs used as "lvalues".  */
5364
5365   switch (TREE_CODE (lhs))
5366     {
5367       /* Handle --foo = 5; as these are valid constructs in C++ */
5368     case PREDECREMENT_EXPR:
5369     case PREINCREMENT_EXPR:
5370       if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
5371         lhs = build (TREE_CODE (lhs), TREE_TYPE (lhs),
5372                      stabilize_reference (TREE_OPERAND (lhs, 0)));
5373       return build (COMPOUND_EXPR, lhstype,
5374                     lhs,
5375                     build_modify_expr (TREE_OPERAND (lhs, 0),
5376                                        modifycode, rhs));
5377
5378       /* Handle (a, b) used as an "lvalue".  */
5379     case COMPOUND_EXPR:
5380       newrhs = build_modify_expr (TREE_OPERAND (lhs, 1),
5381                                   modifycode, rhs);
5382       if (TREE_CODE (newrhs) == ERROR_MARK)
5383         return error_mark_node;
5384       return build (COMPOUND_EXPR, lhstype,
5385                     TREE_OPERAND (lhs, 0), newrhs);
5386
5387     case MODIFY_EXPR:
5388       newrhs = build_modify_expr (TREE_OPERAND (lhs, 0), modifycode, rhs);
5389       if (TREE_CODE (newrhs) == ERROR_MARK)
5390         return error_mark_node;
5391       return build (COMPOUND_EXPR, lhstype, lhs, newrhs);
5392
5393       /* Handle (a ? b : c) used as an "lvalue".  */
5394     case COND_EXPR:
5395       rhs = save_expr (rhs);
5396       {
5397         /* Produce (a ? (b = rhs) : (c = rhs))
5398            except that the RHS goes through a save-expr
5399            so the code to compute it is only emitted once.  */
5400         tree cond
5401           = build_conditional_expr (TREE_OPERAND (lhs, 0),
5402                                     build_modify_expr (TREE_OPERAND (lhs, 1),
5403                                                        modifycode, rhs),
5404                                     build_modify_expr (TREE_OPERAND (lhs, 2),
5405                                                        modifycode, rhs));
5406         if (TREE_CODE (cond) == ERROR_MARK)
5407           return cond;
5408         /* Make sure the code to compute the rhs comes out
5409            before the split.  */
5410         return build (COMPOUND_EXPR, TREE_TYPE (lhs),
5411                       /* Case to void to suppress warning
5412                          from warn_if_unused_value.  */
5413                       convert (void_type_node, rhs), cond);
5414       }
5415     }
5416
5417   if (TREE_CODE (lhs) == OFFSET_REF)
5418     {
5419       if (TREE_OPERAND (lhs, 0) == NULL_TREE)
5420         {
5421           /* Static class member?  */
5422           tree member = TREE_OPERAND (lhs, 1);
5423           if (TREE_CODE (member) == VAR_DECL)
5424             lhs = member;
5425           else
5426             {
5427               compiler_error ("invalid static class member");
5428               return error_mark_node;
5429             }
5430         }
5431       else
5432         lhs = resolve_offset_ref (lhs);
5433
5434       olhstype = lhstype = TREE_TYPE (lhs);
5435     }
5436
5437   if (TREE_CODE (lhstype) == REFERENCE_TYPE
5438       && modifycode != INIT_EXPR)
5439     {
5440       lhs = convert_from_reference (lhs);
5441       olhstype = lhstype = TREE_TYPE (lhs);
5442     }
5443
5444   /* If a binary op has been requested, combine the old LHS value with the RHS
5445      producing the value we should actually store into the LHS.  */
5446
5447   if (modifycode == INIT_EXPR)
5448     {
5449       if (TYPE_LANG_SPECIFIC (lhstype) && TYPE_HAS_CONSTRUCTOR (lhstype))
5450         {
5451           result = build_method_call (lhs, constructor_name_full (lhstype),
5452                                       build_tree_list (NULL_TREE, rhs),
5453                                       NULL_TREE, LOOKUP_NORMAL);
5454           if (result == NULL_TREE)
5455             return error_mark_node;
5456           return result;
5457         }
5458     }
5459   else if (modifycode == NOP_EXPR)
5460     {
5461 #if 1
5462       /* `operator=' is not an inheritable operator.  */
5463       if (TYPE_LANG_SPECIFIC (lhstype) && TYPE_HAS_ASSIGNMENT (lhstype))
5464         {
5465           result = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL,
5466                                    lhs, rhs, make_node (NOP_EXPR));
5467           if (result == NULL_TREE)
5468             return error_mark_node;
5469           return result;
5470         }
5471 #else
5472       /* Treat `operator=' as an inheritable operator.  */
5473       if (TYPE_LANG_SPECIFIC (lhstype) && TYPE_GETS_ASSIGNMENT (lhstype))
5474         {
5475           tree orig_lhstype = lhstype;
5476           while (! TYPE_HAS_ASSIGNMENT (lhstype))
5477             {
5478               int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (lhstype);
5479               tree basetype = NULL_TREE;
5480               for (i = 0; i < n_baseclasses; i++)
5481                 if (TYPE_GETS_ASSIGNMENT (TYPE_BINFO_BASETYPE (lhstype, i)))
5482                   {
5483                     if (basetype != NULL_TREE)
5484                       {
5485                         message_2_types (error, "base classes `%s' and `%s' both have operator ='",
5486                                          basetype,
5487                                          TYPE_BINFO_BASETYPE (lhstype, i));
5488                         return error_mark_node;
5489                       }
5490                     basetype = TYPE_BINFO_BASETYPE (lhstype, i);
5491                   }
5492               lhstype = basetype;
5493             }
5494           if (orig_lhstype != lhstype)
5495             {
5496               lhs = build_indirect_ref (convert_pointer_to (lhstype,
5497                                                             build_unary_op (ADDR_EXPR, lhs, 0)), NULL_PTR);
5498               if (lhs == error_mark_node)
5499                 {
5500                   cp_error ("conversion to private basetype `%T'", lhstype);
5501                   return error_mark_node;
5502                 }
5503             }
5504           result = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL,
5505                                    lhs, rhs, make_node (NOP_EXPR));
5506           if (result == NULL_TREE)
5507             return error_mark_node;
5508           return result;
5509         }
5510 #endif
5511       lhstype = olhstype;
5512     }
5513   else if (PROMOTES_TO_AGGR_TYPE (lhstype, REFERENCE_TYPE))
5514     {
5515       /* This case must convert to some sort of lvalue that
5516          can participate in an op= operation.  */
5517       tree lhs_tmp = lhs;
5518       tree rhs_tmp = rhs;
5519       if (build_default_binary_type_conversion (modifycode, &lhs_tmp, &rhs_tmp))
5520         {
5521           lhs = stabilize_reference (lhs_tmp);
5522           /* Forget is was ever anything else.  */
5523           olhstype = lhstype = TREE_TYPE (lhs);
5524           newrhs = build_binary_op (modifycode, lhs, rhs_tmp, 1);
5525         }
5526       else
5527         return error_mark_node;
5528     }
5529   else
5530     {
5531       lhs = stabilize_reference (lhs);
5532       newrhs = build_binary_op (modifycode, lhs, rhs, 1);
5533     }
5534
5535   /* Handle a cast used as an "lvalue".
5536      We have already performed any binary operator using the value as cast.
5537      Now convert the result to the cast type of the lhs,
5538      and then true type of the lhs and store it there;
5539      then convert result back to the cast type to be the value
5540      of the assignment.  */
5541
5542   switch (TREE_CODE (lhs))
5543     {
5544     case NOP_EXPR:
5545     case CONVERT_EXPR:
5546     case FLOAT_EXPR:
5547     case FIX_TRUNC_EXPR:
5548     case FIX_FLOOR_EXPR:
5549     case FIX_ROUND_EXPR:
5550     case FIX_CEIL_EXPR:
5551       if (TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
5552           || TREE_CODE (TREE_TYPE (newrhs)) == FUNCTION_TYPE
5553           || TREE_CODE (TREE_TYPE (newrhs)) == METHOD_TYPE
5554           || TREE_CODE (TREE_TYPE (newrhs)) == OFFSET_TYPE)
5555         newrhs = default_conversion (newrhs);
5556       {
5557         tree inner_lhs = TREE_OPERAND (lhs, 0);
5558         tree result;
5559         if (! lvalue_p (lhs) && pedantic)
5560           pedwarn ("cast to non-reference type used as lvalue");
5561
5562         result = build_modify_expr (inner_lhs, NOP_EXPR,
5563                                     convert (TREE_TYPE (inner_lhs),
5564                                              convert (lhstype, newrhs)));
5565         if (TREE_CODE (result) == ERROR_MARK)
5566           return result;
5567         return convert (TREE_TYPE (lhs), result);
5568       }
5569     }
5570
5571   /* Now we have handled acceptable kinds of LHS that are not truly lvalues.
5572      Reject anything strange now.  */
5573
5574   if (!lvalue_or_else (lhs, "assignment"))
5575     return error_mark_node;
5576
5577   GNU_xref_assign (lhs);
5578
5579   /* Warn about storing in something that is `const'.  */
5580   /* For C++, don't warn if this is initialization.  */
5581   if (modifycode != INIT_EXPR
5582       /* For assignment to `const' signature pointer/reference fields,
5583          don't warn either, we already printed a better message before.  */
5584       && ! (TREE_CODE (lhs) == COMPONENT_REF
5585             && (IS_SIGNATURE_POINTER (TREE_TYPE (TREE_OPERAND (lhs, 0)))
5586                 || IS_SIGNATURE_REFERENCE (TREE_TYPE (TREE_OPERAND (lhs, 0)))))
5587       && (TREE_READONLY (lhs) || TYPE_READONLY (lhstype)
5588           || ((TREE_CODE (lhstype) == RECORD_TYPE
5589                || TREE_CODE (lhstype) == UNION_TYPE)
5590               && C_TYPE_FIELDS_READONLY (lhstype))
5591           || (TREE_CODE (lhstype) == REFERENCE_TYPE
5592               && TYPE_READONLY (TREE_TYPE (lhstype)))))
5593     readonly_error (lhs, "assignment", 0);
5594
5595   /* If storing into a structure or union member,
5596      it has probably been given type `int'.
5597      Compute the type that would go with
5598      the actual amount of storage the member occupies.  */
5599
5600   if (TREE_CODE (lhs) == COMPONENT_REF
5601       && (TREE_CODE (lhstype) == INTEGER_TYPE
5602           || TREE_CODE (lhstype) == REAL_TYPE
5603           || TREE_CODE (lhstype) == ENUMERAL_TYPE))
5604     {
5605       lhstype = TREE_TYPE (get_unwidened (lhs, 0));
5606
5607       /* If storing in a field that is in actuality a short or narrower
5608          than one, we must store in the field in its actual type.  */
5609
5610       if (lhstype != TREE_TYPE (lhs))
5611         {
5612           lhs = copy_node (lhs);
5613           TREE_TYPE (lhs) = lhstype;
5614         }
5615     }
5616
5617   /* check to see if there is an assignment to `this' */
5618   if (lhs == current_class_decl)
5619     {
5620       if (flag_this_is_variable > 0
5621           && DECL_NAME (current_function_decl) != NULL_TREE
5622           && current_class_name != DECL_NAME (current_function_decl))
5623         warning ("assignment to `this' not in constructor or destructor");
5624       current_function_just_assigned_this = 1;
5625     }
5626
5627   /* The TREE_TYPE of RHS may be TYPE_UNKNOWN.  This can happen
5628      when the type of RHS is not yet known, i.e. its type
5629      is inherited from LHS.  */
5630   rhs = require_instantiated_type (lhstype, newrhs, error_mark_node);
5631   if (rhs == error_mark_node)
5632     return error_mark_node;
5633   newrhs = rhs;
5634
5635   if (modifycode != INIT_EXPR)
5636     {
5637       /* Make modifycode now either a NOP_EXPR or an INIT_EXPR.  */
5638       modifycode = NOP_EXPR;
5639       /* Reference-bashing */
5640       if (TREE_CODE (lhstype) == REFERENCE_TYPE)
5641         {
5642           tree tmp = convert_from_reference (lhs);
5643           lhstype = TREE_TYPE (tmp);
5644           if (TYPE_SIZE (lhstype) == 0)
5645             {
5646               incomplete_type_error (lhs, lhstype);
5647               return error_mark_node;
5648             }
5649           lhs = tmp;
5650           olhstype = lhstype;
5651         }
5652       if (TREE_CODE (TREE_TYPE (newrhs)) == REFERENCE_TYPE)
5653         {
5654           tree tmp = convert_from_reference (newrhs);
5655           if (TYPE_SIZE (TREE_TYPE (tmp)) == 0)
5656             {
5657               incomplete_type_error (newrhs, TREE_TYPE (tmp));
5658               return error_mark_node;
5659             }
5660           newrhs = tmp;
5661         }
5662     }
5663
5664   if (TREE_SIDE_EFFECTS (lhs))
5665     lhs = stabilize_reference (lhs);
5666   if (TREE_SIDE_EFFECTS (newrhs))
5667     newrhs = stabilize_reference (newrhs);
5668
5669   /* C++: The semantics of C++ differ from those of C when an
5670      assignment of an aggregate is desired.  Assignment in C++ is
5671      now defined as memberwise assignment of non-static members
5672      and base class objects.  This rule applies recursively
5673      until a member of a built-in type is found.
5674
5675      Also, we cannot do a bit-wise copy of aggregates which
5676      contain virtual function table pointers.  Those
5677      pointer values must be preserved through the copy.
5678      However, this is handled in expand_expr, and not here.
5679      This is because much better code can be generated at
5680      that stage than this one.  */
5681   if (TREE_CODE (lhstype) == RECORD_TYPE
5682       && ! TYPE_PTRMEMFUNC_P (lhstype)
5683       && (TYPE_MAIN_VARIANT (lhstype) == TYPE_MAIN_VARIANT (TREE_TYPE (newrhs))
5684           || (TREE_CODE (TREE_TYPE (newrhs)) == RECORD_TYPE
5685               && UNIQUELY_DERIVED_FROM_P (lhstype, TREE_TYPE (newrhs)))))
5686     {
5687       /* This was decided in finish_struct.  */
5688       if (modifycode == INIT_EXPR)
5689         cp_error ("can't generate default copy constructor for `%T'", lhstype);
5690       else
5691         cp_error ("can't generate default assignment operator for `%T'",
5692                   lhstype);
5693 #if 0
5694       /* This is now done by generating X(X&) and operator=(X&). */
5695       tree vbases = CLASSTYPE_VBASECLASSES (lhstype);
5696       tree lhs_addr = build_unary_op (ADDR_EXPR, lhs, 0);
5697       tree rhs_addr;
5698           
5699       /* Memberwise assignment would cause NEWRHS to be
5700          evaluated for every member that gets assigned.
5701          By wrapping side-effecting exprs in a SAVE_EXPR,
5702          NEWRHS will only be evaluated once.  */
5703       if (IS_AGGR_TYPE (TREE_TYPE (newrhs))
5704           && TREE_SIDE_EFFECTS (newrhs)
5705           /* This are things we don't have to save.  */
5706           && TREE_CODE (newrhs) != COND_EXPR
5707           && TREE_CODE (newrhs) != TARGET_EXPR
5708           && TREE_CODE (newrhs) != WITH_CLEANUP_EXPR)
5709         /* Call `break_out_cleanups' on NEWRHS in case there are cleanups.
5710            If NEWRHS is a CALL_EXPR that needs a cleanup, failure to do so
5711            will result in expand_expr expanding the call without knowing
5712            that it should run the cleanup.  */
5713         newrhs = save_expr (break_out_cleanups (newrhs));
5714           
5715       if (TREE_CODE (newrhs) == COND_EXPR)
5716         rhs_addr = rationalize_conditional_expr (ADDR_EXPR, newrhs);
5717       else
5718         rhs_addr = build_unary_op (ADDR_EXPR, newrhs, 0);
5719
5720       result = tree_cons (NULL_TREE,
5721                           convert (build_reference_type (lhstype), lhs),
5722                           NULL_TREE);
5723
5724       if (! comptypes (TREE_TYPE (lhs_addr), TREE_TYPE (rhs_addr), 1))
5725         rhs_addr = convert_pointer_to (TREE_TYPE (TREE_TYPE (lhs_addr)), rhs_addr);
5726       {
5727         tree noncopied_parts = NULL_TREE;
5728
5729         if (TYPE_NONCOPIED_PARTS (lhstype) != 0)
5730           noncopied_parts = init_noncopied_parts (lhs,
5731                                                   TYPE_NONCOPIED_PARTS (lhstype));
5732         while (noncopied_parts != 0)
5733           {
5734             result = tree_cons (NULL_TREE,
5735                                 build_modify_expr (convert (ptr_type_node, TREE_VALUE (noncopied_parts)),
5736                                                    NOP_EXPR,
5737                                                    TREE_PURPOSE (noncopied_parts)),
5738                                 result);
5739             noncopied_parts = TREE_CHAIN (noncopied_parts);
5740           }
5741       }
5742       /* Once we have our hands on an address, we must change NEWRHS
5743          to work from there.  Otherwise we can get multiple evaluations
5744          of NEWRHS.  */
5745       if (TREE_CODE (newrhs) != SAVE_EXPR)
5746         newrhs = build_indirect_ref (rhs_addr, NULL_PTR);
5747
5748       while (vbases)
5749         {
5750           tree elt_lhs = convert_pointer_to (vbases, lhs_addr);
5751           tree elt_rhs = convert_pointer_to (vbases, rhs_addr);
5752           result
5753             = tree_cons (NULL_TREE,
5754                          build_modify_expr_1 (build_indirect_ref (elt_lhs, NULL_PTR),
5755                                               modifycode,
5756                                               build_indirect_ref (elt_rhs, NULL_PTR),
5757                                               TYPE_BINFO (lhstype)),
5758                          result);
5759           if (TREE_VALUE (result) == error_mark_node)
5760             return error_mark_node;
5761           vbases = TREE_CHAIN (vbases);
5762         }
5763       result = tree_cons (NULL_TREE,
5764                           build_modify_expr_1 (lhs,
5765                                                modifycode,
5766                                                newrhs,
5767                                                TYPE_BINFO (lhstype)),
5768                           result);
5769       return build_compound_expr (result);
5770 #endif
5771     }
5772
5773   /* Convert new value to destination type.  */
5774
5775   if (TREE_CODE (lhstype) == ARRAY_TYPE)
5776     {
5777       /* Allow array assignment in compiler-generated code.  */
5778       if ((pedantic || flag_ansi)
5779           && ! DECL_ARTIFICIAL (current_function_decl))
5780         pedwarn ("ANSI C++ forbids assignment between arrays");
5781
5782       /* Have to wrap this in RTL_EXPR for two cases:
5783          in base or member initialization and if we
5784          are a branch of a ?: operator.  Since we
5785          can't easily know the latter, just do it always.  */
5786
5787       result = make_node (RTL_EXPR);
5788
5789       TREE_TYPE (result) = void_type_node;
5790       do_pending_stack_adjust ();
5791       start_sequence_for_rtl_expr (result);
5792
5793       /* As a matter of principle, `start_sequence' should do this.  */
5794       emit_note (0, -1);
5795
5796       expand_vec_init (lhs, lhs, array_type_nelts (lhstype), newrhs,
5797                        1 + (modifycode != INIT_EXPR));
5798
5799       do_pending_stack_adjust ();
5800
5801       TREE_SIDE_EFFECTS (result) = 1;
5802       RTL_EXPR_SEQUENCE (result) = get_insns ();
5803       RTL_EXPR_RTL (result) = const0_rtx;
5804       end_sequence ();
5805       return result;
5806     }
5807
5808   if (modifycode == INIT_EXPR)
5809     {
5810       newrhs = convert_for_initialization (lhs, lhstype, newrhs, LOOKUP_NORMAL,
5811                                            "assignment", NULL_TREE, 0);
5812       if (lhs == DECL_RESULT (current_function_decl))
5813         {
5814           if (DECL_INITIAL (lhs))
5815             warning ("return value from function receives multiple initializations");
5816           DECL_INITIAL (lhs) = newrhs;
5817         }
5818     }
5819   else
5820     {
5821       if (IS_AGGR_TYPE (lhstype))
5822         {
5823           if (result = build_opfncall (MODIFY_EXPR,
5824                                        LOOKUP_NORMAL, lhs, newrhs,
5825                                        make_node (NOP_EXPR)))
5826             return result;
5827         }
5828       /* Avoid warnings on enum bit fields. */
5829       if (TREE_CODE (olhstype) == ENUMERAL_TYPE
5830           && TREE_CODE (lhstype) == INTEGER_TYPE)
5831         {
5832           newrhs = convert_for_assignment (olhstype, newrhs, "assignment",
5833                                            NULL_TREE, 0);
5834           newrhs = convert_force (lhstype, newrhs);
5835         }
5836       else
5837         newrhs = convert_for_assignment (lhstype, newrhs, "assignment",
5838                                        NULL_TREE, 0);
5839       if (flag_elide_constructors == 0
5840           && TREE_CODE (newrhs) == CALL_EXPR
5841           && TREE_ADDRESSABLE (lhstype))
5842         {
5843           /* Can't initialized directly from a CALL_EXPR, since
5844              we don't know about what doesn't alias what.  */
5845
5846           tree temp = get_temp_name (lhstype, 0);
5847           newrhs = build (COMPOUND_EXPR, lhstype,
5848                           build_modify_expr (temp, INIT_EXPR, newrhs),
5849                           temp);
5850         }
5851     }
5852
5853   if (TREE_CODE (newrhs) == ERROR_MARK)
5854     return error_mark_node;
5855
5856   if (TREE_CODE (newrhs) == COND_EXPR)
5857     {
5858       tree lhs1;
5859       tree cond = TREE_OPERAND (newrhs, 0);
5860
5861       if (TREE_SIDE_EFFECTS (lhs))
5862         cond = build_compound_expr (tree_cons
5863                                     (NULL_TREE, lhs,
5864                                      build_tree_list (NULL_TREE, cond)));
5865
5866       /* Cannot have two identical lhs on this one tree (result) as preexpand
5867          calls will rip them out and fill in RTL for them, but when the
5868          rtl is generated, the calls will only be in the first side of the
5869          condition, not on both, or before the conditional jump! (mrs) */
5870       lhs1 = break_out_calls (lhs);
5871
5872       if (lhs == lhs1)
5873         /* If there's no change, the COND_EXPR behaves like any other rhs.  */
5874         result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
5875                         lhstype, lhs, newrhs);
5876       else
5877         {
5878           tree result_type = TREE_TYPE (newrhs);
5879           /* We have to convert each arm to the proper type because the
5880              types may have been munged by constant folding.  */
5881           result
5882             = build (COND_EXPR, result_type, cond,
5883                      build_modify_expr (lhs, modifycode,
5884                                         convert (result_type,
5885                                                  TREE_OPERAND (newrhs, 1))),
5886                      build_modify_expr (lhs1, modifycode,
5887                                         convert (result_type,
5888                                                  TREE_OPERAND (newrhs, 2))));
5889         }
5890     }
5891   else if (modifycode != INIT_EXPR && TREE_CODE (newrhs) == WITH_CLEANUP_EXPR)
5892     {
5893       tree cleanup = TREE_OPERAND (newrhs, 2);
5894       tree slot;
5895
5896       /* Finish up by running cleanups and having the "value" of the lhs.  */
5897       tree exprlist = tree_cons (NULL_TREE, cleanup,
5898                                  build_tree_list (NULL_TREE, lhs));
5899       newrhs = TREE_OPERAND (newrhs, 0);
5900       if (TREE_CODE (newrhs) == TARGET_EXPR)
5901           slot = TREE_OPERAND (newrhs, 0);
5902       else if (TREE_CODE (newrhs) == ADDR_EXPR)
5903         {
5904           /* Bad but legal.  */
5905           slot = newrhs;
5906           warning ("address taken of temporary object");
5907         }
5908       else
5909         my_friendly_abort (118);
5910
5911       /* Copy the value computed in SLOT into LHS.  */
5912       exprlist = tree_cons (NULL_TREE,
5913                             build_modify_expr (lhs, modifycode, slot),
5914                             exprlist);
5915       /* Evaluate the expression that needs CLEANUP.  This will
5916          compute the value into SLOT.  */
5917       exprlist = tree_cons (NULL_TREE, newrhs, exprlist);
5918       result = convert (lhstype, build_compound_expr (exprlist));
5919     }
5920   else
5921     result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
5922                     lhstype, lhs, newrhs);
5923   TREE_SIDE_EFFECTS (result) = 1;
5924
5925   /* If we got the LHS in a different type for storing in,
5926      convert the result back to the nominal type of LHS
5927      so that the value we return always has the same type
5928      as the LHS argument.  */
5929
5930   if (olhstype == TREE_TYPE (result))
5931     return result;
5932   /* Avoid warnings converting integral types back into enums
5933      for enum bit fields. */
5934   if (TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
5935       && TREE_CODE (olhstype) == ENUMERAL_TYPE)
5936     return convert_force (olhstype, result);
5937   return convert_for_assignment (olhstype, result, "assignment",
5938                                  NULL_TREE, 0);
5939 }
5940
5941
5942 /* Return 0 if EXP is not a valid lvalue in this language
5943    even though `lvalue_or_else' would accept it.  */
5944
5945 int
5946 language_lvalue_valid (exp)
5947      tree exp;
5948 {
5949   return 1;
5950 }
5951 \f
5952 /* Get differnce in deltas for different pointer to member function
5953    types.  Return inetger_zero_node, if FROM cannot be converted to a
5954    TO type.  If FORCE is true, then allow reverse conversions as well.  */
5955 static tree
5956 get_delta_difference (from, to, force)
5957      tree from, to;
5958      int force;
5959 {
5960   tree delta = integer_zero_node;
5961   tree binfo;
5962   
5963   if (to == from)
5964     return delta;
5965
5966   /* Should get_base_distance here, so we can check if any thing along the
5967      path is virtual, and we need to make sure we stay
5968      inside the real binfos when going through virtual bases.
5969      Maybe we should replace virtual bases with
5970      binfo_member (...CLASSTYPE_VBASECLASSES...)...  (mrs) */
5971   binfo = get_binfo (from, to, 1);
5972   if (binfo == error_mark_node)
5973     {
5974       error ("   in pointer to member function conversion");
5975       return delta;
5976     }
5977   if (binfo == 0)
5978     {
5979       if (!force)
5980         {
5981           error_not_base_type (from, to);
5982           error ("   in pointer to member function conversion");
5983           return delta;
5984         }
5985       binfo = get_binfo (to, from, 1);
5986       if (binfo == error_mark_node)
5987         {
5988           error ("   in pointer to member function conversion");
5989           return delta;
5990         }
5991       if (binfo == 0)
5992         {
5993           error ("cannot convert pointer to member of type %T to unrelated pointer to member of type %T", from, to);
5994           return delta;
5995         }
5996       if (TREE_VIA_VIRTUAL (binfo))
5997         {
5998           warning ("pointer to member conversion to virtual base class will only work if your very careful");
5999         }
6000       return fold (size_binop (MINUS_EXPR,
6001                                integer_zero_node,
6002                                BINFO_OFFSET (binfo)));
6003     }
6004   if (TREE_VIA_VIRTUAL (binfo))
6005     {
6006       warning ("pointer to member conversion from virtual base class will only work if your very careful");
6007     }
6008   return BINFO_OFFSET (binfo);
6009 }
6010
6011 /* Build a constructor for a pointer to member function.  It can be
6012    used to initialize global variables, local variable, or used
6013    as a value in expressions.  TYPE is the POINTER to METHOD_TYPE we
6014    want to be.
6015
6016    If FORCE is non-zero, then force this conversion, even if
6017    we would rather not do it.  Usually set when using an explicit
6018    cast.
6019
6020    Return error_mark_node, if something goes wrong.  */
6021
6022 tree
6023 build_ptrmemfunc (type, pfn, force)
6024      tree type, pfn;
6025      int force;
6026 {
6027   tree index = integer_zero_node;
6028   tree delta = integer_zero_node;
6029   tree delta2 = integer_zero_node;
6030   tree vfield_offset;
6031   tree npfn;
6032   tree u;
6033
6034   /* Handle multiple conversions of pointer to member fucntions. */
6035   if (TYPE_PTRMEMFUNC_P (TREE_TYPE (pfn)))
6036     {
6037       tree ndelta, ndelta2, nindex;
6038       /* Is is already the right type? */
6039 #if 0
6040       /* Sorry, can't do this, the backend is too stupid. */
6041       if (TYPE_METHOD_BASETYPE (TREE_TYPE (type))
6042           == TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (pfn)))))
6043         {
6044           if (type != TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (pfn)))
6045             {
6046               npfn = build1 (NOP_EXPR, TYPE_GET_PTRMEMFUNC_TYPE (type), pfn);
6047               TREE_CONSTANT (npfn) = TREE_CONSTANT (pfn);
6048             }
6049           return pfn;
6050         }
6051 #else
6052       if (type == TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (pfn)))
6053         return pfn;
6054 #endif
6055
6056       if (TREE_CODE (pfn) != CONSTRUCTOR)
6057         {
6058           tree e1, e2, e3;
6059           ndelta = convert (sizetype, build_component_ref (pfn, delta_identifier, 0, 0));
6060           ndelta2 = convert (sizetype, DELTA2_FROM_PTRMEMFUNC (pfn));
6061           index = build_component_ref (pfn, index_identifier, 0, 0);
6062           delta = get_delta_difference (TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (pfn)))),
6063                                         TYPE_METHOD_BASETYPE (TREE_TYPE (type)),
6064                                         force);
6065           delta = fold (size_binop (PLUS_EXPR, delta, ndelta));
6066           delta2 = fold (size_binop (PLUS_EXPR, ndelta2, delta2));
6067           e1 = fold (build (GT_EXPR, integer_type_node, index, integer_zero_node));
6068           
6069           u = build_nt (CONSTRUCTOR, 0, tree_cons (delta2_identifier, delta2, NULL_TREE));
6070           u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, delta,
6071                                                    tree_cons (NULL_TREE, index,
6072                                                               tree_cons (NULL_TREE, u, NULL_TREE))));
6073           e2 = digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0);
6074
6075           pfn = PFN_FROM_PTRMEMFUNC (pfn);
6076           npfn = build1 (NOP_EXPR, type, pfn);
6077           TREE_CONSTANT (npfn) = TREE_CONSTANT (pfn);
6078
6079           u = build_nt (CONSTRUCTOR, 0, tree_cons (pfn_identifier, npfn, NULL_TREE));
6080           u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, delta,
6081                                                    tree_cons (NULL_TREE, index,
6082                                                               tree_cons (NULL_TREE, u, NULL_TREE))));
6083           e3 = digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0);
6084           return build_conditional_expr (e1, e2, e3);
6085         }
6086
6087       ndelta = TREE_VALUE (CONSTRUCTOR_ELTS (pfn));
6088       nindex = TREE_VALUE (TREE_CHAIN (CONSTRUCTOR_ELTS (pfn)));
6089       npfn = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (pfn))));
6090       npfn = TREE_VALUE (CONSTRUCTOR_ELTS (npfn));
6091       if (integer_zerop (nindex))
6092         pfn = integer_zero_node;
6093       else
6094         {
6095           sorry ("value casting of varible nonnull pointer to member functions not supported");
6096           return error_mark_node;
6097         }
6098     }
6099
6100   /* Handle null pointer to member function conversions. */
6101   if (integer_zerop (pfn))
6102     {
6103       pfn = build_c_cast (type, integer_zero_node);
6104       u = build_nt (CONSTRUCTOR, 0, tree_cons (pfn_identifier, pfn, NULL_TREE));
6105       u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, integer_zero_node,
6106                                                tree_cons (NULL_TREE, integer_zero_node,
6107                                                           tree_cons (NULL_TREE, u, NULL_TREE))));
6108       return digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0);
6109     }
6110
6111   if (TREE_CODE (pfn) == TREE_LIST)
6112     {
6113       pfn = instantiate_type (type, pfn, 1);
6114       if (pfn == error_mark_node)
6115         return error_mark_node;
6116       pfn = build_unary_op (ADDR_EXPR, pfn, 0);
6117     }
6118
6119   /* Allow pointer to member conversions here. */
6120   delta = get_delta_difference (TYPE_METHOD_BASETYPE (TREE_TYPE (TREE_TYPE (pfn))),
6121                                 TYPE_METHOD_BASETYPE (TREE_TYPE (type)),
6122                                 force);
6123   delta2 = fold (size_binop (PLUS_EXPR, delta2, delta));
6124
6125   if (TREE_CODE (TREE_OPERAND (pfn, 0)) != FUNCTION_DECL)
6126     warning ("assuming pointer to member function is non-virtual");
6127
6128   if (TREE_CODE (TREE_OPERAND (pfn, 0)) == FUNCTION_DECL
6129       && DECL_VINDEX (TREE_OPERAND (pfn, 0)))
6130     {
6131       /* Find the offset to the vfield pointer in the object. */
6132       vfield_offset = get_binfo (DECL_CONTEXT (TREE_OPERAND (pfn, 0)),
6133                                  DECL_CLASS_CONTEXT (TREE_OPERAND (pfn, 0)),
6134                                  0);
6135       vfield_offset = get_vfield_offset (vfield_offset);
6136       delta2 = size_binop (PLUS_EXPR, vfield_offset, delta2);
6137
6138       /* Map everything down one to make room for the null pointer to member.  */
6139       index = size_binop (PLUS_EXPR,
6140                           DECL_VINDEX (TREE_OPERAND (pfn, 0)),
6141                           integer_one_node);
6142       u = build_nt (CONSTRUCTOR, 0, tree_cons (delta2_identifier, delta2, NULL_TREE));
6143     }
6144   else
6145     {
6146       index = fold (size_binop (MINUS_EXPR, integer_zero_node, integer_one_node));
6147
6148       npfn = build1 (NOP_EXPR, type, pfn);
6149       TREE_CONSTANT (npfn) = TREE_CONSTANT (pfn);
6150
6151       u = build_nt (CONSTRUCTOR, 0, tree_cons (pfn_identifier, npfn, NULL_TREE));
6152     }
6153
6154   u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, delta,
6155                                            tree_cons (NULL_TREE, index,
6156                                                       tree_cons (NULL_TREE, u, NULL_TREE))));
6157   return digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0);
6158 }
6159
6160 /* Convert value RHS to type TYPE as preparation for an assignment
6161    to an lvalue of type TYPE.
6162    The real work of conversion is done by `convert'.
6163    The purpose of this function is to generate error messages
6164    for assignments that are not allowed in C.
6165    ERRTYPE is a string to use in error messages:
6166    "assignment", "return", etc.
6167
6168    C++: attempts to allow `convert' to find conversions involving
6169    implicit type conversion between aggregate and scalar types
6170    as per 8.5.6 of C++ manual.  Does not randomly dereference
6171    pointers to aggregates!  */
6172
6173 static tree
6174 convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
6175      tree type, rhs;
6176      char *errtype;
6177      tree fndecl;
6178      int parmnum;
6179 {
6180   register enum tree_code codel = TREE_CODE (type);
6181   register tree rhstype;
6182   register enum tree_code coder = TREE_CODE (TREE_TYPE (rhs));
6183
6184   if (coder == UNKNOWN_TYPE)
6185     rhs = instantiate_type (type, rhs, 1);
6186
6187   if (coder == ERROR_MARK)
6188     return error_mark_node;
6189
6190   if (codel == OFFSET_TYPE)
6191     {
6192       type = TREE_TYPE (type);
6193       codel = TREE_CODE (type);
6194     }
6195
6196   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
6197   if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
6198     rhs = TREE_OPERAND (rhs, 0);
6199
6200   if (rhs == error_mark_node)
6201     return error_mark_node;
6202
6203   if (TREE_VALUE (rhs) == error_mark_node)
6204     return error_mark_node;
6205
6206   if (TREE_CODE (TREE_TYPE (rhs)) == OFFSET_TYPE)
6207     {
6208       rhs = resolve_offset_ref (rhs);
6209       if (rhs == error_mark_node)
6210         return error_mark_node;
6211       rhstype = TREE_TYPE (rhs);
6212       coder = TREE_CODE (rhstype);
6213     }
6214
6215   if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
6216       || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
6217       || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
6218     rhs = default_conversion (rhs);
6219   else if (TREE_CODE (TREE_TYPE (rhs)) == REFERENCE_TYPE)
6220     rhs = convert_from_reference (rhs);
6221
6222   rhstype = TREE_TYPE (rhs);
6223   coder = TREE_CODE (rhstype);
6224
6225   /* This should no longer change types on us.  */
6226   if (TREE_CODE (rhs) == CONST_DECL)
6227     rhs = DECL_INITIAL (rhs);
6228   else if (TREE_READONLY_DECL_P (rhs))
6229     rhs = decl_constant_value (rhs);
6230
6231   if (type == rhstype)
6232     {
6233       overflow_warning (rhs);
6234       return rhs;
6235     }
6236
6237   if (coder == VOID_TYPE)
6238     {
6239       error ("void value not ignored as it ought to be");
6240       return error_mark_node;
6241     }
6242   /* Arithmetic types all interconvert.  */
6243   if ((codel == INTEGER_TYPE || codel == REAL_TYPE || codel == BOOLEAN_TYPE)
6244        && (coder == INTEGER_TYPE || coder == REAL_TYPE || coder == BOOLEAN_TYPE))
6245     {
6246       /* But we should warn if assigning REAL_TYPE to INTEGER_TYPE.  */
6247       if (coder == REAL_TYPE && codel == INTEGER_TYPE)
6248         {
6249           if (fndecl)
6250             cp_warning ("`%T' used for argument %P of `%D'",
6251                         rhstype, parmnum, fndecl);
6252           else
6253             cp_warning ("%s to `%T' from `%T'", errtype, type, rhstype);
6254         }
6255       /* And we should warn if assigning a negative value to
6256          an unsigned variable.  */
6257       else if (TREE_UNSIGNED (type) && codel != BOOLEAN_TYPE)
6258         {
6259           if (TREE_CODE (rhs) == INTEGER_CST
6260               && TREE_NEGATED_INT (rhs))
6261             {
6262               if (fndecl)
6263                 cp_warning ("negative value `%E' passed as argument %P of `%D'",
6264                             rhs, parmnum, fndecl);
6265               else
6266                 cp_warning ("%s of negative value `%E' to `%T'",
6267                             errtype, rhs, type);
6268             }
6269           overflow_warning (rhs);
6270           if (TREE_CONSTANT (rhs))
6271             rhs = fold (rhs);
6272         }
6273
6274       return convert_and_check (type, rhs);
6275     }
6276   /* Conversions involving enums.  */
6277   else if ((codel == ENUMERAL_TYPE
6278             && (coder == ENUMERAL_TYPE || coder == INTEGER_TYPE || coder == REAL_TYPE))
6279            || (coder == ENUMERAL_TYPE
6280                && (codel == ENUMERAL_TYPE || codel == INTEGER_TYPE || codel == REAL_TYPE)))
6281     {
6282       return convert (type, rhs);
6283     }
6284   /* Conversions among pointers */
6285   else if (codel == POINTER_TYPE
6286            && (coder == POINTER_TYPE
6287                || (coder == RECORD_TYPE
6288                    && (IS_SIGNATURE_POINTER (rhstype)
6289                        || IS_SIGNATURE_REFERENCE (rhstype)))))
6290     {
6291       register tree ttl = TREE_TYPE (type);
6292       register tree ttr;
6293
6294       if (coder == RECORD_TYPE)
6295         {
6296           rhs = build_optr_ref (rhs);
6297           rhstype = TREE_TYPE (rhs);
6298         }
6299       ttr = TREE_TYPE (rhstype);
6300
6301       /* If both pointers are of aggregate type, then we
6302          can give better error messages, and save some work
6303          as well.  */
6304       if (TREE_CODE (ttl) == RECORD_TYPE && TREE_CODE (ttr) == RECORD_TYPE)
6305         {
6306           tree binfo;
6307
6308           if (TYPE_MAIN_VARIANT (ttl) == TYPE_MAIN_VARIANT (ttr)
6309               || type == class_star_type_node
6310               || rhstype == class_star_type_node)
6311             binfo = TYPE_BINFO (ttl);
6312           else
6313             binfo = get_binfo (ttl, ttr, 1);
6314
6315           if (binfo == error_mark_node)
6316             return error_mark_node;
6317           if (binfo == 0)
6318             return error_not_base_type (ttl, ttr);
6319
6320           if (! TYPE_READONLY (ttl) && TYPE_READONLY (ttr))
6321             {
6322               if (fndecl)
6323                 cp_pedwarn ("passing `%T' as argument %P of `%D' discards const",
6324                             rhstype, parmnum, fndecl);
6325               else
6326                 cp_pedwarn ("%s to `%T' from `%T' discards const",
6327                             errtype, type, rhstype);
6328             }
6329           if (! TYPE_VOLATILE (ttl) && TYPE_VOLATILE (ttr))
6330             {
6331               if (fndecl)
6332                 cp_pedwarn ("passing `%T' as argument %P of `%D' discards volatile",
6333                             rhstype, parmnum, fndecl);
6334               else
6335                 cp_pedwarn ("%s to `%T' from `%T' discards volatile",
6336                             errtype, type, rhstype);
6337             }
6338         }
6339
6340       /* Any non-function converts to a [const][volatile] void *
6341          and vice versa; otherwise, targets must be the same.
6342          Meanwhile, the lhs target must have all the qualifiers of the rhs.  */
6343       else if (TYPE_MAIN_VARIANT (ttl) == void_type_node
6344                || TYPE_MAIN_VARIANT (ttr) == void_type_node
6345                || comp_target_types (type, rhstype, 1)
6346                || (unsigned_type (TYPE_MAIN_VARIANT (ttl))
6347                    == unsigned_type (TYPE_MAIN_VARIANT (ttr))))
6348         {
6349           /* ARM $4.8, commentary on p39.  */
6350           if (TYPE_MAIN_VARIANT (ttl) == void_type_node
6351               && TREE_CODE (ttr) == OFFSET_TYPE)
6352             {
6353               error ("no standard conversion from pointer to member to `void *'");
6354               return error_mark_node;
6355             }
6356
6357           if (TYPE_MAIN_VARIANT (ttl) != void_type_node
6358               && TYPE_MAIN_VARIANT (ttr) == void_type_node
6359               && rhs != null_pointer_node)
6360             {
6361               if (coder == RECORD_TYPE)
6362                 pedwarn ("implicit conversion of signature pointer to type `%s'",
6363                          type_as_string (type, 0));
6364               else
6365                 pedwarn ("ANSI C++ forbids implicit conversion from `void *' in %s",
6366                          errtype);
6367             }
6368           /* Const and volatile mean something different for function types,
6369              so the usual warnings are not appropriate.  */
6370           else if ((TREE_CODE (ttr) != FUNCTION_TYPE && TREE_CODE (ttr) != METHOD_TYPE)
6371                    || (TREE_CODE (ttl) != FUNCTION_TYPE && TREE_CODE (ttl) != METHOD_TYPE))
6372             {
6373               if (TREE_CODE (ttl) == OFFSET_TYPE
6374                   && binfo_member (TYPE_OFFSET_BASETYPE (ttr),
6375                                    CLASSTYPE_VBASECLASSES (TYPE_OFFSET_BASETYPE (ttl))))
6376                 {
6377                   sorry ("%s between pointer to members converting across virtual baseclasses", errtype);
6378                   return error_mark_node;
6379                 }
6380               else if (! TYPE_READONLY (ttl) && TYPE_READONLY (ttr))
6381                 {
6382                   if (fndecl)
6383                     cp_pedwarn ("passing `%T' as argument %P of `%D' discards const",
6384                                 rhstype, parmnum, fndecl);
6385                   else
6386                     cp_pedwarn ("%s to `%T' from `%T' discards const",
6387                                 errtype, type, rhstype);
6388                 }
6389               else if (! TYPE_VOLATILE (ttl) && TYPE_VOLATILE (ttr))
6390                 {
6391                   if (fndecl)
6392                     cp_pedwarn ("passing `%T' as argument %P of `%D' discards volatile",
6393                                 rhstype, parmnum, fndecl);
6394                   else
6395                     cp_pedwarn ("%s to `%T' from `%T' discards volatile",
6396                                 errtype, type, rhstype);
6397                 }
6398               else if (TREE_CODE (ttl) == TREE_CODE (ttr)
6399                        && ! comp_target_types (type, rhstype, 1))
6400                 {
6401                   if (fndecl)
6402                     cp_pedwarn ("passing `%T' as argument %P of `%D' changes signedness",
6403                                 rhstype, parmnum, fndecl);
6404                   else
6405                     cp_pedwarn ("%s to `%T' from `%T' changes signedness",
6406                                 errtype, type, rhstype);
6407                 }
6408             }
6409         }
6410       else if (TREE_CODE (ttr) == OFFSET_TYPE
6411                && TREE_CODE (ttl) != OFFSET_TYPE)
6412         {
6413           /* Normally, pointers to different type codes (other
6414              than void) are not compatible, but we perform
6415              some type instantiation if that resolves the
6416              ambiguity of (X Y::*) and (X *).  */
6417
6418           if (current_class_decl)
6419             {
6420               if (TREE_CODE (rhs) == INTEGER_CST)
6421                 {
6422                   rhs = build (PLUS_EXPR, build_pointer_type (TREE_TYPE (ttr)),
6423                                current_class_decl, rhs);
6424                   return convert_for_assignment (type, rhs,
6425                                                  errtype, fndecl, parmnum);
6426                 }
6427             }
6428           if (TREE_CODE (ttl) == METHOD_TYPE)
6429             error ("%s between pointer-to-method and pointer-to-member types",
6430                    errtype);
6431           else
6432             error ("%s between pointer and pointer-to-member types", errtype);
6433           return error_mark_node;
6434         }
6435       else
6436         {
6437           int add_quals = 0, const_parity = 0, volatile_parity = 0;
6438           int left_const = 1;
6439           int unsigned_parity;
6440           int nptrs = 0;
6441
6442           /* This code is basically a duplicate of comp_ptr_ttypes_real.  */
6443           for (; ; ttl = TREE_TYPE (ttl), ttr = TREE_TYPE (ttr))
6444             {
6445               nptrs -= 1;
6446               const_parity |= TYPE_READONLY (ttl) < TYPE_READONLY (ttr);
6447               volatile_parity |= TYPE_VOLATILE (ttl) < TYPE_VOLATILE (ttr);
6448
6449               if (! left_const
6450                   && (TYPE_READONLY (ttl) > TYPE_READONLY (ttr)
6451                       || TYPE_VOLATILE (ttl) > TYPE_VOLATILE (ttr)))
6452                 add_quals = 1;
6453               left_const &= TYPE_READONLY (ttl);
6454
6455               if (TREE_CODE (ttl) != POINTER_TYPE)
6456                 break;
6457             }
6458           unsigned_parity = TREE_UNSIGNED (ttl) - TREE_UNSIGNED (ttr);
6459           if (unsigned_parity)
6460             {
6461               if (TREE_UNSIGNED (ttl))
6462                 ttr = unsigned_type (ttr);
6463               else
6464                 ttl = unsigned_type (ttl);
6465             }
6466
6467           if (comp_target_types (ttl, ttr, nptrs))
6468             {
6469               if (add_quals)
6470                 {
6471                   if (fndecl)
6472                     cp_pedwarn ("passing `%T' as argument %P of `%D' adds cv-quals without intervening `const'",
6473                                 rhstype, parmnum, fndecl);
6474                   else
6475                     cp_pedwarn ("%s to `%T' from `%T' adds cv-quals without intervening `const'",
6476                                 errtype, type, rhstype);
6477                 }
6478               if (const_parity)
6479                 {
6480                   if (fndecl)
6481                     cp_pedwarn ("passing `%T' as argument %P of `%D' discards const",
6482                                 rhstype, parmnum, fndecl);
6483                   else
6484                     cp_pedwarn ("%s to `%T' from `%T' discards const",
6485                                 errtype, type, rhstype);
6486                 }
6487               if (volatile_parity)
6488                 {
6489                   if (fndecl)
6490                     cp_pedwarn ("passing `%T' as argument %P of `%D' discards volatile",
6491                                 rhstype, parmnum, fndecl);
6492                   else
6493                     cp_pedwarn ("%s to `%T' from `%T' discards volatile",
6494                                 errtype, type, rhstype);
6495                 }
6496               if (unsigned_parity > 0)
6497                 {
6498                   if (fndecl)
6499                     cp_pedwarn ("passing `%T' as argument %P of `%D' changes signed to unsigned",
6500                                 rhstype, parmnum, fndecl);
6501                   else
6502                     cp_pedwarn ("%s to `%T' from `%T' changes signed to unsigned",
6503                                 errtype, type, rhstype);
6504                 }
6505               else if (unsigned_parity < 0)
6506                 {
6507                   if (fndecl)
6508                     cp_pedwarn ("passing `%T' as argument %P of `%D' changes unsigned to signed",
6509                                 rhstype, parmnum, fndecl);
6510                   else
6511                     cp_pedwarn ("%s to `%T' from `%T' changes unsigned to signed",
6512                                 errtype, type, rhstype);
6513                 }
6514
6515               /* C++ is not so friendly about converting function and
6516                  member function pointers as C.  Emit warnings here.  */
6517               if (TREE_CODE (ttl) == FUNCTION_TYPE
6518                   || TREE_CODE (ttl) == METHOD_TYPE)
6519                 if (! comptypes (ttl, ttr, 0))
6520                   {
6521                     warning ("conflicting function types in %s:", errtype);
6522                     cp_warning ("\t`%T' != `%T'", type, rhstype);
6523                   }
6524             }
6525           else if (TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
6526             {
6527               /* When does this happen?  */
6528               my_friendly_abort (119);
6529               /* Conversion of a pointer-to-member type to void *.  */
6530               rhs = build_unary_op (ADDR_EXPR, rhs, 0);
6531               TREE_TYPE (rhs) = type;
6532               return rhs;
6533             }
6534           else if (TREE_CODE (TREE_TYPE (rhs)) == OFFSET_TYPE)
6535             {
6536               /* When does this happen?  */
6537               my_friendly_abort (120);
6538               /* Conversion of a pointer-to-member type to void *.  */
6539               rhs = build_unary_op (ADDR_EXPR, rhs, 0);
6540               TREE_TYPE (rhs) = type;
6541               return rhs;
6542             }
6543           else
6544             {
6545               if (fndecl)
6546                 cp_error ("passing `%T' as argument %P of `%D'",
6547                           rhstype, parmnum, fndecl);
6548               else
6549                 cp_error ("%s to `%T' from `%T'", errtype, type, rhstype);
6550               return error_mark_node;
6551             }
6552         }
6553       return convert (type, rhs);
6554     }
6555   else if (codel == POINTER_TYPE && coder == INTEGER_TYPE)
6556     {
6557       /* An explicit constant 0 can convert to a pointer,
6558          but not a 0 that results from casting or folding.  */
6559       if (! (TREE_CODE (rhs) == INTEGER_CST && integer_zerop (rhs)))
6560         {
6561           if (fndecl)
6562             cp_pedwarn ("passing `%T' to argument %P of `%D' lacks a cast",
6563                         rhstype, parmnum, fndecl);
6564           else
6565             cp_pedwarn ("%s to `%T' from `%T' lacks a cast",
6566                         errtype, type, rhstype);
6567           return convert (type, rhs);
6568         }
6569       return null_pointer_node;
6570     }
6571   else if (codel == INTEGER_TYPE
6572            && (coder == POINTER_TYPE
6573                || (coder == RECORD_TYPE
6574                    && (IS_SIGNATURE_POINTER (rhstype)
6575                        || IS_SIGNATURE_REFERENCE (rhstype)))))
6576     {
6577       if (fndecl)
6578         cp_pedwarn ("passing `%T' to argument %P of `%D' lacks a cast",
6579                     rhstype, parmnum, fndecl);
6580       else
6581         cp_pedwarn ("%s to `%T' from `%T' lacks a cast",
6582                     errtype, type, rhstype);
6583       return convert (type, rhs);
6584     }
6585
6586   /* C++ */
6587   else if (((coder == POINTER_TYPE && TREE_CODE (rhs) == ADDR_EXPR
6588              && TREE_CODE (rhstype) == POINTER_TYPE
6589              && TREE_CODE (TREE_TYPE (rhstype)) == METHOD_TYPE)
6590             || integer_zerop (rhs)
6591             || TYPE_PTRMEMFUNC_P (TREE_TYPE (rhs)))
6592            && TYPE_PTRMEMFUNC_P (type))
6593     {
6594       /* compatible pointer to member functions. */
6595       return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), rhs, 0);
6596     }
6597   else if (codel == ERROR_MARK || coder == ERROR_MARK)
6598     return error_mark_node;
6599
6600   /* This should no longer happen.  References are initialized via
6601      `convert_for_initialization'.  They should otherwise be
6602      bashed before coming here.  */
6603   else if (codel == REFERENCE_TYPE)
6604     /* Force an abort.  */
6605     my_friendly_assert (codel != REFERENCE_TYPE, 317);
6606   else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (rhs)))
6607     {
6608       tree nrhs = build1 (NOP_EXPR, type, rhs);
6609       TREE_CONSTANT (nrhs) = TREE_CONSTANT (rhs);
6610       return nrhs;
6611     }
6612   else if (TYPE_HAS_CONSTRUCTOR (type) || IS_AGGR_TYPE (TREE_TYPE (rhs)))
6613     return convert (type, rhs);
6614
6615   cp_error ("%s to `%T' from `%T'", errtype, type, rhstype);
6616   return error_mark_node;
6617 }
6618
6619 /* Convert RHS to be of type TYPE.  If EXP is non-zero,
6620    it is the target of the initialization.
6621    ERRTYPE is a string to use in error messages.
6622
6623    Two major differences between the behavior of
6624    `convert_for_assignment' and `convert_for_initialization'
6625    are that references are bashed in the former, while
6626    copied in the latter, and aggregates are assigned in
6627    the former (operator=) while initialized in the
6628    latter (X(X&)).
6629
6630    If using constructor make sure no conversion operator exists, if one does
6631    exist, an ambiguity exists.  */
6632 tree
6633 convert_for_initialization (exp, type, rhs, flags, errtype, fndecl, parmnum)
6634      tree exp, type, rhs;
6635      int flags;
6636      char *errtype;
6637      tree fndecl;
6638      int parmnum;
6639 {
6640   register enum tree_code codel = TREE_CODE (type);
6641   register tree rhstype;
6642   register enum tree_code coder;
6643
6644   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
6645      Strip such NOP_EXPRs, since RHS is used in non-lvalue context.  */
6646   if (TREE_CODE (rhs) == NOP_EXPR
6647       && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))
6648       && codel != REFERENCE_TYPE)
6649     rhs = TREE_OPERAND (rhs, 0);
6650
6651   if (rhs == error_mark_node
6652       || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node))
6653     return error_mark_node;
6654
6655   if (TREE_CODE (TREE_TYPE (rhs)) == OFFSET_TYPE)
6656     {
6657       rhs = resolve_offset_ref (rhs);
6658       if (rhs == error_mark_node)
6659         return error_mark_node;
6660       rhstype = TREE_TYPE (rhs);
6661       coder = TREE_CODE (rhstype);
6662     }
6663
6664   if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
6665        && TREE_CODE (type) != ARRAY_TYPE && TREE_CODE (type) != REFERENCE_TYPE)
6666       || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
6667       || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
6668     rhs = default_conversion (rhs);
6669
6670   rhstype = TREE_TYPE (rhs);
6671   coder = TREE_CODE (rhstype);
6672
6673   if (coder == UNKNOWN_TYPE)
6674     {
6675       rhs = instantiate_type (type, rhs, 1);
6676       rhstype = TREE_TYPE (rhs);
6677       coder = TREE_CODE (rhstype);
6678     }
6679
6680   if (coder == ERROR_MARK)
6681     return error_mark_node;
6682
6683 #if 0
6684   /* This is *not* the quick way out!  It is the way to disaster.  */
6685   if (type == rhstype)
6686     goto converted;
6687 #endif
6688
6689   /* We accept references to incomplete types, so we can
6690      return here before checking if RHS is of complete type.  */
6691      
6692   if (codel == REFERENCE_TYPE)
6693     {
6694       /* This should eventually happen in convert_arguments.  */
6695       extern int warningcount, errorcount;
6696       int savew, savee;
6697
6698       if (fndecl)
6699         savew = warningcount, savee = errorcount;
6700       rhs = convert_to_reference (type, rhs, CONV_IMPLICIT, flags,
6701                                   exp ? exp : error_mark_node);
6702       if (fndecl)
6703         {
6704           if (warningcount > savew)
6705             cp_warning_at ("in passing argument %P of `%+D'", parmnum, fndecl);
6706           else if (errorcount > savee)
6707             cp_error_at ("in passing argument %P of `%+D'", parmnum, fndecl);
6708         }
6709       return rhs;
6710     }      
6711
6712   rhs = require_complete_type (rhs);
6713   if (rhs == error_mark_node)
6714     return error_mark_node;
6715
6716   if (exp != 0) exp = require_complete_type (exp);
6717   if (exp == error_mark_node)
6718     return error_mark_node;
6719
6720   if (TREE_CODE (rhstype) == REFERENCE_TYPE)
6721     rhstype = TREE_TYPE (rhstype);
6722
6723   if (TYPE_LANG_SPECIFIC (type)
6724       && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type)))
6725     return build_signature_pointer_constructor (type, rhs);
6726
6727   if (IS_AGGR_TYPE (type) && TYPE_NEEDS_CONSTRUCTING (type))
6728     {
6729       if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype))
6730         {
6731           /* This is sufficient to perform initialization.  No need,
6732              apparently, to go through X(X&) to do first-cut
6733              initialization.  Return through a TARGET_EXPR so that we get
6734              cleanups if it is used.  */
6735           if (TREE_CODE (rhs) == CALL_EXPR)
6736             {
6737               rhs = build_cplus_new (type, rhs, 0);
6738               return rhs;
6739             }
6740           /* Handle the case of default parameter initialization and
6741              initialization of static variables.  */
6742           else if (TREE_CODE (rhs) == INDIRECT_REF && TREE_HAS_CONSTRUCTOR (rhs))
6743             {
6744               my_friendly_assert (TREE_CODE (TREE_OPERAND (rhs, 0)) == CALL_EXPR, 318);
6745               if (exp)
6746                 {
6747                   my_friendly_assert (TREE_VALUE (TREE_OPERAND (TREE_OPERAND (rhs, 0), 1)) == NULL_TREE, 316);
6748                   TREE_VALUE (TREE_OPERAND (TREE_OPERAND (rhs, 0), 1))
6749                     = build_unary_op (ADDR_EXPR, exp, 0);
6750                 }
6751               else
6752                 rhs = build_cplus_new (type, TREE_OPERAND (rhs, 0), 0);
6753               return rhs;
6754             }
6755         }
6756       if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype)
6757           || (IS_AGGR_TYPE (rhstype) && UNIQUELY_DERIVED_FROM_P (type, rhstype)))
6758         {
6759           if (TYPE_HAS_INIT_REF (type))
6760             {
6761               tree init = build_method_call (exp, constructor_name_full (type),
6762                                              build_tree_list (NULL_TREE, rhs),
6763                                              TYPE_BINFO (type), LOOKUP_NORMAL);
6764
6765               if (init == error_mark_node)
6766                 return error_mark_node;
6767
6768               if (exp == 0)
6769                 {
6770                   exp = build_cplus_new (type, init, 0);
6771                   return exp;
6772                 }
6773
6774               return build (COMPOUND_EXPR, type, init, exp);
6775             }
6776
6777           /* ??? The following warnings are turned off because
6778              this is another place where the default X(X&) constructor
6779              is implemented.  */
6780           if (TYPE_HAS_ASSIGNMENT (type))
6781             cp_warning ("bitwise copy: `%T' defines operator=", type);
6782
6783           if (TREE_CODE (TREE_TYPE (rhs)) == REFERENCE_TYPE)
6784             rhs = convert_from_reference (rhs);
6785           if (type != rhstype)
6786             {
6787               tree nrhs = build1 (NOP_EXPR, type, rhs);
6788               TREE_CONSTANT (nrhs) = TREE_CONSTANT (rhs);
6789               rhs = nrhs;
6790             }
6791           return rhs;
6792         }
6793
6794       return convert (type, rhs);
6795     }
6796
6797   if (type == TREE_TYPE (rhs))
6798     {
6799       if (TREE_READONLY_DECL_P (rhs))
6800         rhs = decl_constant_value (rhs);
6801       return rhs;
6802     }
6803
6804   return convert_for_assignment (type, rhs, errtype, fndecl, parmnum);
6805 }
6806 \f
6807 /* Expand an ASM statement with operands, handling output operands
6808    that are not variables or INDIRECT_REFS by transforming such
6809    cases into cases that expand_asm_operands can handle.
6810
6811    Arguments are same as for expand_asm_operands.
6812
6813    We don't do default conversions on all inputs, because it can screw
6814    up operands that are expected to be in memory.  */
6815
6816 void
6817 c_expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
6818      tree string, outputs, inputs, clobbers;
6819      int vol;
6820      char *filename;
6821      int line;
6822 {
6823   int noutputs = list_length (outputs);
6824   register int i;
6825   /* o[I] is the place that output number I should be written.  */
6826   register tree *o = (tree *) alloca (noutputs * sizeof (tree));
6827   register tree tail;
6828
6829   /* Record the contents of OUTPUTS before it is modified.  */
6830   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
6831     o[i] = TREE_VALUE (tail);
6832
6833   /* Generate the ASM_OPERANDS insn;
6834      store into the TREE_VALUEs of OUTPUTS some trees for
6835      where the values were actually stored.  */
6836   expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line);
6837
6838   /* Copy all the intermediate outputs into the specified outputs.  */
6839   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
6840     {
6841       if (o[i] != TREE_VALUE (tail))
6842         {
6843           expand_expr (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail)),
6844                        const0_rtx, VOIDmode, 0);
6845           free_temp_slots ();
6846         }
6847       /* Detect modification of read-only values.
6848          (Otherwise done by build_modify_expr.)  */
6849       else
6850         {
6851           tree type = TREE_TYPE (o[i]);
6852           if (TYPE_READONLY (type)
6853               || ((TREE_CODE (type) == RECORD_TYPE
6854                    || TREE_CODE (type) == UNION_TYPE)
6855                   && C_TYPE_FIELDS_READONLY (type)))
6856             readonly_error (o[i], "modification by `asm'", 1);
6857         }
6858     }
6859
6860   /* Those MODIFY_EXPRs could do autoincrements.  */
6861   emit_queue ();
6862 }
6863 \f
6864 /* Expand a C `return' statement.
6865    RETVAL is the expression for what to return,
6866    or a null pointer for `return;' with no value.
6867
6868    C++: upon seeing a `return', we must call destructors on all
6869    variables in scope which had constructors called on them.
6870    This means that if in a destructor, the base class destructors
6871    must be called before returning.
6872
6873    The RETURN statement in C++ has initialization semantics.  */
6874
6875 void
6876 c_expand_return (retval)
6877      tree retval;
6878 {
6879   extern struct nesting *cond_stack, *loop_stack, *case_stack;
6880   extern tree dtor_label, ctor_label;
6881   tree result = DECL_RESULT (current_function_decl);
6882   tree valtype = TREE_TYPE (result);
6883   register int use_temp = 0;
6884   int returns_value = 1;
6885
6886   if (TREE_THIS_VOLATILE (current_function_decl))
6887     warning ("function declared `noreturn' has a `return' statement");
6888
6889   if (retval == error_mark_node)
6890     {
6891       current_function_returns_null = 1;
6892       return;
6893     }
6894
6895   if (retval == NULL_TREE)
6896     {
6897       /* A non-named return value does not count.  */
6898
6899       /* Can't just return from a destructor.  */
6900       if (dtor_label)
6901         {
6902           expand_goto (dtor_label);
6903           return;
6904         }
6905
6906       if (DECL_CONSTRUCTOR_P (current_function_decl))
6907         retval = current_class_decl;
6908       else if (DECL_NAME (result) != NULL_TREE
6909                && TREE_CODE (valtype) != VOID_TYPE)
6910         retval = result;
6911       else
6912         {
6913           current_function_returns_null = 1;
6914
6915           if (valtype != NULL_TREE && TREE_CODE (valtype) != VOID_TYPE)
6916             {
6917               if (DECL_NAME (DECL_RESULT (current_function_decl)) == NULL_TREE)
6918                 {
6919                   pedwarn ("`return' with no value, in function returning non-void");
6920                   /* Clear this, so finish_function won't say that we
6921                      reach the end of a non-void function (which we don't,
6922                      we gave a return!).  */
6923                   current_function_returns_null = 0;
6924                 }
6925             }
6926
6927           expand_null_return ();
6928           return;
6929         }
6930     }
6931   else if (DECL_CONSTRUCTOR_P (current_function_decl)
6932            && retval != current_class_decl)
6933     {
6934       error ("return from a constructor: use `this = ...' instead");
6935       retval = current_class_decl;
6936     }
6937
6938   if (valtype == NULL_TREE || TREE_CODE (valtype) == VOID_TYPE)
6939     {
6940       current_function_returns_null = 1;
6941       /* We do this here so we'll avoid a warning about how the function
6942          "may or may not return a value" in finish_function.  */
6943       returns_value = 0;
6944
6945       if (retval)
6946         pedwarn ("`return' with a value, in function returning void");
6947       expand_return (retval);
6948     }
6949   /* Add some useful error checking for C++.  */
6950   else if (TREE_CODE (valtype) == REFERENCE_TYPE)
6951     {
6952       tree whats_returned;
6953       tree tmp_result = result;
6954
6955       /* Don't initialize directly into a non-BLKmode retval, since that
6956          could lose when being inlined by another caller.  (GCC can't
6957          read the function return register in an inline function when
6958          the return value is being ignored).  */
6959       if (result && TYPE_MODE (TREE_TYPE (tmp_result)) != BLKmode)
6960         tmp_result = 0;
6961
6962       /* convert to reference now, so we can give error if we
6963          return an reference to a non-lvalue.  */
6964       retval = convert_for_initialization (tmp_result, valtype, retval,
6965                                            LOOKUP_NORMAL, "return",
6966                                            NULL_TREE, 0);
6967
6968       /* Sort through common things to see what it is
6969          we are returning.  */
6970       whats_returned = retval;
6971       if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
6972         {
6973           whats_returned = TREE_OPERAND (whats_returned, 1);
6974           if (TREE_CODE (whats_returned) == ADDR_EXPR)
6975             whats_returned = TREE_OPERAND (whats_returned, 0);
6976         }
6977       if (TREE_CODE (whats_returned) == ADDR_EXPR)
6978         {
6979           whats_returned = TREE_OPERAND (whats_returned, 0);
6980           while (TREE_CODE (whats_returned) == NEW_EXPR
6981                  || TREE_CODE (whats_returned) == TARGET_EXPR
6982                  || TREE_CODE (whats_returned) == WITH_CLEANUP_EXPR)
6983             /* Get the target.  */
6984             whats_returned = TREE_OPERAND (whats_returned, 0);
6985         }
6986
6987       if (TREE_CODE (whats_returned) == VAR_DECL && DECL_NAME (whats_returned))
6988         {
6989           if (TEMP_NAME_P (DECL_NAME (whats_returned)))
6990             warning ("reference to non-lvalue returned");
6991           else if (! TREE_STATIC (whats_returned)
6992                    && IDENTIFIER_LOCAL_VALUE (DECL_NAME (whats_returned)))
6993             cp_warning_at ("reference to local variable `%D' returned", whats_returned);
6994         }
6995     }
6996   else if (TREE_CODE (retval) == ADDR_EXPR)
6997     {
6998       tree whats_returned = TREE_OPERAND (retval, 0);
6999
7000       if (TREE_CODE (whats_returned) == VAR_DECL
7001           && DECL_NAME (whats_returned)
7002           && IDENTIFIER_LOCAL_VALUE (DECL_NAME (whats_returned))
7003           && !TREE_STATIC (whats_returned))
7004         cp_warning_at ("address of local variable `%D' returned", whats_returned);
7005     }
7006   
7007   /* Now deal with possible C++ hair:
7008      (1) Compute the return value.
7009      (2) If there are aggregate values with destructors which
7010      must be cleaned up, clean them (taking care
7011      not to clobber the return value).
7012      (3) If an X(X&) constructor is defined, the return
7013      value must be returned via that.  */
7014
7015   if (retval == result
7016       /* Watch out for constructors, which "return" aggregates
7017          via initialization, but which otherwise "return" a pointer.  */
7018       || DECL_CONSTRUCTOR_P (current_function_decl))
7019     {
7020       /* This is just an error--it's already been reported.  */
7021       if (TYPE_SIZE (valtype) == NULL_TREE)
7022         return;
7023
7024       if (TYPE_MODE (valtype) != BLKmode
7025           && any_pending_cleanups (1))
7026         {
7027           retval = get_temp_regvar (valtype, retval);
7028           use_temp = obey_regdecls;
7029         }
7030     }
7031   else if (IS_AGGR_TYPE (valtype) && TYPE_NEEDS_CONSTRUCTING (valtype))
7032     {
7033       /* Throw away the cleanup that `build_functional_cast' gave us.  */
7034       if (TREE_CODE (retval) == WITH_CLEANUP_EXPR
7035           && TREE_CODE (TREE_OPERAND (retval, 0)) == TARGET_EXPR)
7036         retval = TREE_OPERAND (retval, 0);
7037       expand_aggr_init (result, retval, 0);
7038       DECL_INITIAL (result) = NULL_TREE;
7039       retval = 0;
7040     }
7041   else
7042     {
7043       if (TYPE_MODE (valtype) == VOIDmode)
7044         {
7045           if (TYPE_MODE (TREE_TYPE (result)) != VOIDmode
7046               && warn_return_type)
7047             warning ("return of void value in function returning non-void");
7048           expand_expr_stmt (retval);
7049           retval = 0;
7050           result = 0;
7051         }
7052       else if (TYPE_MODE (valtype) != BLKmode
7053                && any_pending_cleanups (1))
7054         {
7055           retval = get_temp_regvar (valtype, retval);
7056           use_temp = obey_regdecls;
7057           result = 0;
7058         }
7059       else
7060         {
7061           retval = convert_for_initialization (result, valtype, retval,
7062                                                LOOKUP_NORMAL,
7063                                                "return", NULL_TREE, 0);
7064           DECL_INITIAL (result) = NULL_TREE;
7065         }
7066       if (retval == error_mark_node)
7067         return;
7068     }
7069
7070   emit_queue ();
7071
7072   if (retval != NULL_TREE
7073       && TREE_CODE_CLASS (TREE_CODE (retval)) == 'd'
7074       && cond_stack == 0 && loop_stack == 0 && case_stack == 0)
7075     current_function_return_value = retval;
7076
7077   if (result)
7078     {
7079       /* Everything's great--RETVAL is in RESULT.  */
7080       if (original_result_rtx)
7081         store_expr (result, original_result_rtx, 0);
7082       else if (retval && retval != result)
7083         {
7084           /* Clear this out so the later call to decl_function_context
7085              won't end up bombing on us.  */
7086           if (DECL_CONTEXT (result) == error_mark_node)
7087             DECL_CONTEXT (result) = NULL_TREE;
7088           /* Here is where we finally get RETVAL into RESULT.
7089              `expand_return' does the magic of protecting
7090              RESULT from cleanups.  */
7091           retval = build (INIT_EXPR, TREE_TYPE (result), result, retval);
7092           TREE_SIDE_EFFECTS (retval) = 1;
7093           expand_return (retval);
7094         }
7095       else
7096         expand_return (result);
7097
7098       use_variable (DECL_RTL (result));
7099       if (ctor_label  && TREE_CODE (ctor_label) != ERROR_MARK)
7100         expand_goto (ctor_label);
7101       else
7102         expand_null_return ();
7103     }
7104   else
7105     {
7106       /* We may still need to put RETVAL into RESULT.  */
7107       result = DECL_RESULT (current_function_decl);
7108       if (original_result_rtx)
7109         {
7110           /* Here we have a named return value that went
7111              into memory.  We can compute RETVAL into that.  */
7112           if (retval)
7113             expand_assignment (result, retval, 0, 0);
7114           else
7115             store_expr (result, original_result_rtx, 0);
7116           result = make_tree (TREE_TYPE (result), original_result_rtx);
7117         }
7118       else if (ctor_label && TREE_CODE (ctor_label) != ERROR_MARK)
7119         {
7120           /* Here RETVAL is CURRENT_CLASS_DECL, so there's nothing to do.  */
7121           expand_goto (ctor_label);
7122         }
7123       else if (retval)
7124         {
7125           /* Here is where we finally get RETVAL into RESULT.
7126              `expand_return' does the magic of protecting
7127              RESULT from cleanups.  */
7128           result = build (INIT_EXPR, TREE_TYPE (result), result, retval);
7129           TREE_SIDE_EFFECTS (result) = 1;
7130           expand_return (result);
7131         }
7132       else if (TYPE_MODE (TREE_TYPE (result)) != VOIDmode)
7133         expand_return (result);
7134     }
7135
7136   current_function_returns_value = returns_value;
7137   if (original_result_rtx)
7138     use_variable (original_result_rtx);
7139   if (use_temp)
7140     use_variable (DECL_RTL (DECL_RESULT (current_function_decl)));
7141
7142   /* One way to clear out cleanups that EXPR might
7143      generate.  Note that this code will really be
7144      dead code, but that is ok--cleanups that were
7145      needed were handled by the magic of `return'.  */
7146   expand_cleanups_to (NULL_TREE);
7147 }
7148 \f
7149 /* Start a C switch statement, testing expression EXP.
7150    Return EXP if it is valid, an error node otherwise.  */
7151
7152 tree
7153 c_expand_start_case (exp)
7154      tree exp;
7155 {
7156   tree type;
7157   register enum tree_code code;
7158
7159   /* Convert from references, etc.  */
7160   exp = default_conversion (exp);
7161   type = TREE_TYPE (exp);
7162   code = TREE_CODE (type);
7163
7164   if (IS_AGGR_TYPE_CODE (code))
7165     exp = build_type_conversion (CONVERT_EXPR, integer_type_node, exp, 1);
7166
7167   if (exp == NULL_TREE)
7168     {
7169       error ("switch quantity not an integer");
7170       exp = error_mark_node;
7171     }
7172   type = TREE_TYPE (exp);
7173   code = TREE_CODE (type);
7174
7175   if (code != INTEGER_TYPE && code != ENUMERAL_TYPE && code != ERROR_MARK)
7176     {
7177       error ("switch quantity not an integer");
7178       exp = error_mark_node;
7179     }
7180   else
7181     {
7182       tree index;
7183
7184       exp = default_conversion (exp);
7185       type = TREE_TYPE (exp);
7186       index = get_unwidened (exp, 0);
7187       /* We can't strip a conversion from a signed type to an unsigned,
7188          because if we did, int_fits_type_p would do the wrong thing
7189          when checking case values for being in range,
7190          and it's too hard to do the right thing.  */
7191       if (TREE_UNSIGNED (TREE_TYPE (exp))
7192           == TREE_UNSIGNED (TREE_TYPE (index)))
7193         exp = index;
7194     }
7195
7196   expand_start_case (1, exp, type, "switch statement");
7197
7198   return exp;
7199 }
7200
7201 /* CONSTP remembers whether or not all the intervening pointers in the `to'
7202    type have been const.  */
7203 int
7204 comp_ptr_ttypes_real (to, from, constp)
7205      tree to, from;
7206      int constp;
7207 {
7208   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7209     {
7210       if (TREE_CODE (to) != TREE_CODE (from))
7211         return 0;
7212
7213       if (TYPE_READONLY (from) > TYPE_READONLY (to)
7214           || TYPE_VOLATILE (from) > TYPE_VOLATILE (to))
7215         return 0;
7216
7217       if (! constp
7218           && (TYPE_READONLY (to) > TYPE_READONLY (from)
7219               || TYPE_VOLATILE (to) > TYPE_READONLY (from)))
7220         return 0;
7221       constp &= TYPE_READONLY (to);
7222
7223       if (TREE_CODE (to) != POINTER_TYPE)
7224         return comptypes (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from), 1);
7225     }
7226 }
7227
7228 /* When comparing, say, char ** to char const **, this function takes the
7229    'char *' and 'char const *'.  Do not pass non-pointer types to this
7230    function.  */
7231 int
7232 comp_ptr_ttypes (to, from)
7233      tree to, from;
7234 {
7235   return comp_ptr_ttypes_real (to, from, 1);
7236 }