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