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