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