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