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