1 /* Build expressions with type checking for C++ compiler.
2 Copyright (C) 1987, 88, 89, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
5 This file is part of GNU CC.
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)
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.
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, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 /* This file is part of the C++ front end.
24 It contains routines to build C++ expressions given their operands,
25 including computing the types of the result, C and C++ specific error
26 checks, and some optimization.
28 There are also routines to build RETURN_STMT nodes and CASE_STMT nodes,
29 and to process initializations in declarations (since they work
30 like a strange sort of assignment). */
33 extern void warning ();
43 int mark_addressable ();
44 static tree convert_for_assignment ();
45 /* static */ tree convert_for_initialization ();
46 extern tree shorten_compare ();
47 extern void binary_op_error ();
48 static tree pointer_int_sum ();
49 static tree pointer_diff ();
50 static tree convert_sequence ();
51 /* static */ tree unary_complex_lvalue ();
52 static tree get_delta_difference PROTO((tree, tree, int));
54 extern rtx original_result_rtx;
55 extern int warn_synth;
57 /* Return the target type of TYPE, which meas return T for:
58 T*, T&, T[], T (...), and otherwise, just T. */
64 if (TREE_CODE (type) == REFERENCE_TYPE)
65 type = TREE_TYPE (type);
66 while (TREE_CODE (type) == POINTER_TYPE
67 || TREE_CODE (type) == ARRAY_TYPE
68 || TREE_CODE (type) == FUNCTION_TYPE
69 || TREE_CODE (type) == METHOD_TYPE
70 || TREE_CODE (type) == OFFSET_TYPE)
71 type = TREE_TYPE (type);
75 /* Do `exp = require_complete_type (exp);' to make sure exp
76 does not have an incomplete type. (That includes void types.) */
79 require_complete_type (value)
84 if (current_template_parms)
87 type = TREE_TYPE (value);
89 /* First, detect a valid value with a complete type. */
90 if (TYPE_SIZE (type) != 0
91 && type != void_type_node
92 && ! (TYPE_LANG_SPECIFIC (type)
93 && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type))
94 && TYPE_SIZE (SIGNATURE_TYPE (type)) == 0))
97 /* If we see X::Y, we build an OFFSET_TYPE which has
98 not been laid out. Try to avoid an error by interpreting
99 it as this->X::Y, if reasonable. */
100 if (TREE_CODE (value) == OFFSET_REF
102 && TREE_OPERAND (value, 0) == C_C_D)
104 tree base, member = TREE_OPERAND (value, 1);
105 tree basetype = TYPE_OFFSET_BASETYPE (type);
106 my_friendly_assert (TREE_CODE (member) == FIELD_DECL, 305);
107 base = convert_pointer_to (basetype, current_class_decl);
108 value = build (COMPONENT_REF, TREE_TYPE (member),
109 build_indirect_ref (base, NULL_PTR), member);
110 return require_complete_type (value);
113 if (IS_AGGR_TYPE (type) && CLASSTYPE_TEMPLATE_INSTANTIATION (type))
115 instantiate_class_template (TYPE_MAIN_VARIANT (type));
116 if (TYPE_SIZE (type) != 0)
120 incomplete_type_error (value, type);
121 return error_mark_node;
128 if (TYPE_SIZE (type) != NULL_TREE)
130 else if (TREE_CODE (type) == ARRAY_TYPE)
132 tree t = complete_type (TREE_TYPE (type));
133 if (TYPE_SIZE (t) != NULL_TREE)
134 type = build_cplus_array_type (t, TYPE_DOMAIN (type));
136 else if (IS_AGGR_TYPE (type) && CLASSTYPE_TEMPLATE_INSTANTIATION (type))
137 instantiate_class_template (TYPE_MAIN_VARIANT (type));
142 /* Return truthvalue of whether type of EXP is instantiated. */
147 return (TREE_CODE (exp) == TREE_LIST
148 || TREE_TYPE (exp) == unknown_type_node
149 || (TREE_CODE (TREE_TYPE (exp)) == OFFSET_TYPE
150 && TREE_TYPE (TREE_TYPE (exp)) == unknown_type_node));
153 /* Return truthvalue of whether T is function (or pfn) type. */
158 return (TREE_CODE (t) == FUNCTION_TYPE || TREE_CODE (t) == METHOD_TYPE
159 || (TREE_CODE (t) == POINTER_TYPE
160 && (TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE
161 || TREE_CODE (TREE_TYPE (t)) == METHOD_TYPE)));
164 /* Do `exp = require_instantiated_type (type, exp);' to make sure EXP
165 does not have an uninstantiated type.
166 TYPE is type to instantiate with, if uninstantiated. */
168 require_instantiated_type (type, exp, errval)
169 tree type, exp, errval;
171 if (TREE_TYPE (exp) == NULL_TREE)
173 error ("argument list may not have an initializer list");
177 if (TREE_TYPE (exp) == unknown_type_node
178 || (TREE_CODE (TREE_TYPE (exp)) == OFFSET_TYPE
179 && TREE_TYPE (TREE_TYPE (exp)) == unknown_type_node))
181 exp = instantiate_type (type, exp, 1);
182 if (TREE_TYPE (exp) == error_mark_node)
188 /* Return a variant of TYPE which has all the type qualifiers of LIKE
189 as well as those of TYPE. */
192 qualify_type (type, like)
195 int constflag = TYPE_READONLY (type) || TYPE_READONLY (like);
196 int volflag = TYPE_VOLATILE (type) || TYPE_VOLATILE (like);
197 /* @@ Must do member pointers here. */
198 return cp_build_type_variant (type, constflag, volflag);
201 /* Return the common type of two parameter lists.
202 We assume that comptypes has already been done and returned 1;
203 if that isn't so, this may crash.
205 As an optimization, free the space we allocate if the parameter
206 lists are already common. */
212 tree oldargs = p1, newargs, n;
215 char *first_obj = (char *) oballoc (0);
217 len = list_length (p1);
218 newargs = tree_last (p1);
220 if (newargs == void_list_node)
229 newargs = tree_cons (NULL_TREE, NULL_TREE, newargs);
234 p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n), i++)
236 if (TREE_PURPOSE (p1) && !TREE_PURPOSE (p2))
238 TREE_PURPOSE (n) = TREE_PURPOSE (p1);
241 else if (! TREE_PURPOSE (p1))
243 if (TREE_PURPOSE (p2))
245 TREE_PURPOSE (n) = TREE_PURPOSE (p2);
251 if (1 != simple_cst_equal (TREE_PURPOSE (p1), TREE_PURPOSE (p2)))
253 TREE_PURPOSE (n) = TREE_PURPOSE (p2);
255 if (TREE_VALUE (p1) != TREE_VALUE (p2))
258 TREE_VALUE (n) = common_type (TREE_VALUE (p1), TREE_VALUE (p2));
261 TREE_VALUE (n) = TREE_VALUE (p1);
272 /* Return the common type of two types.
273 We assume that comptypes has already been done and returned 1;
274 if that isn't so, this may crash.
276 This is the type for the result of most arithmetic operations
277 if the operands have the given two types.
279 We do not deal with enumeral types here because they have already been
280 converted to integer types. */
286 register enum tree_code code1;
287 register enum tree_code code2;
290 /* Save time if the two types are the same. */
292 if (t1 == t2) return t1;
294 /* If one type is nonsense, use the other. */
295 if (t1 == error_mark_node)
297 if (t2 == error_mark_node)
300 /* Merge the attributes */
302 { register tree a1, a2;
303 a1 = TYPE_ATTRIBUTES (t1);
304 a2 = TYPE_ATTRIBUTES (t2);
306 /* Either one unset? Take the set one. */
308 if (!(attributes = a1))
311 /* One that completely contains the other? Take it. */
313 else if (a2 && !attribute_list_contained (a1, a2))
314 if (attribute_list_contained (a2, a1))
318 /* Pick the longest list, and hang on the other list. */
319 /* ??? For the moment we punt on the issue of attrs with args. */
321 if (list_length (a1) < list_length (a2))
322 attributes = a2, a2 = a1;
324 for (; a2; a2 = TREE_CHAIN (a2))
325 if (lookup_attribute (IDENTIFIER_POINTER (TREE_PURPOSE (a2)),
326 attributes) == NULL_TREE)
329 TREE_CHAIN (a1) = attributes;
335 /* Treat an enum type as the unsigned integer type of the same width. */
337 if (TREE_CODE (t1) == ENUMERAL_TYPE)
338 t1 = type_for_size (TYPE_PRECISION (t1), 1);
339 if (TREE_CODE (t2) == ENUMERAL_TYPE)
340 t2 = type_for_size (TYPE_PRECISION (t2), 1);
342 if (TYPE_PTRMEMFUNC_P (t1))
343 t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
344 if (TYPE_PTRMEMFUNC_P (t2))
345 t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
347 code1 = TREE_CODE (t1);
348 code2 = TREE_CODE (t2);
354 /* If only one is real, use it as the result. */
356 if (code1 == REAL_TYPE && code2 != REAL_TYPE)
357 return build_type_attribute_variant (t1, attributes);
359 if (code2 == REAL_TYPE && code1 != REAL_TYPE)
360 return build_type_attribute_variant (t2, attributes);
362 /* Both real or both integers; use the one with greater precision. */
364 if (TYPE_PRECISION (t1) > TYPE_PRECISION (t2))
365 return build_type_attribute_variant (t1, attributes);
366 else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
367 return build_type_attribute_variant (t2, attributes);
369 /* Same precision. Prefer longs to ints even when same size. */
371 if (TYPE_MAIN_VARIANT (t1) == long_unsigned_type_node
372 || TYPE_MAIN_VARIANT (t2) == long_unsigned_type_node)
373 return build_type_attribute_variant (long_unsigned_type_node,
376 if (TYPE_MAIN_VARIANT (t1) == long_integer_type_node
377 || TYPE_MAIN_VARIANT (t2) == long_integer_type_node)
379 /* But preserve unsignedness from the other type,
380 since long cannot hold all the values of an unsigned int. */
381 if (TREE_UNSIGNED (t1) || TREE_UNSIGNED (t2))
382 t1 = long_unsigned_type_node;
384 t1 = long_integer_type_node;
385 return build_type_attribute_variant (t1, attributes);
388 if (TYPE_MAIN_VARIANT (t1) == long_double_type_node
389 || TYPE_MAIN_VARIANT (t2) == long_double_type_node)
390 return build_type_attribute_variant (long_double_type_node,
393 /* Otherwise prefer the unsigned one. */
395 if (TREE_UNSIGNED (t1))
396 return build_type_attribute_variant (t1, attributes);
398 return build_type_attribute_variant (t2, attributes);
402 /* For two pointers, do this recursively on the target type,
403 and combine the qualifiers of the two types' targets. */
404 /* This code was turned off; I don't know why.
405 But ANSI C++ specifies doing this with the qualifiers.
406 So I turned it on again. */
408 tree tt1 = TYPE_MAIN_VARIANT (TREE_TYPE (t1));
409 tree tt2 = TYPE_MAIN_VARIANT (TREE_TYPE (t2));
411 = TYPE_READONLY (TREE_TYPE (t1)) || TYPE_READONLY (TREE_TYPE (t2));
413 = TYPE_VOLATILE (TREE_TYPE (t1)) || TYPE_VOLATILE (TREE_TYPE (t2));
418 else if (tt1 == void_type_node || tt2 == void_type_node)
419 target = void_type_node;
421 target = common_type (tt1, tt2);
423 target = cp_build_type_variant (target, constp, volatilep);
424 if (code1 == POINTER_TYPE)
425 t1 = build_pointer_type (target);
427 t1 = build_reference_type (target);
428 t1 = build_type_attribute_variant (t1, attributes);
430 if (TREE_CODE (target) == METHOD_TYPE)
431 t1 = build_ptrmemfunc_type (t1);
438 tree elt = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
439 /* Save space: see if the result is identical to one of the args. */
440 if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1))
441 return build_type_attribute_variant (t1, attributes);
442 if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2))
443 return build_type_attribute_variant (t2, attributes);
444 /* Merge the element types, and have a size if either arg has one. */
445 t1 = build_cplus_array_type (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
446 return build_type_attribute_variant (t1, attributes);
450 /* Function types: prefer the one that specified arg types.
451 If both do, merge the arg types. Also merge the return types. */
453 tree valtype = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
454 tree p1 = TYPE_ARG_TYPES (t1);
455 tree p2 = TYPE_ARG_TYPES (t2);
458 /* Save space: see if the result is identical to one of the args. */
459 if (valtype == TREE_TYPE (t1) && ! p2)
460 return build_type_attribute_variant (t1, attributes);
461 if (valtype == TREE_TYPE (t2) && ! p1)
462 return build_type_attribute_variant (t2, attributes);
464 /* Simple way if one arg fails to specify argument types. */
465 if (p1 == NULL_TREE || TREE_VALUE (p1) == void_type_node)
467 rval = build_function_type (valtype, p2);
468 if ((raises = TYPE_RAISES_EXCEPTIONS (t2)))
469 rval = build_exception_variant (rval, raises);
470 return build_type_attribute_variant (rval, attributes);
472 raises = TYPE_RAISES_EXCEPTIONS (t1);
473 if (p2 == NULL_TREE || TREE_VALUE (p2) == void_type_node)
475 rval = build_function_type (valtype, p1);
477 rval = build_exception_variant (rval, raises);
478 return build_type_attribute_variant (rval, attributes);
481 rval = build_function_type (valtype, commonparms (p1, p2));
482 rval = build_exception_variant (rval, raises);
483 return build_type_attribute_variant (rval, attributes);
488 my_friendly_assert (TYPE_MAIN_VARIANT (t1) == t1
489 && TYPE_MAIN_VARIANT (t2) == t2, 306);
491 if (DERIVED_FROM_P (t1, t2) && binfo_or_else (t1, t2))
492 return build_type_attribute_variant (t1, attributes);
493 else if (binfo_or_else (t2, t1))
494 return build_type_attribute_variant (t2, attributes);
496 compiler_error ("common_type called with uncommon aggregate types");
499 if (TREE_CODE (TREE_TYPE (t1)) == TREE_CODE (TREE_TYPE (t2)))
501 /* Get this value the long way, since TYPE_METHOD_BASETYPE
502 is just the main variant of this. */
506 tree b1 = TYPE_OFFSET_BASETYPE (t1);
507 tree b2 = TYPE_OFFSET_BASETYPE (t2);
509 if (comptypes (b1, b2, 1)
510 || (DERIVED_FROM_P (b1, b2) && binfo_or_else (b1, b2)))
511 basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t2)));
514 if (binfo_or_else (b2, b1) == NULL_TREE)
515 compiler_error ("common_type called with uncommon method types");
516 basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t1)));
519 raises = TYPE_RAISES_EXCEPTIONS (t1);
521 /* If this was a member function type, get back to the
522 original type of type member function (i.e., without
523 the class instance variable up front. */
524 t1 = build_function_type (TREE_TYPE (t1), TREE_CHAIN (TYPE_ARG_TYPES (t1)));
525 t2 = build_function_type (TREE_TYPE (t2), TREE_CHAIN (TYPE_ARG_TYPES (t2)));
526 t3 = common_type (t1, t2);
527 t3 = build_cplus_method_type (basetype, TREE_TYPE (t3), TYPE_ARG_TYPES (t3));
528 t1 = build_exception_variant (t3, raises);
531 compiler_error ("common_type called with uncommon method types");
533 return build_type_attribute_variant (t1, attributes);
536 if (TREE_TYPE (t1) == TREE_TYPE (t2))
538 tree b1 = TYPE_OFFSET_BASETYPE (t1);
539 tree b2 = TYPE_OFFSET_BASETYPE (t2);
541 if (DERIVED_FROM_P (b1, b2) && binfo_or_else (b1, b2))
542 return build_type_attribute_variant (t2, attributes);
543 else if (binfo_or_else (b2, b1))
544 return build_type_attribute_variant (t1, attributes);
546 compiler_error ("common_type called with uncommon member types");
549 return build_type_attribute_variant (t1, attributes);
553 /* Return 1 if TYPE1 and TYPE2 raise the same exceptions. */
555 compexcepttypes (t1, t2)
558 return TYPE_RAISES_EXCEPTIONS (t1) == TYPE_RAISES_EXCEPTIONS (t2);
562 comp_array_types (cmp, t1, t2, strict)
563 register int (*cmp)();
567 tree d1 = TYPE_DOMAIN (t1);
568 tree d2 = TYPE_DOMAIN (t2);
570 /* Target types must match incl. qualifiers. */
571 if (!(TREE_TYPE (t1) == TREE_TYPE (t2)
572 || (*cmp) (TREE_TYPE (t1), TREE_TYPE (t2), strict)))
575 /* Sizes must match unless one is missing or variable. */
576 if (d1 == 0 || d2 == 0 || d1 == d2
577 || TREE_CODE (TYPE_MIN_VALUE (d1)) != INTEGER_CST
578 || TREE_CODE (TYPE_MIN_VALUE (d2)) != INTEGER_CST
579 || TREE_CODE (TYPE_MAX_VALUE (d1)) != INTEGER_CST
580 || TREE_CODE (TYPE_MAX_VALUE (d2)) != INTEGER_CST)
583 return ((TREE_INT_CST_LOW (TYPE_MIN_VALUE (d1))
584 == TREE_INT_CST_LOW (TYPE_MIN_VALUE (d2)))
585 && (TREE_INT_CST_HIGH (TYPE_MIN_VALUE (d1))
586 == TREE_INT_CST_HIGH (TYPE_MIN_VALUE (d2)))
587 && (TREE_INT_CST_LOW (TYPE_MAX_VALUE (d1))
588 == TREE_INT_CST_LOW (TYPE_MAX_VALUE (d2)))
589 && (TREE_INT_CST_HIGH (TYPE_MAX_VALUE (d1))
590 == TREE_INT_CST_HIGH (TYPE_MAX_VALUE (d2))));
593 /* Return 1 if TYPE1 and TYPE2 are compatible types for assignment
594 or various other operations. This is what ANSI C++ speaks of as
597 For C++: argument STRICT says we should be strict about this
600 2 : strict, except that if one type is a reference and
601 the other is not, compare the target type of the
602 reference to the type that's not a reference (ARM, p308).
603 This is used for checking for invalid overloading.
604 1 : strict (compared according to ANSI C)
605 This is used for checking whether two function decls match.
606 0 : <= (compared according to C++)
607 -1: <= or >= (relaxed)
609 Otherwise, pointers involving base classes and derived classes
610 can be mixed as valid: i.e. a pointer to a base class may be assigned
611 to a pointer to one of its derived classes, as per C++. A pointer to
612 a derived class may be passed as a parameter to a function expecting a
613 pointer to a base classes. These allowances do not commute. In this
614 case, TYPE1 is assumed to be the base class, and TYPE2 is assumed to
615 be the derived class. */
617 comptypes (type1, type2, strict)
621 register tree t1 = type1;
622 register tree t2 = type2;
625 /* Suppress errors caused by previously reported errors */
630 /* This should never happen. */
631 my_friendly_assert (t1 != error_mark_node, 307);
633 if (t2 == error_mark_node)
638 /* Treat an enum type as the unsigned integer type of the same width. */
640 if (TREE_CODE (t1) == ENUMERAL_TYPE)
641 t1 = type_for_size (TYPE_PRECISION (t1), 1);
642 if (TREE_CODE (t2) == ENUMERAL_TYPE)
643 t2 = type_for_size (TYPE_PRECISION (t2), 1);
649 if (TYPE_PTRMEMFUNC_P (t1))
650 t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
651 if (TYPE_PTRMEMFUNC_P (t2))
652 t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
654 /* Different classes of types can't be compatible. */
656 if (TREE_CODE (t1) != TREE_CODE (t2))
659 && ((TREE_CODE (t1) == REFERENCE_TYPE)
660 ^ (TREE_CODE (t2) == REFERENCE_TYPE)))
662 if (TREE_CODE (t1) == REFERENCE_TYPE)
663 return comptypes (TREE_TYPE (t1), t2, 1);
664 return comptypes (t1, TREE_TYPE (t2), 1);
672 /* Qualifiers must match. */
674 if (TYPE_READONLY (t1) != TYPE_READONLY (t2))
676 if (TYPE_VOLATILE (t1) != TYPE_VOLATILE (t2))
679 /* Allow for two different type nodes which have essentially the same
680 definition. Note that we already checked for equality of the type
681 type qualifiers (just above). */
683 if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
686 /* ??? COMP_TYPE_ATTRIBUTES is currently useless for variables as each
687 attribute is its own main variant (`val' will remain 0). */
688 #ifndef COMP_TYPE_ATTRIBUTES
689 #define COMP_TYPE_ATTRIBUTES(t1,t2) 1
692 /* 1 if no need for warning yet, 2 if warning cause has been seen. */
693 if (! (attrval = COMP_TYPE_ATTRIBUTES (t1, t2)))
696 /* 1 if no need for warning yet, 2 if warning cause has been seen. */
699 switch (TREE_CODE (t1))
703 if (CLASSTYPE_TEMPLATE_INFO (t1) && CLASSTYPE_TEMPLATE_INFO (t2)
704 && CLASSTYPE_TI_TEMPLATE (t1) == CLASSTYPE_TI_TEMPLATE (t2))
706 int i = TREE_VEC_LENGTH (CLASSTYPE_TI_ARGS (t1));
707 tree *p1 = &TREE_VEC_ELT (CLASSTYPE_TI_ARGS (t1), 0);
708 tree *p2 = &TREE_VEC_ELT (CLASSTYPE_TI_ARGS (t2), 0);
712 if (TREE_CODE_CLASS (TREE_CODE (p1[i])) == 't')
714 if (! comptypes (p1[i], p2[i], 1))
719 if (simple_cst_equal (p1[i], p2[i]) <= 0)
730 val = (comptypes (build_pointer_type (TYPE_OFFSET_BASETYPE (t1)),
731 build_pointer_type (TYPE_OFFSET_BASETYPE (t2)), strict)
732 && comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict));
736 if (! compexcepttypes (t1, t2))
739 /* This case is anti-symmetrical!
740 One can pass a base member (or member function)
741 to something expecting a derived member (or member function),
742 but not vice-versa! */
744 val = (comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)
745 && compparms (TYPE_ARG_TYPES (t1),
746 TYPE_ARG_TYPES (t2), strict));
760 if (TREE_CODE (t1) == RECORD_TYPE && TREE_CODE (t2) == RECORD_TYPE)
764 rval = t1 == t2 || UNIQUELY_DERIVED_FROM_P (t1, t2);
773 val = UNIQUELY_DERIVED_FROM_P (t2, t1);
780 val = comptypes (t1, t2, strict);
784 if (! compexcepttypes (t1, t2))
787 val = ((TREE_TYPE (t1) == TREE_TYPE (t2)
788 || comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict))
789 && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2), strict));
793 /* Target types must match incl. qualifiers. */
794 val = comp_array_types (comptypes, t1, t2, strict);
797 case TEMPLATE_TYPE_PARM:
798 return TEMPLATE_TYPE_IDX (t1) == TEMPLATE_TYPE_IDX (t2);
801 if (TYPE_IDENTIFIER (t1) != TYPE_IDENTIFIER (t2))
803 return comptypes (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2), 1);
805 return attrval == 2 && val == 1 ? 2 : val;
808 /* Return 1 if TTL and TTR are pointers to types that are equivalent,
809 ignoring their qualifiers.
811 NPTRS is the number of pointers we can strip off and keep cool.
812 This is used to permit (for aggr A, aggr B) A, B* to convert to A*,
813 but to not permit B** to convert to A**. */
816 comp_target_types (ttl, ttr, nptrs)
820 ttl = TYPE_MAIN_VARIANT (ttl);
821 ttr = TYPE_MAIN_VARIANT (ttr);
825 if (TREE_CODE (ttr) != TREE_CODE (ttl))
828 if (TREE_CODE (ttr) == POINTER_TYPE)
830 ttl = TREE_TYPE (ttl);
831 ttr = TREE_TYPE (ttr);
835 if (TREE_CODE (ttl) == VOID_TYPE
836 && TREE_CODE (ttr) != FUNCTION_TYPE
837 && TREE_CODE (ttr) != METHOD_TYPE
838 && TREE_CODE (ttr) != OFFSET_TYPE)
840 else if (TREE_CODE (ttr) == VOID_TYPE
841 && TREE_CODE (ttl) != FUNCTION_TYPE
842 && TREE_CODE (ttl) != METHOD_TYPE
843 && TREE_CODE (ttl) != OFFSET_TYPE)
845 else if (TREE_CODE (ttl) == POINTER_TYPE
846 || TREE_CODE (ttl) == ARRAY_TYPE)
848 if (comp_ptr_ttypes (ttl, ttr))
850 else if (comp_ptr_ttypes (ttr, ttl))
856 /* Const and volatile mean something different for function types,
857 so the usual checks are not appropriate. */
858 if (TREE_CODE (ttl) == FUNCTION_TYPE || TREE_CODE (ttl) == METHOD_TYPE)
859 return comp_target_types (ttl, ttr, nptrs - 1);
861 /* Make sure that the cv-quals change only in the same direction as
865 int c = TYPE_READONLY (ttl) - TYPE_READONLY (ttr);
866 int v = TYPE_VOLATILE (ttl) - TYPE_VOLATILE (ttr);
868 if ((c > 0 && v < 0) || (c < 0 && v > 0))
871 if (TYPE_MAIN_VARIANT (ttl) == TYPE_MAIN_VARIANT (ttr))
872 return (c + v < 0) ? -1 : 1;
874 t = comp_target_types (ttl, ttr, nptrs - 1);
875 if ((t == 1 && c + v >= 0) || (t == -1 && c + v <= 0))
882 if (TREE_CODE (ttr) == REFERENCE_TYPE)
883 return comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), nptrs);
884 if (TREE_CODE (ttr) == ARRAY_TYPE)
885 return comp_array_types (comp_target_types, ttl, ttr, 0);
886 else if (TREE_CODE (ttr) == FUNCTION_TYPE || TREE_CODE (ttr) == METHOD_TYPE)
887 if (comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), nptrs))
888 switch (comp_target_parms (TYPE_ARG_TYPES (ttl), TYPE_ARG_TYPES (ttr), 1))
897 my_friendly_abort (112);
903 else if (TREE_CODE (ttr) == OFFSET_TYPE)
905 /* Contravariance: we can assign a pointer to base member to a pointer
906 to derived member. Note difference from simple pointer case, where
907 we can pass a pointer to derived to a pointer to base. */
908 if (comptypes (TYPE_OFFSET_BASETYPE (ttr), TYPE_OFFSET_BASETYPE (ttl), 0))
909 return comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), nptrs);
910 else if (comptypes (TYPE_OFFSET_BASETYPE (ttl), TYPE_OFFSET_BASETYPE (ttr), 0)
911 && comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), nptrs))
914 else if (IS_AGGR_TYPE (ttl))
918 if (comptypes (build_pointer_type (ttl), build_pointer_type (ttr), 0))
920 if (comptypes (build_pointer_type (ttr), build_pointer_type (ttl), 0))
928 /* If two types share a common base type, return that basetype.
929 If there is not a unique most-derived base type, this function
930 returns ERROR_MARK_NODE. */
932 common_base_type (tt1, tt2)
935 tree best = NULL_TREE;
938 /* If one is a baseclass of another, that's good enough. */
939 if (UNIQUELY_DERIVED_FROM_P (tt1, tt2))
941 if (UNIQUELY_DERIVED_FROM_P (tt2, tt1))
944 /* Otherwise, try to find a unique baseclass of TT1
945 that is shared by TT2, and follow that down. */
946 for (i = CLASSTYPE_N_BASECLASSES (tt1)-1; i >= 0; i--)
948 tree basetype = TYPE_BINFO_BASETYPE (tt1, i);
949 tree trial = common_base_type (basetype, tt2);
952 if (trial == error_mark_node)
954 if (best == NULL_TREE)
956 else if (best != trial)
957 return error_mark_node;
962 for (i = CLASSTYPE_N_BASECLASSES (tt2)-1; i >= 0; i--)
964 tree basetype = TYPE_BINFO_BASETYPE (tt2, i);
965 tree trial = common_base_type (tt1, basetype);
968 if (trial == error_mark_node)
970 if (best == NULL_TREE)
972 else if (best != trial)
973 return error_mark_node;
979 /* Subroutines of `comptypes'. */
981 /* Return 1 if two parameter type lists PARMS1 and PARMS2
982 are equivalent in the sense that functions with those parameter types
983 can have equivalent types.
984 If either list is empty, we win.
985 Otherwise, the two lists must be equivalent, element by element.
987 C++: See comment above about TYPE1, TYPE2, STRICT.
988 If STRICT == 3, it means checking is strict, but do not compare
989 default parameter values. */
991 compparms (parms1, parms2, strict)
995 register tree t1 = parms1, t2 = parms2;
997 /* An unspecified parmlist matches any specified parmlist
998 whose argument types don't need default promotions. */
1000 if (strict <= 0 && t1 == 0)
1001 return self_promoting_args_p (t2);
1002 if (strict < 0 && t2 == 0)
1003 return self_promoting_args_p (t1);
1007 if (t1 == 0 && t2 == 0)
1009 /* If one parmlist is shorter than the other,
1010 they fail to match, unless STRICT is <= 0. */
1011 if (t1 == 0 || t2 == 0)
1018 return t1 && TREE_PURPOSE (t1);
1020 if (! comptypes (TREE_VALUE (t2), TREE_VALUE (t1), strict))
1025 return t2 == void_list_node && TREE_PURPOSE (t1);
1026 return TREE_PURPOSE (t1) || TREE_PURPOSE (t2);
1029 t1 = TREE_CHAIN (t1);
1030 t2 = TREE_CHAIN (t2);
1034 /* This really wants return whether or not parameter type lists
1035 would make their owning functions assignment compatible or not. */
1037 comp_target_parms (parms1, parms2, strict)
1038 tree parms1, parms2;
1041 register tree t1 = parms1, t2 = parms2;
1042 int warn_contravariance = 0;
1044 /* An unspecified parmlist matches any specified parmlist
1045 whose argument types don't need default promotions.
1046 @@@ see 13.3.3 for a counterexample... */
1048 if (t1 == 0 && t2 != 0)
1050 cp_pedwarn ("ANSI C++ prohibits conversion from `(%#T)' to `(...)'",
1052 return self_promoting_args_p (t2);
1055 return self_promoting_args_p (t1);
1057 for (; t1 || t2; t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1061 /* If one parmlist is shorter than the other,
1062 they fail to match, unless STRICT is <= 0. */
1063 if (t1 == 0 || t2 == 0)
1068 return 1 + warn_contravariance;
1069 return ((t1 && TREE_PURPOSE (t1)) + warn_contravariance);
1071 p1 = TREE_VALUE (t1);
1072 p2 = TREE_VALUE (t2);
1076 if ((TREE_CODE (p1) == POINTER_TYPE && TREE_CODE (p2) == POINTER_TYPE)
1077 || (TREE_CODE (p1) == REFERENCE_TYPE && TREE_CODE (p2) == REFERENCE_TYPE))
1080 && (TYPE_MAIN_VARIANT (TREE_TYPE (p1))
1081 == TYPE_MAIN_VARIANT (TREE_TYPE (p2))))
1084 /* The following is wrong for contravariance,
1085 but many programs depend on it. */
1086 if (TREE_TYPE (p1) == void_type_node)
1088 if (TREE_TYPE (p2) == void_type_node)
1090 warn_contravariance = 1;
1093 if (IS_AGGR_TYPE (TREE_TYPE (p1)))
1095 if (comptypes (p2, p1, 0) == 0)
1097 if (comptypes (p1, p2, 0) != 0)
1098 warn_contravariance = 1;
1105 /* Note backwards order due to contravariance. */
1106 if (comp_target_types (p2, p1, 1) == 0)
1108 if (comp_target_types (p1, p2, 1))
1110 warn_contravariance = 1;
1116 /* Target types are compatible--just make sure that if
1117 we use parameter lists, that they are ok as well. */
1118 if (TREE_CODE (p1) == FUNCTION_TYPE || TREE_CODE (p1) == METHOD_TYPE)
1119 switch (comp_target_parms (TYPE_ARG_TYPES (p1),
1120 TYPE_ARG_TYPES (p2),
1128 warn_contravariance = 1;
1131 if (TREE_PURPOSE (t1) && TREE_PURPOSE (t2))
1133 int cmp = simple_cst_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2));
1135 my_friendly_abort (114);
1140 return 1 + warn_contravariance;
1143 /* Return 1 if PARMS specifies a fixed number of parameters
1144 and none of their types is affected by default promotions. */
1147 self_promoting_args_p (parms)
1151 for (t = parms; t; t = TREE_CHAIN (t))
1153 register tree type = TREE_VALUE (t);
1155 if (TREE_CHAIN (t) == 0 && type != void_type_node)
1161 if (TYPE_MAIN_VARIANT (type) == float_type_node)
1164 if (C_PROMOTING_INTEGER_TYPE_P (type))
1170 /* Return an unsigned type the same as TYPE in other respects.
1172 C++: must make these work for type variants as well. */
1175 unsigned_type (type)
1178 tree type1 = TYPE_MAIN_VARIANT (type);
1179 if (type1 == signed_char_type_node || type1 == char_type_node)
1180 return unsigned_char_type_node;
1181 if (type1 == integer_type_node)
1182 return unsigned_type_node;
1183 if (type1 == short_integer_type_node)
1184 return short_unsigned_type_node;
1185 if (type1 == long_integer_type_node)
1186 return long_unsigned_type_node;
1187 if (type1 == long_long_integer_type_node)
1188 return long_long_unsigned_type_node;
1189 if (type1 == intDI_type_node)
1190 return unsigned_intDI_type_node;
1191 if (type1 == intSI_type_node)
1192 return unsigned_intSI_type_node;
1193 if (type1 == intHI_type_node)
1194 return unsigned_intHI_type_node;
1195 if (type1 == intQI_type_node)
1196 return unsigned_intQI_type_node;
1200 /* Return a signed type the same as TYPE in other respects. */
1206 tree type1 = TYPE_MAIN_VARIANT (type);
1207 if (type1 == unsigned_char_type_node || type1 == char_type_node)
1208 return signed_char_type_node;
1209 if (type1 == unsigned_type_node)
1210 return integer_type_node;
1211 if (type1 == short_unsigned_type_node)
1212 return short_integer_type_node;
1213 if (type1 == long_unsigned_type_node)
1214 return long_integer_type_node;
1215 if (type1 == long_long_unsigned_type_node)
1216 return long_long_integer_type_node;
1217 if (type1 == unsigned_intDI_type_node)
1218 return intDI_type_node;
1219 if (type1 == unsigned_intSI_type_node)
1220 return intSI_type_node;
1221 if (type1 == unsigned_intHI_type_node)
1222 return intHI_type_node;
1223 if (type1 == unsigned_intQI_type_node)
1224 return intQI_type_node;
1228 /* Return a type the same as TYPE except unsigned or
1229 signed according to UNSIGNEDP. */
1232 signed_or_unsigned_type (unsignedp, type)
1236 if (! INTEGRAL_TYPE_P (type))
1238 if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
1239 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1240 if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
1241 return unsignedp ? unsigned_type_node : integer_type_node;
1242 if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node))
1243 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1244 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node))
1245 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1246 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node))
1247 return (unsignedp ? long_long_unsigned_type_node
1248 : long_long_integer_type_node);
1252 /* Compute the value of the `sizeof' operator. */
1258 enum tree_code code = TREE_CODE (type);
1261 if (current_template_parms)
1262 return build_min (SIZEOF_EXPR, sizetype, type);
1264 if (code == FUNCTION_TYPE)
1266 if (pedantic || warn_pointer_arith)
1267 pedwarn ("ANSI C++ forbids taking the sizeof a function type");
1268 return size_int (1);
1270 if (code == METHOD_TYPE)
1272 if (pedantic || warn_pointer_arith)
1273 pedwarn ("ANSI C++ forbids taking the sizeof a method type");
1274 return size_int (1);
1276 if (code == VOID_TYPE)
1278 if (pedantic || warn_pointer_arith)
1279 pedwarn ("ANSI C++ forbids taking the sizeof a void type");
1280 return size_int (1);
1282 if (code == ERROR_MARK)
1283 return size_int (1);
1285 /* ARM $5.3.2: ``When applied to a reference, the result is the size of the
1286 referenced object.'' */
1287 if (code == REFERENCE_TYPE)
1288 type = TREE_TYPE (type);
1290 /* We couldn't find anything in the ARM or the draft standard that says,
1291 one way or the other, if doing sizeof on something that doesn't have
1292 an object associated with it is correct or incorrect. For example, if
1293 you declare `struct S { char str[16]; };', and in your program do
1294 a `sizeof (S::str)', should we flag that as an error or should we give
1295 the size of it? Since it seems like a reasonable thing to do, we'll go
1296 with giving the value. */
1297 if (code == OFFSET_TYPE)
1298 type = TREE_TYPE (type);
1300 /* @@ This also produces an error for a signature ref.
1301 In that case we should be able to do better. */
1302 if (IS_SIGNATURE (type))
1304 error ("`sizeof' applied to a signature type");
1305 return size_int (0);
1308 if (TYPE_SIZE (complete_type (type)) == 0)
1310 cp_error ("`sizeof' applied to incomplete type `%T'", type);
1311 return size_int (0);
1314 /* Convert in case a char is more than one unit. */
1315 t = size_binop (CEIL_DIV_EXPR, TYPE_SIZE (type),
1316 size_int (TYPE_PRECISION (char_type_node)));
1317 /* size_binop does not put the constant in range, so do it now. */
1318 if (TREE_CODE (t) == INTEGER_CST && force_fit_type (t, 0))
1319 TREE_CONSTANT_OVERFLOW (t) = TREE_OVERFLOW (t) = 1;
1327 if (current_template_parms)
1328 return build_min (SIZEOF_EXPR, sizetype, e);
1330 if (TREE_CODE (e) == COMPONENT_REF
1331 && DECL_BIT_FIELD (TREE_OPERAND (e, 1)))
1332 error ("sizeof applied to a bit-field");
1333 /* ANSI says arrays and functions are converted inside comma.
1334 But we can't really convert them in build_compound_expr
1335 because that would break commas in lvalues.
1336 So do the conversion here if operand was a comma. */
1337 if (TREE_CODE (e) == COMPOUND_EXPR
1338 && (TREE_CODE (TREE_TYPE (e)) == ARRAY_TYPE
1339 || TREE_CODE (TREE_TYPE (e)) == FUNCTION_TYPE))
1340 e = default_conversion (e);
1341 else if (TREE_CODE (e) == TREE_LIST)
1343 tree t = TREE_VALUE (e);
1346 && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1347 || is_overloaded_fn (t)))
1348 pedwarn ("ANSI C++ forbids taking the sizeof a function type");
1350 return c_sizeof (TREE_TYPE (e));
1354 c_sizeof_nowarn (type)
1357 enum tree_code code = TREE_CODE (type);
1360 if (code == FUNCTION_TYPE
1361 || code == METHOD_TYPE
1362 || code == VOID_TYPE
1363 || code == ERROR_MARK)
1364 return size_int (1);
1365 if (code == REFERENCE_TYPE)
1366 type = TREE_TYPE (type);
1368 if (TYPE_SIZE (type) == 0)
1369 return size_int (0);
1371 /* Convert in case a char is more than one unit. */
1372 t = size_binop (CEIL_DIV_EXPR, TYPE_SIZE (type),
1373 size_int (TYPE_PRECISION (char_type_node)));
1374 force_fit_type (t, 0);
1378 /* Implement the __alignof keyword: Return the minimum required
1379 alignment of TYPE, measured in bytes. */
1385 enum tree_code code = TREE_CODE (type);
1388 if (code == FUNCTION_TYPE || code == METHOD_TYPE)
1389 return size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1391 if (code == VOID_TYPE || code == ERROR_MARK)
1392 return size_int (1);
1394 /* C++: this is really correct! */
1395 if (code == REFERENCE_TYPE)
1396 type = TREE_TYPE (type);
1398 /* @@ This also produces an error for a signature ref.
1399 In that case we should be able to do better. */
1400 if (IS_SIGNATURE (type))
1402 error ("`__alignof' applied to a signature type");
1403 return size_int (1);
1406 t = size_int (TYPE_ALIGN (type) / BITS_PER_UNIT);
1407 force_fit_type (t, 0);
1411 /* Perform default promotions for C data used in expressions.
1412 Arrays and functions are converted to pointers;
1413 enumeral types or short or char, to int.
1414 In addition, manifest constants symbols are replaced by their values.
1416 C++: this will automatically bash references to their target type. */
1419 decay_conversion (exp)
1422 register tree type = TREE_TYPE (exp);
1423 register enum tree_code code = TREE_CODE (type);
1425 if (code == OFFSET_TYPE /* || TREE_CODE (exp) == OFFSET_REF */ )
1427 if (TREE_CODE (exp) == OFFSET_REF)
1428 return decay_conversion (resolve_offset_ref (exp));
1430 type = TREE_TYPE (type);
1431 code = TREE_CODE (type);
1434 if (code == REFERENCE_TYPE)
1436 exp = convert_from_reference (exp);
1437 type = TREE_TYPE (exp);
1438 code = TREE_CODE (type);
1441 /* Constants can be used directly unless they're not loadable. */
1442 if (TREE_CODE (exp) == CONST_DECL)
1443 exp = DECL_INITIAL (exp);
1444 /* Replace a nonvolatile const static variable with its value. */
1445 else if (TREE_READONLY_DECL_P (exp))
1447 exp = decl_constant_value (exp);
1448 type = TREE_TYPE (exp);
1451 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
1452 Leave such NOP_EXPRs, since RHS is being used in non-lvalue context. */
1454 if (code == VOID_TYPE)
1456 error ("void value not ignored as it ought to be");
1457 return error_mark_node;
1459 if (code == FUNCTION_TYPE)
1461 return build_unary_op (ADDR_EXPR, exp, 0);
1463 if (code == METHOD_TYPE)
1465 if (TREE_CODE (exp) == OFFSET_REF)
1467 /* FIXME: We should emit an error here about using a ptrmemfunc
1468 for something other than a function call. */
1469 my_friendly_assert (TREE_CODE (TREE_OPERAND (exp, 1)) == FUNCTION_DECL,
1471 return build_unary_op (ADDR_EXPR, TREE_OPERAND (exp, 1), 0);
1473 return build_unary_op (ADDR_EXPR, exp, 0);
1475 if (code == ARRAY_TYPE)
1480 int constp, volatilep;
1482 if (TREE_CODE (exp) == INDIRECT_REF)
1484 /* Stripping away the INDIRECT_REF is not the right
1485 thing to do for references... */
1486 tree inner = TREE_OPERAND (exp, 0);
1487 if (TREE_CODE (TREE_TYPE (inner)) == REFERENCE_TYPE)
1489 inner = build1 (CONVERT_EXPR,
1490 build_pointer_type (TREE_TYPE (TREE_TYPE (inner))),
1492 TREE_REFERENCE_EXPR (inner) = 1;
1494 return convert (build_pointer_type (TREE_TYPE (type)), inner);
1497 if (TREE_CODE (exp) == COMPOUND_EXPR)
1499 tree op1 = decay_conversion (TREE_OPERAND (exp, 1));
1500 return build (COMPOUND_EXPR, TREE_TYPE (op1),
1501 TREE_OPERAND (exp, 0), op1);
1505 && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp)))
1507 error ("invalid use of non-lvalue array");
1508 return error_mark_node;
1511 constp = volatilep = 0;
1512 if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'r'
1513 || TREE_CODE_CLASS (TREE_CODE (exp)) == 'd')
1515 constp = TREE_READONLY (exp);
1516 volatilep = TREE_THIS_VOLATILE (exp);
1519 restype = TREE_TYPE (type);
1520 if (TYPE_READONLY (type) || TYPE_VOLATILE (type)
1521 || constp || volatilep)
1522 restype = cp_build_type_variant (restype,
1523 TYPE_READONLY (type) || constp,
1524 TYPE_VOLATILE (type) || volatilep);
1525 ptrtype = build_pointer_type (restype);
1527 if (TREE_CODE (exp) == VAR_DECL)
1529 /* ??? This is not really quite correct
1530 in that the type of the operand of ADDR_EXPR
1531 is not the target type of the type of the ADDR_EXPR itself.
1532 Question is, can this lossage be avoided? */
1533 adr = build1 (ADDR_EXPR, ptrtype, exp);
1534 if (mark_addressable (exp) == 0)
1535 return error_mark_node;
1536 TREE_CONSTANT (adr) = staticp (exp);
1537 TREE_SIDE_EFFECTS (adr) = 0; /* Default would be, same as EXP. */
1540 /* This way is better for a COMPONENT_REF since it can
1541 simplify the offset for a component. */
1542 adr = build_unary_op (ADDR_EXPR, exp, 1);
1543 return convert (ptrtype, adr);
1550 default_conversion (exp)
1554 enum tree_code code;
1556 exp = decay_conversion (exp);
1558 type = TREE_TYPE (exp);
1559 code = TREE_CODE (type);
1561 if (INTEGRAL_CODE_P (code))
1563 tree t = type_promotes_to (type);
1565 return convert (t, exp);
1567 if (flag_traditional
1568 && TYPE_MAIN_VARIANT (type) == float_type_node)
1569 return convert (double_type_node, exp);
1575 build_object_ref (datum, basetype, field)
1576 tree datum, basetype, field;
1579 if (datum == error_mark_node)
1580 return error_mark_node;
1582 dtype = TREE_TYPE (datum);
1583 if (TREE_CODE (dtype) == REFERENCE_TYPE)
1584 dtype = TREE_TYPE (dtype);
1585 if (! IS_AGGR_TYPE_CODE (TREE_CODE (dtype)))
1587 cp_error ("request for member `%T::%D' in expression of non-aggregate type `%T'",
1588 basetype, field, dtype);
1589 return error_mark_node;
1591 else if (IS_SIGNATURE (basetype))
1593 warning ("signature name in scope resolution ignored");
1594 return build_component_ref (datum, field, NULL_TREE, 1);
1596 else if (is_aggr_type (basetype, 1))
1598 tree binfo = binfo_or_else (basetype, dtype);
1600 return build_component_ref (build_scoped_ref (datum, basetype),
1603 return error_mark_node;
1606 /* Like `build_component_ref, but uses an already found field.
1607 Must compute access for C_C_D. Otherwise, ok. */
1609 build_component_ref_1 (datum, field, protect)
1613 register tree basetype = TREE_TYPE (datum);
1614 register enum tree_code code = TREE_CODE (basetype);
1617 if (code == REFERENCE_TYPE)
1619 datum = convert_from_reference (datum);
1620 basetype = TREE_TYPE (datum);
1621 code = TREE_CODE (basetype);
1624 if (! IS_AGGR_TYPE_CODE (code))
1626 if (code != ERROR_MARK)
1627 cp_error ("request for member `%D' in `%E', which is of non-aggregate type `%T'",
1628 field, datum, basetype);
1629 return error_mark_node;
1632 if (TYPE_SIZE (basetype) == 0)
1634 incomplete_type_error (0, basetype);
1635 return error_mark_node;
1638 /* Look up component name in the structure type definition. */
1640 if (field == error_mark_node)
1641 my_friendly_abort (115);
1643 if (TREE_STATIC (field))
1648 tree access = compute_access (TYPE_BINFO (current_class_type), field);
1650 if (access == access_private_node)
1652 cp_error ("field `%D' is private", field);
1653 return error_mark_node;
1655 else if (access == access_protected_node)
1657 cp_error ("field `%D' is protected", field);
1658 return error_mark_node;
1662 ref = build (COMPONENT_REF, TREE_TYPE (field), datum, field);
1664 if (TREE_READONLY (datum) || TREE_READONLY (field))
1665 TREE_READONLY (ref) = 1;
1666 if (TREE_THIS_VOLATILE (datum) || TREE_THIS_VOLATILE (field))
1667 TREE_THIS_VOLATILE (ref) = 1;
1668 if (DECL_MUTABLE_P (field))
1669 TREE_READONLY (ref) = 0;
1674 /* Given a COND_EXPR in T, return it in a form that we can, for
1675 example, use as an lvalue. This code used to be in unary_complex_lvalue,
1676 but we needed it to deal with `a = (d == c) ? b : c' expressions, where
1677 we're dealing with aggregates. So, we now call this in unary_complex_lvalue,
1678 and in build_modify_expr. The case (in particular) that led to this was
1679 with CODE == ADDR_EXPR, since it's not an lvalue when we'd get it there. */
1681 rationalize_conditional_expr (code, t)
1682 enum tree_code code;
1686 build_conditional_expr (TREE_OPERAND (t, 0),
1687 build_unary_op (code, TREE_OPERAND (t, 1), 0),
1688 build_unary_op (code, TREE_OPERAND (t, 2), 0));
1691 /* Given the TYPE of an anonymous union field inside T, return the
1692 FIELD_DECL for the field. If not found return NULL_TREE. Because
1693 anonymous unions can nest, we must also search all anonymous unions
1694 that are directly reachable. */
1696 lookup_anon_field (t, type)
1701 for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field))
1703 if (TREE_STATIC (field))
1705 if (TREE_CODE (field) != FIELD_DECL)
1708 /* If we find it directly, return the field. */
1709 if (DECL_NAME (field) == NULL_TREE
1710 && type == TREE_TYPE (field))
1715 /* Otherwise, it could be nested, search harder. */
1716 if (DECL_NAME (field) == NULL_TREE
1717 && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
1719 tree subfield = lookup_anon_field (TREE_TYPE (field), type);
1727 /* Build a COMPONENT_REF for a given DATUM, and it's member COMPONENT.
1728 COMPONENT can be an IDENTIFIER_NODE that is the name of the member
1729 that we are interested in, or it can be a FIELD_DECL. */
1731 build_component_ref (datum, component, basetype_path, protect)
1732 tree datum, component, basetype_path;
1735 register tree basetype = TREE_TYPE (datum);
1736 register enum tree_code code;
1737 register tree field = NULL;
1740 if (current_template_parms)
1741 return build_min_nt (COMPONENT_REF, datum, component);
1743 /* If DATUM is a COMPOUND_EXPR or COND_EXPR, move our reference inside it. */
1744 switch (TREE_CODE (datum))
1748 tree value = build_component_ref (TREE_OPERAND (datum, 1), component,
1749 basetype_path, protect);
1750 return build (COMPOUND_EXPR, TREE_TYPE (value),
1751 TREE_OPERAND (datum, 0), value);
1754 return build_conditional_expr
1755 (TREE_OPERAND (datum, 0),
1756 build_component_ref (TREE_OPERAND (datum, 1), component,
1757 basetype_path, protect),
1758 build_component_ref (TREE_OPERAND (datum, 2), component,
1759 basetype_path, protect));
1762 code = TREE_CODE (basetype);
1764 if (code == REFERENCE_TYPE)
1766 datum = convert_from_reference (datum);
1767 basetype = TREE_TYPE (datum);
1768 code = TREE_CODE (basetype);
1770 if (TREE_CODE (datum) == OFFSET_REF)
1772 datum = resolve_offset_ref (datum);
1773 basetype = TREE_TYPE (datum);
1774 code = TREE_CODE (basetype);
1777 /* First, see if there is a field or component with name COMPONENT. */
1778 if (TREE_CODE (component) == TREE_LIST)
1780 my_friendly_assert (!(TREE_CHAIN (component) == NULL_TREE
1781 && DECL_CHAIN (TREE_VALUE (component)) == NULL_TREE), 309);
1782 return build (COMPONENT_REF, TREE_TYPE (component), datum, component);
1785 if (! IS_AGGR_TYPE_CODE (code))
1787 if (code != ERROR_MARK)
1788 cp_error ("request for member `%D' in `%E', which is of non-aggregate type `%T'",
1789 component, datum, basetype);
1790 return error_mark_node;
1793 if (TYPE_SIZE (complete_type (basetype)) == 0)
1795 incomplete_type_error (0, basetype);
1796 return error_mark_node;
1799 if (TREE_CODE (component) == BIT_NOT_EXPR)
1801 if (TYPE_IDENTIFIER (basetype) != TREE_OPERAND (component, 0))
1803 cp_error ("destructor specifier `%T::~%T' must have matching names",
1804 basetype, TREE_OPERAND (component, 0));
1805 return error_mark_node;
1807 if (! TYPE_HAS_DESTRUCTOR (basetype))
1809 cp_error ("type `%T' has no destructor", basetype);
1810 return error_mark_node;
1812 return TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1);
1815 /* Look up component name in the structure type definition. */
1816 if (CLASSTYPE_VFIELD (basetype)
1817 && DECL_NAME (CLASSTYPE_VFIELD (basetype)) == component)
1818 /* Special-case this because if we use normal lookups in an ambiguous
1819 hierarchy, the compiler will abort (because vptr lookups are
1820 not supposed to be ambiguous. */
1821 field = CLASSTYPE_VFIELD (basetype);
1822 else if (TREE_CODE (component) == FIELD_DECL)
1828 if (basetype_path == NULL_TREE)
1829 basetype_path = TYPE_BINFO (basetype);
1830 field = lookup_field (basetype_path, component,
1831 protect && ! VFIELD_NAME_P (component), 0);
1832 if (field == error_mark_node)
1833 return error_mark_node;
1835 if (field == NULL_TREE)
1837 /* Not found as a data field, look for it as a method. If found,
1838 then if this is the only possible one, return it, else
1839 report ambiguity error. */
1840 tree fndecls = lookup_fnfields (basetype_path, component, 1);
1841 if (fndecls == error_mark_node)
1842 return error_mark_node;
1845 if (TREE_CHAIN (fndecls) == NULL_TREE
1846 && DECL_CHAIN (TREE_VALUE (fndecls)) == NULL_TREE)
1848 tree access, fndecl;
1850 /* Unique, so use this one now. */
1851 basetype = TREE_PURPOSE (fndecls);
1852 fndecl = TREE_VALUE (fndecls);
1853 access = compute_access (TREE_PURPOSE (fndecls), fndecl);
1854 if (access == access_public_node)
1856 if (DECL_VINDEX (fndecl)
1857 && ! resolves_to_fixed_type_p (datum, 0))
1859 tree addr = build_unary_op (ADDR_EXPR, datum, 0);
1860 addr = convert_pointer_to (DECL_CONTEXT (fndecl), addr);
1861 datum = build_indirect_ref (addr, NULL_PTR);
1862 my_friendly_assert (datum != error_mark_node, 310);
1863 fndecl = build_vfn_ref (&addr, datum, DECL_VINDEX (fndecl));
1868 if (access == access_protected_node)
1869 cp_error ("member function `%D' is protected", fndecl);
1871 cp_error ("member function `%D' is private", fndecl);
1872 return error_mark_node;
1876 /* Just act like build_offset_ref, since the object does
1877 not matter unless we're actually calling the function. */
1880 t = build_tree_list (error_mark_node, fndecls);
1881 TREE_TYPE (t) = build_offset_type (basetype,
1887 cp_error ("`%#T' has no member named `%D'", basetype, component);
1888 return error_mark_node;
1890 else if (TREE_TYPE (field) == error_mark_node)
1891 return error_mark_node;
1893 if (TREE_CODE (field) != FIELD_DECL)
1895 if (TREE_CODE (field) == TYPE_DECL)
1897 cp_error ("invalid use of type decl `%#D' as expression", field);
1898 return error_mark_node;
1900 else if (DECL_RTL (field) != 0)
1903 TREE_USED (field) = 1;
1908 /* See if we have to do any conversions so that we pick up the field from the
1910 if (DECL_FIELD_CONTEXT (field) != basetype)
1912 tree context = DECL_FIELD_CONTEXT (field);
1913 tree base = context;
1914 while (base != basetype && TYPE_NAME (base)
1915 && ANON_AGGRNAME_P (TYPE_IDENTIFIER (base)))
1917 base = TYPE_CONTEXT (base);
1920 /* Handle base classes here... */
1921 if (base != basetype && TYPE_USES_COMPLEX_INHERITANCE (basetype))
1923 tree addr = build_unary_op (ADDR_EXPR, datum, 0);
1924 if (integer_zerop (addr))
1926 error ("invalid reference to NULL ptr, use ptr-to-member instead");
1927 return error_mark_node;
1929 if (VBASE_NAME_P (DECL_NAME (field)))
1931 /* It doesn't matter which vbase pointer we grab, just
1932 find one of them. */
1933 tree binfo = get_binfo (base,
1934 TREE_TYPE (TREE_TYPE (addr)), 0);
1935 addr = convert_pointer_to_real (binfo, addr);
1938 addr = convert_pointer_to (base, addr);
1939 datum = build_indirect_ref (addr, NULL_PTR);
1940 my_friendly_assert (datum != error_mark_node, 311);
1944 /* Handle things from anon unions here... */
1945 if (TYPE_NAME (context) && ANON_AGGRNAME_P (TYPE_IDENTIFIER (context)))
1947 tree subfield = lookup_anon_field (basetype, context);
1948 tree subdatum = build_component_ref (datum, subfield,
1949 basetype_path, protect);
1950 return build_component_ref (subdatum, field, basetype_path, protect);
1954 ref = fold (build (COMPONENT_REF, TREE_TYPE (field),
1955 break_out_cleanups (datum), field));
1957 if (TREE_READONLY (datum) || TREE_READONLY (field))
1958 TREE_READONLY (ref) = 1;
1959 if (TREE_THIS_VOLATILE (datum) || TREE_THIS_VOLATILE (field))
1960 TREE_THIS_VOLATILE (ref) = 1;
1961 if (DECL_MUTABLE_P (field))
1962 TREE_READONLY (ref) = 0;
1967 /* Given an expression PTR for a pointer, return an expression
1968 for the value pointed to.
1969 ERRORSTRING is the name of the operator to appear in error messages.
1971 This function may need to overload OPERATOR_FNNAME.
1972 Must also handle REFERENCE_TYPEs for C++. */
1975 build_x_indirect_ref (ptr, errorstring)
1981 if (current_template_parms)
1982 return build_min_nt (INDIRECT_REF, ptr);
1984 rval = build_opfncall (INDIRECT_REF, LOOKUP_NORMAL, ptr, NULL_TREE, NULL_TREE);
1987 return build_indirect_ref (ptr, errorstring);
1991 build_indirect_ref (ptr, errorstring)
1995 register tree pointer = (TREE_CODE (TREE_TYPE (ptr)) == REFERENCE_TYPE ?
1996 ptr : default_conversion (ptr));
1997 register tree type = TREE_TYPE (pointer);
1999 if (ptr == current_class_decl)
2002 if (IS_AGGR_TYPE (type))
2004 ptr = build_expr_type_conversion (WANT_POINTER, pointer, 1);
2009 type = TREE_TYPE (pointer);
2013 if (TREE_CODE (type) == POINTER_TYPE || TREE_CODE (type) == REFERENCE_TYPE)
2015 if (TREE_CODE (pointer) == ADDR_EXPR
2016 && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (pointer, 0)))
2017 == TYPE_MAIN_VARIANT (TREE_TYPE (type)))
2018 && (TREE_READONLY (TREE_OPERAND (pointer, 0))
2019 == TYPE_READONLY (TREE_TYPE (type)))
2020 && (TREE_THIS_VOLATILE (TREE_OPERAND (pointer, 0))
2021 == TYPE_VOLATILE (TREE_TYPE (type))))
2022 return TREE_OPERAND (pointer, 0);
2025 tree t = TREE_TYPE (type);
2026 register tree ref = build1 (INDIRECT_REF,
2027 TYPE_MAIN_VARIANT (t), pointer);
2029 TREE_READONLY (ref) = TYPE_READONLY (t);
2030 TREE_THIS_VOLATILE (ref) = TYPE_VOLATILE (t);
2031 TREE_SIDE_EFFECTS (ref)
2032 = TYPE_VOLATILE (t) || TREE_SIDE_EFFECTS (pointer);
2036 /* `pointer' won't be an error_mark_node if we were given a
2037 pointer to member, so it's cool to check for this here. */
2038 else if (TYPE_PTRMEMFUNC_P (type))
2039 error ("invalid use of `%s' on pointer to member function", errorstring);
2040 else if (TREE_CODE (type) == RECORD_TYPE
2041 && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type)))
2042 error ("cannot dereference signature pointer/reference");
2043 else if (pointer != error_mark_node)
2046 error ("invalid type argument of `%s'", errorstring);
2048 error ("invalid type argument");
2050 return error_mark_node;
2053 /* This handles expressions of the form "a[i]", which denotes
2056 This is logically equivalent in C to *(a+i), but we may do it differently.
2057 If A is a variable or a member, we generate a primitive ARRAY_REF.
2058 This avoids forcing the array out of registers, and can work on
2059 arrays that are not lvalues (for example, members of structures returned
2062 If INDEX is of some user-defined type, it must be converted to
2063 integer type. Otherwise, to make a compatible PLUS_EXPR, it
2064 will inherit the type of the array, which will be some pointer type. */
2067 build_x_array_ref (array, index)
2070 tree rval = build_opfncall (ARRAY_REF, LOOKUP_NORMAL, array, index, NULL_TREE);
2073 return build_array_ref (array, index);
2077 build_array_ref (array, idx)
2082 error ("subscript missing in array reference");
2083 return error_mark_node;
2086 if (TREE_TYPE (array) == error_mark_node
2087 || TREE_TYPE (idx) == error_mark_node)
2088 return error_mark_node;
2090 if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE
2091 && TREE_CODE (array) != INDIRECT_REF)
2095 /* Subscripting with type char is likely to lose
2096 on a machine where chars are signed.
2097 So warn on any machine, but optionally.
2098 Don't warn for unsigned char since that type is safe.
2099 Don't warn for signed char because anyone who uses that
2100 must have done so deliberately. */
2101 if (warn_char_subscripts
2102 && TYPE_MAIN_VARIANT (TREE_TYPE (idx)) == char_type_node)
2103 warning ("array subscript has type `char'");
2105 /* Apply default promotions *after* noticing character types. */
2106 idx = default_conversion (idx);
2108 if (TREE_CODE (TREE_TYPE (idx)) != INTEGER_TYPE)
2110 error ("array subscript is not an integer");
2111 return error_mark_node;
2114 /* An array that is indexed by a non-constant
2115 cannot be stored in a register; we must be able to do
2116 address arithmetic on its address.
2117 Likewise an array of elements of variable size. */
2118 if (TREE_CODE (idx) != INTEGER_CST
2119 || (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))) != 0
2120 && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array)))) != INTEGER_CST))
2122 if (mark_addressable (array) == 0)
2123 return error_mark_node;
2125 /* An array that is indexed by a constant value which is not within
2126 the array bounds cannot be stored in a register either; because we
2127 would get a crash in store_bit_field/extract_bit_field when trying
2128 to access a non-existent part of the register. */
2129 if (TREE_CODE (idx) == INTEGER_CST
2130 && TYPE_VALUES (TREE_TYPE (array))
2131 && ! int_fits_type_p (idx, TYPE_VALUES (TREE_TYPE (array))))
2133 if (mark_addressable (array) == 0)
2134 return error_mark_node;
2137 if (pedantic && !lvalue_p (array))
2138 pedwarn ("ANSI C++ forbids subscripting non-lvalue array");
2140 /* Note in C++ it is valid to subscript a `register' array, since
2141 it is valid to take the address of something with that
2142 storage specification. */
2146 while (TREE_CODE (foo) == COMPONENT_REF)
2147 foo = TREE_OPERAND (foo, 0);
2148 if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo))
2149 warning ("subscripting array declared `register'");
2152 type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (array)));
2153 rval = build (ARRAY_REF, type, array, idx);
2154 /* Array ref is const/volatile if the array elements are
2155 or if the array is.. */
2156 TREE_READONLY (rval)
2157 |= (TYPE_READONLY (TREE_TYPE (TREE_TYPE (array)))
2158 | TREE_READONLY (array));
2159 TREE_SIDE_EFFECTS (rval)
2160 |= (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (array)))
2161 | TREE_SIDE_EFFECTS (array));
2162 TREE_THIS_VOLATILE (rval)
2163 |= (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (array)))
2164 /* This was added by rms on 16 Nov 91.
2165 It fixes vol struct foo *a; a->elts[1]
2166 in an inline function.
2167 Hope it doesn't break something else. */
2168 | TREE_THIS_VOLATILE (array));
2169 return require_complete_type (fold (rval));
2173 tree ar = default_conversion (array);
2174 tree ind = default_conversion (idx);
2176 /* Put the integer in IND to simplify error checking. */
2177 if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE)
2184 if (ar == error_mark_node)
2187 if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE)
2189 error ("subscripted value is neither array nor pointer");
2190 return error_mark_node;
2192 if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
2194 error ("array subscript is not an integer");
2195 return error_mark_node;
2198 return build_indirect_ref (build_binary_op_nodefault (PLUS_EXPR, ar, ind, PLUS_EXPR),
2203 /* Build a function call to function FUNCTION with parameters PARAMS.
2204 PARAMS is a list--a chain of TREE_LIST nodes--in which the
2205 TREE_VALUE of each node is a parameter-expression.
2206 FUNCTION's data type may be a function type or a pointer-to-function.
2208 For C++: If FUNCTION's data type is a TREE_LIST, then the tree list
2209 is the list of possible methods that FUNCTION could conceivably
2210 be. If the list of methods comes from a class, then it will be
2211 a list of lists (where each element is associated with the class
2212 that produced it), otherwise it will be a simple list (for
2213 functions overloaded in global scope).
2215 In the first case, TREE_VALUE (function) is the head of one of those
2216 lists, and TREE_PURPOSE is the name of the function.
2218 In the second case, TREE_PURPOSE (function) is the function's
2221 DECL is the class instance variable, usually CURRENT_CLASS_DECL. */
2224 * [eichin:19911015.1726EST] actually return a possibly incomplete
2228 build_x_function_call (function, params, decl)
2229 tree function, params, decl;
2234 if (function == error_mark_node)
2235 return error_mark_node;
2237 if (current_template_parms)
2238 return build_min_nt (CALL_EXPR, function, params, 0);
2240 type = TREE_TYPE (function);
2242 if (TREE_CODE (type) == OFFSET_TYPE
2243 && TREE_TYPE (type) == unknown_type_node
2244 && TREE_CODE (function) == TREE_LIST
2245 && TREE_CHAIN (function) == NULL_TREE)
2247 /* Undo (Foo:bar)()... */
2248 type = TYPE_OFFSET_BASETYPE (type);
2249 function = TREE_VALUE (function);
2250 my_friendly_assert (TREE_CODE (function) == TREE_LIST, 999);
2251 my_friendly_assert (TREE_CHAIN (function) == NULL_TREE, 999);
2252 function = TREE_VALUE (function);
2253 my_friendly_assert (TREE_CODE (function) == FUNCTION_DECL, 999);
2254 function = DECL_NAME (function);
2255 return build_method_call (decl, function, params, TYPE_BINFO (type), LOOKUP_NORMAL);
2258 is_method = ((TREE_CODE (function) == TREE_LIST
2259 && current_class_type != NULL_TREE
2260 && IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (function)) == function)
2261 || TREE_CODE (function) == IDENTIFIER_NODE
2262 || TREE_CODE (type) == METHOD_TYPE
2263 || TYPE_PTRMEMFUNC_P (type));
2265 if (TREE_CODE (function) == FUNCTION_DECL
2266 && DECL_STATIC_FUNCTION_P (function))
2267 return build_member_call
2268 (DECL_CONTEXT (function), DECL_NAME (function), params);
2270 /* Handle methods, friends, and overloaded functions, respectively. */
2273 if (TREE_CODE (function) == FUNCTION_DECL)
2275 if (DECL_NAME (function))
2276 function = DECL_NAME (function);
2278 function = TYPE_IDENTIFIER (DECL_CLASS_CONTEXT (function));
2280 else if (TREE_CODE (function) == TREE_LIST)
2282 my_friendly_assert (TREE_CODE (TREE_VALUE (function)) == FUNCTION_DECL, 312);
2283 function = TREE_PURPOSE (function);
2285 else if (TREE_CODE (function) != IDENTIFIER_NODE)
2287 if (TREE_CODE (function) == OFFSET_REF)
2289 if (TREE_OPERAND (function, 0))
2290 decl = TREE_OPERAND (function, 0);
2292 /* Call via a pointer to member function. */
2293 if (decl == NULL_TREE)
2295 error ("pointer to member function called, but not in class scope");
2296 return error_mark_node;
2298 /* What other type of POINTER_TYPE could this be? */
2299 if (TREE_CODE (TREE_TYPE (function)) != POINTER_TYPE
2300 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (function))
2301 && TREE_CODE (function) != OFFSET_REF)
2302 function = build (OFFSET_REF, TREE_TYPE (type), NULL_TREE, function);
2306 /* this is an abbreviated method call.
2307 must go through here in case it is a virtual function.
2308 @@ Perhaps this could be optimized. */
2310 if (decl == NULL_TREE)
2312 if (current_class_type == NULL_TREE)
2314 error ("object missing in call to method `%s'",
2315 IDENTIFIER_POINTER (function));
2316 return error_mark_node;
2318 /* Yow: call from a static member function. */
2319 decl = build1 (NOP_EXPR, build_pointer_type (current_class_type),
2321 decl = build_indirect_ref (decl, NULL_PTR);
2324 return build_method_call (decl, function, params,
2325 NULL_TREE, LOOKUP_NORMAL);
2327 else if (TREE_CODE (function) == COMPONENT_REF
2328 && type == unknown_type_node)
2330 /* Should we undo what was done in build_component_ref? */
2331 if (TREE_CODE (TREE_PURPOSE (TREE_OPERAND (function, 1))) == TREE_VEC)
2332 /* Get the name that build_component_ref hid. */
2333 function = DECL_NAME (TREE_VALUE (TREE_OPERAND (function, 1)));
2335 function = TREE_PURPOSE (TREE_OPERAND (function, 1));
2336 return build_method_call (decl, function, params,
2337 NULL_TREE, LOOKUP_NORMAL);
2339 else if (TREE_CODE (function) == TREE_LIST)
2341 if (TREE_VALUE (function) == NULL_TREE)
2343 cp_error ("function `%D' declared overloaded, but no definitions appear with which to resolve it?!?",
2344 TREE_PURPOSE (function));
2345 return error_mark_node;
2349 tree val = TREE_VALUE (function);
2351 if (TREE_CODE (val) == TEMPLATE_DECL)
2352 return build_overload_call_maybe
2353 (function, params, LOOKUP_COMPLAIN, (struct candidate *)0);
2354 else if (DECL_CHAIN (val) != NULL_TREE)
2355 return build_overload_call
2356 (function, params, LOOKUP_COMPLAIN, (struct candidate *)0);
2358 my_friendly_abort (360);
2363 if (TREE_CODE (function) == OFFSET_REF)
2365 /* If the component is a data element (or a virtual function), we play
2366 games here to make things work. */
2369 if (TREE_OPERAND (function, 0))
2370 decl = TREE_OPERAND (function, 0);
2374 decl_addr = build_unary_op (ADDR_EXPR, decl, 0);
2375 function = get_member_function_from_ptrfunc (&decl_addr,
2376 TREE_OPERAND (function, 1));
2377 params = tree_cons (NULL_TREE, decl_addr, params);
2378 return build_function_call (function, params);
2381 type = TREE_TYPE (function);
2382 if (type != error_mark_node)
2384 if (TREE_CODE (type) == REFERENCE_TYPE)
2385 type = TREE_TYPE (type);
2387 if (TYPE_LANG_SPECIFIC (type)
2388 && TYPE_OVERLOADS_CALL_EXPR (complete_type (type)))
2389 return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, function, params, NULL_TREE);
2394 tree fntype = TREE_TYPE (function);
2397 /* Explicitly named method? */
2398 if (TREE_CODE (function) == FUNCTION_DECL)
2399 ctypeptr = build_pointer_type (DECL_CLASS_CONTEXT (function));
2400 /* Expression with ptr-to-method type? It could either be a plain
2401 usage, or it might be a case where the ptr-to-method is being
2402 passed in as an argument. */
2403 else if (TYPE_PTRMEMFUNC_P (fntype))
2405 tree rec = TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (fntype)));
2406 ctypeptr = build_pointer_type (rec);
2408 /* Unexpected node type? */
2410 my_friendly_abort (116);
2411 if (decl == NULL_TREE)
2413 if (current_function_decl
2414 && DECL_STATIC_FUNCTION_P (current_function_decl))
2415 error ("invalid call to member function needing `this' in static member function scope");
2417 error ("pointer to member function called, but not in class scope");
2418 return error_mark_node;
2420 if (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
2421 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (decl)))
2423 decl = build_unary_op (ADDR_EXPR, decl, 0);
2424 decl = convert_pointer_to (TREE_TYPE (ctypeptr), decl);
2427 decl = build_c_cast (ctypeptr, decl, 0);
2428 params = tree_cons (NULL_TREE, decl, params);
2431 return build_function_call (function, params);
2434 /* Resolve a pointer to member function. INSTANCE is the object
2435 instance to use, if the member points to a virtual member. */
2438 get_member_function_from_ptrfunc (instance_ptrptr, function)
2439 tree *instance_ptrptr;
2442 if (TREE_CODE (function) == OFFSET_REF)
2444 function = TREE_OPERAND (function, 1);
2447 if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function)))
2449 tree fntype, index, e1, delta, delta2, e2, e3, aref, vtbl;
2452 tree instance_ptr = *instance_ptrptr;
2454 if (TREE_SIDE_EFFECTS (instance_ptr))
2455 instance_ptr = save_expr (instance_ptr);
2457 if (TREE_SIDE_EFFECTS (function))
2458 function = save_expr (function);
2460 fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function));
2461 index = save_expr (build_component_ref (function,
2464 e1 = build (GT_EXPR, boolean_type_node, index,
2465 convert (delta_type_node, integer_zero_node));
2466 delta = convert (ptrdiff_type_node,
2467 build_component_ref (function, delta_identifier, 0, 0));
2468 delta2 = DELTA2_FROM_PTRMEMFUNC (function);
2470 /* convert down to the right base, before using the instance. */
2472 = convert_pointer_to_real (TYPE_METHOD_BASETYPE (TREE_TYPE (fntype)),
2474 if (instance == error_mark_node)
2477 vtbl = convert_pointer_to (ptr_type_node, instance);
2480 build_pointer_type (build_pointer_type (vtable_entry_type)),
2481 vtbl, convert (ptrdiff_type_node, delta2));
2482 vtbl = build_indirect_ref (vtbl, NULL_PTR);
2483 aref = build_array_ref (vtbl, build_binary_op (MINUS_EXPR,
2485 integer_one_node, 1));
2486 if (! flag_vtable_thunks)
2488 aref = save_expr (aref);
2490 /* Save the intermediate result in a SAVE_EXPR so we don't have to
2491 compute each component of the virtual function pointer twice. */
2492 if (TREE_CODE (aref) == INDIRECT_REF)
2493 TREE_OPERAND (aref, 0) = save_expr (TREE_OPERAND (aref, 0));
2495 delta = build_binary_op (PLUS_EXPR,
2496 build_conditional_expr (e1, build_component_ref (aref, delta_identifier, 0, 0), integer_zero_node),
2500 *instance_ptrptr = build (PLUS_EXPR, TREE_TYPE (instance_ptr),
2501 instance_ptr, delta);
2502 if (flag_vtable_thunks)
2505 e2 = build_component_ref (aref, pfn_identifier, 0, 0);
2507 e3 = PFN_FROM_PTRMEMFUNC (function);
2508 TREE_TYPE (e2) = TREE_TYPE (e3);
2509 function = build_conditional_expr (e1, e2, e3);
2511 /* Make sure this doesn't get evaluated first inside one of the
2512 branches of the COND_EXPR. */
2513 if (TREE_CODE (instance_ptr) == SAVE_EXPR)
2514 function = build (COMPOUND_EXPR, TREE_TYPE (function),
2515 instance_ptr, function);
2521 build_function_call_real (function, params, require_complete, flags)
2522 tree function, params;
2523 int require_complete, flags;
2525 register tree fntype, fndecl;
2526 register tree value_type;
2527 register tree coerced_params;
2528 tree name = NULL_TREE, assembler_name = NULL_TREE;
2531 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2532 Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context. */
2533 if (TREE_CODE (function) == NOP_EXPR
2534 && TREE_TYPE (function) == TREE_TYPE (TREE_OPERAND (function, 0)))
2535 function = TREE_OPERAND (function, 0);
2537 if (TREE_CODE (function) == FUNCTION_DECL)
2539 name = DECL_NAME (function);
2540 assembler_name = DECL_ASSEMBLER_NAME (function);
2542 GNU_xref_call (current_function_decl,
2543 IDENTIFIER_POINTER (name ? name
2544 : TYPE_IDENTIFIER (DECL_CLASS_CONTEXT (function))));
2545 mark_used (function);
2548 /* Convert anything with function type to a pointer-to-function. */
2551 && IDENTIFIER_LENGTH (name) == 4
2552 && ! strcmp (IDENTIFIER_POINTER (name), "main")
2553 && DECL_CONTEXT (function) == NULL_TREE)
2555 pedwarn ("ANSI C++ forbids calling `main' from within program");
2558 if (pedantic && DECL_THIS_INLINE (function) && ! DECL_INITIAL (function)
2559 && ! DECL_ARTIFICIAL (function)
2560 && ! DECL_PENDING_INLINE_INFO (function))
2561 cp_pedwarn ("inline function `%#D' called before definition",
2564 /* Differs from default_conversion by not setting TREE_ADDRESSABLE
2565 (because calling an inline function does not mean the function
2566 needs to be separately compiled). */
2568 if (DECL_INLINE (function))
2570 /* Is it a synthesized method that needs to be synthesized? */
2571 if (DECL_ARTIFICIAL (function) && ! DECL_INITIAL (function)
2572 /* Kludge: don't synthesize for default args. */
2573 && current_function_decl)
2574 synthesize_method (function);
2576 fntype = build_type_variant (TREE_TYPE (function),
2577 TREE_READONLY (function),
2578 TREE_THIS_VOLATILE (function));
2579 function = build1 (ADDR_EXPR, build_pointer_type (fntype), function);
2582 function = default_conversion (function);
2588 /* Convert anything with function type to a pointer-to-function. */
2589 if (function == error_mark_node)
2590 return error_mark_node;
2591 function = default_conversion (function);
2594 fntype = TREE_TYPE (function);
2596 if (TYPE_PTRMEMFUNC_P (fntype))
2598 tree instance_ptr = build_unary_op (ADDR_EXPR, C_C_D, 0);
2599 fntype = TYPE_PTRMEMFUNC_FN_TYPE (fntype);
2600 function = get_member_function_from_ptrfunc (&instance_ptr, function);
2603 is_method = (TREE_CODE (fntype) == POINTER_TYPE
2604 && TREE_CODE (TREE_TYPE (fntype)) == METHOD_TYPE);
2606 if (!((TREE_CODE (fntype) == POINTER_TYPE
2607 && TREE_CODE (TREE_TYPE (fntype)) == FUNCTION_TYPE)
2610 cp_error ("`%E' cannot be used as a function", function);
2611 return error_mark_node;
2614 /* fntype now gets the type of function pointed to. */
2615 fntype = TREE_TYPE (fntype);
2617 /* Convert the parameters to the types declared in the
2618 function prototype, or apply default promotions. */
2620 if (flags & LOOKUP_COMPLAIN)
2621 coerced_params = convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
2622 params, fndecl, LOOKUP_NORMAL);
2624 coerced_params = convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
2627 if (coerced_params == error_mark_node)
2628 if (flags & LOOKUP_SPECULATIVELY)
2631 return error_mark_node;
2633 /* Check for errors in format strings. */
2635 if (warn_format && (name || assembler_name))
2636 check_function_format (name, assembler_name, coerced_params);
2638 /* Recognize certain built-in functions so we can make tree-codes
2639 other than CALL_EXPR. We do this when it enables fold-const.c
2640 to do something useful. */
2642 if (TREE_CODE (function) == ADDR_EXPR
2643 && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL
2644 && DECL_BUILT_IN (TREE_OPERAND (function, 0)))
2645 switch (DECL_FUNCTION_CODE (TREE_OPERAND (function, 0)))
2650 if (coerced_params == 0)
2651 return integer_zero_node;
2652 return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
2656 value_type = TREE_TYPE (fntype) ? TREE_TYPE (fntype) : void_type_node;
2658 register tree result =
2659 build (CALL_EXPR, value_type,
2660 function, coerced_params, NULL_TREE);
2662 TREE_SIDE_EFFECTS (result) = 1;
2664 if (! require_complete)
2665 return convert_from_reference (result);
2666 if (value_type == void_type_node)
2668 result = require_complete_type (result);
2669 return convert_from_reference (result);
2674 build_function_call (function, params)
2675 tree function, params;
2677 return build_function_call_real (function, params, 1, LOOKUP_NORMAL);
2680 /* Convert the actual parameter expressions in the list VALUES
2681 to the types in the list TYPELIST.
2682 If parmdecls is exhausted, or when an element has NULL as its type,
2683 perform the default conversions.
2685 RETURN_LOC is the location of the return value, if known, NULL_TREE
2686 otherwise. This is useful in the case where we can avoid creating
2687 a temporary variable in the case where we can initialize the return
2688 value directly. If we are not eliding constructors, then we set this
2689 to NULL_TREE to avoid this avoidance.
2691 NAME is an IDENTIFIER_NODE or 0. It is used only for error messages.
2693 This is also where warnings about wrong number of args are generated.
2695 Return a list of expressions for the parameters as converted.
2697 Both VALUES and the returned value are chains of TREE_LIST nodes
2698 with the elements of the list in the TREE_VALUE slots of those nodes.
2700 In C++, unspecified trailing parameters can be filled in with their
2701 default arguments, if such were specified. Do so here. */
2704 convert_arguments (return_loc, typelist, values, fndecl, flags)
2705 tree return_loc, typelist, values, fndecl;
2708 register tree typetail, valtail;
2709 register tree result = NULL_TREE;
2713 if (! flag_elide_constructors)
2718 if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
2720 if (DECL_NAME (fndecl) == NULL_TREE
2721 || IDENTIFIER_HAS_TYPE_VALUE (DECL_NAME (fndecl)))
2722 called_thing = "constructor";
2724 called_thing = "member function";
2727 called_thing = "function";
2730 for (valtail = values, typetail = typelist;
2732 valtail = TREE_CHAIN (valtail), i++)
2734 register tree type = typetail ? TREE_VALUE (typetail) : 0;
2735 register tree val = TREE_VALUE (valtail);
2737 if (val == error_mark_node)
2738 return error_mark_node;
2740 if (type == void_type_node)
2744 cp_error_at ("too many arguments to %s `%+D'", called_thing,
2746 error ("at this point in file");
2749 error ("too many arguments to function");
2750 /* In case anybody wants to know if this argument
2753 TREE_TYPE (tree_last (result)) = error_mark_node;
2757 /* The tree type of the parameter being passed may not yet be
2758 known. In this case, its type is TYPE_UNKNOWN, and will
2759 be instantiated by the type given by TYPE. If TYPE
2760 is also NULL, the tree type of VAL is ERROR_MARK_NODE. */
2761 if (type && type_unknown_p (val))
2762 val = require_instantiated_type (type, val, integer_zero_node);
2763 else if (type_unknown_p (val))
2765 /* Strip the `&' from an overloaded FUNCTION_DECL. */
2766 if (TREE_CODE (val) == ADDR_EXPR)
2767 val = TREE_OPERAND (val, 0);
2768 if (TREE_CODE (val) == TREE_LIST
2769 && TREE_CHAIN (val) == NULL_TREE
2770 && TREE_TYPE (TREE_VALUE (val)) != NULL_TREE
2771 && (TREE_TYPE (val) == unknown_type_node
2772 || DECL_CHAIN (TREE_VALUE (val)) == NULL_TREE))
2773 /* Instantiates automatically. */
2774 val = TREE_VALUE (val);
2777 error ("insufficient type information in parameter list");
2778 val = integer_zero_node;
2781 else if (TREE_CODE (val) == OFFSET_REF
2782 && TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE)
2784 /* This is unclean. Should be handled elsewhere. */
2785 val = build_unary_op (ADDR_EXPR, val, 0);
2787 else if (TREE_CODE (val) == OFFSET_REF)
2788 val = resolve_offset_ref (val);
2790 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2791 Strip such NOP_EXPRs, since VAL is used in non-lvalue context. */
2792 if (TREE_CODE (val) == NOP_EXPR
2793 && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))
2794 && (type == 0 || TREE_CODE (type) != REFERENCE_TYPE))
2795 val = TREE_OPERAND (val, 0);
2797 if (type == 0 || TREE_CODE (type) != REFERENCE_TYPE)
2799 if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE
2800 || TREE_CODE (TREE_TYPE (val)) == FUNCTION_TYPE
2801 || TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE)
2802 val = default_conversion (val);
2804 val = require_complete_type (val);
2807 if (val == error_mark_node)
2808 return error_mark_node;
2812 /* Formal parm type is specified by a function prototype. */
2815 if (TYPE_SIZE (complete_type (type)) == 0)
2817 error ("parameter type of called function is incomplete");
2822 parmval = convert_for_initialization (return_loc, type, val,
2823 flags|INDIRECT_BIND,
2824 "argument passing", fndecl, i);
2825 #ifdef PROMOTE_PROTOTYPES
2826 if ((TREE_CODE (type) == INTEGER_TYPE
2827 || TREE_CODE (type) == ENUMERAL_TYPE)
2828 && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
2829 parmval = default_conversion (parmval);
2833 if (parmval == error_mark_node)
2834 return error_mark_node;
2836 result = tree_cons (NULL_TREE, parmval, result);
2840 if (TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE)
2841 val = convert_from_reference (val);
2843 if (TREE_CODE (TREE_TYPE (val)) == REAL_TYPE
2844 && (TYPE_PRECISION (TREE_TYPE (val))
2845 < TYPE_PRECISION (double_type_node)))
2846 /* Convert `float' to `double'. */
2847 result = tree_cons (NULL_TREE, convert (double_type_node, val), result);
2848 else if (TYPE_LANG_SPECIFIC (TREE_TYPE (val))
2849 && ! TYPE_HAS_TRIVIAL_INIT_REF (TREE_TYPE (val)))
2851 cp_warning ("cannot pass objects of type `%T' through `...'",
2853 result = tree_cons (NULL_TREE, val, result);
2856 /* Convert `short' and `char' to full-size `int'. */
2857 result = tree_cons (NULL_TREE, default_conversion (val), result);
2861 typetail = TREE_CHAIN (typetail);
2864 if (typetail != 0 && typetail != void_list_node)
2866 /* See if there are default arguments that can be used */
2867 if (TREE_PURPOSE (typetail))
2869 for (; typetail != void_list_node; ++i)
2871 tree type = TREE_VALUE (typetail);
2872 tree val = break_out_target_exprs (TREE_PURPOSE (typetail));
2875 if (val == NULL_TREE)
2876 parmval = error_mark_node;
2877 else if (TREE_CODE (val) == CONSTRUCTOR)
2879 parmval = digest_init (type, val, (tree *)0);
2880 parmval = convert_for_initialization (return_loc, type, parmval, flags,
2881 "default constructor", fndecl, i);
2885 /* This could get clobbered by the following call. */
2886 if (TREE_HAS_CONSTRUCTOR (val))
2887 val = copy_node (val);
2889 parmval = convert_for_initialization (return_loc, type, val, flags,
2890 "default argument", fndecl, i);
2891 #ifdef PROMOTE_PROTOTYPES
2892 if ((TREE_CODE (type) == INTEGER_TYPE
2893 || TREE_CODE (type) == ENUMERAL_TYPE)
2894 && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
2895 parmval = default_conversion (parmval);
2899 if (parmval == error_mark_node)
2900 return error_mark_node;
2902 result = tree_cons (0, parmval, result);
2903 typetail = TREE_CHAIN (typetail);
2904 /* ends with `...'. */
2905 if (typetail == NULL_TREE)
2913 char *buf = (char *)alloca (32 + strlen (called_thing));
2914 sprintf (buf, "too few arguments to %s `%%#D'", called_thing);
2915 cp_error_at (buf, fndecl);
2916 error ("at this point in file");
2919 error ("too few arguments to function");
2920 return error_mark_list;
2924 return nreverse (result);
2927 /* Build a binary-operation expression, after performing default
2928 conversions on the operands. CODE is the kind of expression to build. */
2931 build_x_binary_op (code, arg1, arg2)
2932 enum tree_code code;
2937 if (current_template_parms)
2938 return build_min_nt (code, arg1, arg2);
2940 rval = build_opfncall (code, LOOKUP_SPECULATIVELY,
2941 arg1, arg2, NULL_TREE);
2943 return build_opfncall (code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE);
2944 if (code == MEMBER_REF)
2945 return build_m_component_ref (build_indirect_ref (arg1, NULL_PTR),
2947 return build_binary_op (code, arg1, arg2, 1);
2951 build_binary_op (code, arg1, arg2, convert_p)
2952 enum tree_code code;
2964 args[0] = decay_conversion (args[0]);
2965 args[1] = decay_conversion (args[1]);
2967 if (args[0] == error_mark_node || args[1] == error_mark_node)
2968 return error_mark_node;
2970 type0 = TREE_TYPE (args[0]);
2971 type1 = TREE_TYPE (args[1]);
2973 if (type_unknown_p (args[0]))
2975 args[0] = instantiate_type (type1, args[0], 1);
2976 args[0] = decay_conversion (args[0]);
2978 else if (type_unknown_p (args[1]))
2980 args[1] = require_instantiated_type (type0, args[1],
2982 args[1] = decay_conversion (args[1]);
2985 if (IS_AGGR_TYPE (type0) || IS_AGGR_TYPE (type1))
2987 /* Try to convert this to something reasonable. */
2988 if (! build_default_binary_type_conversion(code, &args[0], &args[1]))
2990 cp_error ("no match for `%O(%#T, %#T)'", code,
2991 TREE_TYPE (arg1), TREE_TYPE (arg2));
2992 return error_mark_node;
2996 return build_binary_op_nodefault (code, args[0], args[1], code);
2999 /* Build a binary-operation expression without default conversions.
3000 CODE is the kind of expression to build.
3001 This function differs from `build' in several ways:
3002 the data type of the result is computed and recorded in it,
3003 warnings are generated if arg data types are invalid,
3004 special handling for addition and subtraction of pointers is known,
3005 and some optimization is done (operations on narrow ints
3006 are done in the narrower type when that gives the same result).
3007 Constant folding is also done before the result is returned.
3009 ERROR_CODE is the code that determines what to say in error messages.
3010 It is usually, but not always, the same as CODE.
3012 Note that the operands will never have enumeral types
3013 because either they have just had the default conversions performed
3014 or they have both just been converted to some other type in which
3015 the arithmetic is to be done.
3017 C++: must do special pointer arithmetic when implementing
3018 multiple inheritance, and deal with pointer to member functions. */
3021 build_binary_op_nodefault (code, orig_op0, orig_op1, error_code)
3022 enum tree_code code;
3023 tree orig_op0, orig_op1;
3024 enum tree_code error_code;
3027 register enum tree_code code0, code1;
3030 /* Expression code to give to the expression when it is built.
3031 Normally this is CODE, which is what the caller asked for,
3032 but in some special cases we change it. */
3033 register enum tree_code resultcode = code;
3035 /* Data type in which the computation is to be performed.
3036 In the simplest cases this is the common type of the arguments. */
3037 register tree result_type = NULL;
3039 /* Nonzero means operands have already been type-converted
3040 in whatever way is necessary.
3041 Zero means they need to be converted to RESULT_TYPE. */
3044 /* Nonzero means create the expression with this type, rather than
3046 tree build_type = 0;
3048 /* Nonzero means after finally constructing the expression
3049 convert it to this type. */
3050 tree final_type = 0;
3052 /* Nonzero if this is an operation like MIN or MAX which can
3053 safely be computed in short if both args are promoted shorts.
3054 Also implies COMMON.
3055 -1 indicates a bitwise operation; this makes a difference
3056 in the exact conditions for when it is safe to do the operation
3057 in a narrower mode. */
3060 /* Nonzero if this is a comparison operation;
3061 if both args are promoted shorts, compare the original shorts.
3062 Also implies COMMON. */
3063 int short_compare = 0;
3065 /* Nonzero if this is a right-shift operation, which can be computed on the
3066 original short and then promoted if the operand is a promoted short. */
3067 int short_shift = 0;
3069 /* Nonzero means set RESULT_TYPE to the common type of the args. */
3072 /* Apply default conversions. */
3073 if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
3074 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
3075 || code == TRUTH_XOR_EXPR)
3077 op0 = decay_conversion (orig_op0);
3078 op1 = decay_conversion (orig_op1);
3082 op0 = default_conversion (orig_op0);
3083 op1 = default_conversion (orig_op1);
3086 type0 = TREE_TYPE (op0);
3087 type1 = TREE_TYPE (op1);
3089 /* The expression codes of the data types of the arguments tell us
3090 whether the arguments are integers, floating, pointers, etc. */
3091 code0 = TREE_CODE (type0);
3092 code1 = TREE_CODE (type1);
3094 /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue. */
3095 STRIP_TYPE_NOPS (op0);
3096 STRIP_TYPE_NOPS (op1);
3098 /* If an error was already reported for one of the arguments,
3099 avoid reporting another error. */
3101 if (code0 == ERROR_MARK || code1 == ERROR_MARK)
3102 return error_mark_node;
3107 /* Handle the pointer + int case. */
3108 if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3109 return pointer_int_sum (PLUS_EXPR, op0, op1);
3110 else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE)
3111 return pointer_int_sum (PLUS_EXPR, op1, op0);
3117 /* Subtraction of two similar pointers.
3118 We must subtract them as integers, then divide by object size. */
3119 if (code0 == POINTER_TYPE && code1 == POINTER_TYPE
3120 && comp_target_types (type0, type1, 1))
3121 return pointer_diff (op0, op1);
3122 /* Handle pointer minus int. Just like pointer plus int. */
3123 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3124 return pointer_int_sum (MINUS_EXPR, op0, op1);
3133 case TRUNC_DIV_EXPR:
3135 case FLOOR_DIV_EXPR:
3136 case ROUND_DIV_EXPR:
3137 case EXACT_DIV_EXPR:
3138 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3139 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3141 if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
3142 cp_warning ("division by zero in `%E / 0'", op0);
3143 else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
3144 cp_warning ("division by zero in `%E / 0.'", op0);
3146 if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE))
3147 resultcode = RDIV_EXPR;
3149 /* When dividing two signed integers, we have to promote to int.
3150 unless we divide by a constant != -1. Note that default
3151 conversion will have been performed on the operands at this
3152 point, so we have to dig out the original type to find out if
3154 shorten = ((TREE_CODE (op0) == NOP_EXPR
3155 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3156 || (TREE_CODE (op1) == INTEGER_CST
3157 && (TREE_INT_CST_LOW (op1) != -1
3158 || TREE_INT_CST_HIGH (op1) != -1)));
3164 case BIT_ANDTC_EXPR:
3167 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3169 /* If one operand is a constant, and the other is a short type
3170 that has been converted to an int,
3171 really do the work in the short type and then convert the
3172 result to int. If we are lucky, the constant will be 0 or 1
3173 in the short type, making the entire operation go away. */
3174 if (TREE_CODE (op0) == INTEGER_CST
3175 && TREE_CODE (op1) == NOP_EXPR
3176 && TYPE_PRECISION (type1) > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op1, 0)))
3177 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op1, 0))))
3179 final_type = result_type;
3180 op1 = TREE_OPERAND (op1, 0);
3181 result_type = TREE_TYPE (op1);
3183 if (TREE_CODE (op1) == INTEGER_CST
3184 && TREE_CODE (op0) == NOP_EXPR
3185 && TYPE_PRECISION (type0) > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))
3186 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3188 final_type = result_type;
3189 op0 = TREE_OPERAND (op0, 0);
3190 result_type = TREE_TYPE (op0);
3194 case TRUNC_MOD_EXPR:
3195 case FLOOR_MOD_EXPR:
3196 if (code1 == INTEGER_TYPE && integer_zerop (op1))
3197 cp_warning ("division by zero in `%E % 0'", op0);
3198 else if (code1 == REAL_TYPE && real_zerop (op1))
3199 cp_warning ("division by zero in `%E % 0.'", op0);
3201 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3203 /* Although it would be tempting to shorten always here, that loses
3204 on some targets, since the modulo instruction is undefined if the
3205 quotient can't be represented in the computation mode. We shorten
3206 only if unsigned or if dividing by something we know != -1. */
3207 shorten = ((TREE_CODE (op0) == NOP_EXPR
3208 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3209 || (TREE_CODE (op1) == INTEGER_CST
3210 && (TREE_INT_CST_LOW (op1) != -1
3211 || TREE_INT_CST_HIGH (op1) != -1)));
3216 case TRUTH_ANDIF_EXPR:
3217 case TRUTH_ORIF_EXPR:
3218 case TRUTH_AND_EXPR:
3220 result_type = boolean_type_node;
3223 /* Shift operations: result has same type as first operand;
3224 always convert second operand to int.
3225 Also set SHORT_SHIFT if shifting rightward. */
3228 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3230 result_type = type0;
3231 if (TREE_CODE (op1) == INTEGER_CST)
3233 if (tree_int_cst_lt (op1, integer_zero_node))
3234 warning ("right shift count is negative");
3237 if (TREE_INT_CST_LOW (op1) | TREE_INT_CST_HIGH (op1))
3239 if (TREE_INT_CST_HIGH (op1) != 0
3240 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1)
3241 >= TYPE_PRECISION (type0)))
3242 warning ("right shift count >= width of type");
3245 /* Convert the shift-count to an integer, regardless of
3246 size of value being shifted. */
3247 if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3248 op1 = convert (integer_type_node, op1);
3249 /* Avoid converting op1 to result_type later. */
3255 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3257 result_type = type0;
3258 if (TREE_CODE (op1) == INTEGER_CST)
3260 if (tree_int_cst_lt (op1, integer_zero_node))
3261 warning ("left shift count is negative");
3262 else if (TREE_INT_CST_HIGH (op1) != 0
3263 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1)
3264 >= TYPE_PRECISION (type0)))
3265 warning ("left shift count >= width of type");
3267 /* Convert the shift-count to an integer, regardless of
3268 size of value being shifted. */
3269 if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3270 op1 = convert (integer_type_node, op1);
3271 /* Avoid converting op1 to result_type later. */
3278 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3280 result_type = type0;
3281 if (TREE_CODE (op1) == INTEGER_CST)
3283 if (tree_int_cst_lt (op1, integer_zero_node))
3284 warning ("%s rotate count is negative",
3285 (code == LROTATE_EXPR) ? "left" : "right");
3286 else if (TREE_INT_CST_HIGH (op1) != 0
3287 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1)
3288 >= TYPE_PRECISION (type0)))
3289 warning ("%s rotate count >= width of type",
3290 (code == LROTATE_EXPR) ? "left" : "right");
3292 /* Convert the shift-count to an integer, regardless of
3293 size of value being shifted. */
3294 if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3295 op1 = convert (integer_type_node, op1);
3301 build_type = boolean_type_node;
3302 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3303 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3305 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3307 register tree tt0 = TYPE_MAIN_VARIANT (TREE_TYPE (type0));
3308 register tree tt1 = TYPE_MAIN_VARIANT (TREE_TYPE (type1));
3310 if (comp_target_types (type0, type1, 1))
3311 result_type = common_type (type0, type1);
3312 else if (tt0 == void_type_node)
3314 if (pedantic && TREE_CODE (tt1) == FUNCTION_TYPE
3315 && tree_int_cst_lt (TYPE_SIZE (type0), TYPE_SIZE (type1)))
3316 pedwarn ("ANSI C++ forbids comparison of `void *' with function pointer");
3317 else if (TREE_CODE (tt1) == OFFSET_TYPE)
3318 pedwarn ("ANSI C++ forbids conversion of a pointer to member to `void *'");
3320 else if (tt1 == void_type_node)
3322 if (pedantic && TREE_CODE (tt0) == FUNCTION_TYPE
3323 && tree_int_cst_lt (TYPE_SIZE (type1), TYPE_SIZE (type0)))
3324 pedwarn ("ANSI C++ forbids comparison of `void *' with function pointer");
3327 cp_pedwarn ("comparison of distinct pointer types `%T' and `%T' lacks a cast",
3330 if (result_type == NULL_TREE)
3331 result_type = ptr_type_node;
3333 else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
3334 && integer_zerop (op1))
3335 result_type = type0;
3336 else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
3337 && integer_zerop (op0))
3338 result_type = type1;
3339 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3341 result_type = type0;
3342 error ("ANSI C++ forbids comparison between pointer and integer");
3344 else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
3346 result_type = type1;
3347 error ("ANSI C++ forbids comparison between pointer and integer");
3349 else if (TYPE_PTRMEMFUNC_P (type0) && TREE_CODE (op1) == INTEGER_CST
3350 && integer_zerop (op1))
3352 op0 = build_component_ref (op0, index_identifier, 0, 0);
3353 op1 = integer_zero_node;
3354 result_type = TREE_TYPE (op0);
3356 else if (TYPE_PTRMEMFUNC_P (type1) && TREE_CODE (op0) == INTEGER_CST
3357 && integer_zerop (op0))
3359 op0 = build_component_ref (op1, index_identifier, 0, 0);
3360 op1 = integer_zero_node;
3361 result_type = TREE_TYPE (op0);
3363 else if (TYPE_PTRMEMFUNC_P (type0) && TYPE_PTRMEMFUNC_P (type1)
3364 && (TYPE_PTRMEMFUNC_FN_TYPE (type0)
3365 == TYPE_PTRMEMFUNC_FN_TYPE (type1)))
3367 /* The code we generate for the test is:
3369 (op0.index == op1.index
3370 && ((op1.index != -1 && op0.delta2 == op1.delta2)
3371 || op0.pfn == op1.pfn)) */
3373 tree index0 = build_component_ref (op0, index_identifier, 0, 0);
3374 tree index1 = save_expr (build_component_ref (op1, index_identifier, 0, 0));
3375 tree pfn0 = PFN_FROM_PTRMEMFUNC (op0);
3376 tree pfn1 = PFN_FROM_PTRMEMFUNC (op1);
3377 tree delta20 = DELTA2_FROM_PTRMEMFUNC (op0);
3378 tree delta21 = DELTA2_FROM_PTRMEMFUNC (op1);
3380 tree integer_neg_one_node
3381 = build_binary_op (MINUS_EXPR, integer_zero_node, integer_one_node, 1);
3382 e1 = build_binary_op (EQ_EXPR, index0, index1, 1);
3383 e2 = build_binary_op (NE_EXPR, index1, integer_neg_one_node, 1);
3384 e2 = build_binary_op (TRUTH_ANDIF_EXPR, e2, build_binary_op (EQ_EXPR, delta20, delta21, 1), 1);
3385 e3 = build_binary_op (EQ_EXPR, pfn0, pfn1, 1);
3386 e2 = build_binary_op (TRUTH_ORIF_EXPR, e2, e3, 1);
3387 e2 = build_binary_op (TRUTH_ANDIF_EXPR, e1, e2, 1);
3388 if (code == EQ_EXPR)
3390 return build_binary_op (EQ_EXPR, e2, integer_zero_node, 1);
3392 else if (TYPE_PTRMEMFUNC_P (type0)
3393 && TYPE_PTRMEMFUNC_FN_TYPE (type0) == type1)
3395 tree index0 = build_component_ref (op0, index_identifier, 0, 0);
3397 tree pfn0 = PFN_FROM_PTRMEMFUNC (op0);
3398 tree delta20 = DELTA2_FROM_PTRMEMFUNC (op0);
3399 tree delta21 = integer_zero_node;
3401 tree integer_neg_one_node
3402 = build_binary_op (MINUS_EXPR, integer_zero_node, integer_one_node, 1);
3403 if (TREE_CODE (TREE_OPERAND (op1, 0)) == FUNCTION_DECL
3404 && DECL_VINDEX (TREE_OPERAND (op1, 0)))
3406 /* Map everything down one to make room for the null pointer to member. */
3407 index1 = size_binop (PLUS_EXPR,
3408 DECL_VINDEX (TREE_OPERAND (op1, 0)),
3410 op1 = integer_zero_node;
3411 delta21 = CLASSTYPE_VFIELD (TYPE_METHOD_BASETYPE (TREE_TYPE (type1)));
3412 delta21 = DECL_FIELD_BITPOS (delta21);
3413 delta21 = size_binop (FLOOR_DIV_EXPR, delta21, size_int (BITS_PER_UNIT));
3416 index1 = integer_neg_one_node;
3418 tree nop1 = build1 (NOP_EXPR, TYPE_PTRMEMFUNC_FN_TYPE (type0), op1);
3419 TREE_CONSTANT (nop1) = TREE_CONSTANT (op1);
3422 e1 = build_binary_op (EQ_EXPR, index0, index1, 1);
3423 e2 = build_binary_op (NE_EXPR, index1, integer_neg_one_node, 1);
3424 e2 = build_binary_op (TRUTH_ANDIF_EXPR, e2, build_binary_op (EQ_EXPR, delta20, delta21, 1), 1);
3425 e3 = build_binary_op (EQ_EXPR, pfn0, op1, 1);
3426 e2 = build_binary_op (TRUTH_ORIF_EXPR, e2, e3, 1);
3427 e2 = build_binary_op (TRUTH_ANDIF_EXPR, e1, e2, 1);
3428 if (code == EQ_EXPR)
3430 return build_binary_op (EQ_EXPR, e2, integer_zero_node, 1);
3432 else if (TYPE_PTRMEMFUNC_P (type1)
3433 && TYPE_PTRMEMFUNC_FN_TYPE (type1) == type0)
3435 return build_binary_op (code, op1, op0, 1);
3441 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3442 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3444 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3446 if (comp_target_types (type0, type1, 1))
3447 result_type = common_type (type0, type1);
3450 cp_pedwarn ("comparison of distinct pointer types `%T' and `%T' lacks a cast",
3452 result_type = ptr_type_node;
3461 build_type = boolean_type_node;
3462 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3463 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3465 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3467 if (comp_target_types (type0, type1, 1))
3468 result_type = common_type (type0, type1);
3471 cp_pedwarn ("comparison of distinct pointer types `%T' and `%T' lacks a cast",
3473 result_type = ptr_type_node;
3476 else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
3477 && integer_zerop (op1))
3478 result_type = type0;
3479 else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
3480 && integer_zerop (op0))
3481 result_type = type1;
3482 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3484 result_type = type0;
3486 pedwarn ("ANSI C++ forbids comparison between pointer and integer");
3487 else if (! flag_traditional)
3488 warning ("comparison between pointer and integer");
3490 else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
3492 result_type = type1;
3494 pedwarn ("ANSI C++ forbids comparison between pointer and integer");
3495 else if (! flag_traditional)
3496 warning ("comparison between pointer and integer");
3501 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3502 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3504 if (shorten || common || short_compare)
3505 result_type = common_type (type0, type1);
3507 /* For certain operations (which identify themselves by shorten != 0)
3508 if both args were extended from the same smaller type,
3509 do the arithmetic in that type and then extend.
3511 shorten !=0 and !=1 indicates a bitwise operation.
3512 For them, this optimization is safe only if
3513 both args are zero-extended or both are sign-extended.
3514 Otherwise, we might change the result.
3515 Eg, (short)-1 | (unsigned short)-1 is (int)-1
3516 but calculated in (unsigned short) it would be (unsigned short)-1. */
3520 int unsigned0, unsigned1;
3521 tree arg0 = get_narrower (op0, &unsigned0);
3522 tree arg1 = get_narrower (op1, &unsigned1);
3523 /* UNS is 1 if the operation to be done is an unsigned one. */
3524 int uns = TREE_UNSIGNED (result_type);
3527 final_type = result_type;
3529 /* Handle the case that OP0 does not *contain* a conversion
3530 but it *requires* conversion to FINAL_TYPE. */
3532 if (op0 == arg0 && TREE_TYPE (op0) != final_type)
3533 unsigned0 = TREE_UNSIGNED (TREE_TYPE (op0));
3534 if (op1 == arg1 && TREE_TYPE (op1) != final_type)
3535 unsigned1 = TREE_UNSIGNED (TREE_TYPE (op1));
3537 /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE. */
3539 /* For bitwise operations, signedness of nominal type
3540 does not matter. Consider only how operands were extended. */
3544 /* Note that in all three cases below we refrain from optimizing
3545 an unsigned operation on sign-extended args.
3546 That would not be valid. */
3548 /* Both args variable: if both extended in same way
3549 from same width, do it in that width.
3550 Do it unsigned if args were zero-extended. */
3551 if ((TYPE_PRECISION (TREE_TYPE (arg0))
3552 < TYPE_PRECISION (result_type))
3553 && (TYPE_PRECISION (TREE_TYPE (arg1))
3554 == TYPE_PRECISION (TREE_TYPE (arg0)))
3555 && unsigned0 == unsigned1
3556 && (unsigned0 || !uns))
3558 = signed_or_unsigned_type (unsigned0,
3559 common_type (TREE_TYPE (arg0), TREE_TYPE (arg1)));
3560 else if (TREE_CODE (arg0) == INTEGER_CST
3561 && (unsigned1 || !uns)
3562 && (TYPE_PRECISION (TREE_TYPE (arg1))
3563 < TYPE_PRECISION (result_type))
3564 && (type = signed_or_unsigned_type (unsigned1,
3566 int_fits_type_p (arg0, type)))
3568 else if (TREE_CODE (arg1) == INTEGER_CST
3569 && (unsigned0 || !uns)
3570 && (TYPE_PRECISION (TREE_TYPE (arg0))
3571 < TYPE_PRECISION (result_type))
3572 && (type = signed_or_unsigned_type (unsigned0,
3574 int_fits_type_p (arg1, type)))
3578 /* Shifts can be shortened if shifting right. */
3583 tree arg0 = get_narrower (op0, &unsigned_arg);
3585 final_type = result_type;
3587 if (arg0 == op0 && final_type == TREE_TYPE (op0))
3588 unsigned_arg = TREE_UNSIGNED (TREE_TYPE (op0));
3590 if (TYPE_PRECISION (TREE_TYPE (arg0)) < TYPE_PRECISION (result_type)
3591 /* We can shorten only if the shift count is less than the
3592 number of bits in the smaller type size. */
3593 && TREE_INT_CST_HIGH (op1) == 0
3594 && TYPE_PRECISION (TREE_TYPE (arg0)) > TREE_INT_CST_LOW (op1)
3595 /* If arg is sign-extended and then unsigned-shifted,
3596 we can simulate this with a signed shift in arg's type
3597 only if the extended result is at least twice as wide
3598 as the arg. Otherwise, the shift could use up all the
3599 ones made by sign-extension and bring in zeros.
3600 We can't optimize that case at all, but in most machines
3601 it never happens because available widths are 2**N. */
3602 && (!TREE_UNSIGNED (final_type)
3604 || (((unsigned) 2 * TYPE_PRECISION (TREE_TYPE (arg0)))
3605 <= TYPE_PRECISION (result_type))))
3607 /* Do an unsigned shift if the operand was zero-extended. */
3609 = signed_or_unsigned_type (unsigned_arg,
3611 /* Convert value-to-be-shifted to that type. */
3612 if (TREE_TYPE (op0) != result_type)
3613 op0 = convert (result_type, op0);
3618 /* Comparison operations are shortened too but differently.
3619 They identify themselves by setting short_compare = 1. */
3623 /* Don't write &op0, etc., because that would prevent op0
3624 from being kept in a register.
3625 Instead, make copies of the our local variables and
3626 pass the copies by reference, then copy them back afterward. */
3627 tree xop0 = op0, xop1 = op1, xresult_type = result_type;
3628 enum tree_code xresultcode = resultcode;
3630 = shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
3632 return convert (boolean_type_node, val);
3633 op0 = xop0, op1 = xop1;
3635 resultcode = xresultcode;
3638 if (short_compare && warn_sign_compare)
3640 int op0_signed = ! TREE_UNSIGNED (TREE_TYPE (orig_op0));
3641 int op1_signed = ! TREE_UNSIGNED (TREE_TYPE (orig_op1));
3643 int unsignedp0, unsignedp1;
3644 tree primop0 = get_narrower (op0, &unsignedp0);
3645 tree primop1 = get_narrower (op1, &unsignedp1);
3647 /* Check for comparison of different enum types. */
3648 if (flag_int_enum_equivalence == 0
3649 && TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
3650 && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE
3651 && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0))
3652 != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
3654 cp_warning ("comparison between `%#T' and `%#T'",
3655 TREE_TYPE (orig_op0), TREE_TYPE (orig_op1));
3658 /* Give warnings for comparisons between signed and unsigned
3659 quantities that may fail. */
3660 /* Do the checking based on the original operand trees, so that
3661 casts will be considered, but default promotions won't be. */
3663 /* Do not warn if the comparison is being done in a signed type,
3664 since the signed type will only be chosen if it can represent
3665 all the values of the unsigned type. */
3666 if (! TREE_UNSIGNED (result_type))
3668 /* Do not warn if both operands are unsigned. */
3669 else if (op0_signed == op1_signed)
3671 /* Do not warn if the signed quantity is an unsuffixed
3672 integer literal (or some static constant expression
3673 involving such literals) and it is non-negative. */
3674 else if ((op0_signed && TREE_CODE (orig_op0) == INTEGER_CST
3675 && tree_int_cst_sgn (orig_op0) >= 0)
3676 || (op1_signed && TREE_CODE (orig_op1) == INTEGER_CST
3677 && tree_int_cst_sgn (orig_op1) >= 0))
3679 /* Do not warn if the comparison is an equality operation,
3680 the unsigned quantity is an integral constant and it does
3681 not use the most significant bit of result_type. */
3682 else if ((resultcode == EQ_EXPR || resultcode == NE_EXPR)
3683 && ((op0_signed && TREE_CODE (orig_op1) == INTEGER_CST
3684 && int_fits_type_p (orig_op1, signed_type (result_type))
3685 || (op1_signed && TREE_CODE (orig_op0) == INTEGER_CST
3686 && int_fits_type_p (orig_op0, signed_type (result_type))))))
3689 warning ("comparison between signed and unsigned");
3691 /* Warn if two unsigned values are being compared in a size
3692 larger than their original size, and one (and only one) is the
3693 result of a `~' operator. This comparison will always fail.
3695 Also warn if one operand is a constant, and the constant does not
3696 have all bits set that are set in the ~ operand when it is
3699 if ((TREE_CODE (primop0) == BIT_NOT_EXPR)
3700 ^ (TREE_CODE (primop1) == BIT_NOT_EXPR))
3702 if (TREE_CODE (primop0) == BIT_NOT_EXPR)
3703 primop0 = get_narrower (TREE_OPERAND (op0, 0), &unsignedp0);
3704 if (TREE_CODE (primop1) == BIT_NOT_EXPR)
3705 primop1 = get_narrower (TREE_OPERAND (op1, 0), &unsignedp1);
3707 if (TREE_CODE (primop0) == INTEGER_CST
3708 || TREE_CODE (primop1) == INTEGER_CST)
3711 HOST_WIDE_INT constant, mask;
3715 if (TREE_CODE (primop0) == INTEGER_CST)
3718 unsignedp = unsignedp1;
3719 constant = TREE_INT_CST_LOW (primop0);
3724 unsignedp = unsignedp0;
3725 constant = TREE_INT_CST_LOW (primop1);
3728 bits = TYPE_PRECISION (TREE_TYPE (primop));
3729 if (bits < TYPE_PRECISION (result_type)
3730 && bits < HOST_BITS_PER_LONG && unsignedp)
3732 mask = (~ (HOST_WIDE_INT) 0) << bits;
3733 if ((mask & constant) != mask)
3734 warning ("comparison of promoted ~unsigned with constant");
3737 else if (unsignedp0 && unsignedp1
3738 && (TYPE_PRECISION (TREE_TYPE (primop0))
3739 < TYPE_PRECISION (result_type))
3740 && (TYPE_PRECISION (TREE_TYPE (primop1))
3741 < TYPE_PRECISION (result_type)))
3742 warning ("comparison of promoted ~unsigned with unsigned");
3747 /* At this point, RESULT_TYPE must be nonzero to avoid an error message.
3748 If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
3749 Then the expression will be built.
3750 It will be given type FINAL_TYPE if that is nonzero;
3751 otherwise, it will be given type RESULT_TYPE. */
3755 cp_error ("invalid operands `%T' and `%T' to binary `%O'",
3756 TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), error_code);
3757 return error_mark_node;
3762 if (TREE_TYPE (op0) != result_type)
3763 op0 = convert (result_type, op0);
3764 if (TREE_TYPE (op1) != result_type)
3765 op1 = convert (result_type, op1);
3768 if (build_type == NULL_TREE)
3769 build_type = result_type;
3772 register tree result = build (resultcode, build_type, op0, op1);
3773 register tree folded;
3775 folded = fold (result);
3776 if (folded == result)
3777 TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
3778 if (final_type != 0)
3779 return convert (final_type, folded);
3784 /* Return a tree for the sum or difference (RESULTCODE says which)
3785 of pointer PTROP and integer INTOP. */
3788 pointer_int_sum (resultcode, ptrop, intop)
3789 enum tree_code resultcode;
3790 register tree ptrop, intop;
3794 register tree result;
3795 register tree folded = fold (intop);
3797 /* The result is a pointer of the same type that is being added. */
3799 register tree result_type = TREE_TYPE (ptrop);
3801 if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
3803 if (pedantic || warn_pointer_arith)
3804 pedwarn ("ANSI C++ forbids using pointer of type `void *' in arithmetic");
3805 size_exp = integer_one_node;
3807 else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
3809 if (pedantic || warn_pointer_arith)
3810 pedwarn ("ANSI C++ forbids using pointer to a function in arithmetic");
3811 size_exp = integer_one_node;
3813 else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
3815 if (pedantic || warn_pointer_arith)
3816 pedwarn ("ANSI C++ forbids using pointer to a method in arithmetic");
3817 size_exp = integer_one_node;
3819 else if (TREE_CODE (TREE_TYPE (result_type)) == OFFSET_TYPE)
3821 if (pedantic || warn_pointer_arith)
3822 pedwarn ("ANSI C++ forbids using pointer to a member in arithmetic");
3823 size_exp = integer_one_node;
3826 size_exp = size_in_bytes (complete_type (TREE_TYPE (result_type)));
3828 /* Needed to make OOPS V2R3 work. */
3830 if (TREE_CODE (intop) == INTEGER_CST
3831 && TREE_INT_CST_LOW (intop) == 0
3832 && TREE_INT_CST_HIGH (intop) == 0)
3835 /* If what we are about to multiply by the size of the elements
3836 contains a constant term, apply distributive law
3837 and multiply that constant term separately.
3838 This helps produce common subexpressions. */
3840 if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
3841 && ! TREE_CONSTANT (intop)
3842 && TREE_CONSTANT (TREE_OPERAND (intop, 1))
3843 && TREE_CONSTANT (size_exp))
3845 enum tree_code subcode = resultcode;
3846 if (TREE_CODE (intop) == MINUS_EXPR)
3847 subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
3848 ptrop = build_binary_op (subcode, ptrop, TREE_OPERAND (intop, 1), 1);
3849 intop = TREE_OPERAND (intop, 0);
3852 /* Convert the integer argument to a type the same size as sizetype
3853 so the multiply won't overflow spuriously. */
3855 if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype))
3856 intop = convert (type_for_size (TYPE_PRECISION (sizetype), 0), intop);
3858 /* Replace the integer argument with a suitable product by the object size.
3859 Do this multiplication as signed, then convert to the appropriate
3860 pointer type (actually unsigned integral). */
3862 intop = convert (result_type,
3863 build_binary_op (MULT_EXPR, intop,
3864 convert (TREE_TYPE (intop), size_exp), 1));
3866 /* Create the sum or difference. */
3868 result = build (resultcode, result_type, ptrop, intop);
3870 folded = fold (result);
3871 if (folded == result)
3872 TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop);
3876 /* Return a tree for the difference of pointers OP0 and OP1.
3877 The resulting tree has type int. */
3880 pointer_diff (op0, op1)
3881 register tree op0, op1;
3883 register tree result, folded;
3884 tree restype = ptrdiff_type_node;
3885 tree target_type = TREE_TYPE (TREE_TYPE (op0));
3887 if (pedantic || warn_pointer_arith)
3889 if (TREE_CODE (target_type) == VOID_TYPE)
3890 pedwarn ("ANSI C++ forbids using pointer of type `void *' in subtraction");
3891 if (TREE_CODE (target_type) == FUNCTION_TYPE)
3892 pedwarn ("ANSI C++ forbids using pointer to a function in subtraction");
3893 if (TREE_CODE (target_type) == METHOD_TYPE)
3894 pedwarn ("ANSI C++ forbids using pointer to a method in subtraction");
3895 if (TREE_CODE (target_type) == OFFSET_TYPE)
3896 pedwarn ("ANSI C++ forbids using pointer to a member in subtraction");
3899 /* First do the subtraction as integers;
3900 then drop through to build the divide operator. */
3902 op0 = build_binary_op (MINUS_EXPR,
3903 convert (restype, op0), convert (restype, op1), 1);
3905 /* This generates an error if op1 is a pointer to an incomplete type. */
3906 if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (op1))) == 0)
3907 error ("arithmetic on pointer to an incomplete type");
3909 op1 = ((TREE_CODE (target_type) == VOID_TYPE
3910 || TREE_CODE (target_type) == FUNCTION_TYPE
3911 || TREE_CODE (target_type) == METHOD_TYPE
3912 || TREE_CODE (target_type) == OFFSET_TYPE)
3914 : size_in_bytes (target_type));
3916 /* Do the division. */
3918 result = build (EXACT_DIV_EXPR, restype, op0, convert (restype, op1));
3920 folded = fold (result);
3921 if (folded == result)
3922 TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
3926 /* Handle the case of taking the address of a COMPONENT_REF.
3927 Called by `build_unary_op' and `build_up_reference'.
3929 ARG is the COMPONENT_REF whose address we want.
3930 ARGTYPE is the pointer type that this address should have.
3931 MSG is an error message to print if this COMPONENT_REF is not
3932 addressable (such as a bitfield). */
3935 build_component_addr (arg, argtype, msg)
3939 tree field = TREE_OPERAND (arg, 1);
3940 tree basetype = decl_type_context (field);
3941 tree rval = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0);
3943 if (DECL_BIT_FIELD (field))
3945 error (msg, IDENTIFIER_POINTER (DECL_NAME (field)));
3946 return error_mark_node;
3949 if (TREE_CODE (field) == FIELD_DECL
3950 && TYPE_USES_COMPLEX_INHERITANCE (basetype))
3952 /* Can't convert directly to ARGTYPE, since that
3953 may have the same pointer type as one of our
3955 rval = build1 (NOP_EXPR, argtype,
3956 convert_pointer_to (basetype, rval));
3957 TREE_CONSTANT (rval) = TREE_CONSTANT (TREE_OPERAND (rval, 0));
3960 /* This conversion is harmless. */
3961 rval = convert_force (argtype, rval, 0);
3963 if (! integer_zerop (DECL_FIELD_BITPOS (field)))
3965 tree offset = size_binop (EASY_DIV_EXPR, DECL_FIELD_BITPOS (field),
3966 size_int (BITS_PER_UNIT));
3967 int flag = TREE_CONSTANT (rval);
3968 rval = fold (build (PLUS_EXPR, argtype,
3969 rval, convert (argtype, offset)));
3970 TREE_CONSTANT (rval) = flag;
3975 /* Construct and perhaps optimize a tree representation
3976 for a unary operation. CODE, a tree_code, specifies the operation
3977 and XARG is the operand. */
3980 build_x_unary_op (code, xarg)
3981 enum tree_code code;
3984 if (current_template_parms)
3985 return build_min_nt (code, xarg, NULL_TREE);
3987 /* & rec, on incomplete RECORD_TYPEs is the simple opr &, not an
3989 if (code == ADDR_EXPR
3990 && ((IS_AGGR_TYPE_CODE (TREE_CODE (TREE_TYPE (xarg)))
3991 && TYPE_SIZE (TREE_TYPE (xarg)) == NULL_TREE)
3992 || (TREE_CODE (xarg) == OFFSET_REF)))
3993 /* don't look for a function */;
3996 tree rval = build_opfncall (code, LOOKUP_SPECULATIVELY, xarg,
3997 NULL_TREE, NULL_TREE);
3999 return build_opfncall (code, LOOKUP_NORMAL, xarg,
4000 NULL_TREE, NULL_TREE);
4003 if (code == ADDR_EXPR)
4005 if (TREE_CODE (xarg) == TARGET_EXPR)
4006 warning ("taking address of temporary");
4009 return build_unary_op (code, xarg, 0);
4012 /* Just like truthvalue_conversion, but we want a CLEANUP_POINT_EXPR. */
4015 condition_conversion (expr)
4019 if (current_template_parms)
4021 t = convert (boolean_type_node, expr);
4022 t = fold (build1 (CLEANUP_POINT_EXPR, boolean_type_node, t));
4026 /* C++: Must handle pointers to members.
4028 Perhaps type instantiation should be extended to handle conversion
4029 from aggregates to types we don't yet know we want? (Or are those
4030 cases typically errors which should be reported?)
4032 NOCONVERT nonzero suppresses the default promotions
4033 (such as from short to int). */
4035 build_unary_op (code, xarg, noconvert)
4036 enum tree_code code;
4040 /* No default_conversion here. It causes trouble for ADDR_EXPR. */
4041 register tree arg = xarg;
4042 register tree argtype = 0;
4043 char *errstring = NULL;
4046 if (arg == error_mark_node)
4047 return error_mark_node;
4052 /* This is used for unary plus, because a CONVERT_EXPR
4053 is enough to prevent anybody from looking inside for
4054 associativity, but won't generate any code. */
4055 if (!(arg = build_expr_type_conversion
4056 (WANT_ARITH | WANT_ENUM | WANT_POINTER, arg, 1)))
4057 errstring = "wrong type argument to unary plus";
4061 arg = default_conversion (arg);
4062 arg = build1 (NON_LVALUE_EXPR, TREE_TYPE (arg), arg);
4067 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, 1)))
4068 errstring = "wrong type argument to unary minus";
4069 else if (!noconvert)
4070 arg = default_conversion (arg);
4074 if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM, arg, 1)))
4075 errstring = "wrong type argument to bit-complement";
4076 else if (!noconvert)
4077 arg = default_conversion (arg);
4081 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, 1)))
4082 errstring = "wrong type argument to abs";
4083 else if (!noconvert)
4084 arg = default_conversion (arg);
4087 case TRUTH_NOT_EXPR:
4088 arg = convert (boolean_type_node, arg);
4089 val = invert_truthvalue (arg);
4090 if (arg != error_mark_node)
4092 errstring = "in argument to unary !";
4098 case PREINCREMENT_EXPR:
4099 case POSTINCREMENT_EXPR:
4100 case PREDECREMENT_EXPR:
4101 case POSTDECREMENT_EXPR:
4102 /* Handle complex lvalues (when permitted)
4103 by reduction to simpler cases. */
4105 val = unary_complex_lvalue (code, arg);
4109 /* Report invalid types. */
4111 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_POINTER,
4114 if (code == PREINCREMENT_EXPR)
4115 errstring ="no pre-increment operator for type";
4116 else if (code == POSTINCREMENT_EXPR)
4117 errstring ="no post-increment operator for type";
4118 else if (code == PREDECREMENT_EXPR)
4119 errstring ="no pre-decrement operator for type";
4121 errstring ="no post-decrement operator for type";
4125 /* Report something read-only. */
4127 if (TYPE_READONLY (TREE_TYPE (arg))
4128 || TREE_READONLY (arg))
4129 readonly_error (arg, ((code == PREINCREMENT_EXPR
4130 || code == POSTINCREMENT_EXPR)
4131 ? "increment" : "decrement"),
4136 tree result_type = TREE_TYPE (arg);
4138 arg = get_unwidened (arg, 0);
4139 argtype = TREE_TYPE (arg);
4141 /* ARM $5.2.5 last annotation says this should be forbidden. */
4142 if (TREE_CODE (argtype) == ENUMERAL_TYPE)
4143 pedwarn ("ANSI C++ forbids %sing an enum",
4144 (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
4145 ? "increment" : "decrement");
4147 /* Compute the increment. */
4149 if (TREE_CODE (argtype) == POINTER_TYPE)
4151 enum tree_code tmp = TREE_CODE (TREE_TYPE (argtype));
4152 if (TYPE_SIZE (complete_type (TREE_TYPE (argtype))) == 0)
4153 cp_error ("cannot %s a pointer to incomplete type `%T'",
4154 ((code == PREINCREMENT_EXPR
4155 || code == POSTINCREMENT_EXPR)
4156 ? "increment" : "decrement"), TREE_TYPE (argtype));
4157 else if (tmp == FUNCTION_TYPE || tmp == METHOD_TYPE
4158 || tmp == VOID_TYPE || tmp == OFFSET_TYPE)
4159 cp_pedwarn ("ANSI C++ forbids %sing a pointer of type `%T'",
4160 ((code == PREINCREMENT_EXPR
4161 || code == POSTINCREMENT_EXPR)
4162 ? "increment" : "decrement"), argtype);
4163 inc = c_sizeof_nowarn (TREE_TYPE (argtype));
4166 inc = integer_one_node;
4168 inc = convert (argtype, inc);
4170 /* Handle incrementing a cast-expression. */
4172 switch (TREE_CODE (arg))
4177 case FIX_TRUNC_EXPR:
4178 case FIX_FLOOR_EXPR:
4179 case FIX_ROUND_EXPR:
4182 tree incremented, modify, value, compound;
4183 if (! lvalue_p (arg) && pedantic)
4184 pedwarn ("cast to non-reference type used as lvalue");
4185 arg = stabilize_reference (arg);
4186 if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
4189 value = save_expr (arg);
4190 incremented = build (((code == PREINCREMENT_EXPR
4191 || code == POSTINCREMENT_EXPR)
4192 ? PLUS_EXPR : MINUS_EXPR),
4193 argtype, value, inc);
4194 TREE_SIDE_EFFECTS (incremented) = 1;
4196 modify = build_modify_expr (arg, NOP_EXPR, incremented);
4197 compound = build (COMPOUND_EXPR, TREE_TYPE (arg), modify, value);
4199 /* Eliminate warning about unused result of + or -. */
4200 TREE_NO_UNUSED_WARNING (compound) = 1;
4205 /* Complain about anything else that is not a true lvalue. */
4206 if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
4207 || code == POSTINCREMENT_EXPR)
4208 ? "increment" : "decrement")))
4209 return error_mark_node;
4211 /* Forbid using -- on `bool'. */
4212 if (TREE_TYPE (arg) == boolean_type_node)
4214 if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
4216 cp_error ("invalid use of `--' on bool variable `%D'", arg);
4217 return error_mark_node;
4220 /* This will only work if someone can convince Kenner to accept
4221 my patch to expand_increment. (jason) */
4222 val = build (code, TREE_TYPE (arg), arg, inc);
4224 if (code == POSTINCREMENT_EXPR)
4226 arg = stabilize_reference (arg);
4227 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg,
4229 TREE_SIDE_EFFECTS (val) = 1;
4230 arg = save_expr (arg);
4231 val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4232 val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4235 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg,
4240 val = build (code, TREE_TYPE (arg), arg, inc);
4242 TREE_SIDE_EFFECTS (val) = 1;
4243 return convert (result_type, val);
4247 /* Note that this operation never does default_conversion
4248 regardless of NOCONVERT. */
4250 argtype = TREE_TYPE (arg);
4251 if (TREE_CODE (argtype) == REFERENCE_TYPE)
4253 arg = build1 (CONVERT_EXPR, build_pointer_type (TREE_TYPE (TREE_TYPE (arg))), arg);
4254 TREE_REFERENCE_EXPR (arg) = 1;
4258 && TREE_CODE (arg) == FUNCTION_DECL
4260 && DECL_CONTEXT (arg) == NULL_TREE
4261 && IDENTIFIER_LENGTH (DECL_NAME (arg)) == 4
4262 && IDENTIFIER_POINTER (DECL_NAME (arg))[0] == 'm'
4263 && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (arg)), "main"))
4265 pedwarn ("taking address of function `main'");
4267 /* Let &* cancel out to simplify resulting code. */
4268 if (TREE_CODE (arg) == INDIRECT_REF)
4270 /* We don't need to have `current_class_decl' wrapped in a
4271 NON_LVALUE_EXPR node. */
4273 return current_class_decl;
4275 /* Keep `default_conversion' from converting if
4276 ARG is of REFERENCE_TYPE. */
4277 arg = TREE_OPERAND (arg, 0);
4278 if (TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE)
4280 if (TREE_CODE (arg) == VAR_DECL && DECL_INITIAL (arg)
4281 && !TREE_SIDE_EFFECTS (DECL_INITIAL (arg)))
4282 arg = DECL_INITIAL (arg);
4283 arg = build1 (CONVERT_EXPR, build_pointer_type (TREE_TYPE (TREE_TYPE (arg))), arg);
4284 TREE_REFERENCE_EXPR (arg) = 1;
4285 TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
4287 else if (lvalue_p (arg))
4288 /* Don't let this be an lvalue. */
4289 return non_lvalue (arg);
4293 /* For &x[y], return x+y */
4294 if (TREE_CODE (arg) == ARRAY_REF)
4296 if (mark_addressable (TREE_OPERAND (arg, 0)) == 0)
4297 return error_mark_node;
4298 return build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0),
4299 TREE_OPERAND (arg, 1), 1);
4302 /* Uninstantiated types are all functions. Taking the
4303 address of a function is a no-op, so just return the
4306 if (TREE_CODE (arg) == IDENTIFIER_NODE
4307 && IDENTIFIER_OPNAME_P (arg))
4309 my_friendly_abort (117);
4310 /* We don't know the type yet, so just work around the problem.
4311 We know that this will resolve to an lvalue. */
4312 return build1 (ADDR_EXPR, unknown_type_node, arg);
4315 if (TREE_CODE (arg) == TREE_LIST)
4317 if (TREE_CODE (TREE_VALUE (arg)) == FUNCTION_DECL
4318 && DECL_CHAIN (TREE_VALUE (arg)) == NULL_TREE)
4319 /* Unique overloaded non-member function. */
4320 return build_unary_op (ADDR_EXPR, TREE_VALUE (arg), 0);
4321 if (TREE_CHAIN (arg) == NULL_TREE
4322 && TREE_CODE (TREE_VALUE (arg)) == TREE_LIST
4323 && DECL_CHAIN (TREE_VALUE (TREE_VALUE (arg))) == NULL_TREE)
4324 /* Unique overloaded member function. */
4325 return build_unary_op (ADDR_EXPR, TREE_VALUE (TREE_VALUE (arg)),
4327 return build1 (ADDR_EXPR, unknown_type_node, arg);
4330 /* Handle complex lvalues (when permitted)
4331 by reduction to simpler cases. */
4332 val = unary_complex_lvalue (code, arg);
4336 switch (TREE_CODE (arg))
4341 case FIX_TRUNC_EXPR:
4342 case FIX_FLOOR_EXPR:
4343 case FIX_ROUND_EXPR:
4345 if (! lvalue_p (arg) && pedantic)
4346 pedwarn ("taking the address of a cast to non-reference type");
4349 /* Allow the address of a constructor if all the elements
4351 if (TREE_CODE (arg) == CONSTRUCTOR && TREE_CONSTANT (arg))
4353 /* Anything not already handled and not a true memory reference
4355 else if (TREE_CODE (argtype) != FUNCTION_TYPE
4356 && TREE_CODE (argtype) != METHOD_TYPE
4357 && !lvalue_or_else (arg, "unary `&'"))
4358 return error_mark_node;
4360 /* Ordinary case; arg is a COMPONENT_REF or a decl. */
4361 /* If the lvalue is const or volatile,
4362 merge that into the type that the address will point to. */
4363 if (TREE_CODE_CLASS (TREE_CODE (arg)) == 'd'
4364 || TREE_CODE_CLASS (TREE_CODE (arg)) == 'r')
4366 if (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg))
4367 argtype = cp_build_type_variant (argtype,
4368 TREE_READONLY (arg),
4369 TREE_THIS_VOLATILE (arg));
4372 argtype = build_pointer_type (argtype);
4374 if (mark_addressable (arg) == 0)
4375 return error_mark_node;
4380 if (TREE_CODE (arg) == COMPONENT_REF)
4381 addr = build_component_addr (arg, argtype,
4382 "attempt to take address of bit-field structure member `%s'");
4384 addr = build1 (code, argtype, arg);
4386 /* Address of a static or external variable or
4387 function counts as a constant */
4389 TREE_CONSTANT (addr) = 1;
4397 argtype = TREE_TYPE (arg);
4398 return fold (build1 (code, argtype, arg));
4402 return error_mark_node;
4406 /* If CONVERSIONS is a conversion expression or a nested sequence of such,
4407 convert ARG with the same conversions in the same order
4408 and return the result. */
4411 convert_sequence (conversions, arg)
4415 switch (TREE_CODE (conversions))
4420 case FIX_TRUNC_EXPR:
4421 case FIX_FLOOR_EXPR:
4422 case FIX_ROUND_EXPR:
4424 return convert (TREE_TYPE (conversions),
4425 convert_sequence (TREE_OPERAND (conversions, 0),
4434 /* Apply unary lvalue-demanding operator CODE to the expression ARG
4435 for certain kinds of expressions which are not really lvalues
4436 but which we can accept as lvalues.
4438 If ARG is not a kind of expression we can handle, return zero. */
4441 unary_complex_lvalue (code, arg)
4442 enum tree_code code;
4445 /* Handle (a, b) used as an "lvalue". */
4446 if (TREE_CODE (arg) == COMPOUND_EXPR)
4448 tree real_result = build_unary_op (code, TREE_OPERAND (arg, 1), 0);
4449 return build (COMPOUND_EXPR, TREE_TYPE (real_result),
4450 TREE_OPERAND (arg, 0), real_result);
4453 /* Handle (a ? b : c) used as an "lvalue". */
4454 if (TREE_CODE (arg) == COND_EXPR)
4455 return rationalize_conditional_expr (code, arg);
4457 if (TREE_CODE (arg) == MODIFY_EXPR
4458 || TREE_CODE (arg) == PREINCREMENT_EXPR
4459 || TREE_CODE (arg) == PREDECREMENT_EXPR)
4460 return unary_complex_lvalue
4461 (code, build (COMPOUND_EXPR, TREE_TYPE (TREE_OPERAND (arg, 0)),
4462 arg, TREE_OPERAND (arg, 0)));
4464 if (code != ADDR_EXPR)
4467 /* Handle (a = b) used as an "lvalue" for `&'. */
4468 if (TREE_CODE (arg) == MODIFY_EXPR
4469 || TREE_CODE (arg) == INIT_EXPR)
4471 tree real_result = build_unary_op (code, TREE_OPERAND (arg, 0), 0);
4472 return build (COMPOUND_EXPR, TREE_TYPE (real_result), arg, real_result);
4475 if (TREE_CODE (TREE_TYPE (arg)) == FUNCTION_TYPE
4476 || TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
4477 || TREE_CODE (TREE_TYPE (arg)) == OFFSET_TYPE)
4479 /* The representation of something of type OFFSET_TYPE
4480 is really the representation of a pointer to it.
4481 Here give the representation its true type. */
4485 my_friendly_assert (TREE_CODE (arg) != SCOPE_REF, 313);
4487 if (TREE_CODE (arg) != OFFSET_REF)
4490 t = TREE_OPERAND (arg, 1);
4492 if (TREE_CODE (t) == FUNCTION_DECL) /* Check all this code for right semantics. */
4493 return build_unary_op (ADDR_EXPR, t, 0);
4494 if (TREE_CODE (t) == VAR_DECL)
4495 return build_unary_op (ADDR_EXPR, t, 0);
4498 if (TREE_OPERAND (arg, 0)
4499 && (TREE_CODE (TREE_OPERAND (arg, 0)) != NOP_EXPR
4500 || TREE_OPERAND (TREE_OPERAND (arg, 0), 0) != error_mark_node))
4501 if (TREE_CODE (t) != FIELD_DECL)
4503 /* Don't know if this should return address to just
4504 _DECL, or actual address resolved in this expression. */
4505 sorry ("address of bound pointer-to-member expression");
4506 return error_mark_node;
4509 /* Add in the offset to the right subobject. */
4510 offset = get_delta_difference (DECL_FIELD_CONTEXT (t),
4511 TREE_TYPE (TREE_OPERAND (arg, 0)),
4514 /* Add in the offset to the field. */
4515 offset = size_binop (PLUS_EXPR, offset,
4516 size_binop (EASY_DIV_EXPR,
4517 DECL_FIELD_BITPOS (t),
4518 size_int (BITS_PER_UNIT)));
4520 /* We offset all pointer to data memebers by 1 so that we can
4521 distinguish between a null pointer to data member and the first
4522 data member of a structure. */
4523 offset = size_binop (PLUS_EXPR, offset, size_int (1));
4525 return convert (build_pointer_type (TREE_TYPE (arg)), offset);
4531 /* This seems to be obsolete now (and posssibly wrong, compare with
4532 resolve_offset_ref). */
4533 if (TREE_CODE (arg) == OFFSET_REF)
4535 tree left = TREE_OPERAND (arg, 0), left_addr;
4536 tree right_addr = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 1), 0);
4539 if (current_class_decl)
4540 left_addr = current_class_decl;
4543 error ("no `this' for pointer to member");
4544 return error_mark_node;
4547 left_addr = build_unary_op (ADDR_EXPR, left, 0);
4549 return build (PLUS_EXPR, build_pointer_type (TREE_TYPE (arg)),
4550 build1 (NOP_EXPR, integer_type_node, left_addr),
4551 build1 (NOP_EXPR, integer_type_node, right_addr));
4555 /* We permit compiler to make function calls returning
4556 objects of aggregate type look like lvalues. */
4560 if (TREE_CODE (targ) == SAVE_EXPR)
4561 targ = TREE_OPERAND (targ, 0);
4563 if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (TREE_TYPE (targ)))
4565 if (TREE_CODE (arg) == SAVE_EXPR)
4568 targ = build_cplus_new (TREE_TYPE (arg), arg);
4569 return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), targ);
4572 if (TREE_CODE (arg) == SAVE_EXPR && TREE_CODE (targ) == INDIRECT_REF)
4573 return build (SAVE_EXPR, build_pointer_type (TREE_TYPE (arg)),
4574 TREE_OPERAND (targ, 0), current_function_decl, NULL);
4577 /* Don't let anything else be handled specially. */
4581 /* Mark EXP saying that we need to be able to take the
4582 address of it; it should not be allocated in a register.
4583 Value is 1 if successful.
4585 C++: we do not allow `current_class_decl' to be addressable. */
4588 mark_addressable (exp)
4591 register tree x = exp;
4593 if (TREE_ADDRESSABLE (x) == 1)
4597 switch (TREE_CODE (x))
4602 x = TREE_OPERAND (x, 0);
4606 if (x == current_class_decl)
4608 error ("address of `this' not available");
4609 TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later */
4610 put_var_into_stack (x);
4614 if (TREE_STATIC (x) && TREE_READONLY (x)
4615 && DECL_RTL (x) != 0
4616 && ! DECL_IN_MEMORY_P (x))
4618 /* We thought this would make a good constant variable,
4619 but we were wrong. */
4620 push_obstacks_nochange ();
4621 end_temporary_allocation ();
4623 TREE_ASM_WRITTEN (x) = 0;
4625 rest_of_decl_compilation (x, 0, IDENTIFIER_LOCAL_VALUE (x) == 0, 0);
4626 TREE_ADDRESSABLE (x) = 1;
4632 /* Caller should not be trying to mark initialized
4633 constant fields addressable. */
4634 my_friendly_assert (DECL_LANG_SPECIFIC (x) == 0
4635 || DECL_IN_AGGR_P (x) == 0
4637 || DECL_EXTERNAL (x), 314);
4641 /* For C++, we don't warn about taking the address of a register
4642 variable for CONST_DECLs; ARM p97 explicitly says it's okay. */
4643 put_var_into_stack (x);
4644 TREE_ADDRESSABLE (x) = 1;
4648 /* We have to test both conditions here. The first may
4649 be non-zero in the case of processing a default function.
4650 The second may be non-zero in the case of a template function. */
4651 x = DECL_MAIN_VARIANT (x);
4652 if ((DECL_THIS_INLINE (x) || DECL_PENDING_INLINE_INFO (x))
4653 && (DECL_CONTEXT (x) == NULL_TREE
4654 || TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (x))) != 't'
4655 || ! CLASSTYPE_INTERFACE_ONLY (DECL_CONTEXT (x))))
4657 mark_inline_for_output (x);
4658 if (x == current_function_decl)
4659 DECL_EXTERNAL (x) = 0;
4661 TREE_ADDRESSABLE (x) = 1;
4663 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
4671 /* Build and return a conditional expression IFEXP ? OP1 : OP2. */
4674 build_x_conditional_expr (ifexp, op1, op2)
4675 tree ifexp, op1, op2;
4677 tree rval = NULL_TREE;
4679 if (current_template_parms)
4680 return build_min_nt (COND_EXPR, ifexp, op1, op2);
4682 /* See comments in `build_x_binary_op'. */
4684 rval = build_opfncall (COND_EXPR, LOOKUP_SPECULATIVELY, ifexp, op1, op2);
4686 return build_opfncall (COND_EXPR, LOOKUP_NORMAL, ifexp, op1, op2);
4688 return build_conditional_expr (ifexp, op1, op2);
4692 build_conditional_expr (ifexp, op1, op2)
4693 tree ifexp, op1, op2;
4695 register tree type1;
4696 register tree type2;
4697 register enum tree_code code1;
4698 register enum tree_code code2;
4699 register tree result_type = NULL_TREE;
4700 tree orig_op1 = op1, orig_op2 = op2;
4702 /* If second operand is omitted, it is the same as the first one;
4703 make sure it is calculated only once. */
4707 pedwarn ("ANSI C++ forbids omitting the middle term of a ?: expression");
4708 ifexp = op1 = save_expr (ifexp);
4711 ifexp = convert (boolean_type_node, ifexp);
4713 if (TREE_CODE (ifexp) == ERROR_MARK)
4714 return error_mark_node;
4716 op1 = require_instantiated_type (TREE_TYPE (op2), op1, error_mark_node);
4717 if (op1 == error_mark_node)
4718 return error_mark_node;
4719 op2 = require_instantiated_type (TREE_TYPE (op1), op2, error_mark_node);
4720 if (op2 == error_mark_node)
4721 return error_mark_node;
4723 /* C++: REFERENCE_TYPES must be dereferenced. */
4724 type1 = TREE_TYPE (op1);
4725 code1 = TREE_CODE (type1);
4726 type2 = TREE_TYPE (op2);
4727 code2 = TREE_CODE (type2);
4729 if (code1 == REFERENCE_TYPE)
4731 op1 = convert_from_reference (op1);
4732 type1 = TREE_TYPE (op1);
4733 code1 = TREE_CODE (type1);
4735 if (code2 == REFERENCE_TYPE)
4737 op2 = convert_from_reference (op2);
4738 type2 = TREE_TYPE (op2);
4739 code2 = TREE_CODE (type2);
4742 /* Don't promote the operands separately if they promote
4743 the same way. Return the unpromoted type and let the combined
4744 value get promoted if necessary. */
4746 if (TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2)
4747 && code2 != ARRAY_TYPE
4748 && code2 != FUNCTION_TYPE
4749 && code2 != METHOD_TYPE)
4753 if (TREE_CONSTANT (ifexp)
4754 && (TREE_CODE (ifexp) == INTEGER_CST
4755 || TREE_CODE (ifexp) == ADDR_EXPR))
4756 return (integer_zerop (ifexp) ? op2 : op1);
4758 if (TREE_CODE (op1) == CONST_DECL)
4759 op1 = DECL_INITIAL (op1);
4760 else if (TREE_READONLY_DECL_P (op1))
4761 op1 = decl_constant_value (op1);
4762 if (TREE_CODE (op2) == CONST_DECL)
4763 op2 = DECL_INITIAL (op2);
4764 else if (TREE_READONLY_DECL_P (op2))
4765 op2 = decl_constant_value (op2);
4767 type1 = cp_build_type_variant
4769 TREE_READONLY (op1) || TREE_READONLY (op2),
4770 TREE_THIS_VOLATILE (op1) || TREE_THIS_VOLATILE (op2));
4771 /* ??? This is a kludge to deal with the fact that
4772 we don't sort out integers and enums properly, yet. */
4773 result = fold (build (COND_EXPR, type1, ifexp, op1, op2));
4774 if (TREE_TYPE (result) != type1)
4775 result = build1 (NOP_EXPR, type1, result);
4779 /* They don't match; promote them both and then try to reconcile them.
4780 But don't permit mismatching enum types. */
4781 if (code1 == ENUMERAL_TYPE)
4783 if (code2 == ENUMERAL_TYPE)
4785 cp_error ("enumeral mismatch in conditional expression: `%T' vs `%T'", type1, type2);
4786 return error_mark_node;
4788 else if (extra_warnings && ! IS_AGGR_TYPE_CODE (code2)
4789 && type2 != type_promotes_to (type1))
4790 warning ("enumeral and non-enumeral type in conditional expression");
4792 else if (extra_warnings
4793 && code2 == ENUMERAL_TYPE && ! IS_AGGR_TYPE_CODE (code1)
4794 && type1 != type_promotes_to (type2))
4795 warning ("enumeral and non-enumeral type in conditional expression");
4797 if (code1 != VOID_TYPE)
4799 op1 = default_conversion (op1);
4800 type1 = TREE_TYPE (op1);
4801 if (TYPE_PTRMEMFUNC_P (type1))
4802 type1 = TYPE_PTRMEMFUNC_FN_TYPE (type1);
4803 code1 = TREE_CODE (type1);
4805 if (code2 != VOID_TYPE)
4807 op2 = default_conversion (op2);
4808 type2 = TREE_TYPE (op2);
4809 if (TYPE_PTRMEMFUNC_P (type2))
4810 type2 = TYPE_PTRMEMFUNC_FN_TYPE (type2);
4811 code2 = TREE_CODE (type2);
4814 if (code1 == RECORD_TYPE && code2 == RECORD_TYPE
4815 && real_lvalue_p (op1) && real_lvalue_p (op2)
4816 && comptypes (type1, type2, -1))
4818 type1 = build_reference_type (type1);
4819 type2 = build_reference_type (type2);
4820 result_type = common_type (type1, type2);
4821 op1 = convert_to_reference (result_type, op1, CONV_IMPLICIT,
4822 LOOKUP_NORMAL, NULL_TREE);
4823 op2 = convert_to_reference (result_type, op2, CONV_IMPLICIT,
4824 LOOKUP_NORMAL, NULL_TREE);
4826 /* Quickly detect the usual case where op1 and op2 have the same type
4828 else if (TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2))
4831 result_type = type1;
4833 result_type = cp_build_type_variant
4835 TREE_READONLY (op1) || TREE_READONLY (op2),
4836 TREE_THIS_VOLATILE (op1) || TREE_THIS_VOLATILE (op2));
4838 else if ((code1 == INTEGER_TYPE || code1 == REAL_TYPE)
4839 && (code2 == INTEGER_TYPE || code2 == REAL_TYPE))
4841 result_type = common_type (type1, type2);
4843 else if (code1 == VOID_TYPE || code2 == VOID_TYPE)
4845 if (pedantic && (code1 != VOID_TYPE || code2 != VOID_TYPE))
4846 pedwarn ("ANSI C++ forbids conditional expr with only one void side");
4847 result_type = void_type_node;
4849 else if (code1 == POINTER_TYPE && code2 == POINTER_TYPE)
4851 if (comp_target_types (type1, type2, 1))
4852 result_type = common_type (type1, type2);
4853 else if (integer_zerop (op1) && TREE_TYPE (type1) == void_type_node
4854 && TREE_CODE (orig_op1) != NOP_EXPR)
4855 result_type = qualify_type (type2, type1);
4856 else if (integer_zerop (op2) && TREE_TYPE (type2) == void_type_node
4857 && TREE_CODE (orig_op2) != NOP_EXPR)
4858 result_type = qualify_type (type1, type2);
4859 else if (TYPE_MAIN_VARIANT (TREE_TYPE (type1)) == void_type_node)
4861 if (pedantic && TREE_CODE (type2) == FUNCTION_TYPE)
4862 pedwarn ("ANSI C++ forbids conditional expr between `void *' and function pointer");
4863 result_type = qualify_type (type1, type2);
4865 else if (TYPE_MAIN_VARIANT (TREE_TYPE (type2)) == void_type_node)
4867 if (pedantic && TREE_CODE (type1) == FUNCTION_TYPE)
4868 pedwarn ("ANSI C++ forbids conditional expr between `void *' and function pointer");
4869 result_type = qualify_type (type2, type1);
4872 else if (comptypes (type2, type1, 0))
4873 result_type = type2;
4874 else if (IS_AGGR_TYPE (TREE_TYPE (type1))
4875 && IS_AGGR_TYPE (TREE_TYPE (type2))
4876 && (result_type = common_base_type (TREE_TYPE (type1), TREE_TYPE (type2))))
4878 if (result_type == error_mark_node)
4880 cp_error ("common base type of types `%T' and `%T' is ambiguous",
4881 TREE_TYPE (type1), TREE_TYPE (type2));
4882 result_type = ptr_type_node;
4887 && result_type != TREE_TYPE (type1)
4888 && result_type != TREE_TYPE (type2))
4889 cp_pedwarn ("`%T' and `%T' converted to `%T *' in conditional expression",
4890 type1, type2, result_type);
4892 result_type = build_pointer_type (result_type);
4897 pedwarn ("pointer type mismatch in conditional expression");
4898 result_type = ptr_type_node;
4901 else if (code1 == POINTER_TYPE && code2 == INTEGER_TYPE)
4903 if (!integer_zerop (op2))
4904 pedwarn ("pointer/integer type mismatch in conditional expression");
4906 op2 = null_pointer_node;
4908 result_type = type1;
4910 else if (code2 == POINTER_TYPE && code1 == INTEGER_TYPE)
4912 if (!integer_zerop (op1))
4913 pedwarn ("pointer/integer type mismatch in conditional expression");
4915 op1 = null_pointer_node;
4917 result_type = type2;
4922 /* The match does not look good. If either is
4923 an aggregate value, try converting to a scalar type. */
4924 if (code1 == RECORD_TYPE && code2 == RECORD_TYPE)
4926 cp_error ("aggregate mismatch in conditional expression: `%T' vs `%T'", type1, type2);
4927 return error_mark_node;
4929 /* Warning: this code assumes that conversion between cv-variants of
4930 a type is done using NOP_EXPRs. */
4931 if (code1 == RECORD_TYPE && TYPE_HAS_CONVERSION (type1))
4933 tree tmp = build_pointer_type
4934 (build_type_variant (TREE_TYPE (type2), 1, 1));
4935 tmp = build_type_conversion (CONVERT_EXPR, tmp, op1, 0);
4936 if (tmp == NULL_TREE)
4938 cp_error ("incompatible types `%T' and `%T' in `?:'",
4940 return error_mark_node;
4942 if (tmp == error_mark_node)
4943 error ("ambiguous pointer conversion");
4946 result_type = common_type (type1, TREE_TYPE (tmp));
4949 else if (code2 == RECORD_TYPE && TYPE_HAS_CONVERSION (type2))
4951 tree tmp = build_pointer_type
4952 (build_type_variant (TREE_TYPE (type1), 1, 1));
4953 tmp = build_type_conversion (CONVERT_EXPR, tmp, op2, 0);
4954 if (tmp == NULL_TREE)
4956 cp_error ("incompatible types `%T' and `%T' in `?:'",
4958 return error_mark_node;
4960 if (tmp == error_mark_node)
4961 error ("ambiguous pointer conversion");
4964 result_type = common_type (type1, TREE_TYPE (tmp));
4967 else if (flag_cond_mismatch)
4968 result_type = void_type_node;
4971 error ("type mismatch in conditional expression");
4972 return error_mark_node;
4976 if (TREE_CODE (result_type) == POINTER_TYPE
4977 && TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
4978 result_type = build_ptrmemfunc_type (result_type);
4980 if (result_type != TREE_TYPE (op1))
4981 op1 = convert_and_check (result_type, op1);
4982 if (result_type != TREE_TYPE (op2))
4983 op2 = convert_and_check (result_type, op2);
4985 if (TREE_CONSTANT (ifexp))
4986 return integer_zerop (ifexp) ? op2 : op1;
4988 return convert_from_reference
4989 (fold (build (COND_EXPR, result_type, ifexp, op1, op2)));
4992 /* Handle overloading of the ',' operator when needed. Otherwise,
4993 this function just builds an expression list. */
4995 build_x_compound_expr (list)
4998 tree rest = TREE_CHAIN (list);
5001 if (current_template_parms)
5002 return build_min_nt (COMPOUND_EXPR, list, NULL_TREE);
5004 if (rest == NULL_TREE)
5005 return build_compound_expr (list);
5007 result = build_opfncall (COMPOUND_EXPR, LOOKUP_NORMAL,
5008 TREE_VALUE (list), TREE_VALUE (rest), NULL_TREE);
5010 return build_x_compound_expr (tree_cons (NULL_TREE, result, TREE_CHAIN (rest)));
5012 if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)))
5014 /* the left-hand operand of a comma expression is like an expression
5015 statement: we should warn if it doesn't have any side-effects,
5016 unless it was explicitly cast to (void). */
5017 if ((extra_warnings || warn_unused)
5018 && !(TREE_CODE (TREE_VALUE(list)) == CONVERT_EXPR
5019 && TREE_TYPE (TREE_VALUE(list)) == void_type_node))
5020 warning("left-hand operand of comma expression has no effect");
5022 #if 0 /* this requires a gcc backend patch to export warn_if_unused_value */
5023 else if (warn_unused)
5024 warn_if_unused_value (TREE_VALUE(list));
5027 return build_compound_expr (tree_cons (NULL_TREE, TREE_VALUE (list),
5028 build_tree_list (NULL_TREE, build_x_compound_expr (rest))));
5031 /* Given a list of expressions, return a compound expression
5032 that performs them all and returns the value of the last of them. */
5035 build_compound_expr (list)
5040 if (TREE_READONLY_DECL_P (TREE_VALUE (list)))
5041 TREE_VALUE (list) = decl_constant_value (TREE_VALUE (list));
5043 if (TREE_CHAIN (list) == 0)
5045 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5046 Strip such NOP_EXPRs, since LIST is used in non-lvalue context. */
5047 if (TREE_CODE (list) == NOP_EXPR
5048 && TREE_TYPE (list) == TREE_TYPE (TREE_OPERAND (list, 0)))
5049 list = TREE_OPERAND (list, 0);
5051 /* Convert arrays to pointers. */
5052 if (TREE_CODE (TREE_TYPE (TREE_VALUE (list))) == ARRAY_TYPE)
5053 return default_conversion (TREE_VALUE (list));
5055 return TREE_VALUE (list);
5058 rest = build_compound_expr (TREE_CHAIN (list));
5060 /* When pedantic, a compound expression cannot be a constant expression. */
5061 if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)) && ! pedantic)
5064 return build (COMPOUND_EXPR, TREE_TYPE (rest),
5065 break_out_cleanups (TREE_VALUE (list)), rest);
5068 tree build_static_cast (type, expr)
5071 return build_c_cast (type, expr, 0);
5074 tree build_reinterpret_cast (type, expr)
5077 tree intype = TREE_TYPE (expr);
5079 if (TYPE_PTRMEMFUNC_P (type))
5080 type = TYPE_PTRMEMFUNC_FN_TYPE (type);
5082 if (current_template_parms)
5084 tree t = build_min (REINTERPRET_CAST_EXPR, type, expr);
5088 if (TYPE_PTRMEMFUNC_P (intype))
5089 intype = TYPE_PTRMEMFUNC_FN_TYPE (intype);
5091 if (! POINTER_TYPE_P (type) && ! TREE_CODE (type) == INTEGER_TYPE)
5093 cp_error ("reinterpret_cast cannot convert to type `%T'", type);
5094 return error_mark_node;
5096 if (! POINTER_TYPE_P (intype) && ! TREE_CODE (intype) == INTEGER_TYPE)
5098 cp_error ("reinterpret_cast cannot convert from type `%T'", type);
5099 return error_mark_node;
5101 if (TREE_CODE (type) == INTEGER_TYPE && TREE_CODE (intype) != POINTER_TYPE)
5103 cp_error ("reinterpret_cast cannot convert non-pointer type `%T' to `%T'",
5105 return error_mark_node;
5107 if (TREE_CODE (intype) == INTEGER_TYPE && TREE_CODE (type) != POINTER_TYPE)
5109 cp_error ("reinterpret_cast cannot convert `%T' to non-pointer type `%T'",
5111 return error_mark_node;
5114 if (TREE_CODE (type) == POINTER_TYPE && TREE_CODE (intype) == POINTER_TYPE)
5115 expr = convert (ptr_type_node, expr);
5117 return build_c_cast (type, expr, 0);
5120 tree build_const_cast (type, expr)
5123 tree intype = TREE_TYPE (expr);
5126 if (type == error_mark_node || expr == error_mark_node)
5127 return error_mark_node;
5129 if (TYPE_PTRMEMFUNC_P (type))
5130 type = TYPE_PTRMEMFUNC_FN_TYPE (type);
5131 if (TYPE_PTRMEMFUNC_P (intype))
5132 intype = TYPE_PTRMEMFUNC_FN_TYPE (intype);
5134 if (! POINTER_TYPE_P (type))
5136 cp_error ("const_cast cannot convert to non-pointer type `%T'", type);
5137 return error_mark_node;
5139 if (TREE_CODE (type) == REFERENCE_TYPE && ! real_lvalue_p (expr))
5141 cp_error ("const_cast cannot convert rvalue to type `%T'", type);
5142 return error_mark_node;
5144 if (TREE_CODE (type) == POINTER_TYPE && TREE_CODE (intype) != POINTER_TYPE)
5146 cp_error ("const_cast cannot convert non-pointer type `%T' to type `%T'",
5148 return error_mark_node;
5151 if (TREE_CODE (type) == REFERENCE_TYPE)
5153 t1 = TREE_TYPE (type);
5158 t1 = TREE_TYPE (type);
5159 t2 = TREE_TYPE (intype);
5161 for (; TREE_CODE (t1) == POINTER_TYPE && TREE_CODE (t2) == POINTER_TYPE;
5162 t1 = TREE_TYPE (t1), t2 = TREE_TYPE (t2))
5166 if (TREE_CODE (t1) == OFFSET_TYPE && TREE_CODE (t2) == OFFSET_TYPE)
5168 if (TYPE_OFFSET_BASETYPE (t1) != TYPE_OFFSET_BASETYPE (t2))
5170 cp_error ("const_cast cannot convert between pointers to members of different types `%T' and `%T'",
5171 TYPE_OFFSET_BASETYPE (t2), TYPE_OFFSET_BASETYPE (t1));
5172 return error_mark_node;
5174 t1 = TREE_TYPE (t1);
5175 t2 = TREE_TYPE (t2);
5178 if (TYPE_MAIN_VARIANT (t1) != TYPE_MAIN_VARIANT (t2))
5180 cp_error ("const_cast cannot convert unrelated type `%T' to `%T'",
5182 return error_mark_node;
5185 return build_c_cast (type, expr, 0);
5188 /* Build an expression representing a cast to type TYPE of expression EXPR.
5190 ALLOW_NONCONVERTING is true if we should allow non-converting constructors
5191 when doing the cast. */
5194 build_c_cast (type, expr, allow_nonconverting)
5197 int allow_nonconverting;
5199 register tree value = expr;
5201 if (type == error_mark_node || expr == error_mark_node)
5202 return error_mark_node;
5204 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5205 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
5206 if (TREE_CODE (type) != REFERENCE_TYPE
5207 && TREE_CODE (value) == NOP_EXPR
5208 && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
5209 value = TREE_OPERAND (value, 0);
5211 if (TREE_TYPE (expr)
5212 && TREE_CODE (TREE_TYPE (expr)) == OFFSET_TYPE
5213 && TREE_CODE (type) != OFFSET_TYPE)
5214 value = resolve_offset_ref (value);
5216 if (TREE_CODE (type) == ARRAY_TYPE)
5218 /* Allow casting from T1* to T2[] because Cfront allows it.
5219 NIHCL uses it. It is not valid ANSI C however, and hence, not
5221 if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
5224 pedwarn ("ANSI C++ forbids casting to an array type");
5225 type = build_pointer_type (TREE_TYPE (type));
5229 error ("ANSI C++ forbids casting to an array type");
5230 return error_mark_node;
5234 if (TREE_CODE (type) == FUNCTION_TYPE
5235 || TREE_CODE (type) == METHOD_TYPE)
5237 cp_error ("casting to function type `%T'", type);
5238 return error_mark_node;
5241 if (IS_SIGNATURE (type))
5243 error ("cast specifies signature type");
5244 return error_mark_node;
5247 if (current_template_parms)
5249 tree t = build_min (CAST_EXPR, type,
5250 min_tree_cons (NULL_TREE, value, NULL_TREE));
5254 if (TREE_CODE (type) == VOID_TYPE)
5255 value = build1 (CONVERT_EXPR, type, value);
5256 else if (TREE_TYPE (value) == NULL_TREE
5257 || type_unknown_p (value))
5259 value = instantiate_type (type, value, 1);
5261 if (value == error_mark_node)
5262 return error_mark_node;
5269 /* Convert functions and arrays to pointers and
5270 convert references to their expanded types,
5271 but don't convert any other types. */
5272 if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE
5273 || TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE
5274 || TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE
5275 || TREE_CODE (TREE_TYPE (value)) == REFERENCE_TYPE)
5276 value = default_conversion (value);
5277 otype = TREE_TYPE (value);
5279 /* Optionally warn about potentially worrisome casts. */
5282 && TREE_CODE (type) == POINTER_TYPE
5283 && TREE_CODE (otype) == POINTER_TYPE)
5285 /* For C++ we make these regular warnings, rather than
5286 softening them into pedwarns. */
5287 if (TYPE_VOLATILE (TREE_TYPE (otype))
5288 && ! TYPE_VOLATILE (TREE_TYPE (type)))
5289 warning ("cast discards `volatile' from pointer target type");
5290 if (TYPE_READONLY (TREE_TYPE (otype))
5291 && ! TYPE_READONLY (TREE_TYPE (type)))
5292 warning ("cast discards `const' from pointer target type");
5295 /* Warn about possible alignment problems. */
5296 if (STRICT_ALIGNMENT && warn_cast_align
5297 && TREE_CODE (type) == POINTER_TYPE
5298 && TREE_CODE (otype) == POINTER_TYPE
5299 && TREE_CODE (TREE_TYPE (otype)) != VOID_TYPE
5300 && TREE_CODE (TREE_TYPE (otype)) != FUNCTION_TYPE
5301 && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype)))
5302 warning ("cast increases required alignment of target type");
5305 /* We should see about re-enabling these, they seem useful to
5307 if (TREE_CODE (type) == INTEGER_TYPE
5308 && TREE_CODE (otype) == POINTER_TYPE
5309 && TYPE_PRECISION (type) != TYPE_PRECISION (otype))
5310 warning ("cast from pointer to integer of different size");
5312 if (TREE_CODE (type) == POINTER_TYPE
5313 && TREE_CODE (otype) == INTEGER_TYPE
5314 && TYPE_PRECISION (type) != TYPE_PRECISION (otype)
5315 /* Don't warn about converting 0 to pointer,
5316 provided the 0 was explicit--not cast or made by folding. */
5317 && !(TREE_CODE (value) == INTEGER_CST && integer_zerop (value)))
5318 warning ("cast to pointer from integer of different size");
5321 flag = allow_nonconverting ? CONV_NONCONVERTING : 0;
5323 if (TREE_CODE (type) == REFERENCE_TYPE)
5324 value = (convert_from_reference
5325 (convert_to_reference (type, value, CONV_OLD_CONVERT|flag,
5326 LOOKUP_COMPLAIN, NULL_TREE)));
5331 if (TREE_READONLY_DECL_P (value))
5332 value = decl_constant_value (value);
5335 value = convert_force (type, value, flag);
5337 /* Ignore any integer overflow caused by the cast. */
5338 if (TREE_CODE (value) == INTEGER_CST)
5340 TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue);
5341 TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
5346 /* Always produce some operator for an explicit cast,
5347 so we can tell (for -pedantic) that the cast is no lvalue.
5348 Also, pedantically, don't let (void *) (FOO *) 0 be a null
5349 pointer constant. */
5350 if (TREE_CODE (type) != REFERENCE_TYPE
5353 && TREE_CODE (value) == INTEGER_CST
5354 && TREE_CODE (expr) == INTEGER_CST
5355 && TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE)))
5356 value = non_lvalue (value);
5362 expand_target_expr (t)
5365 extern int temp_slot_level;
5366 extern int target_temp_slot_level;
5367 int old_temp_level = target_temp_slot_level;
5369 tree xval = make_node (RTL_EXPR);
5372 /* Any TARGET_EXPR temps live only as long as the outer temp level.
5373 Since they are preserved in this new inner level, we know they
5374 will make it into the outer level. */
5376 target_temp_slot_level = temp_slot_level;
5378 do_pending_stack_adjust ();
5379 start_sequence_for_rtl_expr (xval);
5381 rtxval = expand_expr (t, NULL, VOIDmode, 0);
5382 do_pending_stack_adjust ();
5383 TREE_SIDE_EFFECTS (xval) = 1;
5384 RTL_EXPR_SEQUENCE (xval) = get_insns ();
5386 RTL_EXPR_RTL (xval) = rtxval;
5387 TREE_TYPE (xval) = TREE_TYPE (t);
5390 target_temp_slot_level = old_temp_level;
5395 /* Build an assignment expression of lvalue LHS from value RHS.
5396 MODIFYCODE is the code for a binary operator that we use
5397 to combine the old value of LHS with RHS to get the new value.
5398 Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
5400 C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed.
5403 build_modify_expr (lhs, modifycode, rhs)
5405 enum tree_code modifycode;
5408 register tree result;
5410 tree lhstype = TREE_TYPE (lhs);
5411 tree olhstype = lhstype;
5414 /* Avoid duplicate error messages from operands that had errors. */
5415 if (TREE_CODE (lhs) == ERROR_MARK || TREE_CODE (rhs) == ERROR_MARK)
5416 return error_mark_node;
5418 /* Types that aren't fully specified cannot be used in assignments. */
5419 lhs = require_complete_type (lhs);
5423 /* Handle assignment to signature pointers/refs. */
5425 if (TYPE_LANG_SPECIFIC (lhstype) &&
5426 (IS_SIGNATURE_POINTER (lhstype) || IS_SIGNATURE_REFERENCE (lhstype)))
5428 return build_signature_pointer_constructor (lhs, rhs);
5431 /* Handle control structure constructs used as "lvalues". */
5433 switch (TREE_CODE (lhs))
5435 /* Handle --foo = 5; as these are valid constructs in C++ */
5436 case PREDECREMENT_EXPR:
5437 case PREINCREMENT_EXPR:
5438 if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
5439 lhs = build (TREE_CODE (lhs), TREE_TYPE (lhs),
5440 stabilize_reference (TREE_OPERAND (lhs, 0)));
5441 return build (COMPOUND_EXPR, lhstype,
5443 build_modify_expr (TREE_OPERAND (lhs, 0),
5446 /* Handle (a, b) used as an "lvalue". */
5448 newrhs = build_modify_expr (TREE_OPERAND (lhs, 1),
5450 if (TREE_CODE (newrhs) == ERROR_MARK)
5451 return error_mark_node;
5452 return build (COMPOUND_EXPR, lhstype,
5453 TREE_OPERAND (lhs, 0), newrhs);
5456 newrhs = build_modify_expr (TREE_OPERAND (lhs, 0), modifycode, rhs);
5457 if (TREE_CODE (newrhs) == ERROR_MARK)
5458 return error_mark_node;
5459 return build (COMPOUND_EXPR, lhstype, lhs, newrhs);
5461 /* Handle (a ? b : c) used as an "lvalue". */
5463 rhs = save_expr (rhs);
5465 /* Produce (a ? (b = rhs) : (c = rhs))
5466 except that the RHS goes through a save-expr
5467 so the code to compute it is only emitted once. */
5469 = build_conditional_expr (TREE_OPERAND (lhs, 0),
5470 build_modify_expr (convert (TREE_TYPE (lhs), TREE_OPERAND (lhs, 1)),
5472 build_modify_expr (convert (TREE_TYPE (lhs), TREE_OPERAND (lhs, 2)),
5474 if (TREE_CODE (cond) == ERROR_MARK)
5476 /* Make sure the code to compute the rhs comes out
5477 before the split. */
5478 return build (COMPOUND_EXPR, TREE_TYPE (lhs),
5479 /* Case to void to suppress warning
5480 from warn_if_unused_value. */
5481 convert (void_type_node, rhs), cond);
5485 if (TREE_CODE (lhs) == OFFSET_REF)
5487 if (TREE_OPERAND (lhs, 0) == NULL_TREE)
5489 /* Static class member? */
5490 tree member = TREE_OPERAND (lhs, 1);
5491 if (TREE_CODE (member) == VAR_DECL)
5495 compiler_error ("invalid static class member");
5496 return error_mark_node;
5500 lhs = resolve_offset_ref (lhs);
5502 olhstype = lhstype = TREE_TYPE (lhs);
5505 if (TREE_CODE (lhstype) == REFERENCE_TYPE
5506 && modifycode != INIT_EXPR)
5508 lhs = convert_from_reference (lhs);
5509 olhstype = lhstype = TREE_TYPE (lhs);
5512 /* If a binary op has been requested, combine the old LHS value with the RHS
5513 producing the value we should actually store into the LHS. */
5515 if (modifycode == INIT_EXPR)
5517 if (! IS_AGGR_TYPE (lhstype))
5518 /* Do the default thing */;
5519 else if (! TYPE_HAS_CONSTRUCTOR (lhstype))
5521 cp_error ("`%T' has no constructors", lhstype);
5522 return error_mark_node;
5524 else if (TYPE_HAS_TRIVIAL_INIT_REF (lhstype)
5525 && TYPE_MAIN_VARIANT (lhstype) == TYPE_MAIN_VARIANT (TREE_TYPE (newrhs)))
5526 /* Do the default thing */;
5529 result = build_method_call (lhs, ctor_identifier,
5530 build_tree_list (NULL_TREE, rhs),
5531 TYPE_BINFO (lhstype), LOOKUP_NORMAL);
5532 if (result == NULL_TREE)
5533 return error_mark_node;
5537 else if (modifycode == NOP_EXPR)
5539 /* `operator=' is not an inheritable operator. */
5540 if (! IS_AGGR_TYPE (lhstype))
5541 /* Do the default thing */;
5542 else if (! TYPE_HAS_ASSIGNMENT (lhstype))
5544 cp_error ("`%T' does not define operator=", lhstype);
5545 return error_mark_node;
5547 else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (lhstype)
5548 && TYPE_MAIN_VARIANT (lhstype) == TYPE_MAIN_VARIANT (TREE_TYPE (newrhs)))
5551 /* If we care about this, do overload resolution. */
5552 build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL,
5553 lhs, rhs, make_node (NOP_EXPR));
5555 /* Do the default thing */;
5559 result = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL,
5560 lhs, rhs, make_node (NOP_EXPR));
5561 if (result == NULL_TREE)
5562 return error_mark_node;
5567 else if (PROMOTES_TO_AGGR_TYPE (lhstype, REFERENCE_TYPE))
5569 /* This case must convert to some sort of lvalue that
5570 can participate in an op= operation. */
5573 if (build_default_binary_type_conversion (modifycode, &lhs_tmp, &rhs_tmp))
5575 lhs = stabilize_reference (lhs_tmp);
5576 /* Forget it was ever anything else. */
5577 olhstype = lhstype = TREE_TYPE (lhs);
5578 newrhs = build_binary_op (modifycode, lhs, rhs_tmp, 1);
5582 cp_error ("no match for `%Q(%#T, %#T)'", modifycode,
5583 TREE_TYPE (lhs), TREE_TYPE (rhs));
5584 return error_mark_node;
5589 lhs = stabilize_reference (lhs);
5590 newrhs = build_binary_op (modifycode, lhs, rhs, 1);
5591 if (newrhs == error_mark_node)
5593 cp_error (" in evaluation of `%Q(%#T, %#T)'", modifycode,
5594 TREE_TYPE (lhs), TREE_TYPE (rhs));
5595 return error_mark_node;
5599 /* Handle a cast used as an "lvalue".
5600 We have already performed any binary operator using the value as cast.
5601 Now convert the result to the cast type of the lhs,
5602 and then true type of the lhs and store it there;
5603 then convert result back to the cast type to be the value
5604 of the assignment. */
5606 switch (TREE_CODE (lhs))
5611 case FIX_TRUNC_EXPR:
5612 case FIX_FLOOR_EXPR:
5613 case FIX_ROUND_EXPR:
5615 if (TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
5616 || TREE_CODE (TREE_TYPE (newrhs)) == FUNCTION_TYPE
5617 || TREE_CODE (TREE_TYPE (newrhs)) == METHOD_TYPE
5618 || TREE_CODE (TREE_TYPE (newrhs)) == OFFSET_TYPE)
5619 newrhs = default_conversion (newrhs);
5621 tree inner_lhs = TREE_OPERAND (lhs, 0);
5623 if (! lvalue_p (lhs) && pedantic)
5624 pedwarn ("cast to non-reference type used as lvalue");
5626 result = build_modify_expr (inner_lhs, NOP_EXPR,
5627 convert (TREE_TYPE (inner_lhs),
5628 convert (lhstype, newrhs)));
5629 if (TREE_CODE (result) == ERROR_MARK)
5631 return convert (TREE_TYPE (lhs), result);
5635 /* Now we have handled acceptable kinds of LHS that are not truly lvalues.
5636 Reject anything strange now. */
5638 if (!lvalue_or_else (lhs, "assignment"))
5639 return error_mark_node;
5641 GNU_xref_assign (lhs);
5643 /* Warn about storing in something that is `const'. */
5644 /* For C++, don't warn if this is initialization. */
5645 if (modifycode != INIT_EXPR
5646 /* For assignment to `const' signature pointer/reference fields,
5647 don't warn either, we already printed a better message before. */
5648 && ! (TREE_CODE (lhs) == COMPONENT_REF
5649 && (IS_SIGNATURE_POINTER (TREE_TYPE (TREE_OPERAND (lhs, 0)))
5650 || IS_SIGNATURE_REFERENCE (TREE_TYPE (TREE_OPERAND (lhs, 0)))))
5651 && (TREE_READONLY (lhs) || TYPE_READONLY (lhstype)
5652 || ((TREE_CODE (lhstype) == RECORD_TYPE
5653 || TREE_CODE (lhstype) == UNION_TYPE)
5654 && C_TYPE_FIELDS_READONLY (lhstype))
5655 || (TREE_CODE (lhstype) == REFERENCE_TYPE
5656 && TYPE_READONLY (TREE_TYPE (lhstype)))))
5657 readonly_error (lhs, "assignment", 0);
5659 /* If storing into a structure or union member,
5660 it has probably been given type `int'.
5661 Compute the type that would go with
5662 the actual amount of storage the member occupies. */
5664 if (TREE_CODE (lhs) == COMPONENT_REF
5665 && (TREE_CODE (lhstype) == INTEGER_TYPE
5666 || TREE_CODE (lhstype) == REAL_TYPE
5667 || TREE_CODE (lhstype) == ENUMERAL_TYPE))
5669 lhstype = TREE_TYPE (get_unwidened (lhs, 0));
5671 /* If storing in a field that is in actuality a short or narrower
5672 than one, we must store in the field in its actual type. */
5674 if (lhstype != TREE_TYPE (lhs))
5676 lhs = copy_node (lhs);
5677 TREE_TYPE (lhs) = lhstype;
5681 /* check to see if there is an assignment to `this' */
5682 if (lhs == current_class_decl)
5684 if (flag_this_is_variable > 0
5685 && DECL_NAME (current_function_decl) != NULL_TREE
5686 && (DECL_NAME (current_function_decl)
5687 != constructor_name (current_class_type)))
5688 warning ("assignment to `this' not in constructor or destructor");
5689 current_function_just_assigned_this = 1;
5692 /* The TREE_TYPE of RHS may be TYPE_UNKNOWN. This can happen
5693 when the type of RHS is not yet known, i.e. its type
5694 is inherited from LHS. */
5695 rhs = require_instantiated_type (lhstype, newrhs, error_mark_node);
5696 if (rhs == error_mark_node)
5697 return error_mark_node;
5700 if (modifycode != INIT_EXPR)
5702 /* Make modifycode now either a NOP_EXPR or an INIT_EXPR. */
5703 modifycode = NOP_EXPR;
5704 /* Reference-bashing */
5705 if (TREE_CODE (lhstype) == REFERENCE_TYPE)
5707 tree tmp = convert_from_reference (lhs);
5708 lhstype = TREE_TYPE (tmp);
5709 if (TYPE_SIZE (lhstype) == 0)
5711 incomplete_type_error (lhs, lhstype);
5712 return error_mark_node;
5717 if (TREE_CODE (TREE_TYPE (newrhs)) == REFERENCE_TYPE)
5719 tree tmp = convert_from_reference (newrhs);
5720 if (TYPE_SIZE (TREE_TYPE (tmp)) == 0)
5722 incomplete_type_error (newrhs, TREE_TYPE (tmp));
5723 return error_mark_node;
5729 if (TREE_SIDE_EFFECTS (lhs))
5730 lhs = stabilize_reference (lhs);
5731 if (TREE_SIDE_EFFECTS (newrhs))
5732 newrhs = stabilize_reference (newrhs);
5734 /* Convert new value to destination type. */
5736 if (TREE_CODE (lhstype) == ARRAY_TYPE)
5740 if (! comptypes (lhstype, TREE_TYPE (rhs), 0))
5742 cp_error ("incompatible types in assignment of `%T' to `%T'",
5743 TREE_TYPE (rhs), lhstype);
5744 return error_mark_node;
5747 /* Allow array assignment in compiler-generated code. */
5748 if (pedantic && ! DECL_ARTIFICIAL (current_function_decl))
5749 pedwarn ("ANSI C++ forbids assignment of arrays");
5751 /* Have to wrap this in RTL_EXPR for two cases:
5752 in base or member initialization and if we
5753 are a branch of a ?: operator. Since we
5754 can't easily know the latter, just do it always. */
5756 result = make_node (RTL_EXPR);
5758 TREE_TYPE (result) = void_type_node;
5759 do_pending_stack_adjust ();
5760 start_sequence_for_rtl_expr (result);
5762 /* As a matter of principle, `start_sequence' should do this. */
5765 from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
5766 ? 1 + (modifycode != INIT_EXPR): 0;
5767 expand_vec_init (lhs, lhs, array_type_nelts (lhstype), newrhs,
5770 do_pending_stack_adjust ();
5772 TREE_SIDE_EFFECTS (result) = 1;
5773 RTL_EXPR_SEQUENCE (result) = get_insns ();
5774 RTL_EXPR_RTL (result) = const0_rtx;
5779 if (modifycode == INIT_EXPR)
5781 newrhs = convert_for_initialization (lhs, lhstype, newrhs, LOOKUP_NORMAL,
5782 "assignment", NULL_TREE, 0);
5783 if (lhs == DECL_RESULT (current_function_decl))
5785 if (DECL_INITIAL (lhs))
5786 warning ("return value from function receives multiple initializations");
5787 DECL_INITIAL (lhs) = newrhs;
5792 /* Avoid warnings on enum bit fields. */
5793 if (TREE_CODE (olhstype) == ENUMERAL_TYPE
5794 && TREE_CODE (lhstype) == INTEGER_TYPE)
5796 newrhs = convert_for_assignment (olhstype, newrhs, "assignment",
5798 newrhs = convert_force (lhstype, newrhs, 0);
5801 newrhs = convert_for_assignment (lhstype, newrhs, "assignment",
5803 if (TREE_CODE (newrhs) == CALL_EXPR
5804 && TYPE_NEEDS_CONSTRUCTING (lhstype))
5805 newrhs = build_cplus_new (lhstype, newrhs);
5807 /* Can't initialize directly from a TARGET_EXPR, since that would
5808 cause the lhs to be constructed twice, and possibly result in
5809 accidental self-initialization. So we force the TARGET_EXPR to be
5810 expanded without a target. */
5811 if (TREE_CODE (newrhs) == TARGET_EXPR)
5812 newrhs = build (COMPOUND_EXPR, TREE_TYPE (newrhs), newrhs,
5813 TREE_VALUE (newrhs));
5816 if (TREE_CODE (newrhs) == ERROR_MARK)
5817 return error_mark_node;
5819 if (TREE_CODE (newrhs) == COND_EXPR)
5822 tree cond = TREE_OPERAND (newrhs, 0);
5824 if (TREE_SIDE_EFFECTS (lhs))
5825 cond = build_compound_expr (tree_cons
5827 build_tree_list (NULL_TREE, cond)));
5829 /* Cannot have two identical lhs on this one tree (result) as preexpand
5830 calls will rip them out and fill in RTL for them, but when the
5831 rtl is generated, the calls will only be in the first side of the
5832 condition, not on both, or before the conditional jump! (mrs) */
5833 lhs1 = break_out_calls (lhs);
5836 /* If there's no change, the COND_EXPR behaves like any other rhs. */
5837 result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
5838 lhstype, lhs, newrhs);
5841 tree result_type = TREE_TYPE (newrhs);
5842 /* We have to convert each arm to the proper type because the
5843 types may have been munged by constant folding. */
5845 = build (COND_EXPR, result_type, cond,
5846 build_modify_expr (lhs, modifycode,
5847 convert (result_type,
5848 TREE_OPERAND (newrhs, 1))),
5849 build_modify_expr (lhs1, modifycode,
5850 convert (result_type,
5851 TREE_OPERAND (newrhs, 2))));
5855 result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
5856 lhstype, lhs, newrhs);
5858 TREE_SIDE_EFFECTS (result) = 1;
5860 /* If we got the LHS in a different type for storing in,
5861 convert the result back to the nominal type of LHS
5862 so that the value we return always has the same type
5863 as the LHS argument. */
5865 if (olhstype == TREE_TYPE (result))
5867 /* Avoid warnings converting integral types back into enums
5868 for enum bit fields. */
5869 if (TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
5870 && TREE_CODE (olhstype) == ENUMERAL_TYPE)
5872 result = build (COMPOUND_EXPR, olhstype, result, olhs);
5873 TREE_NO_UNUSED_WARNING (result) = 1;
5876 return convert_for_assignment (olhstype, result, "assignment",
5881 build_x_modify_expr (lhs, modifycode, rhs)
5883 enum tree_code modifycode;
5886 if (current_template_parms)
5887 return build_min_nt (MODOP_EXPR, lhs,
5888 build_min_nt (modifycode, 0, 0), rhs);
5890 if (modifycode != NOP_EXPR)
5892 tree rval = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL, lhs, rhs,
5893 make_node (modifycode));
5897 return build_modify_expr (lhs, modifycode, rhs);
5900 /* Return 0 if EXP is not a valid lvalue in this language
5901 even though `lvalue_or_else' would accept it. */
5904 language_lvalue_valid (exp)
5910 /* Get difference in deltas for different pointer to member function
5911 types. Return integer_zero_node, if FROM cannot be converted to a
5912 TO type. If FORCE is true, then allow reverse conversions as well. */
5914 get_delta_difference (from, to, force)
5918 tree delta = integer_zero_node;
5924 /* Should get_base_distance here, so we can check if any thing along the
5925 path is virtual, and we need to make sure we stay
5926 inside the real binfos when going through virtual bases.
5927 Maybe we should replace virtual bases with
5928 binfo_member (...CLASSTYPE_VBASECLASSES...)... (mrs) */
5929 binfo = get_binfo (from, to, 1);
5930 if (binfo == error_mark_node)
5932 error (" in pointer to member function conversion");
5939 error_not_base_type (from, to);
5940 error (" in pointer to member function conversion");
5943 binfo = get_binfo (to, from, 1);
5944 if (binfo == error_mark_node)
5946 error (" in pointer to member function conversion");
5951 error ("cannot convert pointer to member of type %T to unrelated pointer to member of type %T", from, to);
5954 if (TREE_VIA_VIRTUAL (binfo))
5956 warning ("pointer to member conversion to virtual base class will only work if you are very careful");
5958 return build_binary_op (MINUS_EXPR,
5960 BINFO_OFFSET (binfo), 1);
5962 if (TREE_VIA_VIRTUAL (binfo))
5964 warning ("pointer to member conversion from virtual base class will only work if you are very careful");
5966 return BINFO_OFFSET (binfo);
5969 /* Build a constructor for a pointer to member function. It can be
5970 used to initialize global variables, local variable, or used
5971 as a value in expressions. TYPE is the POINTER to METHOD_TYPE we
5974 If FORCE is non-zero, then force this conversion, even if
5975 we would rather not do it. Usually set when using an explicit
5978 Return error_mark_node, if something goes wrong. */
5981 build_ptrmemfunc (type, pfn, force)
5985 tree index = integer_zero_node;
5986 tree delta = integer_zero_node;
5987 tree delta2 = integer_zero_node;
5992 /* Handle multiple conversions of pointer to member functions. */
5993 if (TYPE_PTRMEMFUNC_P (TREE_TYPE (pfn)))
5995 tree ndelta, ndelta2, nindex;
5996 /* Is is already the right type? */
5997 if (type == TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (pfn)))
6000 if (TREE_CODE (pfn) != CONSTRUCTOR)
6003 ndelta = convert (ptrdiff_type_node, build_component_ref (pfn, delta_identifier, 0, 0));
6004 ndelta2 = convert (ptrdiff_type_node, DELTA2_FROM_PTRMEMFUNC (pfn));
6005 index = build_component_ref (pfn, index_identifier, 0, 0);
6006 delta = get_delta_difference (TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (pfn)))),
6007 TYPE_METHOD_BASETYPE (TREE_TYPE (type)),
6009 delta = build_binary_op (PLUS_EXPR, delta, ndelta, 1);
6010 delta2 = build_binary_op (PLUS_EXPR, ndelta2, delta2, 1);
6011 e1 = fold (build (GT_EXPR, boolean_type_node, index, integer_zero_node));
6013 u = build_nt (CONSTRUCTOR, 0, tree_cons (delta2_identifier, delta2, NULL_TREE));
6014 u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, delta,
6015 tree_cons (NULL_TREE, index,
6016 tree_cons (NULL_TREE, u, NULL_TREE))));
6017 e2 = digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0);
6019 pfn = PFN_FROM_PTRMEMFUNC (pfn);
6020 npfn = build1 (NOP_EXPR, type, pfn);
6021 TREE_CONSTANT (npfn) = TREE_CONSTANT (pfn);
6023 u = build_nt (CONSTRUCTOR, 0, tree_cons (pfn_identifier, npfn, NULL_TREE));
6024 u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, delta,
6025 tree_cons (NULL_TREE, index,
6026 tree_cons (NULL_TREE, u, NULL_TREE))));
6027 e3 = digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0);
6028 return build_conditional_expr (e1, e2, e3);
6031 ndelta = TREE_VALUE (CONSTRUCTOR_ELTS (pfn));
6032 nindex = TREE_VALUE (TREE_CHAIN (CONSTRUCTOR_ELTS (pfn)));
6033 npfn = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (pfn))));
6034 npfn = TREE_VALUE (CONSTRUCTOR_ELTS (npfn));
6035 if (integer_zerop (nindex))
6036 pfn = integer_zero_node;
6037 else if (integer_zerop (fold (size_binop (PLUS_EXPR, nindex, integer_one_node))))
6040 delta = get_delta_difference (TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (pfn)))),
6041 TYPE_METHOD_BASETYPE (TREE_TYPE (type)),
6043 delta = build_binary_op (PLUS_EXPR, delta, ndelta, 1);
6044 pfn = build1 (NOP_EXPR, type, npfn);
6045 TREE_CONSTANT (pfn) = TREE_CONSTANT (npfn);
6047 u = build_nt (CONSTRUCTOR, 0, tree_cons (pfn_identifier, pfn, NULL_TREE));
6048 u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, delta,
6049 tree_cons (NULL_TREE, nindex,
6050 tree_cons (NULL_TREE, u, NULL_TREE))));
6051 e3 = digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0);
6056 sorry ("value casting of variable nonnull pointer to member functions not supported");
6057 return error_mark_node;
6061 /* Handle null pointer to member function conversions. */
6062 if (integer_zerop (pfn))
6064 pfn = build_c_cast (type, integer_zero_node, 0);
6065 u = build_nt (CONSTRUCTOR, 0, tree_cons (pfn_identifier, pfn, NULL_TREE));
6066 u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, integer_zero_node,
6067 tree_cons (NULL_TREE, integer_zero_node,
6068 tree_cons (NULL_TREE, u, NULL_TREE))));
6069 return digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0);
6072 if (TREE_CODE (pfn) == TREE_LIST
6073 || (TREE_CODE (pfn) == ADDR_EXPR
6074 && TREE_CODE (TREE_OPERAND (pfn, 0)) == TREE_LIST))
6076 pfn = instantiate_type (type, pfn, 1);
6077 if (pfn == error_mark_node)
6078 return error_mark_node;
6079 if (TREE_CODE (pfn) != ADDR_EXPR)
6080 pfn = build_unary_op (ADDR_EXPR, pfn, 0);
6083 /* Allow pointer to member conversions here. */
6084 delta = get_delta_difference (TYPE_METHOD_BASETYPE (TREE_TYPE (TREE_TYPE (pfn))),
6085 TYPE_METHOD_BASETYPE (TREE_TYPE (type)),
6087 delta2 = build_binary_op (PLUS_EXPR, delta2, delta, 1);
6089 if (TREE_CODE (TREE_OPERAND (pfn, 0)) != FUNCTION_DECL)
6090 warning ("assuming pointer to member function is non-virtual");
6092 if (TREE_CODE (TREE_OPERAND (pfn, 0)) == FUNCTION_DECL
6093 && DECL_VINDEX (TREE_OPERAND (pfn, 0)))
6095 /* Find the offset to the vfield pointer in the object. */
6096 vfield_offset = get_binfo (DECL_CONTEXT (TREE_OPERAND (pfn, 0)),
6097 DECL_CLASS_CONTEXT (TREE_OPERAND (pfn, 0)),
6099 vfield_offset = get_vfield_offset (vfield_offset);
6100 delta2 = size_binop (PLUS_EXPR, vfield_offset, delta2);
6102 /* Map everything down one to make room for the null pointer to member. */
6103 index = size_binop (PLUS_EXPR,
6104 DECL_VINDEX (TREE_OPERAND (pfn, 0)),
6106 u = build_nt (CONSTRUCTOR, 0, tree_cons (delta2_identifier, delta2, NULL_TREE));
6110 index = size_binop (MINUS_EXPR, integer_zero_node, integer_one_node);
6112 npfn = build1 (NOP_EXPR, type, pfn);
6113 TREE_CONSTANT (npfn) = TREE_CONSTANT (pfn);
6115 u = build_nt (CONSTRUCTOR, 0, tree_cons (pfn_identifier, npfn, NULL_TREE));
6118 u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, delta,
6119 tree_cons (NULL_TREE, index,
6120 tree_cons (NULL_TREE, u, NULL_TREE))));
6121 return digest_init (TYPE_GET_PTRMEMFUNC_TYPE (type), u, (tree*)0);
6124 /* Convert value RHS to type TYPE as preparation for an assignment
6125 to an lvalue of type TYPE.
6126 The real work of conversion is done by `convert'.
6127 The purpose of this function is to generate error messages
6128 for assignments that are not allowed in C.
6129 ERRTYPE is a string to use in error messages:
6130 "assignment", "return", etc.
6132 C++: attempts to allow `convert' to find conversions involving
6133 implicit type conversion between aggregate and scalar types
6134 as per 8.5.6 of C++ manual. Does not randomly dereference
6135 pointers to aggregates! */
6138 convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
6144 register enum tree_code codel = TREE_CODE (type);
6145 register tree rhstype;
6146 register enum tree_code coder = TREE_CODE (TREE_TYPE (rhs));
6148 if (coder == UNKNOWN_TYPE)
6149 rhs = instantiate_type (type, rhs, 1);
6151 if (coder == ERROR_MARK)
6152 return error_mark_node;
6154 if (codel == OFFSET_TYPE)
6156 type = TREE_TYPE (type);
6157 codel = TREE_CODE (type);
6160 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
6161 if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
6162 rhs = TREE_OPERAND (rhs, 0);
6164 if (rhs == error_mark_node)
6165 return error_mark_node;
6167 if (TREE_VALUE (rhs) == error_mark_node)
6168 return error_mark_node;
6170 if (TREE_CODE (TREE_TYPE (rhs)) == OFFSET_TYPE)
6172 rhs = resolve_offset_ref (rhs);
6173 if (rhs == error_mark_node)
6174 return error_mark_node;
6175 rhstype = TREE_TYPE (rhs);
6176 coder = TREE_CODE (rhstype);
6179 if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
6180 || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
6181 || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
6182 rhs = default_conversion (rhs);
6183 else if (TREE_CODE (TREE_TYPE (rhs)) == REFERENCE_TYPE)
6184 rhs = convert_from_reference (rhs);
6186 rhstype = TREE_TYPE (rhs);
6187 coder = TREE_CODE (rhstype);
6189 /* This should no longer change types on us. */
6190 if (TREE_CODE (rhs) == CONST_DECL)
6191 rhs = DECL_INITIAL (rhs);
6192 else if (TREE_READONLY_DECL_P (rhs))
6193 rhs = decl_constant_value (rhs);
6195 if (type == rhstype)
6197 overflow_warning (rhs);
6201 if (coder == VOID_TYPE)
6203 error ("void value not ignored as it ought to be");
6204 return error_mark_node;
6206 /* Arithmetic types all interconvert. */
6207 if ((codel == INTEGER_TYPE || codel == REAL_TYPE || codel == BOOLEAN_TYPE)
6208 && (coder == INTEGER_TYPE || coder == REAL_TYPE || coder == BOOLEAN_TYPE))
6210 /* But we should warn if assigning REAL_TYPE to INTEGER_TYPE. */
6211 if (coder == REAL_TYPE && codel == INTEGER_TYPE)
6214 cp_warning ("`%T' used for argument %P of `%D'",
6215 rhstype, parmnum, fndecl);
6217 cp_warning ("%s to `%T' from `%T'", errtype, type, rhstype);
6219 /* And we should warn if assigning a negative value to
6220 an unsigned variable. */
6221 else if (TREE_UNSIGNED (type) && codel != BOOLEAN_TYPE)
6223 if (TREE_CODE (rhs) == INTEGER_CST
6224 && TREE_NEGATED_INT (rhs))
6227 cp_warning ("negative value `%E' passed as argument %P of `%D'",
6228 rhs, parmnum, fndecl);
6230 cp_warning ("%s of negative value `%E' to `%T'",
6231 errtype, rhs, type);
6233 overflow_warning (rhs);
6234 if (TREE_CONSTANT (rhs))
6238 return convert_and_check (type, rhs);
6240 /* Conversions involving enums. */
6241 else if ((codel == ENUMERAL_TYPE
6242 && (INTEGRAL_CODE_P (coder) || coder == REAL_TYPE))
6243 || (coder == ENUMERAL_TYPE
6244 && (INTEGRAL_CODE_P (codel) || codel == REAL_TYPE)))
6246 return cp_convert (type, rhs, CONV_IMPLICIT, LOOKUP_NORMAL);
6248 /* Conversions among pointers */
6249 else if (codel == POINTER_TYPE
6250 && (coder == POINTER_TYPE
6251 || (coder == RECORD_TYPE
6252 && (IS_SIGNATURE_POINTER (rhstype)
6253 || IS_SIGNATURE_REFERENCE (rhstype)))))
6255 register tree ttl = TREE_TYPE (type);
6259 if (coder == RECORD_TYPE)
6261 rhs = build_optr_ref (rhs);
6262 rhstype = TREE_TYPE (rhs);
6264 ttr = TREE_TYPE (rhstype);
6266 /* If both pointers are of aggregate type, then we
6267 can give better error messages, and save some work
6269 if (TREE_CODE (ttl) == RECORD_TYPE && TREE_CODE (ttr) == RECORD_TYPE)
6273 if (TYPE_MAIN_VARIANT (ttl) == TYPE_MAIN_VARIANT (ttr)
6274 || type == class_star_type_node
6275 || rhstype == class_star_type_node)
6276 binfo = TYPE_BINFO (ttl);
6278 binfo = get_binfo (ttl, ttr, 1);
6280 if (binfo == error_mark_node)
6281 return error_mark_node;
6283 return error_not_base_type (ttl, ttr);
6285 if (! TYPE_READONLY (ttl) && TYPE_READONLY (ttr))
6288 cp_pedwarn ("passing `%T' as argument %P of `%D' discards const",
6289 rhstype, parmnum, fndecl);
6291 cp_pedwarn ("%s to `%T' from `%T' discards const",
6292 errtype, type, rhstype);
6294 if (! TYPE_VOLATILE (ttl) && TYPE_VOLATILE (ttr))
6297 cp_pedwarn ("passing `%T' as argument %P of `%D' discards volatile",
6298 rhstype, parmnum, fndecl);
6300 cp_pedwarn ("%s to `%T' from `%T' discards volatile",
6301 errtype, type, rhstype);
6305 /* Any non-function converts to a [const][volatile] void *
6306 and vice versa; otherwise, targets must be the same.
6307 Meanwhile, the lhs target must have all the qualifiers of the rhs. */
6308 else if (TYPE_MAIN_VARIANT (ttl) == void_type_node
6309 || TYPE_MAIN_VARIANT (ttr) == void_type_node
6310 || (ctt = comp_target_types (type, rhstype, 1))
6311 || (unsigned_type (TYPE_MAIN_VARIANT (ttl))
6312 == unsigned_type (TYPE_MAIN_VARIANT (ttr))))
6314 /* ARM $4.8, commentary on p39. */
6315 if (TYPE_MAIN_VARIANT (ttl) == void_type_node
6316 && TREE_CODE (ttr) == OFFSET_TYPE)
6318 cp_error ("no standard conversion from `%T' to `void *'", ttr);
6319 return error_mark_node;
6323 cp_pedwarn ("converting `%T' to `%T' is a contravariance violation",
6326 if (TYPE_MAIN_VARIANT (ttl) != void_type_node
6327 && TYPE_MAIN_VARIANT (ttr) == void_type_node
6328 && rhs != null_pointer_node)
6330 if (coder == RECORD_TYPE)
6331 cp_pedwarn ("implicit conversion of signature pointer to type `%T'",
6334 pedwarn ("ANSI C++ forbids implicit conversion from `void *' in %s",
6337 /* Const and volatile mean something different for function types,
6338 so the usual warnings are not appropriate. */
6339 else if ((TREE_CODE (ttr) != FUNCTION_TYPE && TREE_CODE (ttr) != METHOD_TYPE)
6340 || (TREE_CODE (ttl) != FUNCTION_TYPE && TREE_CODE (ttl) != METHOD_TYPE))
6342 if (TREE_CODE (ttl) == OFFSET_TYPE
6343 && binfo_member (TYPE_OFFSET_BASETYPE (ttr),
6344 CLASSTYPE_VBASECLASSES (TYPE_OFFSET_BASETYPE (ttl))))
6346 sorry ("%s between pointer to members converting across virtual baseclasses", errtype);
6347 return error_mark_node;
6349 else if (! TYPE_READONLY (ttl) && TYPE_READONLY (ttr))
6352 cp_pedwarn ("passing `%T' as argument %P of `%D' discards const",
6353 rhstype, parmnum, fndecl);
6355 cp_pedwarn ("%s to `%T' from `%T' discards const",
6356 errtype, type, rhstype);
6358 else if (! TYPE_VOLATILE (ttl) && TYPE_VOLATILE (ttr))
6361 cp_pedwarn ("passing `%T' as argument %P of `%D' discards volatile",
6362 rhstype, parmnum, fndecl);
6364 cp_pedwarn ("%s to `%T' from `%T' discards volatile",
6365 errtype, type, rhstype);
6367 else if (TREE_CODE (ttl) == TREE_CODE (ttr)
6368 && ! comp_target_types (type, rhstype, 1))
6371 cp_pedwarn ("passing `%T' as argument %P of `%D' changes signedness",
6372 rhstype, parmnum, fndecl);
6374 cp_pedwarn ("%s to `%T' from `%T' changes signedness",
6375 errtype, type, rhstype);
6379 else if (TREE_CODE (ttr) == OFFSET_TYPE
6380 && TREE_CODE (ttl) != OFFSET_TYPE)
6382 /* Normally, pointers to different type codes (other
6383 than void) are not compatible, but we perform
6384 some type instantiation if that resolves the
6385 ambiguity of (X Y::*) and (X *). */
6387 if (current_class_decl)
6389 if (TREE_CODE (rhs) == INTEGER_CST)
6391 rhs = build (PLUS_EXPR, build_pointer_type (TREE_TYPE (ttr)),
6392 current_class_decl, rhs);
6393 return convert_for_assignment (type, rhs,
6394 errtype, fndecl, parmnum);
6397 if (TREE_CODE (ttl) == METHOD_TYPE)
6398 error ("%s between pointer-to-method and pointer-to-member types",
6401 error ("%s between pointer and pointer-to-member types", errtype);
6402 return error_mark_node;
6406 int add_quals = 0, const_parity = 0, volatile_parity = 0;
6408 int unsigned_parity;
6411 /* This code is basically a duplicate of comp_ptr_ttypes_real. */
6412 for (; ; ttl = TREE_TYPE (ttl), ttr = TREE_TYPE (ttr))
6415 const_parity |= (TYPE_READONLY (ttl) < TYPE_READONLY (ttr));
6416 volatile_parity |= (TYPE_VOLATILE (ttl) < TYPE_VOLATILE (ttr));
6419 && (TYPE_READONLY (ttl) > TYPE_READONLY (ttr)
6420 || TYPE_VOLATILE (ttl) > TYPE_VOLATILE (ttr)))
6422 left_const &= TYPE_READONLY (ttl);
6424 if (TREE_CODE (ttl) != POINTER_TYPE
6425 || TREE_CODE (ttr) != POINTER_TYPE)
6428 unsigned_parity = TREE_UNSIGNED (ttl) - TREE_UNSIGNED (ttr);
6429 if (unsigned_parity)
6431 if (TREE_UNSIGNED (ttl))
6432 ttr = unsigned_type (ttr);
6434 ttl = unsigned_type (ttl);
6437 if (comp_target_types (ttl, ttr, nptrs) > 0)
6442 cp_pedwarn ("passing `%T' as argument %P of `%D' adds cv-quals without intervening `const'",
6443 rhstype, parmnum, fndecl);
6445 cp_pedwarn ("%s to `%T' from `%T' adds cv-quals without intervening `const'",
6446 errtype, type, rhstype);
6451 cp_pedwarn ("passing `%T' as argument %P of `%D' discards const",
6452 rhstype, parmnum, fndecl);
6454 cp_pedwarn ("%s to `%T' from `%T' discards const",
6455 errtype, type, rhstype);
6457 if (volatile_parity)
6460 cp_pedwarn ("passing `%T' as argument %P of `%D' discards volatile",
6461 rhstype, parmnum, fndecl);
6463 cp_pedwarn ("%s to `%T' from `%T' discards volatile",
6464 errtype, type, rhstype);
6466 if (unsigned_parity > 0)
6469 cp_pedwarn ("passing `%T' as argument %P of `%D' changes signed to unsigned",
6470 rhstype, parmnum, fndecl);
6472 cp_pedwarn ("%s to `%T' from `%T' changes signed to unsigned",
6473 errtype, type, rhstype);
6475 else if (unsigned_parity < 0)
6478 cp_pedwarn ("passing `%T' as argument %P of `%D' changes unsigned to signed",
6479 rhstype, parmnum, fndecl);
6481 cp_pedwarn ("%s to `%T' from `%T' changes unsigned to signed",
6482 errtype, type, rhstype);
6485 /* C++ is not so friendly about converting function and
6486 member function pointers as C. Emit warnings here. */
6487 if (TREE_CODE (ttl) == FUNCTION_TYPE
6488 || TREE_CODE (ttl) == METHOD_TYPE)
6489 if (! comptypes (ttl, ttr, 0))
6491 warning ("conflicting function types in %s:", errtype);
6492 cp_warning ("\t`%T' != `%T'", type, rhstype);
6495 else if (TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
6497 /* When does this happen? */
6498 my_friendly_abort (119);
6499 /* Conversion of a pointer-to-member type to void *. */
6500 rhs = build_unary_op (ADDR_EXPR, rhs, 0);
6501 TREE_TYPE (rhs) = type;
6504 else if (TREE_CODE (TREE_TYPE (rhs)) == OFFSET_TYPE)
6506 /* When does this happen? */
6507 my_friendly_abort (120);
6508 /* Conversion of a pointer-to-member type to void *. */
6509 rhs = build_unary_op (ADDR_EXPR, rhs, 0);
6510 TREE_TYPE (rhs) = type;
6516 cp_error ("passing `%T' as argument %P of `%D'",
6517 rhstype, parmnum, fndecl);
6519 cp_error ("%s to `%T' from `%T'", errtype, type, rhstype);
6520 return error_mark_node;
6523 return convert (type, rhs);
6525 else if (codel == POINTER_TYPE && coder == INTEGER_TYPE)
6527 /* An explicit constant 0 can convert to a pointer,
6528 but not a 0 that results from casting or folding. */
6529 if (! (TREE_CODE (rhs) == INTEGER_CST && integer_zerop (rhs)))
6532 cp_pedwarn ("passing `%T' to argument %P of `%D' lacks a cast",
6533 rhstype, parmnum, fndecl);
6535 cp_pedwarn ("%s to `%T' from `%T' lacks a cast",
6536 errtype, type, rhstype);
6537 return convert (type, rhs);
6539 return null_pointer_node;
6541 else if (codel == INTEGER_TYPE
6542 && (coder == POINTER_TYPE
6543 || (coder == RECORD_TYPE
6544 && (IS_SIGNATURE_POINTER (rhstype)
6545 || TYPE_PTRMEMFUNC_FLAG (rhstype)
6546 || IS_SIGNATURE_REFERENCE (rhstype)))))
6549 cp_pedwarn ("passing `%T' to argument %P of `%D' lacks a cast",
6550 rhstype, parmnum, fndecl);
6552 cp_pedwarn ("%s to `%T' from `%T' lacks a cast",
6553 errtype, type, rhstype);
6554 return convert (type, rhs);
6556 else if (codel == BOOLEAN_TYPE
6557 && (coder == POINTER_TYPE
6558 || (coder == RECORD_TYPE
6559 && (IS_SIGNATURE_POINTER (rhstype)
6560 || TYPE_PTRMEMFUNC_FLAG (rhstype)
6561 || IS_SIGNATURE_REFERENCE (rhstype)))))
6562 return convert (type, rhs);
6565 else if (((coder == POINTER_TYPE
6566 && TREE_CODE (TREE_TYPE (rhstype)) == METHOD_TYPE)
6567 || integer_zerop (rhs)
6568 || TYPE_PTRMEMFUNC_P (rhstype))
6569 && TYPE_PTRMEMFUNC_P (type))
6571 tree ttl = TYPE_PTRMEMFUNC_FN_TYPE (type);
6572 tree ttr = (TREE_CODE (rhstype) == POINTER_TYPE ? rhstype
6573 : TYPE_PTRMEMFUNC_FN_TYPE (type));
6574 int ctt = comp_target_types (ttl, ttr, 1);
6577 cp_pedwarn ("converting `%T' to `%T' is a contravariance violation",
6580 cp_error ("%s to `%T' from `%T'", errtype, ttl, ttr);
6582 /* compatible pointer to member functions. */
6583 return build_ptrmemfunc (ttl, rhs, 0);
6585 else if (codel == ERROR_MARK || coder == ERROR_MARK)
6586 return error_mark_node;
6588 /* This should no longer happen. References are initialized via
6589 `convert_for_initialization'. They should otherwise be
6590 bashed before coming here. */
6591 else if (codel == REFERENCE_TYPE)
6592 my_friendly_abort (317);
6593 else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (rhs)))
6595 tree nrhs = build1 (NOP_EXPR, type, rhs);
6596 TREE_CONSTANT (nrhs) = TREE_CONSTANT (rhs);
6599 else if (TYPE_HAS_CONSTRUCTOR (type) || IS_AGGR_TYPE (TREE_TYPE (rhs)))
6600 return convert (type, rhs);
6602 cp_error ("%s to `%T' from `%T'", errtype, type, rhstype);
6603 return error_mark_node;
6606 /* Convert RHS to be of type TYPE. If EXP is non-zero,
6607 it is the target of the initialization.
6608 ERRTYPE is a string to use in error messages.
6610 Two major differences between the behavior of
6611 `convert_for_assignment' and `convert_for_initialization'
6612 are that references are bashed in the former, while
6613 copied in the latter, and aggregates are assigned in
6614 the former (operator=) while initialized in the
6617 If using constructor make sure no conversion operator exists, if one does
6618 exist, an ambiguity exists.
6620 If flags doesn't include LOOKUP_COMPLAIN, don't complain about anything. */
6622 convert_for_initialization (exp, type, rhs, flags, errtype, fndecl, parmnum)
6623 tree exp, type, rhs;
6629 register enum tree_code codel = TREE_CODE (type);
6630 register tree rhstype;
6631 register enum tree_code coder;
6633 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
6634 Strip such NOP_EXPRs, since RHS is used in non-lvalue context. */
6635 if (TREE_CODE (rhs) == NOP_EXPR
6636 && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))
6637 && codel != REFERENCE_TYPE)
6638 rhs = TREE_OPERAND (rhs, 0);
6640 if (rhs == error_mark_node
6641 || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node))
6642 return error_mark_node;
6644 if (TREE_CODE (TREE_TYPE (rhs)) == OFFSET_TYPE)
6646 rhs = resolve_offset_ref (rhs);
6647 if (rhs == error_mark_node)
6648 return error_mark_node;
6651 if (TREE_CODE (TREE_TYPE (rhs)) == REFERENCE_TYPE)
6652 rhs = convert_from_reference (rhs);
6654 if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
6655 && TREE_CODE (type) != ARRAY_TYPE
6656 && (TREE_CODE (type) != REFERENCE_TYPE
6657 || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
6658 || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
6659 || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
6660 rhs = default_conversion (rhs);
6662 rhstype = TREE_TYPE (rhs);
6663 coder = TREE_CODE (rhstype);
6665 if (coder == UNKNOWN_TYPE)
6667 rhs = instantiate_type (type, rhs, 1);
6668 rhstype = TREE_TYPE (rhs);
6669 coder = TREE_CODE (rhstype);
6672 if (coder == ERROR_MARK)
6673 return error_mark_node;
6675 /* We accept references to incomplete types, so we can
6676 return here before checking if RHS is of complete type. */
6678 if (codel == REFERENCE_TYPE)
6680 /* This should eventually happen in convert_arguments. */
6681 extern int warningcount, errorcount;
6685 savew = warningcount, savee = errorcount;
6686 rhs = convert_to_reference (type, rhs, CONV_IMPLICIT, flags,
6687 exp ? exp : error_mark_node);
6690 if (warningcount > savew)
6691 cp_warning_at ("in passing argument %P of `%+D'", parmnum, fndecl);
6692 else if (errorcount > savee)
6693 cp_error_at ("in passing argument %P of `%+D'", parmnum, fndecl);
6698 rhs = require_complete_type (rhs);
6699 if (rhs == error_mark_node)
6700 return error_mark_node;
6702 if (exp != 0) exp = require_complete_type (exp);
6703 if (exp == error_mark_node)
6704 return error_mark_node;
6706 if (TREE_CODE (rhstype) == REFERENCE_TYPE)
6707 rhstype = TREE_TYPE (rhstype);
6709 if (TYPE_LANG_SPECIFIC (type)
6710 && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type)))
6711 return build_signature_pointer_constructor (type, rhs);
6713 if (IS_AGGR_TYPE (type)
6714 && (TYPE_NEEDS_CONSTRUCTING (type) || TREE_HAS_CONSTRUCTOR (rhs)))
6716 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype))
6718 /* This is sufficient to perform initialization. No need,
6719 apparently, to go through X(X&) to do first-cut
6720 initialization. Return through a TARGET_EXPR so that we get
6721 cleanups if it is used. */
6722 if (TREE_CODE (rhs) == CALL_EXPR)
6724 rhs = build_cplus_new (type, rhs);
6727 /* Handle the case of default parameter initialization and
6728 initialization of static variables. */
6729 else if (TREE_CODE (rhs) == TARGET_EXPR)
6731 else if (TREE_CODE (rhs) == INDIRECT_REF && TREE_HAS_CONSTRUCTOR (rhs))
6733 my_friendly_assert (TREE_CODE (TREE_OPERAND (rhs, 0)) == CALL_EXPR, 318);
6736 my_friendly_assert (TREE_VALUE (TREE_OPERAND (TREE_OPERAND (rhs, 0), 1)) == NULL_TREE, 316);
6737 TREE_VALUE (TREE_OPERAND (TREE_OPERAND (rhs, 0), 1))
6738 = build_unary_op (ADDR_EXPR, exp, 0);
6741 rhs = build_cplus_new (type, TREE_OPERAND (rhs, 0));
6744 else if (TYPE_HAS_TRIVIAL_INIT_REF (type))
6747 if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype)
6748 || (IS_AGGR_TYPE (rhstype) && UNIQUELY_DERIVED_FROM_P (type, rhstype)))
6750 if (TYPE_HAS_INIT_REF (type))
6752 tree init = build_method_call (exp, ctor_identifier,
6753 build_tree_list (NULL_TREE, rhs),
6754 TYPE_BINFO (type), LOOKUP_NORMAL);
6756 if (init == error_mark_node)
6757 return error_mark_node;
6761 exp = build_cplus_new (type, init);
6765 return build (COMPOUND_EXPR, type, init, exp);
6768 /* ??? The following warnings are turned off because
6769 this is another place where the default X(X&) constructor
6771 if (TYPE_HAS_ASSIGNMENT (type))
6772 cp_warning ("bitwise copy: `%T' defines operator=", type);
6774 if (TREE_CODE (TREE_TYPE (rhs)) == REFERENCE_TYPE)
6775 rhs = convert_from_reference (rhs);
6776 if (type != rhstype)
6778 tree nrhs = build1 (NOP_EXPR, type, rhs);
6779 TREE_CONSTANT (nrhs) = TREE_CONSTANT (rhs);
6785 return cp_convert (type, rhs, CONV_OLD_CONVERT,
6786 flags | LOOKUP_NO_CONVERSION);
6789 if (type == TREE_TYPE (rhs))
6791 if (TREE_READONLY_DECL_P (rhs))
6792 rhs = decl_constant_value (rhs);
6796 return convert_for_assignment (type, rhs, errtype, fndecl, parmnum);
6799 /* Expand an ASM statement with operands, handling output operands
6800 that are not variables or INDIRECT_REFS by transforming such
6801 cases into cases that expand_asm_operands can handle.
6803 Arguments are same as for expand_asm_operands.
6805 We don't do default conversions on all inputs, because it can screw
6806 up operands that are expected to be in memory. */
6809 c_expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
6810 tree string, outputs, inputs, clobbers;
6815 int noutputs = list_length (outputs);
6817 /* o[I] is the place that output number I should be written. */
6818 register tree *o = (tree *) alloca (noutputs * sizeof (tree));
6821 /* Record the contents of OUTPUTS before it is modified. */
6822 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
6823 o[i] = TREE_VALUE (tail);
6825 /* Generate the ASM_OPERANDS insn;
6826 store into the TREE_VALUEs of OUTPUTS some trees for
6827 where the values were actually stored. */
6828 expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line);
6830 /* Copy all the intermediate outputs into the specified outputs. */
6831 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
6833 if (o[i] != TREE_VALUE (tail))
6835 expand_expr (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail)),
6836 const0_rtx, VOIDmode, 0);
6839 /* Detect modification of read-only values.
6840 (Otherwise done by build_modify_expr.) */
6843 tree type = TREE_TYPE (o[i]);
6844 if (TYPE_READONLY (type)
6845 || ((TREE_CODE (type) == RECORD_TYPE
6846 || TREE_CODE (type) == UNION_TYPE)
6847 && C_TYPE_FIELDS_READONLY (type)))
6848 readonly_error (o[i], "modification by `asm'", 1);
6852 /* Those MODIFY_EXPRs could do autoincrements. */
6856 /* Expand a C `return' statement.
6857 RETVAL is the expression for what to return,
6858 or a null pointer for `return;' with no value.
6860 C++: upon seeing a `return', we must call destructors on all
6861 variables in scope which had constructors called on them.
6862 This means that if in a destructor, the base class destructors
6863 must be called before returning.
6865 The RETURN statement in C++ has initialization semantics. */
6868 c_expand_return (retval)
6871 extern struct nesting *cond_stack, *loop_stack, *case_stack;
6872 extern tree dtor_label, ctor_label;
6873 tree result = DECL_RESULT (current_function_decl);
6874 tree valtype = TREE_TYPE (result);
6875 int returns_value = 1;
6877 if (TREE_THIS_VOLATILE (current_function_decl))
6878 warning ("function declared `noreturn' has a `return' statement");
6880 if (retval == error_mark_node)
6882 current_function_returns_null = 1;
6886 if (current_template_parms)
6888 add_tree (build_min_nt (RETURN_STMT, retval));
6892 if (retval == NULL_TREE)
6894 /* A non-named return value does not count. */
6896 /* Can't just return from a destructor. */
6899 expand_goto (dtor_label);
6903 if (DECL_CONSTRUCTOR_P (current_function_decl))
6904 retval = current_class_decl;
6905 else if (DECL_NAME (result) != NULL_TREE
6906 && TREE_CODE (valtype) != VOID_TYPE)
6910 current_function_returns_null = 1;
6912 if (valtype != NULL_TREE && TREE_CODE (valtype) != VOID_TYPE)
6914 if (DECL_NAME (DECL_RESULT (current_function_decl)) == NULL_TREE)
6916 pedwarn ("`return' with no value, in function returning non-void");
6917 /* Clear this, so finish_function won't say that we
6918 reach the end of a non-void function (which we don't,
6919 we gave a return!). */
6920 current_function_returns_null = 0;
6924 expand_null_return ();
6928 else if (DECL_CONSTRUCTOR_P (current_function_decl)
6929 && retval != current_class_decl)
6931 error ("return from a constructor: use `this = ...' instead");
6932 retval = current_class_decl;
6935 if (valtype == NULL_TREE || TREE_CODE (valtype) == VOID_TYPE)
6937 current_function_returns_null = 1;
6938 /* We do this here so we'll avoid a warning about how the function
6939 "may or may not return a value" in finish_function. */
6943 pedwarn ("`return' with a value, in function returning void");
6944 expand_return (retval);
6946 /* Add some useful error checking for C++. */
6947 else if (TREE_CODE (valtype) == REFERENCE_TYPE)
6949 tree whats_returned;
6950 tree tmp_result = result;
6952 /* Don't initialize directly into a non-BLKmode retval, since that
6953 could lose when being inlined by another caller. (GCC can't
6954 read the function return register in an inline function when
6955 the return value is being ignored). */
6956 if (result && TYPE_MODE (TREE_TYPE (tmp_result)) != BLKmode)
6959 /* convert to reference now, so we can give error if we
6960 return an reference to a non-lvalue. */
6961 retval = convert_for_initialization (tmp_result, valtype, retval,
6962 LOOKUP_NORMAL, "return",
6965 /* Sort through common things to see what it is
6966 we are returning. */
6967 whats_returned = retval;
6968 if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
6970 whats_returned = TREE_OPERAND (whats_returned, 1);
6971 if (TREE_CODE (whats_returned) == ADDR_EXPR)
6972 whats_returned = TREE_OPERAND (whats_returned, 0);
6974 if (TREE_CODE (whats_returned) == ADDR_EXPR)
6976 whats_returned = TREE_OPERAND (whats_returned, 0);
6977 while (TREE_CODE (whats_returned) == NEW_EXPR
6978 || TREE_CODE (whats_returned) == TARGET_EXPR)
6980 /* Get the target. */
6981 whats_returned = TREE_OPERAND (whats_returned, 0);
6982 warning ("returning reference to temporary");
6986 if (TREE_CODE (whats_returned) == VAR_DECL && DECL_NAME (whats_returned))
6988 if (TEMP_NAME_P (DECL_NAME (whats_returned)))
6989 warning ("reference to non-lvalue returned");
6990 else if (! TREE_STATIC (whats_returned)
6991 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (whats_returned))
6992 && !TREE_PUBLIC (whats_returned))
6993 cp_warning_at ("reference to local variable `%D' returned", whats_returned);
6996 else if (TREE_CODE (retval) == ADDR_EXPR)
6998 tree whats_returned = TREE_OPERAND (retval, 0);
7000 if (TREE_CODE (whats_returned) == VAR_DECL
7001 && DECL_NAME (whats_returned)
7002 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (whats_returned))
7003 && !TREE_STATIC (whats_returned)
7004 && !TREE_PUBLIC (whats_returned))
7005 cp_warning_at ("address of local variable `%D' returned", whats_returned);
7007 else if (TREE_CODE (retval) == VAR_DECL)
7009 if (TREE_CODE (TREE_TYPE (retval)) == ARRAY_TYPE
7010 && DECL_NAME (retval)
7011 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (retval))
7012 && !TREE_STATIC (retval)
7013 && !TREE_PUBLIC (retval))
7014 cp_warning_at ("address of local array `%D' returned", retval);
7017 /* Now deal with possible C++ hair:
7018 (1) Compute the return value.
7019 (2) If there are aggregate values with destructors which
7020 must be cleaned up, clean them (taking care
7021 not to clobber the return value).
7022 (3) If an X(X&) constructor is defined, the return
7023 value must be returned via that. */
7025 /* If we're returning in a register, we can't initialize the
7026 return value from a TARGET_EXPR. */
7027 if (TREE_CODE (retval) == TARGET_EXPR
7028 && TYPE_MAIN_VARIANT (TREE_TYPE (retval)) == TYPE_MAIN_VARIANT (valtype)
7029 && ! current_function_returns_struct)
7030 retval = expand_target_expr (retval);
7032 if (retval == result
7033 /* Watch out for constructors, which "return" aggregates
7034 via initialization, but which otherwise "return" a pointer. */
7035 || DECL_CONSTRUCTOR_P (current_function_decl))
7037 /* This is just an error--it's already been reported. */
7038 if (TYPE_SIZE (valtype) == NULL_TREE)
7041 if (TYPE_MODE (valtype) != BLKmode
7042 && any_pending_cleanups (1))
7043 retval = get_temp_regvar (valtype, retval);
7045 else if (IS_AGGR_TYPE (valtype) && current_function_returns_struct)
7047 expand_aggr_init (result, retval, 0, LOOKUP_ONLYCONVERTING);
7048 expand_cleanups_to (NULL_TREE);
7049 DECL_INITIAL (result) = NULL_TREE;
7054 if (TYPE_MODE (valtype) == VOIDmode)
7056 if (TYPE_MODE (TREE_TYPE (result)) != VOIDmode
7057 && warn_return_type)
7058 warning ("return of void value in function returning non-void");
7059 expand_expr_stmt (retval);
7063 else if (TYPE_MODE (valtype) != BLKmode
7064 && any_pending_cleanups (1))
7066 retval = get_temp_regvar (valtype, retval);
7067 expand_cleanups_to (NULL_TREE);
7072 retval = convert_for_initialization (result, valtype, retval,
7074 "return", NULL_TREE, 0);
7075 DECL_INITIAL (result) = NULL_TREE;
7077 if (retval == error_mark_node)
7083 if (retval != NULL_TREE
7084 && TREE_CODE_CLASS (TREE_CODE (retval)) == 'd'
7085 && cond_stack == 0 && loop_stack == 0 && case_stack == 0)
7086 current_function_return_value = retval;
7090 /* Everything's great--RETVAL is in RESULT. */
7091 if (original_result_rtx)
7093 store_expr (result, original_result_rtx, 0);
7094 expand_cleanups_to (NULL_TREE);
7095 use_variable (DECL_RTL (result));
7096 if (ctor_label && TREE_CODE (ctor_label) != ERROR_MARK)
7097 expand_goto (ctor_label);
7099 expand_null_return ();
7101 else if (retval && retval != result)
7103 /* Clear this out so the later call to decl_function_context
7104 won't end up bombing on us. */
7105 if (DECL_CONTEXT (result) == error_mark_node)
7106 DECL_CONTEXT (result) = NULL_TREE;
7107 /* Here is where we finally get RETVAL into RESULT.
7108 `expand_return' does the magic of protecting
7109 RESULT from cleanups. */
7110 retval = fold (build1 (CLEANUP_POINT_EXPR, TREE_TYPE (result),
7112 /* This part _must_ come second, because expand_return looks for
7113 the INIT_EXPR as the toplevel node only. :-( */
7114 retval = build (INIT_EXPR, TREE_TYPE (result), result, retval);
7115 TREE_SIDE_EFFECTS (retval) = 1;
7116 expand_return (retval);
7119 expand_return (result);
7123 /* We may still need to put RETVAL into RESULT. */
7124 result = DECL_RESULT (current_function_decl);
7125 if (original_result_rtx)
7127 /* Here we have a named return value that went
7128 into memory. We can compute RETVAL into that. */
7130 expand_assignment (result, retval, 0, 0);
7132 store_expr (result, original_result_rtx, 0);
7133 result = make_tree (TREE_TYPE (result), original_result_rtx);
7135 else if (ctor_label && TREE_CODE (ctor_label) != ERROR_MARK)
7137 /* Here RETVAL is CURRENT_CLASS_DECL, so there's nothing to do. */
7138 expand_goto (ctor_label);
7142 /* Here is where we finally get RETVAL into RESULT.
7143 `expand_return' does the magic of protecting
7144 RESULT from cleanups. */
7145 result = build (INIT_EXPR, TREE_TYPE (result), result, retval);
7146 TREE_SIDE_EFFECTS (result) = 1;
7147 expand_return (result);
7149 else if (TYPE_MODE (TREE_TYPE (result)) != VOIDmode)
7150 expand_return (result);
7153 current_function_returns_value = returns_value;
7155 /* One way to clear out cleanups that EXPR might
7156 generate. Note that this code will really be
7157 dead code, but that is ok--cleanups that were
7158 needed were handled by the magic of `return'. */
7159 expand_cleanups_to (NULL_TREE);
7162 /* Start a C switch statement, testing expression EXP.
7163 Return EXP if it is valid, an error node otherwise. */
7166 c_expand_start_case (exp)
7170 register enum tree_code code;
7172 /* Convert from references, etc. */
7173 exp = default_conversion (exp);
7174 type = TREE_TYPE (exp);
7175 code = TREE_CODE (type);
7177 if (IS_AGGR_TYPE_CODE (code))
7178 exp = build_type_conversion (CONVERT_EXPR, integer_type_node, exp, 1);
7180 if (exp == NULL_TREE)
7182 error ("switch quantity not an integer");
7183 exp = error_mark_node;
7185 type = TREE_TYPE (exp);
7186 code = TREE_CODE (type);
7188 if (code != INTEGER_TYPE && code != ENUMERAL_TYPE && code != ERROR_MARK)
7190 error ("switch quantity not an integer");
7191 exp = error_mark_node;
7197 exp = default_conversion (exp);
7198 type = TREE_TYPE (exp);
7199 index = get_unwidened (exp, 0);
7200 /* We can't strip a conversion from a signed type to an unsigned,
7201 because if we did, int_fits_type_p would do the wrong thing
7202 when checking case values for being in range,
7203 and it's too hard to do the right thing. */
7204 if (TREE_UNSIGNED (TREE_TYPE (exp))
7205 == TREE_UNSIGNED (TREE_TYPE (index)))
7210 (1, fold (build1 (CLEANUP_POINT_EXPR, TREE_TYPE (exp), exp)),
7211 type, "switch statement");
7216 /* CONSTP remembers whether or not all the intervening pointers in the `to'
7217 type have been const. */
7219 comp_ptr_ttypes_real (to, from, constp)
7223 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7225 if (TREE_CODE (to) != TREE_CODE (from))
7228 /* Const and volatile mean something different for function types,
7229 so the usual checks are not appropriate. */
7230 if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
7232 if (TYPE_READONLY (from) > TYPE_READONLY (to)
7233 || TYPE_VOLATILE (from) > TYPE_VOLATILE (to))
7237 && (TYPE_READONLY (to) > TYPE_READONLY (from)
7238 || TYPE_VOLATILE (to) > TYPE_READONLY (from)))
7240 constp &= TYPE_READONLY (to);
7243 if (TREE_CODE (to) != POINTER_TYPE)
7244 return comptypes (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from), 1);
7248 /* When comparing, say, char ** to char const **, this function takes the
7249 'char *' and 'char const *'. Do not pass non-pointer types to this
7252 comp_ptr_ttypes (to, from)
7255 return comp_ptr_ttypes_real (to, from, 1);