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