OSDN Git Service

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