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