OSDN Git Service

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