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