1 /* Build expressions with type checking for C++ compiler.
2 Copyright (C) 1987, 88, 89, 92-97, 1998 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). */
42 extern void compiler_error ();
44 static tree convert_for_assignment PROTO((tree, tree, char*, tree,
46 static tree pointer_int_sum PROTO((enum tree_code, tree, tree));
47 static tree rationalize_conditional_expr PROTO((enum tree_code, tree));
48 static int comp_target_parms PROTO((tree, tree, int));
49 static int comp_ptr_ttypes_real PROTO((tree, tree, int));
50 static int comp_ptr_ttypes_const PROTO((tree, tree));
51 static int comp_ptr_ttypes_reinterpret PROTO((tree, tree));
52 static int comp_array_types PROTO((int (*) (tree, tree, int), tree,
54 static tree build_ptrmemfunc1 PROTO((tree, tree, tree, tree, tree));
55 static tree common_base_type PROTO((tree, tree));
57 static tree convert_sequence PROTO((tree, tree));
59 static tree lookup_anon_field PROTO((tree, tree));
60 static tree pointer_diff PROTO((tree, tree, tree));
61 static tree qualify_type PROTO((tree, tree));
62 static tree get_delta_difference PROTO((tree, tree, int));
64 /* Return the target type of TYPE, which meas return T for:
65 T*, T&, T[], T (...), and otherwise, just T. */
71 if (TREE_CODE (type) == REFERENCE_TYPE)
72 type = TREE_TYPE (type);
73 while (TREE_CODE (type) == POINTER_TYPE
74 || TREE_CODE (type) == ARRAY_TYPE
75 || TREE_CODE (type) == FUNCTION_TYPE
76 || TREE_CODE (type) == METHOD_TYPE
77 || TREE_CODE (type) == OFFSET_TYPE)
78 type = TREE_TYPE (type);
82 /* Do `exp = require_complete_type (exp);' to make sure exp
83 does not have an incomplete type. (That includes void types.)
84 Returns the error_mark_node if the VALUE does not have
85 complete type when this function returns. */
88 require_complete_type (value)
93 if (processing_template_decl)
96 if (TREE_CODE (value) == OVERLOAD)
97 type = unknown_type_node;
99 type = TREE_TYPE (value);
101 /* First, detect a valid value with a complete type. */
102 if (TYPE_SIZE (type) != 0
103 && type != void_type_node
104 && ! (TYPE_LANG_SPECIFIC (type)
105 && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type))
106 && TYPE_SIZE (SIGNATURE_TYPE (type)) == 0))
109 /* If we see X::Y, we build an OFFSET_TYPE which has
110 not been laid out. Try to avoid an error by interpreting
111 it as this->X::Y, if reasonable. */
112 if (TREE_CODE (value) == OFFSET_REF
113 && current_class_ref != 0
114 && TREE_OPERAND (value, 0) == current_class_ref)
116 tree base, member = TREE_OPERAND (value, 1);
117 tree basetype = TYPE_OFFSET_BASETYPE (type);
118 my_friendly_assert (TREE_CODE (member) == FIELD_DECL, 305);
119 base = convert_pointer_to (basetype, current_class_ptr);
120 value = build (COMPONENT_REF, TREE_TYPE (member),
121 build_indirect_ref (base, NULL_PTR), member);
122 return require_complete_type (value);
125 if (complete_type_or_else (type))
128 return error_mark_node;
131 /* Try to complete TYPE, if it is incomplete. For example, if TYPE is
132 a template instantiation, do the instantiation. Returns TYPE,
133 whether or not it could be completed, unless something goes
134 horribly wrong, in which case the error_mark_node is returned. */
140 if (type == NULL_TREE)
141 /* Rather than crash, we return something sure to cause an error
143 return error_mark_node;
145 if (type == error_mark_node || TYPE_SIZE (type) != NULL_TREE)
147 else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
149 tree t = complete_type (TREE_TYPE (type));
150 if (TYPE_SIZE (t) != NULL_TREE && ! processing_template_decl)
152 TYPE_NEEDS_CONSTRUCTING (type)
153 = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (t));
154 TYPE_NEEDS_DESTRUCTOR (type)
155 = TYPE_NEEDS_DESTRUCTOR (TYPE_MAIN_VARIANT (t));
157 else if (IS_AGGR_TYPE (type) && CLASSTYPE_TEMPLATE_INSTANTIATION (type))
158 instantiate_class_template (TYPE_MAIN_VARIANT (type));
163 /* Like complete_type, but issue an error if the TYPE cannot be
164 completed. Returns NULL_TREE if the type cannot be made
168 complete_type_or_else (type)
171 type = complete_type (type);
172 if (type == error_mark_node)
173 /* We already issued an error. */
175 else if (!TYPE_SIZE (type))
177 incomplete_type_error (NULL_TREE, type);
184 /* Return truthvalue of whether type of EXP is instantiated. */
190 return (TREE_CODE (exp) == OVERLOAD
191 || TREE_CODE (exp) == TREE_LIST
192 || TREE_TYPE (exp) == unknown_type_node
193 || (TREE_CODE (TREE_TYPE (exp)) == OFFSET_TYPE
194 && TREE_TYPE (TREE_TYPE (exp)) == unknown_type_node));
197 /* Return truthvalue of whether T is function (or pfn) type. */
203 return (TREE_CODE (t) == FUNCTION_TYPE || TREE_CODE (t) == METHOD_TYPE
204 || (TREE_CODE (t) == POINTER_TYPE
205 && (TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE
206 || TREE_CODE (TREE_TYPE (t)) == METHOD_TYPE)));
209 /* Return a variant of TYPE which has all the type qualifiers of LIKE
210 as well as those of TYPE. */
213 qualify_type (type, like)
216 /* @@ Must do member pointers here. */
217 return cp_build_qualified_type (type, (CP_TYPE_QUALS (type)
218 | CP_TYPE_QUALS (like)));
221 /* Return the common type of two parameter lists.
222 We assume that comptypes has already been done and returned 1;
223 if that isn't so, this may crash.
225 As an optimization, free the space we allocate if the parameter
226 lists are already common. */
232 tree oldargs = p1, newargs, n;
235 char *first_obj = (char *) oballoc (0);
237 len = list_length (p1);
238 newargs = tree_last (p1);
240 if (newargs == void_list_node)
249 newargs = tree_cons (NULL_TREE, NULL_TREE, newargs);
254 p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n), i++)
256 if (TREE_PURPOSE (p1) && !TREE_PURPOSE (p2))
258 TREE_PURPOSE (n) = TREE_PURPOSE (p1);
261 else if (! TREE_PURPOSE (p1))
263 if (TREE_PURPOSE (p2))
265 TREE_PURPOSE (n) = TREE_PURPOSE (p2);
271 if (1 != simple_cst_equal (TREE_PURPOSE (p1), TREE_PURPOSE (p2)))
273 TREE_PURPOSE (n) = TREE_PURPOSE (p2);
275 if (TREE_VALUE (p1) != TREE_VALUE (p2))
278 TREE_VALUE (n) = common_type (TREE_VALUE (p1), TREE_VALUE (p2));
281 TREE_VALUE (n) = TREE_VALUE (p1);
292 /* Given a type, perhaps copied for a typedef,
293 find the "original" version of it. */
298 while (TYPE_NAME (t) != NULL_TREE)
300 tree x = TYPE_NAME (t);
301 if (TREE_CODE (x) != TYPE_DECL)
303 x = DECL_ORIGINAL_TYPE (x);
311 /* Return the common type of two types.
312 We assume that comptypes has already been done and returned 1;
313 if that isn't so, this may crash.
315 This is the type for the result of most arithmetic operations
316 if the operands have the given two types.
318 We do not deal with enumeral types here because they have already been
319 converted to integer types. */
325 register enum tree_code code1;
326 register enum tree_code code2;
329 /* Save time if the two types are the same. */
332 t1 = original_type (t1);
333 t2 = original_type (t2);
337 /* If one type is nonsense, use the other. */
338 if (t1 == error_mark_node)
340 if (t2 == error_mark_node)
343 /* Merge the attributes. */
344 attributes = merge_machine_type_attributes (t1, t2);
346 { register tree a1, a2;
347 a1 = TYPE_ATTRIBUTES (t1);
348 a2 = TYPE_ATTRIBUTES (t2);
350 /* Either one unset? Take the set one. */
352 if (!(attributes = a1))
355 /* One that completely contains the other? Take it. */
357 else if (a2 && !attribute_list_contained (a1, a2))
359 if (attribute_list_contained (a2, a1))
363 /* Pick the longest list, and hang on the other list. */
364 /* ??? For the moment we punt on the issue of attrs with args. */
366 if (list_length (a1) < list_length (a2))
367 attributes = a2, a2 = a1;
369 for (; a2; a2 = TREE_CHAIN (a2))
370 if (lookup_attribute (IDENTIFIER_POINTER (TREE_PURPOSE (a2)),
371 attributes) == NULL_TREE)
374 TREE_CHAIN (a1) = attributes;
381 /* Treat an enum type as the unsigned integer type of the same width. */
383 if (TREE_CODE (t1) == ENUMERAL_TYPE)
384 t1 = type_for_size (TYPE_PRECISION (t1), 1);
385 if (TREE_CODE (t2) == ENUMERAL_TYPE)
386 t2 = type_for_size (TYPE_PRECISION (t2), 1);
388 if (TYPE_PTRMEMFUNC_P (t1))
389 t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
390 if (TYPE_PTRMEMFUNC_P (t2))
391 t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
393 code1 = TREE_CODE (t1);
394 code2 = TREE_CODE (t2);
396 /* If one type is complex, form the common type of the non-complex
397 components, then make that complex. Use T1 or T2 if it is the
399 if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE)
401 tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1;
402 tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2;
403 tree subtype = common_type (subtype1, subtype2);
405 if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype)
406 return build_type_attribute_variant (t1, attributes);
407 else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
408 return build_type_attribute_variant (t2, attributes);
410 return build_type_attribute_variant (build_complex_type (subtype),
418 /* If only one is real, use it as the result. */
420 if (code1 == REAL_TYPE && code2 != REAL_TYPE)
421 return build_type_attribute_variant (t1, attributes);
423 if (code2 == REAL_TYPE && code1 != REAL_TYPE)
424 return build_type_attribute_variant (t2, attributes);
426 /* Both real or both integers; use the one with greater precision. */
428 if (TYPE_PRECISION (t1) > TYPE_PRECISION (t2))
429 return build_type_attribute_variant (t1, attributes);
430 else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
431 return build_type_attribute_variant (t2, attributes);
433 /* Same precision. Prefer longs to ints even when same size. */
435 if (TYPE_MAIN_VARIANT (t1) == long_unsigned_type_node
436 || TYPE_MAIN_VARIANT (t2) == long_unsigned_type_node)
437 return build_type_attribute_variant (long_unsigned_type_node,
440 if (TYPE_MAIN_VARIANT (t1) == long_integer_type_node
441 || TYPE_MAIN_VARIANT (t2) == long_integer_type_node)
443 /* But preserve unsignedness from the other type,
444 since long cannot hold all the values of an unsigned int. */
445 if (TREE_UNSIGNED (t1) || TREE_UNSIGNED (t2))
446 t1 = long_unsigned_type_node;
448 t1 = long_integer_type_node;
449 return build_type_attribute_variant (t1, attributes);
452 if (TYPE_MAIN_VARIANT (t1) == long_double_type_node
453 || TYPE_MAIN_VARIANT (t2) == long_double_type_node)
454 return build_type_attribute_variant (long_double_type_node,
457 /* Otherwise prefer the unsigned one. */
459 if (TREE_UNSIGNED (t1))
460 return build_type_attribute_variant (t1, attributes);
462 return build_type_attribute_variant (t2, attributes);
466 /* For two pointers, do this recursively on the target type,
467 and combine the qualifiers of the two types' targets. */
468 /* This code was turned off; I don't know why.
469 But ANSI C++ specifies doing this with the qualifiers.
470 So I turned it on again. */
472 tree tt1 = TYPE_MAIN_VARIANT (TREE_TYPE (t1));
473 tree tt2 = TYPE_MAIN_VARIANT (TREE_TYPE (t2));
474 int type_quals = (CP_TYPE_QUALS (TREE_TYPE (t1))
475 | CP_TYPE_QUALS (TREE_TYPE (t2)));
480 else if (tt1 == void_type_node || tt2 == void_type_node)
481 target = void_type_node;
482 else if (tt1 == unknown_type_node)
484 else if (tt2 == unknown_type_node)
487 target = common_type (tt1, tt2);
489 target = cp_build_qualified_type (target, type_quals);
490 if (code1 == POINTER_TYPE)
491 t1 = build_pointer_type (target);
493 t1 = build_reference_type (target);
494 t1 = build_type_attribute_variant (t1, attributes);
496 if (TREE_CODE (target) == METHOD_TYPE)
497 t1 = build_ptrmemfunc_type (t1);
504 tree elt = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
505 /* Save space: see if the result is identical to one of the args. */
506 if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1))
507 return build_type_attribute_variant (t1, attributes);
508 if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2))
509 return build_type_attribute_variant (t2, attributes);
510 /* Merge the element types, and have a size if either arg has one. */
511 t1 = build_cplus_array_type
512 (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
513 return build_type_attribute_variant (t1, attributes);
517 /* Function types: prefer the one that specified arg types.
518 If both do, merge the arg types. Also merge the return types. */
520 tree valtype = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
521 tree p1 = TYPE_ARG_TYPES (t1);
522 tree p2 = TYPE_ARG_TYPES (t2);
525 /* Save space: see if the result is identical to one of the args. */
526 if (valtype == TREE_TYPE (t1) && ! p2)
527 return build_type_attribute_variant (t1, attributes);
528 if (valtype == TREE_TYPE (t2) && ! p1)
529 return build_type_attribute_variant (t2, attributes);
531 /* Simple way if one arg fails to specify argument types. */
532 if (p1 == NULL_TREE || TREE_VALUE (p1) == void_type_node)
534 rval = build_function_type (valtype, p2);
535 if ((raises = TYPE_RAISES_EXCEPTIONS (t2)))
536 rval = build_exception_variant (rval, raises);
537 return build_type_attribute_variant (rval, attributes);
539 raises = TYPE_RAISES_EXCEPTIONS (t1);
540 if (p2 == NULL_TREE || TREE_VALUE (p2) == void_type_node)
542 rval = build_function_type (valtype, p1);
544 rval = build_exception_variant (rval, raises);
545 return build_type_attribute_variant (rval, attributes);
548 rval = build_function_type (valtype, commonparms (p1, p2));
549 rval = build_exception_variant (rval, raises);
550 return build_type_attribute_variant (rval, attributes);
555 t1 = TYPE_MAIN_VARIANT (t1);
556 t2 = TYPE_MAIN_VARIANT (t2);
558 if (DERIVED_FROM_P (t1, t2) && binfo_or_else (t1, t2))
559 return build_type_attribute_variant (t1, attributes);
560 else if (binfo_or_else (t2, t1))
561 return build_type_attribute_variant (t2, attributes);
564 compiler_error ("common_type called with uncommon aggregate types");
565 return error_mark_node;
569 if (TREE_CODE (TREE_TYPE (t1)) == TREE_CODE (TREE_TYPE (t2)))
571 /* Get this value the long way, since TYPE_METHOD_BASETYPE
572 is just the main variant of this. */
576 tree b1 = TYPE_OFFSET_BASETYPE (t1);
577 tree b2 = TYPE_OFFSET_BASETYPE (t2);
579 if (same_type_p (b1, b2)
580 || (DERIVED_FROM_P (b1, b2) && binfo_or_else (b1, b2)))
581 basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t2)));
584 if (binfo_or_else (b2, b1) == NULL_TREE)
585 compiler_error ("common_type called with uncommon method types");
586 basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t1)));
589 raises = TYPE_RAISES_EXCEPTIONS (t1);
591 /* If this was a member function type, get back to the
592 original type of type member function (i.e., without
593 the class instance variable up front. */
594 t1 = build_function_type (TREE_TYPE (t1),
595 TREE_CHAIN (TYPE_ARG_TYPES (t1)));
596 t2 = build_function_type (TREE_TYPE (t2),
597 TREE_CHAIN (TYPE_ARG_TYPES (t2)));
598 t3 = common_type (t1, t2);
599 t3 = build_cplus_method_type (basetype, TREE_TYPE (t3),
600 TYPE_ARG_TYPES (t3));
601 t1 = build_exception_variant (t3, raises);
604 compiler_error ("common_type called with uncommon method types");
606 return build_type_attribute_variant (t1, attributes);
609 if (TREE_TYPE (t1) == TREE_TYPE (t2))
611 tree b1 = TYPE_OFFSET_BASETYPE (t1);
612 tree b2 = TYPE_OFFSET_BASETYPE (t2);
614 if (same_type_p (b1, b2)
615 || (DERIVED_FROM_P (b1, b2) && binfo_or_else (b1, b2)))
616 return build_type_attribute_variant (t2, attributes);
617 else if (binfo_or_else (b2, b1))
618 return build_type_attribute_variant (t1, attributes);
620 compiler_error ("common_type called with uncommon member types");
623 return build_type_attribute_variant (t1, attributes);
627 /* Return 1 if TYPE1 and TYPE2 raise the same exceptions. */
630 compexcepttypes (t1, t2)
633 return TYPE_RAISES_EXCEPTIONS (t1) == TYPE_RAISES_EXCEPTIONS (t2);
636 /* Compare the array types T1 and T2, using CMP as the type comparison
637 function for the element types. STRICT is as for comptypes. */
640 comp_array_types (cmp, t1, t2, strict)
641 register int (*cmp) PROTO((tree, tree, int));
651 /* The type of the array elements must be the same. */
652 if (!(TREE_TYPE (t1) == TREE_TYPE (t2)
653 || (*cmp) (TREE_TYPE (t1), TREE_TYPE (t2),
654 strict & ~COMPARE_REDECLARATION)))
657 d1 = TYPE_DOMAIN (t1);
658 d2 = TYPE_DOMAIN (t2);
663 /* If one of the arrays is dimensionless, and the other has a
664 dimension, they are of different types. However, it is legal to
672 declarations for an array object can specify
673 array types that differ by the presence or absence of a major
674 array bound (_dcl.array_). */
676 return strict & COMPARE_REDECLARATION;
678 /* Check that the dimensions are the same. */
679 return (cp_tree_equal (TYPE_MIN_VALUE (d1),
681 && cp_tree_equal (TYPE_MAX_VALUE (d1),
682 TYPE_MAX_VALUE (d2)));
685 /* Return 1 if TYPE1 and TYPE2 are compatible types for assignment
686 or various other operations. STRICT is a bitwise-or of the
690 comptypes (type1, type2, strict)
694 register tree t1 = type1;
695 register tree t2 = type2;
697 int orig_strict = strict;
699 /* The special exemption for redeclaring array types without an
700 array bound only applies at the top level:
705 is not legal, for example. */
706 strict &= ~COMPARE_REDECLARATION;
708 /* Suppress errors caused by previously reported errors */
712 /* This should never happen. */
713 my_friendly_assert (t1 != error_mark_node, 307);
715 if (t2 == error_mark_node)
718 if (strict & COMPARE_RELAXED)
720 /* Treat an enum type as the unsigned integer type of the same width. */
722 if (TREE_CODE (t1) == ENUMERAL_TYPE)
723 t1 = type_for_size (TYPE_PRECISION (t1), 1);
724 if (TREE_CODE (t2) == ENUMERAL_TYPE)
725 t2 = type_for_size (TYPE_PRECISION (t2), 1);
731 if (TYPE_PTRMEMFUNC_P (t1))
732 t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
733 if (TYPE_PTRMEMFUNC_P (t2))
734 t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
736 /* Different classes of types can't be compatible. */
737 if (TREE_CODE (t1) != TREE_CODE (t2))
740 /* Qualifiers must match. */
741 if (CP_TYPE_QUALS (t1) != CP_TYPE_QUALS (t2))
743 if (strict == COMPARE_STRICT
744 && TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2))
747 /* Allow for two different type nodes which have essentially the same
748 definition. Note that we already checked for equality of the type
749 qualifiers (just above). */
751 if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
754 /* ??? COMP_TYPE_ATTRIBUTES is currently useless for variables as each
755 attribute is its own main variant (`val' will remain 0). */
756 #ifndef COMP_TYPE_ATTRIBUTES
757 #define COMP_TYPE_ATTRIBUTES(t1,t2) 1
760 /* 1 if no need for warning yet, 2 if warning cause has been seen. */
761 if (! (attrval = COMP_TYPE_ATTRIBUTES (t1, t2)))
764 /* 1 if no need for warning yet, 2 if warning cause has been seen. */
767 switch (TREE_CODE (t1))
769 case TEMPLATE_TEMPLATE_PARM:
770 if (TEMPLATE_TYPE_IDX (t1) != TEMPLATE_TYPE_IDX (t2)
771 || TEMPLATE_TYPE_LEVEL (t1) != TEMPLATE_TYPE_LEVEL (t2))
773 if (! comp_template_parms (DECL_TEMPLATE_PARMS (TYPE_NAME (t1)),
774 DECL_TEMPLATE_PARMS (TYPE_NAME (t2))))
776 if (! CLASSTYPE_TEMPLATE_INFO (t1) && ! CLASSTYPE_TEMPLATE_INFO (t2))
778 /* Don't check inheritance. */
779 strict = COMPARE_STRICT;
784 if (CLASSTYPE_TEMPLATE_INFO (t1) && CLASSTYPE_TEMPLATE_INFO (t2)
785 && (CLASSTYPE_TI_TEMPLATE (t1) == CLASSTYPE_TI_TEMPLATE (t2)
786 || TREE_CODE (t1) == TEMPLATE_TEMPLATE_PARM))
787 val = comp_template_args (CLASSTYPE_TI_ARGS (t1),
788 CLASSTYPE_TI_ARGS (t2));
790 if ((strict & COMPARE_BASE) && DERIVED_FROM_P (t1, t2))
795 if ((strict & COMPARE_RELAXED) && DERIVED_FROM_P (t2, t1))
803 val = (comptypes (build_pointer_type (TYPE_OFFSET_BASETYPE (t1)),
804 build_pointer_type (TYPE_OFFSET_BASETYPE (t2)), strict)
805 && comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict));
809 if (! compexcepttypes (t1, t2))
812 /* This case is anti-symmetrical!
813 One can pass a base member (or member function)
814 to something expecting a derived member (or member function),
815 but not vice-versa! */
817 val = (comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict)
818 && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)));
825 /* first, check whether the referred types match with the
826 required level of strictness */
827 val = comptypes (t1, t2, strict);
830 if (TREE_CODE (t1) == RECORD_TYPE
831 && TREE_CODE (t2) == RECORD_TYPE)
836 if (! compexcepttypes (t1, t2))
839 val = ((TREE_TYPE (t1) == TREE_TYPE (t2)
840 || comptypes (TREE_TYPE (t1), TREE_TYPE (t2), strict))
841 && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)));
845 /* Target types must match incl. qualifiers. We use ORIG_STRICT
846 here since this is the one place where
847 COMPARE_REDECLARATION should be used. */
848 val = comp_array_types (comptypes, t1, t2, orig_strict);
851 case TEMPLATE_TYPE_PARM:
852 return TEMPLATE_TYPE_IDX (t1) == TEMPLATE_TYPE_IDX (t2)
853 && TEMPLATE_TYPE_LEVEL (t1) == TEMPLATE_TYPE_LEVEL (t2);
856 if (TYPE_IDENTIFIER (t1) != TYPE_IDENTIFIER (t2))
858 return same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2));
863 return attrval == 2 && val == 1 ? 2 : val;
866 /* Subroutine of comp_target-types. Make sure that the cv-quals change
867 only in the same direction as the target type. */
870 comp_cv_target_types (ttl, ttr, nptrs)
876 if (!at_least_as_qualified_p (ttl, ttr)
877 && !at_least_as_qualified_p (ttr, ttl))
878 /* The qualifications are incomparable. */
881 if (TYPE_MAIN_VARIANT (ttl) == TYPE_MAIN_VARIANT (ttr))
882 return more_qualified_p (ttr, ttl) ? -1 : 1;
884 t = comp_target_types (ttl, ttr, nptrs);
885 if ((t == 1 && at_least_as_qualified_p (ttl, ttr))
886 || (t == -1 && at_least_as_qualified_p (ttr, ttl)))
892 /* Return 1 or -1 if TTL and TTR are pointers to types that are equivalent,
893 ignoring their qualifiers, 0 if not. Return 1 means that TTR can be
894 converted to TTL. Return -1 means that TTL can be converted to TTR but
897 NPTRS is the number of pointers we can strip off and keep cool.
898 This is used to permit (for aggr A, aggr B) A, B* to convert to A*,
899 but to not permit B** to convert to A**.
901 This should go away. Callers should use can_convert or something
902 similar instead. (jason 17 Apr 1997) */
905 comp_target_types (ttl, ttr, nptrs)
909 ttl = TYPE_MAIN_VARIANT (ttl);
910 ttr = TYPE_MAIN_VARIANT (ttr);
914 if (TREE_CODE (ttr) != TREE_CODE (ttl))
917 if ((TREE_CODE (ttr) == POINTER_TYPE
918 || TREE_CODE (ttr) == REFERENCE_TYPE)
919 /* If we get a pointer with nptrs == 0, we don't allow any tweaking
920 of the type pointed to. This is necessary for reference init
921 semantics. We won't get here from a previous call with nptrs == 1;
922 for multi-level pointers we end up in comp_ptr_ttypes. */
925 int is_ptr = TREE_CODE (ttr) == POINTER_TYPE;
927 ttl = TREE_TYPE (ttl);
928 ttr = TREE_TYPE (ttr);
932 if (TREE_CODE (ttl) == UNKNOWN_TYPE
933 || TREE_CODE (ttr) == UNKNOWN_TYPE)
935 else if (TREE_CODE (ttl) == VOID_TYPE
936 && TREE_CODE (ttr) != FUNCTION_TYPE
937 && TREE_CODE (ttr) != METHOD_TYPE
938 && TREE_CODE (ttr) != OFFSET_TYPE)
940 else if (TREE_CODE (ttr) == VOID_TYPE
941 && TREE_CODE (ttl) != FUNCTION_TYPE
942 && TREE_CODE (ttl) != METHOD_TYPE
943 && TREE_CODE (ttl) != OFFSET_TYPE)
945 else if (TREE_CODE (ttl) == POINTER_TYPE
946 || TREE_CODE (ttl) == ARRAY_TYPE)
948 if (comp_ptr_ttypes (ttl, ttr))
950 else if (comp_ptr_ttypes (ttr, ttl))
956 /* Const and volatile mean something different for function types,
957 so the usual checks are not appropriate. */
958 if (TREE_CODE (ttl) == FUNCTION_TYPE || TREE_CODE (ttl) == METHOD_TYPE)
959 return comp_target_types (ttl, ttr, nptrs - 1);
961 return comp_cv_target_types (ttl, ttr, nptrs - 1);
964 if (TREE_CODE (ttr) == ARRAY_TYPE)
965 return comp_array_types (comp_target_types, ttl, ttr, COMPARE_STRICT);
966 else if (TREE_CODE (ttr) == FUNCTION_TYPE || TREE_CODE (ttr) == METHOD_TYPE)
973 if (!same_type_p (TREE_TYPE (ttl), TREE_TYPE (ttr)))
978 switch (comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), -1))
987 argsl = TYPE_ARG_TYPES (ttl);
988 argsr = TYPE_ARG_TYPES (ttr);
990 /* Compare 'this' here, not in comp_target_parms. */
991 if (TREE_CODE (ttr) == METHOD_TYPE)
993 tree tl = TYPE_METHOD_BASETYPE (ttl);
994 tree tr = TYPE_METHOD_BASETYPE (ttr);
996 if (!same_or_base_type_p (tr, tl))
998 if (same_or_base_type_p (tl, tr))
1004 argsl = TREE_CHAIN (argsl);
1005 argsr = TREE_CHAIN (argsr);
1008 switch (comp_target_parms (argsl, argsr, 1))
1016 return saw_contra ? -1 : 1;
1019 else if (TREE_CODE (ttr) == OFFSET_TYPE)
1023 /* Contravariance: we can assign a pointer to base member to a pointer
1024 to derived member. Note difference from simple pointer case, where
1025 we can pass a pointer to derived to a pointer to base. */
1026 if (same_or_base_type_p (TYPE_OFFSET_BASETYPE (ttr),
1027 TYPE_OFFSET_BASETYPE (ttl)))
1029 else if (same_or_base_type_p (TYPE_OFFSET_BASETYPE (ttl),
1030 TYPE_OFFSET_BASETYPE (ttr)))
1040 ttl = TREE_TYPE (ttl);
1041 ttr = TREE_TYPE (ttr);
1043 if (TREE_CODE (ttl) == POINTER_TYPE
1044 || TREE_CODE (ttl) == ARRAY_TYPE)
1046 if (comp_ptr_ttypes (ttl, ttr))
1052 if (comp_cv_target_types (ttl, ttr, nptrs) == 1)
1057 else if (IS_AGGR_TYPE (ttl))
1061 if (same_or_base_type_p (build_pointer_type (ttl),
1062 build_pointer_type (ttr)))
1064 if (same_or_base_type_p (build_pointer_type (ttr),
1065 build_pointer_type (ttl)))
1073 /* Returns 1 if TYPE1 is at least as qualified as TYPE2. */
1076 at_least_as_qualified_p (type1, type2)
1080 /* All qualifiers for TYPE2 must also appear in TYPE1. */
1081 return ((CP_TYPE_QUALS (type1) & CP_TYPE_QUALS (type2))
1082 == CP_TYPE_QUALS (type2));
1085 /* Returns 1 if TYPE1 is more qualified than TYPE2. */
1088 more_qualified_p (type1, type2)
1092 return (CP_TYPE_QUALS (type1) != CP_TYPE_QUALS (type2)
1093 && at_least_as_qualified_p (type1, type2));
1096 /* Returns 1 if TYPE1 is more cv-qualified than TYPE2, -1 if TYPE2 is
1097 more cv-qualified that TYPE1, and 0 otherwise. */
1100 comp_cv_qualification (type1, type2)
1104 if (CP_TYPE_QUALS (type1) == CP_TYPE_QUALS (type2))
1107 if (at_least_as_qualified_p (type1, type2))
1110 else if (at_least_as_qualified_p (type2, type1))
1116 /* Returns 1 if the cv-qualification signature of TYPE1 is a proper
1117 subset of the cv-qualification signature of TYPE2, and the types
1118 are similar. Returns -1 if the other way 'round, and 0 otherwise. */
1121 comp_cv_qual_signature (type1, type2)
1125 if (comp_ptr_ttypes_real (type2, type1, -1))
1127 else if (comp_ptr_ttypes_real (type1, type2, -1))
1133 /* If two types share a common base type, return that basetype.
1134 If there is not a unique most-derived base type, this function
1135 returns ERROR_MARK_NODE. */
1138 common_base_type (tt1, tt2)
1141 tree best = NULL_TREE;
1144 /* If one is a baseclass of another, that's good enough. */
1145 if (UNIQUELY_DERIVED_FROM_P (tt1, tt2))
1147 if (UNIQUELY_DERIVED_FROM_P (tt2, tt1))
1150 /* Otherwise, try to find a unique baseclass of TT1
1151 that is shared by TT2, and follow that down. */
1152 for (i = CLASSTYPE_N_BASECLASSES (tt1)-1; i >= 0; i--)
1154 tree basetype = TYPE_BINFO_BASETYPE (tt1, i);
1155 tree trial = common_base_type (basetype, tt2);
1158 if (trial == error_mark_node)
1160 if (best == NULL_TREE)
1162 else if (best != trial)
1163 return error_mark_node;
1168 for (i = CLASSTYPE_N_BASECLASSES (tt2)-1; i >= 0; i--)
1170 tree basetype = TYPE_BINFO_BASETYPE (tt2, i);
1171 tree trial = common_base_type (tt1, basetype);
1174 if (trial == error_mark_node)
1176 if (best == NULL_TREE)
1178 else if (best != trial)
1179 return error_mark_node;
1185 /* Subroutines of `comptypes'. */
1187 /* Return 1 if two parameter type lists PARMS1 and PARMS2
1188 are equivalent in the sense that functions with those parameter types
1189 can have equivalent types.
1190 If either list is empty, we win.
1191 Otherwise, the two lists must be equivalent, element by element.
1193 C++: See comment above about TYPE1, TYPE2.
1195 STRICT is no longer used. */
1198 compparms (parms1, parms2)
1199 tree parms1, parms2;
1201 register tree t1 = parms1, t2 = parms2;
1203 /* An unspecified parmlist matches any specified parmlist
1204 whose argument types don't need default promotions. */
1208 if (t1 == 0 && t2 == 0)
1210 /* If one parmlist is shorter than the other,
1211 they fail to match. */
1212 if (t1 == 0 || t2 == 0)
1214 if (!same_type_p (TREE_VALUE (t2), TREE_VALUE (t1)))
1217 t1 = TREE_CHAIN (t1);
1218 t2 = TREE_CHAIN (t2);
1222 /* This really wants return whether or not parameter type lists
1223 would make their owning functions assignment compatible or not.
1225 The return value is like for comp_target_types.
1227 This should go away, possibly with the exception of the empty parmlist
1228 conversion; there are no conversions between function types in C++.
1229 (jason 17 Apr 1997) */
1232 comp_target_parms (parms1, parms2, strict)
1233 tree parms1, parms2;
1236 register tree t1 = parms1, t2 = parms2;
1237 int warn_contravariance = 0;
1239 /* In C, an unspecified parmlist matches any specified parmlist
1240 whose argument types don't need default promotions. This is not
1241 true for C++, but let's do it anyway for unfixed headers. */
1243 if (t1 == 0 && t2 != 0)
1245 cp_pedwarn ("ANSI C++ prohibits conversion from `(%#T)' to `(...)'",
1247 return self_promoting_args_p (t2);
1250 return self_promoting_args_p (t1);
1252 for (; t1 || t2; t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1256 /* If one parmlist is shorter than the other,
1257 they fail to match, unless STRICT is <= 0. */
1258 if (t1 == 0 || t2 == 0)
1263 return 1 + warn_contravariance;
1264 return ((t1 && TREE_PURPOSE (t1)) + warn_contravariance);
1266 p1 = TREE_VALUE (t1);
1267 p2 = TREE_VALUE (t2);
1268 if (same_type_p (p1, p2))
1274 if ((TREE_CODE (p1) == POINTER_TYPE && TREE_CODE (p2) == POINTER_TYPE)
1275 || (TREE_CODE (p1) == REFERENCE_TYPE
1276 && TREE_CODE (p2) == REFERENCE_TYPE))
1279 && (TYPE_MAIN_VARIANT (TREE_TYPE (p1))
1280 == TYPE_MAIN_VARIANT (TREE_TYPE (p2))))
1283 /* The following is wrong for contravariance,
1284 but many programs depend on it. */
1285 if (TREE_TYPE (p1) == void_type_node)
1287 if (TREE_TYPE (p2) == void_type_node)
1289 warn_contravariance = 1;
1292 if (IS_AGGR_TYPE (TREE_TYPE (p1))
1293 && !same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (p1)),
1294 TYPE_MAIN_VARIANT (TREE_TYPE (p2))))
1297 /* Note backwards order due to contravariance. */
1298 if (comp_target_types (p2, p1, 1) <= 0)
1300 if (comp_target_types (p1, p2, 1) > 0)
1302 warn_contravariance = 1;
1309 return warn_contravariance ? -1 : 1;
1312 /* Return 1 if PARMS specifies a fixed number of parameters
1313 and none of their types is affected by default promotions. */
1316 self_promoting_args_p (parms)
1320 for (t = parms; t; t = TREE_CHAIN (t))
1322 register tree type = TREE_VALUE (t);
1324 if (TREE_CHAIN (t) == 0 && type != void_type_node)
1330 if (TYPE_MAIN_VARIANT (type) == float_type_node)
1333 if (C_PROMOTING_INTEGER_TYPE_P (type))
1339 /* Return an unsigned type the same as TYPE in other respects.
1341 C++: must make these work for type variants as well. */
1344 unsigned_type (type)
1347 tree type1 = TYPE_MAIN_VARIANT (type);
1348 if (type1 == signed_char_type_node || type1 == char_type_node)
1349 return unsigned_char_type_node;
1350 if (type1 == integer_type_node)
1351 return unsigned_type_node;
1352 if (type1 == short_integer_type_node)
1353 return short_unsigned_type_node;
1354 if (type1 == long_integer_type_node)
1355 return long_unsigned_type_node;
1356 if (type1 == long_long_integer_type_node)
1357 return long_long_unsigned_type_node;
1358 #if HOST_BITS_PER_WIDE_INT >= 64
1359 if (type1 == intTI_type_node)
1360 return unsigned_intTI_type_node;
1362 if (type1 == intDI_type_node)
1363 return unsigned_intDI_type_node;
1364 if (type1 == intSI_type_node)
1365 return unsigned_intSI_type_node;
1366 if (type1 == intHI_type_node)
1367 return unsigned_intHI_type_node;
1368 if (type1 == intQI_type_node)
1369 return unsigned_intQI_type_node;
1371 return signed_or_unsigned_type (1, type);
1374 /* Return a signed type the same as TYPE in other respects. */
1380 tree type1 = TYPE_MAIN_VARIANT (type);
1381 if (type1 == unsigned_char_type_node || type1 == char_type_node)
1382 return signed_char_type_node;
1383 if (type1 == unsigned_type_node)
1384 return integer_type_node;
1385 if (type1 == short_unsigned_type_node)
1386 return short_integer_type_node;
1387 if (type1 == long_unsigned_type_node)
1388 return long_integer_type_node;
1389 if (type1 == long_long_unsigned_type_node)
1390 return long_long_integer_type_node;
1391 #if HOST_BITS_PER_WIDE_INT >= 64
1392 if (type1 == unsigned_intTI_type_node)
1393 return intTI_type_node;
1395 if (type1 == unsigned_intDI_type_node)
1396 return intDI_type_node;
1397 if (type1 == unsigned_intSI_type_node)
1398 return intSI_type_node;
1399 if (type1 == unsigned_intHI_type_node)
1400 return intHI_type_node;
1401 if (type1 == unsigned_intQI_type_node)
1402 return intQI_type_node;
1404 return signed_or_unsigned_type (0, type);
1407 /* Return a type the same as TYPE except unsigned or
1408 signed according to UNSIGNEDP. */
1411 signed_or_unsigned_type (unsignedp, type)
1415 if (! INTEGRAL_TYPE_P (type)
1416 || TREE_UNSIGNED (type) == unsignedp)
1419 if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
1420 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1421 if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
1422 return unsignedp ? unsigned_type_node : integer_type_node;
1423 if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node))
1424 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1425 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node))
1426 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1427 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node))
1428 return (unsignedp ? long_long_unsigned_type_node
1429 : long_long_integer_type_node);
1433 /* Compute the value of the `sizeof' operator. */
1439 enum tree_code code = TREE_CODE (type);
1442 if (processing_template_decl)
1443 return build_min (SIZEOF_EXPR, sizetype, type);
1445 if (code == FUNCTION_TYPE)
1447 if (pedantic || warn_pointer_arith)
1448 pedwarn ("ANSI C++ forbids taking the sizeof a function type");
1449 return size_int (1);
1451 if (code == METHOD_TYPE)
1453 if (pedantic || warn_pointer_arith)
1454 pedwarn ("ANSI C++ forbids taking the sizeof a method type");
1455 return size_int (1);
1457 if (code == VOID_TYPE)
1459 if (pedantic || warn_pointer_arith)
1460 pedwarn ("ANSI C++ forbids taking the sizeof a void type");
1461 return size_int (1);
1463 if (code == ERROR_MARK)
1464 return size_int (1);
1466 /* ARM $5.3.2: ``When applied to a reference, the result is the size of the
1467 referenced object.'' */
1468 if (code == REFERENCE_TYPE)
1469 type = TREE_TYPE (type);
1471 /* We couldn't find anything in the ARM or the draft standard that says,
1472 one way or the other, if doing sizeof on something that doesn't have
1473 an object associated with it is correct or incorrect. For example, if
1474 you declare `struct S { char str[16]; };', and in your program do
1475 a `sizeof (S::str)', should we flag that as an error or should we give
1476 the size of it? Since it seems like a reasonable thing to do, we'll go
1477 with giving the value. */
1478 if (code == OFFSET_TYPE)
1479 type = TREE_TYPE (type);
1481 /* @@ This also produces an error for a signature ref.
1482 In that case we should be able to do better. */
1483 if (IS_SIGNATURE (type))
1485 error ("`sizeof' applied to a signature type");
1486 return size_int (0);
1489 if (TYPE_SIZE (complete_type (type)) == 0)
1491 cp_error ("`sizeof' applied to incomplete type `%T'", type);
1492 return size_int (0);
1495 /* Convert in case a char is more than one unit. */
1496 t = size_binop (CEIL_DIV_EXPR, TYPE_SIZE (type),
1497 size_int (TYPE_PRECISION (char_type_node)));
1498 t = convert (sizetype, t);
1499 /* size_binop does not put the constant in range, so do it now. */
1500 if (TREE_CODE (t) == INTEGER_CST && force_fit_type (t, 0))
1501 TREE_CONSTANT_OVERFLOW (t) = TREE_OVERFLOW (t) = 1;
1509 if (processing_template_decl)
1510 return build_min (SIZEOF_EXPR, sizetype, e);
1512 if (TREE_CODE (e) == COMPONENT_REF
1513 && DECL_C_BIT_FIELD (TREE_OPERAND (e, 1)))
1514 error ("sizeof applied to a bit-field");
1515 /* ANSI says arrays and functions are converted inside comma.
1516 But we can't really convert them in build_compound_expr
1517 because that would break commas in lvalues.
1518 So do the conversion here if operand was a comma. */
1519 if (TREE_CODE (e) == COMPOUND_EXPR
1520 && (TREE_CODE (TREE_TYPE (e)) == ARRAY_TYPE
1521 || TREE_CODE (TREE_TYPE (e)) == FUNCTION_TYPE))
1522 e = default_conversion (e);
1523 else if (TREE_CODE (e) == TREE_LIST)
1525 tree t = TREE_VALUE (e);
1528 && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
1529 || is_overloaded_fn (t)))
1530 pedwarn ("ANSI C++ forbids taking the sizeof a function type");
1532 return c_sizeof (TREE_TYPE (e));
1536 c_sizeof_nowarn (type)
1539 enum tree_code code = TREE_CODE (type);
1542 if (code == FUNCTION_TYPE
1543 || code == METHOD_TYPE
1544 || code == VOID_TYPE
1545 || code == ERROR_MARK)
1546 return size_int (1);
1547 if (code == REFERENCE_TYPE)
1548 type = TREE_TYPE (type);
1550 if (TYPE_SIZE (type) == 0)
1551 return size_int (0);
1553 /* Convert in case a char is more than one unit. */
1554 t = size_binop (CEIL_DIV_EXPR, TYPE_SIZE (type),
1555 size_int (TYPE_PRECISION (char_type_node)));
1556 t = convert (sizetype, t);
1557 force_fit_type (t, 0);
1561 /* Implement the __alignof keyword: Return the minimum required
1562 alignment of TYPE, measured in bytes. */
1568 enum tree_code code = TREE_CODE (type);
1571 if (processing_template_decl)
1572 return build_min (ALIGNOF_EXPR, sizetype, type);
1574 if (code == FUNCTION_TYPE || code == METHOD_TYPE)
1575 return size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1577 if (code == VOID_TYPE || code == ERROR_MARK)
1578 return size_int (1);
1580 /* C++: this is really correct! */
1581 if (code == REFERENCE_TYPE)
1582 type = TREE_TYPE (type);
1584 /* @@ This also produces an error for a signature ref.
1585 In that case we should be able to do better. */
1586 if (IS_SIGNATURE (type))
1588 error ("`__alignof' applied to a signature type");
1589 return size_int (1);
1592 t = size_int (TYPE_ALIGN (type) / BITS_PER_UNIT);
1593 force_fit_type (t, 0);
1597 /* Perform default promotions for C data used in expressions.
1598 Arrays and functions are converted to pointers;
1599 enumeral types or short or char, to int.
1600 In addition, manifest constants symbols are replaced by their values.
1602 C++: this will automatically bash references to their target type. */
1605 decay_conversion (exp)
1608 register tree type = TREE_TYPE (exp);
1609 register enum tree_code code = TREE_CODE (type);
1611 if (code == OFFSET_TYPE)
1613 if (TREE_CODE (exp) == OFFSET_REF)
1614 return decay_conversion (resolve_offset_ref (exp));
1616 type = TREE_TYPE (type);
1617 code = TREE_CODE (type);
1619 if (type == unknown_type_node)
1621 cp_pedwarn ("assuming & on overloaded member function");
1622 return build_unary_op (ADDR_EXPR, exp, 0);
1626 if (code == REFERENCE_TYPE)
1628 exp = convert_from_reference (exp);
1629 type = TREE_TYPE (exp);
1630 code = TREE_CODE (type);
1633 /* Constants can be used directly unless they're not loadable. */
1634 if (TREE_CODE (exp) == CONST_DECL)
1635 exp = DECL_INITIAL (exp);
1636 /* Replace a nonvolatile const static variable with its value. */
1637 else if (TREE_READONLY_DECL_P (exp))
1639 exp = decl_constant_value (exp);
1640 type = TREE_TYPE (exp);
1643 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
1644 Leave such NOP_EXPRs, since RHS is being used in non-lvalue context. */
1646 if (code == VOID_TYPE)
1648 error ("void value not ignored as it ought to be");
1649 return error_mark_node;
1651 if (code == METHOD_TYPE)
1653 cp_pedwarn ("assuming & on `%E'", exp);
1654 return build_unary_op (ADDR_EXPR, exp, 0);
1656 if (code == FUNCTION_TYPE || is_overloaded_fn (exp))
1658 return build_unary_op (ADDR_EXPR, exp, 0);
1660 if (code == ARRAY_TYPE)
1665 if (TREE_CODE (exp) == INDIRECT_REF)
1667 /* Stripping away the INDIRECT_REF is not the right
1668 thing to do for references... */
1669 tree inner = TREE_OPERAND (exp, 0);
1670 if (TREE_CODE (TREE_TYPE (inner)) == REFERENCE_TYPE)
1672 inner = build1 (CONVERT_EXPR,
1673 build_pointer_type (TREE_TYPE
1674 (TREE_TYPE (inner))),
1676 TREE_CONSTANT (inner) = TREE_CONSTANT (TREE_OPERAND (inner, 0));
1678 return cp_convert (build_pointer_type (TREE_TYPE (type)), inner);
1681 if (TREE_CODE (exp) == COMPOUND_EXPR)
1683 tree op1 = decay_conversion (TREE_OPERAND (exp, 1));
1684 return build (COMPOUND_EXPR, TREE_TYPE (op1),
1685 TREE_OPERAND (exp, 0), op1);
1689 && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp)))
1691 error ("invalid use of non-lvalue array");
1692 return error_mark_node;
1695 ptrtype = build_pointer_type (TREE_TYPE (type));
1697 if (TREE_CODE (exp) == VAR_DECL)
1699 /* ??? This is not really quite correct
1700 in that the type of the operand of ADDR_EXPR
1701 is not the target type of the type of the ADDR_EXPR itself.
1702 Question is, can this lossage be avoided? */
1703 adr = build1 (ADDR_EXPR, ptrtype, exp);
1704 if (mark_addressable (exp) == 0)
1705 return error_mark_node;
1706 TREE_CONSTANT (adr) = staticp (exp);
1707 TREE_SIDE_EFFECTS (adr) = 0; /* Default would be, same as EXP. */
1710 /* This way is better for a COMPONENT_REF since it can
1711 simplify the offset for a component. */
1712 adr = build_unary_op (ADDR_EXPR, exp, 1);
1713 return cp_convert (ptrtype, adr);
1720 default_conversion (exp)
1724 enum tree_code code;
1726 exp = decay_conversion (exp);
1728 type = TREE_TYPE (exp);
1729 code = TREE_CODE (type);
1731 if (INTEGRAL_CODE_P (code))
1733 tree t = type_promotes_to (type);
1735 return cp_convert (t, exp);
1741 /* Take the address of an inline function without setting TREE_ADDRESSABLE
1745 inline_conversion (exp)
1748 if (TREE_CODE (exp) == FUNCTION_DECL)
1749 exp = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (exp)), exp);
1754 /* Returns nonzero iff exp is a STRING_CST or the result of applying
1755 decay_conversion to one. */
1758 string_conv_p (totype, exp, warn)
1764 if (! flag_const_strings || TREE_CODE (totype) != POINTER_TYPE)
1767 t = TREE_TYPE (totype);
1768 if (!same_type_p (t, char_type_node)
1769 && !same_type_p (t, wchar_type_node))
1772 if (TREE_CODE (exp) != STRING_CST)
1774 t = build_pointer_type (build_qualified_type (t, TYPE_QUAL_CONST));
1775 if (!same_type_p (TREE_TYPE (exp), t))
1778 if (TREE_CODE (exp) != ADDR_EXPR
1779 || TREE_CODE (TREE_OPERAND (exp, 0)) != STRING_CST)
1783 /* This warning is not very useful, as it complains about printf. */
1784 if (warn && warn_write_strings)
1785 cp_warning ("deprecated conversion from string constant to `char *'");
1791 build_object_ref (datum, basetype, field)
1792 tree datum, basetype, field;
1795 if (datum == error_mark_node)
1796 return error_mark_node;
1798 dtype = TREE_TYPE (datum);
1799 if (TREE_CODE (dtype) == REFERENCE_TYPE)
1800 dtype = TREE_TYPE (dtype);
1801 if (! IS_AGGR_TYPE_CODE (TREE_CODE (dtype)))
1803 cp_error ("request for member `%T::%D' in expression of non-aggregate type `%T'",
1804 basetype, field, dtype);
1805 return error_mark_node;
1807 else if (IS_SIGNATURE (basetype))
1809 warning ("signature name in scope resolution ignored");
1810 return build_component_ref (datum, field, NULL_TREE, 1);
1812 else if (is_aggr_type (basetype, 1))
1814 tree binfo = binfo_or_else (basetype, dtype);
1816 return build_x_component_ref (build_scoped_ref (datum, basetype),
1819 return error_mark_node;
1822 /* Like `build_component_ref, but uses an already found field, and converts
1823 from a reference. Must compute access for current_class_ref.
1827 build_component_ref_1 (datum, field, protect)
1831 return convert_from_reference
1832 (build_component_ref (datum, field, NULL_TREE, protect));
1835 /* Given a COND_EXPR, MIN_EXPR, or MAX_EXPR in T, return it in a form that we
1836 can, for example, use as an lvalue. This code used to be in
1837 unary_complex_lvalue, but we needed it to deal with `a = (d == c) ? b : c'
1838 expressions, where we're dealing with aggregates. But now it's again only
1839 called from unary_complex_lvalue. The case (in particular) that led to
1840 this was with CODE == ADDR_EXPR, since it's not an lvalue when we'd
1844 rationalize_conditional_expr (code, t)
1845 enum tree_code code;
1848 /* For MIN_EXPR or MAX_EXPR, fold-const.c has arranged things so that
1849 the first operand is always the one to be used if both operands
1850 are equal, so we know what conditional expression this used to be. */
1851 if (TREE_CODE (t) == MIN_EXPR || TREE_CODE (t) == MAX_EXPR)
1854 build_conditional_expr (build_x_binary_op ((TREE_CODE (t) == MIN_EXPR
1855 ? LE_EXPR : GE_EXPR),
1856 TREE_OPERAND (t, 0),
1857 TREE_OPERAND (t, 1)),
1858 build_unary_op (code, TREE_OPERAND (t, 0), 0),
1859 build_unary_op (code, TREE_OPERAND (t, 1), 0));
1863 build_conditional_expr (TREE_OPERAND (t, 0),
1864 build_unary_op (code, TREE_OPERAND (t, 1), 0),
1865 build_unary_op (code, TREE_OPERAND (t, 2), 0));
1868 /* Given the TYPE of an anonymous union field inside T, return the
1869 FIELD_DECL for the field. If not found return NULL_TREE. Because
1870 anonymous unions can nest, we must also search all anonymous unions
1871 that are directly reachable. */
1874 lookup_anon_field (t, type)
1879 for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field))
1881 if (TREE_STATIC (field))
1883 if (TREE_CODE (field) != FIELD_DECL)
1886 /* If we find it directly, return the field. */
1887 if (DECL_NAME (field) == NULL_TREE
1888 && type == TREE_TYPE (field))
1893 /* Otherwise, it could be nested, search harder. */
1894 if (DECL_NAME (field) == NULL_TREE
1895 && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
1897 tree subfield = lookup_anon_field (TREE_TYPE (field), type);
1905 /* Build a COMPONENT_REF for a given DATUM, and it's member COMPONENT.
1906 COMPONENT can be an IDENTIFIER_NODE that is the name of the member
1907 that we are interested in, or it can be a FIELD_DECL. */
1910 build_component_ref (datum, component, basetype_path, protect)
1911 tree datum, component, basetype_path;
1914 register tree basetype;
1915 register enum tree_code code;
1916 register tree field = NULL;
1921 if (processing_template_decl)
1922 return build_min_nt (COMPONENT_REF, datum, component);
1924 if (datum == error_mark_node
1925 || TREE_TYPE (datum) == error_mark_node)
1926 return error_mark_node;
1928 /* BASETYPE holds the type of the class containing the COMPONENT. */
1929 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (datum));
1931 /* If DATUM is a COMPOUND_EXPR or COND_EXPR, move our reference
1933 switch (TREE_CODE (datum))
1937 tree value = build_component_ref (TREE_OPERAND (datum, 1), component,
1938 basetype_path, protect);
1939 return build (COMPOUND_EXPR, TREE_TYPE (value),
1940 TREE_OPERAND (datum, 0), value);
1943 return build_conditional_expr
1944 (TREE_OPERAND (datum, 0),
1945 build_component_ref (TREE_OPERAND (datum, 1), component,
1946 basetype_path, protect),
1947 build_component_ref (TREE_OPERAND (datum, 2), component,
1948 basetype_path, protect));
1951 cp_error ("invalid use of %D", datum);
1952 datum = error_mark_node;
1959 code = TREE_CODE (basetype);
1961 if (code == REFERENCE_TYPE)
1963 datum = convert_from_reference (datum);
1964 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (datum));
1965 code = TREE_CODE (basetype);
1967 if (TREE_CODE (datum) == OFFSET_REF)
1969 datum = resolve_offset_ref (datum);
1970 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (datum));
1971 code = TREE_CODE (basetype);
1974 /* First, see if there is a field or component with name COMPONENT. */
1975 if (TREE_CODE (component) == TREE_LIST)
1977 /* I could not trigger this code. MvL */
1978 my_friendly_abort (980326);
1980 my_friendly_assert (!(TREE_CHAIN (component) == NULL_TREE
1981 && DECL_CHAIN (TREE_VALUE (component)) == NULL_TREE), 309);
1983 return build (COMPONENT_REF, TREE_TYPE (component), datum, component);
1986 if (! IS_AGGR_TYPE_CODE (code))
1988 if (code != ERROR_MARK)
1989 cp_error ("request for member `%D' in `%E', which is of non-aggregate type `%T'",
1990 component, datum, basetype);
1991 return error_mark_node;
1994 if (!complete_type_or_else (basetype))
1995 return error_mark_node;
1997 if (TREE_CODE (component) == BIT_NOT_EXPR)
1999 if (TYPE_IDENTIFIER (basetype) != TREE_OPERAND (component, 0))
2001 cp_error ("destructor specifier `%T::~%T' must have matching names",
2002 basetype, TREE_OPERAND (component, 0));
2003 return error_mark_node;
2005 if (! TYPE_HAS_DESTRUCTOR (basetype))
2007 cp_error ("type `%T' has no destructor", basetype);
2008 return error_mark_node;
2010 return TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 1);
2013 /* Look up component name in the structure type definition. */
2014 if (CLASSTYPE_VFIELD (basetype)
2015 && DECL_NAME (CLASSTYPE_VFIELD (basetype)) == component)
2016 /* Special-case this because if we use normal lookups in an ambiguous
2017 hierarchy, the compiler will abort (because vptr lookups are
2018 not supposed to be ambiguous. */
2019 field = CLASSTYPE_VFIELD (basetype);
2020 else if (TREE_CODE (component) == FIELD_DECL)
2022 else if (TREE_CODE (component) == TYPE_DECL)
2024 cp_error ("invalid use of type decl `%#D' as expression", component);
2025 return error_mark_node;
2029 tree name = component;
2030 if (TREE_CODE (component) == VAR_DECL)
2031 name = DECL_NAME (component);
2032 if (basetype_path == NULL_TREE)
2033 basetype_path = TYPE_BINFO (basetype);
2034 field = lookup_field (basetype_path, name,
2035 protect && !VFIELD_NAME_P (name), 0);
2036 if (field == error_mark_node)
2037 return error_mark_node;
2039 if (field == NULL_TREE)
2041 /* Not found as a data field, look for it as a method. If found,
2042 then if this is the only possible one, return it, else
2043 report ambiguity error. */
2044 tree fndecls = lookup_fnfields (basetype_path, name, 1);
2045 if (fndecls == error_mark_node)
2046 return error_mark_node;
2049 /* If the function is unique and static, we can resolve it
2050 now. Otherwise, we have to wait and see what context it is
2051 used in; a component_ref involving a non-static member
2052 function can only be used in a call (expr.ref). */
2053 if (TREE_CHAIN (fndecls) == NULL_TREE
2054 && TREE_CODE (TREE_VALUE (fndecls)) == FUNCTION_DECL
2055 && DECL_STATIC_FUNCTION_P (TREE_VALUE (fndecls)))
2059 basetype = TYPE_MAIN_VARIANT (TREE_PURPOSE (fndecls));
2060 fndecl = TREE_VALUE (fndecls);
2061 enforce_access (TREE_PURPOSE (fndecls), fndecl);
2067 ref = build (COMPONENT_REF, unknown_type_node,
2073 cp_error ("`%#T' has no member named `%D'", basetype, name);
2074 return error_mark_node;
2076 else if (TREE_TYPE (field) == error_mark_node)
2077 return error_mark_node;
2079 if (TREE_CODE (field) != FIELD_DECL)
2081 if (TREE_CODE (field) == TYPE_DECL)
2082 cp_pedwarn ("invalid use of type decl `%#D' as expression", field);
2083 else if (DECL_RTL (field) != 0)
2086 TREE_USED (field) = 1;
2091 /* See if we have to do any conversions so that we pick up the field from the
2093 if (DECL_FIELD_CONTEXT (field) != basetype)
2095 tree context = DECL_FIELD_CONTEXT (field);
2096 tree base = context;
2097 while (!same_type_p (base, basetype) && TYPE_NAME (base)
2098 && ANON_UNION_TYPE_P (base))
2100 base = TYPE_CONTEXT (base);
2103 /* Handle base classes here... */
2104 if (base != basetype && TYPE_USES_COMPLEX_INHERITANCE (basetype))
2106 tree addr = build_unary_op (ADDR_EXPR, datum, 0);
2107 if (integer_zerop (addr))
2109 error ("invalid reference to NULL ptr, use ptr-to-member instead");
2110 return error_mark_node;
2112 if (VBASE_NAME_P (DECL_NAME (field)))
2114 /* It doesn't matter which vbase pointer we grab, just
2115 find one of them. */
2116 tree binfo = get_binfo (base,
2117 TREE_TYPE (TREE_TYPE (addr)), 0);
2118 addr = convert_pointer_to_real (binfo, addr);
2121 addr = convert_pointer_to (base, addr);
2122 datum = build_indirect_ref (addr, NULL_PTR);
2123 my_friendly_assert (datum != error_mark_node, 311);
2127 /* Handle things from anon unions here... */
2128 if (TYPE_NAME (context) && ANON_UNION_TYPE_P (context))
2130 tree subfield = lookup_anon_field (basetype, context);
2131 tree subdatum = build_component_ref (datum, subfield,
2132 basetype_path, protect);
2133 return build_component_ref (subdatum, field, basetype_path, protect);
2137 /* Compute the type of the field, as described in [expr.ref]. */
2138 type_quals = TYPE_UNQUALIFIED;
2139 field_type = TREE_TYPE (field);
2140 if (TREE_CODE (field_type) == REFERENCE_TYPE)
2141 /* The standard says that the type of the result should be the
2142 type referred to by the reference. But for now, at least, we
2143 do the conversion from reference type later. */
2147 type_quals = (CP_TYPE_QUALS (field_type)
2148 | CP_TYPE_QUALS (TREE_TYPE (datum)));
2150 /* A field is const (volatile) if the enclosing object, or the
2151 field itself, is const (volatile). But, a mutable field is
2152 not const, even within a const object. */
2153 if (DECL_LANG_SPECIFIC (field) && DECL_MUTABLE_P (field))
2154 type_quals &= ~TYPE_QUAL_CONST;
2155 if (!IS_SIGNATURE (field_type))
2156 field_type = cp_build_qualified_type (field_type, type_quals);
2159 ref = fold (build (COMPONENT_REF, field_type,
2160 break_out_cleanups (datum), field));
2162 /* Mark the expression const or volatile, as appropriate. Even
2163 though we've dealt with the type above, we still have to mark the
2164 expression itself. */
2165 if (type_quals & TYPE_QUAL_CONST)
2166 TREE_READONLY (ref) = 1;
2167 else if (type_quals & TYPE_QUAL_VOLATILE)
2168 TREE_THIS_VOLATILE (ref) = 1;
2173 /* Variant of build_component_ref for use in expressions, which should
2174 never have REFERENCE_TYPE. */
2177 build_x_component_ref (datum, component, basetype_path, protect)
2178 tree datum, component, basetype_path;
2181 tree t = build_component_ref (datum, component, basetype_path, protect);
2183 if (! processing_template_decl)
2184 t = convert_from_reference (t);
2189 /* Given an expression PTR for a pointer, return an expression
2190 for the value pointed to.
2191 ERRORSTRING is the name of the operator to appear in error messages.
2193 This function may need to overload OPERATOR_FNNAME.
2194 Must also handle REFERENCE_TYPEs for C++. */
2197 build_x_indirect_ref (ptr, errorstring)
2203 if (processing_template_decl)
2204 return build_min_nt (INDIRECT_REF, ptr);
2206 rval = build_opfncall (INDIRECT_REF, LOOKUP_NORMAL, ptr, NULL_TREE,
2210 return build_indirect_ref (ptr, errorstring);
2214 build_indirect_ref (ptr, errorstring)
2218 register tree pointer, type;
2220 if (ptr == error_mark_node)
2221 return error_mark_node;
2223 pointer = (TREE_CODE (TREE_TYPE (ptr)) == REFERENCE_TYPE
2224 ? ptr : default_conversion (ptr));
2225 type = TREE_TYPE (pointer);
2227 if (ptr == current_class_ptr)
2228 return current_class_ref;
2230 if (TYPE_PTR_P (type) || TREE_CODE (type) == REFERENCE_TYPE)
2234 If the type of the expression is "pointer to T," the type
2235 of the result is "T."
2237 We must use the canonical variant because certain parts of
2238 the back end, like fold, do pointer comparisons between
2240 tree t = canonical_type_variant (TREE_TYPE (type));
2242 if (TREE_CODE (pointer) == ADDR_EXPR
2244 && same_type_p (t, TREE_TYPE (TREE_OPERAND (pointer, 0))))
2245 /* The POINTER was something like `&x'. We simplify `*&x' to
2247 return TREE_OPERAND (pointer, 0);
2250 tree ref = build1 (INDIRECT_REF, t, pointer);
2252 /* We *must* set TREE_READONLY when dereferencing a pointer to const,
2253 so that we get the proper error message if the result is used
2254 to assign to. Also, &* is supposed to be a no-op. */
2255 TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
2256 TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
2257 TREE_SIDE_EFFECTS (ref)
2258 = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (pointer)
2263 /* `pointer' won't be an error_mark_node if we were given a
2264 pointer to member, so it's cool to check for this here. */
2265 else if (TYPE_PTRMEM_P (type) || TYPE_PTRMEMFUNC_P (type))
2266 error ("invalid use of `%s' on pointer to member", errorstring);
2267 else if (TREE_CODE (type) == RECORD_TYPE
2268 && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type)))
2269 error ("cannot dereference signature pointer/reference");
2270 else if (pointer != error_mark_node)
2273 error ("invalid type argument of `%s'", errorstring);
2275 error ("invalid type argument");
2277 return error_mark_node;
2280 /* This handles expressions of the form "a[i]", which denotes
2283 This is logically equivalent in C to *(a+i), but we may do it differently.
2284 If A is a variable or a member, we generate a primitive ARRAY_REF.
2285 This avoids forcing the array out of registers, and can work on
2286 arrays that are not lvalues (for example, members of structures returned
2289 If INDEX is of some user-defined type, it must be converted to
2290 integer type. Otherwise, to make a compatible PLUS_EXPR, it
2291 will inherit the type of the array, which will be some pointer type. */
2294 build_array_ref (array, idx)
2299 error ("subscript missing in array reference");
2300 return error_mark_node;
2303 if (TREE_TYPE (array) == error_mark_node
2304 || TREE_TYPE (idx) == error_mark_node)
2305 return error_mark_node;
2307 if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE
2308 && TREE_CODE (array) != INDIRECT_REF)
2312 /* Subscripting with type char is likely to lose
2313 on a machine where chars are signed.
2314 So warn on any machine, but optionally.
2315 Don't warn for unsigned char since that type is safe.
2316 Don't warn for signed char because anyone who uses that
2317 must have done so deliberately. */
2318 if (warn_char_subscripts
2319 && TYPE_MAIN_VARIANT (TREE_TYPE (idx)) == char_type_node)
2320 warning ("array subscript has type `char'");
2322 /* Apply default promotions *after* noticing character types. */
2323 idx = default_conversion (idx);
2325 if (TREE_CODE (TREE_TYPE (idx)) != INTEGER_TYPE)
2327 error ("array subscript is not an integer");
2328 return error_mark_node;
2331 /* An array that is indexed by a non-constant
2332 cannot be stored in a register; we must be able to do
2333 address arithmetic on its address.
2334 Likewise an array of elements of variable size. */
2335 if (TREE_CODE (idx) != INTEGER_CST
2336 || (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))) != 0
2337 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))))
2340 if (mark_addressable (array) == 0)
2341 return error_mark_node;
2343 /* An array that is indexed by a constant value which is not within
2344 the array bounds cannot be stored in a register either; because we
2345 would get a crash in store_bit_field/extract_bit_field when trying
2346 to access a non-existent part of the register. */
2347 if (TREE_CODE (idx) == INTEGER_CST
2348 && TYPE_VALUES (TREE_TYPE (array))
2349 && ! int_fits_type_p (idx, TYPE_VALUES (TREE_TYPE (array))))
2351 if (mark_addressable (array) == 0)
2352 return error_mark_node;
2355 if (pedantic && !lvalue_p (array))
2356 pedwarn ("ANSI C++ forbids subscripting non-lvalue array");
2358 /* Note in C++ it is valid to subscript a `register' array, since
2359 it is valid to take the address of something with that
2360 storage specification. */
2364 while (TREE_CODE (foo) == COMPONENT_REF)
2365 foo = TREE_OPERAND (foo, 0);
2366 if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo))
2367 warning ("subscripting array declared `register'");
2370 type = TREE_TYPE (TREE_TYPE (array));
2371 rval = build (ARRAY_REF, type, array, idx);
2372 /* Array ref is const/volatile if the array elements are
2373 or if the array is.. */
2374 TREE_READONLY (rval)
2375 |= (CP_TYPE_CONST_P (type) | TREE_READONLY (array));
2376 TREE_SIDE_EFFECTS (rval)
2377 |= (CP_TYPE_VOLATILE_P (type) | TREE_SIDE_EFFECTS (array));
2378 TREE_THIS_VOLATILE (rval)
2379 |= (CP_TYPE_VOLATILE_P (type) | TREE_THIS_VOLATILE (array));
2380 return require_complete_type (fold (rval));
2384 tree ar = default_conversion (array);
2385 tree ind = default_conversion (idx);
2387 /* Put the integer in IND to simplify error checking. */
2388 if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE)
2395 if (ar == error_mark_node)
2398 if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE)
2400 error ("subscripted value is neither array nor pointer");
2401 return error_mark_node;
2403 if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
2405 error ("array subscript is not an integer");
2406 return error_mark_node;
2409 return build_indirect_ref (build_binary_op_nodefault (PLUS_EXPR, ar,
2415 /* Build a function call to function FUNCTION with parameters PARAMS.
2416 PARAMS is a list--a chain of TREE_LIST nodes--in which the
2417 TREE_VALUE of each node is a parameter-expression. The PARAMS do
2418 not include any object pointer that may be required. FUNCTION's
2419 data type may be a function type or a pointer-to-function.
2421 For C++: If FUNCTION's data type is a TREE_LIST, then the tree list
2422 is the list of possible methods that FUNCTION could conceivably
2423 be. If the list of methods comes from a class, then it will be
2424 a list of lists (where each element is associated with the class
2425 that produced it), otherwise it will be a simple list (for
2426 functions overloaded in global scope).
2428 In the first case, TREE_VALUE (function) is the head of one of those
2429 lists, and TREE_PURPOSE is the name of the function.
2431 In the second case, TREE_PURPOSE (function) is the function's
2434 DECL is the class instance variable, usually CURRENT_CLASS_REF.
2436 When calling a TEMPLATE_DECL, we don't require a complete return
2440 build_x_function_call (function, params, decl)
2441 tree function, params, decl;
2444 tree template_id = NULL_TREE;
2447 if (function == error_mark_node)
2448 return error_mark_node;
2450 if (processing_template_decl)
2451 return build_min_nt (CALL_EXPR, function, params, NULL_TREE);
2453 /* Save explicit template arguments if found */
2454 if (TREE_CODE (function) == TEMPLATE_ID_EXPR)
2456 template_id = function;
2457 function = TREE_OPERAND (function, 0);
2460 type = TREE_TYPE (function);
2462 if (TREE_CODE (type) == OFFSET_TYPE
2463 && TREE_TYPE (type) == unknown_type_node
2464 && TREE_CODE (function) == TREE_LIST
2465 && TREE_CHAIN (function) == NULL_TREE)
2467 /* Undo (Foo:bar)()... */
2468 type = TYPE_OFFSET_BASETYPE (type);
2469 function = TREE_VALUE (function);
2470 my_friendly_assert (TREE_CODE (function) == TREE_LIST, 999);
2471 my_friendly_assert (TREE_CHAIN (function) == NULL_TREE, 999);
2472 function = TREE_VALUE (function);
2473 if (TREE_CODE (function) == OVERLOAD)
2474 function = OVL_FUNCTION (function);
2475 my_friendly_assert (TREE_CODE (function) == FUNCTION_DECL, 999);
2476 function = DECL_NAME (function);
2477 return build_method_call (decl, function, params,
2478 TYPE_BINFO (type), LOOKUP_NORMAL);
2481 is_method = ((TREE_CODE (function) == TREE_LIST
2482 && current_class_type != NULL_TREE
2483 && (IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (function))
2485 || TREE_CODE (function) == IDENTIFIER_NODE
2486 || TREE_CODE (type) == METHOD_TYPE
2487 || TYPE_PTRMEMFUNC_P (type));
2489 if ((TREE_CODE (function) == FUNCTION_DECL
2490 && DECL_STATIC_FUNCTION_P (function))
2491 || (TREE_CODE (function) == TEMPLATE_DECL
2492 && DECL_STATIC_FUNCTION_P (DECL_RESULT (function))))
2493 return build_member_call
2494 (DECL_CONTEXT (function), DECL_NAME (function), params);
2496 /* A friend template. Make it look like a toplevel declaration. */
2497 if (! is_method && TREE_CODE (function) == TEMPLATE_DECL)
2498 function = scratch_ovl_cons (function, NULL_TREE);
2500 /* Handle methods, friends, and overloaded functions, respectively. */
2503 tree basetype = NULL_TREE;
2505 if (TREE_CODE (function) == FUNCTION_DECL
2506 || DECL_FUNCTION_TEMPLATE_P (function))
2508 basetype = DECL_CLASS_CONTEXT (function);
2510 if (DECL_NAME (function))
2511 function = DECL_NAME (function);
2513 function = TYPE_IDENTIFIER (DECL_CLASS_CONTEXT (function));
2515 else if (TREE_CODE (function) == TREE_LIST)
2517 my_friendly_assert (TREE_CODE (TREE_VALUE (function))
2518 == FUNCTION_DECL, 312);
2519 basetype = DECL_CLASS_CONTEXT (TREE_VALUE (function));
2520 function = TREE_PURPOSE (function);
2522 else if (TREE_CODE (function) != IDENTIFIER_NODE)
2524 if (TREE_CODE (function) == OFFSET_REF)
2526 if (TREE_OPERAND (function, 0))
2527 decl = TREE_OPERAND (function, 0);
2529 /* Call via a pointer to member function. */
2530 if (decl == NULL_TREE)
2532 error ("pointer to member function called, but not in class scope");
2533 return error_mark_node;
2535 /* What other type of POINTER_TYPE could this be? */
2536 if (TREE_CODE (TREE_TYPE (function)) != POINTER_TYPE
2537 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (function))
2538 && TREE_CODE (function) != OFFSET_REF)
2539 function = build (OFFSET_REF, TREE_TYPE (type), NULL_TREE,
2544 /* this is an abbreviated method call.
2545 must go through here in case it is a virtual function.
2546 @@ Perhaps this could be optimized. */
2548 if (basetype && (! current_class_type
2549 || ! DERIVED_FROM_P (basetype, current_class_type)))
2550 return build_member_call (basetype, function, params);
2552 if (decl == NULL_TREE)
2554 if (current_class_type == NULL_TREE)
2556 error ("object missing in call to method `%s'",
2557 IDENTIFIER_POINTER (function));
2558 return error_mark_node;
2560 /* Yow: call from a static member function. */
2561 decl = build_dummy_object (current_class_type);
2564 /* Put back explicit template arguments, if any. */
2566 function = template_id;
2567 return build_method_call (decl, function, params,
2568 NULL_TREE, LOOKUP_NORMAL);
2570 else if (TREE_CODE (function) == COMPONENT_REF
2571 && type == unknown_type_node)
2573 /* Undo what we did in build_component_ref. */
2574 decl = TREE_OPERAND (function, 0);
2575 function = TREE_OPERAND (function, 1);
2576 function = DECL_NAME (OVL_CURRENT (TREE_VALUE (function)));
2577 return build_method_call (decl, function, params,
2578 NULL_TREE, LOOKUP_NORMAL);
2580 else if (really_overloaded_fn (function))
2582 if (OVL_FUNCTION (function) == NULL_TREE)
2584 cp_error ("function `%D' declared overloaded, but no definitions appear with which to resolve it?!?",
2585 TREE_PURPOSE (function));
2586 return error_mark_node;
2590 /* Put back explicit template arguments, if any. */
2592 function = template_id;
2593 return build_new_function_call (function, params);
2597 /* Remove a potential OVERLOAD around it */
2598 function = OVL_CURRENT (function);
2601 if (TREE_CODE (function) == OFFSET_REF)
2603 /* If the component is a data element (or a virtual function), we play
2604 games here to make things work. */
2607 if (TREE_OPERAND (function, 0))
2608 decl = TREE_OPERAND (function, 0);
2610 decl = current_class_ref;
2612 decl_addr = build_unary_op (ADDR_EXPR, decl, 0);
2614 /* Sigh. OFFSET_REFs are being used for too many things.
2615 They're being used both for -> and ->*, and we want to resolve
2616 the -> cases here, but leave the ->*. We could use
2617 resolve_offset_ref for those, too, but it would call
2618 get_member_function_from_ptrfunc and decl_addr wouldn't get
2619 updated properly. Nasty. */
2620 if (TREE_CODE (TREE_OPERAND (function, 1)) == FIELD_DECL)
2621 function = resolve_offset_ref (function);
2623 function = TREE_OPERAND (function, 1);
2625 function = get_member_function_from_ptrfunc (&decl_addr, function);
2626 params = expr_tree_cons (NULL_TREE, decl_addr, params);
2627 return build_function_call (function, params);
2630 type = TREE_TYPE (function);
2631 if (type != error_mark_node)
2633 if (TREE_CODE (type) == REFERENCE_TYPE)
2634 type = TREE_TYPE (type);
2636 if (IS_AGGR_TYPE (type))
2637 return build_opfncall (CALL_EXPR, LOOKUP_NORMAL, function, params, NULL_TREE);
2642 tree fntype = TREE_TYPE (function);
2643 tree ctypeptr = NULL_TREE;
2645 /* Explicitly named method? */
2646 if (TREE_CODE (function) == FUNCTION_DECL)
2647 ctypeptr = build_pointer_type (DECL_CLASS_CONTEXT (function));
2648 /* Expression with ptr-to-method type? It could either be a plain
2649 usage, or it might be a case where the ptr-to-method is being
2650 passed in as an argument. */
2651 else if (TYPE_PTRMEMFUNC_P (fntype))
2653 tree rec = TYPE_METHOD_BASETYPE (TREE_TYPE
2654 (TYPE_PTRMEMFUNC_FN_TYPE (fntype)));
2655 ctypeptr = build_pointer_type (rec);
2657 /* Unexpected node type? */
2659 my_friendly_abort (116);
2660 if (decl == NULL_TREE)
2662 if (current_function_decl
2663 && DECL_STATIC_FUNCTION_P (current_function_decl))
2664 error ("invalid call to member function needing `this' in static member function scope");
2666 error ("pointer to member function called, but not in class scope");
2667 return error_mark_node;
2669 if (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE
2670 && ! TYPE_PTRMEMFUNC_P (TREE_TYPE (decl)))
2672 decl = build_unary_op (ADDR_EXPR, decl, 0);
2673 decl = convert_pointer_to (TREE_TYPE (ctypeptr), decl);
2676 decl = build_c_cast (ctypeptr, decl);
2677 params = expr_tree_cons (NULL_TREE, decl, params);
2680 return build_function_call (function, params);
2683 /* Resolve a pointer to member function. INSTANCE is the object
2684 instance to use, if the member points to a virtual member. */
2687 get_member_function_from_ptrfunc (instance_ptrptr, function)
2688 tree *instance_ptrptr;
2691 if (TREE_CODE (function) == OFFSET_REF)
2693 function = TREE_OPERAND (function, 1);
2696 if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function)))
2698 tree fntype, idx, e1, delta, delta2, e2, e3, aref, vtbl;
2699 tree instance, basetype;
2701 tree instance_ptr = *instance_ptrptr;
2703 if (TREE_SIDE_EFFECTS (instance_ptr))
2704 instance_ptr = save_expr (instance_ptr);
2706 if (TREE_SIDE_EFFECTS (function))
2707 function = save_expr (function);
2709 fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function));
2710 basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype));
2712 delta = cp_convert (ptrdiff_type_node,
2713 build_component_ref (function, delta_identifier,
2715 e3 = PFN_FROM_PTRMEMFUNC (function);
2717 if (TYPE_SIZE (basetype) != NULL_TREE
2718 && ! TYPE_VIRTUAL_P (basetype))
2719 /* If basetype doesn't have virtual functions, don't emit code to
2720 handle that case. */
2724 /* Promoting idx before saving it improves performance on RISC
2725 targets. Without promoting, the first compare used
2726 load-with-sign-extend, while the second used normal load then
2727 shift to sign-extend. An optimizer flaw, perhaps, but it's
2728 easier to make this change. */
2729 idx = save_expr (default_conversion
2730 (build_component_ref (function,
2733 e1 = build_binary_op (GT_EXPR, idx, integer_zero_node, 1);
2735 /* Convert down to the right base, before using the instance. */
2736 instance = convert_pointer_to_real (basetype, instance_ptr);
2737 if (instance == error_mark_node && instance_ptr != error_mark_node)
2740 vtbl = convert_pointer_to (ptr_type_node, instance);
2741 delta2 = DELTA2_FROM_PTRMEMFUNC (function);
2744 build_pointer_type (build_pointer_type (vtable_entry_type)),
2745 vtbl, cp_convert (ptrdiff_type_node, delta2));
2746 vtbl = build_indirect_ref (vtbl, NULL_PTR);
2747 aref = build_array_ref (vtbl, build_binary_op (MINUS_EXPR,
2749 integer_one_node, 1));
2750 if (! flag_vtable_thunks)
2752 aref = save_expr (aref);
2754 delta = build_binary_op
2756 build_conditional_expr (e1,
2757 build_component_ref (aref,
2764 if (flag_vtable_thunks)
2767 e2 = build_component_ref (aref, pfn_identifier, NULL_TREE, 0);
2768 TREE_TYPE (e2) = TREE_TYPE (e3);
2769 e1 = build_conditional_expr (e1, e2, e3);
2771 /* Make sure this doesn't get evaluated first inside one of the
2772 branches of the COND_EXPR. */
2773 if (TREE_CODE (instance_ptr) == SAVE_EXPR)
2774 e1 = build (COMPOUND_EXPR, TREE_TYPE (e1),
2778 *instance_ptrptr = build (PLUS_EXPR, TREE_TYPE (instance_ptr),
2779 instance_ptr, delta);
2781 if (instance_ptr == error_mark_node
2782 && TREE_CODE (e1) != ADDR_EXPR
2783 && TREE_CODE (TREE_OPERAND (e1, 0)) != FUNCTION_DECL)
2784 cp_error ("object missing in `%E'", function);
2792 build_function_call_real (function, params, require_complete, flags)
2793 tree function, params;
2794 int require_complete, flags;
2796 register tree fntype, fndecl;
2797 register tree value_type;
2798 register tree coerced_params;
2799 tree name = NULL_TREE, assembler_name = NULL_TREE;
2802 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2803 Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context. */
2804 if (TREE_CODE (function) == NOP_EXPR
2805 && TREE_TYPE (function) == TREE_TYPE (TREE_OPERAND (function, 0)))
2806 function = TREE_OPERAND (function, 0);
2808 if (TREE_CODE (function) == FUNCTION_DECL)
2810 name = DECL_NAME (function);
2811 assembler_name = DECL_ASSEMBLER_NAME (function);
2813 GNU_xref_call (current_function_decl,
2814 IDENTIFIER_POINTER (name ? name
2815 : TYPE_IDENTIFIER (DECL_CLASS_CONTEXT
2817 mark_used (function);
2820 /* Convert anything with function type to a pointer-to-function. */
2821 if (pedantic && DECL_MAIN_P (function))
2822 pedwarn ("ANSI C++ forbids calling `main' from within program");
2824 /* Differs from default_conversion by not setting TREE_ADDRESSABLE
2825 (because calling an inline function does not mean the function
2826 needs to be separately compiled). */
2828 if (DECL_INLINE (function))
2829 function = inline_conversion (function);
2831 function = build_addr_func (function);
2837 function = build_addr_func (function);
2840 if (function == error_mark_node)
2841 return error_mark_node;
2843 fntype = TREE_TYPE (function);
2845 if (TYPE_PTRMEMFUNC_P (fntype))
2847 cp_error ("must use .* or ->* to call pointer-to-member function in `%E (...)'",
2849 return error_mark_node;
2852 is_method = (TREE_CODE (fntype) == POINTER_TYPE
2853 && TREE_CODE (TREE_TYPE (fntype)) == METHOD_TYPE);
2855 if (!((TREE_CODE (fntype) == POINTER_TYPE
2856 && TREE_CODE (TREE_TYPE (fntype)) == FUNCTION_TYPE)
2858 || TREE_CODE (function) == TEMPLATE_ID_EXPR))
2860 cp_error ("`%E' cannot be used as a function", function);
2861 return error_mark_node;
2864 /* fntype now gets the type of function pointed to. */
2865 fntype = TREE_TYPE (fntype);
2867 /* Convert the parameters to the types declared in the
2868 function prototype, or apply default promotions. */
2870 if (flags & LOOKUP_COMPLAIN)
2871 coerced_params = convert_arguments (TYPE_ARG_TYPES (fntype),
2872 params, fndecl, LOOKUP_NORMAL);
2874 coerced_params = convert_arguments (TYPE_ARG_TYPES (fntype),
2877 if (coerced_params == error_mark_node)
2879 if (flags & LOOKUP_SPECULATIVELY)
2882 return error_mark_node;
2885 /* Check for errors in format strings. */
2887 if (warn_format && (name || assembler_name))
2888 check_function_format (name, assembler_name, coerced_params);
2890 /* Recognize certain built-in functions so we can make tree-codes
2891 other than CALL_EXPR. We do this when it enables fold-const.c
2892 to do something useful. */
2894 if (TREE_CODE (function) == ADDR_EXPR
2895 && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL
2896 && DECL_BUILT_IN (TREE_OPERAND (function, 0)))
2897 switch (DECL_FUNCTION_CODE (TREE_OPERAND (function, 0)))
2902 if (coerced_params == 0)
2903 return integer_zero_node;
2904 return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
2911 value_type = TREE_TYPE (fntype) ? TREE_TYPE (fntype) : void_type_node;
2913 register tree result
2914 = build_call (function, value_type, coerced_params);
2916 if (require_complete)
2918 if (value_type == void_type_node)
2920 result = require_complete_type (result);
2922 if (IS_AGGR_TYPE (value_type))
2923 result = build_cplus_new (value_type, result);
2924 return convert_from_reference (result);
2929 build_function_call (function, params)
2930 tree function, params;
2932 return build_function_call_real (function, params, 1, LOOKUP_NORMAL);
2935 /* Convert the actual parameter expressions in the list VALUES
2936 to the types in the list TYPELIST.
2937 If parmdecls is exhausted, or when an element has NULL as its type,
2938 perform the default conversions.
2940 NAME is an IDENTIFIER_NODE or 0. It is used only for error messages.
2942 This is also where warnings about wrong number of args are generated.
2944 Return a list of expressions for the parameters as converted.
2946 Both VALUES and the returned value are chains of TREE_LIST nodes
2947 with the elements of the list in the TREE_VALUE slots of those nodes.
2949 In C++, unspecified trailing parameters can be filled in with their
2950 default arguments, if such were specified. Do so here. */
2953 convert_arguments (typelist, values, fndecl, flags)
2954 tree typelist, values, fndecl;
2957 register tree typetail, valtail;
2958 register tree result = NULL_TREE;
2959 char *called_thing = 0;
2962 /* Argument passing is always copy-initialization. */
2963 flags |= LOOKUP_ONLYCONVERTING;
2967 if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
2969 if (DECL_NAME (fndecl) == NULL_TREE
2970 || IDENTIFIER_HAS_TYPE_VALUE (DECL_NAME (fndecl)))
2971 called_thing = "constructor";
2973 called_thing = "member function";
2976 called_thing = "function";
2979 for (valtail = values, typetail = typelist;
2981 valtail = TREE_CHAIN (valtail), i++)
2983 register tree type = typetail ? TREE_VALUE (typetail) : 0;
2984 register tree val = TREE_VALUE (valtail);
2986 if (val == error_mark_node)
2987 return error_mark_node;
2989 if (type == void_type_node)
2993 cp_error_at ("too many arguments to %s `%+D'", called_thing,
2995 error ("at this point in file");
2998 error ("too many arguments to function");
2999 /* In case anybody wants to know if this argument
3002 TREE_TYPE (tree_last (result)) = error_mark_node;
3006 if (TREE_CODE (val) == OFFSET_REF)
3007 val = resolve_offset_ref (val);
3009 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
3010 Strip such NOP_EXPRs, since VAL is used in non-lvalue context. */
3011 if (TREE_CODE (val) == NOP_EXPR
3012 && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))
3013 && (type == 0 || TREE_CODE (type) != REFERENCE_TYPE))
3014 val = TREE_OPERAND (val, 0);
3016 if (type == 0 || TREE_CODE (type) != REFERENCE_TYPE)
3018 if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE
3019 || TREE_CODE (TREE_TYPE (val)) == FUNCTION_TYPE
3020 || TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE)
3021 val = default_conversion (val);
3023 val = require_complete_type (val);
3026 if (val == error_mark_node)
3027 return error_mark_node;
3031 /* Formal parm type is specified by a function prototype. */
3034 if (TYPE_SIZE (complete_type (type)) == 0)
3036 error ("parameter type of called function is incomplete");
3041 parmval = convert_for_initialization
3042 (NULL_TREE, type, val, flags,
3043 "argument passing", fndecl, i);
3044 #ifdef PROMOTE_PROTOTYPES
3045 if ((TREE_CODE (type) == INTEGER_TYPE
3046 || TREE_CODE (type) == ENUMERAL_TYPE)
3047 && (TYPE_PRECISION (type)
3048 < TYPE_PRECISION (integer_type_node)))
3049 parmval = default_conversion (parmval);
3053 if (parmval == error_mark_node)
3054 return error_mark_node;
3056 result = expr_tree_cons (NULL_TREE, parmval, result);
3060 if (TREE_CODE (TREE_TYPE (val)) == REFERENCE_TYPE)
3061 val = convert_from_reference (val);
3063 result = expr_tree_cons (NULL_TREE,
3064 convert_arg_to_ellipsis (val),
3069 typetail = TREE_CHAIN (typetail);
3072 if (typetail != 0 && typetail != void_list_node)
3074 /* See if there are default arguments that can be used */
3075 if (TREE_PURPOSE (typetail))
3077 for (; typetail != void_list_node; ++i)
3079 tree type = TREE_VALUE (typetail);
3080 tree val = TREE_PURPOSE (typetail);
3081 tree parmval = convert_default_arg (type, val);
3083 if (parmval == error_mark_node)
3084 return error_mark_node;
3086 result = expr_tree_cons (0, parmval, result);
3087 typetail = TREE_CHAIN (typetail);
3088 /* ends with `...'. */
3089 if (typetail == NULL_TREE)
3097 char *buf = (char *)alloca (32 + strlen (called_thing));
3098 sprintf (buf, "too few arguments to %s `%%#D'", called_thing);
3099 cp_error_at (buf, fndecl);
3100 error ("at this point in file");
3103 error ("too few arguments to function");
3104 return error_mark_list;
3108 return nreverse (result);
3111 /* Build a binary-operation expression, after performing default
3112 conversions on the operands. CODE is the kind of expression to build. */
3115 build_x_binary_op (code, arg1, arg2)
3116 enum tree_code code;
3119 if (processing_template_decl)
3120 return build_min_nt (code, arg1, arg2);
3122 return build_new_op (code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE);
3126 build_binary_op (code, arg1, arg2, convert_p)
3127 enum tree_code code;
3131 return build_binary_op_nodefault (code, arg1, arg2, code);
3134 /* Build a binary-operation expression without default conversions.
3135 CODE is the kind of expression to build.
3136 This function differs from `build' in several ways:
3137 the data type of the result is computed and recorded in it,
3138 warnings are generated if arg data types are invalid,
3139 special handling for addition and subtraction of pointers is known,
3140 and some optimization is done (operations on narrow ints
3141 are done in the narrower type when that gives the same result).
3142 Constant folding is also done before the result is returned.
3144 ERROR_CODE is the code that determines what to say in error messages.
3145 It is usually, but not always, the same as CODE.
3147 Note that the operands will never have enumeral types
3148 because either they have just had the default conversions performed
3149 or they have both just been converted to some other type in which
3150 the arithmetic is to be done.
3152 C++: must do special pointer arithmetic when implementing
3153 multiple inheritance, and deal with pointer to member functions. */
3156 build_binary_op_nodefault (code, orig_op0, orig_op1, error_code)
3157 enum tree_code code;
3158 tree orig_op0, orig_op1;
3159 enum tree_code error_code;
3162 register enum tree_code code0, code1;
3165 /* Expression code to give to the expression when it is built.
3166 Normally this is CODE, which is what the caller asked for,
3167 but in some special cases we change it. */
3168 register enum tree_code resultcode = code;
3170 /* Data type in which the computation is to be performed.
3171 In the simplest cases this is the common type of the arguments. */
3172 register tree result_type = NULL;
3174 /* Nonzero means operands have already been type-converted
3175 in whatever way is necessary.
3176 Zero means they need to be converted to RESULT_TYPE. */
3179 /* Nonzero means create the expression with this type, rather than
3181 tree build_type = 0;
3183 /* Nonzero means after finally constructing the expression
3184 convert it to this type. */
3185 tree final_type = 0;
3187 /* Nonzero if this is an operation like MIN or MAX which can
3188 safely be computed in short if both args are promoted shorts.
3189 Also implies COMMON.
3190 -1 indicates a bitwise operation; this makes a difference
3191 in the exact conditions for when it is safe to do the operation
3192 in a narrower mode. */
3195 /* Nonzero if this is a comparison operation;
3196 if both args are promoted shorts, compare the original shorts.
3197 Also implies COMMON. */
3198 int short_compare = 0;
3200 /* Nonzero if this is a right-shift operation, which can be computed on the
3201 original short and then promoted if the operand is a promoted short. */
3202 int short_shift = 0;
3204 /* Nonzero means set RESULT_TYPE to the common type of the args. */
3207 /* Apply default conversions. */
3208 if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
3209 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
3210 || code == TRUTH_XOR_EXPR)
3212 op0 = decay_conversion (orig_op0);
3213 op1 = decay_conversion (orig_op1);
3217 op0 = default_conversion (orig_op0);
3218 op1 = default_conversion (orig_op1);
3221 type0 = TREE_TYPE (op0);
3222 type1 = TREE_TYPE (op1);
3224 /* The expression codes of the data types of the arguments tell us
3225 whether the arguments are integers, floating, pointers, etc. */
3226 code0 = TREE_CODE (type0);
3227 code1 = TREE_CODE (type1);
3229 /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue. */
3230 STRIP_TYPE_NOPS (op0);
3231 STRIP_TYPE_NOPS (op1);
3233 /* If an error was already reported for one of the arguments,
3234 avoid reporting another error. */
3236 if (code0 == ERROR_MARK || code1 == ERROR_MARK)
3237 return error_mark_node;
3242 /* Handle the pointer + int case. */
3243 if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3244 return pointer_int_sum (PLUS_EXPR, op0, op1);
3245 else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE)
3246 return pointer_int_sum (PLUS_EXPR, op1, op0);
3252 /* Subtraction of two similar pointers.
3253 We must subtract them as integers, then divide by object size. */
3254 if (code0 == POINTER_TYPE && code1 == POINTER_TYPE
3255 && comp_target_types (type0, type1, 1))
3256 return pointer_diff (op0, op1, common_type (type0, type1));
3257 /* Handle pointer minus int. Just like pointer plus int. */
3258 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3259 return pointer_int_sum (MINUS_EXPR, op0, op1);
3268 case TRUNC_DIV_EXPR:
3270 case FLOOR_DIV_EXPR:
3271 case ROUND_DIV_EXPR:
3272 case EXACT_DIV_EXPR:
3273 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
3274 || code0 == COMPLEX_TYPE)
3275 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
3276 || code1 == COMPLEX_TYPE))
3278 if (TREE_CODE (op1) == INTEGER_CST && integer_zerop (op1))
3279 cp_warning ("division by zero in `%E / 0'", op0);
3280 else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
3281 cp_warning ("division by zero in `%E / 0.'", op0);
3283 if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE))
3284 resultcode = RDIV_EXPR;
3286 /* When dividing two signed integers, we have to promote to int.
3287 unless we divide by a constant != -1. Note that default
3288 conversion will have been performed on the operands at this
3289 point, so we have to dig out the original type to find out if
3291 shorten = ((TREE_CODE (op0) == NOP_EXPR
3292 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3293 || (TREE_CODE (op1) == INTEGER_CST
3294 && (TREE_INT_CST_LOW (op1) != -1
3295 || TREE_INT_CST_HIGH (op1) != -1)));
3301 case BIT_ANDTC_EXPR:
3304 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3306 /* If one operand is a constant, and the other is a short type
3307 that has been converted to an int,
3308 really do the work in the short type and then convert the
3309 result to int. If we are lucky, the constant will be 0 or 1
3310 in the short type, making the entire operation go away. */
3311 if (TREE_CODE (op0) == INTEGER_CST
3312 && TREE_CODE (op1) == NOP_EXPR
3313 && (TYPE_PRECISION (type1)
3314 > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op1, 0))))
3315 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op1, 0))))
3317 final_type = result_type;
3318 op1 = TREE_OPERAND (op1, 0);
3319 result_type = TREE_TYPE (op1);
3321 if (TREE_CODE (op1) == INTEGER_CST
3322 && TREE_CODE (op0) == NOP_EXPR
3323 && (TYPE_PRECISION (type0)
3324 > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0))))
3325 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3327 final_type = result_type;
3328 op0 = TREE_OPERAND (op0, 0);
3329 result_type = TREE_TYPE (op0);
3333 case TRUNC_MOD_EXPR:
3334 case FLOOR_MOD_EXPR:
3335 if (code1 == INTEGER_TYPE && integer_zerop (op1))
3336 cp_warning ("division by zero in `%E %% 0'", op0);
3337 else if (code1 == REAL_TYPE && real_zerop (op1))
3338 cp_warning ("division by zero in `%E %% 0.'", op0);
3340 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3342 /* Although it would be tempting to shorten always here, that loses
3343 on some targets, since the modulo instruction is undefined if the
3344 quotient can't be represented in the computation mode. We shorten
3345 only if unsigned or if dividing by something we know != -1. */
3346 shorten = ((TREE_CODE (op0) == NOP_EXPR
3347 && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3348 || (TREE_CODE (op1) == INTEGER_CST
3349 && (TREE_INT_CST_LOW (op1) != -1
3350 || TREE_INT_CST_HIGH (op1) != -1)));
3355 case TRUTH_ANDIF_EXPR:
3356 case TRUTH_ORIF_EXPR:
3357 case TRUTH_AND_EXPR:
3359 result_type = boolean_type_node;
3362 /* Shift operations: result has same type as first operand;
3363 always convert second operand to int.
3364 Also set SHORT_SHIFT if shifting rightward. */
3367 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3369 result_type = type0;
3370 if (TREE_CODE (op1) == INTEGER_CST)
3372 if (tree_int_cst_lt (op1, integer_zero_node))
3373 warning ("right shift count is negative");
3376 if (TREE_INT_CST_LOW (op1) | TREE_INT_CST_HIGH (op1))
3378 if (TREE_INT_CST_HIGH (op1) != 0
3379 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1)
3380 >= TYPE_PRECISION (type0)))
3381 warning ("right shift count >= width of type");
3384 /* Convert the shift-count to an integer, regardless of
3385 size of value being shifted. */
3386 if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3387 op1 = cp_convert (integer_type_node, op1);
3388 /* Avoid converting op1 to result_type later. */
3394 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3396 result_type = type0;
3397 if (TREE_CODE (op1) == INTEGER_CST)
3399 if (tree_int_cst_lt (op1, integer_zero_node))
3400 warning ("left shift count is negative");
3401 else if (TREE_INT_CST_HIGH (op1) != 0
3402 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1)
3403 >= TYPE_PRECISION (type0)))
3404 warning ("left shift count >= width of type");
3406 /* Convert the shift-count to an integer, regardless of
3407 size of value being shifted. */
3408 if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3409 op1 = cp_convert (integer_type_node, op1);
3410 /* Avoid converting op1 to result_type later. */
3417 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3419 result_type = type0;
3420 if (TREE_CODE (op1) == INTEGER_CST)
3422 if (tree_int_cst_lt (op1, integer_zero_node))
3423 warning ("%s rotate count is negative",
3424 (code == LROTATE_EXPR) ? "left" : "right");
3425 else if (TREE_INT_CST_HIGH (op1) != 0
3426 || ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (op1)
3427 >= TYPE_PRECISION (type0)))
3428 warning ("%s rotate count >= width of type",
3429 (code == LROTATE_EXPR) ? "left" : "right");
3431 /* Convert the shift-count to an integer, regardless of
3432 size of value being shifted. */
3433 if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3434 op1 = cp_convert (integer_type_node, op1);
3440 build_type = boolean_type_node;
3441 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
3442 || code0 == COMPLEX_TYPE)
3443 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
3444 || code1 == COMPLEX_TYPE))
3446 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3448 register tree tt0 = TYPE_MAIN_VARIANT (TREE_TYPE (type0));
3449 register tree tt1 = TYPE_MAIN_VARIANT (TREE_TYPE (type1));
3451 if (comp_target_types (type0, type1, 1))
3452 result_type = common_type (type0, type1);
3453 else if (tt0 == void_type_node)
3455 if (pedantic && TREE_CODE (tt1) == FUNCTION_TYPE
3456 && tree_int_cst_lt (TYPE_SIZE (type0), TYPE_SIZE (type1)))
3457 pedwarn ("ANSI C++ forbids comparison of `void *' with function pointer");
3458 else if (TREE_CODE (tt1) == OFFSET_TYPE)
3459 pedwarn ("ANSI C++ forbids conversion of a pointer to member to `void *'");
3461 else if (tt1 == void_type_node)
3463 if (pedantic && TREE_CODE (tt0) == FUNCTION_TYPE
3464 && tree_int_cst_lt (TYPE_SIZE (type1), TYPE_SIZE (type0)))
3465 pedwarn ("ANSI C++ forbids comparison of `void *' with function pointer");
3468 cp_pedwarn ("comparison of distinct pointer types `%T' and `%T' lacks a cast",
3471 if (result_type == NULL_TREE)
3472 result_type = ptr_type_node;
3474 else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
3475 && integer_zerop (op1))
3476 result_type = type0;
3477 else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
3478 && integer_zerop (op0))
3479 result_type = type1;
3480 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3482 result_type = type0;
3483 error ("ANSI C++ forbids comparison between pointer and integer");
3485 else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
3487 result_type = type1;
3488 error ("ANSI C++ forbids comparison between pointer and integer");
3490 else if (TYPE_PTRMEMFUNC_P (type0) && TREE_CODE (op1) == INTEGER_CST
3491 && integer_zerop (op1))
3493 op0 = build_component_ref (op0, index_identifier, NULL_TREE, 0);
3494 op1 = integer_zero_node;
3495 result_type = TREE_TYPE (op0);
3497 else if (TYPE_PTRMEMFUNC_P (type1) && TREE_CODE (op0) == INTEGER_CST
3498 && integer_zerop (op0))
3500 op0 = build_component_ref (op1, index_identifier, NULL_TREE, 0);
3501 op1 = integer_zero_node;
3502 result_type = TREE_TYPE (op0);
3504 else if (TYPE_PTRMEMFUNC_P (type0) && TYPE_PTRMEMFUNC_P (type1)
3505 && (TYPE_PTRMEMFUNC_FN_TYPE (type0)
3506 == TYPE_PTRMEMFUNC_FN_TYPE (type1)))
3508 /* The code we generate for the test is:
3510 (op0.index == op1.index
3511 && ((op1.index != -1 && op0.delta2 == op1.delta2)
3512 || op0.pfn == op1.pfn)) */
3514 tree index0 = build_component_ref (op0, index_identifier,
3516 tree index1 = save_expr (build_component_ref (op1, index_identifier,
3518 tree pfn0 = PFN_FROM_PTRMEMFUNC (op0);
3519 tree pfn1 = PFN_FROM_PTRMEMFUNC (op1);
3520 tree delta20 = DELTA2_FROM_PTRMEMFUNC (op0);
3521 tree delta21 = DELTA2_FROM_PTRMEMFUNC (op1);
3523 tree integer_neg_one_node
3524 = build_binary_op (MINUS_EXPR, integer_zero_node,
3525 integer_one_node, 1);
3526 e1 = build_binary_op (EQ_EXPR, index0, index1, 1);
3527 e2 = build_binary_op (NE_EXPR, index1, integer_neg_one_node, 1);
3528 e2 = build_binary_op (TRUTH_ANDIF_EXPR, e2,
3529 build_binary_op (EQ_EXPR, delta20, delta21, 1),
3531 e3 = build_binary_op (EQ_EXPR, pfn0, pfn1, 1);
3532 e2 = build_binary_op (TRUTH_ORIF_EXPR, e2, e3, 1);
3533 e2 = build_binary_op (TRUTH_ANDIF_EXPR, e1, e2, 1);
3534 if (code == EQ_EXPR)
3536 return build_binary_op (EQ_EXPR, e2, integer_zero_node, 1);
3538 else if (TYPE_PTRMEMFUNC_P (type0)
3539 && TYPE_PTRMEMFUNC_FN_TYPE (type0) == type1)
3541 tree index0 = build_component_ref (op0, index_identifier,
3544 tree pfn0 = PFN_FROM_PTRMEMFUNC (op0);
3545 tree delta20 = DELTA2_FROM_PTRMEMFUNC (op0);
3546 tree delta21 = integer_zero_node;
3548 tree integer_neg_one_node
3549 = build_binary_op (MINUS_EXPR, integer_zero_node, integer_one_node, 1);
3550 if (TREE_CODE (TREE_OPERAND (op1, 0)) == FUNCTION_DECL
3551 && DECL_VINDEX (TREE_OPERAND (op1, 0)))
3553 /* Map everything down one to make room for
3554 the null pointer to member. */
3555 index1 = size_binop (PLUS_EXPR,
3556 DECL_VINDEX (TREE_OPERAND (op1, 0)),
3558 op1 = integer_zero_node;
3559 delta21 = CLASSTYPE_VFIELD (TYPE_METHOD_BASETYPE
3560 (TREE_TYPE (type1)));
3561 delta21 = DECL_FIELD_BITPOS (delta21);
3562 delta21 = size_binop (FLOOR_DIV_EXPR, delta21,
3563 size_int (BITS_PER_UNIT));
3564 delta21 = convert (sizetype, delta21);
3567 index1 = integer_neg_one_node;
3569 tree nop1 = build1 (NOP_EXPR, TYPE_PTRMEMFUNC_FN_TYPE (type0),
3571 TREE_CONSTANT (nop1) = TREE_CONSTANT (op1);
3574 e1 = build_binary_op (EQ_EXPR, index0, index1, 1);
3575 e2 = build_binary_op (NE_EXPR, index1, integer_neg_one_node, 1);
3576 e2 = build_binary_op (TRUTH_ANDIF_EXPR, e2,
3577 build_binary_op (EQ_EXPR, delta20, delta21, 1),
3579 e3 = build_binary_op (EQ_EXPR, pfn0, op1, 1);
3580 e2 = build_binary_op (TRUTH_ORIF_EXPR, e2, e3, 1);
3581 e2 = build_binary_op (TRUTH_ANDIF_EXPR, e1, e2, 1);
3582 if (code == EQ_EXPR)
3584 return build_binary_op (EQ_EXPR, e2, integer_zero_node, 1);
3586 else if (TYPE_PTRMEMFUNC_P (type1)
3587 && TYPE_PTRMEMFUNC_FN_TYPE (type1) == type0)
3589 return build_binary_op (code, op1, op0, 1);
3595 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3596 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3598 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3600 if (comp_target_types (type0, type1, 1))
3601 result_type = common_type (type0, type1);
3604 cp_pedwarn ("comparison of distinct pointer types `%T' and `%T' lacks a cast",
3606 result_type = ptr_type_node;
3615 build_type = boolean_type_node;
3616 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3617 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3619 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
3621 if (comp_target_types (type0, type1, 1))
3622 result_type = common_type (type0, type1);
3625 cp_pedwarn ("comparison of distinct pointer types `%T' and `%T' lacks a cast",
3627 result_type = ptr_type_node;
3630 else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
3631 && integer_zerop (op1))
3632 result_type = type0;
3633 else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
3634 && integer_zerop (op0))
3635 result_type = type1;
3636 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
3638 result_type = type0;
3639 pedwarn ("ANSI C++ forbids comparison between pointer and integer");
3641 else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
3643 result_type = type1;
3644 pedwarn ("ANSI C++ forbids comparison between pointer and integer");
3652 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
3654 (code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE))
3656 int none_complex = (code0 != COMPLEX_TYPE && code1 != COMPLEX_TYPE);
3658 if (shorten || common || short_compare)
3659 result_type = common_type (type0, type1);
3661 /* For certain operations (which identify themselves by shorten != 0)
3662 if both args were extended from the same smaller type,
3663 do the arithmetic in that type and then extend.
3665 shorten !=0 and !=1 indicates a bitwise operation.
3666 For them, this optimization is safe only if
3667 both args are zero-extended or both are sign-extended.
3668 Otherwise, we might change the result.
3669 Eg, (short)-1 | (unsigned short)-1 is (int)-1
3670 but calculated in (unsigned short) it would be (unsigned short)-1. */
3672 if (shorten && none_complex)
3674 int unsigned0, unsigned1;
3675 tree arg0 = get_narrower (op0, &unsigned0);
3676 tree arg1 = get_narrower (op1, &unsigned1);
3677 /* UNS is 1 if the operation to be done is an unsigned one. */
3678 int uns = TREE_UNSIGNED (result_type);
3681 final_type = result_type;
3683 /* Handle the case that OP0 does not *contain* a conversion
3684 but it *requires* conversion to FINAL_TYPE. */
3686 if (op0 == arg0 && TREE_TYPE (op0) != final_type)
3687 unsigned0 = TREE_UNSIGNED (TREE_TYPE (op0));
3688 if (op1 == arg1 && TREE_TYPE (op1) != final_type)
3689 unsigned1 = TREE_UNSIGNED (TREE_TYPE (op1));
3691 /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE. */
3693 /* For bitwise operations, signedness of nominal type
3694 does not matter. Consider only how operands were extended. */
3698 /* Note that in all three cases below we refrain from optimizing
3699 an unsigned operation on sign-extended args.
3700 That would not be valid. */
3702 /* Both args variable: if both extended in same way
3703 from same width, do it in that width.
3704 Do it unsigned if args were zero-extended. */
3705 if ((TYPE_PRECISION (TREE_TYPE (arg0))
3706 < TYPE_PRECISION (result_type))
3707 && (TYPE_PRECISION (TREE_TYPE (arg1))
3708 == TYPE_PRECISION (TREE_TYPE (arg0)))
3709 && unsigned0 == unsigned1
3710 && (unsigned0 || !uns))
3712 = signed_or_unsigned_type (unsigned0,
3713 common_type (TREE_TYPE (arg0),
3715 else if (TREE_CODE (arg0) == INTEGER_CST
3716 && (unsigned1 || !uns)
3717 && (TYPE_PRECISION (TREE_TYPE (arg1))
3718 < TYPE_PRECISION (result_type))
3719 && (type = signed_or_unsigned_type (unsigned1,
3721 int_fits_type_p (arg0, type)))
3723 else if (TREE_CODE (arg1) == INTEGER_CST
3724 && (unsigned0 || !uns)
3725 && (TYPE_PRECISION (TREE_TYPE (arg0))
3726 < TYPE_PRECISION (result_type))
3727 && (type = signed_or_unsigned_type (unsigned0,
3729 int_fits_type_p (arg1, type)))
3733 /* Shifts can be shortened if shifting right. */
3738 tree arg0 = get_narrower (op0, &unsigned_arg);
3740 final_type = result_type;
3742 if (arg0 == op0 && final_type == TREE_TYPE (op0))
3743 unsigned_arg = TREE_UNSIGNED (TREE_TYPE (op0));
3745 if (TYPE_PRECISION (TREE_TYPE (arg0)) < TYPE_PRECISION (result_type)
3746 /* We can shorten only if the shift count is less than the
3747 number of bits in the smaller type size. */
3748 && TREE_INT_CST_HIGH (op1) == 0
3749 && TYPE_PRECISION (TREE_TYPE (arg0)) > TREE_INT_CST_LOW (op1)
3750 /* If arg is sign-extended and then unsigned-shifted,
3751 we can simulate this with a signed shift in arg's type
3752 only if the extended result is at least twice as wide
3753 as the arg. Otherwise, the shift could use up all the
3754 ones made by sign-extension and bring in zeros.
3755 We can't optimize that case at all, but in most machines
3756 it never happens because available widths are 2**N. */
3757 && (!TREE_UNSIGNED (final_type)
3759 || (((unsigned) 2 * TYPE_PRECISION (TREE_TYPE (arg0)))
3760 <= TYPE_PRECISION (result_type))))
3762 /* Do an unsigned shift if the operand was zero-extended. */
3764 = signed_or_unsigned_type (unsigned_arg,
3766 /* Convert value-to-be-shifted to that type. */
3767 if (TREE_TYPE (op0) != result_type)
3768 op0 = cp_convert (result_type, op0);
3773 /* Comparison operations are shortened too but differently.
3774 They identify themselves by setting short_compare = 1. */
3778 /* Don't write &op0, etc., because that would prevent op0
3779 from being kept in a register.
3780 Instead, make copies of the our local variables and
3781 pass the copies by reference, then copy them back afterward. */
3782 tree xop0 = op0, xop1 = op1, xresult_type = result_type;
3783 enum tree_code xresultcode = resultcode;
3785 = shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
3787 return cp_convert (boolean_type_node, val);
3788 op0 = xop0, op1 = xop1;
3790 resultcode = xresultcode;
3793 if (short_compare && warn_sign_compare)
3795 int op0_signed = ! TREE_UNSIGNED (TREE_TYPE (orig_op0));
3796 int op1_signed = ! TREE_UNSIGNED (TREE_TYPE (orig_op1));
3798 int unsignedp0, unsignedp1;
3799 tree primop0 = get_narrower (op0, &unsignedp0);
3800 tree primop1 = get_narrower (op1, &unsignedp1);
3802 /* Check for comparison of different enum types. */
3803 if (TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
3804 && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE
3805 && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0))
3806 != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
3808 cp_warning ("comparison between `%#T' and `%#T'",
3809 TREE_TYPE (orig_op0), TREE_TYPE (orig_op1));
3812 /* Give warnings for comparisons between signed and unsigned
3813 quantities that may fail. */
3814 /* Do the checking based on the original operand trees, so that
3815 casts will be considered, but default promotions won't be. */
3817 /* Do not warn if the comparison is being done in a signed type,
3818 since the signed type will only be chosen if it can represent
3819 all the values of the unsigned type. */
3820 if (! TREE_UNSIGNED (result_type))
3822 /* Do not warn if both operands are unsigned. */
3823 else if (op0_signed == op1_signed)
3825 /* Do not warn if the signed quantity is an unsuffixed
3826 integer literal (or some static constant expression
3827 involving such literals) and it is non-negative. */
3828 else if ((op0_signed && TREE_CODE (orig_op0) == INTEGER_CST
3829 && tree_int_cst_sgn (orig_op0) >= 0)
3830 || (op1_signed && TREE_CODE (orig_op1) == INTEGER_CST
3831 && tree_int_cst_sgn (orig_op1) >= 0))
3833 /* Do not warn if the comparison is an equality operation,
3834 the unsigned quantity is an integral constant and it does
3835 not use the most significant bit of result_type. */
3836 else if ((resultcode == EQ_EXPR || resultcode == NE_EXPR)
3837 && ((op0_signed && TREE_CODE (orig_op1) == INTEGER_CST
3838 && int_fits_type_p (orig_op1,
3839 signed_type (result_type)))
3840 || (op1_signed && TREE_CODE (orig_op0) == INTEGER_CST
3841 && int_fits_type_p (orig_op0,
3842 signed_type (result_type)))))
3845 warning ("comparison between signed and unsigned");
3847 /* Warn if two unsigned values are being compared in a size
3848 larger than their original size, and one (and only one) is the
3849 result of a `~' operator. This comparison will always fail.
3851 Also warn if one operand is a constant, and the constant does not
3852 have all bits set that are set in the ~ operand when it is
3855 if ((TREE_CODE (primop0) == BIT_NOT_EXPR)
3856 ^ (TREE_CODE (primop1) == BIT_NOT_EXPR))
3858 if (TREE_CODE (primop0) == BIT_NOT_EXPR)
3859 primop0 = get_narrower (TREE_OPERAND (op0, 0), &unsignedp0);
3860 if (TREE_CODE (primop1) == BIT_NOT_EXPR)
3861 primop1 = get_narrower (TREE_OPERAND (op1, 0), &unsignedp1);
3863 if (TREE_CODE (primop0) == INTEGER_CST
3864 || TREE_CODE (primop1) == INTEGER_CST)
3867 HOST_WIDE_INT constant, mask;
3871 if (TREE_CODE (primop0) == INTEGER_CST)
3874 unsignedp = unsignedp1;
3875 constant = TREE_INT_CST_LOW (primop0);
3880 unsignedp = unsignedp0;
3881 constant = TREE_INT_CST_LOW (primop1);
3884 bits = TYPE_PRECISION (TREE_TYPE (primop));
3885 if (bits < TYPE_PRECISION (result_type)
3886 && bits < HOST_BITS_PER_LONG && unsignedp)
3888 mask = (~ (HOST_WIDE_INT) 0) << bits;
3889 if ((mask & constant) != mask)
3890 warning ("comparison of promoted ~unsigned with constant");
3893 else if (unsignedp0 && unsignedp1
3894 && (TYPE_PRECISION (TREE_TYPE (primop0))
3895 < TYPE_PRECISION (result_type))
3896 && (TYPE_PRECISION (TREE_TYPE (primop1))
3897 < TYPE_PRECISION (result_type)))
3898 warning ("comparison of promoted ~unsigned with unsigned");
3903 /* At this point, RESULT_TYPE must be nonzero to avoid an error message.
3904 If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
3905 Then the expression will be built.
3906 It will be given type FINAL_TYPE if that is nonzero;
3907 otherwise, it will be given type RESULT_TYPE. */
3911 cp_error ("invalid operands `%T' and `%T' to binary `%O'",
3912 TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), error_code);
3913 return error_mark_node;
3916 /* Issue warnings about peculiar, but legal, uses of NULL. */
3917 if (/* It's reasonable to use pointer values as operands of &&
3918 and ||, so NULL is no exception. */
3919 !(code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
3920 && (/* If OP0 is NULL and OP1 is not a pointer, or vice versa. */
3921 (orig_op0 == null_node
3922 && TREE_CODE (TREE_TYPE (op1)) != POINTER_TYPE)
3923 /* Or vice versa. */
3924 || (orig_op1 == null_node
3925 && TREE_CODE (TREE_TYPE (op0)) != POINTER_TYPE)
3926 /* Or, both are NULL and the operation was not a comparison. */
3927 || (orig_op0 == null_node && orig_op1 == null_node
3928 && code != EQ_EXPR && code != NE_EXPR)))
3929 /* Some sort of arithmetic operation involving NULL was
3930 performed. Note that pointer-difference and pointer-addition
3931 have already been handled above, and so we don't end up here in
3933 cp_warning ("NULL used in arithmetic");
3937 if (TREE_TYPE (op0) != result_type)
3938 op0 = cp_convert (result_type, op0);
3939 if (TREE_TYPE (op1) != result_type)
3940 op1 = cp_convert (result_type, op1);
3943 if (build_type == NULL_TREE)
3944 build_type = result_type;
3947 register tree result = build (resultcode, build_type, op0, op1);
3948 register tree folded;
3950 folded = fold (result);
3951 if (folded == result)
3952 TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
3953 if (final_type != 0)
3954 return cp_convert (final_type, folded);
3959 /* Return a tree for the sum or difference (RESULTCODE says which)
3960 of pointer PTROP and integer INTOP. */
3963 pointer_int_sum (resultcode, ptrop, intop)
3964 enum tree_code resultcode;
3965 register tree ptrop, intop;
3969 register tree result;
3970 register tree folded = fold (intop);
3972 /* The result is a pointer of the same type that is being added. */
3974 register tree result_type = TREE_TYPE (ptrop);
3976 if (!complete_type_or_else (result_type))
3977 return error_mark_node;
3979 if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
3981 if (pedantic || warn_pointer_arith)
3982 pedwarn ("ANSI C++ forbids using pointer of type `void *' in arithmetic");
3983 size_exp = integer_one_node;
3985 else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
3987 if (pedantic || warn_pointer_arith)
3988 pedwarn ("ANSI C++ forbids using pointer to a function in arithmetic");
3989 size_exp = integer_one_node;
3991 else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
3993 if (pedantic || warn_pointer_arith)
3994 pedwarn ("ANSI C++ forbids using pointer to a method in arithmetic");
3995 size_exp = integer_one_node;
3997 else if (TREE_CODE (TREE_TYPE (result_type)) == OFFSET_TYPE)
3999 if (pedantic || warn_pointer_arith)
4000 pedwarn ("ANSI C++ forbids using pointer to a member in arithmetic");
4001 size_exp = integer_one_node;
4004 size_exp = size_in_bytes (complete_type (TREE_TYPE (result_type)));
4006 /* Needed to make OOPS V2R3 work. */
4008 if (TREE_CODE (intop) == INTEGER_CST
4009 && TREE_INT_CST_LOW (intop) == 0
4010 && TREE_INT_CST_HIGH (intop) == 0)
4013 /* If what we are about to multiply by the size of the elements
4014 contains a constant term, apply distributive law
4015 and multiply that constant term separately.
4016 This helps produce common subexpressions. */
4018 if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
4019 && ! TREE_CONSTANT (intop)
4020 && TREE_CONSTANT (TREE_OPERAND (intop, 1))
4021 && TREE_CONSTANT (size_exp))
4023 enum tree_code subcode = resultcode;
4024 if (TREE_CODE (intop) == MINUS_EXPR)
4025 subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
4026 ptrop = build_binary_op (subcode, ptrop, TREE_OPERAND (intop, 1), 1);
4027 intop = TREE_OPERAND (intop, 0);
4030 /* Convert the integer argument to a type the same size as sizetype
4031 so the multiply won't overflow spuriously. */
4033 if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype))
4034 intop = cp_convert (type_for_size (TYPE_PRECISION (sizetype), 0), intop);
4036 /* Replace the integer argument with a suitable product by the object size.
4037 Do this multiplication as signed, then convert to the appropriate
4038 pointer type (actually unsigned integral). */
4040 intop = cp_convert (result_type,
4041 build_binary_op (MULT_EXPR, intop,
4042 cp_convert (TREE_TYPE (intop),
4046 /* Create the sum or difference. */
4048 result = build (resultcode, result_type, ptrop, intop);
4050 folded = fold (result);
4051 if (folded == result)
4052 TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop);
4056 /* Return a tree for the difference of pointers OP0 and OP1.
4057 The resulting tree has type int. */
4060 pointer_diff (op0, op1, ptrtype)
4061 register tree op0, op1;
4062 register tree ptrtype;
4064 register tree result, folded;
4065 tree restype = ptrdiff_type_node;
4066 tree target_type = TREE_TYPE (ptrtype);
4068 if (!complete_type_or_else (target_type))
4069 return error_mark_node;
4071 if (pedantic || warn_pointer_arith)
4073 if (TREE_CODE (target_type) == VOID_TYPE)
4074 pedwarn ("ANSI C++ forbids using pointer of type `void *' in subtraction");
4075 if (TREE_CODE (target_type) == FUNCTION_TYPE)
4076 pedwarn ("ANSI C++ forbids using pointer to a function in subtraction");
4077 if (TREE_CODE (target_type) == METHOD_TYPE)
4078 pedwarn ("ANSI C++ forbids using pointer to a method in subtraction");
4079 if (TREE_CODE (target_type) == OFFSET_TYPE)
4080 pedwarn ("ANSI C++ forbids using pointer to a member in subtraction");
4083 /* First do the subtraction as integers;
4084 then drop through to build the divide operator. */
4086 op0 = build_binary_op (MINUS_EXPR, cp_convert (restype, op0),
4087 cp_convert (restype, op1), 1);
4089 /* This generates an error if op1 is a pointer to an incomplete type. */
4090 if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (op1))) == 0)
4091 error ("arithmetic on pointer to an incomplete type");
4093 op1 = ((TREE_CODE (target_type) == VOID_TYPE
4094 || TREE_CODE (target_type) == FUNCTION_TYPE
4095 || TREE_CODE (target_type) == METHOD_TYPE
4096 || TREE_CODE (target_type) == OFFSET_TYPE)
4098 : size_in_bytes (target_type));
4100 /* Do the division. */
4102 result = build (EXACT_DIV_EXPR, restype, op0, cp_convert (restype, op1));
4104 folded = fold (result);
4105 if (folded == result)
4106 TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
4110 /* Handle the case of taking the address of a COMPONENT_REF.
4111 Called by `build_unary_op' and `build_up_reference'.
4113 ARG is the COMPONENT_REF whose address we want.
4114 ARGTYPE is the pointer type that this address should have.
4115 MSG is an error message to print if this COMPONENT_REF is not
4116 addressable (such as a bitfield). */
4119 build_component_addr (arg, argtype, msg)
4123 tree field = TREE_OPERAND (arg, 1);
4124 tree basetype = decl_type_context (field);
4125 tree rval = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0);
4127 my_friendly_assert (TREE_CODE (field) == FIELD_DECL, 981018);
4129 if (DECL_C_BIT_FIELD (field))
4131 error (msg, IDENTIFIER_POINTER (DECL_NAME (field)));
4132 return error_mark_node;
4135 if (TREE_CODE (field) == FIELD_DECL
4136 && TYPE_USES_COMPLEX_INHERITANCE (basetype))
4138 /* Can't convert directly to ARGTYPE, since that
4139 may have the same pointer type as one of our
4141 rval = build1 (NOP_EXPR, argtype,
4142 convert_pointer_to (basetype, rval));
4143 TREE_CONSTANT (rval) = TREE_CONSTANT (TREE_OPERAND (rval, 0));
4146 /* This conversion is harmless. */
4147 rval = convert_force (argtype, rval, 0);
4149 if (! integer_zerop (DECL_FIELD_BITPOS (field)))
4151 tree offset = size_binop (EASY_DIV_EXPR, DECL_FIELD_BITPOS (field),
4152 size_int (BITS_PER_UNIT));
4153 int flag = TREE_CONSTANT (rval);
4154 offset = convert (sizetype, offset);
4155 rval = fold (build (PLUS_EXPR, argtype,
4156 rval, cp_convert (argtype, offset)));
4157 TREE_CONSTANT (rval) = flag;
4162 /* Construct and perhaps optimize a tree representation
4163 for a unary operation. CODE, a tree_code, specifies the operation
4164 and XARG is the operand. */
4167 build_x_unary_op (code, xarg)
4168 enum tree_code code;
4171 if (processing_template_decl)
4172 return build_min_nt (code, xarg, NULL_TREE);
4174 /* & rec, on incomplete RECORD_TYPEs is the simple opr &, not an
4176 if (code == ADDR_EXPR
4177 && TREE_CODE (xarg) != TEMPLATE_ID_EXPR
4178 && ((IS_AGGR_TYPE_CODE (TREE_CODE (TREE_TYPE (xarg)))
4179 && TYPE_SIZE (TREE_TYPE (xarg)) == NULL_TREE)
4180 || (TREE_CODE (xarg) == OFFSET_REF)))
4181 /* don't look for a function */;
4186 rval = build_new_op (code, LOOKUP_NORMAL, xarg,
4187 NULL_TREE, NULL_TREE);
4188 if (rval || code != ADDR_EXPR)
4192 if (code == ADDR_EXPR)
4194 if (TREE_CODE (xarg) == TARGET_EXPR)
4195 warning ("taking address of temporary");
4198 return build_unary_op (code, xarg, 0);
4201 /* Just like truthvalue_conversion, but we want a CLEANUP_POINT_EXPR. */
4204 condition_conversion (expr)
4208 if (processing_template_decl)
4210 t = cp_convert (boolean_type_node, expr);
4211 t = fold (build1 (CLEANUP_POINT_EXPR, boolean_type_node, t));
4215 /* C++: Must handle pointers to members.
4217 Perhaps type instantiation should be extended to handle conversion
4218 from aggregates to types we don't yet know we want? (Or are those
4219 cases typically errors which should be reported?)
4221 NOCONVERT nonzero suppresses the default promotions
4222 (such as from short to int). */
4225 build_unary_op (code, xarg, noconvert)
4226 enum tree_code code;
4230 /* No default_conversion here. It causes trouble for ADDR_EXPR. */
4231 register tree arg = xarg;
4232 register tree argtype = 0;
4233 char *errstring = NULL;
4236 if (arg == error_mark_node)
4237 return error_mark_node;
4242 /* This is used for unary plus, because a CONVERT_EXPR
4243 is enough to prevent anybody from looking inside for
4244 associativity, but won't generate any code. */
4245 if (!(arg = build_expr_type_conversion
4246 (WANT_ARITH | WANT_ENUM | WANT_POINTER, arg, 1)))
4247 errstring = "wrong type argument to unary plus";
4251 arg = default_conversion (arg);
4252 arg = build1 (NON_LVALUE_EXPR, TREE_TYPE (arg), arg);
4253 TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
4258 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, 1)))
4259 errstring = "wrong type argument to unary minus";
4260 else if (!noconvert)
4261 arg = default_conversion (arg);
4265 if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4269 arg = default_conversion (arg);
4271 else if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM,
4273 errstring = "wrong type argument to bit-complement";
4274 else if (!noconvert)
4275 arg = default_conversion (arg);
4279 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, 1)))
4280 errstring = "wrong type argument to abs";
4281 else if (!noconvert)
4282 arg = default_conversion (arg);
4286 /* Conjugating a real value is a no-op, but allow it anyway. */
4287 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, 1)))
4288 errstring = "wrong type argument to conjugation";
4289 else if (!noconvert)
4290 arg = default_conversion (arg);
4293 case TRUTH_NOT_EXPR:
4294 arg = cp_convert (boolean_type_node, arg);
4295 val = invert_truthvalue (arg);
4296 if (arg != error_mark_node)
4298 errstring = "in argument to unary !";
4305 if (TREE_CODE (arg) == COMPLEX_CST)
4306 return TREE_REALPART (arg);
4307 else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4308 return fold (build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
4313 if (TREE_CODE (arg) == COMPLEX_CST)
4314 return TREE_IMAGPART (arg);
4315 else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4316 return fold (build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
4318 return cp_convert (TREE_TYPE (arg), integer_zero_node);
4320 case PREINCREMENT_EXPR:
4321 case POSTINCREMENT_EXPR:
4322 case PREDECREMENT_EXPR:
4323 case POSTDECREMENT_EXPR:
4324 /* Handle complex lvalues (when permitted)
4325 by reduction to simpler cases. */
4327 val = unary_complex_lvalue (code, arg);
4331 /* Increment or decrement the real part of the value,
4332 and don't change the imaginary part. */
4333 if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4337 arg = stabilize_reference (arg);
4338 real = build_unary_op (REALPART_EXPR, arg, 1);
4339 imag = build_unary_op (IMAGPART_EXPR, arg, 1);
4340 return build (COMPLEX_EXPR, TREE_TYPE (arg),
4341 build_unary_op (code, real, 1), imag);
4344 /* Report invalid types. */
4346 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_POINTER,
4349 if (code == PREINCREMENT_EXPR)
4350 errstring ="no pre-increment operator for type";
4351 else if (code == POSTINCREMENT_EXPR)
4352 errstring ="no post-increment operator for type";
4353 else if (code == PREDECREMENT_EXPR)
4354 errstring ="no pre-decrement operator for type";
4356 errstring ="no post-decrement operator for type";
4360 /* Report something read-only. */
4362 if (CP_TYPE_CONST_P (TREE_TYPE (arg))
4363 || TREE_READONLY (arg))
4364 readonly_error (arg, ((code == PREINCREMENT_EXPR
4365 || code == POSTINCREMENT_EXPR)
4366 ? "increment" : "decrement"),
4371 tree result_type = TREE_TYPE (arg);
4373 arg = get_unwidened (arg, 0);
4374 argtype = TREE_TYPE (arg);
4376 /* ARM $5.2.5 last annotation says this should be forbidden. */
4377 if (TREE_CODE (argtype) == ENUMERAL_TYPE)
4378 pedwarn ("ANSI C++ forbids %sing an enum",
4379 (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
4380 ? "increment" : "decrement");
4382 /* Compute the increment. */
4384 if (TREE_CODE (argtype) == POINTER_TYPE)
4386 enum tree_code tmp = TREE_CODE (TREE_TYPE (argtype));
4387 if (TYPE_SIZE (complete_type (TREE_TYPE (argtype))) == 0)
4388 cp_error ("cannot %s a pointer to incomplete type `%T'",
4389 ((code == PREINCREMENT_EXPR
4390 || code == POSTINCREMENT_EXPR)
4391 ? "increment" : "decrement"), TREE_TYPE (argtype));
4392 else if ((pedantic || warn_pointer_arith)
4393 && (tmp == FUNCTION_TYPE || tmp == METHOD_TYPE
4394 || tmp == VOID_TYPE || tmp == OFFSET_TYPE))
4395 cp_pedwarn ("ANSI C++ forbids %sing a pointer of type `%T'",
4396 ((code == PREINCREMENT_EXPR
4397 || code == POSTINCREMENT_EXPR)
4398 ? "increment" : "decrement"), argtype);
4399 inc = c_sizeof_nowarn (TREE_TYPE (argtype));
4402 inc = integer_one_node;
4404 inc = cp_convert (argtype, inc);
4406 /* Handle incrementing a cast-expression. */
4408 switch (TREE_CODE (arg))
4413 case FIX_TRUNC_EXPR:
4414 case FIX_FLOOR_EXPR:
4415 case FIX_ROUND_EXPR:
4418 tree incremented, modify, value, compound;
4419 if (! lvalue_p (arg) && pedantic)
4420 pedwarn ("cast to non-reference type used as lvalue");
4421 arg = stabilize_reference (arg);
4422 if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
4425 value = save_expr (arg);
4426 incremented = build (((code == PREINCREMENT_EXPR
4427 || code == POSTINCREMENT_EXPR)
4428 ? PLUS_EXPR : MINUS_EXPR),
4429 argtype, value, inc);
4430 TREE_SIDE_EFFECTS (incremented) = 1;
4432 modify = build_modify_expr (arg, NOP_EXPR, incremented);
4433 compound = build (COMPOUND_EXPR, TREE_TYPE (arg), modify, value);
4435 /* Eliminate warning about unused result of + or -. */
4436 TREE_NO_UNUSED_WARNING (compound) = 1;
4444 /* Complain about anything else that is not a true lvalue. */
4445 if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
4446 || code == POSTINCREMENT_EXPR)
4447 ? "increment" : "decrement")))
4448 return error_mark_node;
4450 /* Forbid using -- on `bool'. */
4451 if (TREE_TYPE (arg) == boolean_type_node)
4453 if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
4455 cp_error ("invalid use of `--' on bool variable `%D'", arg);
4456 return error_mark_node;
4459 /* This will only work if someone can convince Kenner to accept
4460 my patch to expand_increment. (jason) */
4461 val = build (code, TREE_TYPE (arg), arg, inc);
4463 if (code == POSTINCREMENT_EXPR)
4465 arg = stabilize_reference (arg);
4466 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg,
4468 TREE_SIDE_EFFECTS (val) = 1;
4469 arg = save_expr (arg);
4470 val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4471 val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4474 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg,
4479 val = build (code, TREE_TYPE (arg), arg, inc);
4481 TREE_SIDE_EFFECTS (val) = 1;
4482 return cp_convert (result_type, val);
4486 /* Note that this operation never does default_conversion
4487 regardless of NOCONVERT. */
4489 argtype = lvalue_type (arg);
4490 if (TREE_CODE (argtype) == REFERENCE_TYPE)
4494 build_pointer_type (TREE_TYPE (argtype)), arg);
4495 TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
4498 else if (pedantic && DECL_MAIN_P (arg))
4500 pedwarn ("taking address of function `main'");
4502 /* Let &* cancel out to simplify resulting code. */
4503 if (TREE_CODE (arg) == INDIRECT_REF)
4505 /* We don't need to have `current_class_ptr' wrapped in a
4506 NON_LVALUE_EXPR node. */
4507 if (arg == current_class_ref)
4508 return current_class_ptr;
4510 arg = TREE_OPERAND (arg, 0);
4511 if (TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE)
4515 build_pointer_type (TREE_TYPE (TREE_TYPE (arg))), arg);
4516 TREE_CONSTANT (arg) = TREE_CONSTANT (TREE_OPERAND (arg, 0));
4518 else if (lvalue_p (arg))
4519 /* Don't let this be an lvalue. */
4520 return non_lvalue (arg);
4524 /* For &x[y], return x+y */
4525 if (TREE_CODE (arg) == ARRAY_REF)
4527 if (mark_addressable (TREE_OPERAND (arg, 0)) == 0)
4528 return error_mark_node;
4529 return build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0),
4530 TREE_OPERAND (arg, 1), 1);
4533 /* Uninstantiated types are all functions. Taking the
4534 address of a function is a no-op, so just return the
4537 if (TREE_CODE (arg) == IDENTIFIER_NODE
4538 && IDENTIFIER_OPNAME_P (arg))
4540 my_friendly_abort (117);
4541 /* We don't know the type yet, so just work around the problem.
4542 We know that this will resolve to an lvalue. */
4543 return build1 (ADDR_EXPR, unknown_type_node, arg);
4546 if (TREE_CODE (arg) == TEMPLATE_ID_EXPR)
4551 /* We don't require a match here; it's possible that the
4552 context (like a cast to a particular type) will resolve
4553 the particular choice of template. */
4554 fn = determine_specialization (arg,
4562 fn = instantiate_template (fn, targs);
4563 mark_addressable (fn);
4564 return build_unary_op (ADDR_EXPR, fn, 0);
4567 return build1 (ADDR_EXPR, unknown_type_node, arg);
4569 else if (type_unknown_p (arg))
4570 return build1 (ADDR_EXPR, unknown_type_node, arg);
4572 /* Handle complex lvalues (when permitted)
4573 by reduction to simpler cases. */
4574 val = unary_complex_lvalue (code, arg);
4578 switch (TREE_CODE (arg))
4583 case FIX_TRUNC_EXPR:
4584 case FIX_FLOOR_EXPR:
4585 case FIX_ROUND_EXPR:
4587 if (! lvalue_p (arg) && pedantic)
4588 pedwarn ("taking the address of a cast to non-reference type");
4595 /* Allow the address of a constructor if all the elements
4597 if (TREE_CODE (arg) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (arg)
4598 && TREE_CONSTANT (arg))
4600 /* Anything not already handled and not a true memory reference
4602 else if (TREE_CODE (argtype) != FUNCTION_TYPE
4603 && TREE_CODE (argtype) != METHOD_TYPE
4604 && !lvalue_or_else (arg, "unary `&'"))
4605 return error_mark_node;
4607 if (argtype != error_mark_node)
4608 argtype = build_pointer_type (argtype);
4610 if (mark_addressable (arg) == 0)
4611 return error_mark_node;
4616 if (TREE_CODE (arg) == COMPONENT_REF)
4617 addr = build_component_addr
4619 "attempt to take address of bit-field structure member `%s'");
4621 addr = build1 (code, argtype, arg);
4623 /* Address of a static or external variable or
4624 function counts as a constant */
4626 TREE_CONSTANT (addr) = 1;
4628 if (TREE_CODE (argtype) == POINTER_TYPE
4629 && TREE_CODE (TREE_TYPE (argtype)) == METHOD_TYPE)
4631 build_ptrmemfunc_type (argtype);
4632 addr = build_ptrmemfunc (argtype, addr, 0);
4645 argtype = TREE_TYPE (arg);
4646 return fold (build1 (code, argtype, arg));
4650 return error_mark_node;
4654 /* If CONVERSIONS is a conversion expression or a nested sequence of such,
4655 convert ARG with the same conversions in the same order
4656 and return the result. */
4659 convert_sequence (conversions, arg)
4663 switch (TREE_CODE (conversions))
4668 case FIX_TRUNC_EXPR:
4669 case FIX_FLOOR_EXPR:
4670 case FIX_ROUND_EXPR:
4672 return cp_convert (TREE_TYPE (conversions),
4673 convert_sequence (TREE_OPERAND (conversions, 0),
4682 /* Apply unary lvalue-demanding operator CODE to the expression ARG
4683 for certain kinds of expressions which are not really lvalues
4684 but which we can accept as lvalues.
4686 If ARG is not a kind of expression we can handle, return zero. */
4689 unary_complex_lvalue (code, arg)
4690 enum tree_code code;
4693 /* Handle (a, b) used as an "lvalue". */
4694 if (TREE_CODE (arg) == COMPOUND_EXPR)
4696 tree real_result = build_unary_op (code, TREE_OPERAND (arg, 1), 0);
4697 return build (COMPOUND_EXPR, TREE_TYPE (real_result),
4698 TREE_OPERAND (arg, 0), real_result);
4701 /* Handle (a ? b : c) used as an "lvalue". */
4702 if (TREE_CODE (arg) == COND_EXPR
4703 || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR)
4704 return rationalize_conditional_expr (code, arg);
4706 if (TREE_CODE (arg) == MODIFY_EXPR
4707 || TREE_CODE (arg) == PREINCREMENT_EXPR
4708 || TREE_CODE (arg) == PREDECREMENT_EXPR)
4709 return unary_complex_lvalue
4710 (code, build (COMPOUND_EXPR, TREE_TYPE (TREE_OPERAND (arg, 0)),
4711 arg, TREE_OPERAND (arg, 0)));
4713 if (code != ADDR_EXPR)
4716 /* Handle (a = b) used as an "lvalue" for `&'. */
4717 if (TREE_CODE (arg) == MODIFY_EXPR
4718 || TREE_CODE (arg) == INIT_EXPR)
4720 tree real_result = build_unary_op (code, TREE_OPERAND (arg, 0), 0);
4721 arg = build (COMPOUND_EXPR, TREE_TYPE (real_result), arg, real_result);
4722 TREE_NO_UNUSED_WARNING (arg) = 1;
4726 if (TREE_CODE (TREE_TYPE (arg)) == FUNCTION_TYPE
4727 || TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
4728 || TREE_CODE (TREE_TYPE (arg)) == OFFSET_TYPE)
4730 /* The representation of something of type OFFSET_TYPE
4731 is really the representation of a pointer to it.
4732 Here give the representation its true type. */
4735 my_friendly_assert (TREE_CODE (arg) != SCOPE_REF, 313);
4737 if (TREE_CODE (arg) != OFFSET_REF)
4740 t = TREE_OPERAND (arg, 1);
4742 /* Check all this code for right semantics. */
4743 if (TREE_CODE (t) == FUNCTION_DECL)
4745 if (DECL_DESTRUCTOR_P (t))
4746 cp_error ("taking address of destructor");
4747 return build_unary_op (ADDR_EXPR, t, 0);
4749 if (TREE_CODE (t) == VAR_DECL)
4750 return build_unary_op (ADDR_EXPR, t, 0);
4755 if (TREE_OPERAND (arg, 0)
4756 && ! is_dummy_object (TREE_OPERAND (arg, 0))
4757 && TREE_CODE (t) != FIELD_DECL)
4759 cp_error ("taking address of bound pointer-to-member expression");
4760 return error_mark_node;
4763 type = build_offset_type (DECL_FIELD_CONTEXT (t), TREE_TYPE (t));
4764 type = build_pointer_type (type);
4766 t = make_node (PTRMEM_CST);
4767 TREE_TYPE (t) = type;
4768 PTRMEM_CST_MEMBER (t) = TREE_OPERAND (arg, 1);
4774 /* We permit compiler to make function calls returning
4775 objects of aggregate type look like lvalues. */
4779 if (TREE_CODE (targ) == SAVE_EXPR)
4780 targ = TREE_OPERAND (targ, 0);
4782 if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (TREE_TYPE (targ)))
4784 if (TREE_CODE (arg) == SAVE_EXPR)
4787 targ = build_cplus_new (TREE_TYPE (arg), arg);
4788 return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), targ);
4791 if (TREE_CODE (arg) == SAVE_EXPR && TREE_CODE (targ) == INDIRECT_REF)
4792 return build (SAVE_EXPR, build_pointer_type (TREE_TYPE (arg)),
4793 TREE_OPERAND (targ, 0), current_function_decl, NULL);
4796 /* Don't let anything else be handled specially. */
4800 /* Mark EXP saying that we need to be able to take the
4801 address of it; it should not be allocated in a register.
4802 Value is 1 if successful.
4804 C++: we do not allow `current_class_ptr' to be addressable. */
4807 mark_addressable (exp)
4810 register tree x = exp;
4812 if (TREE_ADDRESSABLE (x) == 1)
4816 switch (TREE_CODE (x))
4823 x = TREE_OPERAND (x, 0);
4827 if (x == current_class_ptr)
4829 if (! flag_this_is_variable)
4830 error ("address of `this' not available");
4831 TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later */
4832 put_var_into_stack (x);
4836 if (TREE_STATIC (x) && TREE_READONLY (x)
4837 && DECL_RTL (x) != 0
4838 && ! DECL_IN_MEMORY_P (x))
4840 /* We thought this would make a good constant variable,
4841 but we were wrong. */
4842 push_obstacks_nochange ();
4843 end_temporary_allocation ();
4845 TREE_ASM_WRITTEN (x) = 0;
4847 rest_of_decl_compilation (x, 0, IDENTIFIER_LOCAL_VALUE (x) == 0,
4849 TREE_ADDRESSABLE (x) = 1;
4855 /* Caller should not be trying to mark initialized
4856 constant fields addressable. */
4857 my_friendly_assert (DECL_LANG_SPECIFIC (x) == 0
4858 || DECL_IN_AGGR_P (x) == 0
4860 || DECL_EXTERNAL (x), 314);
4864 if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
4865 && !DECL_ARTIFICIAL (x) && extra_warnings)
4866 cp_warning ("address requested for `%D', which is declared `register'",
4868 put_var_into_stack (x);
4869 TREE_ADDRESSABLE (x) = 1;
4873 if (DECL_LANG_SPECIFIC (x) != 0)
4875 x = DECL_MAIN_VARIANT (x);
4876 /* We have to test both conditions here. The first may be
4877 non-zero in the case of processing a default function. The
4878 second may be non-zero in the case of a template function. */
4879 if (DECL_TEMPLATE_INFO (x) && !DECL_TEMPLATE_SPECIALIZATION (x))
4882 TREE_ADDRESSABLE (x) = 1;
4884 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
4888 TREE_ADDRESSABLE (x) = 1;
4892 TREE_ADDRESSABLE (x) = 1;
4893 mark_addressable (TREE_OPERAND (x, 0));
4901 /* Build and return a conditional expression IFEXP ? OP1 : OP2. */
4904 build_x_conditional_expr (ifexp, op1, op2)
4905 tree ifexp, op1, op2;
4907 if (processing_template_decl)
4908 return build_min_nt (COND_EXPR, ifexp, op1, op2);
4910 return build_new_op (COND_EXPR, LOOKUP_NORMAL, ifexp, op1, op2);
4914 build_conditional_expr (ifexp, op1, op2)
4915 tree ifexp, op1, op2;
4917 register tree type1;
4918 register tree type2;
4919 register enum tree_code code1;
4920 register enum tree_code code2;
4921 register tree result_type = NULL_TREE;
4923 /* If second operand is omitted, it is the same as the first one;
4924 make sure it is calculated only once. */
4928 pedwarn ("ANSI C++ forbids omitting the middle term of a ?: expression");
4929 ifexp = op1 = save_expr (ifexp);
4932 ifexp = cp_convert (boolean_type_node, ifexp);
4934 if (TREE_CODE (ifexp) == ERROR_MARK)
4935 return error_mark_node;
4937 /* C++: REFERENCE_TYPES must be dereferenced. */
4938 type1 = TREE_TYPE (op1);
4939 code1 = TREE_CODE (type1);
4940 type2 = TREE_TYPE (op2);
4941 code2 = TREE_CODE (type2);
4943 if (code1 == REFERENCE_TYPE)
4945 op1 = convert_from_reference (op1);
4946 type1 = TREE_TYPE (op1);
4947 code1 = TREE_CODE (type1);
4949 if (code2 == REFERENCE_TYPE)
4951 op2 = convert_from_reference (op2);
4952 type2 = TREE_TYPE (op2);
4953 code2 = TREE_CODE (type2);
4956 /* Don't promote the operands separately if they promote
4957 the same way. Return the unpromoted type and let the combined
4958 value get promoted if necessary. */
4960 if (TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2)
4961 && code2 != ARRAY_TYPE
4962 && code2 != FUNCTION_TYPE
4963 && code2 != METHOD_TYPE)
4967 if (TREE_CONSTANT (ifexp)
4968 && (TREE_CODE (ifexp) == INTEGER_CST
4969 || TREE_CODE (ifexp) == ADDR_EXPR))
4970 return (integer_zerop (ifexp) ? op2 : op1);
4972 if (TREE_CODE (op1) == CONST_DECL)
4973 op1 = DECL_INITIAL (op1);
4974 else if (TREE_READONLY_DECL_P (op1))
4975 op1 = decl_constant_value (op1);
4976 if (TREE_CODE (op2) == CONST_DECL)
4977 op2 = DECL_INITIAL (op2);
4978 else if (TREE_READONLY_DECL_P (op2))
4979 op2 = decl_constant_value (op2);
4981 type1 = cp_build_qualified_type
4982 (type1, (CP_TYPE_QUALS (TREE_TYPE (op1))
4983 | CP_TYPE_QUALS (TREE_TYPE (op2))));
4984 /* ??? This is a kludge to deal with the fact that
4985 we don't sort out integers and enums properly, yet. */
4986 result = fold (build (COND_EXPR, type1, ifexp, op1, op2));
4987 if (TREE_TYPE (result) != type1)
4988 result = build1 (NOP_EXPR, type1, result);
4989 /* Expand both sides into the same slot,
4990 hopefully the target of the ?: expression. */
4991 if (TREE_CODE (op1) == TARGET_EXPR && TREE_CODE (op2) == TARGET_EXPR)
4993 tree slot = build (VAR_DECL, TREE_TYPE (result));
4994 layout_decl (slot, 0);
4995 result = build (TARGET_EXPR, TREE_TYPE (result),
4996 slot, result, NULL_TREE, NULL_TREE);
5001 /* They don't match; promote them both and then try to reconcile them.
5002 But don't permit mismatching enum types. */
5003 if (code1 == ENUMERAL_TYPE)
5005 if (code2 == ENUMERAL_TYPE)
5007 cp_error ("enumeral mismatch in conditional expression: `%T' vs `%T'",
5009 return error_mark_node;
5011 else if (extra_warnings && ! IS_AGGR_TYPE_CODE (code2)
5012 && type2 != type_promotes_to (type1))
5013 warning ("enumeral and non-enumeral type in conditional expression");
5015 else if (extra_warnings
5016 && code2 == ENUMERAL_TYPE && ! IS_AGGR_TYPE_CODE (code1)
5017 && type1 != type_promotes_to (type2))
5018 warning ("enumeral and non-enumeral type in conditional expression");
5020 if (code1 != VOID_TYPE)
5022 op1 = default_conversion (op1);
5023 type1 = TREE_TYPE (op1);
5024 if (TYPE_PTRMEMFUNC_P (type1))
5025 type1 = TYPE_PTRMEMFUNC_FN_TYPE (type1);
5026 code1 = TREE_CODE (type1);
5028 if (code2 != VOID_TYPE)
5030 op2 = default_conversion (op2);
5031 type2 = TREE_TYPE (op2);
5032 if (TYPE_PTRMEMFUNC_P (type2))
5033 type2 = TYPE_PTRMEMFUNC_FN_TYPE (type2);
5034 code2 = TREE_CODE (type2);
5037 if (code1 == RECORD_TYPE && code2 == RECORD_TYPE
5038 && real_lvalue_p (op1) && real_lvalue_p (op2)
5039 && comptypes (type1, type2, COMPARE_BASE | COMPARE_RELAXED))
5041 type1 = build_reference_type (type1);
5042 type2 = build_reference_type (type2);
5043 result_type = common_type (type1, type2);
5044 op1 = convert_to_reference (result_type, op1, CONV_IMPLICIT,
5045 LOOKUP_NORMAL, NULL_TREE);
5046 op2 = convert_to_reference (result_type, op2, CONV_IMPLICIT,
5047 LOOKUP_NORMAL, NULL_TREE);
5049 /* Quickly detect the usual case where op1 and op2 have the same type
5051 else if (TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2))
5054 result_type = type1;
5057 cp_build_qualified_type (type1,
5058 CP_TYPE_QUALS (TREE_TYPE (op1))
5059 | CP_TYPE_QUALS (TREE_TYPE (op2)));
5061 else if ((code1 == INTEGER_TYPE || code1 == REAL_TYPE)
5062 && (code2 == INTEGER_TYPE || code2 == REAL_TYPE))
5064 result_type = common_type (type1, type2);
5066 else if (code1 == VOID_TYPE || code2 == VOID_TYPE)
5068 if (pedantic && (code1 != VOID_TYPE || code2 != VOID_TYPE))
5069 pedwarn ("ANSI C++ forbids conditional expr with only one void side");
5070 result_type = void_type_node;
5072 else if (code1 == POINTER_TYPE && null_ptr_cst_p (op2))
5073 result_type = qualify_type (type1, type2);
5074 else if (code2 == POINTER_TYPE && null_ptr_cst_p (op1))
5075 result_type = qualify_type (type2, type1);
5076 else if (code1 == POINTER_TYPE && code2 == POINTER_TYPE)
5078 if (comp_target_types (type1, type2, 1))
5079 result_type = common_type (type1, type2);
5080 else if (TYPE_MAIN_VARIANT (TREE_TYPE (type1)) == void_type_node)
5082 if (pedantic && TREE_CODE (type2) == FUNCTION_TYPE)
5083 pedwarn ("ANSI C++ forbids conditional expr between `void *' and function pointer");
5084 result_type = qualify_type (type1, type2);
5086 else if (TYPE_MAIN_VARIANT (TREE_TYPE (type2)) == void_type_node)
5088 if (pedantic && TREE_CODE (type1) == FUNCTION_TYPE)
5089 pedwarn ("ANSI C++ forbids conditional expr between `void *' and function pointer");
5090 result_type = qualify_type (type2, type1);
5093 else if (same_or_base_type_p (type2, type1))
5094 result_type = type2;
5095 else if (IS_AGGR_TYPE (TREE_TYPE (type1))
5096 && IS_AGGR_TYPE (TREE_TYPE (type2))
5097 && (result_type = common_base_type (TREE_TYPE (type1),
5098 TREE_TYPE (type2))))
5100 if (result_type == error_mark_node)
5102 cp_error ("common base type of types `%T' and `%T' is ambiguous",
5103 TREE_TYPE (type1), TREE_TYPE (type2));
5104 result_type = ptr_type_node;
5109 && result_type != TREE_TYPE (type1)
5110 && result_type != TREE_TYPE (type2))
5111 cp_pedwarn ("`%T' and `%T' converted to `%T *' in conditional expression",
5112 type1, type2, result_type);
5114 result_type = build_pointer_type (result_type);
5119 pedwarn ("pointer type mismatch in conditional expression");
5120 result_type = ptr_type_node;
5123 else if (code1 == POINTER_TYPE && code2 == INTEGER_TYPE)
5125 pedwarn ("pointer/integer type mismatch in conditional expression");
5126 result_type = type1;
5128 else if (code2 == POINTER_TYPE && code1 == INTEGER_TYPE)
5130 pedwarn ("pointer/integer type mismatch in conditional expression");
5131 result_type = type2;
5133 if (type2 == unknown_type_node)
5134 result_type = type1;
5135 else if (type1 == unknown_type_node)
5136 result_type = type2;
5140 /* The match does not look good. If either is
5141 an aggregate value, try converting to a scalar type. */
5142 if (code1 == RECORD_TYPE && code2 == RECORD_TYPE)
5144 cp_error ("aggregate mismatch in conditional expression: `%T' vs `%T'",
5146 return error_mark_node;
5148 /* Warning: this code assumes that conversion between cv-variants of
5149 a type is done using NOP_EXPRs. */
5150 if (code1 == RECORD_TYPE && TYPE_HAS_CONVERSION (type1))
5152 /* There are other types besides pointers and records. */
5154 if (code2 == POINTER_TYPE)
5155 tmp = build_pointer_type
5156 (cp_build_qualified_type (TREE_TYPE (type2),
5158 | TYPE_QUAL_VOLATILE
5159 | TYPE_QUAL_RESTRICT));
5162 tmp = build_type_conversion (CONVERT_EXPR, tmp, op1, 0);
5163 if (tmp == NULL_TREE)
5165 cp_error ("incompatible types `%T' and `%T' in `?:'",
5167 return error_mark_node;
5169 if (tmp == error_mark_node)
5170 error ("ambiguous pointer conversion");
5173 result_type = common_type (type2, TREE_TYPE (tmp));
5176 else if (code2 == RECORD_TYPE && TYPE_HAS_CONVERSION (type2))
5179 if (code1 == POINTER_TYPE)
5180 tmp = build_pointer_type
5181 (cp_build_qualified_type (TREE_TYPE (type1),
5183 | TYPE_QUAL_VOLATILE
5184 | TYPE_QUAL_RESTRICT));
5188 tmp = build_type_conversion (CONVERT_EXPR, tmp, op2, 0);
5189 if (tmp == NULL_TREE)
5191 cp_error ("incompatible types `%T' and `%T' in `?:'",
5193 return error_mark_node;
5195 if (tmp == error_mark_node)
5196 error ("ambiguous pointer conversion");
5199 result_type = common_type (type1, TREE_TYPE (tmp));
5202 else if (flag_cond_mismatch)
5203 result_type = void_type_node;
5206 error ("type mismatch in conditional expression");
5207 return error_mark_node;
5211 if (TREE_CODE (result_type) == POINTER_TYPE
5212 && TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
5213 result_type = build_ptrmemfunc_type (result_type);
5215 if (result_type != TREE_TYPE (op1))
5216 op1 = convert_for_initialization
5217 (NULL_TREE, result_type, op1, LOOKUP_NORMAL, "converting", NULL_TREE, 0);
5218 if (result_type != TREE_TYPE (op2))
5219 op2 = convert_for_initialization
5220 (NULL_TREE, result_type, op2, LOOKUP_NORMAL, "converting", NULL_TREE, 0);
5222 if (TREE_CODE (ifexp) == INTEGER_CST)
5223 return integer_zerop (ifexp) ? op2 : op1;
5225 return convert_from_reference
5226 (fold (build (COND_EXPR, result_type, ifexp, op1, op2)));
5229 /* Handle overloading of the ',' operator when needed. Otherwise,
5230 this function just builds an expression list. */
5233 build_x_compound_expr (list)
5236 tree rest = TREE_CHAIN (list);
5239 if (processing_template_decl)
5240 return build_min_nt (COMPOUND_EXPR, list, NULL_TREE);
5242 if (rest == NULL_TREE)
5243 return build_compound_expr (list);
5245 result = build_opfncall (COMPOUND_EXPR, LOOKUP_NORMAL,
5246 TREE_VALUE (list), TREE_VALUE (rest), NULL_TREE);
5248 return build_x_compound_expr (expr_tree_cons (NULL_TREE, result,
5249 TREE_CHAIN (rest)));
5251 if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)))
5253 /* the left-hand operand of a comma expression is like an expression
5254 statement: we should warn if it doesn't have any side-effects,
5255 unless it was explicitly cast to (void). */
5256 if ((extra_warnings || warn_unused)
5257 && !(TREE_CODE (TREE_VALUE(list)) == CONVERT_EXPR
5258 && TREE_TYPE (TREE_VALUE(list)) == void_type_node))
5259 warning("left-hand operand of comma expression has no effect");
5261 #if 0 /* this requires a gcc backend patch to export warn_if_unused_value */
5262 else if (warn_unused)
5263 warn_if_unused_value (TREE_VALUE(list));
5266 return build_compound_expr
5267 (expr_tree_cons (NULL_TREE, TREE_VALUE (list),
5268 build_expr_list (NULL_TREE,
5269 build_x_compound_expr (rest))));
5272 /* Given a list of expressions, return a compound expression
5273 that performs them all and returns the value of the last of them. */
5276 build_compound_expr (list)
5281 if (TREE_READONLY_DECL_P (TREE_VALUE (list)))
5282 TREE_VALUE (list) = decl_constant_value (TREE_VALUE (list));
5284 if (TREE_CHAIN (list) == 0)
5286 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5287 Strip such NOP_EXPRs, since LIST is used in non-lvalue context. */
5288 if (TREE_CODE (list) == NOP_EXPR
5289 && TREE_TYPE (list) == TREE_TYPE (TREE_OPERAND (list, 0)))
5290 list = TREE_OPERAND (list, 0);
5292 /* Convert arrays to pointers. */
5293 if (TREE_CODE (TREE_TYPE (TREE_VALUE (list))) == ARRAY_TYPE)
5294 return default_conversion (TREE_VALUE (list));
5296 return TREE_VALUE (list);
5299 rest = build_compound_expr (TREE_CHAIN (list));
5301 /* When pedantic, a compound expression cannot be a constant expression. */
5302 if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)) && ! pedantic)
5305 return build (COMPOUND_EXPR, TREE_TYPE (rest),
5306 break_out_cleanups (TREE_VALUE (list)), rest);
5310 build_static_cast (type, expr)
5316 if (type == error_mark_node || expr == error_mark_node)
5317 return error_mark_node;
5319 if (TREE_CODE (expr) == OFFSET_REF)
5320 expr = resolve_offset_ref (expr);
5322 if (processing_template_decl)
5324 tree t = build_min (STATIC_CAST_EXPR, copy_to_permanent (type),
5329 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5330 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
5331 if (TREE_CODE (type) != REFERENCE_TYPE
5332 && TREE_CODE (expr) == NOP_EXPR
5333 && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
5334 expr = TREE_OPERAND (expr, 0);
5336 if (TREE_CODE (type) == VOID_TYPE)
5337 return build1 (CONVERT_EXPR, type, expr);
5339 if (TREE_CODE (type) == REFERENCE_TYPE)
5340 return (convert_from_reference
5341 (convert_to_reference (type, expr, CONV_STATIC|CONV_IMPLICIT,
5342 LOOKUP_COMPLAIN, NULL_TREE)));
5344 if (IS_AGGR_TYPE (type))
5345 return build_cplus_new
5346 (type, (build_method_call
5347 (NULL_TREE, ctor_identifier, build_expr_list (NULL_TREE, expr),
5348 TYPE_BINFO (type), LOOKUP_NORMAL)));
5350 expr = decay_conversion (expr);
5351 intype = TREE_TYPE (expr);
5353 /* FIXME handle casting to array type. */
5356 if (can_convert_arg (type, intype, expr))
5358 else if (TYPE_PTROB_P (type) && TYPE_PTROB_P (intype))
5361 if (IS_AGGR_TYPE (TREE_TYPE (type)) && IS_AGGR_TYPE (TREE_TYPE (intype))
5362 && at_least_as_qualified_p (TREE_TYPE (type),
5364 && (binfo = get_binfo (TREE_TYPE (intype), TREE_TYPE (type), 0))
5365 && ! TREE_VIA_VIRTUAL (binfo))
5368 else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
5370 if (same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type))),
5371 TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (intype))))
5372 && at_least_as_qualified_p (TREE_TYPE (TREE_TYPE (type)),
5373 TREE_TYPE (TREE_TYPE (intype)))
5374 && (binfo = get_binfo (TYPE_OFFSET_BASETYPE (TREE_TYPE (type)),
5375 TYPE_OFFSET_BASETYPE (TREE_TYPE (intype)), 0))
5376 && ! TREE_VIA_VIRTUAL (binfo))
5379 else if (TREE_CODE (intype) != BOOLEAN_TYPE
5380 && TREE_CODE (type) != ARRAY_TYPE
5381 && TREE_CODE (type) != FUNCTION_TYPE
5382 && can_convert (intype, type))
5386 return build_c_cast (type, expr);
5388 cp_error ("static_cast from `%T' to `%T'", intype, type);
5389 return error_mark_node;
5393 build_reinterpret_cast (type, expr)
5398 if (type == error_mark_node || expr == error_mark_node)
5399 return error_mark_node;
5401 if (TREE_CODE (expr) == OFFSET_REF)
5402 expr = resolve_offset_ref (expr);
5404 if (processing_template_decl)
5406 tree t = build_min (REINTERPRET_CAST_EXPR,
5407 copy_to_permanent (type), expr);
5411 if (TREE_CODE (type) != REFERENCE_TYPE)
5413 expr = decay_conversion (expr);
5415 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5416 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
5417 if (TREE_CODE (expr) == NOP_EXPR
5418 && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
5419 expr = TREE_OPERAND (expr, 0);
5422 intype = TREE_TYPE (expr);
5424 if (TREE_CODE (type) == REFERENCE_TYPE)
5426 if (! real_lvalue_p (expr))
5428 cp_error ("reinterpret_cast from `%T' rvalue to `%T'", intype, type);
5429 return error_mark_node;
5431 expr = build_unary_op (ADDR_EXPR, expr, 0);
5432 if (expr != error_mark_node)
5433 expr = build_reinterpret_cast
5434 (build_pointer_type (TREE_TYPE (type)), expr);
5435 if (expr != error_mark_node)
5436 expr = build_indirect_ref (expr, 0);
5439 else if (same_type_p (TYPE_MAIN_VARIANT (intype),
5440 TYPE_MAIN_VARIANT (type)))
5441 return build_static_cast (type, expr);
5443 if (TYPE_PTR_P (type) && (TREE_CODE (intype) == INTEGER_TYPE
5444 || TREE_CODE (intype) == ENUMERAL_TYPE))
5446 else if (TREE_CODE (type) == INTEGER_TYPE && TYPE_PTR_P (intype))
5448 if (TYPE_PRECISION (type) < TYPE_PRECISION (intype))
5449 cp_pedwarn ("reinterpret_cast from `%T' to `%T' loses precision",
5452 else if ((TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype))
5453 || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
5455 if (TREE_READONLY_DECL_P (expr))
5456 expr = decl_constant_value (expr);
5457 return fold (build1 (NOP_EXPR, type, expr));
5459 else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
5460 || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
5462 if (! comp_ptr_ttypes_reinterpret (TREE_TYPE (type), TREE_TYPE (intype)))
5463 cp_pedwarn ("reinterpret_cast from `%T' to `%T' casts away const (or volatile)",
5466 if (TREE_READONLY_DECL_P (expr))
5467 expr = decl_constant_value (expr);
5468 return fold (build1 (NOP_EXPR, type, expr));
5470 else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
5471 || (TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype)))
5473 pedwarn ("ANSI C++ forbids casting between pointers to functions and objects");
5474 if (TREE_READONLY_DECL_P (expr))
5475 expr = decl_constant_value (expr);
5476 return fold (build1 (NOP_EXPR, type, expr));
5480 cp_error ("reinterpret_cast from `%T' to `%T'", intype, type);
5481 return error_mark_node;
5484 return cp_convert (type, expr);
5488 build_const_cast (type, expr)
5493 if (type == error_mark_node || expr == error_mark_node)
5494 return error_mark_node;
5496 if (TREE_CODE (expr) == OFFSET_REF)
5497 expr = resolve_offset_ref (expr);
5499 if (processing_template_decl)
5501 tree t = build_min (CONST_CAST_EXPR, copy_to_permanent (type),
5506 if (TREE_CODE (type) != REFERENCE_TYPE)
5508 expr = decay_conversion (expr);
5510 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5511 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
5512 if (TREE_CODE (expr) == NOP_EXPR
5513 && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
5514 expr = TREE_OPERAND (expr, 0);
5517 intype = TREE_TYPE (expr);
5519 if (same_type_p (TYPE_MAIN_VARIANT (intype), TYPE_MAIN_VARIANT (type)))
5520 return build_static_cast (type, expr);
5521 else if (TREE_CODE (type) == REFERENCE_TYPE)
5523 if (! real_lvalue_p (expr))
5525 cp_error ("const_cast from `%T' rvalue to `%T'", intype, type);
5526 return error_mark_node;
5529 if (comp_ptr_ttypes_const (TREE_TYPE (type), intype))
5531 expr = build_unary_op (ADDR_EXPR, expr, 0);
5532 expr = build1 (NOP_EXPR, type, expr);
5533 return convert_from_reference (expr);
5536 else if (TREE_CODE (type) == POINTER_TYPE
5537 && TREE_CODE (intype) == POINTER_TYPE
5538 && comp_ptr_ttypes_const (TREE_TYPE (type), TREE_TYPE (intype)))
5539 return cp_convert (type, expr);
5541 cp_error ("const_cast from `%T' to `%T'", intype, type);
5542 return error_mark_node;
5545 /* Build an expression representing a cast to type TYPE of expression EXPR.
5547 ALLOW_NONCONVERTING is true if we should allow non-converting constructors
5548 when doing the cast. */
5551 build_c_cast (type, expr)
5554 register tree value = expr;
5557 if (type == error_mark_node || expr == error_mark_node)
5558 return error_mark_node;
5560 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5561 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
5562 if (TREE_CODE (type) != REFERENCE_TYPE
5563 && TREE_CODE (value) == NOP_EXPR
5564 && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
5565 value = TREE_OPERAND (value, 0);
5567 if (TREE_TYPE (expr)
5568 && TREE_CODE (TREE_TYPE (expr)) == OFFSET_TYPE
5569 && TREE_CODE (type) != OFFSET_TYPE)
5570 value = resolve_offset_ref (value);
5572 if (TREE_CODE (type) == ARRAY_TYPE)
5574 /* Allow casting from T1* to T2[] because Cfront allows it.
5575 NIHCL uses it. It is not valid ANSI C however, and hence, not
5577 if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
5580 pedwarn ("ANSI C++ forbids casting to an array type");
5581 type = build_pointer_type (TREE_TYPE (type));
5585 error ("ANSI C++ forbids casting to an array type");
5586 return error_mark_node;
5590 if (TREE_CODE (type) == FUNCTION_TYPE
5591 || TREE_CODE (type) == METHOD_TYPE)
5593 cp_error ("casting to function type `%T'", type);
5594 return error_mark_node;
5597 if (IS_SIGNATURE (type))
5599 error ("cast specifies signature type");
5600 return error_mark_node;
5603 if (processing_template_decl)
5605 tree t = build_min (CAST_EXPR, type,
5606 min_tree_cons (NULL_TREE, value, NULL_TREE));
5610 /* Convert functions and arrays to pointers and
5611 convert references to their expanded types,
5612 but don't convert any other types. If, however, we are
5613 casting to a class type, there's no reason to do this: the
5614 cast will only succeed if there is a converting constructor,
5615 and the default conversions will be done at that point. In
5616 fact, doing the default conversion here is actually harmful
5620 struct S { S(const A&); };
5622 since we don't want the array-to-pointer conversion done. */
5623 if (!IS_AGGR_TYPE (type))
5625 if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE
5626 || (TREE_CODE (TREE_TYPE (value)) == METHOD_TYPE
5627 /* Don't do the default conversion if we want a
5628 pointer to a function. */
5629 && ! (TREE_CODE (type) == POINTER_TYPE
5630 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE))
5631 || TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE
5632 || TREE_CODE (TREE_TYPE (value)) == REFERENCE_TYPE)
5633 value = default_conversion (value);
5635 else if (TREE_CODE (TREE_TYPE (value)) == REFERENCE_TYPE)
5636 /* However, even for class types, we still need to strip away
5637 the reference type, since the call to convert_force below
5638 does not expect the input expression to be of reference
5640 value = convert_from_reference (value);
5642 otype = TREE_TYPE (value);
5644 /* Optionally warn about potentially worrisome casts. */
5647 && TREE_CODE (type) == POINTER_TYPE
5648 && TREE_CODE (otype) == POINTER_TYPE
5649 && !at_least_as_qualified_p (TREE_TYPE (type),
5651 cp_warning ("cast discards qualifiers from pointer target type");
5653 /* Warn about possible alignment problems. */
5654 if (STRICT_ALIGNMENT && warn_cast_align
5655 && TREE_CODE (type) == POINTER_TYPE
5656 && TREE_CODE (otype) == POINTER_TYPE
5657 && TREE_CODE (TREE_TYPE (otype)) != VOID_TYPE
5658 && TREE_CODE (TREE_TYPE (otype)) != FUNCTION_TYPE
5659 && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype)))
5660 warning ("cast increases required alignment of target type");
5663 /* We should see about re-enabling these, they seem useful to
5665 if (TREE_CODE (type) == INTEGER_TYPE
5666 && TREE_CODE (otype) == POINTER_TYPE
5667 && TYPE_PRECISION (type) != TYPE_PRECISION (otype))
5668 warning ("cast from pointer to integer of different size");
5670 if (TREE_CODE (type) == POINTER_TYPE
5671 && TREE_CODE (otype) == INTEGER_TYPE
5672 && TYPE_PRECISION (type) != TYPE_PRECISION (otype)
5673 /* Don't warn about converting 0 to pointer,
5674 provided the 0 was explicit--not cast or made by folding. */
5675 && !(TREE_CODE (value) == INTEGER_CST && integer_zerop (value)))
5676 warning ("cast to pointer from integer of different size");
5679 if (TREE_CODE (type) == REFERENCE_TYPE)
5680 value = (convert_from_reference
5681 (convert_to_reference (type, value, CONV_C_CAST,
5682 LOOKUP_COMPLAIN, NULL_TREE)));
5687 if (TREE_READONLY_DECL_P (value))
5688 value = decl_constant_value (value);
5691 value = convert_force (type, value, CONV_C_CAST);
5693 /* Ignore any integer overflow caused by the cast. */
5694 if (TREE_CODE (value) == INTEGER_CST)
5696 TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue);
5697 TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
5701 /* Always produce some operator for an explicit cast,
5702 so we can tell (for -pedantic) that the cast is no lvalue. */
5703 if (TREE_CODE (type) != REFERENCE_TYPE && value == expr
5704 && real_lvalue_p (value))
5705 value = non_lvalue (value);
5710 /* Build an assignment expression of lvalue LHS from value RHS.
5711 MODIFYCODE is the code for a binary operator that we use
5712 to combine the old value of LHS with RHS to get the new value.
5713 Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
5715 C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed. */
5718 build_modify_expr (lhs, modifycode, rhs)
5720 enum tree_code modifycode;
5723 register tree result;
5725 tree lhstype = TREE_TYPE (lhs);
5726 tree olhstype = lhstype;
5729 /* Avoid duplicate error messages from operands that had errors. */
5730 if (lhs == error_mark_node || rhs == error_mark_node)
5731 return error_mark_node;
5733 /* Types that aren't fully specified cannot be used in assignments. */
5734 lhs = require_complete_type (lhs);
5738 /* Handle assignment to signature pointers/refs. */
5740 if (TYPE_LANG_SPECIFIC (lhstype)
5741 && (IS_SIGNATURE_POINTER (lhstype) || IS_SIGNATURE_REFERENCE (lhstype)))
5743 return build_signature_pointer_constructor (lhs, rhs);
5746 /* Handle control structure constructs used as "lvalues". */
5748 switch (TREE_CODE (lhs))
5750 /* Handle --foo = 5; as these are valid constructs in C++ */
5751 case PREDECREMENT_EXPR:
5752 case PREINCREMENT_EXPR:
5753 if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
5754 lhs = build (TREE_CODE (lhs), TREE_TYPE (lhs),
5755 stabilize_reference (TREE_OPERAND (lhs, 0)),
5756 TREE_OPERAND (lhs, 1));
5757 return build (COMPOUND_EXPR, lhstype,
5759 build_modify_expr (TREE_OPERAND (lhs, 0),
5762 /* Handle (a, b) used as an "lvalue". */
5764 newrhs = build_modify_expr (TREE_OPERAND (lhs, 1),
5766 if (newrhs == error_mark_node)
5767 return error_mark_node;
5768 return build (COMPOUND_EXPR, lhstype,
5769 TREE_OPERAND (lhs, 0), newrhs);
5772 newrhs = build_modify_expr (TREE_OPERAND (lhs, 0), modifycode, rhs);
5773 if (newrhs == error_mark_node)
5774 return error_mark_node;
5775 return build (COMPOUND_EXPR, lhstype, lhs, newrhs);
5777 /* Handle (a ? b : c) used as an "lvalue". */
5779 rhs = save_expr (rhs);
5781 /* Produce (a ? (b = rhs) : (c = rhs))
5782 except that the RHS goes through a save-expr
5783 so the code to compute it is only emitted once. */
5785 = build_conditional_expr (TREE_OPERAND (lhs, 0),
5786 build_modify_expr (cp_convert (TREE_TYPE (lhs), TREE_OPERAND (lhs, 1)),
5788 build_modify_expr (cp_convert (TREE_TYPE (lhs), TREE_OPERAND (lhs, 2)),
5790 if (cond == error_mark_node)
5792 /* Make sure the code to compute the rhs comes out
5793 before the split. */
5794 return build (COMPOUND_EXPR, TREE_TYPE (lhs),
5795 /* Case to void to suppress warning
5796 from warn_if_unused_value. */
5797 cp_convert (void_type_node, rhs), cond);
5804 if (TREE_CODE (lhs) == OFFSET_REF)
5806 if (TREE_OPERAND (lhs, 0) == NULL_TREE)
5808 /* Static class member? */
5809 tree member = TREE_OPERAND (lhs, 1);
5810 if (TREE_CODE (member) == VAR_DECL)
5814 compiler_error ("invalid static class member");
5815 return error_mark_node;
5819 lhs = resolve_offset_ref (lhs);
5821 olhstype = lhstype = TREE_TYPE (lhs);
5824 if (TREE_CODE (lhstype) == REFERENCE_TYPE
5825 && modifycode != INIT_EXPR)
5827 lhs = convert_from_reference (lhs);
5828 olhstype = lhstype = TREE_TYPE (lhs);
5831 /* If a binary op has been requested, combine the old LHS value with the RHS
5832 producing the value we should actually store into the LHS. */
5834 if (modifycode == INIT_EXPR)
5836 if (! IS_AGGR_TYPE (lhstype))
5837 /* Do the default thing */;
5840 result = build_method_call (lhs, ctor_identifier,
5841 build_expr_list (NULL_TREE, rhs),
5842 TYPE_BINFO (lhstype), LOOKUP_NORMAL);
5843 if (result == NULL_TREE)
5844 return error_mark_node;
5848 else if (modifycode == NOP_EXPR)
5850 /* `operator=' is not an inheritable operator. */
5851 if (! IS_AGGR_TYPE (lhstype))
5852 /* Do the default thing */;
5855 result = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL,
5856 lhs, rhs, make_node (NOP_EXPR));
5857 if (result == NULL_TREE)
5858 return error_mark_node;
5863 else if (PROMOTES_TO_AGGR_TYPE (lhstype, REFERENCE_TYPE))
5865 my_friendly_abort (978652);
5869 lhs = stabilize_reference (lhs);
5870 newrhs = build_binary_op (modifycode, lhs, rhs, 1);
5871 if (newrhs == error_mark_node)
5873 cp_error (" in evaluation of `%Q(%#T, %#T)'", modifycode,
5874 TREE_TYPE (lhs), TREE_TYPE (rhs));
5875 return error_mark_node;
5879 /* Handle a cast used as an "lvalue".
5880 We have already performed any binary operator using the value as cast.
5881 Now convert the result to the cast type of the lhs,
5882 and then true type of the lhs and store it there;
5883 then convert result back to the cast type to be the value
5884 of the assignment. */
5886 switch (TREE_CODE (lhs))
5891 case FIX_TRUNC_EXPR:
5892 case FIX_FLOOR_EXPR:
5893 case FIX_ROUND_EXPR:
5895 if (TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
5896 || TREE_CODE (TREE_TYPE (newrhs)) == FUNCTION_TYPE
5897 || TREE_CODE (TREE_TYPE (newrhs)) == METHOD_TYPE
5898 || TREE_CODE (TREE_TYPE (newrhs)) == OFFSET_TYPE)
5899 newrhs = default_conversion (newrhs);
5901 tree inner_lhs = TREE_OPERAND (lhs, 0);
5904 /* WP 5.4.1: The result is an lvalue if T is a reference type,
5905 otherwise the result is an rvalue. */
5906 if (! lvalue_p (lhs))
5907 pedwarn ("ANSI C++ forbids cast to non-reference type used as lvalue");
5909 result = build_modify_expr (inner_lhs, NOP_EXPR,
5910 cp_convert (TREE_TYPE (inner_lhs),
5911 cp_convert (lhstype, newrhs)));
5912 if (result == error_mark_node)
5914 return cp_convert (TREE_TYPE (lhs), result);
5921 /* Now we have handled acceptable kinds of LHS that are not truly lvalues.
5922 Reject anything strange now. */
5924 if (!lvalue_or_else (lhs, "assignment"))
5925 return error_mark_node;
5927 GNU_xref_assign (lhs);
5929 /* Warn about storing in something that is `const'. */
5930 /* For C++, don't warn if this is initialization. */
5931 if (modifycode != INIT_EXPR
5932 /* For assignment to `const' signature pointer/reference fields,
5933 don't warn either, we already printed a better message before. */
5934 && ! (TREE_CODE (lhs) == COMPONENT_REF
5935 && (IS_SIGNATURE_POINTER (TREE_TYPE (TREE_OPERAND (lhs, 0)))
5936 || IS_SIGNATURE_REFERENCE (TREE_TYPE (TREE_OPERAND (lhs, 0)))))
5937 && (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype)
5938 /* Functions are not modifiable, even though they are
5940 || TREE_CODE (TREE_TYPE (lhs)) == FUNCTION_TYPE
5941 || ((TREE_CODE (lhstype) == RECORD_TYPE
5942 || TREE_CODE (lhstype) == UNION_TYPE)
5943 && C_TYPE_FIELDS_READONLY (lhstype))
5944 || (TREE_CODE (lhstype) == REFERENCE_TYPE
5945 && CP_TYPE_CONST_P (TREE_TYPE (lhstype)))))
5946 readonly_error (lhs, "assignment", 0);
5948 /* If storing into a structure or union member,
5949 it has probably been given type `int'.
5950 Compute the type that would go with
5951 the actual amount of storage the member occupies. */
5953 if (TREE_CODE (lhs) == COMPONENT_REF
5954 && (TREE_CODE (lhstype) == INTEGER_TYPE
5955 || TREE_CODE (lhstype) == REAL_TYPE
5956 || TREE_CODE (lhstype) == ENUMERAL_TYPE))
5958 lhstype = TREE_TYPE (get_unwidened (lhs, 0));
5960 /* If storing in a field that is in actuality a short or narrower
5961 than one, we must store in the field in its actual type. */
5963 if (lhstype != TREE_TYPE (lhs))
5965 lhs = copy_node (lhs);
5966 TREE_TYPE (lhs) = lhstype;
5970 /* check to see if there is an assignment to `this' */
5971 if (lhs == current_class_ptr)
5973 if (flag_this_is_variable > 0
5974 && DECL_NAME (current_function_decl) != NULL_TREE
5975 && (DECL_NAME (current_function_decl)
5976 != constructor_name (current_class_type)))
5977 warning ("assignment to `this' not in constructor or destructor");
5978 current_function_just_assigned_this = 1;
5981 if (modifycode != INIT_EXPR)
5983 /* Make modifycode now either a NOP_EXPR or an INIT_EXPR. */
5984 modifycode = NOP_EXPR;
5985 /* Reference-bashing */
5986 if (TREE_CODE (lhstype) == REFERENCE_TYPE)
5988 tree tmp = convert_from_reference (lhs);
5989 lhstype = TREE_TYPE (tmp);
5990 if (TYPE_SIZE (lhstype) == 0)
5992 incomplete_type_error (lhs, lhstype);
5993 return error_mark_node;
5998 if (TREE_CODE (TREE_TYPE (newrhs)) == REFERENCE_TYPE)
6000 tree tmp = convert_from_reference (newrhs);
6001 if (TYPE_SIZE (TREE_TYPE (tmp)) == 0)
6003 incomplete_type_error (newrhs, TREE_TYPE (tmp));
6004 return error_mark_node;
6010 if (TREE_SIDE_EFFECTS (lhs))
6011 lhs = stabilize_reference (lhs);
6012 if (TREE_SIDE_EFFECTS (newrhs))
6013 newrhs = stabilize_reference (newrhs);
6015 /* Convert new value to destination type. */
6017 if (TREE_CODE (lhstype) == ARRAY_TYPE)
6021 if (!same_or_base_type_p (lhstype, TREE_TYPE (rhs)))
6023 cp_error ("incompatible types in assignment of `%T' to `%T'",
6024 TREE_TYPE (rhs), lhstype);
6025 return error_mark_node;
6028 /* Allow array assignment in compiler-generated code. */
6029 if (pedantic && ! DECL_ARTIFICIAL (current_function_decl))
6030 pedwarn ("ANSI C++ forbids assignment of arrays");
6032 /* Have to wrap this in RTL_EXPR for two cases:
6033 in base or member initialization and if we
6034 are a branch of a ?: operator. Since we
6035 can't easily know the latter, just do it always. */
6037 result = make_node (RTL_EXPR);
6039 TREE_TYPE (result) = void_type_node;
6040 do_pending_stack_adjust ();
6041 start_sequence_for_rtl_expr (result);
6043 /* As a matter of principle, `start_sequence' should do this. */
6046 from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
6047 ? 1 + (modifycode != INIT_EXPR): 0;
6048 expand_vec_init (lhs, lhs, array_type_nelts (lhstype), newrhs,
6051 do_pending_stack_adjust ();
6053 TREE_SIDE_EFFECTS (result) = 1;
6054 RTL_EXPR_SEQUENCE (result) = get_insns ();
6055 RTL_EXPR_RTL (result) = const0_rtx;
6060 if (modifycode == INIT_EXPR)
6062 newrhs = convert_for_initialization (lhs, lhstype, newrhs, LOOKUP_NORMAL,
6063 "assignment", NULL_TREE, 0);
6064 if (lhs == DECL_RESULT (current_function_decl))
6066 if (DECL_INITIAL (lhs))
6067 warning ("return value from function receives multiple initializations");
6068 DECL_INITIAL (lhs) = newrhs;
6073 /* Avoid warnings on enum bit fields. */
6074 if (TREE_CODE (olhstype) == ENUMERAL_TYPE
6075 && TREE_CODE (lhstype) == INTEGER_TYPE)
6077 newrhs = convert_for_assignment (olhstype, newrhs, "assignment",
6079 newrhs = convert_force (lhstype, newrhs, 0);
6082 newrhs = convert_for_assignment (lhstype, newrhs, "assignment",
6084 if (TREE_CODE (newrhs) == CALL_EXPR
6085 && TYPE_NEEDS_CONSTRUCTING (lhstype))
6086 newrhs = build_cplus_new (lhstype, newrhs);
6088 /* Can't initialize directly from a TARGET_EXPR, since that would
6089 cause the lhs to be constructed twice, and possibly result in
6090 accidental self-initialization. So we force the TARGET_EXPR to be
6091 expanded without a target. */
6092 if (TREE_CODE (newrhs) == TARGET_EXPR)
6093 newrhs = build (COMPOUND_EXPR, TREE_TYPE (newrhs), newrhs,
6094 TREE_OPERAND (newrhs, 0));
6097 if (newrhs == error_mark_node)
6098 return error_mark_node;
6100 if (TREE_CODE (newrhs) == COND_EXPR)
6103 tree cond = TREE_OPERAND (newrhs, 0);
6105 if (TREE_SIDE_EFFECTS (lhs))
6106 cond = build_compound_expr (tree_cons
6108 build_expr_list (NULL_TREE, cond)));
6110 /* Cannot have two identical lhs on this one tree (result) as preexpand
6111 calls will rip them out and fill in RTL for them, but when the
6112 rtl is generated, the calls will only be in the first side of the
6113 condition, not on both, or before the conditional jump! (mrs) */
6114 lhs1 = break_out_calls (lhs);
6117 /* If there's no change, the COND_EXPR behaves like any other rhs. */
6118 result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
6119 lhstype, lhs, newrhs);
6122 tree result_type = TREE_TYPE (newrhs);
6123 /* We have to convert each arm to the proper type because the
6124 types may have been munged by constant folding. */
6126 = build (COND_EXPR, result_type, cond,
6127 build_modify_expr (lhs, modifycode,
6128 cp_convert (result_type,
6129 TREE_OPERAND (newrhs, 1))),
6130 build_modify_expr (lhs1, modifycode,
6131 cp_convert (result_type,
6132 TREE_OPERAND (newrhs, 2))));
6136 result = build (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
6137 lhstype, lhs, newrhs);
6139 TREE_SIDE_EFFECTS (result) = 1;
6141 /* If we got the LHS in a different type for storing in,
6142 convert the result back to the nominal type of LHS
6143 so that the value we return always has the same type
6144 as the LHS argument. */
6146 if (olhstype == TREE_TYPE (result))
6148 /* Avoid warnings converting integral types back into enums
6149 for enum bit fields. */
6150 if (TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
6151 && TREE_CODE (olhstype) == ENUMERAL_TYPE)
6153 result = build (COMPOUND_EXPR, olhstype, result, olhs);
6154 TREE_NO_UNUSED_WARNING (result) = 1;
6157 return convert_for_assignment (olhstype, result, "assignment",
6162 build_x_modify_expr (lhs, modifycode, rhs)
6164 enum tree_code modifycode;
6167 if (processing_template_decl)
6168 return build_min_nt (MODOP_EXPR, lhs,
6169 build_min_nt (modifycode, NULL_TREE, NULL_TREE), rhs);
6171 if (modifycode != NOP_EXPR)
6173 tree rval = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL, lhs, rhs,
6174 make_node (modifycode));
6178 return build_modify_expr (lhs, modifycode, rhs);
6182 /* Get difference in deltas for different pointer to member function
6183 types. Return integer_zero_node, if FROM cannot be converted to a
6184 TO type. If FORCE is true, then allow reverse conversions as well. */
6187 get_delta_difference (from, to, force)
6191 tree delta = integer_zero_node;
6197 /* Should get_base_distance here, so we can check if any thing along the
6198 path is virtual, and we need to make sure we stay
6199 inside the real binfos when going through virtual bases.
6200 Maybe we should replace virtual bases with
6201 binfo_member (...CLASSTYPE_VBASECLASSES...)... (mrs) */
6202 binfo = get_binfo (from, to, 1);
6203 if (binfo == error_mark_node)
6205 error (" in pointer to member function conversion");
6212 error_not_base_type (from, to);
6213 error (" in pointer to member conversion");
6216 binfo = get_binfo (to, from, 1);
6217 if (binfo == 0 || binfo == error_mark_node)
6219 if (TREE_VIA_VIRTUAL (binfo))
6221 binfo = binfo_member (BINFO_TYPE (binfo),
6222 CLASSTYPE_VBASECLASSES (from));
6223 cp_warning ("pointer to member cast to virtual base `%T'",
6224 BINFO_TYPE (binfo));
6225 warning (" will only work if you are very careful");
6227 delta = BINFO_OFFSET (binfo);
6228 delta = cp_convert (ptrdiff_type_node, delta);
6230 return build_binary_op (MINUS_EXPR,
6235 if (TREE_VIA_VIRTUAL (binfo))
6239 cp_warning ("pointer to member cast from virtual base `%T'",
6240 BINFO_TYPE (binfo));
6241 warning (" will only work if you are very careful");
6244 cp_error ("pointer to member conversion from virtual base `%T'",
6245 BINFO_TYPE (binfo));
6248 return BINFO_OFFSET (binfo);
6252 build_ptrmemfunc1 (type, delta, idx, pfn, delta2)
6253 tree type, delta, idx, pfn, delta2;
6258 /* This is the old way we did it. We want to avoid calling
6259 digest_init, so that it can give an error if we use { } when
6260 initializing a pointer to member function. */
6264 u = build_nt (CONSTRUCTOR, NULL_TREE,
6265 expr_tree_cons (pfn_identifier, pfn, NULL_TREE));
6269 u = build_nt (CONSTRUCTOR, NULL_TREE,
6270 expr_tree_cons (delta2_identifier, delta2, NULL_TREE));
6273 u = build_nt (CONSTRUCTOR, NULL_TREE,
6274 expr_tree_cons (NULL_TREE, delta,
6275 expr_tree_cons (NULL_TREE, idx,
6276 expr_tree_cons (NULL_TREE, u, NULL_TREE))));
6278 return digest_init (type, u, (tree*)0);
6280 tree delta_field, idx_field, pfn_or_delta2_field, pfn_field, delta2_field;
6282 int allconstant, allsimple;
6284 delta_field = TYPE_FIELDS (type);
6285 idx_field = TREE_CHAIN (delta_field);
6286 pfn_or_delta2_field = TREE_CHAIN (idx_field);
6287 subtype = TREE_TYPE (pfn_or_delta2_field);
6288 pfn_field = TYPE_FIELDS (subtype);
6289 delta2_field = TREE_CHAIN (pfn_field);
6293 allconstant = TREE_CONSTANT (pfn);
6294 allsimple = !! initializer_constant_valid_p (pfn, TREE_TYPE (pfn));
6295 u = expr_tree_cons (pfn_field, pfn, NULL_TREE);
6299 delta2 = convert_and_check (delta_type_node, delta2);
6300 allconstant = TREE_CONSTANT (delta2);
6301 allsimple = !! initializer_constant_valid_p (delta2, TREE_TYPE (delta2));
6302 u = expr_tree_cons (delta2_field, delta2, NULL_TREE);
6305 delta = convert_and_check (delta_type_node, delta);
6306 idx = convert_and_check (delta_type_node, idx);
6308 allconstant = allconstant && TREE_CONSTANT (delta) && TREE_CONSTANT (idx);
6309 allsimple = allsimple
6310 && initializer_constant_valid_p (delta, TREE_TYPE (delta))
6311 && initializer_constant_valid_p (idx, TREE_TYPE (idx));
6313 u = build (CONSTRUCTOR, subtype, NULL_TREE, u);
6314 u = expr_tree_cons (delta_field, delta,
6315 expr_tree_cons (idx_field, idx,
6316 expr_tree_cons (pfn_or_delta2_field, u, NULL_TREE)));
6317 u = build (CONSTRUCTOR, type, NULL_TREE, u);
6318 TREE_CONSTANT (u) = allconstant;
6319 TREE_STATIC (u) = allconstant && allsimple;
6324 /* Build a constructor for a pointer to member function. It can be
6325 used to initialize global variables, local variable, or used
6326 as a value in expressions. TYPE is the POINTER to METHOD_TYPE we
6329 If FORCE is non-zero, then force this conversion, even if
6330 we would rather not do it. Usually set when using an explicit
6333 Return error_mark_node, if something goes wrong. */
6336 build_ptrmemfunc (type, pfn, force)
6340 tree idx = integer_zero_node;
6341 tree delta = integer_zero_node;
6342 tree delta2 = integer_zero_node;
6344 tree npfn = NULL_TREE;
6346 /* Handle multiple conversions of pointer to member functions. */
6347 if (TYPE_PTRMEMFUNC_P (TREE_TYPE (pfn)))
6349 tree ndelta, ndelta2;
6353 /* Is is already the right type? */
6354 if (type == TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (pfn)))
6357 pfn_type = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (pfn));
6359 && comp_target_types (type, pfn_type, 1) != 1)
6360 cp_error ("conversion to `%T' from `%T'", type, pfn_type);
6362 ndelta = cp_convert (ptrdiff_type_node, build_component_ref (pfn, delta_identifier, NULL_TREE, 0));
6363 ndelta2 = cp_convert (ptrdiff_type_node, DELTA2_FROM_PTRMEMFUNC (pfn));
6364 idx = build_component_ref (pfn, index_identifier, NULL_TREE, 0);
6366 n = get_delta_difference (TYPE_METHOD_BASETYPE (TREE_TYPE (pfn_type)),
6367 TYPE_METHOD_BASETYPE (TREE_TYPE (type)),
6370 delta = build_binary_op (PLUS_EXPR, ndelta, n, 1);
6371 delta2 = build_binary_op (PLUS_EXPR, ndelta2, n, 1);
6372 e1 = fold (build (GT_EXPR, boolean_type_node, idx, integer_zero_node));
6374 e2 = build_ptrmemfunc1 (TYPE_GET_PTRMEMFUNC_TYPE (type), delta, idx,
6377 pfn = PFN_FROM_PTRMEMFUNC (pfn);
6378 npfn = build1 (NOP_EXPR, type, pfn);
6379 TREE_CONSTANT (npfn) = TREE_CONSTANT (pfn);
6381 e3 = build_ptrmemfunc1 (TYPE_GET_PTRMEMFUNC_TYPE (type), delta, idx, npfn,
6383 return build_conditional_expr (e1, e2, e3);
6386 /* Handle null pointer to member function conversions. */
6387 if (integer_zerop (pfn))
6389 pfn = build_c_cast (type, integer_zero_node);
6390 return build_ptrmemfunc1 (TYPE_GET_PTRMEMFUNC_TYPE (type),
6391 integer_zero_node, integer_zero_node,
6395 if (type_unknown_p (pfn))
6396 return instantiate_type (type, pfn, 1);
6399 && comp_target_types (type, TREE_TYPE (pfn), 0) != 1)
6400 cp_error ("conversion to `%T' from `%T'", type, TREE_TYPE (pfn));
6402 /* Allow pointer to member conversions here. */
6403 delta = get_delta_difference (TYPE_METHOD_BASETYPE (TREE_TYPE (TREE_TYPE (pfn))),
6404 TYPE_METHOD_BASETYPE (TREE_TYPE (type)),
6406 delta2 = build_binary_op (PLUS_EXPR, delta2, delta, 1);
6408 if (TREE_CODE (TREE_OPERAND (pfn, 0)) != FUNCTION_DECL)
6409 warning ("assuming pointer to member function is non-virtual");
6411 if (TREE_CODE (TREE_OPERAND (pfn, 0)) == FUNCTION_DECL
6412 && DECL_VINDEX (TREE_OPERAND (pfn, 0)))
6414 /* Find the offset to the vfield pointer in the object. */
6415 vfield_offset = get_binfo (DECL_CONTEXT (TREE_OPERAND (pfn, 0)),
6416 DECL_CLASS_CONTEXT (TREE_OPERAND (pfn, 0)),
6418 vfield_offset = get_vfield_offset (vfield_offset);
6419 delta2 = size_binop (PLUS_EXPR, vfield_offset, delta2);
6421 /* Map everything down one to make room for the null pointer to member. */
6422 idx = size_binop (PLUS_EXPR,
6423 DECL_VINDEX (TREE_OPERAND (pfn, 0)),
6428 idx = size_binop (MINUS_EXPR, integer_zero_node, integer_one_node);
6430 if (type == TREE_TYPE (pfn))
6436 npfn = build1 (NOP_EXPR, type, pfn);
6437 TREE_CONSTANT (npfn) = TREE_CONSTANT (pfn);
6441 return build_ptrmemfunc1 (TYPE_GET_PTRMEMFUNC_TYPE (type), delta, idx, npfn, delta2);
6444 /* Convert value RHS to type TYPE as preparation for an assignment
6445 to an lvalue of type TYPE.
6446 The real work of conversion is done by `convert'.
6447 The purpose of this function is to generate error messages
6448 for assignments that are not allowed in C.
6449 ERRTYPE is a string to use in error messages:
6450 "assignment", "return", etc.
6452 C++: attempts to allow `convert' to find conversions involving
6453 implicit type conversion between aggregate and scalar types
6454 as per 8.5.6 of C++ manual. Does not randomly dereference
6455 pointers to aggregates! */
6458 convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
6464 register enum tree_code codel = TREE_CODE (type);
6465 register tree rhstype;
6466 register enum tree_code coder = TREE_CODE (TREE_TYPE (rhs));
6468 /* Issue warnings about peculiar, but legal, uses of NULL. */
6469 if (ARITHMETIC_TYPE_P (type) && rhs == null_node)
6470 cp_warning ("converting NULL to non-pointer type");
6472 if (coder == ERROR_MARK)
6473 return error_mark_node;
6475 if (codel == OFFSET_TYPE)
6477 type = TREE_TYPE (type);
6478 codel = TREE_CODE (type);
6481 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
6482 if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
6483 rhs = TREE_OPERAND (rhs, 0);
6485 if (rhs == error_mark_node)
6486 return error_mark_node;
6488 if (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node)
6489 return error_mark_node;
6491 if (TREE_CODE (TREE_TYPE (rhs)) == OFFSET_TYPE)
6493 rhs = resolve_offset_ref (rhs);
6494 if (rhs == error_mark_node)
6495 return error_mark_node;
6496 rhstype = TREE_TYPE (rhs);
6497 coder = TREE_CODE (rhstype);
6500 if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
6501 || is_overloaded_fn (rhs))
6502 rhs = default_conversion (rhs);
6503 else if (TREE_CODE (TREE_TYPE (rhs)) == REFERENCE_TYPE)
6504 rhs = convert_from_reference (rhs);
6506 /* If rhs is some sort of overloaded function, ocp_convert will either
6507 do the right thing or complain; we don't need to check anything else.
6508 So just hand off. */
6509 if (type_unknown_p (rhs))
6510 return ocp_convert (type, rhs, CONV_IMPLICIT, LOOKUP_NORMAL);
6512 rhstype = TREE_TYPE (rhs);
6513 coder = TREE_CODE (rhstype);
6515 /* This should no longer change types on us. */
6516 if (TREE_CODE (rhs) == CONST_DECL)
6517 rhs = DECL_INITIAL (rhs);
6518 else if (TREE_READONLY_DECL_P (rhs))
6519 rhs = decl_constant_value (rhs);
6521 if (same_type_p (type, rhstype))
6523 overflow_warning (rhs);
6527 if (coder == VOID_TYPE)
6529 error ("void value not ignored as it ought to be");
6530 return error_mark_node;
6532 /* Arithmetic types all interconvert. */
6533 if ((codel == INTEGER_TYPE || codel == REAL_TYPE || codel == BOOLEAN_TYPE
6534 || codel == COMPLEX_TYPE)
6535 && (coder == INTEGER_TYPE || coder == REAL_TYPE || coder == BOOLEAN_TYPE
6536 || coder == COMPLEX_TYPE))
6538 /* But we should warn if assigning REAL_TYPE to INTEGER_TYPE. */
6539 if (coder == REAL_TYPE && codel == INTEGER_TYPE)
6542 cp_warning ("`%T' used for argument %P of `%D'",
6543 rhstype, parmnum, fndecl);
6545 cp_warning ("%s to `%T' from `%T'", errtype, type, rhstype);
6547 /* And we should warn if assigning a negative value to
6548 an unsigned variable. */
6549 else if (TREE_UNSIGNED (type) && codel != BOOLEAN_TYPE)
6551 if (TREE_CODE (rhs) == INTEGER_CST
6552 && TREE_NEGATED_INT (rhs))
6555 cp_warning ("negative value `%E' passed as argument %P of `%D'",
6556 rhs, parmnum, fndecl);
6558 cp_warning ("%s of negative value `%E' to `%T'",
6559 errtype, rhs, type);
6561 overflow_warning (rhs);
6562 if (TREE_CONSTANT (rhs))
6566 return convert_and_check (type, rhs);
6568 /* Conversions involving enums. */
6569 else if ((codel == ENUMERAL_TYPE
6570 && (INTEGRAL_CODE_P (coder) || coder == REAL_TYPE))
6571 || (coder == ENUMERAL_TYPE
6572 && (INTEGRAL_CODE_P (codel) || codel == REAL_TYPE)))
6574 return ocp_convert (type, rhs, CONV_IMPLICIT, LOOKUP_NORMAL);
6576 /* Conversions among pointers */
6577 else if (codel == POINTER_TYPE
6578 && (coder == POINTER_TYPE
6579 || (coder == RECORD_TYPE
6580 && (IS_SIGNATURE_POINTER (rhstype)
6581 || IS_SIGNATURE_REFERENCE (rhstype)))))
6583 register tree ttl = TREE_TYPE (type);
6587 if (coder == RECORD_TYPE)
6589 rhs = build_optr_ref (rhs);
6590 rhstype = TREE_TYPE (rhs);
6592 ttr = TREE_TYPE (rhstype);
6594 /* If both pointers are of aggregate type, then we
6595 can give better error messages, and save some work
6597 if (TREE_CODE (ttl) == RECORD_TYPE && TREE_CODE (ttr) == RECORD_TYPE)
6601 if (TYPE_MAIN_VARIANT (ttl) == TYPE_MAIN_VARIANT (ttr)
6602 || type == class_star_type_node
6603 || rhstype == class_star_type_node)
6604 binfo = TYPE_BINFO (ttl);
6606 binfo = get_binfo (ttl, ttr, 1);
6608 if (binfo == error_mark_node)
6609 return error_mark_node;
6611 return error_not_base_type (ttl, ttr);
6613 if (!at_least_as_qualified_p (ttl, ttr))
6616 cp_error ("passing `%T' as argument %P of `%D' discards qualifiers",
6617 rhstype, parmnum, fndecl);
6619 cp_error ("%s to `%T' from `%T' discards qualifiers",
6620 errtype, type, rhstype);
6624 /* Any non-function converts to a [const][volatile] void *
6625 and vice versa; otherwise, targets must be the same.
6626 Meanwhile, the lhs target must have all the qualifiers of the rhs. */
6627 else if (TYPE_MAIN_VARIANT (ttl) == void_type_node
6628 || TYPE_MAIN_VARIANT (ttr) == void_type_node
6629 || (ctt = comp_target_types (type, rhstype, 1))
6630 || (unsigned_type (TYPE_MAIN_VARIANT (ttl))
6631 == unsigned_type (TYPE_MAIN_VARIANT (ttr))))
6633 /* ARM $4.8, commentary on p39. */
6634 if (TYPE_MAIN_VARIANT (ttl) == void_type_node
6635 && TREE_CODE (ttr) == OFFSET_TYPE)
6637 cp_error ("no standard conversion from `%T' to `void *'", ttr);
6638 return error_mark_node;
6641 if (ctt < 0 && TYPE_MAIN_VARIANT (ttl) != TYPE_MAIN_VARIANT (ttr))
6642 cp_pedwarn ("converting `%T' to `%T' is a contravariance violation",
6645 if (TYPE_MAIN_VARIANT (ttl) != void_type_node
6646 && TYPE_MAIN_VARIANT (ttr) == void_type_node
6647 && ! null_ptr_cst_p (rhs))
6649 if (coder == RECORD_TYPE)
6650 cp_pedwarn ("implicit conversion of signature pointer to type `%T'",
6653 pedwarn ("ANSI C++ forbids implicit conversion from `void *' in %s",
6656 /* Const and volatile mean something different for function types,
6657 so the usual warnings are not appropriate. */
6658 else if ((TREE_CODE (ttr) != FUNCTION_TYPE && TREE_CODE (ttr) != METHOD_TYPE)
6659 || (TREE_CODE (ttl) != FUNCTION_TYPE && TREE_CODE (ttl) != METHOD_TYPE))
6661 if (TREE_CODE (ttl) == OFFSET_TYPE
6662 && binfo_member (TYPE_OFFSET_BASETYPE (ttr),
6663 CLASSTYPE_VBASECLASSES (TYPE_OFFSET_BASETYPE (ttl))))
6665 error ("%s between pointer to members converting across virtual baseclasses", errtype);
6666 return error_mark_node;
6668 else if (!at_least_as_qualified_p (ttl, ttr))
6670 if (string_conv_p (type, rhs, 1))
6671 /* converting from string constant to char *, OK. */;
6673 cp_error ("passing `%T' as argument %P of `%D' discards qualifiers",
6674 rhstype, parmnum, fndecl);
6676 cp_error ("%s to `%T' from `%T' discards qualifiers",
6677 errtype, type, rhstype);
6679 else if (TREE_CODE (ttl) == TREE_CODE (ttr)
6680 && ! comp_target_types (type, rhstype, 1))
6683 cp_pedwarn ("passing `%T' as argument %P of `%D' changes signedness",
6684 rhstype, parmnum, fndecl);
6686 cp_pedwarn ("%s to `%T' from `%T' changes signedness",
6687 errtype, type, rhstype);
6694 int drops_quals = 0;
6696 int unsigned_parity;
6699 /* This code is basically a duplicate of comp_ptr_ttypes_real. */
6700 for (; ; ttl = TREE_TYPE (ttl), ttr = TREE_TYPE (ttr))
6703 drops_quals |= !at_least_as_qualified_p (ttl, ttr);
6706 && !at_least_as_qualified_p (ttr, ttl))
6708 left_const &= TYPE_READONLY (ttl);
6710 if (TREE_CODE (ttl) != POINTER_TYPE
6711 || TREE_CODE (ttr) != POINTER_TYPE)
6714 unsigned_parity = TREE_UNSIGNED (ttl) - TREE_UNSIGNED (ttr);
6715 if (unsigned_parity)
6717 if (TREE_UNSIGNED (ttl))
6718 ttr = unsigned_type (ttr);
6720 ttl = unsigned_type (ttl);
6723 if (comp_target_types (ttl, ttr, nptrs) > 0)
6728 cp_pedwarn ("passing `%T' as argument %P of `%D' adds cv-quals without intervening `const'",
6729 rhstype, parmnum, fndecl);
6731 cp_pedwarn ("%s to `%T' from `%T' adds cv-quals without intervening `const'",
6732 errtype, type, rhstype);
6737 cp_error ("passing `%T' as argument %P of `%D' discards qualifiers",
6738 rhstype, parmnum, fndecl);
6740 cp_error ("%s to `%T' from `%T' discards qualifiers",
6741 errtype, type, rhstype);
6743 if (unsigned_parity > 0)
6746 cp_pedwarn ("passing `%T' as argument %P of `%D' changes signed to unsigned",
6747 rhstype, parmnum, fndecl);
6749 cp_pedwarn ("%s to `%T' from `%T' changes signed to unsigned",
6750 errtype, type, rhstype);
6752 else if (unsigned_parity < 0)
6755 cp_pedwarn ("passing `%T' as argument %P of `%D' changes unsigned to signed",
6756 rhstype, parmnum, fndecl);
6758 cp_pedwarn ("%s to `%T' from `%T' changes unsigned to signed",
6759 errtype, type, rhstype);
6762 /* C++ is not so friendly about converting function and
6763 member function pointers as C. Emit warnings here. */
6764 if (TREE_CODE (ttl) == FUNCTION_TYPE
6765 || TREE_CODE (ttl) == METHOD_TYPE)
6766 if (!same_or_base_type_p (ttl, ttr))
6768 warning ("conflicting function types in %s:", errtype);
6769 cp_warning ("\t`%T' != `%T'", type, rhstype);
6775 cp_error ("passing `%T' as argument %P of `%D'",
6776 rhstype, parmnum, fndecl);
6778 cp_error ("%s to `%T' from `%T'", errtype, type, rhstype);
6779 return error_mark_node;
6782 return cp_convert (type, rhs);
6784 else if (codel == POINTER_TYPE && coder == INTEGER_TYPE)
6786 /* An explicit constant 0 can convert to a pointer,
6787 but not a 0 that results from casting or folding. */
6788 if (! (TREE_CODE (rhs) == INTEGER_CST && integer_zerop (rhs)))
6791 cp_pedwarn ("passing `%T' to argument %P of `%D' lacks a cast",
6792 rhstype, parmnum, fndecl);
6794 cp_pedwarn ("%s to `%T' from `%T' lacks a cast",
6795 errtype, type, rhstype);
6797 return cp_convert (type, rhs);
6799 else if (codel == INTEGER_TYPE
6800 && (coder == POINTER_TYPE
6801 || (coder == RECORD_TYPE
6802 && (IS_SIGNATURE_POINTER (rhstype)
6803 || TYPE_PTRMEMFUNC_FLAG (rhstype)
6804 || IS_SIGNATURE_REFERENCE (rhstype)))))
6807 cp_pedwarn ("passing `%T' to argument %P of `%D' lacks a cast",
6808 rhstype, parmnum, fndecl);
6810 cp_pedwarn ("%s to `%T' from `%T' lacks a cast",
6811 errtype, type, rhstype);
6812 return cp_convert (type, rhs);
6814 else if (codel == BOOLEAN_TYPE
6815 && (coder == POINTER_TYPE
6816 || (coder == RECORD_TYPE
6817 && (IS_SIGNATURE_POINTER (rhstype)
6818 || TYPE_PTRMEMFUNC_FLAG (rhstype)
6819 || IS_SIGNATURE_REFERENCE (rhstype)))))
6820 return cp_convert (type, rhs);
6823 else if (((coder == POINTER_TYPE
6824 && TREE_CODE (TREE_TYPE (rhstype)) == METHOD_TYPE)
6825 || integer_zerop (rhs)
6826 || TYPE_PTRMEMFUNC_P (rhstype))
6827 && TYPE_PTRMEMFUNC_P (type))
6829 tree ttl = TYPE_PTRMEMFUNC_FN_TYPE (type);
6830 tree ttr = (TYPE_PTRMEMFUNC_P (rhstype)
6831 ? TYPE_PTRMEMFUNC_FN_TYPE (rhstype)
6833 int ctt = (TREE_CODE (rhstype) == INTEGER_TYPE ? 1
6834 : comp_target_types (ttl, ttr, 1));
6837 cp_pedwarn ("converting `%T' to `%T' is a contravariance violation",
6840 cp_error ("%s to `%T' from `%T'", errtype, ttl, ttr);
6842 /* compatible pointer to member functions. */
6843 return build_ptrmemfunc (ttl, rhs, 0);
6845 else if (codel == ERROR_MARK || coder == ERROR_MARK)
6846 return error_mark_node;
6848 /* This should no longer happen. References are initialized via
6849 `convert_for_initialization'. They should otherwise be
6850 bashed before coming here. */
6851 else if (codel == REFERENCE_TYPE)
6852 my_friendly_abort (317);
6853 else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (rhs)))
6855 tree nrhs = build1 (NOP_EXPR, type, rhs);
6856 TREE_CONSTANT (nrhs) = TREE_CONSTANT (rhs);
6859 else if (TYPE_HAS_CONSTRUCTOR (type) || IS_AGGR_TYPE (TREE_TYPE (rhs)))
6860 return cp_convert (type, rhs);
6861 /* Handle anachronistic conversions from (::*)() to cv void* or (*)(). */
6862 else if (TREE_CODE (type) == POINTER_TYPE
6863 && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
6864 || TYPE_MAIN_VARIANT (TREE_TYPE (type)) == void_type_node)
6866 && TYPE_PTRMEMFUNC_P (TREE_TYPE (rhs)))
6867 return cp_convert (type, rhs);
6869 cp_error ("%s to `%T' from `%T'", errtype, type, rhstype);
6870 return error_mark_node;
6873 /* Convert RHS to be of type TYPE.
6874 If EXP is non-zero, it is the target of the initialization.
6875 ERRTYPE is a string to use in error messages.
6877 Two major differences between the behavior of
6878 `convert_for_assignment' and `convert_for_initialization'
6879 are that references are bashed in the former, while
6880 copied in the latter, and aggregates are assigned in
6881 the former (operator=) while initialized in the
6884 If using constructor make sure no conversion operator exists, if one does
6885 exist, an ambiguity exists.
6887 If flags doesn't include LOOKUP_COMPLAIN, don't complain about anything. */
6890 convert_for_initialization (exp, type, rhs, flags, errtype, fndecl, parmnum)
6891 tree exp, type, rhs;
6897 register enum tree_code codel = TREE_CODE (type);
6898 register tree rhstype;
6899 register enum tree_code coder;
6901 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
6902 Strip such NOP_EXPRs, since RHS is used in non-lvalue context. */
6903 if (TREE_CODE (rhs) == NOP_EXPR
6904 && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))
6905 && codel != REFERENCE_TYPE)
6906 rhs = TREE_OPERAND (rhs, 0);
6908 if (rhs == error_mark_node
6909 || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node))
6910 return error_mark_node;
6912 if (TREE_CODE (TREE_TYPE (rhs)) == OFFSET_TYPE)
6914 rhs = resolve_offset_ref (rhs);
6915 if (rhs == error_mark_node)
6916 return error_mark_node;
6919 if (TREE_CODE (TREE_TYPE (rhs)) == REFERENCE_TYPE)
6920 rhs = convert_from_reference (rhs);
6922 if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
6923 && TREE_CODE (type) != ARRAY_TYPE
6924 && (TREE_CODE (type) != REFERENCE_TYPE
6925 || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
6926 || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
6927 || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
6928 rhs = default_conversion (rhs);
6930 rhstype = TREE_TYPE (rhs);
6931 coder = TREE_CODE (rhstype);
6933 if (coder == ERROR_MARK)
6934 return error_mark_node;
6936 /* We accept references to incomplete types, so we can
6937 return here before checking if RHS is of complete type. */
6939 if (codel == REFERENCE_TYPE)
6941 /* This should eventually happen in convert_arguments. */
6942 extern int warningcount, errorcount;
6943 int savew = 0, savee = 0;
6946 savew = warningcount, savee = errorcount;
6947 rhs = convert_to_reference (type, rhs, CONV_IMPLICIT, flags,
6948 exp ? exp : error_mark_node);
6951 if (warningcount > savew)
6952 cp_warning_at ("in passing argument %P of `%+D'", parmnum, fndecl);
6953 else if (errorcount > savee)
6954 cp_error_at ("in passing argument %P of `%+D'", parmnum, fndecl);
6959 rhs = require_complete_type (rhs);
6960 if (rhs == error_mark_node)
6961 return error_mark_node;
6963 if (exp != 0) exp = require_complete_type (exp);
6964 if (exp == error_mark_node)
6965 return error_mark_node;
6967 if (TREE_CODE (rhstype) == REFERENCE_TYPE)
6968 rhstype = TREE_TYPE (rhstype);
6970 type = complete_type (type);
6972 if (TYPE_LANG_SPECIFIC (type)
6973 && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type)))
6974 return build_signature_pointer_constructor (type, rhs);
6976 if (IS_AGGR_TYPE (type))
6977 return ocp_convert (type, rhs, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
6979 if (type == TREE_TYPE (rhs))
6981 /* Issue warnings about peculiar, but legal, uses of NULL. We
6982 do this *before* the call to decl_constant_value so as to
6983 avoid duplicate warnings on code like `const int I = NULL;
6985 if (ARITHMETIC_TYPE_P (type) && rhs == null_node)
6986 cp_warning ("converting NULL to non-pointer type");
6988 if (TREE_READONLY_DECL_P (rhs))
6989 rhs = decl_constant_value (rhs);
6994 return convert_for_assignment (type, rhs, errtype, fndecl, parmnum);
6997 /* Expand an ASM statement with operands, handling output operands
6998 that are not variables or INDIRECT_REFS by transforming such
6999 cases into cases that expand_asm_operands can handle.
7001 Arguments are same as for expand_asm_operands.
7003 We don't do default conversions on all inputs, because it can screw
7004 up operands that are expected to be in memory. */
7007 c_expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
7008 tree string, outputs, inputs, clobbers;
7013 int noutputs = list_length (outputs);
7015 /* o[I] is the place that output number I should be written. */
7016 register tree *o = (tree *) alloca (noutputs * sizeof (tree));
7019 /* Record the contents of OUTPUTS before it is modified. */
7020 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
7021 o[i] = TREE_VALUE (tail);
7023 /* Generate the ASM_OPERANDS insn;
7024 store into the TREE_VALUEs of OUTPUTS some trees for
7025 where the values were actually stored. */
7026 expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line);
7028 /* Copy all the intermediate outputs into the specified outputs. */
7029 for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
7031 if (o[i] != TREE_VALUE (tail))
7033 expand_expr (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail)),
7034 const0_rtx, VOIDmode, EXPAND_NORMAL);
7037 /* Detect modification of read-only values.
7038 (Otherwise done by build_modify_expr.) */
7041 tree type = TREE_TYPE (o[i]);
7042 if (CP_TYPE_CONST_P (type)
7043 || ((TREE_CODE (type) == RECORD_TYPE
7044 || TREE_CODE (type) == UNION_TYPE)
7045 && C_TYPE_FIELDS_READONLY (type)))
7046 readonly_error (o[i], "modification by `asm'", 1);
7050 /* Those MODIFY_EXPRs could do autoincrements. */
7054 /* Expand a C `return' statement.
7055 RETVAL is the expression for what to return,
7056 or a null pointer for `return;' with no value.
7058 C++: upon seeing a `return', we must call destructors on all
7059 variables in scope which had constructors called on them.
7060 This means that if in a destructor, the base class destructors
7061 must be called before returning.
7063 The RETURN statement in C++ has initialization semantics. */
7066 c_expand_return (retval)
7069 extern struct nesting *cond_stack, *loop_stack, *case_stack;
7070 extern tree dtor_label, ctor_label;
7071 tree result = DECL_RESULT (current_function_decl);
7072 tree valtype = TREE_TYPE (result);
7074 if (TREE_THIS_VOLATILE (current_function_decl))
7075 warning ("function declared `noreturn' has a `return' statement");
7077 if (retval == error_mark_node)
7079 current_function_returns_null = 1;
7083 if (processing_template_decl)
7085 add_tree (build_min_nt (RETURN_STMT, retval));
7092 error ("returning a value from a destructor");
7094 /* Can't just return from a destructor. */
7095 expand_goto (dtor_label);
7099 if (retval == NULL_TREE)
7101 /* A non-named return value does not count. */
7103 if (DECL_CONSTRUCTOR_P (current_function_decl))
7104 retval = current_class_ptr;
7105 else if (DECL_NAME (result) != NULL_TREE
7106 && TREE_CODE (valtype) != VOID_TYPE)
7110 current_function_returns_null = 1;
7112 if (valtype != NULL_TREE && TREE_CODE (valtype) != VOID_TYPE)
7114 if (DECL_NAME (DECL_RESULT (current_function_decl)) == NULL_TREE)
7116 pedwarn ("`return' with no value, in function returning non-void");
7117 /* Clear this, so finish_function won't say that we
7118 reach the end of a non-void function (which we don't,
7119 we gave a return!). */
7120 current_function_returns_null = 0;
7124 expand_null_return ();
7128 else if (DECL_CONSTRUCTOR_P (current_function_decl))
7130 if (flag_this_is_variable)
7131 error ("return from a constructor: use `this = ...' instead");
7133 error ("returning a value from a constructor");
7134 retval = current_class_ptr;
7137 /* Effective C++ rule 15. See also start_function. */
7139 && DECL_NAME (current_function_decl) == ansi_opname[(int) MODIFY_EXPR]
7140 && retval != current_class_ref)
7141 cp_warning ("`operator=' should return a reference to `*this'");
7143 if (valtype == NULL_TREE || TREE_CODE (valtype) == VOID_TYPE)
7145 current_function_returns_null = 1;
7146 if (TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
7147 pedwarn ("`return' with a value, in function returning void");
7148 expand_return (retval);
7152 /* Now deal with possible C++ hair:
7153 (1) Compute the return value.
7154 (2) If there are aggregate values with destructors which
7155 must be cleaned up, clean them (taking care
7156 not to clobber the return value).
7157 (3) If an X(X&) constructor is defined, the return
7158 value must be returned via that. */
7160 if (retval == result
7161 || DECL_CONSTRUCTOR_P (current_function_decl))
7162 /* It's already done for us. */;
7163 else if (TREE_TYPE (retval) == void_type_node)
7165 pedwarn ("return of void value in function returning non-void");
7166 expand_expr_stmt (retval);
7171 tree functype = TREE_TYPE (TREE_TYPE (current_function_decl));
7173 /* First convert the value to the function's return type, then
7174 to the type of return value's location to handle the
7175 case that functype is thiner than the valtype. */
7177 retval = convert_for_initialization
7178 (NULL_TREE, functype, retval, LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING,
7179 "return", NULL_TREE, 0);
7181 retval = convert (valtype, retval);
7183 if (retval == error_mark_node)
7185 /* Avoid warning about control reaching end of function. */
7186 expand_null_return ();
7190 /* We can't initialize a register from a AGGR_INIT_EXPR. */
7191 else if (! current_function_returns_struct
7192 && TREE_CODE (retval) == TARGET_EXPR
7193 && TREE_CODE (TREE_OPERAND (retval, 1)) == AGGR_INIT_EXPR)
7194 retval = build (COMPOUND_EXPR, TREE_TYPE (retval), retval,
7195 TREE_OPERAND (retval, 0));
7197 /* Add some useful error checking for C++. */
7198 else if (TREE_CODE (valtype) == REFERENCE_TYPE)
7200 tree whats_returned;
7202 /* Sort through common things to see what it is
7203 we are returning. */
7204 whats_returned = retval;
7205 if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
7207 whats_returned = TREE_OPERAND (whats_returned, 1);
7208 if (TREE_CODE (whats_returned) == ADDR_EXPR)
7209 whats_returned = TREE_OPERAND (whats_returned, 0);
7211 while (TREE_CODE (whats_returned) == CONVERT_EXPR
7212 || TREE_CODE (whats_returned) == NOP_EXPR)
7213 whats_returned = TREE_OPERAND (whats_returned, 0);
7214 if (TREE_CODE (whats_returned) == ADDR_EXPR)
7216 whats_returned = TREE_OPERAND (whats_returned, 0);
7217 while (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
7218 || TREE_CODE (whats_returned) == TARGET_EXPR)
7220 /* Get the target. */
7221 whats_returned = TREE_OPERAND (whats_returned, 0);
7222 warning ("returning reference to temporary");
7226 if (TREE_CODE (whats_returned) == VAR_DECL && DECL_NAME (whats_returned))
7228 if (TEMP_NAME_P (DECL_NAME (whats_returned)))
7229 warning ("reference to non-lvalue returned");
7230 else if (TREE_CODE (TREE_TYPE (whats_returned)) != REFERENCE_TYPE
7231 && ! TREE_STATIC (whats_returned)
7232 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (whats_returned))
7233 && !TREE_PUBLIC (whats_returned))
7234 cp_warning_at ("reference to local variable `%D' returned", whats_returned);
7237 else if (TREE_CODE (retval) == ADDR_EXPR)
7239 tree whats_returned = TREE_OPERAND (retval, 0);
7241 if (TREE_CODE (whats_returned) == VAR_DECL
7242 && DECL_NAME (whats_returned)
7243 && IDENTIFIER_LOCAL_VALUE (DECL_NAME (whats_returned))
7244 && !TREE_STATIC (whats_returned)
7245 && !TREE_PUBLIC (whats_returned))
7246 cp_warning_at ("address of local variable `%D' returned", whats_returned);
7250 if (retval != NULL_TREE
7251 && TREE_CODE_CLASS (TREE_CODE (retval)) == 'd'
7252 && cond_stack == 0 && loop_stack == 0 && case_stack == 0)
7253 current_function_return_value = retval;
7255 if (ctor_label && TREE_CODE (ctor_label) != ERROR_MARK)
7257 /* Here RETVAL is CURRENT_CLASS_PTR, so there's nothing to do. */
7258 expand_goto (ctor_label);
7261 if (retval && retval != result)
7263 result = build (INIT_EXPR, TREE_TYPE (result), result, retval);
7264 TREE_SIDE_EFFECTS (result) = 1;
7267 expand_start_target_temps ();
7269 expand_return (result);
7271 expand_end_target_temps ();
7273 current_function_returns_value = 1;
7276 /* Start a C switch statement, testing expression EXP.
7277 Return EXP if it is valid, an error node otherwise. */
7280 c_expand_start_case (exp)
7284 register enum tree_code code;
7286 /* Convert from references, etc. */
7287 exp = default_conversion (exp);
7288 type = TREE_TYPE (exp);
7289 code = TREE_CODE (type);
7291 if (IS_AGGR_TYPE_CODE (code))
7292 exp = build_type_conversion (CONVERT_EXPR, integer_type_node, exp, 1);
7294 if (exp == NULL_TREE)
7296 error ("switch quantity not an integer");
7297 exp = error_mark_node;
7299 type = TREE_TYPE (exp);
7300 code = TREE_CODE (type);
7302 if (code != INTEGER_TYPE && code != ENUMERAL_TYPE && code != ERROR_MARK)
7304 error ("switch quantity not an integer");
7305 exp = error_mark_node;
7311 exp = default_conversion (exp);
7312 type = TREE_TYPE (exp);
7313 idx = get_unwidened (exp, 0);
7314 /* We can't strip a conversion from a signed type to an unsigned,
7315 because if we did, int_fits_type_p would do the wrong thing
7316 when checking case values for being in range,
7317 and it's too hard to do the right thing. */
7318 if (TREE_UNSIGNED (TREE_TYPE (exp))
7319 == TREE_UNSIGNED (TREE_TYPE (idx)))
7324 (1, fold (build1 (CLEANUP_POINT_EXPR, TREE_TYPE (exp), exp)),
7325 type, "switch statement");
7330 /* Returns non-zero if the pointer-type FROM can be converted to the
7331 pointer-type TO via a qualification conversion. If CONSTP is -1,
7332 then we return non-zero if the pointers are similar, and the
7333 cv-qualification signature of FROM is a proper subset of that of TO.
7335 If CONSTP is positive, then all outer pointers have been
7339 comp_ptr_ttypes_real (to, from, constp)
7343 int to_more_cv_qualified = 0;
7345 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7347 if (TREE_CODE (to) != TREE_CODE (from))
7350 if (TREE_CODE (from) == OFFSET_TYPE
7351 && same_type_p (TYPE_OFFSET_BASETYPE (from),
7352 TYPE_OFFSET_BASETYPE (to)))
7355 /* Const and volatile mean something different for function types,
7356 so the usual checks are not appropriate. */
7357 if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
7359 if (!at_least_as_qualified_p (to, from))
7362 if (!at_least_as_qualified_p (from, to))
7367 ++to_more_cv_qualified;
7371 constp &= TYPE_READONLY (to);
7374 if (TREE_CODE (to) != POINTER_TYPE)
7376 same_type_p (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from))
7377 && (constp >= 0 || to_more_cv_qualified);
7381 /* When comparing, say, char ** to char const **, this function takes the
7382 'char *' and 'char const *'. Do not pass non-pointer types to this
7386 comp_ptr_ttypes (to, from)
7389 return comp_ptr_ttypes_real (to, from, 1);
7392 /* Returns 1 if to and from are (possibly multi-level) pointers to the same
7393 type or inheritance-related types, regardless of cv-quals. */
7396 ptr_reasonably_similar (to, from)
7399 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7401 if (TREE_CODE (to) != TREE_CODE (from))
7404 if (TREE_CODE (from) == OFFSET_TYPE
7405 && comptypes (TYPE_OFFSET_BASETYPE (to),
7406 TYPE_OFFSET_BASETYPE (from),
7407 COMPARE_BASE | COMPARE_RELAXED))
7410 if (TREE_CODE (to) != POINTER_TYPE)
7412 (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
7413 COMPARE_BASE | COMPARE_RELAXED);
7417 /* Like comp_ptr_ttypes, for const_cast. */
7420 comp_ptr_ttypes_const (to, from)
7423 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7425 if (TREE_CODE (to) != TREE_CODE (from))
7428 if (TREE_CODE (from) == OFFSET_TYPE
7429 && same_type_p (TYPE_OFFSET_BASETYPE (from),
7430 TYPE_OFFSET_BASETYPE (to)))
7433 if (TREE_CODE (to) != POINTER_TYPE)
7434 return same_type_p (TYPE_MAIN_VARIANT (to),
7435 TYPE_MAIN_VARIANT (from));
7439 /* Like comp_ptr_ttypes, for reinterpret_cast. */
7442 comp_ptr_ttypes_reinterpret (to, from)
7447 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7449 if (TREE_CODE (from) == OFFSET_TYPE)
7450 from = TREE_TYPE (from);
7451 if (TREE_CODE (to) == OFFSET_TYPE)
7452 to = TREE_TYPE (to);
7454 if (TREE_CODE (to) != TREE_CODE (from))
7457 /* Const and volatile mean something different for function types,
7458 so the usual checks are not appropriate. */
7459 if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
7461 if (!at_least_as_qualified_p (to, from))
7465 && !at_least_as_qualified_p (from, to))
7467 constp &= TYPE_READONLY (to);
7470 if (TREE_CODE (to) != POINTER_TYPE)
7475 /* Returns the type-qualifier set corresponding to TYPE. */
7478 cp_type_quals (type)
7481 while (TREE_CODE (type) == ARRAY_TYPE)
7482 type = TREE_TYPE (type);
7484 return TYPE_QUALS (type);