]> gcc.gnu.org Git - gcc.git/blame - gcc/cp/typeck.c
typeck.c (decay_conversion): Any expression with type nullptr_t decays to nullptr.
[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,
135d47df 3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
fbc8d2d3 4 Free Software Foundation, Inc.
8d08fdba
MS
5 Hacked by Michael Tiemann (tiemann@cygnus.com)
6
f5adbb8d 7This file is part of GCC.
8d08fdba 8
f5adbb8d 9GCC is free software; you can redistribute it and/or modify
8d08fdba 10it under the terms of the GNU General Public License as published by
e77f031d 11the Free Software Foundation; either version 3, or (at your option)
8d08fdba
MS
12any later version.
13
f5adbb8d 14GCC is distributed in the hope that it will be useful,
8d08fdba
MS
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
e77f031d
NC
20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
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 33#include "tree.h"
8d08fdba
MS
34#include "cp-tree.h"
35#include "flags.h"
e8abc66f 36#include "output.h"
12027a89 37#include "toplev.h"
2a2b2d43 38#include "diagnostic.h"
ff84991f 39#include "intl.h"
672a6f42 40#include "target.h"
7b6d72fc 41#include "convert.h"
39dabefd 42#include "c-family/c-common.h"
06d40de8 43#include "params.h"
8d08fdba 44
b5791fdc 45static tree pfn_from_ptrmemfunc (tree);
a298680c 46static tree delta_from_ptrmemfunc (tree);
2f5b91f5 47static tree convert_for_assignment (tree, tree, impl_conv_rhs, tree, int,
e57d93c6 48 tsubst_flags_t, int);
acd8e2d0 49static tree cp_pointer_int_sum (enum tree_code, tree, tree);
5ade1ed2
DG
50static tree rationalize_conditional_expr (enum tree_code, tree,
51 tsubst_flags_t);
acd8e2d0 52static int comp_ptr_ttypes_real (tree, tree, int);
acd8e2d0 53static bool comp_except_types (tree, tree, bool);
58f9752a 54static bool comp_array_types (const_tree, const_tree, bool);
acd8e2d0 55static tree pointer_diff (tree, tree, tree);
135d47df 56static tree get_delta_difference (tree, tree, bool, bool, tsubst_flags_t);
acd8e2d0
NS
57static void casts_away_constness_r (tree *, tree *);
58static bool casts_away_constness (tree, tree);
59static void maybe_warn_about_returning_address_of_local (tree);
a723baf1 60static tree lookup_destructor (tree, tree, tree);
8cdea6ab 61static void warn_args_num (location_t, tree, bool);
c166b898 62static int convert_arguments (tree, VEC(tree,gc) **, tree, int,
5ade1ed2 63 tsubst_flags_t);
8d08fdba 64
8d08fdba 65/* Do `exp = require_complete_type (exp);' to make sure exp
ae58fa02
MM
66 does not have an incomplete type. (That includes void types.)
67 Returns the error_mark_node if the VALUE does not have
68 complete type when this function returns. */
8d08fdba
MS
69
70tree
acd8e2d0 71require_complete_type (tree value)
8d08fdba 72{
5566b478
MS
73 tree type;
74
66543169 75 if (processing_template_decl || value == error_mark_node)
5566b478
MS
76 return value;
77
2c73f9f5
ML
78 if (TREE_CODE (value) == OVERLOAD)
79 type = unknown_type_node;
80 else
81 type = TREE_TYPE (value);
8d08fdba 82
ae5cbc33
RS
83 if (type == error_mark_node)
84 return error_mark_node;
85
8d08fdba 86 /* First, detect a valid value with a complete type. */
d0f062fb 87 if (COMPLETE_TYPE_P (type))
8d08fdba
MS
88 return value;
89
66543169 90 if (complete_type_or_else (type, value))
8f259df3
MM
91 return value;
92 else
ae58fa02 93 return error_mark_node;
8d08fdba
MS
94}
95
8f259df3
MM
96/* Try to complete TYPE, if it is incomplete. For example, if TYPE is
97 a template instantiation, do the instantiation. Returns TYPE,
98 whether or not it could be completed, unless something goes
99 horribly wrong, in which case the error_mark_node is returned. */
100
5566b478 101tree
acd8e2d0 102complete_type (tree type)
5566b478 103{
8857f91e
MM
104 if (type == NULL_TREE)
105 /* Rather than crash, we return something sure to cause an error
106 at some point. */
107 return error_mark_node;
108
d0f062fb 109 if (type == error_mark_node || COMPLETE_TYPE_P (type))
5566b478 110 ;
e349ee73 111 else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
5566b478
MS
112 {
113 tree t = complete_type (TREE_TYPE (type));
73bebd55 114 unsigned int needs_constructing, has_nontrivial_dtor;
1e2e9f54 115 if (COMPLETE_TYPE_P (t) && !dependent_type_p (type))
6467930b 116 layout_type (type);
73bebd55 117 needs_constructing
c73964b2 118 = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (t));
73bebd55 119 has_nontrivial_dtor
834c6dff 120 = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TYPE_MAIN_VARIANT (t));
73bebd55
JJ
121 for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
122 {
123 TYPE_NEEDS_CONSTRUCTING (t) = needs_constructing;
124 TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = has_nontrivial_dtor;
125 }
5566b478 126 }
7ddedda4 127 else if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_INSTANTIATION (type))
e76a2646 128 instantiate_class_template (TYPE_MAIN_VARIANT (type));
5566b478
MS
129
130 return type;
131}
132
5aa3396c 133/* Like complete_type, but issue an error if the TYPE cannot be completed.
be20e673 134 VALUE is used for informative diagnostics.
66543169 135 Returns NULL_TREE if the type cannot be made complete. */
8f259df3
MM
136
137tree
be20e673 138complete_type_or_else (tree type, tree value)
8f259df3
MM
139{
140 type = complete_type (type);
ae58fa02
MM
141 if (type == error_mark_node)
142 /* We already issued an error. */
143 return NULL_TREE;
d0f062fb 144 else if (!COMPLETE_TYPE_P (type))
8f259df3 145 {
71205d17 146 cxx_incomplete_type_diagnostic (value, type, DK_ERROR);
8f259df3
MM
147 return NULL_TREE;
148 }
149 else
150 return type;
151}
152
8d08fdba 153/* Return truthvalue of whether type of EXP is instantiated. */
e92cc029 154
8d08fdba 155int
58f9752a 156type_unknown_p (const_tree exp)
8d08fdba 157{
26bcf8fc 158 return (TREE_CODE (exp) == TREE_LIST
a5ac359a 159 || TREE_TYPE (exp) == unknown_type_node);
8d08fdba
MS
160}
161
8d08fdba
MS
162\f
163/* Return the common type of two parameter lists.
96d84882 164 We assume that comptypes has already been done and returned 1;
8d08fdba
MS
165 if that isn't so, this may crash.
166
167 As an optimization, free the space we allocate if the parameter
168 lists are already common. */
169
10b2bcdd 170static tree
5671bf27 171commonparms (tree p1, tree p2)
8d08fdba
MS
172{
173 tree oldargs = p1, newargs, n;
174 int i, len;
175 int any_change = 0;
8d08fdba
MS
176
177 len = list_length (p1);
178 newargs = tree_last (p1);
179
180 if (newargs == void_list_node)
181 i = 1;
182 else
183 {
184 i = 0;
185 newargs = 0;
186 }
187
188 for (; i < len; i++)
189 newargs = tree_cons (NULL_TREE, NULL_TREE, newargs);
190
191 n = newargs;
192
193 for (i = 0; p1;
194 p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n), i++)
195 {
196 if (TREE_PURPOSE (p1) && !TREE_PURPOSE (p2))
197 {
8d08fdba
MS
198 TREE_PURPOSE (n) = TREE_PURPOSE (p1);
199 any_change = 1;
200 }
201 else if (! TREE_PURPOSE (p1))
202 {
203 if (TREE_PURPOSE (p2))
204 {
205 TREE_PURPOSE (n) = TREE_PURPOSE (p2);
206 any_change = 1;
207 }
208 }
209 else
210 {
1743ca29 211 if (1 != simple_cst_equal (TREE_PURPOSE (p1), TREE_PURPOSE (p2)))
a4443a08 212 any_change = 1;
8d08fdba
MS
213 TREE_PURPOSE (n) = TREE_PURPOSE (p2);
214 }
215 if (TREE_VALUE (p1) != TREE_VALUE (p2))
216 {
217 any_change = 1;
6da794e8 218 TREE_VALUE (n) = merge_types (TREE_VALUE (p1), TREE_VALUE (p2));
8d08fdba
MS
219 }
220 else
221 TREE_VALUE (n) = TREE_VALUE (p1);
222 }
223 if (! any_change)
970d6386 224 return oldargs;
8d08fdba
MS
225
226 return newargs;
227}
228
f2ee215b
BK
229/* Given a type, perhaps copied for a typedef,
230 find the "original" version of it. */
993acaec 231static tree
5671bf27 232original_type (tree t)
f2ee215b 233{
8e30dcf3 234 int quals = cp_type_quals (t);
2b643eda
MM
235 while (t != error_mark_node
236 && TYPE_NAME (t) != NULL_TREE)
f2ee215b
BK
237 {
238 tree x = TYPE_NAME (t);
239 if (TREE_CODE (x) != TYPE_DECL)
240 break;
241 x = DECL_ORIGINAL_TYPE (x);
242 if (x == NULL_TREE)
243 break;
244 t = x;
245 }
8e30dcf3 246 return cp_build_qualified_type (t, quals);
f2ee215b
BK
247}
248
98f2f3a2
MLI
249/* Return the common type for two arithmetic types T1 and T2 under the
250 usual arithmetic conversions. The default conversions have already
251 been applied, and enumerated types converted to their compatible
252 integer types. */
a7a64a77 253
98f2f3a2
MLI
254static tree
255cp_common_type (tree t1, tree t2)
a7a64a77
MM
256{
257 enum tree_code code1 = TREE_CODE (t1);
258 enum tree_code code2 = TREE_CODE (t2);
259 tree attributes;
260
550a799d
JM
261 /* In what follows, we slightly generalize the rules given in [expr] so
262 as to deal with `long long' and `complex'. First, merge the
263 attributes. */
264 attributes = (*targetm.merge_type_attributes) (t1, t2);
265
266 if (SCOPED_ENUM_P (t1) || SCOPED_ENUM_P (t2))
267 {
268 if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
269 return build_type_attribute_variant (t1, attributes);
270 else
271 return NULL_TREE;
272 }
273
a7a64a77 274 /* FIXME: Attributes. */
c8094d83 275 gcc_assert (ARITHMETIC_TYPE_P (t1)
73042643 276 || TREE_CODE (t1) == VECTOR_TYPE
adf2edec 277 || UNSCOPED_ENUM_P (t1));
c8094d83 278 gcc_assert (ARITHMETIC_TYPE_P (t2)
01c15146 279 || TREE_CODE (t2) == VECTOR_TYPE
adf2edec 280 || UNSCOPED_ENUM_P (t2));
a7a64a77 281
6da794e8
JM
282 /* If one type is complex, form the common type of the non-complex
283 components, then make that complex. Use T1 or T2 if it is the
284 required type. */
285 if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE)
286 {
287 tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1;
288 tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2;
289 tree subtype
290 = type_after_usual_arithmetic_conversions (subtype1, subtype2);
291
292 if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype)
293 return build_type_attribute_variant (t1, attributes);
294 else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
295 return build_type_attribute_variant (t2, attributes);
296 else
297 return build_type_attribute_variant (build_complex_type (subtype),
298 attributes);
299 }
300
73042643
AH
301 if (code1 == VECTOR_TYPE)
302 {
303 /* When we get here we should have two vectors of the same size.
304 Just prefer the unsigned one if present. */
305 if (TYPE_UNSIGNED (t1))
306 return build_type_attribute_variant (t1, attributes);
307 else
308 return build_type_attribute_variant (t2, attributes);
309 }
310
a7a64a77
MM
311 /* If only one is real, use it as the result. */
312 if (code1 == REAL_TYPE && code2 != REAL_TYPE)
313 return build_type_attribute_variant (t1, attributes);
314 if (code2 == REAL_TYPE && code1 != REAL_TYPE)
315 return build_type_attribute_variant (t2, attributes);
316
a7a64a77
MM
317 /* Both real or both integers; use the one with greater precision. */
318 if (TYPE_PRECISION (t1) > TYPE_PRECISION (t2))
319 return build_type_attribute_variant (t1, attributes);
320 else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
321 return build_type_attribute_variant (t2, attributes);
322
2f4d058f
AH
323 /* The types are the same; no need to do anything fancy. */
324 if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
325 return build_type_attribute_variant (t1, attributes);
326
a7a64a77
MM
327 if (code1 != REAL_TYPE)
328 {
329 /* If one is unsigned long long, then convert the other to unsigned
330 long long. */
331 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_long_unsigned_type_node)
332 || same_type_p (TYPE_MAIN_VARIANT (t2), long_long_unsigned_type_node))
333 return build_type_attribute_variant (long_long_unsigned_type_node,
334 attributes);
335 /* If one is a long long, and the other is an unsigned long, and
336 long long can represent all the values of an unsigned long, then
337 convert to a long long. Otherwise, convert to an unsigned long
338 long. Otherwise, if either operand is long long, convert the
339 other to long long.
c8094d83 340
a7a64a77
MM
341 Since we're here, we know the TYPE_PRECISION is the same;
342 therefore converting to long long cannot represent all the values
343 of an unsigned long, so we choose unsigned long long in that
344 case. */
345 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_long_integer_type_node)
346 || same_type_p (TYPE_MAIN_VARIANT (t2), long_long_integer_type_node))
347 {
8df83eae 348 tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
c8094d83 349 ? long_long_unsigned_type_node
a7a64a77
MM
350 : long_long_integer_type_node);
351 return build_type_attribute_variant (t, attributes);
352 }
a6766312
KT
353 if (int128_integer_type_node != NULL_TREE
354 && (same_type_p (TYPE_MAIN_VARIANT (t1),
355 int128_integer_type_node)
356 || same_type_p (TYPE_MAIN_VARIANT (t2),
357 int128_integer_type_node)))
358 {
359 tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
360 ? int128_unsigned_type_node
361 : int128_integer_type_node);
362 return build_type_attribute_variant (t, attributes);
363 }
c8094d83 364
a7a64a77
MM
365 /* Go through the same procedure, but for longs. */
366 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_unsigned_type_node)
367 || same_type_p (TYPE_MAIN_VARIANT (t2), long_unsigned_type_node))
368 return build_type_attribute_variant (long_unsigned_type_node,
369 attributes);
370 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_integer_type_node)
371 || same_type_p (TYPE_MAIN_VARIANT (t2), long_integer_type_node))
372 {
8df83eae 373 tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
a7a64a77
MM
374 ? long_unsigned_type_node : long_integer_type_node);
375 return build_type_attribute_variant (t, attributes);
376 }
377 /* Otherwise prefer the unsigned one. */
8df83eae 378 if (TYPE_UNSIGNED (t1))
a7a64a77
MM
379 return build_type_attribute_variant (t1, attributes);
380 else
381 return build_type_attribute_variant (t2, attributes);
382 }
383 else
384 {
385 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_double_type_node)
386 || same_type_p (TYPE_MAIN_VARIANT (t2), long_double_type_node))
387 return build_type_attribute_variant (long_double_type_node,
388 attributes);
389 if (same_type_p (TYPE_MAIN_VARIANT (t1), double_type_node)
390 || same_type_p (TYPE_MAIN_VARIANT (t2), double_type_node))
391 return build_type_attribute_variant (double_type_node,
392 attributes);
2f4d058f
AH
393 if (same_type_p (TYPE_MAIN_VARIANT (t1), float_type_node)
394 || same_type_p (TYPE_MAIN_VARIANT (t2), float_type_node))
a7a64a77
MM
395 return build_type_attribute_variant (float_type_node,
396 attributes);
c8094d83 397
2f4d058f 398 /* Two floating-point types whose TYPE_MAIN_VARIANTs are none of
0cbd7506
MS
399 the standard C++ floating-point types. Logic earlier in this
400 function has already eliminated the possibility that
401 TYPE_PRECISION (t2) != TYPE_PRECISION (t1), so there's no
402 compelling reason to choose one or the other. */
2f4d058f 403 return build_type_attribute_variant (t1, attributes);
a7a64a77
MM
404 }
405}
406
98f2f3a2
MLI
407/* T1 and T2 are arithmetic or enumeration types. Return the type
408 that will result from the "usual arithmetic conversions" on T1 and
409 T2 as described in [expr]. */
410
411tree
412type_after_usual_arithmetic_conversions (tree t1, tree t2)
413{
414 gcc_assert (ARITHMETIC_TYPE_P (t1)
415 || TREE_CODE (t1) == VECTOR_TYPE
416 || UNSCOPED_ENUM_P (t1));
417 gcc_assert (ARITHMETIC_TYPE_P (t2)
418 || TREE_CODE (t2) == VECTOR_TYPE
419 || UNSCOPED_ENUM_P (t2));
420
421 /* Perform the integral promotions. We do not promote real types here. */
422 if (INTEGRAL_OR_ENUMERATION_TYPE_P (t1)
6f9b088b 423 && INTEGRAL_OR_ENUMERATION_TYPE_P (t2))
98f2f3a2
MLI
424 {
425 t1 = type_promotes_to (t1);
426 t2 = type_promotes_to (t2);
427 }
428
429 return cp_common_type (t1, t2);
430}
431
a5ac359a 432/* Subroutine of composite_pointer_type to implement the recursive
c86818cf 433 case. See that function for documentation of the parameters. */
a5ac359a
MM
434
435static tree
c86818cf
SZ
436composite_pointer_type_r (tree t1, tree t2,
437 composite_pointer_operation operation,
5ade1ed2 438 tsubst_flags_t complain)
a5ac359a
MM
439{
440 tree pointee1;
441 tree pointee2;
442 tree result_type;
443 tree attributes;
444
445 /* Determine the types pointed to by T1 and T2. */
446 if (TREE_CODE (t1) == POINTER_TYPE)
447 {
448 pointee1 = TREE_TYPE (t1);
449 pointee2 = TREE_TYPE (t2);
450 }
451 else
452 {
453 pointee1 = TYPE_PTRMEM_POINTED_TO_TYPE (t1);
454 pointee2 = TYPE_PTRMEM_POINTED_TO_TYPE (t2);
455 }
456
457 /* [expr.rel]
458
459 Otherwise, the composite pointer type is a pointer type
460 similar (_conv.qual_) to the type of one of the operands,
461 with a cv-qualification signature (_conv.qual_) that is the
462 union of the cv-qualification signatures of the operand
463 types. */
464 if (same_type_ignoring_top_level_qualifiers_p (pointee1, pointee2))
465 result_type = pointee1;
466 else if ((TREE_CODE (pointee1) == POINTER_TYPE
467 && TREE_CODE (pointee2) == POINTER_TYPE)
468 || (TYPE_PTR_TO_MEMBER_P (pointee1)
469 && TYPE_PTR_TO_MEMBER_P (pointee2)))
c86818cf 470 result_type = composite_pointer_type_r (pointee1, pointee2, operation,
5ade1ed2 471 complain);
a5ac359a
MM
472 else
473 {
5ade1ed2 474 if (complain & tf_error)
c86818cf
SZ
475 {
476 switch (operation)
477 {
478 case CPO_COMPARISON:
479 permerror (input_location, "comparison between "
480 "distinct pointer types %qT and %qT lacks a cast",
481 t1, t2);
482 break;
483 case CPO_CONVERSION:
484 permerror (input_location, "conversion between "
485 "distinct pointer types %qT and %qT lacks a cast",
486 t1, t2);
487 break;
488 case CPO_CONDITIONAL_EXPR:
489 permerror (input_location, "conditional expression between "
490 "distinct pointer types %qT and %qT lacks a cast",
491 t1, t2);
492 break;
493 default:
494 gcc_unreachable ();
495 }
496 }
a5ac359a
MM
497 result_type = void_type_node;
498 }
499 result_type = cp_build_qualified_type (result_type,
500 (cp_type_quals (pointee1)
501 | cp_type_quals (pointee2)));
a5ac359a
MM
502 /* If the original types were pointers to members, so is the
503 result. */
504 if (TYPE_PTR_TO_MEMBER_P (t1))
505 {
506 if (!same_type_p (TYPE_PTRMEM_CLASS_TYPE (t1),
5ade1ed2
DG
507 TYPE_PTRMEM_CLASS_TYPE (t2))
508 && (complain & tf_error))
c86818cf
SZ
509 {
510 switch (operation)
511 {
512 case CPO_COMPARISON:
513 permerror (input_location, "comparison between "
514 "distinct pointer types %qT and %qT lacks a cast",
515 t1, t2);
516 break;
517 case CPO_CONVERSION:
518 permerror (input_location, "conversion between "
519 "distinct pointer types %qT and %qT lacks a cast",
520 t1, t2);
521 break;
522 case CPO_CONDITIONAL_EXPR:
523 permerror (input_location, "conditional expression between "
524 "distinct pointer types %qT and %qT lacks a cast",
525 t1, t2);
526 break;
527 default:
528 gcc_unreachable ();
529 }
530 }
a5ac359a
MM
531 result_type = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
532 result_type);
533 }
9d363a56
MM
534 else
535 result_type = build_pointer_type (result_type);
a5ac359a
MM
536
537 /* Merge the attributes. */
538 attributes = (*targetm.merge_type_attributes) (t1, t2);
539 return build_type_attribute_variant (result_type, attributes);
540}
541
a7a64a77 542/* Return the composite pointer type (see [expr.rel]) for T1 and T2.
c86818cf
SZ
543 ARG1 and ARG2 are the values with those types. The OPERATION is to
544 describe the operation between the pointer types,
545 in case an error occurs.
a5ac359a
MM
546
547 This routine also implements the computation of a common type for
548 pointers-to-members as per [expr.eq]. */
a7a64a77 549
c8094d83 550tree
5671bf27 551composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2,
c86818cf
SZ
552 composite_pointer_operation operation,
553 tsubst_flags_t complain)
a7a64a77 554{
a5ac359a
MM
555 tree class1;
556 tree class2;
a7a64a77
MM
557
558 /* [expr.rel]
559
560 If one operand is a null pointer constant, the composite pointer
561 type is the type of the other operand. */
562 if (null_ptr_cst_p (arg1))
563 return t2;
564 if (null_ptr_cst_p (arg2))
565 return t1;
c8094d83 566
634790f4
MM
567 /* We have:
568
569 [expr.rel]
570
571 If one of the operands has type "pointer to cv1 void*", then
572 the other has type "pointer to cv2T", and the composite pointer
573 type is "pointer to cv12 void", where cv12 is the union of cv1
574 and cv2.
575
576 If either type is a pointer to void, make sure it is T1. */
a5ac359a 577 if (TREE_CODE (t2) == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (t2)))
a7a64a77 578 {
634790f4
MM
579 tree t;
580 t = t1;
581 t1 = t2;
582 t2 = t;
a7a64a77 583 }
a5ac359a 584
634790f4 585 /* Now, if T1 is a pointer to void, merge the qualifiers. */
a5ac359a 586 if (TREE_CODE (t1) == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (t1)))
a7a64a77 587 {
a5ac359a
MM
588 tree attributes;
589 tree result_type;
590
fcf73884 591 if (TYPE_PTRFN_P (t2) && (complain & tf_error))
c86818cf
SZ
592 {
593 switch (operation)
594 {
595 case CPO_COMPARISON:
596 pedwarn (input_location, OPT_pedantic,
597 "ISO C++ forbids comparison between "
598 "pointer of type %<void *%> and pointer-to-function");
599 break;
600 case CPO_CONVERSION:
601 pedwarn (input_location, OPT_pedantic,
602 "ISO C++ forbids conversion between "
603 "pointer of type %<void *%> and pointer-to-function");
604 break;
605 case CPO_CONDITIONAL_EXPR:
606 pedwarn (input_location, OPT_pedantic,
607 "ISO C++ forbids conditional expression between "
608 "pointer of type %<void *%> and pointer-to-function");
609 break;
610 default:
611 gcc_unreachable ();
612 }
613 }
c8094d83 614 result_type
a5ac359a
MM
615 = cp_build_qualified_type (void_type_node,
616 (cp_type_quals (TREE_TYPE (t1))
617 | cp_type_quals (TREE_TYPE (t2))));
634790f4 618 result_type = build_pointer_type (result_type);
a5ac359a
MM
619 /* Merge the attributes. */
620 attributes = (*targetm.merge_type_attributes) (t1, t2);
621 return build_type_attribute_variant (result_type, attributes);
622 }
623
660845bf
ZL
624 if (c_dialect_objc () && TREE_CODE (t1) == POINTER_TYPE
625 && TREE_CODE (t2) == POINTER_TYPE)
626 {
627 if (objc_compare_types (t1, t2, -3, NULL_TREE))
628 return t1;
629 }
630
a5ac359a
MM
631 /* [expr.eq] permits the application of a pointer conversion to
632 bring the pointers to a common type. */
633 if (TREE_CODE (t1) == POINTER_TYPE && TREE_CODE (t2) == POINTER_TYPE
634 && CLASS_TYPE_P (TREE_TYPE (t1))
635 && CLASS_TYPE_P (TREE_TYPE (t2))
636 && !same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (t1),
637 TREE_TYPE (t2)))
638 {
639 class1 = TREE_TYPE (t1);
640 class2 = TREE_TYPE (t2);
641
660845bf 642 if (DERIVED_FROM_P (class1, class2))
c8094d83 643 t2 = (build_pointer_type
a3360e77 644 (cp_build_qualified_type (class1, cp_type_quals (class2))));
660845bf 645 else if (DERIVED_FROM_P (class2, class1))
c8094d83 646 t1 = (build_pointer_type
a3360e77 647 (cp_build_qualified_type (class2, cp_type_quals (class1))));
a5ac359a 648 else
c86818cf
SZ
649 {
650 if (complain & tf_error)
651 switch (operation)
652 {
653 case CPO_COMPARISON:
654 error ("comparison between distinct "
655 "pointer types %qT and %qT lacks a cast", t1, t2);
656 break;
657 case CPO_CONVERSION:
658 error ("conversion between distinct "
659 "pointer types %qT and %qT lacks a cast", t1, t2);
660 break;
661 case CPO_CONDITIONAL_EXPR:
662 error ("conditional expression between distinct "
663 "pointer types %qT and %qT lacks a cast", t1, t2);
664 break;
665 default:
666 gcc_unreachable ();
667 }
668 return error_mark_node;
669 }
a7a64a77 670 }
a5ac359a
MM
671 /* [expr.eq] permits the application of a pointer-to-member
672 conversion to change the class type of one of the types. */
673 else if (TYPE_PTR_TO_MEMBER_P (t1)
c86818cf 674 && !same_type_p (TYPE_PTRMEM_CLASS_TYPE (t1),
a5ac359a 675 TYPE_PTRMEM_CLASS_TYPE (t2)))
708cae97 676 {
a5ac359a
MM
677 class1 = TYPE_PTRMEM_CLASS_TYPE (t1);
678 class2 = TYPE_PTRMEM_CLASS_TYPE (t2);
708cae97 679
a5ac359a
MM
680 if (DERIVED_FROM_P (class1, class2))
681 t1 = build_ptrmem_type (class2, TYPE_PTRMEM_POINTED_TO_TYPE (t1));
682 else if (DERIVED_FROM_P (class2, class1))
683 t2 = build_ptrmem_type (class1, TYPE_PTRMEM_POINTED_TO_TYPE (t2));
a7a64a77 684 else
c86818cf
SZ
685 {
686 if (complain & tf_error)
687 switch (operation)
688 {
689 case CPO_COMPARISON:
690 error ("comparison between distinct "
691 "pointer-to-member types %qT and %qT lacks a cast",
692 t1, t2);
693 break;
694 case CPO_CONVERSION:
695 error ("conversion between distinct "
696 "pointer-to-member types %qT and %qT lacks a cast",
697 t1, t2);
698 break;
699 case CPO_CONDITIONAL_EXPR:
700 error ("conditional expression between distinct "
701 "pointer-to-member types %qT and %qT lacks a cast",
702 t1, t2);
703 break;
704 default:
705 gcc_unreachable ();
706 }
707 return error_mark_node;
708 }
709 }
710
711 return composite_pointer_type_r (t1, t2, operation, complain);
a7a64a77
MM
712}
713
6da794e8 714/* Return the merged type of two types.
96d84882 715 We assume that comptypes has already been done and returned 1;
8d08fdba
MS
716 if that isn't so, this may crash.
717
6da794e8
JM
718 This just combines attributes and default arguments; any other
719 differences would cause the two types to compare unalike. */
8d08fdba
MS
720
721tree
5671bf27 722merge_types (tree t1, tree t2)
8d08fdba 723{
926ce8bd
KH
724 enum tree_code code1;
725 enum tree_code code2;
2986ae00 726 tree attributes;
8d08fdba
MS
727
728 /* Save time if the two types are the same. */
f2ee215b 729 if (t1 == t2)
9076e292 730 return t1;
6da794e8 731 if (original_type (t1) == original_type (t2))
9076e292 732 return t1;
8d08fdba
MS
733
734 /* If one type is nonsense, use the other. */
735 if (t1 == error_mark_node)
9076e292 736 return t2;
8d08fdba 737 if (t2 == error_mark_node)
9076e292 738 return t1;
8d08fdba 739
d9525bec 740 /* Merge the attributes. */
f6897b10 741 attributes = (*targetm.merge_type_attributes) (t1, t2);
2986ae00 742
5566b478
MS
743 if (TYPE_PTRMEMFUNC_P (t1))
744 t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
745 if (TYPE_PTRMEMFUNC_P (t2))
746 t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
747
8d08fdba
MS
748 code1 = TREE_CODE (t1);
749 code2 = TREE_CODE (t2);
e350dbbd
PB
750 if (code1 != code2)
751 {
752 gcc_assert (code1 == TYPENAME_TYPE || code2 == TYPENAME_TYPE);
753 if (code1 == TYPENAME_TYPE)
754 {
755 t1 = resolve_typename_type (t1, /*only_current_p=*/true);
756 code1 = TREE_CODE (t1);
757 }
758 else
759 {
760 t2 = resolve_typename_type (t2, /*only_current_p=*/true);
761 code2 = TREE_CODE (t2);
762 }
763 }
8d08fdba
MS
764
765 switch (code1)
766 {
8d08fdba
MS
767 case POINTER_TYPE:
768 case REFERENCE_TYPE:
6da794e8 769 /* For two pointers, do this recursively on the target type. */
8d08fdba 770 {
6da794e8 771 tree target = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
77adef84 772 int quals = cp_type_quals (t1);
5b163de4 773
8d08fdba 774 if (code1 == POINTER_TYPE)
2986ae00 775 t1 = build_pointer_type (target);
8d08fdba 776 else
86089be5 777 t1 = cp_build_reference_type (target, TYPE_REF_IS_RVALUE (t1));
71851aaa 778 t1 = build_type_attribute_variant (t1, attributes);
77adef84 779 t1 = cp_build_qualified_type (t1, quals);
71851aaa
MS
780
781 if (TREE_CODE (target) == METHOD_TYPE)
782 t1 = build_ptrmemfunc_type (t1);
783
784 return t1;
8d08fdba 785 }
8d08fdba 786
6da794e8
JM
787 case OFFSET_TYPE:
788 {
fe0378ed
MM
789 int quals;
790 tree pointee;
791 quals = cp_type_quals (t1);
792 pointee = merge_types (TYPE_PTRMEM_POINTED_TO_TYPE (t1),
793 TYPE_PTRMEM_POINTED_TO_TYPE (t2));
794 t1 = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
795 pointee);
796 t1 = cp_build_qualified_type (t1, quals);
6da794e8
JM
797 break;
798 }
799
8d08fdba
MS
800 case ARRAY_TYPE:
801 {
6da794e8 802 tree elt = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
8d08fdba
MS
803 /* Save space: see if the result is identical to one of the args. */
804 if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1))
2986ae00 805 return build_type_attribute_variant (t1, attributes);
8d08fdba 806 if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2))
2986ae00 807 return build_type_attribute_variant (t2, attributes);
8d08fdba 808 /* Merge the element types, and have a size if either arg has one. */
e349ee73
MS
809 t1 = build_cplus_array_type
810 (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
6da794e8 811 break;
8d08fdba
MS
812 }
813
814 case FUNCTION_TYPE:
815 /* Function types: prefer the one that specified arg types.
816 If both do, merge the arg types. Also merge the return types. */
817 {
6da794e8 818 tree valtype = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
8d08fdba
MS
819 tree p1 = TYPE_ARG_TYPES (t1);
820 tree p2 = TYPE_ARG_TYPES (t2);
a0685b73 821 tree parms;
8d08fdba
MS
822 tree rval, raises;
823
824 /* Save space: see if the result is identical to one of the args. */
825 if (valtype == TREE_TYPE (t1) && ! p2)
e9525111 826 return cp_build_type_attribute_variant (t1, attributes);
8d08fdba 827 if (valtype == TREE_TYPE (t2) && ! p1)
e9525111 828 return cp_build_type_attribute_variant (t2, attributes);
8d08fdba
MS
829
830 /* Simple way if one arg fails to specify argument types. */
831 if (p1 == NULL_TREE || TREE_VALUE (p1) == void_type_node)
d8a0d13e 832 parms = p2;
a0685b73 833 else if (p2 == NULL_TREE || TREE_VALUE (p2) == void_type_node)
d8a0d13e 834 parms = p1;
a0685b73 835 else
d8a0d13e 836 parms = commonparms (p1, p2);
8d08fdba 837
a0685b73
JM
838 rval = build_function_type (valtype, parms);
839 gcc_assert (type_memfn_quals (t1) == type_memfn_quals (t2));
840 rval = apply_memfn_quals (rval, type_memfn_quals (t1));
d8a0d13e
JM
841 raises = merge_exception_specifiers (TYPE_RAISES_EXCEPTIONS (t1),
842 TYPE_RAISES_EXCEPTIONS (t2));
6da794e8
JM
843 t1 = build_exception_variant (rval, raises);
844 break;
8d08fdba
MS
845 }
846
6da794e8
JM
847 case METHOD_TYPE:
848 {
849 /* Get this value the long way, since TYPE_METHOD_BASETYPE
850 is just the main variant of this. */
851 tree basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t2)));
d8a0d13e
JM
852 tree raises = merge_exception_specifiers (TYPE_RAISES_EXCEPTIONS (t1),
853 TYPE_RAISES_EXCEPTIONS (t2));
6da794e8
JM
854 tree t3;
855
856 /* If this was a member function type, get back to the
857 original type of type member function (i.e., without
858 the class instance variable up front. */
859 t1 = build_function_type (TREE_TYPE (t1),
860 TREE_CHAIN (TYPE_ARG_TYPES (t1)));
861 t2 = build_function_type (TREE_TYPE (t2),
862 TREE_CHAIN (TYPE_ARG_TYPES (t2)));
863 t3 = merge_types (t1, t2);
43dc123f
MM
864 t3 = build_method_type_directly (basetype, TREE_TYPE (t3),
865 TYPE_ARG_TYPES (t3));
6da794e8
JM
866 t1 = build_exception_variant (t3, raises);
867 break;
868 }
8d08fdba 869
b1a95e0b
MM
870 case TYPENAME_TYPE:
871 /* There is no need to merge attributes into a TYPENAME_TYPE.
872 When the type is instantiated it will have whatever
873 attributes result from the instantiation. */
874 return t1;
875
6da794e8
JM
876 default:;
877 }
8e30dcf3
JM
878
879 if (attribute_list_equal (TYPE_ATTRIBUTES (t1), attributes))
880 return t1;
881 else if (attribute_list_equal (TYPE_ATTRIBUTES (t2), attributes))
882 return t2;
883 else
884 return cp_build_type_attribute_variant (t1, attributes);
6da794e8 885}
8d08fdba 886
48326487
JM
887/* Return the ARRAY_TYPE type without its domain. */
888
889tree
890strip_array_domain (tree type)
891{
892 tree t2;
893 gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
894 if (TYPE_DOMAIN (type) == NULL_TREE)
895 return type;
896 t2 = build_cplus_array_type (TREE_TYPE (type), NULL_TREE);
897 return cp_build_type_attribute_variant (t2, TYPE_ATTRIBUTES (type));
898}
899
98f2f3a2
MLI
900/* Wrapper around cp_common_type that is used by c-common.c and other
901 front end optimizations that remove promotions.
71851aaa 902
98f2f3a2
MLI
903 Return the common type for two arithmetic types T1 and T2 under the
904 usual arithmetic conversions. The default conversions have already
905 been applied, and enumerated types converted to their compatible
906 integer types. */
6da794e8
JM
907
908tree
5671bf27 909common_type (tree t1, tree t2)
6da794e8 910{
98f2f3a2
MLI
911 /* If one type is nonsense, use the other */
912 if (t1 == error_mark_node)
913 return t2;
914 if (t2 == error_mark_node)
915 return t1;
2986ae00 916
98f2f3a2
MLI
917 return cp_common_type (t1, t2);
918}
8d08fdba 919
98f2f3a2
MLI
920/* Return the common type of two pointer types T1 and T2. This is the
921 type for the result of most arithmetic operations if the operands
922 have the given two types.
923
924 We assume that comp_target_types has already been done and returned
925 nonzero; if that isn't so, this may crash. */
8d08fdba 926
98f2f3a2
MLI
927tree
928common_pointer_type (tree t1, tree t2)
929{
930 gcc_assert ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
931 || (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
932 || (TYPE_PTRMEMFUNC_P (t1) && TYPE_PTRMEMFUNC_P (t2)));
933
934 return composite_pointer_type (t1, t2, error_mark_node, error_mark_node,
c86818cf 935 CPO_CONVERSION, tf_warning_or_error);
8d08fdba
MS
936}
937\f
4cc1d462 938/* Compare two exception specifier types for exactness or subsetness, if
acd8e2d0
NS
939 allowed. Returns false for mismatch, true for match (same, or
940 derived and !exact).
c8094d83 941
4cc1d462 942 [except.spec] "If a class X ... objects of class X or any class publicly
34cd5ae7 943 and unambiguously derived from X. Similarly, if a pointer type Y * ...
4cc1d462 944 exceptions of type Y * or that are pointers to any type publicly and
34cd5ae7 945 unambiguously derived from Y. Otherwise a function only allows exceptions
4cc1d462
NS
946 that have the same type ..."
947 This does not mention cv qualifiers and is different to what throw
948 [except.throw] and catch [except.catch] will do. They will ignore the
949 top level cv qualifiers, and allow qualifiers in the pointer to class
950 example.
c8094d83 951
4cc1d462
NS
952 We implement the letter of the standard. */
953
acd8e2d0
NS
954static bool
955comp_except_types (tree a, tree b, bool exact)
4cc1d462
NS
956{
957 if (same_type_p (a, b))
acd8e2d0 958 return true;
4cc1d462
NS
959 else if (!exact)
960 {
89d684bb 961 if (cp_type_quals (a) || cp_type_quals (b))
0cbd7506 962 return false;
c8094d83 963
4cc1d462 964 if (TREE_CODE (a) == POINTER_TYPE
0cbd7506
MS
965 && TREE_CODE (b) == POINTER_TYPE)
966 {
967 a = TREE_TYPE (a);
968 b = TREE_TYPE (b);
969 if (cp_type_quals (a) || cp_type_quals (b))
970 return false;
971 }
c8094d83 972
4cc1d462 973 if (TREE_CODE (a) != RECORD_TYPE
0cbd7506
MS
974 || TREE_CODE (b) != RECORD_TYPE)
975 return false;
c8094d83 976
18e4be85 977 if (PUBLICLY_UNIQUELY_DERIVED_P (a, b))
0cbd7506 978 return true;
4cc1d462 979 }
acd8e2d0 980 return false;
4cc1d462
NS
981}
982
acd8e2d0 983/* Return true if TYPE1 and TYPE2 are equivalent exception specifiers.
3a55fb4c
JM
984 If EXACT is ce_derived, T2 can be stricter than T1 (according to 15.4/5).
985 If EXACT is ce_normal, the compatibility rules in 15.4/3 apply.
986 If EXACT is ce_exact, the specs must be exactly the same. Exception lists
987 are unordered, but we've already filtered out duplicates. Most lists will
988 be in order, we should try to make use of that. */
e92cc029 989
acd8e2d0 990bool
3a55fb4c 991comp_except_specs (const_tree t1, const_tree t2, int exact)
8d08fdba 992{
58f9752a
KG
993 const_tree probe;
994 const_tree base;
4cc1d462
NS
995 int length = 0;
996
997 if (t1 == t2)
acd8e2d0 998 return true;
c8094d83 999
6d812dd3
JM
1000 /* First handle noexcept. */
1001 if (exact < ce_exact)
3a55fb4c 1002 {
6d812dd3
JM
1003 /* noexcept(false) is compatible with any throwing dynamic-exc-spec
1004 and stricter than any spec. */
1005 if (t1 == noexcept_false_spec)
1006 return !nothrow_spec_p (t2) || exact == ce_derived;
1007 /* Even a derived noexcept(false) is compatible with a throwing
1008 dynamic spec. */
1009 if (t2 == noexcept_false_spec)
1010 return !nothrow_spec_p (t1);
1011
1012 /* Otherwise, if we aren't looking for an exact match, noexcept is
1013 equivalent to throw(). */
1014 if (t1 == noexcept_true_spec)
1015 t1 = empty_except_spec;
1016 if (t2 == noexcept_true_spec)
1017 t2 = empty_except_spec;
3a55fb4c
JM
1018 }
1019
6d812dd3
JM
1020 /* If any noexcept is left, it is only comparable to itself;
1021 either we're looking for an exact match or we're redeclaring a
1022 template with dependent noexcept. */
1023 if ((t1 && TREE_PURPOSE (t1))
1024 || (t2 && TREE_PURPOSE (t2)))
1025 return (t1 && t2
1026 && cp_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2)));
1027
0cbd7506 1028 if (t1 == NULL_TREE) /* T1 is ... */
3a55fb4c 1029 return t2 == NULL_TREE || exact == ce_derived;
0cbd7506 1030 if (!TREE_VALUE (t1)) /* t1 is EMPTY */
4cc1d462 1031 return t2 != NULL_TREE && !TREE_VALUE (t2);
0cbd7506 1032 if (t2 == NULL_TREE) /* T2 is ... */
acd8e2d0 1033 return false;
dffa4176 1034 if (TREE_VALUE (t1) && !TREE_VALUE (t2)) /* T2 is EMPTY, T1 is not */
3a55fb4c 1035 return exact == ce_derived;
c8094d83 1036
4cc1d462
NS
1037 /* Neither set is ... or EMPTY, make sure each part of T2 is in T1.
1038 Count how many we find, to determine exactness. For exact matching and
1039 ordered T1, T2, this is an O(n) operation, otherwise its worst case is
1040 O(nm). */
1041 for (base = t1; t2 != NULL_TREE; t2 = TREE_CHAIN (t2))
1042 {
1043 for (probe = base; probe != NULL_TREE; probe = TREE_CHAIN (probe))
0cbd7506
MS
1044 {
1045 tree a = TREE_VALUE (probe);
1046 tree b = TREE_VALUE (t2);
1047
1048 if (comp_except_types (a, b, exact))
1049 {
3a55fb4c 1050 if (probe == base && exact > ce_derived)
0cbd7506
MS
1051 base = TREE_CHAIN (probe);
1052 length++;
1053 break;
1054 }
1055 }
4cc1d462 1056 if (probe == NULL_TREE)
0cbd7506 1057 return false;
4cc1d462 1058 }
3a55fb4c 1059 return exact == ce_derived || base == NULL_TREE || length == list_length (t1);
8d08fdba
MS
1060}
1061
acd8e2d0
NS
1062/* Compare the array types T1 and T2. ALLOW_REDECLARATION is true if
1063 [] can match [size]. */
3bfdc719 1064
c8a209ca 1065static bool
58f9752a 1066comp_array_types (const_tree t1, const_tree t2, bool allow_redeclaration)
8d08fdba 1067{
3bfdc719
MM
1068 tree d1;
1069 tree d2;
30a03508 1070 tree max1, max2;
3bfdc719
MM
1071
1072 if (t1 == t2)
acd8e2d0 1073 return true;
8d08fdba 1074
3bfdc719 1075 /* The type of the array elements must be the same. */
acd8e2d0 1076 if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
c8a209ca 1077 return false;
8d08fdba 1078
3bfdc719
MM
1079 d1 = TYPE_DOMAIN (t1);
1080 d2 = TYPE_DOMAIN (t2);
1081
1082 if (d1 == d2)
c8a209ca 1083 return true;
8d08fdba 1084
3bfdc719 1085 /* If one of the arrays is dimensionless, and the other has a
0e339752 1086 dimension, they are of different types. However, it is valid to
3bfdc719
MM
1087 write:
1088
1089 extern int a[];
1090 int a[3];
1091
c8094d83 1092 by [basic.link]:
3bfdc719
MM
1093
1094 declarations for an array object can specify
1095 array types that differ by the presence or absence of a major
1096 array bound (_dcl.array_). */
1097 if (!d1 || !d2)
acd8e2d0 1098 return allow_redeclaration;
3bfdc719
MM
1099
1100 /* Check that the dimensions are the same. */
30a03508
NS
1101
1102 if (!cp_tree_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2)))
1103 return false;
1104 max1 = TYPE_MAX_VALUE (d1);
1105 max2 = TYPE_MAX_VALUE (d2);
1106 if (processing_template_decl && !abi_version_at_least (2)
1107 && !value_dependent_expression_p (max1)
1108 && !value_dependent_expression_p (max2))
1109 {
1110 /* With abi-1 we do not fold non-dependent array bounds, (and
0cbd7506
MS
1111 consequently mangle them incorrectly). We must therefore
1112 fold them here, to verify the domains have the same
1113 value. */
30a03508
NS
1114 max1 = fold (max1);
1115 max2 = fold (max2);
1116 }
1117
1118 if (!cp_tree_equal (max1, max2))
1119 return false;
1120
1121 return true;
8d08fdba
MS
1122}
1123
e96ce650
DS
1124/* Compare the relative position of T1 and T2 into their respective
1125 template parameter list.
1126 T1 and T2 must be template parameter types.
1127 Return TRUE if T1 and T2 have the same position, FALSE otherwise. */
1128
1129static bool
1130comp_template_parms_position (tree t1, tree t2)
1131{
1132 gcc_assert (t1 && t2
1133 && TREE_CODE (t1) == TREE_CODE (t2)
1134 && (TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM
1135 || TREE_CODE (t1) == TEMPLATE_TEMPLATE_PARM
1136 || TREE_CODE (t1) == TEMPLATE_TYPE_PARM));
1137
1138 if (TEMPLATE_TYPE_IDX (t1) != TEMPLATE_TYPE_IDX (t2)
1139 || TEMPLATE_TYPE_LEVEL (t1) != TEMPLATE_TYPE_LEVEL (t2)
1140 || (TEMPLATE_TYPE_PARAMETER_PACK (t1)
1141 != TEMPLATE_TYPE_PARAMETER_PACK (t2)))
1142 return false;
1143
1144 return true;
1145}
1146
20c202f3
DS
1147/* Subroutine of incompatible_dependent_types_p.
1148 Return the template parameter of the dependent type T.
1149 If T is a typedef, return the template parameters of
1150 the _decl_ of the typedef. T must be a dependent type. */
1151
1152static tree
1153get_template_parms_of_dependent_type (tree t)
1154{
1155 tree tinfo = NULL_TREE, tparms = NULL_TREE;
1156
3cdabe3b
DS
1157 /* First, try the obvious case of getting the
1158 template info from T itself. */
1159 if ((tinfo = get_template_info (t)))
1160 ;
d7df0b91
DS
1161 else if (TREE_CODE (t) == TEMPLATE_TYPE_PARM)
1162 return TEMPLATE_TYPE_PARM_SIBLING_PARMS (t);
3cdabe3b 1163 else if (typedef_variant_p (t)
58f5f6b4 1164 && !NAMESPACE_SCOPE_P (TYPE_NAME (t)))
20c202f3 1165 tinfo = get_template_info (DECL_CONTEXT (TYPE_NAME (t)));
d7df0b91
DS
1166 /* If T is a TYPENAME_TYPE which context is a template type
1167 parameter, get the template parameters from that context. */
1168 else if (TYPE_CONTEXT (t)
1169 && TREE_CODE (TYPE_CONTEXT (t)) == TEMPLATE_TYPE_PARM)
1170 return TEMPLATE_TYPE_PARM_SIBLING_PARMS (TYPE_CONTEXT (t));
20c202f3
DS
1171 else if (TYPE_CONTEXT (t)
1172 && !NAMESPACE_SCOPE_P (t))
1173 tinfo = get_template_info (TYPE_CONTEXT (t));
1174
1175 if (tinfo)
1176 tparms = DECL_TEMPLATE_PARMS (TI_TEMPLATE (tinfo));
20c202f3
DS
1177
1178 return tparms;
1179}
1180
9cf10655 1181/* Subroutine of structural_comptypes.
20c202f3
DS
1182 Compare the dependent types T1 and T2.
1183 Return TRUE if we are sure they can't be equal, FALSE otherwise.
1184 The whole point of this function is to support cases where either T1 or
1185 T2 is a typedef. In those cases, we need to compare the template parameters
1186 of the _decl_ of the typedef. If those don't match then we know T1
1187 and T2 cannot be equal. */
9cf10655
DS
1188
1189static bool
20c202f3 1190incompatible_dependent_types_p (tree t1, tree t2)
9cf10655 1191{
20c202f3 1192 tree tparms1 = NULL_TREE, tparms2 = NULL_TREE;
5a80a1dd 1193 bool t1_typedef_variant_p, t2_typedef_variant_p;
9cf10655 1194
20c202f3
DS
1195 if (!uses_template_parms (t1) || !uses_template_parms (t2))
1196 return false;
e96ce650 1197
20c202f3
DS
1198 if (TREE_CODE (t1) == TEMPLATE_TYPE_PARM)
1199 {
1200 /* If T1 and T2 don't have the same relative position in their
1201 template parameters set, they can't be equal. */
1202 if (!comp_template_parms_position (t1, t2))
1203 return true;
1204 }
e96ce650 1205
5a80a1dd
DS
1206 t1_typedef_variant_p = typedef_variant_p (t1);
1207 t2_typedef_variant_p = typedef_variant_p (t2);
1208
20c202f3 1209 /* Either T1 or T2 must be a typedef. */
5a80a1dd 1210 if (!t1_typedef_variant_p && !t2_typedef_variant_p)
9cf10655
DS
1211 return false;
1212
5a80a1dd
DS
1213 if (!t1_typedef_variant_p || !t2_typedef_variant_p)
1214 /* Either T1 or T2 is not a typedef so we cannot compare the
1215 the template parms of the typedefs of T1 and T2.
1216 At this point, if the main variant type of T1 and T2 are equal
1217 it means the two types can't be incompatible, from the perspective
1218 of this function. */
1219 if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
1220 return false;
1221
e96ce650
DS
1222 /* So if we reach this point, it means either T1 or T2 is a typedef variant.
1223 Let's compare their template parameters. */
9cf10655 1224
20c202f3
DS
1225 tparms1 = get_template_parms_of_dependent_type (t1);
1226 tparms2 = get_template_parms_of_dependent_type (t2);
9cf10655 1227
58f5f6b4
DS
1228 /* If T2 is a template type parm and if we could not get the template
1229 parms it belongs to, that means we have not finished parsing the
1230 full set of template parameters of the template declaration it
1231 belongs to yet. If we could get the template parms T1 belongs to,
1232 that mostly means T1 and T2 belongs to templates that are
1233 different and incompatible. */
1234 if (TREE_CODE (t1) == TEMPLATE_TYPE_PARM
1235 && (tparms1 == NULL_TREE || tparms2 == NULL_TREE)
1236 && tparms1 != tparms2)
1237 return true;
1238
e96ce650
DS
1239 if (tparms1 == NULL_TREE
1240 || tparms2 == NULL_TREE
1241 || tparms1 == tparms2)
9cf10655
DS
1242 return false;
1243
e96ce650
DS
1244 /* And now compare the mighty template parms! */
1245 return !comp_template_parms (tparms1, tparms2);
9cf10655
DS
1246}
1247
96d84882 1248/* Subroutine in comptypes. */
e92cc029 1249
06d40de8
DG
1250static bool
1251structural_comptypes (tree t1, tree t2, int strict)
8d08fdba 1252{
8d08fdba 1253 if (t1 == t2)
c8a209ca
NS
1254 return true;
1255
f4f206f4 1256 /* Suppress errors caused by previously reported errors. */
ae8803a8 1257 if (t1 == error_mark_node || t2 == error_mark_node)
c8a209ca 1258 return false;
c8094d83 1259
50bc768d 1260 gcc_assert (TYPE_P (t1) && TYPE_P (t2));
c8094d83 1261
c8a209ca
NS
1262 /* TYPENAME_TYPEs should be resolved if the qualifying scope is the
1263 current instantiation. */
1264 if (TREE_CODE (t1) == TYPENAME_TYPE)
4195a767 1265 t1 = resolve_typename_type (t1, /*only_current_p=*/true);
c8094d83 1266
c8a209ca 1267 if (TREE_CODE (t2) == TYPENAME_TYPE)
4195a767 1268 t2 = resolve_typename_type (t2, /*only_current_p=*/true);
8d08fdba 1269
5566b478
MS
1270 if (TYPE_PTRMEMFUNC_P (t1))
1271 t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
1272 if (TYPE_PTRMEMFUNC_P (t2))
1273 t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
1274
8d08fdba 1275 /* Different classes of types can't be compatible. */
8d08fdba 1276 if (TREE_CODE (t1) != TREE_CODE (t2))
c8a209ca 1277 return false;
8d08fdba 1278
c353b8e3
MM
1279 /* Qualifiers must match. For array types, we will check when we
1280 recur on the array element types. */
1281 if (TREE_CODE (t1) != ARRAY_TYPE
a3360e77
JM
1282 && cp_type_quals (t1) != cp_type_quals (t2))
1283 return false;
1284 if (TREE_CODE (t1) == FUNCTION_TYPE
1285 && type_memfn_quals (t1) != type_memfn_quals (t2))
c8a209ca 1286 return false;
70fef63a
RG
1287 if (TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2))
1288 return false;
8d08fdba 1289
d38f6bc0
DS
1290 /* If T1 and T2 are dependent typedefs then check upfront that
1291 the template parameters of their typedef DECLs match before
1292 going down checking their subtypes. */
1293 if (incompatible_dependent_types_p (t1, t2))
1294 return false;
1295
8d08fdba
MS
1296 /* Allow for two different type nodes which have essentially the same
1297 definition. Note that we already checked for equality of the type
38e01259 1298 qualifiers (just above). */
8d08fdba 1299
c353b8e3
MM
1300 if (TREE_CODE (t1) != ARRAY_TYPE
1301 && TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
c8a209ca 1302 return true;
8d08fdba 1303
20c202f3 1304
7866705a 1305 /* Compare the types. Break out if they could be the same. */
8d08fdba
MS
1306 switch (TREE_CODE (t1))
1307 {
0451301c
DG
1308 case VOID_TYPE:
1309 case BOOLEAN_TYPE:
1310 /* All void and bool types are the same. */
1311 break;
1312
1313 case INTEGER_TYPE:
1314 case FIXED_POINT_TYPE:
1315 case REAL_TYPE:
1316 /* With these nodes, we can't determine type equivalence by
1317 looking at what is stored in the nodes themselves, because
1318 two nodes might have different TYPE_MAIN_VARIANTs but still
1319 represent the same type. For example, wchar_t and int could
1320 have the same properties (TYPE_PRECISION, TYPE_MIN_VALUE,
1321 TYPE_MAX_VALUE, etc.), but have different TYPE_MAIN_VARIANTs
1322 and are distinct types. On the other hand, int and the
1323 following typedef
1324
1325 typedef int INT __attribute((may_alias));
1326
1327 have identical properties, different TYPE_MAIN_VARIANTs, but
1328 represent the same type. The canonical type system keeps
1329 track of equivalence in this case, so we fall back on it. */
1330 return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2);
1331
e7e66632 1332 case TEMPLATE_TEMPLATE_PARM:
a1281f45 1333 case BOUND_TEMPLATE_TEMPLATE_PARM:
e96ce650 1334 if (!comp_template_parms_position (t1, t2))
c8a209ca
NS
1335 return false;
1336 if (!comp_template_parms
1337 (DECL_TEMPLATE_PARMS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t1)),
1338 DECL_TEMPLATE_PARMS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t2))))
1339 return false;
a1281f45 1340 if (TREE_CODE (t1) == TEMPLATE_TEMPLATE_PARM)
7866705a 1341 break;
e7e66632 1342 /* Don't check inheritance. */
acd8e2d0 1343 strict = COMPARE_STRICT;
f4f206f4 1344 /* Fall through. */
e7e66632 1345
8d08fdba
MS
1346 case RECORD_TYPE:
1347 case UNION_TYPE:
7ddedda4
MM
1348 if (TYPE_TEMPLATE_INFO (t1) && TYPE_TEMPLATE_INFO (t2)
1349 && (TYPE_TI_TEMPLATE (t1) == TYPE_TI_TEMPLATE (t2)
c8a209ca
NS
1350 || TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM)
1351 && comp_template_args (TYPE_TI_ARGS (t1), TYPE_TI_ARGS (t2)))
7866705a 1352 break;
c8094d83 1353
acd8e2d0 1354 if ((strict & COMPARE_BASE) && DERIVED_FROM_P (t1, t2))
7866705a 1355 break;
acd8e2d0 1356 else if ((strict & COMPARE_DERIVED) && DERIVED_FROM_P (t2, t1))
7866705a 1357 break;
c8094d83 1358
c8a209ca 1359 return false;
8d08fdba
MS
1360
1361 case OFFSET_TYPE:
96d84882
PB
1362 if (!comptypes (TYPE_OFFSET_BASETYPE (t1), TYPE_OFFSET_BASETYPE (t2),
1363 strict & ~COMPARE_REDECLARATION))
c8a209ca 1364 return false;
7866705a
SB
1365 if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1366 return false;
1367 break;
8d08fdba 1368
8d08fdba 1369 case REFERENCE_TYPE:
8af2fec4
RY
1370 if (TYPE_REF_IS_RVALUE (t1) != TYPE_REF_IS_RVALUE (t2))
1371 return false;
1372 /* fall through to checks for pointer types */
1373
1374 case POINTER_TYPE:
7866705a
SB
1375 if (TYPE_MODE (t1) != TYPE_MODE (t2)
1376 || TYPE_REF_CAN_ALIAS_ALL (t1) != TYPE_REF_CAN_ALIAS_ALL (t2)
1377 || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1378 return false;
1379 break;
8d08fdba 1380
dffa4176 1381 case METHOD_TYPE:
8d08fdba 1382 case FUNCTION_TYPE:
acd8e2d0 1383 if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
c8a209ca 1384 return false;
7866705a
SB
1385 if (!compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)))
1386 return false;
1387 break;
8d08fdba
MS
1388
1389 case ARRAY_TYPE:
9bcb9aae 1390 /* Target types must match incl. qualifiers. */
7866705a
SB
1391 if (!comp_array_types (t1, t2, !!(strict & COMPARE_REDECLARATION)))
1392 return false;
1393 break;
8d08fdba 1394
51c184be 1395 case TEMPLATE_TYPE_PARM:
20c202f3
DS
1396 /* If incompatible_dependent_types_p called earlier didn't decide
1397 T1 and T2 were different, they might be equal. */
7866705a 1398 break;
e76a2646
MS
1399
1400 case TYPENAME_TYPE:
c8a209ca
NS
1401 if (!cp_tree_equal (TYPENAME_TYPE_FULLNAME (t1),
1402 TYPENAME_TYPE_FULLNAME (t2)))
0cbd7506 1403 return false;
7866705a
SB
1404 if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
1405 return false;
1406 break;
7f85441b 1407
b8c6534b 1408 case UNBOUND_CLASS_TEMPLATE:
c8a209ca 1409 if (!cp_tree_equal (TYPE_IDENTIFIER (t1), TYPE_IDENTIFIER (t2)))
0cbd7506 1410 return false;
7866705a
SB
1411 if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
1412 return false;
1413 break;
b8c6534b 1414
a7a64a77 1415 case COMPLEX_TYPE:
7866705a
SB
1416 if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1417 return false;
1418 break;
a7a64a77 1419
cc27e657 1420 case VECTOR_TYPE:
7866705a
SB
1421 if (TYPE_VECTOR_SUBPARTS (t1) != TYPE_VECTOR_SUBPARTS (t2)
1422 || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1423 return false;
cc27e657
PB
1424 break;
1425
5d80a306
DG
1426 case TYPE_PACK_EXPANSION:
1427 return same_type_p (PACK_EXPANSION_PATTERN (t1),
1428 PACK_EXPANSION_PATTERN (t2));
1429
3ad6a8e1
DG
1430 case DECLTYPE_TYPE:
1431 if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t1)
1432 != DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t2)
d5f4eddd
JM
1433 || (DECLTYPE_FOR_LAMBDA_CAPTURE (t1)
1434 != DECLTYPE_FOR_LAMBDA_CAPTURE (t2))
1435 || (DECLTYPE_FOR_LAMBDA_RETURN (t1)
1436 != DECLTYPE_FOR_LAMBDA_RETURN (t2))
3ad6a8e1
DG
1437 || !cp_tree_equal (DECLTYPE_TYPE_EXPR (t1),
1438 DECLTYPE_TYPE_EXPR (t2)))
1439 return false;
1440 break;
1441
7f85441b 1442 default:
7866705a 1443 return false;
8d08fdba 1444 }
7866705a
SB
1445
1446 /* If we get here, we know that from a target independent POV the
1447 types are the same. Make sure the target attributes are also
1448 the same. */
1449 return targetm.comp_type_attributes (t1, t2);
8d08fdba
MS
1450}
1451
06d40de8
DG
1452/* Return true if T1 and T2 are related as allowed by STRICT. STRICT
1453 is a bitwise-or of the COMPARE_* flags. */
1454
1455bool
96d84882 1456comptypes (tree t1, tree t2, int strict)
06d40de8
DG
1457{
1458 if (strict == COMPARE_STRICT)
1459 {
06d40de8
DG
1460 if (t1 == t2)
1461 return true;
1462
1463 if (t1 == error_mark_node || t2 == error_mark_node)
1464 return false;
1465
1466 if (TYPE_STRUCTURAL_EQUALITY_P (t1) || TYPE_STRUCTURAL_EQUALITY_P (t2))
1467 /* At least one of the types requires structural equality, so
1468 perform a deep check. */
1469 return structural_comptypes (t1, t2, strict);
1470
7313518b
DG
1471#ifdef ENABLE_CHECKING
1472 if (USE_CANONICAL_TYPES)
06d40de8 1473 {
7313518b
DG
1474 bool result = structural_comptypes (t1, t2, strict);
1475
06d40de8 1476 if (result && TYPE_CANONICAL (t1) != TYPE_CANONICAL (t2))
7313518b
DG
1477 /* The two types are structurally equivalent, but their
1478 canonical types were different. This is a failure of the
1479 canonical type propagation code.*/
1480 internal_error
1481 ("canonical types differ for identical types %T and %T",
1482 t1, t2);
06d40de8 1483 else if (!result && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2))
7313518b
DG
1484 /* Two types are structurally different, but the canonical
1485 types are the same. This means we were over-eager in
1486 assigning canonical types. */
1487 internal_error
1488 ("same canonical type node for different types %T and %T",
1489 t1, t2);
06d40de8
DG
1490
1491 return result;
1492 }
7313518b
DG
1493#else
1494 if (USE_CANONICAL_TYPES)
06d40de8 1495 return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2);
7313518b
DG
1496#endif
1497 else
1498 return structural_comptypes (t1, t2, strict);
06d40de8
DG
1499 }
1500 else if (strict == COMPARE_STRUCTURAL)
1501 return structural_comptypes (t1, t2, COMPARE_STRICT);
1502 else
1503 return structural_comptypes (t1, t2, strict);
1504}
1505
10746f37
JM
1506/* Returns nonzero iff TYPE1 and TYPE2 are the same type, ignoring
1507 top-level qualifiers. */
1508
1509bool
1510same_type_ignoring_top_level_qualifiers_p (tree type1, tree type2)
1511{
1512 if (type1 == error_mark_node || type2 == error_mark_node)
1513 return false;
1514
1515 return same_type_p (TYPE_MAIN_VARIANT (type1), TYPE_MAIN_VARIANT (type2));
1516}
1517
91063b51
MM
1518/* Returns 1 if TYPE1 is at least as qualified as TYPE2. */
1519
acd8e2d0 1520bool
58f9752a 1521at_least_as_qualified_p (const_tree type1, const_tree type2)
91063b51 1522{
acd8e2d0
NS
1523 int q1 = cp_type_quals (type1);
1524 int q2 = cp_type_quals (type2);
c8094d83 1525
91063b51 1526 /* All qualifiers for TYPE2 must also appear in TYPE1. */
acd8e2d0 1527 return (q1 & q2) == q2;
91063b51
MM
1528}
1529
ceab47eb
MM
1530/* Returns 1 if TYPE1 is more cv-qualified than TYPE2, -1 if TYPE2 is
1531 more cv-qualified that TYPE1, and 0 otherwise. */
1532
1533int
58f9752a 1534comp_cv_qualification (const_tree type1, const_tree type2)
ceab47eb 1535{
acd8e2d0
NS
1536 int q1 = cp_type_quals (type1);
1537 int q2 = cp_type_quals (type2);
1538
1539 if (q1 == q2)
ceab47eb
MM
1540 return 0;
1541
acd8e2d0 1542 if ((q1 & q2) == q2)
ceab47eb 1543 return 1;
acd8e2d0 1544 else if ((q1 & q2) == q1)
ceab47eb
MM
1545 return -1;
1546
1547 return 0;
1548}
1549
1550/* Returns 1 if the cv-qualification signature of TYPE1 is a proper
1551 subset of the cv-qualification signature of TYPE2, and the types
1552 are similar. Returns -1 if the other way 'round, and 0 otherwise. */
1553
1554int
acd8e2d0 1555comp_cv_qual_signature (tree type1, tree type2)
ceab47eb
MM
1556{
1557 if (comp_ptr_ttypes_real (type2, type1, -1))
1558 return 1;
1559 else if (comp_ptr_ttypes_real (type1, type2, -1))
1560 return -1;
1561 else
1562 return 0;
1563}
8d08fdba 1564\f
96d84882 1565/* Subroutines of `comptypes'. */
8d08fdba 1566
acd8e2d0 1567/* Return true if two parameter type lists PARMS1 and PARMS2 are
03017874
MM
1568 equivalent in the sense that functions with those parameter types
1569 can have equivalent types. The two lists must be equivalent,
acd8e2d0 1570 element by element. */
8d08fdba 1571
acd8e2d0 1572bool
58f9752a 1573compparms (const_tree parms1, const_tree parms2)
8d08fdba 1574{
58f9752a 1575 const_tree t1, t2;
8d08fdba
MS
1576
1577 /* An unspecified parmlist matches any specified parmlist
1578 whose argument types don't need default promotions. */
1579
acd8e2d0
NS
1580 for (t1 = parms1, t2 = parms2;
1581 t1 || t2;
1582 t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
8d08fdba 1583 {
8d08fdba 1584 /* If one parmlist is shorter than the other,
4daa9c14 1585 they fail to match. */
acd8e2d0
NS
1586 if (!t1 || !t2)
1587 return false;
ae8803a8 1588 if (!same_type_p (TREE_VALUE (t1), TREE_VALUE (t2)))
acd8e2d0 1589 return false;
8d08fdba 1590 }
acd8e2d0 1591 return true;
8d08fdba
MS
1592}
1593
8d08fdba 1594\f
7a18b933
NS
1595/* Process a sizeof or alignof expression where the operand is a
1596 type. */
1597
8d08fdba 1598tree
7a18b933 1599cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
8d08fdba 1600{
fa72b064 1601 tree value;
b4c74ba2 1602 bool dependent_p;
8d08fdba 1603
50bc768d 1604 gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
7a18b933
NS
1605 if (type == error_mark_node)
1606 return error_mark_node;
c8094d83 1607
ee76b931 1608 type = non_reference (type);
3c17e16e 1609 if (TREE_CODE (type) == METHOD_TYPE)
8d08fdba 1610 {
fcf73884 1611 if (complain)
509c9d60 1612 pedwarn (input_location, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
fcf73884 1613 "invalid application of %qs to a member function",
3c17e16e 1614 operator_name_info[(int) op].name);
fa72b064 1615 value = size_one_node;
8d08fdba 1616 }
8d08fdba 1617
b4c74ba2
MM
1618 dependent_p = dependent_type_p (type);
1619 if (!dependent_p)
1620 complete_type (type);
1621 if (dependent_p
3c17e16e
MM
1622 /* VLA types will have a non-constant size. In the body of an
1623 uninstantiated template, we don't need to try to compute the
1624 value, because the sizeof expression is not an integral
1625 constant expression in that case. And, if we do try to
1626 compute the value, we'll likely end up with SAVE_EXPRs, which
1627 the template substitution machinery does not expect to see. */
b4c74ba2
MM
1628 || (processing_template_decl
1629 && COMPLETE_TYPE_P (type)
1630 && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
3c17e16e
MM
1631 {
1632 value = build_min (op, size_type_node, type);
1633 TREE_READONLY (value) = 1;
1634 return value;
1635 }
1636
c2255bc4 1637 return c_sizeof_or_alignof_type (input_location, complete_type (type),
3c17e16e
MM
1638 op == SIZEOF_EXPR,
1639 complain);
8d08fdba
MS
1640}
1641
5ade1ed2
DG
1642/* Return the size of the type, without producing any warnings for
1643 types whose size cannot be taken. This routine should be used only
1644 in some other routine that has already produced a diagnostic about
1645 using the size of such a type. */
1646tree
1647cxx_sizeof_nowarn (tree type)
1648{
1649 if (TREE_CODE (type) == FUNCTION_TYPE
1650 || TREE_CODE (type) == VOID_TYPE
1651 || TREE_CODE (type) == ERROR_MARK)
1652 return size_one_node;
1653 else if (!COMPLETE_TYPE_P (type))
1654 return size_zero_node;
1655 else
1656 return cxx_sizeof_or_alignof_type (type, SIZEOF_EXPR, false);
1657}
1658
229970c4 1659/* Process a sizeof expression where the operand is an expression. */
7a18b933 1660
229970c4 1661static tree
5ade1ed2 1662cxx_sizeof_expr (tree e, tsubst_flags_t complain)
5566b478 1663{
7a18b933
NS
1664 if (e == error_mark_node)
1665 return error_mark_node;
c8094d83 1666
5156628f 1667 if (processing_template_decl)
7a18b933 1668 {
229970c4 1669 e = build_min (SIZEOF_EXPR, size_type_node, e);
7a18b933
NS
1670 TREE_SIDE_EFFECTS (e) = 0;
1671 TREE_READONLY (e) = 1;
c8094d83 1672
7a18b933
NS
1673 return e;
1674 }
c8094d83 1675
48326487
JM
1676 /* To get the size of a static data member declared as an array of
1677 unknown bound, we need to instantiate it. */
1678 if (TREE_CODE (e) == VAR_DECL
1679 && VAR_HAD_UNKNOWN_BOUND (e)
1680 && DECL_TEMPLATE_INSTANTIATION (e))
1681 instantiate_decl (e, /*defer_ok*/true, /*expl_inst_mem*/false);
1682
03a904b5
JJ
1683 e = mark_type_use (e);
1684
5566b478 1685 if (TREE_CODE (e) == COMPONENT_REF
ea0e2a51 1686 && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL
162bc98d 1687 && DECL_C_BIT_FIELD (TREE_OPERAND (e, 1)))
5566b478 1688 {
5ade1ed2
DG
1689 if (complain & tf_error)
1690 error ("invalid application of %<sizeof%> to a bit-field");
1691 else
1692 return error_mark_node;
7a18b933
NS
1693 e = char_type_node;
1694 }
1695 else if (is_overloaded_fn (e))
1696 {
5ade1ed2 1697 if (complain & tf_error)
cbe5f3b3 1698 permerror (input_location, "ISO C++ forbids applying %<sizeof%> to an expression of "
37ec60ed 1699 "function type");
5ade1ed2
DG
1700 else
1701 return error_mark_node;
7a18b933 1702 e = char_type_node;
5566b478 1703 }
05e0b2f4
JM
1704 else if (type_unknown_p (e))
1705 {
5ade1ed2
DG
1706 if (complain & tf_error)
1707 cxx_incomplete_type_error (e, TREE_TYPE (e));
1708 else
1709 return error_mark_node;
7a18b933 1710 e = char_type_node;
05e0b2f4 1711 }
7a18b933
NS
1712 else
1713 e = TREE_TYPE (e);
c8094d83 1714
5ade1ed2 1715 return cxx_sizeof_or_alignof_type (e, SIZEOF_EXPR, complain & tf_error);
5566b478 1716}
c8094d83 1717
229970c4 1718/* Implement the __alignof keyword: Return the minimum required
69d1a403 1719 alignment of E, measured in bytes. For VAR_DECL's and
229970c4
JM
1720 FIELD_DECL's return DECL_ALIGN (which can be set from an
1721 "aligned" __attribute__ specification). */
1722
1723static tree
5ade1ed2 1724cxx_alignof_expr (tree e, tsubst_flags_t complain)
229970c4
JM
1725{
1726 tree t;
3db45ab5 1727
229970c4
JM
1728 if (e == error_mark_node)
1729 return error_mark_node;
1730
1731 if (processing_template_decl)
1732 {
1733 e = build_min (ALIGNOF_EXPR, size_type_node, e);
1734 TREE_SIDE_EFFECTS (e) = 0;
1735 TREE_READONLY (e) = 1;
1736
1737 return e;
1738 }
1739
03a904b5
JJ
1740 e = mark_type_use (e);
1741
229970c4
JM
1742 if (TREE_CODE (e) == VAR_DECL)
1743 t = size_int (DECL_ALIGN_UNIT (e));
1744 else if (TREE_CODE (e) == COMPONENT_REF
1745 && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL
1746 && DECL_C_BIT_FIELD (TREE_OPERAND (e, 1)))
1747 {
5ade1ed2
DG
1748 if (complain & tf_error)
1749 error ("invalid application of %<__alignof%> to a bit-field");
1750 else
1751 return error_mark_node;
229970c4
JM
1752 t = size_one_node;
1753 }
1754 else if (TREE_CODE (e) == COMPONENT_REF
1755 && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL)
1756 t = size_int (DECL_ALIGN_UNIT (TREE_OPERAND (e, 1)));
1757 else if (is_overloaded_fn (e))
1758 {
5ade1ed2 1759 if (complain & tf_error)
cbe5f3b3 1760 permerror (input_location, "ISO C++ forbids applying %<__alignof%> to an expression of "
37ec60ed 1761 "function type");
5ade1ed2
DG
1762 else
1763 return error_mark_node;
837edd5f
GK
1764 if (TREE_CODE (e) == FUNCTION_DECL)
1765 t = size_int (DECL_ALIGN_UNIT (e));
1766 else
1767 t = size_one_node;
229970c4
JM
1768 }
1769 else if (type_unknown_p (e))
1770 {
5ade1ed2
DG
1771 if (complain & tf_error)
1772 cxx_incomplete_type_error (e, TREE_TYPE (e));
1773 else
1774 return error_mark_node;
229970c4
JM
1775 t = size_one_node;
1776 }
1777 else
5ade1ed2
DG
1778 return cxx_sizeof_or_alignof_type (TREE_TYPE (e), ALIGNOF_EXPR,
1779 complain & tf_error);
229970c4
JM
1780
1781 return fold_convert (size_type_node, t);
1782}
1783
69d1a403
JM
1784/* Process a sizeof or alignof expression E with code OP where the operand
1785 is an expression. */
229970c4
JM
1786
1787tree
5ade1ed2 1788cxx_sizeof_or_alignof_expr (tree e, enum tree_code op, bool complain)
229970c4
JM
1789{
1790 if (op == SIZEOF_EXPR)
5ade1ed2 1791 return cxx_sizeof_expr (e, complain? tf_warning_or_error : tf_none);
229970c4 1792 else
5ade1ed2 1793 return cxx_alignof_expr (e, complain? tf_warning_or_error : tf_none);
229970c4 1794}
8d08fdba 1795\f
c8b2e872
MM
1796/* EXPR is being used in a context that is not a function call.
1797 Enforce:
1798
c8094d83 1799 [expr.ref]
c8b2e872
MM
1800
1801 The expression can be used only as the left-hand operand of a
c8094d83 1802 member function call.
c8b2e872
MM
1803
1804 [expr.mptr.operator]
1805
1806 If the result of .* or ->* is a function, then that result can be
c8094d83 1807 used only as the operand for the function call operator ().
c8b2e872
MM
1808
1809 by issuing an error message if appropriate. Returns true iff EXPR
1810 violates these rules. */
1811
1812bool
5ade1ed2 1813invalid_nonstatic_memfn_p (const_tree expr, tsubst_flags_t complain)
c8b2e872 1814{
111a28c2 1815 if (expr && DECL_NONSTATIC_MEMBER_FUNCTION_P (expr))
c8b2e872 1816 {
5ade1ed2
DG
1817 if (complain & tf_error)
1818 error ("invalid use of non-static member function");
c8b2e872
MM
1819 return true;
1820 }
1821 return false;
1822}
1823
38a4afee
MM
1824/* If EXP is a reference to a bitfield, and the type of EXP does not
1825 match the declared type of the bitfield, return the declared type
1826 of the bitfield. Otherwise, return NULL_TREE. */
1827
1828tree
58f9752a 1829is_bitfield_expr_with_lowered_type (const_tree exp)
38a4afee 1830{
f9aa54d3 1831 switch (TREE_CODE (exp))
38a4afee 1832 {
f9aa54d3 1833 case COND_EXPR:
42924ed7
JJ
1834 if (!is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1)
1835 ? TREE_OPERAND (exp, 1)
1836 : TREE_OPERAND (exp, 0)))
38a4afee
MM
1837 return NULL_TREE;
1838 return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 2));
f9aa54d3
MM
1839
1840 case COMPOUND_EXPR:
1841 return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1));
1842
1843 case MODIFY_EXPR:
1844 case SAVE_EXPR:
1845 return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0));
1846
1847 case COMPONENT_REF:
1848 {
1849 tree field;
1850
1851 field = TREE_OPERAND (exp, 1);
e76d7cc7 1852 if (TREE_CODE (field) != FIELD_DECL || !DECL_BIT_FIELD_TYPE (field))
f9aa54d3
MM
1853 return NULL_TREE;
1854 if (same_type_ignoring_top_level_qualifiers_p
1855 (TREE_TYPE (exp), DECL_BIT_FIELD_TYPE (field)))
1856 return NULL_TREE;
1857 return DECL_BIT_FIELD_TYPE (field);
1858 }
1859
5f9e56b3 1860 CASE_CONVERT:
be2b5483
RG
1861 if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (exp, 0)))
1862 == TYPE_MAIN_VARIANT (TREE_TYPE (exp)))
1863 return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0));
1864 /* Fallthrough. */
1865
f9aa54d3
MM
1866 default:
1867 return NULL_TREE;
38a4afee 1868 }
f9aa54d3
MM
1869}
1870
1871/* Like is_bitfield_with_lowered_type, except that if EXP is not a
1872 bitfield with a lowered type, the type of EXP is returned, rather
1873 than NULL_TREE. */
1874
1875tree
58f9752a 1876unlowered_expr_type (const_tree exp)
f9aa54d3
MM
1877{
1878 tree type;
1879
1880 type = is_bitfield_expr_with_lowered_type (exp);
1881 if (!type)
1882 type = TREE_TYPE (exp);
1883
1884 return type;
38a4afee
MM
1885}
1886
0a72704b
MM
1887/* Perform the conversions in [expr] that apply when an lvalue appears
1888 in an rvalue context: the lvalue-to-rvalue, array-to-pointer, and
41990f96
MM
1889 function-to-pointer conversions. In addition, manifest constants
1890 are replaced by their values, and bitfield references are converted
03a904b5
JJ
1891 to their declared types. Note that this function does not perform the
1892 lvalue-to-rvalue conversion for class types. If you need that conversion
1893 to for class types, then you probably need to use force_rvalue.
8d08fdba 1894
41990f96
MM
1895 Although the returned value is being used as an rvalue, this
1896 function does not wrap the returned expression in a
1897 NON_LVALUE_EXPR; the caller is expected to be mindful of the fact
1898 that the return value is no longer an lvalue. */
8d08fdba
MS
1899
1900tree
acd8e2d0 1901decay_conversion (tree exp)
8d08fdba 1902{
926ce8bd
KH
1903 tree type;
1904 enum tree_code code;
8d08fdba 1905
a359be75 1906 type = TREE_TYPE (exp);
07c88314
MM
1907 if (type == error_mark_node)
1908 return error_mark_node;
1909
03a904b5
JJ
1910 exp = mark_rvalue_use (exp);
1911
ccb05613 1912 exp = resolve_nondeduced_context (exp);
40260429
NS
1913 if (type_unknown_p (exp))
1914 {
7a228918 1915 cxx_incomplete_type_error (exp, TREE_TYPE (exp));
40260429
NS
1916 return error_mark_node;
1917 }
8d08fdba 1918
393e756d 1919 exp = decl_constant_value (exp);
41990f96
MM
1920 if (error_operand_p (exp))
1921 return error_mark_node;
c8094d83 1922
0c32fb95
JM
1923 if (NULLPTR_TYPE_P (type))
1924 return nullptr_node;
1925
8d08fdba
MS
1926 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
1927 Leave such NOP_EXPRs, since RHS is being used in non-lvalue context. */
38a4afee 1928 code = TREE_CODE (type);
8d08fdba
MS
1929 if (code == VOID_TYPE)
1930 {
8251199e 1931 error ("void value not ignored as it ought to be");
8d08fdba
MS
1932 return error_mark_node;
1933 }
5ade1ed2 1934 if (invalid_nonstatic_memfn_p (exp, tf_warning_or_error))
c8b2e872 1935 return error_mark_node;
e6e174e5 1936 if (code == FUNCTION_TYPE || is_overloaded_fn (exp))
5ade1ed2 1937 return cp_build_unary_op (ADDR_EXPR, exp, 0, tf_warning_or_error);
8d08fdba
MS
1938 if (code == ARRAY_TYPE)
1939 {
926ce8bd 1940 tree adr;
8d08fdba 1941 tree ptrtype;
8d08fdba
MS
1942
1943 if (TREE_CODE (exp) == INDIRECT_REF)
c8094d83 1944 return build_nop (build_pointer_type (TREE_TYPE (type)),
7b6d72fc 1945 TREE_OPERAND (exp, 0));
8d08fdba
MS
1946
1947 if (TREE_CODE (exp) == COMPOUND_EXPR)
1948 {
a9aedbc2 1949 tree op1 = decay_conversion (TREE_OPERAND (exp, 1));
f293ce4b
RS
1950 return build2 (COMPOUND_EXPR, TREE_TYPE (op1),
1951 TREE_OPERAND (exp, 0), op1);
8d08fdba
MS
1952 }
1953
1954 if (!lvalue_p (exp)
1955 && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp)))
1956 {
8251199e 1957 error ("invalid use of non-lvalue array");
8d08fdba
MS
1958 return error_mark_node;
1959 }
1960
01240200 1961 ptrtype = build_pointer_type (TREE_TYPE (type));
8d08fdba
MS
1962
1963 if (TREE_CODE (exp) == VAR_DECL)
1964 {
dffd7eb6 1965 if (!cxx_mark_addressable (exp))
8d08fdba 1966 return error_mark_node;
0e8c9b28 1967 adr = build_nop (ptrtype, build_address (exp));
8d08fdba
MS
1968 return adr;
1969 }
1970 /* This way is better for a COMPONENT_REF since it can
1971 simplify the offset for a component. */
5ade1ed2 1972 adr = cp_build_unary_op (ADDR_EXPR, exp, 1, tf_warning_or_error);
37c46b43 1973 return cp_convert (ptrtype, adr);
8d08fdba 1974 }
3db45ab5 1975
41990f96
MM
1976 /* If a bitfield is used in a context where integral promotion
1977 applies, then the caller is expected to have used
1978 default_conversion. That function promotes bitfields correctly
1979 before calling this function. At this point, if we have a
1980 bitfield referenced, we may assume that is not subject to
1981 promotion, and that, therefore, the type of the resulting rvalue
1982 is the declared type of the bitfield. */
1983 exp = convert_bitfield_to_declared_type (exp);
a9aedbc2 1984
41990f96
MM
1985 /* We do not call rvalue() here because we do not want to wrap EXP
1986 in a NON_LVALUE_EXPR. */
1987
1988 /* [basic.lval]
1989
1990 Non-class rvalues always have cv-unqualified types. */
1991 type = TREE_TYPE (exp);
36c37128 1992 if (!CLASS_TYPE_P (type) && cv_qualified_p (type))
164247b0 1993 exp = build_nop (cv_unqualified (type), exp);
ba9c33e8 1994
a9aedbc2
MS
1995 return exp;
1996}
1997
39a13be5 1998/* Perform preparatory conversions, as part of the "usual arithmetic
41990f96
MM
1999 conversions". In particular, as per [expr]:
2000
2001 Whenever an lvalue expression appears as an operand of an
2002 operator that expects the rvalue for that operand, the
2003 lvalue-to-rvalue, array-to-pointer, or function-to-pointer
2004 standard conversions are applied to convert the expression to an
2005 rvalue.
2006
2007 In addition, we perform integral promotions here, as those are
2008 applied to both operands to a binary operator before determining
2009 what additional conversions should apply. */
2010
d593cb3d 2011tree
acd8e2d0 2012default_conversion (tree exp)
a9aedbc2 2013{
40449a90
SL
2014 /* Check for target-specific promotions. */
2015 tree promoted_type = targetm.promoted_type (TREE_TYPE (exp));
2016 if (promoted_type)
2017 exp = cp_convert (promoted_type, exp);
41990f96
MM
2018 /* Perform the integral promotions first so that bitfield
2019 expressions (which may promote to "int", even if the bitfield is
3db45ab5 2020 declared "unsigned") are promoted correctly. */
40449a90 2021 else if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (exp)))
0a72704b 2022 exp = perform_integral_promotions (exp);
41990f96
MM
2023 /* Perform the other conversions. */
2024 exp = decay_conversion (exp);
a9aedbc2 2025
8d08fdba
MS
2026 return exp;
2027}
6b5fbb55 2028
0a72704b
MM
2029/* EXPR is an expression with an integral or enumeration type.
2030 Perform the integral promotions in [conv.prom], and return the
2031 converted value. */
2032
2033tree
2034perform_integral_promotions (tree expr)
2035{
2036 tree type;
2037 tree promoted_type;
2038
03a904b5
JJ
2039 expr = mark_rvalue_use (expr);
2040
efe1ad46
MM
2041 /* [conv.prom]
2042
2043 If the bitfield has an enumerated type, it is treated as any
2044 other value of that type for promotion purposes. */
2045 type = is_bitfield_expr_with_lowered_type (expr);
2046 if (!type || TREE_CODE (type) != ENUMERAL_TYPE)
2047 type = TREE_TYPE (expr);
50bc768d 2048 gcc_assert (INTEGRAL_OR_ENUMERATION_TYPE_P (type));
0a72704b
MM
2049 promoted_type = type_promotes_to (type);
2050 if (type != promoted_type)
2051 expr = cp_convert (promoted_type, expr);
2052 return expr;
2053}
2054
d9cf7c82
JM
2055/* Returns nonzero iff exp is a STRING_CST or the result of applying
2056 decay_conversion to one. */
2057
2058int
58f9752a 2059string_conv_p (const_tree totype, const_tree exp, int warn)
d9cf7c82
JM
2060{
2061 tree t;
2062
cfb10bd3 2063 if (TREE_CODE (totype) != POINTER_TYPE)
d9cf7c82
JM
2064 return 0;
2065
2066 t = TREE_TYPE (totype);
3bfdc719 2067 if (!same_type_p (t, char_type_node)
b6baa67d
KVH
2068 && !same_type_p (t, char16_type_node)
2069 && !same_type_p (t, char32_type_node)
3bfdc719 2070 && !same_type_p (t, wchar_type_node))
d9cf7c82
JM
2071 return 0;
2072
848b92e1 2073 if (TREE_CODE (exp) == STRING_CST)
d9cf7c82 2074 {
b6baa67d 2075 /* Make sure that we don't try to convert between char and wide chars. */
6e176bd6 2076 if (!same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (exp))), t))
848b92e1
JM
2077 return 0;
2078 }
2079 else
2080 {
2081 /* Is this a string constant which has decayed to 'const char *'? */
a3360e77 2082 t = build_pointer_type (cp_build_qualified_type (t, TYPE_QUAL_CONST));
3bfdc719 2083 if (!same_type_p (TREE_TYPE (exp), t))
d9cf7c82
JM
2084 return 0;
2085 STRIP_NOPS (exp);
2086 if (TREE_CODE (exp) != ADDR_EXPR
2087 || TREE_CODE (TREE_OPERAND (exp, 0)) != STRING_CST)
2088 return 0;
2089 }
2090
2091 /* This warning is not very useful, as it complains about printf. */
b323323f 2092 if (warn)
4b641750
MM
2093 warning (OPT_Wwrite_strings,
2094 "deprecated conversion from string constant to %qT",
2095 totype);
d9cf7c82
JM
2096
2097 return 1;
2098}
8d08fdba 2099
e9a25f70
JL
2100/* Given a COND_EXPR, MIN_EXPR, or MAX_EXPR in T, return it in a form that we
2101 can, for example, use as an lvalue. This code used to be in
2102 unary_complex_lvalue, but we needed it to deal with `a = (d == c) ? b : c'
2103 expressions, where we're dealing with aggregates. But now it's again only
2104 called from unary_complex_lvalue. The case (in particular) that led to
2105 this was with CODE == ADDR_EXPR, since it's not an lvalue when we'd
2106 get it there. */
e92cc029 2107
8d08fdba 2108static tree
5ade1ed2
DG
2109rationalize_conditional_expr (enum tree_code code, tree t,
2110 tsubst_flags_t complain)
8d08fdba 2111{
e9a25f70
JL
2112 /* For MIN_EXPR or MAX_EXPR, fold-const.c has arranged things so that
2113 the first operand is always the one to be used if both operands
2114 are equal, so we know what conditional expression this used to be. */
2115 if (TREE_CODE (t) == MIN_EXPR || TREE_CODE (t) == MAX_EXPR)
2116 {
2a67bec2
ILT
2117 tree op0 = TREE_OPERAND (t, 0);
2118 tree op1 = TREE_OPERAND (t, 1);
2119
d211a298 2120 /* The following code is incorrect if either operand side-effects. */
2a67bec2
ILT
2121 gcc_assert (!TREE_SIDE_EFFECTS (op0)
2122 && !TREE_SIDE_EFFECTS (op1));
e9a25f70
JL
2123 return
2124 build_conditional_expr (build_x_binary_op ((TREE_CODE (t) == MIN_EXPR
2125 ? LE_EXPR : GE_EXPR),
2a67bec2
ILT
2126 op0, TREE_CODE (op0),
2127 op1, TREE_CODE (op1),
5ade1ed2
DG
2128 /*overloaded_p=*/NULL,
2129 complain),
2130 cp_build_unary_op (code, op0, 0, complain),
2131 cp_build_unary_op (code, op1, 0, complain),
2132 complain);
e9a25f70
JL
2133 }
2134
8d08fdba
MS
2135 return
2136 build_conditional_expr (TREE_OPERAND (t, 0),
5ade1ed2
DG
2137 cp_build_unary_op (code, TREE_OPERAND (t, 1), 0,
2138 complain),
2139 cp_build_unary_op (code, TREE_OPERAND (t, 2), 0,
2140 complain),
2141 complain);
8d08fdba
MS
2142}
2143
9e9ff709
MS
2144/* Given the TYPE of an anonymous union field inside T, return the
2145 FIELD_DECL for the field. If not found return NULL_TREE. Because
2146 anonymous unions can nest, we must also search all anonymous unions
2147 that are directly reachable. */
e92cc029 2148
b3dd05b1 2149tree
acd8e2d0 2150lookup_anon_field (tree t, tree type)
9e9ff709
MS
2151{
2152 tree field;
2153
910ad8de 2154 for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field))
9e9ff709
MS
2155 {
2156 if (TREE_STATIC (field))
2157 continue;
17bbb839 2158 if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
9e9ff709
MS
2159 continue;
2160
2161 /* If we find it directly, return the field. */
2162 if (DECL_NAME (field) == NULL_TREE
71631a1f 2163 && type == TYPE_MAIN_VARIANT (TREE_TYPE (field)))
9e9ff709
MS
2164 {
2165 return field;
2166 }
2167
2168 /* Otherwise, it could be nested, search harder. */
2169 if (DECL_NAME (field) == NULL_TREE
6bdb8141 2170 && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
9e9ff709
MS
2171 {
2172 tree subfield = lookup_anon_field (TREE_TYPE (field), type);
2173 if (subfield)
2174 return subfield;
2175 }
2176 }
2177 return NULL_TREE;
2178}
2179
50ad9642
MM
2180/* Build an expression representing OBJECT.MEMBER. OBJECT is an
2181 expression; MEMBER is a DECL or baselink. If ACCESS_PATH is
2182 non-NULL, it indicates the path to the base used to name MEMBER.
2183 If PRESERVE_REFERENCE is true, the expression returned will have
2184 REFERENCE_TYPE if the MEMBER does. Otherwise, the expression
c8094d83 2185 returned will have the type referred to by the reference.
50ad9642
MM
2186
2187 This function does not perform access control; that is either done
2188 earlier by the parser when the name of MEMBER is resolved to MEMBER
2189 itself, or later when overload resolution selects one of the
2190 functions indicated by MEMBER. */
e92cc029 2191
8d08fdba 2192tree
c8094d83 2193build_class_member_access_expr (tree object, tree member,
5ade1ed2
DG
2194 tree access_path, bool preserve_reference,
2195 tsubst_flags_t complain)
8d08fdba 2196{
50ad9642
MM
2197 tree object_type;
2198 tree member_scope;
2199 tree result = NULL_TREE;
8d08fdba 2200
2e5d2970 2201 if (error_operand_p (object) || error_operand_p (member))
01240200 2202 return error_mark_node;
5566b478 2203
50bc768d 2204 gcc_assert (DECL_P (member) || BASELINK_P (member));
8d08fdba 2205
50ad9642 2206 /* [expr.ref]
5566b478 2207
50ad9642
MM
2208 The type of the first expression shall be "class object" (of a
2209 complete type). */
2210 object_type = TREE_TYPE (object);
c8094d83 2211 if (!currently_open_class (object_type)
21b34b9c 2212 && !complete_type_or_else (object_type, object))
50ad9642
MM
2213 return error_mark_node;
2214 if (!CLASS_TYPE_P (object_type))
fc378698 2215 {
5ade1ed2
DG
2216 if (complain & tf_error)
2217 error ("request for member %qD in %qE, which is of non-class type %qT",
2218 member, object, object_type);
50ad9642 2219 return error_mark_node;
fc378698 2220 }
8d08fdba 2221
50ad9642
MM
2222 /* The standard does not seem to actually say that MEMBER must be a
2223 member of OBJECT_TYPE. However, that is clearly what is
2224 intended. */
2225 if (DECL_P (member))
8d08fdba 2226 {
50ad9642
MM
2227 member_scope = DECL_CLASS_CONTEXT (member);
2228 mark_used (member);
2229 if (TREE_DEPRECATED (member))
9b86d6bb 2230 warn_deprecated_use (member, NULL_TREE);
50ad9642
MM
2231 }
2232 else
0197270c 2233 member_scope = BINFO_TYPE (BASELINK_ACCESS_BINFO (member));
50ad9642
MM
2234 /* If MEMBER is from an anonymous aggregate, MEMBER_SCOPE will
2235 presently be the anonymous union. Go outwards until we find a
2236 type related to OBJECT_TYPE. */
2237 while (ANON_AGGR_TYPE_P (member_scope)
2238 && !same_type_ignoring_top_level_qualifiers_p (member_scope,
2239 object_type))
2240 member_scope = TYPE_CONTEXT (member_scope);
2241 if (!member_scope || !DERIVED_FROM_P (member_scope, object_type))
2242 {
5ade1ed2
DG
2243 if (complain & tf_error)
2244 {
2245 if (TREE_CODE (member) == FIELD_DECL)
2246 error ("invalid use of nonstatic data member %qE", member);
2247 else
2248 error ("%qD is not a member of %qT", member, object_type);
2249 }
50ad9642 2250 return error_mark_node;
8d08fdba 2251 }
8d08fdba 2252
f576dfc4
JM
2253 /* Transform `(a, b).x' into `(*(a, &b)).x', `(a ? b : c).x' into
2254 `(*(a ? &b : &c)).x', and so on. A COND_EXPR is only an lvalue
3b426391 2255 in the front end; only _DECLs and _REFs are lvalues in the back end. */
f576dfc4
JM
2256 {
2257 tree temp = unary_complex_lvalue (ADDR_EXPR, object);
2258 if (temp)
dd865ef6 2259 object = cp_build_indirect_ref (temp, RO_NULL, complain);
f576dfc4 2260 }
2050a1bb 2261
50ad9642
MM
2262 /* In [expr.ref], there is an explicit list of the valid choices for
2263 MEMBER. We check for each of those cases here. */
2264 if (TREE_CODE (member) == VAR_DECL)
8d08fdba 2265 {
50ad9642
MM
2266 /* A static data member. */
2267 result = member;
2aa64966 2268 mark_exp_read (object);
50ad9642
MM
2269 /* If OBJECT has side-effects, they are supposed to occur. */
2270 if (TREE_SIDE_EFFECTS (object))
f293ce4b 2271 result = build2 (COMPOUND_EXPR, TREE_TYPE (result), object, result);
8d08fdba 2272 }
50ad9642
MM
2273 else if (TREE_CODE (member) == FIELD_DECL)
2274 {
2275 /* A non-static data member. */
2276 bool null_object_p;
2277 int type_quals;
2278 tree member_type;
8d08fdba 2279
50ad9642
MM
2280 null_object_p = (TREE_CODE (object) == INDIRECT_REF
2281 && integer_zerop (TREE_OPERAND (object, 0)));
8d08fdba 2282
50ad9642 2283 /* Convert OBJECT to the type of MEMBER. */
bdaa131b
JM
2284 if (!same_type_p (TYPE_MAIN_VARIANT (object_type),
2285 TYPE_MAIN_VARIANT (member_scope)))
8d08fdba 2286 {
50ad9642
MM
2287 tree binfo;
2288 base_kind kind;
2289
2290 binfo = lookup_base (access_path ? access_path : object_type,
18e4be85 2291 member_scope, ba_unique, &kind);
50ad9642
MM
2292 if (binfo == error_mark_node)
2293 return error_mark_node;
2294
bdaa131b 2295 /* It is invalid to try to get to a virtual base of a
50ad9642
MM
2296 NULL object. The most common cause is invalid use of
2297 offsetof macro. */
2298 if (null_object_p && kind == bk_via_virtual)
2299 {
5ade1ed2
DG
2300 if (complain & tf_error)
2301 {
2302 error ("invalid access to non-static data member %qD of "
2303 "NULL object",
2304 member);
2305 error ("(perhaps the %<offsetof%> macro was used incorrectly)");
2306 }
50ad9642
MM
2307 return error_mark_node;
2308 }
2309
2310 /* Convert to the base. */
c8094d83 2311 object = build_base_path (PLUS_EXPR, object, binfo,
50ad9642
MM
2312 /*nonnull=*/1);
2313 /* If we found the base successfully then we should be able
2314 to convert to it successfully. */
50bc768d 2315 gcc_assert (object != error_mark_node);
8d08fdba 2316 }
3b5b4904
JM
2317
2318 /* Complain about other invalid uses of offsetof, even though they will
2319 give the right answer. Note that we complain whether or not they
2320 actually used the offsetof macro, since there's no way to know at this
2321 point. So we just give a warning, instead of a pedwarn. */
981c353e
RH
2322 /* Do not produce this warning for base class field references, because
2323 we know for a fact that didn't come from offsetof. This does occur
2324 in various testsuite cases where a null object is passed where a
2325 vtable access is required. */
a01fff59 2326 if (null_object_p && warn_invalid_offsetof
c32097d8 2327 && CLASSTYPE_NON_STD_LAYOUT (object_type)
981c353e 2328 && !DECL_FIELD_IS_BASE (member)
7d882b83 2329 && cp_unevaluated_operand == 0
5ade1ed2 2330 && (complain & tf_warning))
8d08fdba 2331 {
683d6ff9
MLI
2332 warning (OPT_Winvalid_offsetof,
2333 "invalid access to non-static data member %qD "
2334 " of NULL object", member);
2335 warning (OPT_Winvalid_offsetof,
2336 "(perhaps the %<offsetof%> macro was used incorrectly)");
8d08fdba 2337 }
8d08fdba 2338
50ad9642
MM
2339 /* If MEMBER is from an anonymous aggregate, we have converted
2340 OBJECT so that it refers to the class containing the
2341 anonymous union. Generate a reference to the anonymous union
2342 itself, and recur to find MEMBER. */
0ca7178c 2343 if (ANON_AGGR_TYPE_P (DECL_CONTEXT (member))
a723baf1
MM
2344 /* When this code is called from build_field_call, the
2345 object already has the type of the anonymous union.
2346 That is because the COMPONENT_REF was already
2347 constructed, and was then disassembled before calling
2348 build_field_call. After the function-call code is
2349 cleaned up, this waste can be eliminated. */
c8094d83 2350 && (!same_type_ignoring_top_level_qualifiers_p
a723baf1 2351 (TREE_TYPE (object), DECL_CONTEXT (member))))
50ad9642
MM
2352 {
2353 tree anonymous_union;
2354
2355 anonymous_union = lookup_anon_field (TREE_TYPE (object),
2356 DECL_CONTEXT (member));
2357 object = build_class_member_access_expr (object,
2358 anonymous_union,
2359 /*access_path=*/NULL_TREE,
5ade1ed2
DG
2360 preserve_reference,
2361 complain);
50ad9642
MM
2362 }
2363
2364 /* Compute the type of the field, as described in [expr.ref]. */
2365 type_quals = TYPE_UNQUALIFIED;
2366 member_type = TREE_TYPE (member);
2367 if (TREE_CODE (member_type) != REFERENCE_TYPE)
2368 {
c8094d83 2369 type_quals = (cp_type_quals (member_type)
50ad9642 2370 | cp_type_quals (object_type));
c8094d83 2371
50ad9642
MM
2372 /* A field is const (volatile) if the enclosing object, or the
2373 field itself, is const (volatile). But, a mutable field is
2374 not const, even within a const object. */
2375 if (DECL_MUTABLE_P (member))
2376 type_quals &= ~TYPE_QUAL_CONST;
2377 member_type = cp_build_qualified_type (member_type, type_quals);
2378 }
2379
455f19cb
MM
2380 result = build3 (COMPONENT_REF, member_type, object, member,
2381 NULL_TREE);
2382 result = fold_if_not_in_template (result);
50ad9642
MM
2383
2384 /* Mark the expression const or volatile, as appropriate. Even
2385 though we've dealt with the type above, we still have to mark the
2386 expression itself. */
2387 if (type_quals & TYPE_QUAL_CONST)
2388 TREE_READONLY (result) = 1;
12a669d1 2389 if (type_quals & TYPE_QUAL_VOLATILE)
50ad9642
MM
2390 TREE_THIS_VOLATILE (result) = 1;
2391 }
2392 else if (BASELINK_P (member))
9e9ff709 2393 {
50ad9642
MM
2394 /* The member is a (possibly overloaded) member function. */
2395 tree functions;
a723baf1 2396 tree type;
50ad9642
MM
2397
2398 /* If the MEMBER is exactly one static member function, then we
2399 know the type of the expression. Otherwise, we must wait
2400 until overload resolution has been performed. */
2401 functions = BASELINK_FUNCTIONS (member);
2402 if (TREE_CODE (functions) == FUNCTION_DECL
2403 && DECL_STATIC_FUNCTION_P (functions))
a723baf1 2404 type = TREE_TYPE (functions);
50ad9642 2405 else
a723baf1
MM
2406 type = unknown_type_node;
2407 /* Note that we do not convert OBJECT to the BASELINK_BINFO
2408 base. That will happen when the function is called. */
f293ce4b 2409 result = build3 (COMPONENT_REF, type, object, member, NULL_TREE);
9e9ff709 2410 }
50ad9642 2411 else if (TREE_CODE (member) == CONST_DECL)
b928a651 2412 {
50ad9642
MM
2413 /* The member is an enumerator. */
2414 result = member;
2415 /* If OBJECT has side-effects, they are supposed to occur. */
2416 if (TREE_SIDE_EFFECTS (object))
f293ce4b
RS
2417 result = build2 (COMPOUND_EXPR, TREE_TYPE (result),
2418 object, result);
b928a651 2419 }
8d08fdba
MS
2420 else
2421 {
5ade1ed2
DG
2422 if (complain & tf_error)
2423 error ("invalid use of %qD", member);
50ad9642
MM
2424 return error_mark_node;
2425 }
8d08fdba 2426
50ad9642
MM
2427 if (!preserve_reference)
2428 /* [expr.ref]
c8094d83 2429
50ad9642
MM
2430 If E2 is declared to have type "reference to T", then ... the
2431 type of E1.E2 is T. */
2432 result = convert_from_reference (result);
e6f62286 2433
50ad9642
MM
2434 return result;
2435}
8d08fdba 2436
05134211
JM
2437/* Return the destructor denoted by OBJECT.SCOPE::DTOR_NAME, or, if
2438 SCOPE is NULL, by OBJECT.DTOR_NAME, where DTOR_NAME is ~type. */
a723baf1
MM
2439
2440static tree
2441lookup_destructor (tree object, tree scope, tree dtor_name)
2442{
2443 tree object_type = TREE_TYPE (object);
2444 tree dtor_type = TREE_OPERAND (dtor_name, 0);
4546865e 2445 tree expr;
a723baf1 2446
1b3d28a8 2447 if (scope && !check_dtor_name (scope, dtor_type))
a723baf1 2448 {
a82e1a7d 2449 error ("qualified type %qT does not match destructor name ~%qT",
a723baf1
MM
2450 scope, dtor_type);
2451 return error_mark_node;
2452 }
05134211
JM
2453 if (TREE_CODE (dtor_type) == IDENTIFIER_NODE)
2454 {
2455 /* In a template, names we can't find a match for are still accepted
2456 destructor names, and we check them here. */
2457 if (check_dtor_name (object_type, dtor_type))
2458 dtor_type = object_type;
2459 else
2460 {
2461 error ("object type %qT does not match destructor name ~%qT",
2462 object_type, dtor_type);
2463 return error_mark_node;
2464 }
2465
2466 }
2467 else if (!DERIVED_FROM_P (dtor_type, TYPE_MAIN_VARIANT (object_type)))
a723baf1 2468 {
a82e1a7d 2469 error ("the type being destroyed is %qT, but the destructor refers to %qT",
fca00ffb 2470 TYPE_MAIN_VARIANT (object_type), dtor_type);
a723baf1
MM
2471 return error_mark_node;
2472 }
4546865e 2473 expr = lookup_member (dtor_type, complete_dtor_identifier,
86ac0575 2474 /*protect=*/1, /*want_type=*/false);
4546865e
MM
2475 expr = (adjust_result_of_qualified_name_lookup
2476 (expr, dtor_type, object_type));
2477 return expr;
a723baf1
MM
2478}
2479
02ed62dd
MM
2480/* An expression of the form "A::template B" has been resolved to
2481 DECL. Issue a diagnostic if B is not a template or template
2482 specialization. */
2483
2484void
2485check_template_keyword (tree decl)
2486{
2487 /* The standard says:
2488
2489 [temp.names]
2490
2491 If a name prefixed by the keyword template is not a member
2492 template, the program is ill-formed.
2493
2494 DR 228 removed the restriction that the template be a member
3db45ab5
MS
2495 template.
2496
dd36d4e1 2497 DR 96, if accepted would add the further restriction that explicit
02ed62dd
MM
2498 template arguments must be provided if the template keyword is
2499 used, but, as of 2005-10-16, that DR is still in "drafting". If
2500 this DR is accepted, then the semantic checks here can be
2501 simplified, as the entity named must in fact be a template
2502 specialization, rather than, as at present, a set of overloaded
2503 functions containing at least one template function. */
2504 if (TREE_CODE (decl) != TEMPLATE_DECL
2505 && TREE_CODE (decl) != TEMPLATE_ID_EXPR)
2506 {
2507 if (!is_overloaded_fn (decl))
cbe5f3b3 2508 permerror (input_location, "%qD is not a template", decl);
02ed62dd
MM
2509 else
2510 {
2511 tree fns;
459051a0
MM
2512 fns = decl;
2513 if (BASELINK_P (fns))
2514 fns = BASELINK_FUNCTIONS (fns);
02ed62dd
MM
2515 while (fns)
2516 {
2517 tree fn = OVL_CURRENT (fns);
2518 if (TREE_CODE (fn) == TEMPLATE_DECL
2519 || TREE_CODE (fn) == TEMPLATE_ID_EXPR)
2520 break;
2521 if (TREE_CODE (fn) == FUNCTION_DECL
2522 && DECL_USE_TEMPLATE (fn)
2523 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (fn)))
2524 break;
2525 fns = OVL_NEXT (fns);
2526 }
2527 if (!fns)
cbe5f3b3 2528 permerror (input_location, "%qD is not a template", decl);
02ed62dd
MM
2529 }
2530 }
2531}
2532
50ad9642
MM
2533/* This function is called by the parser to process a class member
2534 access expression of the form OBJECT.NAME. NAME is a node used by
2535 the parser to represent a name; it is not yet a DECL. It may,
2536 however, be a BASELINK where the BASELINK_FUNCTIONS is a
2537 TEMPLATE_ID_EXPR. Templates must be looked up by the parser, and
2538 there is no reason to do the lookup twice, so the parser keeps the
02ed62dd
MM
2539 BASELINK. TEMPLATE_P is true iff NAME was explicitly declared to
2540 be a template via the use of the "A::template B" syntax. */
8d08fdba 2541
50ad9642 2542tree
5ade1ed2
DG
2543finish_class_member_access_expr (tree object, tree name, bool template_p,
2544 tsubst_flags_t complain)
50ad9642 2545{
d17811fd 2546 tree expr;
50ad9642
MM
2547 tree object_type;
2548 tree member;
2549 tree access_path = NULL_TREE;
d17811fd
MM
2550 tree orig_object = object;
2551 tree orig_name = name;
3c8c2a0a 2552
50ad9642
MM
2553 if (object == error_mark_node || name == error_mark_node)
2554 return error_mark_node;
3c8c2a0a 2555
e58a9aa1
ZL
2556 /* If OBJECT is an ObjC class instance, we must obey ObjC access rules. */
2557 if (!objc_is_public (object, name))
2558 return error_mark_node;
2559
d17811fd
MM
2560 object_type = TREE_TYPE (object);
2561
50ad9642 2562 if (processing_template_decl)
d17811fd
MM
2563 {
2564 if (/* If OBJECT_TYPE is dependent, so is OBJECT.NAME. */
2565 dependent_type_p (object_type)
1ffe6573
MM
2566 /* If NAME is just an IDENTIFIER_NODE, then the expression
2567 is dependent. */
2568 || TREE_CODE (object) == IDENTIFIER_NODE
d17811fd
MM
2569 /* If NAME is "f<args>", where either 'f' or 'args' is
2570 dependent, then the expression is dependent. */
2571 || (TREE_CODE (name) == TEMPLATE_ID_EXPR
2572 && dependent_template_id_p (TREE_OPERAND (name, 0),
2573 TREE_OPERAND (name, 1)))
2574 /* If NAME is "T::X" where "T" is dependent, then the
2575 expression is dependent. */
2576 || (TREE_CODE (name) == SCOPE_REF
2577 && TYPE_P (TREE_OPERAND (name, 0))
2578 && dependent_type_p (TREE_OPERAND (name, 0))))
44de5aeb 2579 return build_min_nt (COMPONENT_REF, object, name, NULL_TREE);
d17811fd
MM
2580 object = build_non_dependent_expr (object);
2581 }
c8094d83 2582
50ad9642 2583 /* [expr.ref]
e23bd218 2584
50ad9642
MM
2585 The type of the first expression shall be "class object" (of a
2586 complete type). */
c8094d83 2587 if (!currently_open_class (object_type)
21b34b9c 2588 && !complete_type_or_else (object_type, object))
50ad9642
MM
2589 return error_mark_node;
2590 if (!CLASS_TYPE_P (object_type))
2591 {
5ade1ed2
DG
2592 if (complain & tf_error)
2593 error ("request for member %qD in %qE, which is of non-class type %qT",
2594 name, object, object_type);
50ad9642
MM
2595 return error_mark_node;
2596 }
f2d9afec 2597
50ad9642 2598 if (BASELINK_P (name))
fdeff563
NS
2599 /* A member function that has already been looked up. */
2600 member = name;
50ad9642
MM
2601 else
2602 {
2603 bool is_template_id = false;
2604 tree template_args = NULL_TREE;
d17811fd 2605 tree scope;
2ee887f2 2606
50ad9642 2607 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
2ee887f2 2608 {
50ad9642
MM
2609 is_template_id = true;
2610 template_args = TREE_OPERAND (name, 1);
2611 name = TREE_OPERAND (name, 0);
4864cc4a
KL
2612
2613 if (TREE_CODE (name) == OVERLOAD)
2614 name = DECL_NAME (get_first_fn (name));
2615 else if (DECL_P (name))
2616 name = DECL_NAME (name);
50ad9642 2617 }
f2d9afec 2618
50ad9642
MM
2619 if (TREE_CODE (name) == SCOPE_REF)
2620 {
e13d2b4e
MM
2621 /* A qualified name. The qualifying class or namespace `S'
2622 has already been looked up; it is either a TYPE or a
2623 NAMESPACE_DECL. */
50ad9642
MM
2624 scope = TREE_OPERAND (name, 0);
2625 name = TREE_OPERAND (name, 1);
50ad9642
MM
2626
2627 /* If SCOPE is a namespace, then the qualified name does not
2628 name a member of OBJECT_TYPE. */
2629 if (TREE_CODE (scope) == NAMESPACE_DECL)
2ee887f2 2630 {
5ade1ed2
DG
2631 if (complain & tf_error)
2632 error ("%<%D::%D%> is not a member of %qT",
2633 scope, name, object_type);
2ee887f2
MS
2634 return error_mark_node;
2635 }
50ad9642 2636
e13d2b4e
MM
2637 gcc_assert (CLASS_TYPE_P (scope));
2638 gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE
2639 || TREE_CODE (name) == BIT_NOT_EXPR);
2640
abd5730b
JM
2641 if (constructor_name_p (name, scope))
2642 {
2643 if (complain & tf_error)
2644 error ("cannot call constructor %<%T::%D%> directly",
2645 scope, name);
2646 return error_mark_node;
2647 }
2648
50ad9642
MM
2649 /* Find the base of OBJECT_TYPE corresponding to SCOPE. */
2650 access_path = lookup_base (object_type, scope, ba_check, NULL);
c8a65a25 2651 if (access_path == error_mark_node)
50ad9642 2652 return error_mark_node;
c8a65a25
MM
2653 if (!access_path)
2654 {
5ade1ed2
DG
2655 if (complain & tf_error)
2656 error ("%qT is not a base of %qT", scope, object_type);
c8a65a25
MM
2657 return error_mark_node;
2658 }
2ee887f2 2659 }
d17811fd
MM
2660 else
2661 {
2662 scope = NULL_TREE;
2663 access_path = object_type;
2664 }
2665
2666 if (TREE_CODE (name) == BIT_NOT_EXPR)
2667 member = lookup_destructor (object, scope, name);
2668 else
9e9ff709 2669 {
d17811fd 2670 /* Look up the member. */
c8094d83 2671 member = lookup_member (access_path, name, /*protect=*/1,
86ac0575 2672 /*want_type=*/false);
8a5f4379
GDR
2673 if (member == NULL_TREE)
2674 {
5ade1ed2
DG
2675 if (complain & tf_error)
2676 error ("%qD has no member named %qE", object_type, name);
8a5f4379
GDR
2677 return error_mark_node;
2678 }
d17811fd 2679 if (member == error_mark_node)
50ad9642
MM
2680 return error_mark_node;
2681 }
c8094d83 2682
50ad9642
MM
2683 if (is_template_id)
2684 {
be93747e 2685 tree templ = member;
c8094d83 2686
be93747e
KG
2687 if (BASELINK_P (templ))
2688 templ = lookup_template_function (templ, template_args);
50ad9642
MM
2689 else
2690 {
5ade1ed2
DG
2691 if (complain & tf_error)
2692 error ("%qD is not a member template function", name);
50ad9642
MM
2693 return error_mark_node;
2694 }
9e9ff709
MS
2695 }
2696 }
2697
a723baf1 2698 if (TREE_DEPRECATED (member))
9b86d6bb 2699 warn_deprecated_use (member, NULL_TREE);
a723baf1 2700
02ed62dd
MM
2701 if (template_p)
2702 check_template_keyword (member);
2703
d17811fd 2704 expr = build_class_member_access_expr (object, member, access_path,
5ade1ed2
DG
2705 /*preserve_reference=*/false,
2706 complain);
d17811fd 2707 if (processing_template_decl && expr != error_mark_node)
61e71a9e
NS
2708 {
2709 if (BASELINK_P (member))
2710 {
2711 if (TREE_CODE (orig_name) == SCOPE_REF)
2712 BASELINK_QUALIFIED_P (member) = 1;
2713 orig_name = member;
2714 }
2715 return build_min_non_dep (COMPONENT_REF, expr,
2716 orig_object, orig_name,
2717 NULL_TREE);
2718 }
3db45ab5 2719
d17811fd 2720 return expr;
8d08fdba 2721}
5156628f 2722
50ad9642
MM
2723/* Return an expression for the MEMBER_NAME field in the internal
2724 representation of PTRMEM, a pointer-to-member function. (Each
2725 pointer-to-member function type gets its own RECORD_TYPE so it is
2726 more convenient to access the fields by name than by FIELD_DECL.)
2727 This routine converts the NAME to a FIELD_DECL and then creates the
2728 node for the complete expression. */
5156628f
MS
2729
2730tree
50ad9642 2731build_ptrmemfunc_access_expr (tree ptrmem, tree member_name)
5156628f 2732{
50ad9642
MM
2733 tree ptrmem_type;
2734 tree member;
2735 tree member_type;
2736
2737 /* This code is a stripped down version of
2738 build_class_member_access_expr. It does not work to use that
2739 routine directly because it expects the object to be of class
2740 type. */
2741 ptrmem_type = TREE_TYPE (ptrmem);
50bc768d 2742 gcc_assert (TYPE_PTRMEMFUNC_P (ptrmem_type));
50ad9642 2743 member = lookup_member (ptrmem_type, member_name, /*protect=*/0,
86ac0575 2744 /*want_type=*/false);
50ad9642
MM
2745 member_type = cp_build_qualified_type (TREE_TYPE (member),
2746 cp_type_quals (ptrmem_type));
db3927fb
AH
2747 return fold_build3_loc (input_location,
2748 COMPONENT_REF, member_type,
7866705a 2749 ptrmem, member, NULL_TREE);
5156628f 2750}
50ad9642 2751
8d08fdba
MS
2752/* Given an expression PTR for a pointer, return an expression
2753 for the value pointed to.
2754 ERRORSTRING is the name of the operator to appear in error messages.
2755
2756 This function may need to overload OPERATOR_FNNAME.
2757 Must also handle REFERENCE_TYPEs for C++. */
2758
2759tree
dd865ef6 2760build_x_indirect_ref (tree expr, ref_operator errorstring,
5ade1ed2 2761 tsubst_flags_t complain)
8d08fdba 2762{
d17811fd 2763 tree orig_expr = expr;
5566b478
MS
2764 tree rval;
2765
5156628f 2766 if (processing_template_decl)
d17811fd 2767 {
ccafc19b
JM
2768 /* Retain the type if we know the operand is a pointer so that
2769 describable_type doesn't make auto deduction break. */
2770 if (TREE_TYPE (expr) && POINTER_TYPE_P (TREE_TYPE (expr)))
2771 return build_min (INDIRECT_REF, TREE_TYPE (TREE_TYPE (expr)), expr);
d17811fd
MM
2772 if (type_dependent_expression_p (expr))
2773 return build_min_nt (INDIRECT_REF, expr);
2774 expr = build_non_dependent_expr (expr);
2775 }
5566b478 2776
d17811fd 2777 rval = build_new_op (INDIRECT_REF, LOOKUP_NORMAL, expr, NULL_TREE,
5ade1ed2 2778 NULL_TREE, /*overloaded_p=*/NULL, complain);
d17811fd 2779 if (!rval)
5ade1ed2 2780 rval = cp_build_indirect_ref (expr, errorstring, complain);
d17811fd
MM
2781
2782 if (processing_template_decl && rval != error_mark_node)
8e1daa34 2783 return build_min_non_dep (INDIRECT_REF, rval, orig_expr);
d17811fd 2784 else
8d08fdba 2785 return rval;
8d08fdba
MS
2786}
2787
5ade1ed2 2788/* Helper function called from c-common. */
8d08fdba 2789tree
c9f9eb5d 2790build_indirect_ref (location_t loc __attribute__ ((__unused__)),
dd865ef6 2791 tree ptr, ref_operator errorstring)
5ade1ed2
DG
2792{
2793 return cp_build_indirect_ref (ptr, errorstring, tf_warning_or_error);
2794}
2795
2796tree
dd865ef6 2797cp_build_indirect_ref (tree ptr, ref_operator errorstring,
5ade1ed2 2798 tsubst_flags_t complain)
8d08fdba 2799{
926ce8bd 2800 tree pointer, type;
c11b6f21
MS
2801
2802 if (ptr == error_mark_node)
2803 return error_mark_node;
2804
90e734a8
JM
2805 if (ptr == current_class_ptr)
2806 return current_class_ref;
2807
c11b6f21 2808 pointer = (TREE_CODE (TREE_TYPE (ptr)) == REFERENCE_TYPE
0a72704b 2809 ? ptr : decay_conversion (ptr));
c11b6f21 2810 type = TREE_TYPE (pointer);
8d08fdba 2811
db24eb1f 2812 if (POINTER_TYPE_P (type))
8d08fdba 2813 {
01240200 2814 /* [expr.unary.op]
c8094d83 2815
01240200 2816 If the type of the expression is "pointer to T," the type
cd41d410
DS
2817 of the result is "T." */
2818 tree t = TREE_TYPE (type);
01240200 2819
5f9e56b3 2820 if (CONVERT_EXPR_P (ptr)
79bedddc
SR
2821 || TREE_CODE (ptr) == VIEW_CONVERT_EXPR)
2822 {
2823 /* If a warning is issued, mark it to avoid duplicates from
2824 the backend. This only needs to be done at
2825 warn_strict_aliasing > 2. */
2826 if (warn_strict_aliasing > 2)
2827 if (strict_aliasing_warning (TREE_TYPE (TREE_OPERAND (ptr, 0)),
2828 type, TREE_OPERAND (ptr, 0)))
2829 TREE_NO_WARNING (ptr) = 1;
2830 }
2831
b72801e2 2832 if (VOID_TYPE_P (t))
0cbd7506
MS
2833 {
2834 /* A pointer to incomplete type (other than cv void) can be
2835 dereferenced [expr.unary.op]/1 */
5ade1ed2
DG
2836 if (complain & tf_error)
2837 error ("%qT is not a pointer-to-object type", type);
0cbd7506
MS
2838 return error_mark_node;
2839 }
a9183fef 2840 else if (TREE_CODE (pointer) == ADDR_EXPR
688f6688 2841 && same_type_p (t, TREE_TYPE (TREE_OPERAND (pointer, 0))))
01240200
MM
2842 /* The POINTER was something like `&x'. We simplify `*&x' to
2843 `x'. */
8d08fdba
MS
2844 return TREE_OPERAND (pointer, 0);
2845 else
2846 {
01240200 2847 tree ref = build1 (INDIRECT_REF, t, pointer);
8d08fdba 2848
b0d75c1e
BK
2849 /* We *must* set TREE_READONLY when dereferencing a pointer to const,
2850 so that we get the proper error message if the result is used
2851 to assign to. Also, &* is supposed to be a no-op. */
91063b51
MM
2852 TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
2853 TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
8d08fdba 2854 TREE_SIDE_EFFECTS (ref)
271bd540 2855 = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (pointer));
8d08fdba
MS
2856 return ref;
2857 }
2858 }
5ade1ed2
DG
2859 else if (!(complain & tf_error))
2860 /* Don't emit any errors; we'll just return ERROR_MARK_NODE later. */
2861 ;
8d08fdba
MS
2862 /* `pointer' won't be an error_mark_node if we were given a
2863 pointer to member, so it's cool to check for this here. */
a5ac359a 2864 else if (TYPE_PTR_TO_MEMBER_P (type))
dd865ef6
SZ
2865 switch (errorstring)
2866 {
2867 case RO_ARRAY_INDEXING:
2868 error ("invalid use of array indexing on pointer to member");
2869 break;
2870 case RO_UNARY_STAR:
2871 error ("invalid use of unary %<*%> on pointer to member");
2872 break;
2873 case RO_IMPLICIT_CONVERSION:
2874 error ("invalid use of implicit conversion on pointer to member");
2875 break;
2876 default:
2877 gcc_unreachable ();
2878 }
8d08fdba 2879 else if (pointer != error_mark_node)
dd865ef6
SZ
2880 switch (errorstring)
2881 {
2882 case RO_NULL:
2883 error ("invalid type argument");
2884 break;
2885 case RO_ARRAY_INDEXING:
2886 error ("invalid type argument of array indexing");
2887 break;
2888 case RO_UNARY_STAR:
2889 error ("invalid type argument of unary %<*%>");
2890 break;
2891 case RO_IMPLICIT_CONVERSION:
2892 error ("invalid type argument of implicit conversion");
2893 break;
2894 default:
2895 gcc_unreachable ();
2896 }
8d08fdba
MS
2897 return error_mark_node;
2898}
2899
2900/* This handles expressions of the form "a[i]", which denotes
2901 an array reference.
2902
2903 This is logically equivalent in C to *(a+i), but we may do it differently.
2904 If A is a variable or a member, we generate a primitive ARRAY_REF.
2905 This avoids forcing the array out of registers, and can work on
2906 arrays that are not lvalues (for example, members of structures returned
2907 by functions).
2908
2909 If INDEX is of some user-defined type, it must be converted to
2910 integer type. Otherwise, to make a compatible PLUS_EXPR, it
a63068b6
AH
2911 will inherit the type of the array, which will be some pointer type.
2912
2913 LOC is the location to use in building the array reference. */
8d08fdba 2914
8d08fdba 2915tree
3a11c665
JM
2916cp_build_array_ref (location_t loc, tree array, tree idx,
2917 tsubst_flags_t complain)
8d08fdba 2918{
a63068b6
AH
2919 tree ret;
2920
8d08fdba
MS
2921 if (idx == 0)
2922 {
73647d75
JM
2923 if (complain & tf_error)
2924 error_at (loc, "subscript missing in array reference");
8d08fdba
MS
2925 return error_mark_node;
2926 }
2927
2928 if (TREE_TYPE (array) == error_mark_node
2929 || TREE_TYPE (idx) == error_mark_node)
2930 return error_mark_node;
2931
0450d74d
RH
2932 /* If ARRAY is a COMPOUND_EXPR or COND_EXPR, move our reference
2933 inside it. */
2934 switch (TREE_CODE (array))
2935 {
2936 case COMPOUND_EXPR:
2937 {
3a11c665
JM
2938 tree value = cp_build_array_ref (loc, TREE_OPERAND (array, 1), idx,
2939 complain);
a63068b6
AH
2940 ret = build2 (COMPOUND_EXPR, TREE_TYPE (value),
2941 TREE_OPERAND (array, 0), value);
2942 SET_EXPR_LOCATION (ret, loc);
2943 return ret;
0450d74d
RH
2944 }
2945
2946 case COND_EXPR:
a63068b6
AH
2947 ret = build_conditional_expr
2948 (TREE_OPERAND (array, 0),
3a11c665
JM
2949 cp_build_array_ref (loc, TREE_OPERAND (array, 1), idx,
2950 complain),
2951 cp_build_array_ref (loc, TREE_OPERAND (array, 2), idx,
2952 complain),
c2255bc4 2953 tf_warning_or_error);
8aff539b 2954 protected_set_expr_location (ret, loc);
a63068b6 2955 return ret;
0450d74d
RH
2956
2957 default:
2958 break;
2959 }
2960
6de9cd9a 2961 if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE)
8d08fdba 2962 {
e4d35515 2963 tree rval, type;
8d08fdba 2964
ff6b6641 2965 warn_array_subscript_with_type_char (idx);
8d08fdba 2966
adf2edec 2967 if (!INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (idx)))
8d08fdba 2968 {
73647d75
JM
2969 if (complain & tf_error)
2970 error_at (loc, "array subscript is not an integer");
8d08fdba
MS
2971 return error_mark_node;
2972 }
2973
0a72704b
MM
2974 /* Apply integral promotions *after* noticing character types.
2975 (It is unclear why we do these promotions -- the standard
6ccf2f7d 2976 does not say that we should. In fact, the natural thing would
0a72704b
MM
2977 seem to be to convert IDX to ptrdiff_t; we're performing
2978 pointer arithmetic.) */
2979 idx = perform_integral_promotions (idx);
2980
8d08fdba
MS
2981 /* An array that is indexed by a non-constant
2982 cannot be stored in a register; we must be able to do
2983 address arithmetic on its address.
2984 Likewise an array of elements of variable size. */
2985 if (TREE_CODE (idx) != INTEGER_CST
d0f062fb 2986 || (COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (array)))
3c215895
JM
2987 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))))
2988 != INTEGER_CST)))
8d08fdba 2989 {
dffd7eb6 2990 if (!cxx_mark_addressable (array))
8d08fdba
MS
2991 return error_mark_node;
2992 }
0450d74d 2993
8d08fdba
MS
2994 /* An array that is indexed by a constant value which is not within
2995 the array bounds cannot be stored in a register either; because we
2996 would get a crash in store_bit_field/extract_bit_field when trying
2997 to access a non-existent part of the register. */
2998 if (TREE_CODE (idx) == INTEGER_CST
eb34af89
RK
2999 && TYPE_DOMAIN (TREE_TYPE (array))
3000 && ! int_fits_type_p (idx, TYPE_DOMAIN (TREE_TYPE (array))))
8d08fdba 3001 {
dffd7eb6 3002 if (!cxx_mark_addressable (array))
8d08fdba
MS
3003 return error_mark_node;
3004 }
3005
73647d75 3006 if (!lvalue_p (array) && (complain & tf_error))
a63068b6
AH
3007 pedwarn (loc, OPT_pedantic,
3008 "ISO C++ forbids subscripting non-lvalue array");
8d08fdba 3009
b7484fbe
MS
3010 /* Note in C++ it is valid to subscript a `register' array, since
3011 it is valid to take the address of something with that
3012 storage specification. */
3013 if (extra_warnings)
8d08fdba
MS
3014 {
3015 tree foo = array;
3016 while (TREE_CODE (foo) == COMPONENT_REF)
3017 foo = TREE_OPERAND (foo, 0);
73647d75
JM
3018 if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo)
3019 && (complain & tf_warning))
a63068b6
AH
3020 warning_at (loc, OPT_Wextra,
3021 "subscripting array declared %<register%>");
8d08fdba
MS
3022 }
3023
01240200 3024 type = TREE_TYPE (TREE_TYPE (array));
f293ce4b 3025 rval = build4 (ARRAY_REF, type, array, idx, NULL_TREE, NULL_TREE);
8d08fdba
MS
3026 /* Array ref is const/volatile if the array elements are
3027 or if the array is.. */
3028 TREE_READONLY (rval)
91063b51 3029 |= (CP_TYPE_CONST_P (type) | TREE_READONLY (array));
8d08fdba 3030 TREE_SIDE_EFFECTS (rval)
91063b51 3031 |= (CP_TYPE_VOLATILE_P (type) | TREE_SIDE_EFFECTS (array));
8d08fdba 3032 TREE_THIS_VOLATILE (rval)
91063b51 3033 |= (CP_TYPE_VOLATILE_P (type) | TREE_THIS_VOLATILE (array));
a63068b6 3034 ret = require_complete_type (fold_if_not_in_template (rval));
8aff539b 3035 protected_set_expr_location (ret, loc);
a63068b6 3036 return ret;
8d08fdba
MS
3037 }
3038
3039 {
3040 tree ar = default_conversion (array);
3041 tree ind = default_conversion (idx);
3042
3043 /* Put the integer in IND to simplify error checking. */
3044 if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE)
3045 {
3046 tree temp = ar;
3047 ar = ind;
3048 ind = temp;
3049 }
3050
3051 if (ar == error_mark_node)
3052 return ar;
3053
3054 if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE)
3055 {
73647d75
JM
3056 if (complain & tf_error)
3057 error_at (loc, "subscripted value is neither array nor pointer");
8d08fdba
MS
3058 return error_mark_node;
3059 }
3060 if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
3061 {
73647d75
JM
3062 if (complain & tf_error)
3063 error_at (loc, "array subscript is not an integer");
8d08fdba
MS
3064 return error_mark_node;
3065 }
3066
0958b0d3
DM
3067 warn_array_subscript_with_type_char (idx);
3068
ba47d38d
AH
3069 ret = cp_build_indirect_ref (cp_build_binary_op (input_location,
3070 PLUS_EXPR, ar, ind,
73647d75 3071 complain),
dd865ef6 3072 RO_ARRAY_INDEXING,
73647d75 3073 complain);
a63068b6
AH
3074 protected_set_expr_location (ret, loc);
3075 return ret;
8d08fdba
MS
3076 }
3077}
3a11c665
JM
3078
3079/* Entry point for Obj-C++. */
3080
3081tree
3082build_array_ref (location_t loc, tree array, tree idx)
3083{
3084 return cp_build_array_ref (loc, array, idx, tf_warning_or_error);
3085}
8d08fdba 3086\f
8d08fdba 3087/* Resolve a pointer to member function. INSTANCE is the object
c87978aa
JM
3088 instance to use, if the member points to a virtual member.
3089
3090 This used to avoid checking for virtual functions if basetype
3091 has no virtual functions, according to an earlier ANSI draft.
3092 With the final ISO C++ rules, such an optimization is
3093 incorrect: A pointer to a derived member can be static_cast
3094 to pointer-to-base-member, as long as the dynamic object
c6002625 3095 later has the right member. */
8d08fdba
MS
3096
3097tree
5671bf27 3098get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function)
8d08fdba
MS
3099{
3100 if (TREE_CODE (function) == OFFSET_REF)
338d90b8 3101 function = TREE_OPERAND (function, 1);
8d08fdba
MS
3102
3103 if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function)))
3104 {
c87978aa
JM
3105 tree idx, delta, e1, e2, e3, vtbl, basetype;
3106 tree fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function));
f30432d7 3107
b7484fbe 3108 tree instance_ptr = *instance_ptrptr;
1c83ea9f 3109 tree instance_save_expr = 0;
c87978aa 3110 if (instance_ptr == error_mark_node)
32facac8 3111 {
c87978aa
JM
3112 if (TREE_CODE (function) == PTRMEM_CST)
3113 {
3114 /* Extracting the function address from a pmf is only
3115 allowed with -Wno-pmf-conversions. It only works for
c6002625 3116 pmf constants. */
c87978aa
JM
3117 e1 = build_addr_func (PTRMEM_CST_MEMBER (function));
3118 e1 = convert (fntype, e1);
3119 return e1;
3120 }
3121 else
3122 {
a82e1a7d 3123 error ("object missing in use of %qE", function);
c87978aa
JM
3124 return error_mark_node;
3125 }
32facac8
ML
3126 }
3127
b7484fbe 3128 if (TREE_SIDE_EFFECTS (instance_ptr))
1c83ea9f 3129 instance_ptr = instance_save_expr = save_expr (instance_ptr);
b7484fbe 3130
f30432d7
MS
3131 if (TREE_SIDE_EFFECTS (function))
3132 function = save_expr (function);
3133
c87978aa 3134 /* Start by extracting all the information from the PMF itself. */
10b2bcdd 3135 e3 = pfn_from_ptrmemfunc (function);
a298680c 3136 delta = delta_from_ptrmemfunc (function);
85b7def6 3137 idx = build1 (NOP_EXPR, vtable_index_type, e3);
cb7fdde2
AO
3138 switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
3139 {
3140 case ptrmemfunc_vbit_in_pfn:
ba47d38d
AH
3141 e1 = cp_build_binary_op (input_location,
3142 BIT_AND_EXPR, idx, integer_one_node,
5ade1ed2 3143 tf_warning_or_error);
ba47d38d
AH
3144 idx = cp_build_binary_op (input_location,
3145 MINUS_EXPR, idx, integer_one_node,
5ade1ed2 3146 tf_warning_or_error);
cb7fdde2
AO
3147 break;
3148
3149 case ptrmemfunc_vbit_in_delta:
ba47d38d
AH
3150 e1 = cp_build_binary_op (input_location,
3151 BIT_AND_EXPR, delta, integer_one_node,
5ade1ed2 3152 tf_warning_or_error);
ba47d38d
AH
3153 delta = cp_build_binary_op (input_location,
3154 RSHIFT_EXPR, delta, integer_one_node,
5ade1ed2 3155 tf_warning_or_error);
cb7fdde2
AO
3156 break;
3157
3158 default:
315fb5db 3159 gcc_unreachable ();
cb7fdde2 3160 }
03b256e4 3161
81ae598b
MM
3162 /* Convert down to the right base before using the instance. A
3163 special case is that in a pointer to member of class C, C may
3164 be incomplete. In that case, the function will of course be
3165 a member of C, and no conversion is required. In fact,
3166 lookup_base will fail in that case, because incomplete
c8094d83 3167 classes do not have BINFOs. */
c87978aa 3168 basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype));
c8094d83 3169 if (!same_type_ignoring_top_level_qualifiers_p
81ae598b
MM
3170 (basetype, TREE_TYPE (TREE_TYPE (instance_ptr))))
3171 {
3172 basetype = lookup_base (TREE_TYPE (TREE_TYPE (instance_ptr)),
3173 basetype, ba_check, NULL);
c8094d83 3174 instance_ptr = build_base_path (PLUS_EXPR, instance_ptr, basetype,
81ae598b
MM
3175 1);
3176 if (instance_ptr == error_mark_node)
3177 return error_mark_node;
3178 }
c87978aa 3179 /* ...and then the delta in the PMF. */
5be014d5
AP
3180 instance_ptr = build2 (POINTER_PLUS_EXPR, TREE_TYPE (instance_ptr),
3181 instance_ptr, fold_convert (sizetype, delta));
c87978aa
JM
3182
3183 /* Hand back the adjusted 'this' argument to our caller. */
3184 *instance_ptrptr = instance_ptr;
3185
3186 /* Next extract the vtable pointer from the object. */
3187 vtbl = build1 (NOP_EXPR, build_pointer_type (vtbl_ptr_type_node),
3188 instance_ptr);
dd865ef6 3189 vtbl = cp_build_indirect_ref (vtbl, RO_NULL, tf_warning_or_error);
ce1b6498
RG
3190 /* If the object is not dynamic the access invokes undefined
3191 behavior. As it is not executed in this case silence the
3192 spurious warnings it may provoke. */
3193 TREE_NO_WARNING (vtbl) = 1;
85b7def6 3194
c87978aa 3195 /* Finally, extract the function pointer from the vtable. */
db3927fb
AH
3196 e2 = fold_build2_loc (input_location,
3197 POINTER_PLUS_EXPR, TREE_TYPE (vtbl), vtbl,
5be014d5 3198 fold_convert (sizetype, idx));
dd865ef6 3199 e2 = cp_build_indirect_ref (e2, RO_NULL, tf_warning_or_error);
f63ab951 3200 TREE_CONSTANT (e2) = 1;
c7e266a6 3201
67231816
RH
3202 /* When using function descriptors, the address of the
3203 vtable entry is treated as a function pointer. */
3204 if (TARGET_VTABLE_USES_DESCRIPTORS)
3205 e2 = build1 (NOP_EXPR, TREE_TYPE (e2),
5ade1ed2
DG
3206 cp_build_unary_op (ADDR_EXPR, e2, /*noconvert=*/1,
3207 tf_warning_or_error));
67231816 3208
a489b1f0 3209 e2 = fold_convert (TREE_TYPE (e3), e2);
5ade1ed2 3210 e1 = build_conditional_expr (e1, e2, e3, tf_warning_or_error);
c8094d83 3211
03b256e4
ML
3212 /* Make sure this doesn't get evaluated first inside one of the
3213 branches of the COND_EXPR. */
1c83ea9f 3214 if (instance_save_expr)
f293ce4b
RS
3215 e1 = build2 (COMPOUND_EXPR, TREE_TYPE (e1),
3216 instance_save_expr, e1);
03b256e4 3217
f49422da 3218 function = e1;
8d08fdba
MS
3219 }
3220 return function;
3221}
3222
5ade1ed2 3223/* Used by the C-common bits. */
8d08fdba 3224tree
c2255bc4
AH
3225build_function_call (location_t loc ATTRIBUTE_UNUSED,
3226 tree function, tree params)
5ade1ed2
DG
3227{
3228 return cp_build_function_call (function, params, tf_warning_or_error);
3229}
3230
bbbbb16a
ILT
3231/* Used by the C-common bits. */
3232tree
c2255bc4
AH
3233build_function_call_vec (location_t loc ATTRIBUTE_UNUSED,
3234 tree function, VEC(tree,gc) *params,
bbbbb16a
ILT
3235 VEC(tree,gc) *origtypes ATTRIBUTE_UNUSED)
3236{
c166b898
ILT
3237 VEC(tree,gc) *orig_params = params;
3238 tree ret = cp_build_function_call_vec (function, &params,
3239 tf_warning_or_error);
bbbbb16a 3240
c166b898
ILT
3241 /* cp_build_function_call_vec can reallocate PARAMS by adding
3242 default arguments. That should never happen here. Verify
3243 that. */
3244 gcc_assert (params == orig_params);
3245
3246 return ret;
bbbbb16a
ILT
3247}
3248
c166b898
ILT
3249/* Build a function call using a tree list of arguments. */
3250
5ade1ed2
DG
3251tree
3252cp_build_function_call (tree function, tree params, tsubst_flags_t complain)
c166b898
ILT
3253{
3254 VEC(tree,gc) *vec;
3255 tree ret;
3256
3257 vec = make_tree_vector ();
3258 for (; params != NULL_TREE; params = TREE_CHAIN (params))
3259 VEC_safe_push (tree, gc, vec, TREE_VALUE (params));
3260 ret = cp_build_function_call_vec (function, &vec, complain);
3261 release_tree_vector (vec);
3262 return ret;
3263}
3264
450f4293
NF
3265/* Build a function call using varargs. */
3266
3267tree
3268cp_build_function_call_nary (tree function, tsubst_flags_t complain, ...)
3269{
3270 VEC(tree,gc) *vec;
3271 va_list args;
3272 tree ret, t;
3273
3274 vec = make_tree_vector ();
3275 va_start (args, complain);
3276 for (t = va_arg (args, tree); t != NULL_TREE; t = va_arg (args, tree))
3277 VEC_safe_push (tree, gc, vec, t);
3278 va_end (args);
3279 ret = cp_build_function_call_vec (function, &vec, complain);
3280 release_tree_vector (vec);
3281 return ret;
3282}
3283
c166b898
ILT
3284/* Build a function call using a vector of arguments. PARAMS may be
3285 NULL if there are no parameters. This changes the contents of
3286 PARAMS. */
3287
3288tree
3289cp_build_function_call_vec (tree function, VEC(tree,gc) **params,
3290 tsubst_flags_t complain)
8d08fdba 3291{
926ce8bd 3292 tree fntype, fndecl;
8d08fdba 3293 int is_method;
2e4cf9dc 3294 tree original = function;
c166b898 3295 int nargs;
94a0dd7b
SL
3296 tree *argarray;
3297 tree parm_types;
c166b898
ILT
3298 VEC(tree,gc) *allocated = NULL;
3299 tree ret;
8d08fdba 3300
e58a9aa1
ZL
3301 /* For Objective-C, convert any calls via a cast to OBJC_TYPE_REF
3302 expressions, like those used for ObjC messenger dispatches. */
c166b898
ILT
3303 if (params != NULL && !VEC_empty (tree, *params))
3304 function = objc_rewrite_function_call (function,
3305 VEC_index (tree, *params, 0));
e58a9aa1 3306
8d08fdba
MS
3307 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
3308 Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context. */
3309 if (TREE_CODE (function) == NOP_EXPR
3310 && TREE_TYPE (function) == TREE_TYPE (TREE_OPERAND (function, 0)))
3311 function = TREE_OPERAND (function, 0);
3312
3313 if (TREE_CODE (function) == FUNCTION_DECL)
3314 {
72b7eeff 3315 mark_used (function);
8d08fdba
MS
3316 fndecl = function;
3317
3318 /* Convert anything with function type to a pointer-to-function. */
fcf73884 3319 if (DECL_MAIN_P (function) && (complain & tf_error))
509c9d60 3320 pedwarn (input_location, OPT_pedantic,
fcf73884 3321 "ISO C++ forbids calling %<::main%> from within program");
8d08fdba 3322
4847609e 3323 function = build_addr_func (function);
8d08fdba
MS
3324 }
3325 else
3326 {
3327 fndecl = NULL_TREE;
3328
4ac14744 3329 function = build_addr_func (function);
8d08fdba
MS
3330 }
3331
4ac14744
MS
3332 if (function == error_mark_node)
3333 return error_mark_node;
3334
8d08fdba
MS
3335 fntype = TREE_TYPE (function);
3336
3337 if (TYPE_PTRMEMFUNC_P (fntype))
3338 {
5ade1ed2
DG
3339 if (complain & tf_error)
3340 error ("must use %<.*%> or %<->*%> to call pointer-to-member "
7b98a725
JW
3341 "function in %<%E (...)%>, e.g. %<(... ->* %E) (...)%>",
3342 original, original);
4ac14744 3343 return error_mark_node;
8d08fdba
MS
3344 }
3345
3346 is_method = (TREE_CODE (fntype) == POINTER_TYPE
3347 && TREE_CODE (TREE_TYPE (fntype)) == METHOD_TYPE);
3348
3349 if (!((TREE_CODE (fntype) == POINTER_TYPE
3350 && TREE_CODE (TREE_TYPE (fntype)) == FUNCTION_TYPE)
386b8a85
JM
3351 || is_method
3352 || TREE_CODE (function) == TEMPLATE_ID_EXPR))
8d08fdba 3353 {
5ade1ed2
DG
3354 if (complain & tf_error)
3355 error ("%qE cannot be used as a function", original);
8d08fdba
MS
3356 return error_mark_node;
3357 }
3358
3359 /* fntype now gets the type of function pointed to. */
3360 fntype = TREE_TYPE (fntype);
94a0dd7b
SL
3361 parm_types = TYPE_ARG_TYPES (fntype);
3362
c166b898
ILT
3363 if (params == NULL)
3364 {
3365 allocated = make_tree_vector ();
3366 params = &allocated;
3367 }
3368
3369 nargs = convert_arguments (parm_types, params, fndecl, LOOKUP_NORMAL,
3370 complain);
94a0dd7b 3371 if (nargs < 0)
125e6594 3372 return error_mark_node;
863adfc0 3373
c166b898
ILT
3374 argarray = VEC_address (tree, *params);
3375
dd66b8e8
JM
3376 /* Check for errors in format strings and inappropriately
3377 null parameters. */
94a0dd7b
SL
3378 check_function_arguments (TYPE_ATTRIBUTES (fntype), nargs, argarray,
3379 parm_types);
8d08fdba 3380
c166b898
ILT
3381 ret = build_cxx_call (function, nargs, argarray);
3382
3383 if (allocated != NULL)
3384 release_tree_vector (allocated);
3385
3386 return ret;
8d08fdba 3387}
8d08fdba 3388\f
8cdea6ab
SZ
3389/* Subroutine of convert_arguments.
3390 Warn about wrong number of args are genereted. */
3391
3392static void
3393warn_args_num (location_t loc, tree fndecl, bool too_many_p)
3394{
3395 if (fndecl)
3396 {
3397 if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
3398 {
3399 if (DECL_NAME (fndecl) == NULL_TREE
3400 || IDENTIFIER_HAS_TYPE_VALUE (DECL_NAME (fndecl)))
3401 error_at (loc,
3402 too_many_p
3403 ? G_("too many arguments to constructor %q#D")
3404 : G_("too few arguments to constructor %q#D"),
3405 fndecl);
3406 else
3407 error_at (loc,
3408 too_many_p
3409 ? G_("too many arguments to member function %q#D")
3410 : G_("too few arguments to member function %q#D"),
3411 fndecl);
3412 }
3413 else
3414 error_at (loc,
3415 too_many_p
3416 ? G_("too many arguments to function %q#D")
3417 : G_("too few arguments to function %q#D"),
3418 fndecl);
3419 inform (DECL_SOURCE_LOCATION (fndecl),
3420 "declared here");
3421 }
3422 else
3423 error_at (loc, too_many_p ? G_("too many arguments to function")
3424 : G_("too few arguments to function"));
3425}
3426
c166b898
ILT
3427/* Convert the actual parameter expressions in the list VALUES to the
3428 types in the list TYPELIST. The converted expressions are stored
3429 back in the VALUES vector.
8d08fdba
MS
3430 If parmdecls is exhausted, or when an element has NULL as its type,
3431 perform the default conversions.
3432
8d08fdba
MS
3433 NAME is an IDENTIFIER_NODE or 0. It is used only for error messages.
3434
3435 This is also where warnings about wrong number of args are generated.
c8094d83 3436
94a0dd7b 3437 Returns the actual number of arguments processed (which might be less
c166b898 3438 than the length of the vector), or -1 on error.
8d08fdba
MS
3439
3440 In C++, unspecified trailing parameters can be filled in with their
3441 default arguments, if such were specified. Do so here. */
3442
94a0dd7b 3443static int
c166b898
ILT
3444convert_arguments (tree typelist, VEC(tree,gc) **values, tree fndecl,
3445 int flags, tsubst_flags_t complain)
8d08fdba 3446{
c166b898 3447 tree typetail;
c166b898 3448 unsigned int i;
8d08fdba 3449
faf5394a
MS
3450 /* Argument passing is always copy-initialization. */
3451 flags |= LOOKUP_ONLYCONVERTING;
3452
c166b898
ILT
3453 for (i = 0, typetail = typelist;
3454 i < VEC_length (tree, *values);
3455 i++)
8d08fdba 3456 {
926ce8bd 3457 tree type = typetail ? TREE_VALUE (typetail) : 0;
c166b898 3458 tree val = VEC_index (tree, *values, i);
8d08fdba 3459
6af455d7 3460 if (val == error_mark_node || type == error_mark_node)
94a0dd7b 3461 return -1;
8ccc31eb 3462
8d08fdba
MS
3463 if (type == void_type_node)
3464 {
5ade1ed2
DG
3465 if (complain & tf_error)
3466 {
8cdea6ab 3467 warn_args_num (input_location, fndecl, /*too_many_p=*/true);
5ade1ed2
DG
3468 return i;
3469 }
3470 else
3471 return -1;
8d08fdba
MS
3472 }
3473
8d08fdba
MS
3474 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
3475 Strip such NOP_EXPRs, since VAL is used in non-lvalue context. */
3476 if (TREE_CODE (val) == NOP_EXPR
a0a33927
MS
3477 && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))
3478 && (type == 0 || TREE_CODE (type) != REFERENCE_TYPE))
8d08fdba
MS
3479 val = TREE_OPERAND (val, 0);
3480
00595019
MS
3481 if (type == 0 || TREE_CODE (type) != REFERENCE_TYPE)
3482 {
3483 if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE
8d08fdba 3484 || TREE_CODE (TREE_TYPE (val)) == FUNCTION_TYPE
00595019 3485 || TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE)
0a72704b 3486 val = decay_conversion (val);
00595019 3487 }
8d08fdba
MS
3488
3489 if (val == error_mark_node)
94a0dd7b 3490 return -1;
8d08fdba 3491
8d08fdba
MS
3492 if (type != 0)
3493 {
3494 /* Formal parm type is specified by a function prototype. */
3495 tree parmval;
3496
d0f062fb 3497 if (!COMPLETE_TYPE_P (complete_type (type)))
8d08fdba 3498 {
5ade1ed2
DG
3499 if (complain & tf_error)
3500 {
3501 if (fndecl)
3502 error ("parameter %P of %qD has incomplete type %qT",
3503 i, fndecl, type);
3504 else
3505 error ("parameter %P has incomplete type %qT", i, type);
3506 }
3afd2e20 3507 parmval = error_mark_node;
8d08fdba
MS
3508 }
3509 else
3510 {
9a3b49ac 3511 parmval = convert_for_initialization
56ae6d77 3512 (NULL_TREE, type, val, flags,
2f5b91f5 3513 ICR_ARGPASS, fndecl, i, complain);
8e51619a 3514 parmval = convert_for_arg_passing (type, parmval);
8d08fdba 3515 }
878cd289
MS
3516
3517 if (parmval == error_mark_node)
94a0dd7b 3518 return -1;
878cd289 3519
c166b898 3520 VEC_replace (tree, *values, i, parmval);
8d08fdba
MS
3521 }
3522 else
3523 {
d1188d91 3524 if (fndecl && DECL_BUILT_IN (fndecl)
4eaf1d5b
AH
3525 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P)
3526 /* Don't do ellipsis conversion for __built_in_constant_p
c32097d8 3527 as this will result in spurious errors for non-trivial
4eaf1d5b
AH
3528 types. */
3529 val = require_complete_type (val);
3530 else
3531 val = convert_arg_to_ellipsis (val);
3532
c166b898 3533 VEC_replace (tree, *values, i, val);
8d08fdba
MS
3534 }
3535
8d08fdba
MS
3536 if (typetail)
3537 typetail = TREE_CHAIN (typetail);
3538 }
3539
3540 if (typetail != 0 && typetail != void_list_node)
3541 {
823c22f9
NS
3542 /* See if there are default arguments that can be used. Because
3543 we hold default arguments in the FUNCTION_TYPE (which is so
3544 wrong), we can see default parameters here from deduced
3545 contexts (and via typeof) for indirect function calls.
3546 Fortunately we know whether we have a function decl to
3547 provide default arguments in a language conformant
3548 manner. */
3549 if (fndecl && TREE_PURPOSE (typetail)
a723baf1 3550 && TREE_CODE (TREE_PURPOSE (typetail)) != DEFAULT_ARG)
8d08fdba 3551 {
f376e137 3552 for (; typetail != void_list_node; ++i)
8d08fdba 3553 {
c8094d83
MS
3554 tree parmval
3555 = convert_default_arg (TREE_VALUE (typetail),
3556 TREE_PURPOSE (typetail),
c3f08228 3557 fndecl, i);
8d08fdba 3558
878cd289 3559 if (parmval == error_mark_node)
94a0dd7b 3560 return -1;
878cd289 3561
c166b898 3562 VEC_safe_push (tree, gc, *values, parmval);
8d08fdba
MS
3563 typetail = TREE_CHAIN (typetail);
3564 /* ends with `...'. */
3565 if (typetail == NULL_TREE)
3566 break;
3567 }
3568 }
3569 else
3570 {
5ade1ed2 3571 if (complain & tf_error)
8cdea6ab 3572 warn_args_num (input_location, fndecl, /*too_many_p=*/false);
94a0dd7b 3573 return -1;
8d08fdba
MS
3574 }
3575 }
8d08fdba 3576
c166b898 3577 return (int) i;
8d08fdba
MS
3578}
3579\f
3580/* Build a binary-operation expression, after performing default
2a67bec2
ILT
3581 conversions on the operands. CODE is the kind of expression to
3582 build. ARG1 and ARG2 are the arguments. ARG1_CODE and ARG2_CODE
3583 are the tree codes which correspond to ARG1 and ARG2 when issuing
3584 warnings about possibly misplaced parentheses. They may differ
3585 from the TREE_CODE of ARG1 and ARG2 if the parser has done constant
3586 folding (e.g., if the parser sees "a | 1 + 1", it may call this
3587 routine with ARG2 being an INTEGER_CST and ARG2_CODE == PLUS_EXPR).
3588 To avoid issuing any parentheses warnings, pass ARG1_CODE and/or
3589 ARG2_CODE as ERROR_MARK. */
8d08fdba
MS
3590
3591tree
2a67bec2 3592build_x_binary_op (enum tree_code code, tree arg1, enum tree_code arg1_code,
5ade1ed2
DG
3593 tree arg2, enum tree_code arg2_code, bool *overloaded_p,
3594 tsubst_flags_t complain)
8d08fdba 3595{
d17811fd
MM
3596 tree orig_arg1;
3597 tree orig_arg2;
3598 tree expr;
5566b478 3599
d17811fd
MM
3600 orig_arg1 = arg1;
3601 orig_arg2 = arg2;
d6b4ea85 3602
d17811fd 3603 if (processing_template_decl)
14d22dd6 3604 {
d17811fd
MM
3605 if (type_dependent_expression_p (arg1)
3606 || type_dependent_expression_p (arg2))
3607 return build_min_nt (code, arg1, arg2);
3608 arg1 = build_non_dependent_expr (arg1);
3609 arg2 = build_non_dependent_expr (arg2);
3610 }
14d22dd6 3611
d17811fd
MM
3612 if (code == DOTSTAR_EXPR)
3613 expr = build_m_component_ref (arg1, arg2);
3614 else
c8094d83 3615 expr = build_new_op (code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE,
5ade1ed2 3616 overloaded_p, complain);
14d22dd6 3617
2a67bec2
ILT
3618 /* Check for cases such as x+y<<z which users are likely to
3619 misinterpret. But don't warn about obj << x + y, since that is a
3620 common idiom for I/O. */
3621 if (warn_parentheses
aa9b7569 3622 && (complain & tf_warning)
2a67bec2
ILT
3623 && !processing_template_decl
3624 && !error_operand_p (arg1)
3625 && !error_operand_p (arg2)
3626 && (code != LSHIFT_EXPR
3627 || !CLASS_TYPE_P (TREE_TYPE (arg1))))
100d537d 3628 warn_about_parentheses (code, arg1_code, orig_arg1, arg2_code, orig_arg2);
2a67bec2 3629
d17811fd 3630 if (processing_template_decl && expr != error_mark_node)
8e1daa34 3631 return build_min_non_dep (code, expr, orig_arg1, orig_arg2);
c8094d83 3632
d17811fd 3633 return expr;
14d22dd6
MM
3634}
3635
493e377c
PC
3636/* Build and return an ARRAY_REF expression. */
3637
3638tree
3639build_x_array_ref (tree arg1, tree arg2, tsubst_flags_t complain)
3640{
3641 tree orig_arg1 = arg1;
3642 tree orig_arg2 = arg2;
3643 tree expr;
3644
3645 if (processing_template_decl)
3646 {
3647 if (type_dependent_expression_p (arg1)
3648 || type_dependent_expression_p (arg2))
3649 return build_min_nt (ARRAY_REF, arg1, arg2,
3650 NULL_TREE, NULL_TREE);
3651 arg1 = build_non_dependent_expr (arg1);
3652 arg2 = build_non_dependent_expr (arg2);
3653 }
3654
3655 expr = build_new_op (ARRAY_REF, LOOKUP_NORMAL, arg1, arg2, NULL_TREE,
3656 /*overloaded_p=*/NULL, complain);
3657
3658 if (processing_template_decl && expr != error_mark_node)
3659 return build_min_non_dep (ARRAY_REF, expr, orig_arg1, orig_arg2,
3660 NULL_TREE, NULL_TREE);
3661 return expr;
3662}
3663
5ade1ed2
DG
3664/* For the c-common bits. */
3665tree
ba47d38d 3666build_binary_op (location_t location, enum tree_code code, tree op0, tree op1,
5ade1ed2
DG
3667 int convert_p ATTRIBUTE_UNUSED)
3668{
ba47d38d 3669 return cp_build_binary_op (location, code, op0, op1, tf_warning_or_error);
5ade1ed2
DG
3670}
3671
3672
8d08fdba
MS
3673/* Build a binary-operation expression without default conversions.
3674 CODE is the kind of expression to build.
ba47d38d 3675 LOCATION is the location_t of the operator in the source code.
8d08fdba
MS
3676 This function differs from `build' in several ways:
3677 the data type of the result is computed and recorded in it,
3678 warnings are generated if arg data types are invalid,
3679 special handling for addition and subtraction of pointers is known,
3680 and some optimization is done (operations on narrow ints
3681 are done in the narrower type when that gives the same result).
3682 Constant folding is also done before the result is returned.
3683
8d08fdba
MS
3684 Note that the operands will never have enumeral types
3685 because either they have just had the default conversions performed
3686 or they have both just been converted to some other type in which
3687 the arithmetic is to be done.
3688
3689 C++: must do special pointer arithmetic when implementing
3690 multiple inheritance, and deal with pointer to member functions. */
3691
3692tree
ba47d38d
AH
3693cp_build_binary_op (location_t location,
3694 enum tree_code code, tree orig_op0, tree orig_op1,
5ade1ed2 3695 tsubst_flags_t complain)
8d08fdba 3696{
39211cd5 3697 tree op0, op1;
926ce8bd 3698 enum tree_code code0, code1;
39211cd5 3699 tree type0, type1;
4de67c26 3700 const char *invalid_op_diag;
8d08fdba
MS
3701
3702 /* Expression code to give to the expression when it is built.
3703 Normally this is CODE, which is what the caller asked for,
3704 but in some special cases we change it. */
926ce8bd 3705 enum tree_code resultcode = code;
8d08fdba
MS
3706
3707 /* Data type in which the computation is to be performed.
3708 In the simplest cases this is the common type of the arguments. */
926ce8bd 3709 tree result_type = NULL;
8d08fdba
MS
3710
3711 /* Nonzero means operands have already been type-converted
3712 in whatever way is necessary.
3713 Zero means they need to be converted to RESULT_TYPE. */
3714 int converted = 0;
3715
28cbf42c
MS
3716 /* Nonzero means create the expression with this type, rather than
3717 RESULT_TYPE. */
3718 tree build_type = 0;
3719
8d08fdba 3720 /* Nonzero means after finally constructing the expression
faae18ab 3721 convert it to this type. */
8d08fdba
MS
3722 tree final_type = 0;
3723
455f19cb
MM
3724 tree result;
3725
8d08fdba
MS
3726 /* Nonzero if this is an operation like MIN or MAX which can
3727 safely be computed in short if both args are promoted shorts.
3728 Also implies COMMON.
3729 -1 indicates a bitwise operation; this makes a difference
3730 in the exact conditions for when it is safe to do the operation
3731 in a narrower mode. */
3732 int shorten = 0;
3733
3734 /* Nonzero if this is a comparison operation;
3735 if both args are promoted shorts, compare the original shorts.
3736 Also implies COMMON. */
3737 int short_compare = 0;
3738
8d08fdba
MS
3739 /* Nonzero means set RESULT_TYPE to the common type of the args. */
3740 int common = 0;
3741
455f19cb
MM
3742 /* True if both operands have arithmetic type. */
3743 bool arithmetic_types_p;
3744
39211cd5 3745 /* Apply default conversions. */
40260429
NS
3746 op0 = orig_op0;
3747 op1 = orig_op1;
c8094d83 3748
a9aedbc2
MS
3749 if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
3750 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
3751 || code == TRUTH_XOR_EXPR)
3752 {
40260429
NS
3753 if (!really_overloaded_fn (op0))
3754 op0 = decay_conversion (op0);
3755 if (!really_overloaded_fn (op1))
3756 op1 = decay_conversion (op1);
a9aedbc2
MS
3757 }
3758 else
3759 {
40260429
NS
3760 if (!really_overloaded_fn (op0))
3761 op0 = default_conversion (op0);
3762 if (!really_overloaded_fn (op1))
3763 op1 = default_conversion (op1);
a9aedbc2 3764 }
39211cd5 3765
a359be75
JM
3766 /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue. */
3767 STRIP_TYPE_NOPS (op0);
3768 STRIP_TYPE_NOPS (op1);
3769
3770 /* DTRT if one side is an overloaded function, but complain about it. */
3771 if (type_unknown_p (op0))
3772 {
c2ea3a40 3773 tree t = instantiate_type (TREE_TYPE (op1), op0, tf_none);
a359be75
JM
3774 if (t != error_mark_node)
3775 {
5ade1ed2 3776 if (complain & tf_error)
cbe5f3b3 3777 permerror (input_location, "assuming cast to type %qT from overloaded function",
37ec60ed 3778 TREE_TYPE (t));
a359be75
JM
3779 op0 = t;
3780 }
3781 }
3782 if (type_unknown_p (op1))
3783 {
c2ea3a40 3784 tree t = instantiate_type (TREE_TYPE (op0), op1, tf_none);
a359be75
JM
3785 if (t != error_mark_node)
3786 {
5ade1ed2 3787 if (complain & tf_error)
cbe5f3b3 3788 permerror (input_location, "assuming cast to type %qT from overloaded function",
37ec60ed 3789 TREE_TYPE (t));
a359be75
JM
3790 op1 = t;
3791 }
3792 }
3793
39211cd5
MS
3794 type0 = TREE_TYPE (op0);
3795 type1 = TREE_TYPE (op1);
3796
3797 /* The expression codes of the data types of the arguments tell us
3798 whether the arguments are integers, floating, pointers, etc. */
3799 code0 = TREE_CODE (type0);
3800 code1 = TREE_CODE (type1);
3801
8d08fdba
MS
3802 /* If an error was already reported for one of the arguments,
3803 avoid reporting another error. */
8d08fdba
MS
3804 if (code0 == ERROR_MARK || code1 == ERROR_MARK)
3805 return error_mark_node;
3806
4de67c26
JM
3807 if ((invalid_op_diag
3808 = targetm.invalid_binary_op (code, type0, type1)))
3809 {
3810 error (invalid_op_diag);
3811 return error_mark_node;
3812 }
3813
ef3ddd4f
MM
3814 /* Issue warnings about peculiar, but valid, uses of NULL. */
3815 if ((orig_op0 == null_node || orig_op1 == null_node)
3816 /* It's reasonable to use pointer values as operands of &&
3817 and ||, so NULL is no exception. */
3818 && code != TRUTH_ANDIF_EXPR && code != TRUTH_ORIF_EXPR
3819 && ( /* Both are NULL (or 0) and the operation was not a
3820 comparison or a pointer subtraction. */
3821 (null_ptr_cst_p (orig_op0) && null_ptr_cst_p (orig_op1)
3822 && code != EQ_EXPR && code != NE_EXPR && code != MINUS_EXPR)
3823 /* Or if one of OP0 or OP1 is neither a pointer nor NULL. */
3824 || (!null_ptr_cst_p (orig_op0)
3825 && !TYPE_PTR_P (type0) && !TYPE_PTR_TO_MEMBER_P (type0))
3826 || (!null_ptr_cst_p (orig_op1)
3827 && !TYPE_PTR_P (type1) && !TYPE_PTR_TO_MEMBER_P (type1)))
3828 && (complain & tf_warning))
3829 /* Some sort of arithmetic operation involving NULL was
3830 performed. */
3831 warning (OPT_Wpointer_arith, "NULL used in arithmetic");
3832
8d08fdba
MS
3833 switch (code)
3834 {
8d08fdba
MS
3835 case MINUS_EXPR:
3836 /* Subtraction of two similar pointers.
3837 We must subtract them as integers, then divide by object size. */
3838 if (code0 == POINTER_TYPE && code1 == POINTER_TYPE
a5ac359a
MM
3839 && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type0),
3840 TREE_TYPE (type1)))
98f2f3a2 3841 return pointer_diff (op0, op1, common_pointer_type (type0, type1));
0225a19d 3842 /* In all other cases except pointer - int, the usual arithmetic
39a13be5 3843 rules apply. */
0225a19d
MM
3844 else if (!(code0 == POINTER_TYPE && code1 == INTEGER_TYPE))
3845 {
3846 common = 1;
3847 break;
3848 }
3849 /* The pointer - int case is just like pointer + int; fall
3850 through. */
3851 case PLUS_EXPR:
3852 if ((code0 == POINTER_TYPE || code1 == POINTER_TYPE)
3853 && (code0 == INTEGER_TYPE || code1 == INTEGER_TYPE))
3854 {
3855 tree ptr_operand;
3856 tree int_operand;
3857 ptr_operand = ((code0 == POINTER_TYPE) ? op0 : op1);
3858 int_operand = ((code0 == INTEGER_TYPE) ? op0 : op1);
3859 if (processing_template_decl)
3860 {
3861 result_type = TREE_TYPE (ptr_operand);
3862 break;
3863 }
3864 return cp_pointer_int_sum (code,
3865 ptr_operand,
3866 int_operand);
3867 }
3868 common = 1;
8d08fdba
MS
3869 break;
3870
3871 case MULT_EXPR:
3872 common = 1;
3873 break;
3874
3875 case TRUNC_DIV_EXPR:
3876 case CEIL_DIV_EXPR:
3877 case FLOOR_DIV_EXPR:
3878 case ROUND_DIV_EXPR:
3879 case EXACT_DIV_EXPR:
37c46b43 3880 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
3a021db2 3881 || code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
37c46b43 3882 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
3a021db2 3883 || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
8d08fdba 3884 {
01c15146
VR
3885 enum tree_code tcode0 = code0, tcode1 = code1;
3886
c9f9eb5d 3887 warn_for_div_by_zero (location, op1);
c8094d83 3888
01c15146
VR
3889 if (tcode0 == COMPLEX_TYPE || tcode0 == VECTOR_TYPE)
3890 tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
3891 if (tcode1 == COMPLEX_TYPE || tcode1 == VECTOR_TYPE)
3892 tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
3a021db2 3893
01c15146 3894 if (!(tcode0 == INTEGER_TYPE && tcode1 == INTEGER_TYPE))
8d08fdba
MS
3895 resultcode = RDIV_EXPR;
3896 else
3897 /* When dividing two signed integers, we have to promote to int.
ddd5a7c1 3898 unless we divide by a constant != -1. Note that default
8d08fdba
MS
3899 conversion will have been performed on the operands at this
3900 point, so we have to dig out the original type to find out if
3901 it was unsigned. */
3902 shorten = ((TREE_CODE (op0) == NOP_EXPR
8df83eae 3903 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
8d08fdba 3904 || (TREE_CODE (op1) == INTEGER_CST
05bccae2
RK
3905 && ! integer_all_onesp (op1)));
3906
8d08fdba
MS
3907 common = 1;
3908 }
3909 break;
3910
3911 case BIT_AND_EXPR:
8d08fdba
MS
3912 case BIT_IOR_EXPR:
3913 case BIT_XOR_EXPR:
73042643 3914 if ((code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
9ef0c8d9
AP
3915 || (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
3916 && !VECTOR_FLOAT_TYPE_P (type0)
3917 && !VECTOR_FLOAT_TYPE_P (type1)))
8d08fdba 3918 shorten = -1;
8d08fdba
MS
3919 break;
3920
3921 case TRUNC_MOD_EXPR:
3922 case FLOOR_MOD_EXPR:
c9f9eb5d 3923 warn_for_div_by_zero (location, op1);
c8094d83 3924
5cfd5d9b
AP
3925 if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
3926 && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
3927 && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE)
3928 common = 1;
3929 else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
8d08fdba
MS
3930 {
3931 /* Although it would be tempting to shorten always here, that loses
3932 on some targets, since the modulo instruction is undefined if the
3933 quotient can't be represented in the computation mode. We shorten
3934 only if unsigned or if dividing by something we know != -1. */
3935 shorten = ((TREE_CODE (op0) == NOP_EXPR
8df83eae 3936 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
8d08fdba 3937 || (TREE_CODE (op1) == INTEGER_CST
05bccae2 3938 && ! integer_all_onesp (op1)));
8d08fdba
MS
3939 common = 1;
3940 }
3941 break;
3942
3943 case TRUTH_ANDIF_EXPR:
3944 case TRUTH_ORIF_EXPR:
3945 case TRUTH_AND_EXPR:
3946 case TRUTH_OR_EXPR:
255512c1 3947 result_type = boolean_type_node;
8d08fdba
MS
3948 break;
3949
3950 /* Shift operations: result has same type as first operand;
3951 always convert second operand to int.
3952 Also set SHORT_SHIFT if shifting rightward. */
3953
3954 case RSHIFT_EXPR:
3955 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3956 {
3957 result_type = type0;
3958 if (TREE_CODE (op1) == INTEGER_CST)
3959 {
3960 if (tree_int_cst_lt (op1, integer_zero_node))
5ade1ed2 3961 {
7d882b83
ILT
3962 if ((complain & tf_warning)
3963 && c_inhibit_evaluation_warnings == 0)
5ade1ed2
DG
3964 warning (0, "right shift count is negative");
3965 }
8d08fdba
MS
3966 else
3967 {
5ade1ed2 3968 if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0
7d882b83
ILT
3969 && (complain & tf_warning)
3970 && c_inhibit_evaluation_warnings == 0)
d4ee4d25 3971 warning (0, "right shift count >= width of type");
8d08fdba
MS
3972 }
3973 }
3974 /* Convert the shift-count to an integer, regardless of
3975 size of value being shifted. */
3976 if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
37c46b43 3977 op1 = cp_convert (integer_type_node, op1);
8d08fdba
MS
3978 /* Avoid converting op1 to result_type later. */
3979 converted = 1;
3980 }
3981 break;
3982
3983 case LSHIFT_EXPR:
3984 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3985 {
3986 result_type = type0;
3987 if (TREE_CODE (op1) == INTEGER_CST)
3988 {
3989 if (tree_int_cst_lt (op1, integer_zero_node))
5ade1ed2 3990 {
7d882b83
ILT
3991 if ((complain & tf_warning)
3992 && c_inhibit_evaluation_warnings == 0)
5ade1ed2
DG
3993 warning (0, "left shift count is negative");
3994 }
665f2503 3995 else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
5ade1ed2 3996 {
7d882b83
ILT
3997 if ((complain & tf_warning)
3998 && c_inhibit_evaluation_warnings == 0)
5ade1ed2
DG
3999 warning (0, "left shift count >= width of type");
4000 }
8d08fdba
MS
4001 }
4002 /* Convert the shift-count to an integer, regardless of
4003 size of value being shifted. */
4004 if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
37c46b43 4005 op1 = cp_convert (integer_type_node, op1);
8d08fdba
MS
4006 /* Avoid converting op1 to result_type later. */
4007 converted = 1;
4008 }
4009 break;
4010
4011 case RROTATE_EXPR:
4012 case LROTATE_EXPR:
4013 if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
4014 {
4015 result_type = type0;
4016 if (TREE_CODE (op1) == INTEGER_CST)
4017 {
4018 if (tree_int_cst_lt (op1, integer_zero_node))
5ade1ed2
DG
4019 {
4020 if (complain & tf_warning)
4021 warning (0, (code == LROTATE_EXPR)
4022 ? G_("left rotate count is negative")
4023 : G_("right rotate count is negative"));
4024 }
665f2503 4025 else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
5ade1ed2
DG
4026 {
4027 if (complain & tf_warning)
4028 warning (0, (code == LROTATE_EXPR)
4029 ? G_("left rotate count >= width of type")
4030 : G_("right rotate count >= width of type"));
4031 }
8d08fdba
MS
4032 }
4033 /* Convert the shift-count to an integer, regardless of
4034 size of value being shifted. */
4035 if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
37c46b43 4036 op1 = cp_convert (integer_type_node, op1);
8d08fdba
MS
4037 }
4038 break;
4039
4040 case EQ_EXPR:
4041 case NE_EXPR:
5ade1ed2
DG
4042 if ((complain & tf_warning)
4043 && (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1)))
3db45ab5
MS
4044 warning (OPT_Wfloat_equal,
4045 "comparing floating point with == or != is unsafe");
5ade1ed2
DG
4046 if ((complain & tf_warning)
4047 && ((TREE_CODE (orig_op0) == STRING_CST && !integer_zerop (op1))
4048 || (TREE_CODE (orig_op1) == STRING_CST && !integer_zerop (op0))))
c116cd05 4049 warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
1bdba2c0 4050
c8094d83 4051 build_type = boolean_type_node;
37c46b43 4052 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
550a799d 4053 || code0 == COMPLEX_TYPE || code0 == ENUMERAL_TYPE)
37c46b43 4054 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
550a799d 4055 || code1 == COMPLEX_TYPE || code1 == ENUMERAL_TYPE))
8d08fdba 4056 short_compare = 1;
a5ac359a
MM
4057 else if ((code0 == POINTER_TYPE && code1 == POINTER_TYPE)
4058 || (TYPE_PTRMEM_P (type0) && TYPE_PTRMEM_P (type1)))
708cae97 4059 result_type = composite_pointer_type (type0, type1, op0, op1,
c86818cf 4060 CPO_COMPARISON, complain);
a5ac359a
MM
4061 else if ((code0 == POINTER_TYPE || TYPE_PTRMEM_P (type0))
4062 && null_ptr_cst_p (op1))
b3c6d2ea
ILT
4063 {
4064 if (TREE_CODE (op0) == ADDR_EXPR
4065 && decl_with_nonnull_addr_p (TREE_OPERAND (op0, 0)))
5ade1ed2
DG
4066 {
4067 if (complain & tf_warning)
4068 warning (OPT_Waddress, "the address of %qD will never be NULL",
4069 TREE_OPERAND (op0, 0));
4070 }
b3c6d2ea
ILT
4071 result_type = type0;
4072 }
a5ac359a
MM
4073 else if ((code1 == POINTER_TYPE || TYPE_PTRMEM_P (type1))
4074 && null_ptr_cst_p (op0))
b3c6d2ea
ILT
4075 {
4076 if (TREE_CODE (op1) == ADDR_EXPR
4077 && decl_with_nonnull_addr_p (TREE_OPERAND (op1, 0)))
5ade1ed2
DG
4078 {
4079 if (complain & tf_warning)
4080 warning (OPT_Waddress, "the address of %qD will never be NULL",
4081 TREE_OPERAND (op1, 0));
4082 }
b3c6d2ea
ILT
4083 result_type = type1;
4084 }
14c2101d
JM
4085 else if (null_ptr_cst_p (op0) && null_ptr_cst_p (op1))
4086 /* One of the operands must be of nullptr_t type. */
4087 result_type = TREE_TYPE (nullptr_node);
8d08fdba
MS
4088 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
4089 {
faae18ab 4090 result_type = type0;
5ade1ed2 4091 if (complain & tf_error)
cbe5f3b3 4092 permerror (input_location, "ISO C++ forbids comparison between pointer and integer");
5ade1ed2
DG
4093 else
4094 return error_mark_node;
8d08fdba
MS
4095 }
4096 else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
4097 {
faae18ab 4098 result_type = type1;
5ade1ed2 4099 if (complain & tf_error)
cbe5f3b3 4100 permerror (input_location, "ISO C++ forbids comparison between pointer and integer");
5ade1ed2
DG
4101 else
4102 return error_mark_node;
8d08fdba 4103 }
a7a64a77 4104 else if (TYPE_PTRMEMFUNC_P (type0) && null_ptr_cst_p (op1))
8d08fdba 4105 {
c3a88be8
RM
4106 if (TARGET_PTRMEMFUNC_VBIT_LOCATION
4107 == ptrmemfunc_vbit_in_delta)
4108 {
4109 tree pfn0 = pfn_from_ptrmemfunc (op0);
a298680c 4110 tree delta0 = delta_from_ptrmemfunc (op0);
ba47d38d
AH
4111 tree e1 = cp_build_binary_op (location,
4112 EQ_EXPR,
c3a88be8
RM
4113 pfn0,
4114 fold_convert (TREE_TYPE (pfn0),
5ade1ed2
DG
4115 integer_zero_node),
4116 complain);
ba47d38d
AH
4117 tree e2 = cp_build_binary_op (location,
4118 BIT_AND_EXPR,
c3a88be8 4119 delta0,
5ade1ed2
DG
4120 integer_one_node,
4121 complain);
ba47d38d
AH
4122 e2 = cp_build_binary_op (location,
4123 EQ_EXPR, e2, integer_zero_node,
5ade1ed2 4124 complain);
ba47d38d
AH
4125 op0 = cp_build_binary_op (location,
4126 TRUTH_ANDIF_EXPR, e1, e2,
5ade1ed2 4127 complain);
c3a88be8
RM
4128 op1 = cp_convert (TREE_TYPE (op0), integer_one_node);
4129 }
4130 else
4131 {
4132 op0 = build_ptrmemfunc_access_expr (op0, pfn_identifier);
4133 op1 = cp_convert (TREE_TYPE (op0), integer_zero_node);
4134 }
faae18ab 4135 result_type = TREE_TYPE (op0);
8d08fdba 4136 }
a7a64a77 4137 else if (TYPE_PTRMEMFUNC_P (type1) && null_ptr_cst_p (op0))
ba47d38d 4138 return cp_build_binary_op (location, code, op1, op0, complain);
867f133e 4139 else if (TYPE_PTRMEMFUNC_P (type0) && TYPE_PTRMEMFUNC_P (type1))
8d08fdba 4140 {
867f133e 4141 tree type;
c7e266a6
MM
4142 /* E will be the final comparison. */
4143 tree e;
4144 /* E1 and E2 are for scratch. */
4145 tree e1;
4146 tree e2;
1f84ec23
MM
4147 tree pfn0;
4148 tree pfn1;
4149 tree delta0;
4150 tree delta1;
c7e266a6 4151
c86818cf
SZ
4152 type = composite_pointer_type (type0, type1, op0, op1,
4153 CPO_COMPARISON, complain);
867f133e
OW
4154
4155 if (!same_type_p (TREE_TYPE (op0), type))
4156 op0 = cp_convert_and_check (type, op0);
4157 if (!same_type_p (TREE_TYPE (op1), type))
4158 op1 = cp_convert_and_check (type, op1);
4159
4160 if (op0 == error_mark_node || op1 == error_mark_node)
4161 return error_mark_node;
4162
ebb1abc3
JM
4163 if (TREE_SIDE_EFFECTS (op0))
4164 op0 = save_expr (op0);
4165 if (TREE_SIDE_EFFECTS (op1))
4166 op1 = save_expr (op1);
4167
1f84ec23
MM
4168 pfn0 = pfn_from_ptrmemfunc (op0);
4169 pfn1 = pfn_from_ptrmemfunc (op1);
a298680c
OW
4170 delta0 = delta_from_ptrmemfunc (op0);
4171 delta1 = delta_from_ptrmemfunc (op1);
c3a88be8
RM
4172 if (TARGET_PTRMEMFUNC_VBIT_LOCATION
4173 == ptrmemfunc_vbit_in_delta)
4174 {
4175 /* We generate:
4176
4177 (op0.pfn == op1.pfn
4178 && ((op0.delta == op1.delta)
4179 || (!op0.pfn && op0.delta & 1 == 0
4180 && op1.delta & 1 == 0))
4181
4182 The reason for the `!op0.pfn' bit is that a NULL
4183 pointer-to-member is any member with a zero PFN and
4184 LSB of the DELTA field is 0. */
4185
ba47d38d 4186 e1 = cp_build_binary_op (location, BIT_AND_EXPR,
c3a88be8 4187 delta0,
5ade1ed2
DG
4188 integer_one_node,
4189 complain);
ba47d38d
AH
4190 e1 = cp_build_binary_op (location,
4191 EQ_EXPR, e1, integer_zero_node,
5ade1ed2 4192 complain);
ba47d38d 4193 e2 = cp_build_binary_op (location, BIT_AND_EXPR,
c3a88be8 4194 delta1,
5ade1ed2
DG
4195 integer_one_node,
4196 complain);
ba47d38d
AH
4197 e2 = cp_build_binary_op (location,
4198 EQ_EXPR, e2, integer_zero_node,
5ade1ed2 4199 complain);
ba47d38d
AH
4200 e1 = cp_build_binary_op (location,
4201 TRUTH_ANDIF_EXPR, e2, e1,
5ade1ed2 4202 complain);
ba47d38d 4203 e2 = cp_build_binary_op (location, EQ_EXPR,
c3a88be8
RM
4204 pfn0,
4205 fold_convert (TREE_TYPE (pfn0),
5ade1ed2
DG
4206 integer_zero_node),
4207 complain);
ba47d38d
AH
4208 e2 = cp_build_binary_op (location,
4209 TRUTH_ANDIF_EXPR, e2, e1, complain);
4210 e1 = cp_build_binary_op (location,
4211 EQ_EXPR, delta0, delta1, complain);
4212 e1 = cp_build_binary_op (location,
4213 TRUTH_ORIF_EXPR, e1, e2, complain);
c3a88be8
RM
4214 }
4215 else
4216 {
4217 /* We generate:
4218
4219 (op0.pfn == op1.pfn
4220 && (!op0.pfn || op0.delta == op1.delta))
4221
4222 The reason for the `!op0.pfn' bit is that a NULL
4223 pointer-to-member is any member with a zero PFN; the
4224 DELTA field is unspecified. */
4225
ba47d38d
AH
4226 e1 = cp_build_binary_op (location,
4227 EQ_EXPR, delta0, delta1, complain);
4228 e2 = cp_build_binary_op (location,
4229 EQ_EXPR,
c3a88be8
RM
4230 pfn0,
4231 fold_convert (TREE_TYPE (pfn0),
5ade1ed2
DG
4232 integer_zero_node),
4233 complain);
ba47d38d
AH
4234 e1 = cp_build_binary_op (location,
4235 TRUTH_ORIF_EXPR, e1, e2, complain);
c3a88be8 4236 }
f293ce4b 4237 e2 = build2 (EQ_EXPR, boolean_type_node, pfn0, pfn1);
ba47d38d
AH
4238 e = cp_build_binary_op (location,
4239 TRUTH_ANDIF_EXPR, e2, e1, complain);
8d08fdba 4240 if (code == EQ_EXPR)
c7e266a6 4241 return e;
ba47d38d
AH
4242 return cp_build_binary_op (location,
4243 EQ_EXPR, e, integer_zero_node, complain);
8d08fdba 4244 }
315fb5db
NS
4245 else
4246 {
4247 gcc_assert (!TYPE_PTRMEMFUNC_P (type0)
4248 || !same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type0),
4249 type1));
4250 gcc_assert (!TYPE_PTRMEMFUNC_P (type1)
4251 || !same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type1),
4252 type0));
4253 }
c8094d83 4254
8d08fdba
MS
4255 break;
4256
4257 case MAX_EXPR:
4258 case MIN_EXPR:
4259 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
4260 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
4261 shorten = 1;
4262 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
708cae97 4263 result_type = composite_pointer_type (type0, type1, op0, op1,
c86818cf 4264 CPO_COMPARISON, complain);
8d08fdba
MS
4265 break;
4266
4267 case LE_EXPR:
4268 case GE_EXPR:
4269 case LT_EXPR:
4270 case GT_EXPR:
eda0cd98
RS
4271 if (TREE_CODE (orig_op0) == STRING_CST
4272 || TREE_CODE (orig_op1) == STRING_CST)
5ade1ed2
DG
4273 {
4274 if (complain & tf_warning)
4275 warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
4276 }
eda0cd98 4277
28cbf42c 4278 build_type = boolean_type_node;
b5c0a77e
JM
4279 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
4280 || code0 == ENUMERAL_TYPE)
4281 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
4282 || code1 == ENUMERAL_TYPE))
8d08fdba
MS
4283 short_compare = 1;
4284 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
708cae97 4285 result_type = composite_pointer_type (type0, type1, op0, op1,
c86818cf 4286 CPO_COMPARISON, complain);
14c2101d 4287 else if (code0 == POINTER_TYPE && null_ptr_cst_p (op1))
faae18ab 4288 result_type = type0;
14c2101d 4289 else if (code1 == POINTER_TYPE && null_ptr_cst_p (op0))
faae18ab 4290 result_type = type1;
14c2101d
JM
4291 else if (null_ptr_cst_p (op0) && null_ptr_cst_p (op1))
4292 /* One of the operands must be of nullptr_t type. */
4293 result_type = TREE_TYPE (nullptr_node);
8d08fdba
MS
4294 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
4295 {
faae18ab 4296 result_type = type0;
5ade1ed2 4297 if (complain & tf_error)
cbe5f3b3 4298 permerror (input_location, "ISO C++ forbids comparison between pointer and integer");
5ade1ed2
DG
4299 else
4300 return error_mark_node;
8d08fdba
MS
4301 }
4302 else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
4303 {
faae18ab 4304 result_type = type1;
5ade1ed2 4305 if (complain & tf_error)
cbe5f3b3 4306 permerror (input_location, "ISO C++ forbids comparison between pointer and integer");
5ade1ed2
DG
4307 else
4308 return error_mark_node;
8d08fdba 4309 }
8d08fdba 4310 break;
7f85441b 4311
1eb8759b
RH
4312 case UNORDERED_EXPR:
4313 case ORDERED_EXPR:
4314 case UNLT_EXPR:
4315 case UNLE_EXPR:
4316 case UNGT_EXPR:
4317 case UNGE_EXPR:
4318 case UNEQ_EXPR:
1eb8759b
RH
4319 build_type = integer_type_node;
4320 if (code0 != REAL_TYPE || code1 != REAL_TYPE)
4321 {
5ade1ed2
DG
4322 if (complain & tf_error)
4323 error ("unordered comparison on non-floating point argument");
1eb8759b
RH
4324 return error_mark_node;
4325 }
4326 common = 1;
4327 break;
4328
7f85441b
KG
4329 default:
4330 break;
8d08fdba
MS
4331 }
4332
550a799d
JM
4333 if (((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE
4334 || code0 == ENUMERAL_TYPE)
c8094d83 4335 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
550a799d 4336 || code1 == COMPLEX_TYPE || code1 == ENUMERAL_TYPE)))
73042643
AH
4337 arithmetic_types_p = 1;
4338 else
4339 {
4340 arithmetic_types_p = 0;
4341 /* Vector arithmetic is only allowed when both sides are vectors. */
4342 if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
4343 {
f6d7e7d8
AH
4344 if (!tree_int_cst_equal (TYPE_SIZE (type0), TYPE_SIZE (type1))
4345 || !same_scalar_type_ignoring_signedness (TREE_TYPE (type0),
4346 TREE_TYPE (type1)))
4347 {
ba47d38d 4348 binary_op_error (location, code, type0, type1);
f6d7e7d8
AH
4349 return error_mark_node;
4350 }
73042643
AH
4351 arithmetic_types_p = 1;
4352 }
4353 }
455f19cb
MM
4354 /* Determine the RESULT_TYPE, if it is not already known. */
4355 if (!result_type
c8094d83 4356 && arithmetic_types_p
455f19cb 4357 && (shorten || common || short_compare))
98f2f3a2 4358 result_type = cp_common_type (type0, type1);
455f19cb
MM
4359
4360 if (!result_type)
8d08fdba 4361 {
5ade1ed2
DG
4362 if (complain & tf_error)
4363 error ("invalid operands of types %qT and %qT to binary %qO",
4364 TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), code);
455f19cb
MM
4365 return error_mark_node;
4366 }
37c46b43 4367
455f19cb
MM
4368 /* If we're in a template, the only thing we need to know is the
4369 RESULT_TYPE. */
4370 if (processing_template_decl)
5be014d5
AP
4371 {
4372 /* Since the middle-end checks the type when doing a build2, we
4373 need to build the tree in pieces. This built tree will never
4374 get out of the front-end as we replace it when instantiating
4375 the template. */
4376 tree tmp = build2 (resultcode,
4377 build_type ? build_type : result_type,
4378 NULL_TREE, op1);
4379 TREE_OPERAND (tmp, 0) = op0;
4380 return tmp;
4381 }
455f19cb
MM
4382
4383 if (arithmetic_types_p)
4384 {
1ff6b2c8
JM
4385 bool first_complex = (code0 == COMPLEX_TYPE);
4386 bool second_complex = (code1 == COMPLEX_TYPE);
4387 int none_complex = (!first_complex && !second_complex);
4388
4389 /* Adapted from patch for c/24581. */
4390 if (first_complex != second_complex
4391 && (code == PLUS_EXPR
4392 || code == MINUS_EXPR
4393 || code == MULT_EXPR
4394 || (code == TRUNC_DIV_EXPR && first_complex))
4395 && TREE_CODE (TREE_TYPE (result_type)) == REAL_TYPE
4396 && flag_signed_zeros)
4397 {
4398 /* An operation on mixed real/complex operands must be
4399 handled specially, but the language-independent code can
4400 more easily optimize the plain complex arithmetic if
4401 -fno-signed-zeros. */
4402 tree real_type = TREE_TYPE (result_type);
4403 tree real, imag;
4404 if (first_complex)
4405 {
4406 if (TREE_TYPE (op0) != result_type)
4407 op0 = cp_convert_and_check (result_type, op0);
4408 if (TREE_TYPE (op1) != real_type)
4409 op1 = cp_convert_and_check (real_type, op1);
4410 }
4411 else
4412 {
4413 if (TREE_TYPE (op0) != real_type)
4414 op0 = cp_convert_and_check (real_type, op0);
4415 if (TREE_TYPE (op1) != result_type)
4416 op1 = cp_convert_and_check (result_type, op1);
4417 }
4418 if (TREE_CODE (op0) == ERROR_MARK || TREE_CODE (op1) == ERROR_MARK)
4419 return error_mark_node;
4420 if (first_complex)
4421 {
4422 op0 = save_expr (op0);
4423 real = cp_build_unary_op (REALPART_EXPR, op0, 1, complain);
4424 imag = cp_build_unary_op (IMAGPART_EXPR, op0, 1, complain);
4425 switch (code)
4426 {
4427 case MULT_EXPR:
4428 case TRUNC_DIV_EXPR:
4429 imag = build2 (resultcode, real_type, imag, op1);
4430 /* Fall through. */
4431 case PLUS_EXPR:
4432 case MINUS_EXPR:
4433 real = build2 (resultcode, real_type, real, op1);
4434 break;
4435 default:
4436 gcc_unreachable();
4437 }
4438 }
4439 else
4440 {
4441 op1 = save_expr (op1);
4442 real = cp_build_unary_op (REALPART_EXPR, op1, 1, complain);
4443 imag = cp_build_unary_op (IMAGPART_EXPR, op1, 1, complain);
4444 switch (code)
4445 {
4446 case MULT_EXPR:
4447 imag = build2 (resultcode, real_type, op0, imag);
4448 /* Fall through. */
4449 case PLUS_EXPR:
4450 real = build2 (resultcode, real_type, op0, real);
4451 break;
4452 case MINUS_EXPR:
4453 real = build2 (resultcode, real_type, op0, real);
4454 imag = build1 (NEGATE_EXPR, real_type, imag);
4455 break;
4456 default:
4457 gcc_unreachable();
4458 }
4459 }
4460 return build2 (COMPLEX_EXPR, result_type, real, imag);
4461 }
8d08fdba
MS
4462
4463 /* For certain operations (which identify themselves by shorten != 0)
4464 if both args were extended from the same smaller type,
4465 do the arithmetic in that type and then extend.
4466
4467 shorten !=0 and !=1 indicates a bitwise operation.
4468 For them, this optimization is safe only if
4469 both args are zero-extended or both are sign-extended.
4470 Otherwise, we might change the result.
39a13be5 4471 E.g., (short)-1 | (unsigned short)-1 is (int)-1
8d08fdba
MS
4472 but calculated in (unsigned short) it would be (unsigned short)-1. */
4473
37c46b43 4474 if (shorten && none_complex)
8d08fdba 4475 {
8d08fdba 4476 final_type = result_type;
6715192c
MLI
4477 result_type = shorten_binary_op (result_type, op0, op1,
4478 shorten == -1);
8d08fdba
MS
4479 }
4480
8d08fdba
MS
4481 /* Comparison operations are shortened too but differently.
4482 They identify themselves by setting short_compare = 1. */
4483
4484 if (short_compare)
4485 {
4486 /* Don't write &op0, etc., because that would prevent op0
4487 from being kept in a register.
4488 Instead, make copies of the our local variables and
4489 pass the copies by reference, then copy them back afterward. */
4490 tree xop0 = op0, xop1 = op1, xresult_type = result_type;
4491 enum tree_code xresultcode = resultcode;
c8094d83 4492 tree val
8d08fdba
MS
4493 = shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
4494 if (val != 0)
37c46b43 4495 return cp_convert (boolean_type_node, val);
28cbf42c
MS
4496 op0 = xop0, op1 = xop1;
4497 converted = 1;
8d08fdba
MS
4498 resultcode = xresultcode;
4499 }
4500
8d3b081e 4501 if ((short_compare || code == MIN_EXPR || code == MAX_EXPR)
7d48af30 4502 && warn_sign_compare
82a71a26
ILT
4503 && !TREE_NO_WARNING (orig_op0)
4504 && !TREE_NO_WARNING (orig_op1)
7d48af30
MM
4505 /* Do not warn until the template is instantiated; we cannot
4506 bound the ranges of the arguments until that point. */
2d12797c 4507 && !processing_template_decl
98f80e91
ILT
4508 && (complain & tf_warning)
4509 && c_inhibit_evaluation_warnings == 0)
8d08fdba 4510 {
ba47d38d
AH
4511 warn_for_sign_compare (location, orig_op0, orig_op1, op0, op1,
4512 result_type, resultcode);
8d08fdba
MS
4513 }
4514 }
4515
b9edb4b1
MLI
4516 /* If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
4517 Then the expression will be built.
4518 It will be given type FINAL_TYPE if that is nonzero;
4519 otherwise, it will be given type RESULT_TYPE. */
8d08fdba
MS
4520 if (! converted)
4521 {
4522 if (TREE_TYPE (op0) != result_type)
07231d4f 4523 op0 = cp_convert_and_check (result_type, op0);
8d08fdba 4524 if (TREE_TYPE (op1) != result_type)
07231d4f 4525 op1 = cp_convert_and_check (result_type, op1);
848b92e1
JM
4526
4527 if (op0 == error_mark_node || op1 == error_mark_node)
4528 return error_mark_node;
8d08fdba
MS
4529 }
4530
28cbf42c
MS
4531 if (build_type == NULL_TREE)
4532 build_type = result_type;
4533
455f19cb
MM
4534 result = build2 (resultcode, build_type, op0, op1);
4535 result = fold_if_not_in_template (result);
4536 if (final_type != 0)
4537 result = cp_convert (final_type, result);
16fd4d2d
MLI
4538
4539 if (TREE_OVERFLOW_P (result)
4540 && !TREE_OVERFLOW_P (op0)
4541 && !TREE_OVERFLOW_P (op1))
c2255bc4 4542 overflow_warning (location, result);
16fd4d2d 4543
455f19cb 4544 return result;
8d08fdba
MS
4545}
4546\f
4547/* Return a tree for the sum or difference (RESULTCODE says which)
4548 of pointer PTROP and integer INTOP. */
4549
4550static tree
926ce8bd 4551cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
8d08fdba 4552{
bfba94bd
MM
4553 tree res_type = TREE_TYPE (ptrop);
4554
4555 /* pointer_int_sum() uses size_in_bytes() on the TREE_TYPE(res_type)
4556 in certain circumstance (when it's valid to do so). So we need
4557 to make sure it's complete. We don't need to check here, if we
4558 can actually complete it at all, as those checks will be done in
4559 pointer_int_sum() anyway. */
4560 complete_type (TREE_TYPE (res_type));
8f259df3 4561
db3927fb 4562 return pointer_int_sum (input_location, resultcode, ptrop,
455f19cb 4563 fold_if_not_in_template (intop));
8d08fdba
MS
4564}
4565
4566/* Return a tree for the difference of pointers OP0 and OP1.
4567 The resulting tree has type int. */
4568
4569static tree
926ce8bd 4570pointer_diff (tree op0, tree op1, tree ptrtype)
8d08fdba 4571{
6de9cd9a 4572 tree result;
8d08fdba 4573 tree restype = ptrdiff_type_node;
79a7c7fa 4574 tree target_type = TREE_TYPE (ptrtype);
8d08fdba 4575
66543169 4576 if (!complete_type_or_else (target_type, NULL_TREE))
8f259df3
MM
4577 return error_mark_node;
4578
fcf73884 4579 if (TREE_CODE (target_type) == VOID_TYPE)
cbe5f3b3 4580 permerror (input_location, "ISO C++ forbids using pointer of type %<void *%> in subtraction");
fcf73884 4581 if (TREE_CODE (target_type) == FUNCTION_TYPE)
cbe5f3b3 4582 permerror (input_location, "ISO C++ forbids using pointer to a function in subtraction");
fcf73884 4583 if (TREE_CODE (target_type) == METHOD_TYPE)
cbe5f3b3 4584 permerror (input_location, "ISO C++ forbids using pointer to a method in subtraction");
8d08fdba
MS
4585
4586 /* First do the subtraction as integers;
4587 then drop through to build the divide operator. */
4588
ba47d38d
AH
4589 op0 = cp_build_binary_op (input_location,
4590 MINUS_EXPR,
ab76ca54 4591 cp_convert (restype, op0),
5ade1ed2
DG
4592 cp_convert (restype, op1),
4593 tf_warning_or_error);
8d08fdba
MS
4594
4595 /* This generates an error if op1 is a pointer to an incomplete type. */
d0f062fb 4596 if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (op1))))
7e4d7898 4597 error ("invalid use of a pointer to an incomplete type in pointer arithmetic");
8d08fdba 4598
c8094d83 4599 op1 = (TYPE_PTROB_P (ptrtype)
a5ac359a
MM
4600 ? size_in_bytes (target_type)
4601 : integer_one_node);
8d08fdba
MS
4602
4603 /* Do the division. */
4604
f293ce4b 4605 result = build2 (EXACT_DIV_EXPR, restype, op0, cp_convert (restype, op1));
455f19cb 4606 return fold_if_not_in_template (result);
8d08fdba
MS
4607}
4608\f
8d08fdba
MS
4609/* Construct and perhaps optimize a tree representation
4610 for a unary operation. CODE, a tree_code, specifies the operation
4611 and XARG is the operand. */
4612
4613tree
5ade1ed2 4614build_x_unary_op (enum tree_code code, tree xarg, tsubst_flags_t complain)
8d08fdba 4615{
d17811fd 4616 tree orig_expr = xarg;
19420d00
NS
4617 tree exp;
4618 int ptrmem = 0;
c8094d83 4619
5156628f 4620 if (processing_template_decl)
d17811fd
MM
4621 {
4622 if (type_dependent_expression_p (xarg))
4623 return build_min_nt (code, xarg, NULL_TREE);
3601f003 4624
d17811fd
MM
4625 xarg = build_non_dependent_expr (xarg);
4626 }
4627
4628 exp = NULL_TREE;
5566b478 4629
1e2e9f54
MM
4630 /* [expr.unary.op] says:
4631
4632 The address of an object of incomplete type can be taken.
4633
4634 (And is just the ordinary address operator, not an overloaded
4635 "operator &".) However, if the type is a template
4636 specialization, we must complete the type at this point so that
4637 an overloaded "operator &" will be available if required. */
db5ae43f 4638 if (code == ADDR_EXPR
386b8a85 4639 && TREE_CODE (xarg) != TEMPLATE_ID_EXPR
1e2e9f54
MM
4640 && ((CLASS_TYPE_P (TREE_TYPE (xarg))
4641 && !COMPLETE_TYPE_P (complete_type (TREE_TYPE (xarg))))
db5ae43f 4642 || (TREE_CODE (xarg) == OFFSET_REF)))
f4f206f4 4643 /* Don't look for a function. */;
db5ae43f 4644 else
ec835fb2 4645 exp = build_new_op (code, LOOKUP_NORMAL, xarg, NULL_TREE, NULL_TREE,
5ade1ed2 4646 /*overloaded_p=*/NULL, complain);
d17811fd 4647 if (!exp && code == ADDR_EXPR)
c91a56d2 4648 {
7e361ae6
JM
4649 if (is_overloaded_fn (xarg))
4650 {
4651 tree fn = get_first_fn (xarg);
4652 if (DECL_CONSTRUCTOR_P (fn) || DECL_DESTRUCTOR_P (fn))
4653 {
24ea727a
SZ
4654 error (DECL_CONSTRUCTOR_P (fn)
4655 ? G_("taking address of constructor %qE")
4656 : G_("taking address of destructor %qE"),
4657 xarg);
7e361ae6
JM
4658 return error_mark_node;
4659 }
4660 }
4661
4662 /* A pointer to member-function can be formed only by saying
4663 &X::mf. */
1e14c7f0
GDR
4664 if (!flag_ms_extensions && TREE_CODE (TREE_TYPE (xarg)) == METHOD_TYPE
4665 && (TREE_CODE (xarg) != OFFSET_REF || !PTRMEM_OK_P (xarg)))
4666 {
5ebbc0ee
NS
4667 if (TREE_CODE (xarg) != OFFSET_REF
4668 || !TYPE_P (TREE_OPERAND (xarg, 0)))
1e14c7f0 4669 {
5ade1ed2
DG
4670 error ("invalid use of %qE to form a pointer-to-member-function",
4671 xarg);
4672 if (TREE_CODE (xarg) != OFFSET_REF)
1f5b3869 4673 inform (input_location, " a qualified-id is required");
1e14c7f0
GDR
4674 return error_mark_node;
4675 }
4676 else
4677 {
719fbd99 4678 error ("parentheses around %qE cannot be used to form a"
0cbd7506 4679 " pointer-to-member-function",
1e14c7f0
GDR
4680 xarg);
4681 PTRMEM_OK_P (xarg) = 1;
4682 }
4683 }
c8094d83 4684
19420d00 4685 if (TREE_CODE (xarg) == OFFSET_REF)
0cbd7506
MS
4686 {
4687 ptrmem = PTRMEM_OK_P (xarg);
c8094d83 4688
0cbd7506
MS
4689 if (!ptrmem && !flag_ms_extensions
4690 && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE)
4542128e
NS
4691 {
4692 /* A single non-static member, make sure we don't allow a
0cbd7506 4693 pointer-to-member. */
f293ce4b
RS
4694 xarg = build2 (OFFSET_REF, TREE_TYPE (xarg),
4695 TREE_OPERAND (xarg, 0),
4696 ovl_cons (TREE_OPERAND (xarg, 1), NULL_TREE));
4542128e 4697 PTRMEM_OK_P (xarg) = ptrmem;
c8094d83 4698 }
0cbd7506 4699 }
5ade1ed2 4700 else if (TREE_CODE (xarg) == TARGET_EXPR && (complain & tf_warning))
d4ee4d25 4701 warning (0, "taking address of temporary");
5ade1ed2 4702 exp = cp_build_unary_op (ADDR_EXPR, xarg, 0, complain);
c91a56d2
MS
4703 }
4704
d17811fd 4705 if (processing_template_decl && exp != error_mark_node)
6439fffd
KL
4706 exp = build_min_non_dep (code, exp, orig_expr,
4707 /*For {PRE,POST}{INC,DEC}REMENT_EXPR*/NULL_TREE);
4708 if (TREE_CODE (exp) == ADDR_EXPR)
4709 PTRMEM_OK_P (exp) = ptrmem;
19420d00 4710 return exp;
8d08fdba
MS
4711}
4712
78ef5b89
NB
4713/* Like c_common_truthvalue_conversion, but handle pointer-to-member
4714 constants, where a null value is represented by an INTEGER_CST of
4715 -1. */
96d6c610
JM
4716
4717tree
5671bf27 4718cp_truthvalue_conversion (tree expr)
96d6c610
JM
4719{
4720 tree type = TREE_TYPE (expr);
4721 if (TYPE_PTRMEM_P (type))
ba47d38d
AH
4722 return build_binary_op (EXPR_LOCATION (expr),
4723 NE_EXPR, expr, integer_zero_node, 1);
96d6c610 4724 else
ba47d38d 4725 return c_common_truthvalue_conversion (input_location, expr);
96d6c610
JM
4726}
4727
4728/* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR. */
c8094d83 4729
2986ae00 4730tree
5671bf27 4731condition_conversion (tree expr)
2986ae00 4732{
5566b478 4733 tree t;
5156628f 4734 if (processing_template_decl)
5566b478 4735 return expr;
1dad57e6
JM
4736 t = perform_implicit_conversion_flags (boolean_type_node, expr,
4737 tf_warning_or_error, LOOKUP_NORMAL);
0ad28dde 4738 t = fold_build_cleanup_point_expr (boolean_type_node, t);
8ccc31eb 4739 return t;
2986ae00 4740}
c8094d83 4741
d3e1e89e
JM
4742/* Returns the address of T. This function will fold away
4743 ADDR_EXPR of INDIRECT_REF. */
7993382e
MM
4744
4745tree
4746build_address (tree t)
4747{
7993382e
MM
4748 if (error_operand_p (t) || !cxx_mark_addressable (t))
4749 return error_mark_node;
d3e1e89e
JM
4750 t = build_fold_addr_expr (t);
4751 if (TREE_CODE (t) != ADDR_EXPR)
4752 t = rvalue (t);
4753 return t;
7993382e
MM
4754}
4755
e7f1930f
JM
4756/* Returns the address of T with type TYPE. */
4757
4758tree
4759build_typed_address (tree t, tree type)
4760{
4761 if (error_operand_p (t) || !cxx_mark_addressable (t))
4762 return error_mark_node;
4763 t = build_fold_addr_expr_with_type (t, type);
4764 if (TREE_CODE (t) != ADDR_EXPR)
4765 t = rvalue (t);
4766 return t;
4767}
4768
7993382e
MM
4769/* Return a NOP_EXPR converting EXPR to TYPE. */
4770
4771tree
4772build_nop (tree type, tree expr)
4773{
7993382e
MM
4774 if (type == error_mark_node || error_operand_p (expr))
4775 return expr;
6de9cd9a 4776 return build1 (NOP_EXPR, type, expr);
7993382e
MM
4777}
4778
8d08fdba
MS
4779/* C++: Must handle pointers to members.
4780
4781 Perhaps type instantiation should be extended to handle conversion
4782 from aggregates to types we don't yet know we want? (Or are those
4783 cases typically errors which should be reported?)
4784
4785 NOCONVERT nonzero suppresses the default promotions
4786 (such as from short to int). */
e92cc029 4787
8d08fdba 4788tree
5ade1ed2
DG
4789cp_build_unary_op (enum tree_code code, tree xarg, int noconvert,
4790 tsubst_flags_t complain)
8d08fdba
MS
4791{
4792 /* No default_conversion here. It causes trouble for ADDR_EXPR. */
926ce8bd
KH
4793 tree arg = xarg;
4794 tree argtype = 0;
d8e178a0 4795 const char *errstring = NULL;
8d08fdba 4796 tree val;
4de67c26 4797 const char *invalid_op_diag;
8d08fdba 4798
fb80065c 4799 if (!arg || error_operand_p (arg))
8d08fdba
MS
4800 return error_mark_node;
4801
4de67c26
JM
4802 if ((invalid_op_diag
4803 = targetm.invalid_unary_op ((code == UNARY_PLUS_EXPR
4804 ? CONVERT_EXPR
4805 : code),
4806 TREE_TYPE (xarg))))
4807 {
4808 error (invalid_op_diag);
4809 return error_mark_node;
4810 }
4811
8d08fdba
MS
4812 switch (code)
4813 {
392e3d51 4814 case UNARY_PLUS_EXPR:
b7484fbe 4815 case NEGATE_EXPR:
8a21aa30
KC
4816 {
4817 int flags = WANT_ARITH | WANT_ENUM;
4818 /* Unary plus (but not unary minus) is allowed on pointers. */
392e3d51 4819 if (code == UNARY_PLUS_EXPR)
8a21aa30
KC
4820 flags |= WANT_POINTER;
4821 arg = build_expr_type_conversion (flags, arg, true);
e99f332f
GB
4822 if (!arg)
4823 errstring = (code == NEGATE_EXPR
4cd5a50a
PB
4824 ? _("wrong type argument to unary minus")
4825 : _("wrong type argument to unary plus"));
e99f332f
GB
4826 else
4827 {
4828 if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
4829 arg = perform_integral_promotions (arg);
4830
13a44ee0 4831 /* Make sure the result is not an lvalue: a unary plus or minus
e99f332f 4832 expression is always a rvalue. */
5cc53d4e 4833 arg = rvalue (arg);
e99f332f
GB
4834 }
4835 }
8d08fdba
MS
4836 break;
4837
4838 case BIT_NOT_EXPR:
37c46b43
MS
4839 if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4840 {
4841 code = CONJ_EXPR;
4842 if (!noconvert)
4843 arg = default_conversion (arg);
4844 }
4576ceaf 4845 else if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM
1ff6b2c8 4846 | WANT_VECTOR_OR_COMPLEX,
b746c5dc 4847 arg, true)))
4cd5a50a 4848 errstring = _("wrong type argument to bit-complement");
bd289f54 4849 else if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
0a72704b 4850 arg = perform_integral_promotions (arg);
8d08fdba
MS
4851 break;
4852
4853 case ABS_EXPR:
b746c5dc 4854 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
4cd5a50a 4855 errstring = _("wrong type argument to abs");
8d08fdba
MS
4856 else if (!noconvert)
4857 arg = default_conversion (arg);
4858 break;
4859
37c46b43
MS
4860 case CONJ_EXPR:
4861 /* Conjugating a real value is a no-op, but allow it anyway. */
b746c5dc 4862 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
4cd5a50a 4863 errstring = _("wrong type argument to conjugation");
37c46b43
MS
4864 else if (!noconvert)
4865 arg = default_conversion (arg);
4866 break;
4867
8d08fdba 4868 case TRUTH_NOT_EXPR:
5ade1ed2
DG
4869 arg = perform_implicit_conversion (boolean_type_node, arg,
4870 complain);
db3927fb 4871 val = invert_truthvalue_loc (input_location, arg);
2986ae00
MS
4872 if (arg != error_mark_node)
4873 return val;
4cd5a50a 4874 errstring = _("in argument to unary !");
8d08fdba
MS
4875 break;
4876
4877 case NOP_EXPR:
4878 break;
c8094d83 4879
37c46b43
MS
4880 case REALPART_EXPR:
4881 if (TREE_CODE (arg) == COMPLEX_CST)
4882 return TREE_REALPART (arg);
4883 else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
455f19cb
MM
4884 {
4885 arg = build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
4886 return fold_if_not_in_template (arg);
4887 }
37c46b43
MS
4888 else
4889 return arg;
4890
4891 case IMAGPART_EXPR:
4892 if (TREE_CODE (arg) == COMPLEX_CST)
4893 return TREE_IMAGPART (arg);
4894 else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
455f19cb
MM
4895 {
4896 arg = build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
4897 return fold_if_not_in_template (arg);
4898 }
37c46b43
MS
4899 else
4900 return cp_convert (TREE_TYPE (arg), integer_zero_node);
c8094d83 4901
8d08fdba
MS
4902 case PREINCREMENT_EXPR:
4903 case POSTINCREMENT_EXPR:
4904 case PREDECREMENT_EXPR:
4905 case POSTDECREMENT_EXPR:
4906 /* Handle complex lvalues (when permitted)
4907 by reduction to simpler cases. */
4908
4909 val = unary_complex_lvalue (code, arg);
4910 if (val != 0)
4911 return val;
4912
03a904b5
JJ
4913 arg = mark_lvalue_use (arg);
4914
37c46b43
MS
4915 /* Increment or decrement the real part of the value,
4916 and don't change the imaginary part. */
4917 if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4918 {
4919 tree real, imag;
4920
4921 arg = stabilize_reference (arg);
5ade1ed2
DG
4922 real = cp_build_unary_op (REALPART_EXPR, arg, 1, complain);
4923 imag = cp_build_unary_op (IMAGPART_EXPR, arg, 1, complain);
4924 real = cp_build_unary_op (code, real, 1, complain);
a87db577
AP
4925 if (real == error_mark_node || imag == error_mark_node)
4926 return error_mark_node;
f293ce4b 4927 return build2 (COMPLEX_EXPR, TREE_TYPE (arg),
a87db577 4928 real, imag);
37c46b43
MS
4929 }
4930
8d08fdba
MS
4931 /* Report invalid types. */
4932
b7484fbe 4933 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_POINTER,
b746c5dc 4934 arg, true)))
8d08fdba
MS
4935 {
4936 if (code == PREINCREMENT_EXPR)
4cd5a50a 4937 errstring = _("no pre-increment operator for type");
8d08fdba 4938 else if (code == POSTINCREMENT_EXPR)
4cd5a50a 4939 errstring = _("no post-increment operator for type");
8d08fdba 4940 else if (code == PREDECREMENT_EXPR)
4cd5a50a 4941 errstring = _("no pre-decrement operator for type");
8d08fdba 4942 else
4cd5a50a 4943 errstring = _("no post-decrement operator for type");
8d08fdba
MS
4944 break;
4945 }
affb3cb2
JJ
4946 else if (arg == error_mark_node)
4947 return error_mark_node;
8d08fdba
MS
4948
4949 /* Report something read-only. */
4950
91063b51 4951 if (CP_TYPE_CONST_P (TREE_TYPE (arg))
5ade1ed2
DG
4952 || TREE_READONLY (arg))
4953 {
4954 if (complain & tf_error)
4955 readonly_error (arg, ((code == PREINCREMENT_EXPR
4956 || code == POSTINCREMENT_EXPR)
4cd5a50a 4957 ? REK_INCREMENT : REK_DECREMENT));
5ade1ed2
DG
4958 else
4959 return error_mark_node;
4960 }
8d08fdba
MS
4961
4962 {
926ce8bd 4963 tree inc;
b70cef5d 4964 tree declared_type = unlowered_expr_type (arg);
8d08fdba 4965
8d08fdba
MS
4966 argtype = TREE_TYPE (arg);
4967
4968 /* ARM $5.2.5 last annotation says this should be forbidden. */
4969 if (TREE_CODE (argtype) == ENUMERAL_TYPE)
5ade1ed2
DG
4970 {
4971 if (complain & tf_error)
cbe5f3b3 4972 permerror (input_location, (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
37ec60ed
JW
4973 ? G_("ISO C++ forbids incrementing an enum")
4974 : G_("ISO C++ forbids decrementing an enum"));
5ade1ed2
DG
4975 else
4976 return error_mark_node;
4977 }
c8094d83 4978
8d08fdba
MS
4979 /* Compute the increment. */
4980
b7484fbe 4981 if (TREE_CODE (argtype) == POINTER_TYPE)
8d08fdba 4982 {
d0f062fb 4983 tree type = complete_type (TREE_TYPE (argtype));
c8094d83 4984
d0f062fb 4985 if (!COMPLETE_OR_VOID_TYPE_P (type))
5ade1ed2
DG
4986 {
4987 if (complain & tf_error)
4988 error (((code == PREINCREMENT_EXPR
4989 || code == POSTINCREMENT_EXPR))
4990 ? G_("cannot increment a pointer to incomplete type %qT")
4991 : G_("cannot decrement a pointer to incomplete type %qT"),
4992 TREE_TYPE (argtype));
4993 else
4994 return error_mark_node;
4995 }
e62d5b58 4996 else if ((pedantic || warn_pointer_arith)
5ade1ed2
DG
4997 && !TYPE_PTROB_P (argtype))
4998 {
4999 if (complain & tf_error)
cbe5f3b3 5000 permerror (input_location, (code == PREINCREMENT_EXPR
37ec60ed
JW
5001 || code == POSTINCREMENT_EXPR)
5002 ? G_("ISO C++ forbids incrementing a pointer of type %qT")
5003 : G_("ISO C++ forbids decrementing a pointer of type %qT"),
5004 argtype);
5ade1ed2
DG
5005 else
5006 return error_mark_node;
5007 }
5008
ea793912 5009 inc = cxx_sizeof_nowarn (TREE_TYPE (argtype));
8d08fdba
MS
5010 }
5011 else
5012 inc = integer_one_node;
5013
37c46b43 5014 inc = cp_convert (argtype, inc);
8d08fdba 5015
8d08fdba
MS
5016 /* Complain about anything else that is not a true lvalue. */
5017 if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
5018 || code == POSTINCREMENT_EXPR)
5ade1ed2
DG
5019 ? lv_increment : lv_decrement),
5020 complain))
8d08fdba
MS
5021 return error_mark_node;
5022
b7484fbe 5023 /* Forbid using -- on `bool'. */
66be89f0 5024 if (TREE_CODE (declared_type) == BOOLEAN_TYPE)
b7484fbe
MS
5025 {
5026 if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
5027 {
5ade1ed2
DG
5028 if (complain & tf_error)
5029 error ("invalid use of Boolean expression as operand "
5030 "to %<operator--%>");
b7484fbe
MS
5031 return error_mark_node;
5032 }
19552aa5 5033 val = boolean_increment (code, arg);
b7484fbe
MS
5034 }
5035 else
f293ce4b 5036 val = build2 (code, TREE_TYPE (arg), arg, inc);
b7484fbe 5037
8d08fdba 5038 TREE_SIDE_EFFECTS (val) = 1;
b70cef5d 5039 return val;
8d08fdba
MS
5040 }
5041
5042 case ADDR_EXPR:
5043 /* Note that this operation never does default_conversion
5044 regardless of NOCONVERT. */
5045
8cd4c175 5046 argtype = lvalue_type (arg);
a5ac359a 5047
03a904b5
JJ
5048 arg = mark_lvalue_use (arg);
5049
a5ac359a
MM
5050 if (TREE_CODE (arg) == OFFSET_REF)
5051 goto offset_ref;
5052
b7484fbe 5053 if (TREE_CODE (argtype) == REFERENCE_TYPE)
8d08fdba 5054 {
6de9cd9a
DN
5055 tree type = build_pointer_type (TREE_TYPE (argtype));
5056 arg = build1 (CONVERT_EXPR, type, arg);
8d08fdba
MS
5057 return arg;
5058 }
d0db8989 5059 else if (pedantic && DECL_MAIN_P (arg))
5ade1ed2
DG
5060 {
5061 /* ARM $3.4 */
d0db8989
JM
5062 /* Apparently a lot of autoconf scripts for C++ packages do this,
5063 so only complain if -pedantic. */
5064 if (complain & (flag_pedantic_errors ? tf_error : tf_warning))
5065 pedwarn (input_location, OPT_pedantic,
5066 "ISO C++ forbids taking address of function %<::main%>");
5067 else if (flag_pedantic_errors)
5ade1ed2
DG
5068 return error_mark_node;
5069 }
8d08fdba
MS
5070
5071 /* Let &* cancel out to simplify resulting code. */
5072 if (TREE_CODE (arg) == INDIRECT_REF)
5073 {
4ac14744 5074 /* We don't need to have `current_class_ptr' wrapped in a
8d08fdba 5075 NON_LVALUE_EXPR node. */
4ac14744
MS
5076 if (arg == current_class_ref)
5077 return current_class_ptr;
8d08fdba 5078
8d08fdba
MS
5079 arg = TREE_OPERAND (arg, 0);
5080 if (TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE)
5081 {
6de9cd9a
DN
5082 tree type = build_pointer_type (TREE_TYPE (TREE_TYPE (arg)));
5083 arg = build1 (CONVERT_EXPR, type, arg);
8d08fdba 5084 }
5cc53d4e 5085 else
8d08fdba 5086 /* Don't let this be an lvalue. */
5cc53d4e 5087 arg = rvalue (arg);
8d08fdba
MS
5088 return arg;
5089 }
5090
12a149a0
EB
5091 /* ??? Cope with user tricks that amount to offsetof. */
5092 if (TREE_CODE (argtype) != FUNCTION_TYPE
5093 && TREE_CODE (argtype) != METHOD_TYPE
5094 && argtype != unknown_type_node
5095 && (val = get_base_address (arg))
5096 && TREE_CODE (val) == INDIRECT_REF
5097 && TREE_CONSTANT (TREE_OPERAND (val, 0)))
5098 {
5099 tree type = build_pointer_type (argtype);
5100 tree op0 = fold_convert (type, TREE_OPERAND (val, 0));
5101 tree op1 = fold_convert (sizetype, fold_offsetof (arg, val));
5102 return fold_build2 (POINTER_PLUS_EXPR, type, op0, op1);
5103 }
5104
8d08fdba
MS
5105 /* Uninstantiated types are all functions. Taking the
5106 address of a function is a no-op, so just return the
5107 argument. */
5108
315fb5db
NS
5109 gcc_assert (TREE_CODE (arg) != IDENTIFIER_NODE
5110 || !IDENTIFIER_OPNAME_P (arg));
8d08fdba 5111
96d6c610 5112 if (TREE_CODE (arg) == COMPONENT_REF && type_unknown_p (arg)
50ad9642 5113 && !really_overloaded_fn (TREE_OPERAND (arg, 1)))
0cbd7506 5114 {
fbf6f1ba 5115 /* They're trying to take the address of a unique non-static
96d6c610
JM
5116 member function. This is ill-formed (except in MS-land),
5117 but let's try to DTRT.
5118 Note: We only handle unique functions here because we don't
5119 want to complain if there's a static overload; non-unique
5120 cases will be handled by instantiate_type. But we need to
5121 handle this case here to allow casts on the resulting PMF.
5122 We could defer this in non-MS mode, but it's easier to give
5123 a useful error here. */
fbf6f1ba 5124
d219f3ff
KL
5125 /* Inside constant member functions, the `this' pointer
5126 contains an extra const qualifier. TYPE_MAIN_VARIANT
5127 is used here to remove this const from the diagnostics
5128 and the created OFFSET_REF. */
5129 tree base = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg, 0)));
d4f0f205 5130 tree fn = get_first_fn (TREE_OPERAND (arg, 1));
5c147e22 5131 mark_used (fn);
96d6c610
JM
5132
5133 if (! flag_ms_extensions)
5134 {
d4f0f205 5135 tree name = DECL_NAME (fn);
5ade1ed2
DG
5136 if (!(complain & tf_error))
5137 return error_mark_node;
5138 else if (current_class_type
5139 && TREE_OPERAND (arg, 0) == current_class_ref)
5140 /* An expression like &memfn. */
cbe5f3b3 5141 permerror (input_location, "ISO C++ forbids taking the address of an unqualified"
37ec60ed
JW
5142 " or parenthesized non-static member function to form"
5143 " a pointer to member function. Say %<&%T::%D%>",
5144 base, name);
96d6c610 5145 else
cbe5f3b3 5146 permerror (input_location, "ISO C++ forbids taking the address of a bound member"
37ec60ed
JW
5147 " function to form a pointer to member function."
5148 " Say %<&%T::%D%>",
5149 base, name);
96d6c610 5150 }
d4f0f205 5151 arg = build_offset_ref (base, fn, /*address_p=*/true);
0cbd7506 5152 }
a5ac359a 5153
c8094d83 5154 offset_ref:
03017874 5155 if (type_unknown_p (arg))
51924768 5156 return build1 (ADDR_EXPR, unknown_type_node, arg);
c8094d83 5157
8d08fdba
MS
5158 /* Handle complex lvalues (when permitted)
5159 by reduction to simpler cases. */
5160 val = unary_complex_lvalue (code, arg);
5161 if (val != 0)
5162 return val;
5163
8d08fdba
MS
5164 switch (TREE_CODE (arg))
5165 {
5f9e56b3 5166 CASE_CONVERT:
8d08fdba
MS
5167 case FLOAT_EXPR:
5168 case FIX_TRUNC_EXPR:
5ade1ed2
DG
5169 /* Even if we're not being pedantic, we cannot allow this
5170 extension when we're instantiating in a SFINAE
5171 context. */
fcf73884 5172 if (! lvalue_p (arg) && complain == tf_none)
5ade1ed2
DG
5173 {
5174 if (complain & tf_error)
cbe5f3b3 5175 permerror (input_location, "ISO C++ forbids taking the address of a cast to a non-lvalue expression");
5ade1ed2
DG
5176 else
5177 return error_mark_node;
5178 }
7f85441b 5179 break;
26bcf8fc 5180
b76d34e9
MM
5181 case BASELINK:
5182 arg = BASELINK_FUNCTIONS (arg);
5183 /* Fall through. */
5184
26bcf8fc
MM
5185 case OVERLOAD:
5186 arg = OVL_CURRENT (arg);
5187 break;
5188
6d05585b
MM
5189 case OFFSET_REF:
5190 /* Turn a reference to a non-static data member into a
5191 pointer-to-member. */
5192 {
5193 tree type;
5194 tree t;
5195
5196 if (!PTRMEM_OK_P (arg))
5ade1ed2 5197 return cp_build_unary_op (code, arg, 0, complain);
c8094d83 5198
6d05585b
MM
5199 t = TREE_OPERAND (arg, 1);
5200 if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
5201 {
5ade1ed2
DG
5202 if (complain & tf_error)
5203 error ("cannot create pointer to reference member %qD", t);
6d05585b
MM
5204 return error_mark_node;
5205 }
c8094d83
MS
5206
5207 type = build_ptrmem_type (context_for_name_lookup (t),
6d05585b
MM
5208 TREE_TYPE (t));
5209 t = make_ptrmem_cst (type, TREE_OPERAND (arg, 1));
5210 return t;
5211 }
5212
7f85441b
KG
5213 default:
5214 break;
8d08fdba 5215 }
8d08fdba 5216
8d08fdba
MS
5217 /* Anything not already handled and not a true memory reference
5218 is an error. */
3b2db49f
MM
5219 if (TREE_CODE (argtype) != FUNCTION_TYPE
5220 && TREE_CODE (argtype) != METHOD_TYPE
5221 && TREE_CODE (arg) != OFFSET_REF
5ade1ed2 5222 && !lvalue_or_else (arg, lv_addressof, complain))
8d08fdba
MS
5223 return error_mark_node;
5224
01240200
MM
5225 if (argtype != error_mark_node)
5226 argtype = build_pointer_type (argtype);
8d08fdba 5227
3b2db49f
MM
5228 /* In a template, we are processing a non-dependent expression
5229 so we can just form an ADDR_EXPR with the correct type. */
0f67bdf1 5230 if (processing_template_decl || TREE_CODE (arg) != COMPONENT_REF)
3b2db49f
MM
5231 {
5232 val = build_address (arg);
5233 if (TREE_CODE (arg) == OFFSET_REF)
5234 PTRMEM_OK_P (val) = PTRMEM_OK_P (arg);
5235 }
5236 else if (TREE_CODE (TREE_OPERAND (arg, 1)) == BASELINK)
5237 {
5238 tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1));
5239
5240 /* We can only get here with a single static member
5241 function. */
5242 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
5243 && DECL_STATIC_FUNCTION_P (fn));
5244 mark_used (fn);
5245 val = build_address (fn);
5246 if (TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
5247 /* Do not lose object's side effects. */
5248 val = build2 (COMPOUND_EXPR, TREE_TYPE (val),
5249 TREE_OPERAND (arg, 0), val);
5250 }
5251 else if (DECL_C_BIT_FIELD (TREE_OPERAND (arg, 1)))
5252 {
5ade1ed2
DG
5253 if (complain & tf_error)
5254 error ("attempt to take address of bit-field structure member %qD",
5255 TREE_OPERAND (arg, 1));
3b2db49f
MM
5256 return error_mark_node;
5257 }
5258 else
5259 {
5260 tree object = TREE_OPERAND (arg, 0);
5261 tree field = TREE_OPERAND (arg, 1);
5262 gcc_assert (same_type_ignoring_top_level_qualifiers_p
5263 (TREE_TYPE (object), decl_type_context (field)));
5264 val = build_address (arg);
5265 }
4ac14744 5266
3b2db49f
MM
5267 if (TREE_CODE (argtype) == POINTER_TYPE
5268 && TREE_CODE (TREE_TYPE (argtype)) == METHOD_TYPE)
5269 {
5270 build_ptrmemfunc_type (argtype);
5271 val = build_ptrmemfunc (argtype, val, 0,
135d47df
PC
5272 /*c_cast_p=*/false,
5273 tf_warning_or_error);
3b2db49f 5274 }
4ac14744 5275
3b2db49f 5276 return val;
7f85441b
KG
5277
5278 default:
5279 break;
8d08fdba
MS
5280 }
5281
5282 if (!errstring)
5283 {
5284 if (argtype == 0)
5285 argtype = TREE_TYPE (arg);
455f19cb 5286 return fold_if_not_in_template (build1 (code, argtype, arg));
8d08fdba
MS
5287 }
5288
5ade1ed2
DG
5289 if (complain & tf_error)
5290 error ("%s", errstring);
8d08fdba
MS
5291 return error_mark_node;
5292}
5293
5ade1ed2
DG
5294/* Hook for the c-common bits that build a unary op. */
5295tree
c9f9eb5d
AH
5296build_unary_op (location_t location ATTRIBUTE_UNUSED,
5297 enum tree_code code, tree xarg, int noconvert)
5ade1ed2
DG
5298{
5299 return cp_build_unary_op (code, xarg, noconvert, tf_warning_or_error);
5300}
5301
8d08fdba
MS
5302/* Apply unary lvalue-demanding operator CODE to the expression ARG
5303 for certain kinds of expressions which are not really lvalues
5304 but which we can accept as lvalues.
5305
dfb5c523
MM
5306 If ARG is not a kind of expression we can handle, return
5307 NULL_TREE. */
c8094d83 5308
8d08fdba 5309tree
acd8e2d0 5310unary_complex_lvalue (enum tree_code code, tree arg)
8d08fdba 5311{
dfb5c523
MM
5312 /* Inside a template, making these kinds of adjustments is
5313 pointless; we are only concerned with the type of the
5314 expression. */
5315 if (processing_template_decl)
5316 return NULL_TREE;
5317
8d08fdba
MS
5318 /* Handle (a, b) used as an "lvalue". */
5319 if (TREE_CODE (arg) == COMPOUND_EXPR)
5320 {
5ade1ed2
DG
5321 tree real_result = cp_build_unary_op (code, TREE_OPERAND (arg, 1), 0,
5322 tf_warning_or_error);
f293ce4b
RS
5323 return build2 (COMPOUND_EXPR, TREE_TYPE (real_result),
5324 TREE_OPERAND (arg, 0), real_result);
8d08fdba
MS
5325 }
5326
5327 /* Handle (a ? b : c) used as an "lvalue". */
e9a25f70
JL
5328 if (TREE_CODE (arg) == COND_EXPR
5329 || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR)
5ade1ed2 5330 return rationalize_conditional_expr (code, arg, tf_warning_or_error);
a4443a08 5331
ae818d3b 5332 /* Handle (a = b), (++a), and (--a) used as an "lvalue". */
e1cd6e56
MS
5333 if (TREE_CODE (arg) == MODIFY_EXPR
5334 || TREE_CODE (arg) == PREINCREMENT_EXPR
5335 || TREE_CODE (arg) == PREDECREMENT_EXPR)
ae818d3b
ER
5336 {
5337 tree lvalue = TREE_OPERAND (arg, 0);
5338 if (TREE_SIDE_EFFECTS (lvalue))
5339 {
5340 lvalue = stabilize_reference (lvalue);
f293ce4b
RS
5341 arg = build2 (TREE_CODE (arg), TREE_TYPE (arg),
5342 lvalue, TREE_OPERAND (arg, 1));
ae818d3b
ER
5343 }
5344 return unary_complex_lvalue
f293ce4b 5345 (code, build2 (COMPOUND_EXPR, TREE_TYPE (lvalue), arg, lvalue));
ae818d3b 5346 }
8d08fdba
MS
5347
5348 if (code != ADDR_EXPR)
33fd4f49 5349 return NULL_TREE;
8d08fdba
MS
5350
5351 /* Handle (a = b) used as an "lvalue" for `&'. */
5352 if (TREE_CODE (arg) == MODIFY_EXPR
5353 || TREE_CODE (arg) == INIT_EXPR)
5354 {
5ade1ed2
DG
5355 tree real_result = cp_build_unary_op (code, TREE_OPERAND (arg, 0), 0,
5356 tf_warning_or_error);
f293ce4b
RS
5357 arg = build2 (COMPOUND_EXPR, TREE_TYPE (real_result),
5358 arg, real_result);
6de9cd9a 5359 TREE_NO_WARNING (arg) = 1;
faf5394a 5360 return arg;
8d08fdba
MS
5361 }
5362
8d08fdba
MS
5363 if (TREE_CODE (TREE_TYPE (arg)) == FUNCTION_TYPE
5364 || TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
a5ac359a 5365 || TREE_CODE (arg) == OFFSET_REF)
6d05585b 5366 return NULL_TREE;
c8094d83 5367
8d08fdba
MS
5368 /* We permit compiler to make function calls returning
5369 objects of aggregate type look like lvalues. */
5370 {
5371 tree targ = arg;
5372
5373 if (TREE_CODE (targ) == SAVE_EXPR)
5374 targ = TREE_OPERAND (targ, 0);
5375
9e1e64ec 5376 if (TREE_CODE (targ) == CALL_EXPR && MAYBE_CLASS_TYPE_P (TREE_TYPE (targ)))
8d08fdba
MS
5377 {
5378 if (TREE_CODE (arg) == SAVE_EXPR)
5379 targ = arg;
5380 else
5566b478 5381 targ = build_cplus_new (TREE_TYPE (arg), arg);
f30432d7 5382 return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), targ);
8d08fdba
MS
5383 }
5384
5385 if (TREE_CODE (arg) == SAVE_EXPR && TREE_CODE (targ) == INDIRECT_REF)
f293ce4b 5386 return build3 (SAVE_EXPR, build_pointer_type (TREE_TYPE (arg)),
8d08fdba 5387 TREE_OPERAND (targ, 0), current_function_decl, NULL);
8d08fdba
MS
5388 }
5389
5390 /* Don't let anything else be handled specially. */
33fd4f49 5391 return NULL_TREE;
8d08fdba 5392}
8d08fdba
MS
5393\f
5394/* Mark EXP saying that we need to be able to take the
5395 address of it; it should not be allocated in a register.
dffd7eb6 5396 Value is true if successful.
8d08fdba 5397
4ac14744 5398 C++: we do not allow `current_class_ptr' to be addressable. */
8d08fdba 5399
dffd7eb6 5400bool
acd8e2d0 5401cxx_mark_addressable (tree exp)
8d08fdba 5402{
926ce8bd 5403 tree x = exp;
8d08fdba 5404
8d08fdba
MS
5405 while (1)
5406 switch (TREE_CODE (x))
5407 {
5408 case ADDR_EXPR:
5409 case COMPONENT_REF:
5410 case ARRAY_REF:
37c46b43
MS
5411 case REALPART_EXPR:
5412 case IMAGPART_EXPR:
8d08fdba
MS
5413 x = TREE_OPERAND (x, 0);
5414 break;
5415
5416 case PARM_DECL:
4ac14744 5417 if (x == current_class_ptr)
8d08fdba 5418 {
0cbd7506 5419 error ("cannot take the address of %<this%>, which is an rvalue expression");
f4f206f4 5420 TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later. */
dffd7eb6 5421 return true;
8d08fdba 5422 }
f4f206f4 5423 /* Fall through. */
aa8dea09 5424
8d08fdba 5425 case VAR_DECL:
8d08fdba
MS
5426 /* Caller should not be trying to mark initialized
5427 constant fields addressable. */
50bc768d
NS
5428 gcc_assert (DECL_LANG_SPECIFIC (x) == 0
5429 || DECL_IN_AGGR_P (x) == 0
5430 || TREE_STATIC (x)
5431 || DECL_EXTERNAL (x));
f4f206f4 5432 /* Fall through. */
8d08fdba
MS
5433
5434 case CONST_DECL:
5435 case RESULT_DECL:
9a3b49ac 5436 if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
1b8d7c9a 5437 && !DECL_ARTIFICIAL (x))
8ef36086 5438 {
7b09c6a4 5439 if (TREE_CODE (x) == VAR_DECL && DECL_HARD_REGISTER (x))
8ef36086
AP
5440 {
5441 error
5442 ("address of explicit register variable %qD requested", x);
5443 return false;
5444 }
778f6a08 5445 else if (extra_warnings)
8ef36086 5446 warning
b323323f 5447 (OPT_Wextra, "address requested for %qD, which is declared %<register%>", x);
8ef36086 5448 }
8d08fdba 5449 TREE_ADDRESSABLE (x) = 1;
dffd7eb6 5450 return true;
8d08fdba
MS
5451
5452 case FUNCTION_DECL:
8d08fdba 5453 TREE_ADDRESSABLE (x) = 1;
dffd7eb6 5454 return true;
8d08fdba 5455
e92cc029
MS
5456 case CONSTRUCTOR:
5457 TREE_ADDRESSABLE (x) = 1;
dffd7eb6 5458 return true;
e92cc029 5459
9a3b49ac
MS
5460 case TARGET_EXPR:
5461 TREE_ADDRESSABLE (x) = 1;
dffd7eb6
NB
5462 cxx_mark_addressable (TREE_OPERAND (x, 0));
5463 return true;
9a3b49ac 5464
8d08fdba 5465 default:
dffd7eb6 5466 return true;
8d08fdba
MS
5467 }
5468}
5469\f
5470/* Build and return a conditional expression IFEXP ? OP1 : OP2. */
5471
5472tree
5ade1ed2
DG
5473build_x_conditional_expr (tree ifexp, tree op1, tree op2,
5474 tsubst_flags_t complain)
8d08fdba 5475{
d17811fd
MM
5476 tree orig_ifexp = ifexp;
5477 tree orig_op1 = op1;
5478 tree orig_op2 = op2;
5479 tree expr;
5480
5156628f 5481 if (processing_template_decl)
d17811fd
MM
5482 {
5483 /* The standard says that the expression is type-dependent if
5484 IFEXP is type-dependent, even though the eventual type of the
5485 expression doesn't dependent on IFEXP. */
5486 if (type_dependent_expression_p (ifexp)
18fd68a8
MM
5487 /* As a GNU extension, the middle operand may be omitted. */
5488 || (op1 && type_dependent_expression_p (op1))
d17811fd
MM
5489 || type_dependent_expression_p (op2))
5490 return build_min_nt (COND_EXPR, ifexp, op1, op2);
5491 ifexp = build_non_dependent_expr (ifexp);
18fd68a8
MM
5492 if (op1)
5493 op1 = build_non_dependent_expr (op1);
d17811fd
MM
5494 op2 = build_non_dependent_expr (op2);
5495 }
5566b478 5496
5ade1ed2 5497 expr = build_conditional_expr (ifexp, op1, op2, complain);
d17811fd 5498 if (processing_template_decl && expr != error_mark_node)
c8094d83 5499 return build_min_non_dep (COND_EXPR, expr,
8e1daa34 5500 orig_ifexp, orig_op1, orig_op2);
d17811fd 5501 return expr;
8d08fdba
MS
5502}
5503\f
c7b62f14 5504/* Given a list of expressions, return a compound expression
04c06002 5505 that performs them all and returns the value of the last of them. */
c7b62f14 5506
2f5b91f5 5507tree
d555b1c7
PC
5508build_x_compound_expr_from_list (tree list, expr_list_kind exp,
5509 tsubst_flags_t complain)
c7b62f14
NS
5510{
5511 tree expr = TREE_VALUE (list);
c8094d83 5512
c7b62f14
NS
5513 if (TREE_CHAIN (list))
5514 {
d555b1c7
PC
5515 if (complain & tf_error)
5516 switch (exp)
5517 {
2f5b91f5
SZ
5518 case ELK_INIT:
5519 permerror (input_location, "expression list treated as compound "
5520 "expression in initializer");
5521 break;
5522 case ELK_MEM_INIT:
5523 permerror (input_location, "expression list treated as compound "
5524 "expression in mem-initializer");
5525 break;
5526 case ELK_FUNC_CAST:
5527 permerror (input_location, "expression list treated as compound "
5528 "expression in functional cast");
5529 break;
5530 default:
5531 gcc_unreachable ();
d555b1c7 5532 }
c7b62f14
NS
5533
5534 for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
5ade1ed2 5535 expr = build_x_compound_expr (expr, TREE_VALUE (list),
d555b1c7 5536 complain);
c7b62f14 5537 }
c8094d83 5538
c7b62f14
NS
5539 return expr;
5540}
5541
c166b898
ILT
5542/* Like build_x_compound_expr_from_list, but using a VEC. */
5543
5544tree
5545build_x_compound_expr_from_vec (VEC(tree,gc) *vec, const char *msg)
5546{
5547 if (VEC_empty (tree, vec))
5548 return NULL_TREE;
5549 else if (VEC_length (tree, vec) == 1)
5550 return VEC_index (tree, vec, 0);
5551 else
5552 {
5553 tree expr;
5554 unsigned int ix;
5555 tree t;
5556
5557 if (msg != NULL)
5558 permerror (input_location,
5559 "%s expression list treated as compound expression",
5560 msg);
5561
5562 expr = VEC_index (tree, vec, 0);
5563 for (ix = 1; VEC_iterate (tree, vec, ix, t); ++ix)
5564 expr = build_x_compound_expr (expr, t, tf_warning_or_error);
5565
5566 return expr;
5567 }
5568}
5569
c7b62f14 5570/* Handle overloading of the ',' operator when needed. */
e92cc029 5571
8d08fdba 5572tree
5ade1ed2 5573build_x_compound_expr (tree op1, tree op2, tsubst_flags_t complain)
8d08fdba 5574{
8d08fdba 5575 tree result;
d17811fd
MM
5576 tree orig_op1 = op1;
5577 tree orig_op2 = op2;
8d08fdba 5578
5156628f 5579 if (processing_template_decl)
d17811fd
MM
5580 {
5581 if (type_dependent_expression_p (op1)
5582 || type_dependent_expression_p (op2))
5583 return build_min_nt (COMPOUND_EXPR, op1, op2);
5584 op1 = build_non_dependent_expr (op1);
5585 op2 = build_non_dependent_expr (op2);
5586 }
b19b4a78 5587
ec835fb2 5588 result = build_new_op (COMPOUND_EXPR, LOOKUP_NORMAL, op1, op2, NULL_TREE,
5ade1ed2 5589 /*overloaded_p=*/NULL, complain);
d17811fd 5590 if (!result)
525521b6 5591 result = cp_build_compound_expr (op1, op2, complain);
b19b4a78 5592
d17811fd 5593 if (processing_template_decl && result != error_mark_node)
8e1daa34 5594 return build_min_non_dep (COMPOUND_EXPR, result, orig_op1, orig_op2);
c8094d83 5595
d17811fd 5596 return result;
8d08fdba
MS
5597}
5598
525521b6
DG
5599/* Like cp_build_compound_expr, but for the c-common bits. */
5600
5601tree
c2255bc4 5602build_compound_expr (location_t loc ATTRIBUTE_UNUSED, tree lhs, tree rhs)
525521b6
DG
5603{
5604 return cp_build_compound_expr (lhs, rhs, tf_warning_or_error);
5605}
5606
04c06002 5607/* Build a compound expression. */
8d08fdba
MS
5608
5609tree
525521b6 5610cp_build_compound_expr (tree lhs, tree rhs, tsubst_flags_t complain)
8d08fdba 5611{
ebeb2c24 5612 lhs = convert_to_void (lhs, ICV_LEFT_OF_COMMA, complain);
c8094d83 5613
c7b62f14 5614 if (lhs == error_mark_node || rhs == error_mark_node)
66543169 5615 return error_mark_node;
c8094d83 5616
d340e53f
NS
5617 if (TREE_CODE (rhs) == TARGET_EXPR)
5618 {
5619 /* If the rhs is a TARGET_EXPR, then build the compound
0cbd7506 5620 expression inside the target_expr's initializer. This
cd0be382 5621 helps the compiler to eliminate unnecessary temporaries. */
d340e53f 5622 tree init = TREE_OPERAND (rhs, 1);
c8094d83 5623
f293ce4b 5624 init = build2 (COMPOUND_EXPR, TREE_TYPE (init), lhs, init);
d340e53f 5625 TREE_OPERAND (rhs, 1) = init;
c8094d83 5626
d340e53f
NS
5627 return rhs;
5628 }
c8094d83 5629
95e20768
NS
5630 if (type_unknown_p (rhs))
5631 {
5632 error ("no context to resolve type of %qE", rhs);
5633 return error_mark_node;
5634 }
5635
f293ce4b 5636 return build2 (COMPOUND_EXPR, TREE_TYPE (rhs), lhs, rhs);
8d08fdba
MS
5637}
5638
33c25e5c 5639/* Issue a diagnostic message if casting from SRC_TYPE to DEST_TYPE
36ef7262
MLI
5640 casts away constness. CAST gives the type of cast.
5641
5642 ??? This function warns for casting away any qualifier not just
5643 const. We would like to specify exactly what qualifiers are casted
5644 away.
5645*/
3fe18f1d
MM
5646
5647static void
a5ac359a 5648check_for_casting_away_constness (tree src_type, tree dest_type,
86b7b98b 5649 enum tree_code cast)
3fe18f1d 5650{
86b7b98b
MLI
5651 /* C-style casts are allowed to cast away constness. With
5652 WARN_CAST_QUAL, we still want to issue a warning. */
5653 if (cast == CAST_EXPR && !warn_cast_qual)
5654 return;
5655
36ef7262
MLI
5656 if (!casts_away_constness (src_type, dest_type))
5657 return;
5658
5659 switch (cast)
5660 {
5661 case CAST_EXPR:
5662 warning (OPT_Wcast_qual,
5663 "cast from type %qT to type %qT casts away qualifiers",
86b7b98b 5664 src_type, dest_type);
36ef7262
MLI
5665 return;
5666
5667 case STATIC_CAST_EXPR:
5668 error ("static_cast from type %qT to type %qT casts away qualifiers",
5669 src_type, dest_type);
5670 return;
5671
5672 case REINTERPRET_CAST_EXPR:
5673 error ("reinterpret_cast from type %qT to type %qT casts away qualifiers",
5674 src_type, dest_type);
5675 return;
5676 default:
5677 gcc_unreachable();
5678 }
3fe18f1d
MM
5679}
5680
08e17d9d
MM
5681/* Convert EXPR (an expression with pointer-to-member type) to TYPE
5682 (another pointer-to-member type in the same hierarchy) and return
5683 the converted expression. If ALLOW_INVERSE_P is permitted, a
5684 pointer-to-derived may be converted to pointer-to-base; otherwise,
5685 only the other direction is permitted. If C_CAST_P is true, this
5686 conversion is taking place as part of a C-style cast. */
5687
c8094d83 5688tree
08e17d9d 5689convert_ptrmem (tree type, tree expr, bool allow_inverse_p,
135d47df 5690 bool c_cast_p, tsubst_flags_t complain)
08e17d9d
MM
5691{
5692 if (TYPE_PTRMEM_P (type))
5693 {
5694 tree delta;
5695
5696 if (TREE_CODE (expr) == PTRMEM_CST)
5697 expr = cplus_expand_constant (expr);
5698 delta = get_delta_difference (TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (expr)),
c8094d83 5699 TYPE_PTRMEM_CLASS_TYPE (type),
08e17d9d 5700 allow_inverse_p,
135d47df
PC
5701 c_cast_p, complain);
5702 if (delta == error_mark_node)
5703 return error_mark_node;
5704
08e17d9d 5705 if (!integer_zerop (delta))
6e03b280
OW
5706 {
5707 tree cond, op1, op2;
5708
ba47d38d
AH
5709 cond = cp_build_binary_op (input_location,
5710 EQ_EXPR,
6e03b280 5711 expr,
5ade1ed2
DG
5712 build_int_cst (TREE_TYPE (expr), -1),
5713 tf_warning_or_error);
6e03b280 5714 op1 = build_nop (ptrdiff_type_node, expr);
ba47d38d
AH
5715 op2 = cp_build_binary_op (input_location,
5716 PLUS_EXPR, op1, delta,
5ade1ed2 5717 tf_warning_or_error);
6e03b280 5718
db3927fb
AH
5719 expr = fold_build3_loc (input_location,
5720 COND_EXPR, ptrdiff_type_node, cond, op1, op2);
6e03b280
OW
5721
5722 }
5723
08e17d9d
MM
5724 return build_nop (type, expr);
5725 }
5726 else
c8094d83 5727 return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr,
135d47df 5728 allow_inverse_p, c_cast_p, complain);
08e17d9d
MM
5729}
5730
822971c1 5731/* If EXPR is an INTEGER_CST and ORIG is an arithmetic constant, return
dc569621
RS
5732 a version of EXPR that has TREE_OVERFLOW set if it is set in ORIG.
5733 Otherwise, return EXPR unchanged. */
822971c1
JJ
5734
5735static tree
5736ignore_overflows (tree expr, tree orig)
5737{
5738 if (TREE_CODE (expr) == INTEGER_CST
5739 && CONSTANT_CLASS_P (orig)
5740 && TREE_CODE (orig) != STRING_CST
dc569621 5741 && TREE_OVERFLOW (expr) != TREE_OVERFLOW (orig))
822971c1 5742 {
dc569621 5743 if (!TREE_OVERFLOW (orig))
822971c1
JJ
5744 /* Ensure constant sharing. */
5745 expr = build_int_cst_wide (TREE_TYPE (expr),
5746 TREE_INT_CST_LOW (expr),
5747 TREE_INT_CST_HIGH (expr));
5748 else
5749 {
5750 /* Avoid clobbering a shared constant. */
5751 expr = copy_node (expr);
5752 TREE_OVERFLOW (expr) = TREE_OVERFLOW (orig);
822971c1
JJ
5753 }
5754 }
5755 return expr;
5756}
5757
33c25e5c
MM
5758/* Perform a static_cast from EXPR to TYPE. When C_CAST_P is true,
5759 this static_cast is being attempted as one of the possible casts
5760 allowed by a C-style cast. (In that case, accessibility of base
5761 classes is not considered, and it is OK to cast away
5762 constness.) Return the result of the cast. *VALID_P is set to
5763 indicate whether or not the cast was valid. */
3fe18f1d 5764
33c25e5c
MM
5765static tree
5766build_static_cast_1 (tree type, tree expr, bool c_cast_p,
5ade1ed2 5767 bool *valid_p, tsubst_flags_t complain)
a4443a08 5768{
00bb3dad 5769 tree intype;
3fe18f1d 5770 tree result;
33c25e5c 5771 tree orig;
c11b6f21 5772
33c25e5c
MM
5773 /* Assume the cast is valid. */
5774 *valid_p = true;
c11b6f21 5775
3fe18f1d 5776 intype = TREE_TYPE (expr);
c11b6f21 5777
8d8d1a28
AH
5778 /* Save casted types in the function's used types hash table. */
5779 used_types_insert (type);
5780
3fe18f1d 5781 /* [expr.static.cast]
c11b6f21 5782
3fe18f1d
MM
5783 An lvalue of type "cv1 B", where B is a class type, can be cast
5784 to type "reference to cv2 D", where D is a class derived (clause
5785 _class.derived_) from B, if a valid standard conversion from
5786 "pointer to D" to "pointer to B" exists (_conv.ptr_), cv2 is the
5787 same cv-qualification as, or greater cv-qualification than, cv1,
5788 and B is not a virtual base class of D. */
0a72704b
MM
5789 /* We check this case before checking the validity of "TYPE t =
5790 EXPR;" below because for this case:
5791
5792 struct B {};
5793 struct D : public B { D(const B&); };
5794 extern B& b;
5795 void f() { static_cast<const D&>(b); }
5796
5797 we want to avoid constructing a new D. The standard is not
5798 completely clear about this issue, but our interpretation is
5799 consistent with other compilers. */
3fe18f1d
MM
5800 if (TREE_CODE (type) == REFERENCE_TYPE
5801 && CLASS_TYPE_P (TREE_TYPE (type))
5802 && CLASS_TYPE_P (intype)
9771799c 5803 && (TYPE_REF_IS_RVALUE (type) || real_lvalue_p (expr))
3fe18f1d
MM
5804 && DERIVED_FROM_P (intype, TREE_TYPE (type))
5805 && can_convert (build_pointer_type (TYPE_MAIN_VARIANT (intype)),
c8094d83 5806 build_pointer_type (TYPE_MAIN_VARIANT
3fe18f1d 5807 (TREE_TYPE (type))))
33c25e5c
MM
5808 && (c_cast_p
5809 || at_least_as_qualified_p (TREE_TYPE (type), intype)))
c11b6f21 5810 {
33c25e5c
MM
5811 tree base;
5812
385bce06 5813 /* There is a standard conversion from "D*" to "B*" even if "B"
33c25e5c
MM
5814 is ambiguous or inaccessible. If this is really a
5815 static_cast, then we check both for inaccessibility and
5816 ambiguity. However, if this is a static_cast being performed
5817 because the user wrote a C-style cast, then accessibility is
5818 not considered. */
c8094d83
MS
5819 base = lookup_base (TREE_TYPE (type), intype,
5820 c_cast_p ? ba_unique : ba_check,
33c25e5c 5821 NULL);
3fe18f1d 5822
385bce06
MM
5823 /* Convert from "B*" to "D*". This function will check that "B"
5824 is not a virtual base of "D". */
c8094d83 5825 expr = build_base_path (MINUS_EXPR, build_address (expr),
3fe18f1d 5826 base, /*nonnull=*/false);
3a73bcc6
MM
5827 /* Convert the pointer to a reference -- but then remember that
5828 there are no expressions with reference type in C++. */
9771799c 5829 return convert_from_reference (cp_fold_convert (type, expr));
c11b6f21 5830 }
3fe18f1d 5831
e7f1930f
JM
5832 /* "An lvalue of type cv1 T1 can be cast to type rvalue reference to
5833 cv2 T2 if cv2 T2 is reference-compatible with cv1 T1 (8.5.3)." */
5834 if (TREE_CODE (type) == REFERENCE_TYPE
5835 && TYPE_REF_IS_RVALUE (type)
5836 && real_lvalue_p (expr)
5837 && reference_related_p (TREE_TYPE (type), intype)
5838 && (c_cast_p || at_least_as_qualified_p (TREE_TYPE (type), intype)))
5839 {
5840 expr = build_typed_address (expr, type);
5841 return convert_from_reference (expr);
5842 }
5843
33c25e5c
MM
5844 orig = expr;
5845
7bead48f
JM
5846 /* Resolve overloaded address here rather than once in
5847 implicit_conversion and again in the inverse code below. */
5848 if (TYPE_PTRMEMFUNC_P (type) && type_unknown_p (expr))
5849 {
5850 expr = instantiate_type (type, expr, complain);
5851 intype = TREE_TYPE (expr);
5852 }
5853
0a72704b
MM
5854 /* [expr.static.cast]
5855
5856 An expression e can be explicitly converted to a type T using a
5857 static_cast of the form static_cast<T>(e) if the declaration T
5858 t(e);" is well-formed, for some invented temporary variable
5859 t. */
33c25e5c 5860 result = perform_direct_initialization_if_possible (type, expr,
5ade1ed2 5861 c_cast_p, complain);
0a72704b 5862 if (result)
109e0040
MM
5863 {
5864 result = convert_from_reference (result);
33c25e5c
MM
5865
5866 /* Ignore any integer overflow caused by the cast. */
822971c1
JJ
5867 result = ignore_overflows (result, orig);
5868
109e0040
MM
5869 /* [expr.static.cast]
5870
0cbd7506 5871 If T is a reference type, the result is an lvalue; otherwise,
109e0040 5872 the result is an rvalue. */
5cc53d4e
MM
5873 if (TREE_CODE (type) != REFERENCE_TYPE)
5874 result = rvalue (result);
109e0040
MM
5875 return result;
5876 }
c8094d83 5877
0a72704b
MM
5878 /* [expr.static.cast]
5879
5880 Any expression can be explicitly converted to type cv void. */
5881 if (TREE_CODE (type) == VOID_TYPE)
ebeb2c24 5882 return convert_to_void (expr, ICV_CAST, complain);
0a72704b 5883
3fe18f1d
MM
5884 /* [expr.static.cast]
5885
5886 The inverse of any standard conversion sequence (clause _conv_),
5887 other than the lvalue-to-rvalue (_conv.lval_), array-to-pointer
5888 (_conv.array_), function-to-pointer (_conv.func_), and boolean
5889 (_conv.bool_) conversions, can be performed explicitly using
5890 static_cast subject to the restriction that the explicit
5891 conversion does not cast away constness (_expr.const.cast_), and
5892 the following additional rules for specific cases: */
5893 /* For reference, the conversions not excluded are: integral
5894 promotions, floating point promotion, integral conversions,
5895 floating point conversions, floating-integral conversions,
5896 pointer conversions, and pointer to member conversions. */
a10ce2f8 5897 /* DR 128
c8094d83 5898
a10ce2f8
GK
5899 A value of integral _or enumeration_ type can be explicitly
5900 converted to an enumeration type. */
5901 /* The effect of all that is that any conversion between any two
5902 types which are integral, floating, or enumeration types can be
5903 performed. */
550a799d
JM
5904 if ((INTEGRAL_OR_ENUMERATION_TYPE_P (type)
5905 || SCALAR_FLOAT_TYPE_P (type))
5906 && (INTEGRAL_OR_ENUMERATION_TYPE_P (intype)
5907 || SCALAR_FLOAT_TYPE_P (intype)))
33c25e5c 5908 {
33c25e5c
MM
5909 expr = ocp_convert (type, expr, CONV_C_CAST, LOOKUP_NORMAL);
5910
5911 /* Ignore any integer overflow caused by the cast. */
822971c1 5912 expr = ignore_overflows (expr, orig);
33c25e5c
MM
5913 return expr;
5914 }
5915
3fe18f1d
MM
5916 if (TYPE_PTR_P (type) && TYPE_PTR_P (intype)
5917 && CLASS_TYPE_P (TREE_TYPE (type))
5918 && CLASS_TYPE_P (TREE_TYPE (intype))
c8094d83
MS
5919 && can_convert (build_pointer_type (TYPE_MAIN_VARIANT
5920 (TREE_TYPE (intype))),
5921 build_pointer_type (TYPE_MAIN_VARIANT
3fe18f1d 5922 (TREE_TYPE (type)))))
999cc24c 5923 {
3fe18f1d
MM
5924 tree base;
5925
33c25e5c 5926 if (!c_cast_p)
86b7b98b 5927 check_for_casting_away_constness (intype, type, STATIC_CAST_EXPR);
c8094d83
MS
5928 base = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
5929 c_cast_p ? ba_unique : ba_check,
385bce06 5930 NULL);
3fe18f1d 5931 return build_base_path (MINUS_EXPR, expr, base, /*nonnull=*/false);
999cc24c 5932 }
c8094d83 5933
3fe18f1d
MM
5934 if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
5935 || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
5936 {
5937 tree c1;
5938 tree c2;
5939 tree t1;
5940 tree t2;
c11b6f21 5941
3fe18f1d
MM
5942 c1 = TYPE_PTRMEM_CLASS_TYPE (intype);
5943 c2 = TYPE_PTRMEM_CLASS_TYPE (type);
5944
5945 if (TYPE_PTRMEM_P (type))
5946 {
c8094d83 5947 t1 = (build_ptrmem_type
3fe18f1d
MM
5948 (c1,
5949 TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (intype))));
c8094d83 5950 t2 = (build_ptrmem_type
3fe18f1d
MM
5951 (c2,
5952 TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (type))));
5953 }
5954 else
5955 {
5956 t1 = intype;
5957 t2 = type;
5958 }
6e03b280 5959 if (can_convert (t1, t2) || can_convert (t2, t1))
3fe18f1d 5960 {
33c25e5c 5961 if (!c_cast_p)
86b7b98b 5962 check_for_casting_away_constness (intype, type, STATIC_CAST_EXPR);
08e17d9d 5963 return convert_ptrmem (type, expr, /*allow_inverse_p=*/1,
135d47df 5964 c_cast_p, tf_warning_or_error);
3fe18f1d
MM
5965 }
5966 }
c8094d83 5967
af7b9902
MM
5968 /* [expr.static.cast]
5969
3fe18f1d
MM
5970 An rvalue of type "pointer to cv void" can be explicitly
5971 converted to a pointer to object type. A value of type pointer
5972 to object converted to "pointer to cv void" and back to the
5973 original pointer type will have its original value. */
c8094d83 5974 if (TREE_CODE (intype) == POINTER_TYPE
3fe18f1d
MM
5975 && VOID_TYPE_P (TREE_TYPE (intype))
5976 && TYPE_PTROB_P (type))
af7b9902 5977 {
33c25e5c 5978 if (!c_cast_p)
86b7b98b 5979 check_for_casting_away_constness (intype, type, STATIC_CAST_EXPR);
3fe18f1d 5980 return build_nop (type, expr);
af7b9902
MM
5981 }
5982
33c25e5c 5983 *valid_p = false;
c11b6f21 5984 return error_mark_node;
a4443a08
MS
5985}
5986
33c25e5c
MM
5987/* Return an expression representing static_cast<TYPE>(EXPR). */
5988
cdf5b885 5989tree
5ade1ed2 5990build_static_cast (tree type, tree expr, tsubst_flags_t complain)
a4443a08 5991{
33c25e5c
MM
5992 tree result;
5993 bool valid_p;
c11b6f21
MS
5994
5995 if (type == error_mark_node || expr == error_mark_node)
5996 return error_mark_node;
5997
5156628f 5998 if (processing_template_decl)
5566b478 5999 {
33c25e5c
MM
6000 expr = build_min (STATIC_CAST_EXPR, type, expr);
6001 /* We don't know if it will or will not have side effects. */
6002 TREE_SIDE_EFFECTS (expr) = 1;
e8c66fe0 6003 return convert_from_reference (expr);
5566b478
MS
6004 }
6005
33c25e5c
MM
6006 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
6007 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
6008 if (TREE_CODE (type) != REFERENCE_TYPE
6009 && TREE_CODE (expr) == NOP_EXPR
6010 && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
6011 expr = TREE_OPERAND (expr, 0);
c11b6f21 6012
5ade1ed2
DG
6013 result = build_static_cast_1 (type, expr, /*c_cast_p=*/false, &valid_p,
6014 complain);
33c25e5c
MM
6015 if (valid_p)
6016 return result;
6017
5ade1ed2
DG
6018 if (complain & tf_error)
6019 error ("invalid static_cast from type %qT to type %qT",
6020 TREE_TYPE (expr), type);
33c25e5c
MM
6021 return error_mark_node;
6022}
6023
6024/* EXPR is an expression with member function or pointer-to-member
6025 function type. TYPE is a pointer type. Converting EXPR to TYPE is
6026 not permitted by ISO C++, but we accept it in some modes. If we
6027 are not in one of those modes, issue a diagnostic. Return the
6028 converted expression. */
6029
6030tree
6031convert_member_func_to_ptr (tree type, tree expr)
6032{
6033 tree intype;
6034 tree decl;
c11b6f21 6035
c11b6f21 6036 intype = TREE_TYPE (expr);
33c25e5c
MM
6037 gcc_assert (TYPE_PTRMEMFUNC_P (intype)
6038 || TREE_CODE (intype) == METHOD_TYPE);
a80e4195 6039
33c25e5c 6040 if (pedantic || warn_pmf2ptr)
509c9d60 6041 pedwarn (input_location, pedantic ? OPT_pedantic : OPT_Wpmf_conversions,
fcf73884 6042 "converting from %qT to %qT", intype, type);
c8094d83 6043
33c25e5c
MM
6044 if (TREE_CODE (intype) == METHOD_TYPE)
6045 expr = build_addr_func (expr);
6046 else if (TREE_CODE (expr) == PTRMEM_CST)
6047 expr = build_address (PTRMEM_CST_MEMBER (expr));
6048 else
6049 {
6050 decl = maybe_dummy_object (TYPE_PTRMEM_CLASS_TYPE (intype), 0);
6051 decl = build_address (decl);
6052 expr = get_member_function_from_ptrfunc (&decl, expr);
6053 }
6054
6055 return build_nop (type, expr);
6056}
6057
6058/* Return a representation for a reinterpret_cast from EXPR to TYPE.
6059 If C_CAST_P is true, this reinterpret cast is being done as part of
6060 a C-style cast. If VALID_P is non-NULL, *VALID_P is set to
6061 indicate whether or not reinterpret_cast was valid. */
6062
6063static tree
6064build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
5ade1ed2 6065 bool *valid_p, tsubst_flags_t complain)
33c25e5c
MM
6066{
6067 tree intype;
6068
6069 /* Assume the cast is invalid. */
6070 if (valid_p)
6071 *valid_p = true;
6072
6073 if (type == error_mark_node || error_operand_p (expr))
a8c2c492
AP
6074 return error_mark_node;
6075
33c25e5c
MM
6076 intype = TREE_TYPE (expr);
6077
8d8d1a28
AH
6078 /* Save casted types in the function's used types hash table. */
6079 used_types_insert (type);
6080
33c25e5c
MM
6081 /* [expr.reinterpret.cast]
6082 An lvalue expression of type T1 can be cast to the type
6083 "reference to T2" if an expression of type "pointer to T1" can be
6084 explicitly converted to the type "pointer to T2" using a
6085 reinterpret_cast. */
c11b6f21
MS
6086 if (TREE_CODE (type) == REFERENCE_TYPE)
6087 {
6088 if (! real_lvalue_p (expr))
6089 {
5ade1ed2
DG
6090 if (complain & tf_error)
6091 error ("invalid cast of an rvalue expression of type "
6092 "%qT to type %qT",
6093 intype, type);
c11b6f21
MS
6094 return error_mark_node;
6095 }
33c25e5c
MM
6096
6097 /* Warn about a reinterpret_cast from "A*" to "B&" if "A" and
6098 "B" are related class types; the reinterpret_cast does not
6099 adjust the pointer. */
6100 if (TYPE_PTR_P (intype)
5ade1ed2 6101 && (complain & tf_warning)
96d84882
PB
6102 && (comptypes (TREE_TYPE (intype), TREE_TYPE (type),
6103 COMPARE_BASE | COMPARE_DERIVED)))
d4ee4d25 6104 warning (0, "casting %qT to %qT does not dereference pointer",
33c25e5c
MM
6105 intype, type);
6106
5ade1ed2 6107 expr = cp_build_unary_op (ADDR_EXPR, expr, 0, complain);
45fe7947
JM
6108
6109 if (warn_strict_aliasing > 2)
6110 strict_aliasing_warning (TREE_TYPE (expr), type, expr);
6111
c11b6f21 6112 if (expr != error_mark_node)
33c25e5c 6113 expr = build_reinterpret_cast_1
ec7e5618 6114 (build_pointer_type (TREE_TYPE (type)), expr, c_cast_p,
5ade1ed2 6115 valid_p, complain);
c11b6f21 6116 if (expr != error_mark_node)
45fe7947
JM
6117 /* cp_build_indirect_ref isn't right for rvalue refs. */
6118 expr = convert_from_reference (fold_convert (type, expr));
c11b6f21
MS
6119 return expr;
6120 }
8ccc31eb 6121
33c25e5c
MM
6122 /* As a G++ extension, we consider conversions from member
6123 functions, and pointers to member functions to
6124 pointer-to-function and pointer-to-void types. If
6125 -Wno-pmf-conversions has not been specified,
6126 convert_member_func_to_ptr will issue an error message. */
c8094d83 6127 if ((TYPE_PTRMEMFUNC_P (intype)
33c25e5c
MM
6128 || TREE_CODE (intype) == METHOD_TYPE)
6129 && TYPE_PTR_P (type)
6130 && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
6131 || VOID_TYPE_P (TREE_TYPE (type))))
6132 return convert_member_func_to_ptr (type, expr);
6133
5acd0bed 6134 /* If the cast is not to a reference type, the lvalue-to-rvalue,
33c25e5c
MM
6135 array-to-pointer, and function-to-pointer conversions are
6136 performed. */
6137 expr = decay_conversion (expr);
c8094d83 6138
33c25e5c
MM
6139 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
6140 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
6141 if (TREE_CODE (expr) == NOP_EXPR
6142 && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
6143 expr = TREE_OPERAND (expr, 0);
6144
6145 if (error_operand_p (expr))
6146 return error_mark_node;
6147
6148 intype = TREE_TYPE (expr);
6149
6150 /* [expr.reinterpret.cast]
6151 A pointer can be converted to any integral type large enough to
14c2101d
JM
6152 hold it. ... A value of type std::nullptr_t can be converted to
6153 an integral type; the conversion has the same meaning and
6154 validity as a conversion of (void*)0 to the integral type. */
6155 if (CP_INTEGRAL_TYPE_P (type)
5116acc6 6156 && (TYPE_PTR_P (intype) || NULLPTR_TYPE_P (intype)))
8ccc31eb 6157 {
c11b6f21 6158 if (TYPE_PRECISION (type) < TYPE_PRECISION (intype))
5ade1ed2
DG
6159 {
6160 if (complain & tf_error)
cbe5f3b3 6161 permerror (input_location, "cast from %qT to %qT loses precision",
37ec60ed 6162 intype, type);
5ade1ed2
DG
6163 else
6164 return error_mark_node;
6165 }
5116acc6 6166 if (NULLPTR_TYPE_P (intype))
14c2101d 6167 return build_int_cst (type, 0);
8ccc31eb 6168 }
33c25e5c
MM
6169 /* [expr.reinterpret.cast]
6170 A value of integral or enumeration type can be explicitly
6171 converted to a pointer. */
6172 else if (TYPE_PTR_P (type) && INTEGRAL_OR_ENUMERATION_TYPE_P (intype))
6173 /* OK */
6174 ;
c11b6f21
MS
6175 else if ((TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype))
6176 || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
8a784e4a 6177 return fold_if_not_in_template (build_nop (type, expr));
c11b6f21
MS
6178 else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
6179 || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
8ccc31eb 6180 {
de9c56a4
RG
6181 tree sexpr = expr;
6182
33c25e5c 6183 if (!c_cast_p)
86b7b98b 6184 check_for_casting_away_constness (intype, type, REINTERPRET_CAST_EXPR);
33c25e5c
MM
6185 /* Warn about possible alignment problems. */
6186 if (STRICT_ALIGNMENT && warn_cast_align
5ade1ed2 6187 && (complain & tf_warning)
33c25e5c
MM
6188 && !VOID_TYPE_P (type)
6189 && TREE_CODE (TREE_TYPE (intype)) != FUNCTION_TYPE
6190 && COMPLETE_TYPE_P (TREE_TYPE (type))
6191 && COMPLETE_TYPE_P (TREE_TYPE (intype))
6192 && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (intype)))
683d6ff9
MLI
6193 warning (OPT_Wcast_align, "cast from %qT to %qT "
6194 "increases required alignment of target type", intype, type);
c8094d83 6195
3b426391 6196 /* We need to strip nops here, because the front end likes to
de9c56a4
RG
6197 create (int *)&a for array-to-pointer decay, instead of &a[0]. */
6198 STRIP_NOPS (sexpr);
79bedddc
SR
6199 if (warn_strict_aliasing <= 2)
6200 strict_aliasing_warning (intype, type, sexpr);
de9c56a4 6201
455f19cb 6202 return fold_if_not_in_template (build_nop (type, expr));
8ccc31eb 6203 }
ffb690bd 6204 else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
a06d48ef 6205 || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type)))
ffb690bd 6206 {
5ade1ed2 6207 if (pedantic && (complain & tf_warning))
ec7e5618 6208 /* Only issue a warning, as we have always supported this
0cbd7506
MS
6209 where possible, and it is necessary in some cases. DR 195
6210 addresses this issue, but as of 2004/10/26 is still in
6211 drafting. */
6212 warning (0, "ISO C++ forbids casting between pointer-to-function and pointer-to-object");
455f19cb 6213 return fold_if_not_in_template (build_nop (type, expr));
ffb690bd 6214 }
08e17d9d
MM
6215 else if (TREE_CODE (type) == VECTOR_TYPE)
6216 return fold_if_not_in_template (convert_to_vector (type, expr));
550a799d
JM
6217 else if (TREE_CODE (intype) == VECTOR_TYPE
6218 && INTEGRAL_OR_ENUMERATION_TYPE_P (type))
257d5f32 6219 return fold_if_not_in_template (convert_to_integer (type, expr));
c11b6f21 6220 else
8ccc31eb 6221 {
33c25e5c
MM
6222 if (valid_p)
6223 *valid_p = false;
5ade1ed2
DG
6224 if (complain & tf_error)
6225 error ("invalid cast from type %qT to type %qT", intype, type);
8ccc31eb
MS
6226 return error_mark_node;
6227 }
c8094d83 6228
37c46b43 6229 return cp_convert (type, expr);
a4443a08
MS
6230}
6231
cdf5b885 6232tree
5ade1ed2 6233build_reinterpret_cast (tree type, tree expr, tsubst_flags_t complain)
a4443a08 6234{
f30432d7
MS
6235 if (type == error_mark_node || expr == error_mark_node)
6236 return error_mark_node;
6237
5156628f 6238 if (processing_template_decl)
e92cc029 6239 {
33c25e5c 6240 tree t = build_min (REINTERPRET_CAST_EXPR, type, expr);
c8094d83 6241
8e1daa34
NS
6242 if (!TREE_SIDE_EFFECTS (t)
6243 && type_dependent_expression_p (expr))
6244 /* There might turn out to be side effects inside expr. */
6245 TREE_SIDE_EFFECTS (t) = 1;
e8c66fe0 6246 return convert_from_reference (t);
e92cc029
MS
6247 }
6248
33c25e5c 6249 return build_reinterpret_cast_1 (type, expr, /*c_cast_p=*/false,
5ade1ed2 6250 /*valid_p=*/NULL, complain);
33c25e5c
MM
6251}
6252
6253/* Perform a const_cast from EXPR to TYPE. If the cast is valid,
6254 return an appropriate expression. Otherwise, return
6255 error_mark_node. If the cast is not valid, and COMPLAIN is true,
7735d402
MM
6256 then a diagnostic will be issued. If VALID_P is non-NULL, we are
6257 performing a C-style cast, its value upon return will indicate
6258 whether or not the conversion succeeded. */
33c25e5c
MM
6259
6260static tree
6261build_const_cast_1 (tree dst_type, tree expr, bool complain,
6262 bool *valid_p)
6263{
6264 tree src_type;
6265 tree reference_type;
6266
6267 /* Callers are responsible for handling error_mark_node as a
6268 destination type. */
6269 gcc_assert (dst_type != error_mark_node);
6270 /* In a template, callers should be building syntactic
6271 representations of casts, not using this machinery. */
6272 gcc_assert (!processing_template_decl);
6273
6274 /* Assume the conversion is invalid. */
6275 if (valid_p)
6276 *valid_p = false;
6277
6278 if (!POINTER_TYPE_P (dst_type) && !TYPE_PTRMEM_P (dst_type))
6279 {
6280 if (complain)
6281 error ("invalid use of const_cast with type %qT, "
6282 "which is not a pointer, "
6283 "reference, nor a pointer-to-data-member type", dst_type);
3fd91cbd
MM
6284 return error_mark_node;
6285 }
6286
33c25e5c 6287 if (TREE_CODE (TREE_TYPE (dst_type)) == FUNCTION_TYPE)
8ccc31eb 6288 {
33c25e5c
MM
6289 if (complain)
6290 error ("invalid use of const_cast with type %qT, which is a pointer "
6291 "or reference to a function type", dst_type);
6292 return error_mark_node;
8ccc31eb
MS
6293 }
6294
8d8d1a28
AH
6295 /* Save casted types in the function's used types hash table. */
6296 used_types_insert (dst_type);
6297
33c25e5c
MM
6298 src_type = TREE_TYPE (expr);
6299 /* Expressions do not really have reference types. */
6300 if (TREE_CODE (src_type) == REFERENCE_TYPE)
6301 src_type = TREE_TYPE (src_type);
6302
6303 /* [expr.const.cast]
6304
6305 An lvalue of type T1 can be explicitly converted to an lvalue of
6306 type T2 using the cast const_cast<T2&> (where T1 and T2 are object
6307 types) if a pointer to T1 can be explicitly converted to the type
6308 pointer to T2 using a const_cast. */
6309 if (TREE_CODE (dst_type) == REFERENCE_TYPE)
8ccc31eb 6310 {
33c25e5c 6311 reference_type = dst_type;
c11b6f21 6312 if (! real_lvalue_p (expr))
8ccc31eb 6313 {
33c25e5c
MM
6314 if (complain)
6315 error ("invalid const_cast of an rvalue of type %qT to type %qT",
6316 src_type, dst_type);
8ccc31eb
MS
6317 return error_mark_node;
6318 }
33c25e5c
MM
6319 dst_type = build_pointer_type (TREE_TYPE (dst_type));
6320 src_type = build_pointer_type (src_type);
6321 }
6322 else
6323 {
6324 reference_type = NULL_TREE;
6325 /* If the destination type is not a reference type, the
6326 lvalue-to-rvalue, array-to-pointer, and function-to-pointer
6327 conversions are performed. */
6328 src_type = type_decays_to (src_type);
6329 if (src_type == error_mark_node)
6330 return error_mark_node;
6331 }
8ccc31eb 6332
33c25e5c
MM
6333 if ((TYPE_PTR_P (src_type) || TYPE_PTRMEM_P (src_type))
6334 && comp_ptr_ttypes_const (dst_type, src_type))
6335 {
6336 if (valid_p)
7735d402
MM
6337 {
6338 *valid_p = true;
6339 /* This cast is actually a C-style cast. Issue a warning if
6340 the user is making a potentially unsafe cast. */
86b7b98b 6341 check_for_casting_away_constness (src_type, dst_type, CAST_EXPR);
7735d402 6342 }
33c25e5c 6343 if (reference_type)
c2840dfb 6344 {
5ade1ed2
DG
6345 expr = cp_build_unary_op (ADDR_EXPR, expr, 0,
6346 complain? tf_warning_or_error : tf_none);
33c25e5c 6347 expr = build_nop (reference_type, expr);
c2840dfb
JM
6348 return convert_from_reference (expr);
6349 }
33c25e5c
MM
6350 else
6351 {
6352 expr = decay_conversion (expr);
6353 /* build_c_cast puts on a NOP_EXPR to make the result not an
6354 lvalue. Strip such NOP_EXPRs if VALUE is being used in
6355 non-lvalue context. */
6356 if (TREE_CODE (expr) == NOP_EXPR
6357 && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
6358 expr = TREE_OPERAND (expr, 0);
6359 return build_nop (dst_type, expr);
6360 }
8ccc31eb
MS
6361 }
6362
33c25e5c 6363 if (complain)
c8094d83 6364 error ("invalid const_cast from type %qT to type %qT",
33c25e5c 6365 src_type, dst_type);
c11b6f21 6366 return error_mark_node;
a4443a08
MS
6367}
6368
33c25e5c 6369tree
5ade1ed2 6370build_const_cast (tree type, tree expr, tsubst_flags_t complain)
33c25e5c 6371{
71bd7186 6372 if (type == error_mark_node || error_operand_p (expr))
33c25e5c 6373 return error_mark_node;
6060a796 6374
33c25e5c
MM
6375 if (processing_template_decl)
6376 {
6377 tree t = build_min (CONST_CAST_EXPR, type, expr);
c8094d83 6378
33c25e5c
MM
6379 if (!TREE_SIDE_EFFECTS (t)
6380 && type_dependent_expression_p (expr))
6381 /* There might turn out to be side effects inside expr. */
6382 TREE_SIDE_EFFECTS (t) = 1;
e8c66fe0 6383 return convert_from_reference (t);
33c25e5c
MM
6384 }
6385
5ade1ed2 6386 return build_const_cast_1 (type, expr, complain & tf_error,
33c25e5c
MM
6387 /*valid_p=*/NULL);
6388}
6389
525521b6
DG
6390/* Like cp_build_c_cast, but for the c-common bits. */
6391
6392tree
c2255bc4 6393build_c_cast (location_t loc ATTRIBUTE_UNUSED, tree type, tree expr)
525521b6
DG
6394{
6395 return cp_build_c_cast (type, expr, tf_warning_or_error);
6396}
6397
33c25e5c
MM
6398/* Build an expression representing an explicit C-style cast to type
6399 TYPE of expression EXPR. */
8d08fdba
MS
6400
6401tree
525521b6 6402cp_build_c_cast (tree type, tree expr, tsubst_flags_t complain)
8d08fdba 6403{
926ce8bd 6404 tree value = expr;
33c25e5c
MM
6405 tree result;
6406 bool valid_p;
8d08fdba 6407
33c25e5c 6408 if (type == error_mark_node || error_operand_p (expr))
8d08fdba
MS
6409 return error_mark_node;
6410
0949f723
NS
6411 if (processing_template_decl)
6412 {
6413 tree t = build_min (CAST_EXPR, type,
6414 tree_cons (NULL_TREE, value, NULL_TREE));
04c06002 6415 /* We don't know if it will or will not have side effects. */
8e1daa34 6416 TREE_SIDE_EFFECTS (t) = 1;
e8c66fe0 6417 return convert_from_reference (t);
0949f723
NS
6418 }
6419
2e2da467
ZL
6420 /* Casts to a (pointer to a) specific ObjC class (or 'id' or
6421 'Class') should always be retained, because this information aids
6422 in method lookup. */
6423 if (objc_is_object_ptr (type)
6424 && objc_is_object_ptr (TREE_TYPE (expr)))
6425 return build_nop (type, expr);
6426
8d08fdba 6427 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
8ccc31eb
MS
6428 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
6429 if (TREE_CODE (type) != REFERENCE_TYPE
6430 && TREE_CODE (value) == NOP_EXPR
8d08fdba
MS
6431 && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
6432 value = TREE_OPERAND (value, 0);
6433
8d08fdba
MS
6434 if (TREE_CODE (type) == ARRAY_TYPE)
6435 {
6436 /* Allow casting from T1* to T2[] because Cfront allows it.
cab1f180 6437 NIHCL uses it. It is not valid ISO C++ however. */
8d08fdba
MS
6438 if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
6439 {
5ade1ed2 6440 if (complain & tf_error)
cbe5f3b3 6441 permerror (input_location, "ISO C++ forbids casting to an array type %qT", type);
5ade1ed2
DG
6442 else
6443 return error_mark_node;
8d08fdba
MS
6444 type = build_pointer_type (TREE_TYPE (type));
6445 }
6446 else
6447 {
5ade1ed2
DG
6448 if (complain & tf_error)
6449 error ("ISO C++ forbids casting to an array type %qT", type);
8d08fdba
MS
6450 return error_mark_node;
6451 }
6452 }
6453
a0a33927
MS
6454 if (TREE_CODE (type) == FUNCTION_TYPE
6455 || TREE_CODE (type) == METHOD_TYPE)
6456 {
5ade1ed2
DG
6457 if (complain & tf_error)
6458 error ("invalid cast to function type %qT", type);
a0a33927
MS
6459 return error_mark_node;
6460 }
6461
dc8d2739
MLI
6462 if (TREE_CODE (type) == POINTER_TYPE
6463 && TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE
6464 /* Casting to an integer of smaller size is an error detected elsewhere. */
6465 && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (value))
6466 /* Don't warn about converting any constant. */
6467 && !TREE_CONSTANT (value))
6468 warning_at (input_location, OPT_Wint_to_pointer_cast,
6469 "cast to pointer from integer of different size");
6470
33c25e5c
MM
6471 /* A C-style cast can be a const_cast. */
6472 result = build_const_cast_1 (type, value, /*complain=*/false,
6473 &valid_p);
6474 if (valid_p)
6475 return result;
8d08fdba 6476
33c25e5c
MM
6477 /* Or a static cast. */
6478 result = build_static_cast_1 (type, value, /*c_cast_p=*/true,
5ade1ed2 6479 &valid_p, complain);
33c25e5c
MM
6480 /* Or a reinterpret_cast. */
6481 if (!valid_p)
6482 result = build_reinterpret_cast_1 (type, value, /*c_cast_p=*/true,
5ade1ed2 6483 &valid_p, complain);
33c25e5c
MM
6484 /* The static_cast or reinterpret_cast may be followed by a
6485 const_cast. */
c8094d83 6486 if (valid_p
33c25e5c
MM
6487 /* A valid cast may result in errors if, for example, a
6488 conversion to am ambiguous base class is required. */
6489 && !error_operand_p (result))
e6e174e5 6490 {
33c25e5c 6491 tree result_type;
8ccc31eb 6492
33c25e5c
MM
6493 /* Non-class rvalues always have cv-unqualified type. */
6494 if (!CLASS_TYPE_P (type))
6495 type = TYPE_MAIN_VARIANT (type);
6496 result_type = TREE_TYPE (result);
6497 if (!CLASS_TYPE_P (result_type))
6498 result_type = TYPE_MAIN_VARIANT (result_type);
6499 /* If the type of RESULT does not match TYPE, perform a
6500 const_cast to make it match. If the static_cast or
6501 reinterpret_cast succeeded, we will differ by at most
6502 cv-qualification, so the follow-on const_cast is guaranteed
6503 to succeed. */
6504 if (!same_type_p (non_reference (type), non_reference (result_type)))
e6e174e5 6505 {
33c25e5c
MM
6506 result = build_const_cast_1 (type, result, false, &valid_p);
6507 gcc_assert (valid_p);
8d08fdba 6508 }
33c25e5c 6509 return result;
8d08fdba
MS
6510 }
6511
33c25e5c 6512 return error_mark_node;
8d08fdba
MS
6513}
6514\f
5ade1ed2
DG
6515/* For use from the C common bits. */
6516tree
c9f9eb5d 6517build_modify_expr (location_t location ATTRIBUTE_UNUSED,
32e8bb8e 6518 tree lhs, tree lhs_origtype ATTRIBUTE_UNUSED,
c2255bc4
AH
6519 enum tree_code modifycode,
6520 location_t rhs_location ATTRIBUTE_UNUSED, tree rhs,
bbbbb16a 6521 tree rhs_origtype ATTRIBUTE_UNUSED)
5ade1ed2
DG
6522{
6523 return cp_build_modify_expr (lhs, modifycode, rhs, tf_warning_or_error);
6524}
6525
8d08fdba
MS
6526/* Build an assignment expression of lvalue LHS from value RHS.
6527 MODIFYCODE is the code for a binary operator that we use
6528 to combine the old value of LHS with RHS to get the new value.
6529 Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
6530
e92cc029
MS
6531 C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed. */
6532
8d08fdba 6533tree
5ade1ed2
DG
6534cp_build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs,
6535 tsubst_flags_t complain)
8d08fdba 6536{
926ce8bd 6537 tree result;
8d08fdba
MS
6538 tree newrhs = rhs;
6539 tree lhstype = TREE_TYPE (lhs);
6540 tree olhstype = lhstype;
487a92fe 6541 bool plain_assign = (modifycode == NOP_EXPR);
8d08fdba 6542
8d08fdba 6543 /* Avoid duplicate error messages from operands that had errors. */
1bd229b7 6544 if (error_operand_p (lhs) || error_operand_p (rhs))
8d08fdba
MS
6545 return error_mark_node;
6546
8d08fdba 6547 /* Handle control structure constructs used as "lvalues". */
8d08fdba
MS
6548 switch (TREE_CODE (lhs))
6549 {
f4f206f4 6550 /* Handle --foo = 5; as these are valid constructs in C++. */
8d08fdba
MS
6551 case PREDECREMENT_EXPR:
6552 case PREINCREMENT_EXPR:
6553 if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
f293ce4b
RS
6554 lhs = build2 (TREE_CODE (lhs), TREE_TYPE (lhs),
6555 stabilize_reference (TREE_OPERAND (lhs, 0)),
6556 TREE_OPERAND (lhs, 1));
f2be060f
JJ
6557 newrhs = cp_build_modify_expr (TREE_OPERAND (lhs, 0),
6558 modifycode, rhs, complain);
6559 if (newrhs == error_mark_node)
6560 return error_mark_node;
6561 return build2 (COMPOUND_EXPR, lhstype, lhs, newrhs);
8d08fdba
MS
6562
6563 /* Handle (a, b) used as an "lvalue". */
6564 case COMPOUND_EXPR:
5ade1ed2
DG
6565 newrhs = cp_build_modify_expr (TREE_OPERAND (lhs, 1),
6566 modifycode, rhs, complain);
bd6dd845 6567 if (newrhs == error_mark_node)
8d08fdba 6568 return error_mark_node;
f293ce4b
RS
6569 return build2 (COMPOUND_EXPR, lhstype,
6570 TREE_OPERAND (lhs, 0), newrhs);
8d08fdba 6571
a4443a08 6572 case MODIFY_EXPR:
a65cddcf 6573 if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
f293ce4b
RS
6574 lhs = build2 (TREE_CODE (lhs), TREE_TYPE (lhs),
6575 stabilize_reference (TREE_OPERAND (lhs, 0)),
6576 TREE_OPERAND (lhs, 1));
5ade1ed2
DG
6577 newrhs = cp_build_modify_expr (TREE_OPERAND (lhs, 0), modifycode, rhs,
6578 complain);
bd6dd845 6579 if (newrhs == error_mark_node)
a4443a08 6580 return error_mark_node;
f293ce4b 6581 return build2 (COMPOUND_EXPR, lhstype, lhs, newrhs);
a4443a08 6582
d211a298
RS
6583 case MIN_EXPR:
6584 case MAX_EXPR:
6585 /* MIN_EXPR and MAX_EXPR are currently only permitted as lvalues,
6586 when neither operand has side-effects. */
5ade1ed2 6587 if (!lvalue_or_else (lhs, lv_assign, complain))
d211a298
RS
6588 return error_mark_node;
6589
6590 gcc_assert (!TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0))
6591 && !TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 1)));
6592
6593 lhs = build3 (COND_EXPR, TREE_TYPE (lhs),
6594 build2 (TREE_CODE (lhs) == MIN_EXPR ? LE_EXPR : GE_EXPR,
6595 boolean_type_node,
6596 TREE_OPERAND (lhs, 0),
6597 TREE_OPERAND (lhs, 1)),
6598 TREE_OPERAND (lhs, 0),
6599 TREE_OPERAND (lhs, 1));
6600 /* Fall through. */
6601
8d08fdba
MS
6602 /* Handle (a ? b : c) used as an "lvalue". */
6603 case COND_EXPR:
8d08fdba
MS
6604 {
6605 /* Produce (a ? (b = rhs) : (c = rhs))
6606 except that the RHS goes through a save-expr
6607 so the code to compute it is only emitted once. */
df39af7d 6608 tree cond;
a77a9a18 6609 tree preeval = NULL_TREE;
df39af7d 6610
df3473fa
JJ
6611 if (VOID_TYPE_P (TREE_TYPE (rhs)))
6612 {
5ade1ed2
DG
6613 if (complain & tf_error)
6614 error ("void value not ignored as it ought to be");
df3473fa
JJ
6615 return error_mark_node;
6616 }
6617
a77a9a18 6618 rhs = stabilize_expr (rhs, &preeval);
c8094d83 6619
df39af7d
JM
6620 /* Check this here to avoid odd errors when trying to convert
6621 a throw to the type of the COND_EXPR. */
5ade1ed2 6622 if (!lvalue_or_else (lhs, lv_assign, complain))
df39af7d
JM
6623 return error_mark_node;
6624
6625 cond = build_conditional_expr
6626 (TREE_OPERAND (lhs, 0),
5ade1ed2
DG
6627 cp_build_modify_expr (TREE_OPERAND (lhs, 1),
6628 modifycode, rhs, complain),
6629 cp_build_modify_expr (TREE_OPERAND (lhs, 2),
6630 modifycode, rhs, complain),
6631 complain);
df39af7d 6632
bd6dd845 6633 if (cond == error_mark_node)
8d08fdba
MS
6634 return cond;
6635 /* Make sure the code to compute the rhs comes out
6636 before the split. */
6de9cd9a 6637 if (preeval)
f293ce4b 6638 cond = build2 (COMPOUND_EXPR, TREE_TYPE (lhs), preeval, cond);
6de9cd9a 6639 return cond;
8d08fdba 6640 }
c8094d83 6641
7f85441b
KG
6642 default:
6643 break;
8d08fdba
MS
6644 }
6645
8d08fdba
MS
6646 if (modifycode == INIT_EXPR)
6647 {
4ea08463
JM
6648 if (BRACE_ENCLOSED_INITIALIZER_P (rhs))
6649 /* Do the default thing. */;
6650 else if (TREE_CODE (rhs) == CONSTRUCTOR)
f30efcb7 6651 {
4ea08463 6652 /* Compound literal. */
182609b5
JM
6653 if (! same_type_p (TREE_TYPE (rhs), lhstype))
6654 /* Call convert to generate an error; see PR 11063. */
6655 rhs = convert (lhstype, rhs);
f293ce4b 6656 result = build2 (INIT_EXPR, lhstype, lhs, rhs);
f30efcb7
JM
6657 TREE_SIDE_EFFECTS (result) = 1;
6658 return result;
6659 }
9e1e64ec 6660 else if (! MAYBE_CLASS_TYPE_P (lhstype))
f4f206f4 6661 /* Do the default thing. */;
db5ae43f 6662 else
8d08fdba 6663 {
c166b898 6664 VEC(tree,gc) *rhs_vec = make_tree_vector_single (rhs);
4ba126e4 6665 result = build_special_member_call (lhs, complete_ctor_identifier,
c166b898 6666 &rhs_vec, lhstype, LOOKUP_NORMAL,
5ade1ed2 6667 complain);
c166b898 6668 release_tree_vector (rhs_vec);
8d08fdba
MS
6669 if (result == NULL_TREE)
6670 return error_mark_node;
6671 return result;
6672 }
6673 }
a56ca899 6674 else
8d08fdba 6675 {
a56ca899
NS
6676 lhs = require_complete_type (lhs);
6677 if (lhs == error_mark_node)
6678 return error_mark_node;
6679
6680 if (modifycode == NOP_EXPR)
c91a56d2 6681 {
a56ca899 6682 /* `operator=' is not an inheritable operator. */
9e1e64ec 6683 if (! MAYBE_CLASS_TYPE_P (lhstype))
f4f206f4 6684 /* Do the default thing. */;
a56ca899
NS
6685 else
6686 {
14d22dd6 6687 result = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL,
ec835fb2 6688 lhs, rhs, make_node (NOP_EXPR),
5ade1ed2
DG
6689 /*overloaded_p=*/NULL,
6690 complain);
a56ca899
NS
6691 if (result == NULL_TREE)
6692 return error_mark_node;
6693 return result;
6694 }
6695 lhstype = olhstype;
6696 }
6697 else
6698 {
6699 /* A binary op has been requested. Combine the old LHS
0cbd7506
MS
6700 value with the RHS producing the value we should actually
6701 store into the LHS. */
9e1e64ec
PC
6702 gcc_assert (!((TREE_CODE (lhstype) == REFERENCE_TYPE
6703 && MAYBE_CLASS_TYPE_P (TREE_TYPE (lhstype)))
6704 || MAYBE_CLASS_TYPE_P (lhstype)));
a56ca899 6705
a56ca899 6706 lhs = stabilize_reference (lhs);
c9f9eb5d 6707 newrhs = cp_build_binary_op (input_location,
ba47d38d 6708 modifycode, lhs, rhs,
5ade1ed2 6709 complain);
a56ca899
NS
6710 if (newrhs == error_mark_node)
6711 {
5ade1ed2
DG
6712 if (complain & tf_error)
6713 error (" in evaluation of %<%Q(%#T, %#T)%>", modifycode,
6714 TREE_TYPE (lhs), TREE_TYPE (rhs));
a56ca899
NS
6715 return error_mark_node;
6716 }
c8094d83 6717
a56ca899
NS
6718 /* Now it looks like a plain assignment. */
6719 modifycode = NOP_EXPR;
c91a56d2 6720 }
50bc768d
NS
6721 gcc_assert (TREE_CODE (lhstype) != REFERENCE_TYPE);
6722 gcc_assert (TREE_CODE (TREE_TYPE (newrhs)) != REFERENCE_TYPE);
8d08fdba
MS
6723 }
6724
719f407a 6725 /* The left-hand side must be an lvalue. */
5ade1ed2 6726 if (!lvalue_or_else (lhs, lv_assign, complain))
8d08fdba
MS
6727 return error_mark_node;
6728
a56ca899
NS
6729 /* Warn about modifying something that is `const'. Don't warn if
6730 this is initialization. */
8d08fdba 6731 if (modifycode != INIT_EXPR
91063b51 6732 && (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype)
69851283
MM
6733 /* Functions are not modifiable, even though they are
6734 lvalues. */
6735 || TREE_CODE (TREE_TYPE (lhs)) == FUNCTION_TYPE
a56ca899
NS
6736 || TREE_CODE (TREE_TYPE (lhs)) == METHOD_TYPE
6737 /* If it's an aggregate and any field is const, then it is
6738 effectively const. */
5552b43c 6739 || (CLASS_TYPE_P (lhstype)
a56ca899 6740 && C_TYPE_FIELDS_READONLY (lhstype))))
5ade1ed2
DG
6741 {
6742 if (complain & tf_error)
4cd5a50a 6743 readonly_error (lhs, REK_ASSIGNMENT);
5ade1ed2
DG
6744 else
6745 return error_mark_node;
6746 }
8d08fdba 6747
41b81065
JM
6748 /* If storing into a structure or union member, it may have been given a
6749 lowered bitfield type. We need to convert to the declared type first,
6750 so retrieve it now. */
8d08fdba 6751
41b81065 6752 olhstype = unlowered_expr_type (lhs);
8d08fdba 6753
8d08fdba
MS
6754 /* Convert new value to destination type. */
6755
6756 if (TREE_CODE (lhstype) == ARRAY_TYPE)
6757 {
f376e137 6758 int from_array;
c8094d83 6759
5666bb32 6760 if (BRACE_ENCLOSED_INITIALIZER_P (newrhs))
84526801 6761 {
eaa9d009
JM
6762 if (modifycode != INIT_EXPR)
6763 {
6764 if (complain & tf_error)
6765 error ("assigning to an array from an initializer list");
6766 return error_mark_node;
6767 }
5666bb32 6768 if (check_array_initializer (lhs, lhstype, newrhs))
84526801 6769 return error_mark_node;
5666bb32 6770 newrhs = digest_init (lhstype, newrhs);
84526801 6771 }
25357d1e
JM
6772
6773 else if (!same_or_base_type_p (TYPE_MAIN_VARIANT (lhstype),
5666bb32 6774 TYPE_MAIN_VARIANT (TREE_TYPE (newrhs))))
44a8d0b3 6775 {
5ade1ed2
DG
6776 if (complain & tf_error)
6777 error ("incompatible types in assignment of %qT to %qT",
6778 TREE_TYPE (rhs), lhstype);
44a8d0b3
MS
6779 return error_mark_node;
6780 }
6781
39211cd5 6782 /* Allow array assignment in compiler-generated code. */
25357d1e
JM
6783 else if (!current_function_decl
6784 || !DECL_ARTIFICIAL (current_function_decl))
cf24598a 6785 {
decebe51
GDR
6786 /* This routine is used for both initialization and assignment.
6787 Make sure the diagnostic message differentiates the context. */
5ade1ed2
DG
6788 if (complain & tf_error)
6789 {
6790 if (modifycode == INIT_EXPR)
6791 error ("array used as initializer");
6792 else
6793 error ("invalid array assignment");
6794 }
cf24598a
MM
6795 return error_mark_node;
6796 }
39211cd5 6797
f376e137 6798 from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
0cbd7506 6799 ? 1 + (modifycode != INIT_EXPR): 0;
3db45ab5 6800 return build_vec_init (lhs, NULL_TREE, newrhs,
844ae01d 6801 /*explicit_value_init_p=*/false,
5ade1ed2 6802 from_array, complain);
8d08fdba
MS
6803 }
6804
6805 if (modifycode == INIT_EXPR)
e57d93c6
JM
6806 /* Calls with INIT_EXPR are all direct-initialization, so don't set
6807 LOOKUP_ONLYCONVERTING. */
41b81065 6808 newrhs = convert_for_initialization (lhs, olhstype, newrhs, LOOKUP_NORMAL,
2f5b91f5 6809 ICR_INIT, NULL_TREE, 0,
5ade1ed2 6810 complain);
8d08fdba 6811 else
2f5b91f5 6812 newrhs = convert_for_assignment (olhstype, newrhs, ICR_ASSIGN,
e57d93c6 6813 NULL_TREE, 0, complain, LOOKUP_IMPLICIT);
41b81065
JM
6814
6815 if (!same_type_p (lhstype, olhstype))
6816 newrhs = cp_convert_and_check (lhstype, newrhs);
6817
6818 if (modifycode != INIT_EXPR)
8d08fdba 6819 {
b7484fbe
MS
6820 if (TREE_CODE (newrhs) == CALL_EXPR
6821 && TYPE_NEEDS_CONSTRUCTING (lhstype))
5566b478 6822 newrhs = build_cplus_new (lhstype, newrhs);
b7484fbe 6823
e8abc66f 6824 /* Can't initialize directly from a TARGET_EXPR, since that would
07674418
MS
6825 cause the lhs to be constructed twice, and possibly result in
6826 accidental self-initialization. So we force the TARGET_EXPR to be
be99da77 6827 expanded without a target. */
b7484fbe 6828 if (TREE_CODE (newrhs) == TARGET_EXPR)
f293ce4b
RS
6829 newrhs = build2 (COMPOUND_EXPR, TREE_TYPE (newrhs), newrhs,
6830 TREE_OPERAND (newrhs, 0));
8d08fdba
MS
6831 }
6832
bd6dd845 6833 if (newrhs == error_mark_node)
8d08fdba
MS
6834 return error_mark_node;
6835
e58a9aa1
ZL
6836 if (c_dialect_objc () && flag_objc_gc)
6837 {
6838 result = objc_generate_write_barrier (lhs, modifycode, newrhs);
6839
6840 if (result)
6841 return result;
6842 }
6843
f293ce4b
RS
6844 result = build2 (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
6845 lhstype, lhs, newrhs);
2ee887f2 6846
8d08fdba 6847 TREE_SIDE_EFFECTS (result) = 1;
487a92fe
JM
6848 if (!plain_assign)
6849 TREE_NO_WARNING (result) = 1;
8d08fdba 6850
41b81065 6851 return result;
8d08fdba
MS
6852}
6853
5566b478 6854tree
5ade1ed2
DG
6855build_x_modify_expr (tree lhs, enum tree_code modifycode, tree rhs,
6856 tsubst_flags_t complain)
5566b478 6857{
5156628f 6858 if (processing_template_decl)
5566b478 6859 return build_min_nt (MODOP_EXPR, lhs,
4dabb379 6860 build_min_nt (modifycode, NULL_TREE, NULL_TREE), rhs);
5566b478
MS
6861
6862 if (modifycode != NOP_EXPR)
6863 {
14d22dd6 6864 tree rval = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL, lhs, rhs,
ec835fb2 6865 make_node (modifycode),
5ade1ed2
DG
6866 /*overloaded_p=*/NULL,
6867 complain);
5566b478 6868 if (rval)
487a92fe
JM
6869 {
6870 TREE_NO_WARNING (rval) = 1;
6871 return rval;
6872 }
5566b478 6873 }
5ade1ed2 6874 return cp_build_modify_expr (lhs, modifycode, rhs, complain);
5566b478 6875}
8d08fdba 6876
6e03b280
OW
6877/* Helper function for get_delta_difference which assumes FROM is a base
6878 class of TO. Returns a delta for the conversion of pointer-to-member
135d47df
PC
6879 of FROM to pointer-to-member of TO. If the conversion is invalid and
6880 tf_error is not set in COMPLAIN returns error_mark_node, otherwise
6e03b280 6881 returns zero. If FROM is not a base class of TO, returns NULL_TREE.
135d47df
PC
6882 If C_CAST_P is true, this conversion is taking place as part of a
6883 C-style cast. */
6e03b280
OW
6884
6885static tree
135d47df
PC
6886get_delta_difference_1 (tree from, tree to, bool c_cast_p,
6887 tsubst_flags_t complain)
6e03b280
OW
6888{
6889 tree binfo;
6890 base_kind kind;
135d47df
PC
6891 base_access access = c_cast_p ? ba_unique : ba_check;
6892
6893 /* Note: ba_quiet does not distinguish between access control and
6894 ambiguity. */
6895 if (!(complain & tf_error))
6896 access |= ba_quiet;
6897
6898 binfo = lookup_base (to, from, access, &kind);
6e03b280 6899
6e03b280
OW
6900 if (kind == bk_inaccessible || kind == bk_ambig)
6901 {
135d47df
PC
6902 if (!(complain & tf_error))
6903 return error_mark_node;
6904
6e03b280
OW
6905 error (" in pointer to member function conversion");
6906 return size_zero_node;
6907 }
6908 else if (binfo)
6909 {
6910 if (kind != bk_via_virtual)
6911 return BINFO_OFFSET (binfo);
6912 else
6913 /* FROM is a virtual base class of TO. Issue an error or warning
6914 depending on whether or not this is a reinterpret cast. */
6915 {
135d47df
PC
6916 if (!(complain & tf_error))
6917 return error_mark_node;
6918
6e03b280
OW
6919 error ("pointer to member conversion via virtual base %qT",
6920 BINFO_TYPE (binfo_from_vbase (binfo)));
6921
6922 return size_zero_node;
6923 }
6924 }
135d47df
PC
6925 else
6926 return NULL_TREE;
6e03b280
OW
6927}
6928
ddd5a7c1 6929/* Get difference in deltas for different pointer to member function
135d47df
PC
6930 types. If the conversion is invalid and tf_error is not set in
6931 COMPLAIN, returns error_mark_node, otherwise returns an integer
6932 constant of type PTRDIFF_TYPE_NODE and its value is zero if the
6933 conversion is invalid. If ALLOW_INVERSE_P is true, then allow reverse
6934 conversions as well. If C_CAST_P is true this conversion is taking
6935 place as part of a C-style cast.
3927874d
JM
6936
6937 Note that the naming of FROM and TO is kind of backwards; the return
6938 value is what we add to a TO in order to get a FROM. They are named
6939 this way because we call this function to find out how to convert from
6940 a pointer to member of FROM to a pointer to member of TO. */
e92cc029 6941
51c184be 6942static tree
c8094d83 6943get_delta_difference (tree from, tree to,
08e17d9d 6944 bool allow_inverse_p,
135d47df 6945 bool c_cast_p, tsubst_flags_t complain)
51c184be 6946{
e8632777
MM
6947 tree result;
6948
6e03b280
OW
6949 if (same_type_ignoring_top_level_qualifiers_p (from, to))
6950 /* Pointer to member of incomplete class is permitted*/
6951 result = size_zero_node;
f879d298 6952 else
135d47df
PC
6953 result = get_delta_difference_1 (from, to, c_cast_p, complain);
6954
6955 if (result == error_mark_node)
6956 return error_mark_node;
c8094d83 6957
6e03b280
OW
6958 if (!result)
6959 {
6960 if (!allow_inverse_p)
6961 {
135d47df
PC
6962 if (!(complain & tf_error))
6963 return error_mark_node;
6964
6e03b280
OW
6965 error_not_base_type (from, to);
6966 error (" in pointer to member conversion");
135d47df 6967 result = size_zero_node;
6e03b280
OW
6968 }
6969 else
6970 {
135d47df
PC
6971 result = get_delta_difference_1 (to, from, c_cast_p, complain);
6972
6973 if (result == error_mark_node)
6974 return error_mark_node;
6e03b280
OW
6975
6976 if (result)
db3927fb 6977 result = size_diffop_loc (input_location,
135d47df 6978 size_zero_node, result);
6e03b280
OW
6979 else
6980 {
135d47df
PC
6981 if (!(complain & tf_error))
6982 return error_mark_node;
6983
6e03b280
OW
6984 error_not_base_type (from, to);
6985 error (" in pointer to member conversion");
6986 result = size_zero_node;
6987 }
6988 }
6989 }
32e02ee0 6990
c8094d83 6991 return fold_if_not_in_template (convert_to_integer (ptrdiff_type_node,
455f19cb 6992 result));
51c184be
MS
6993}
6994
c7e266a6
MM
6995/* Return a constructor for the pointer-to-member-function TYPE using
6996 the other components as specified. */
6997
e08a8f45 6998tree
acd8e2d0 6999build_ptrmemfunc1 (tree type, tree delta, tree pfn)
594740f3 7000{
f78c7bc6 7001 tree u = NULL_TREE;
c7e266a6 7002 tree delta_field;
c7e266a6 7003 tree pfn_field;
4038c495 7004 VEC(constructor_elt, gc) *v;
594740f3 7005
c7e266a6 7006 /* Pull the FIELD_DECLs out of the type. */
1f84ec23 7007 pfn_field = TYPE_FIELDS (type);
910ad8de 7008 delta_field = DECL_CHAIN (pfn_field);
594740f3 7009
c7e266a6
MM
7010 /* Make sure DELTA has the type we want. */
7011 delta = convert_and_check (delta_type_node, delta);
594740f3 7012
a489b1f0
RG
7013 /* Convert to the correct target type if necessary. */
7014 pfn = fold_convert (TREE_TYPE (pfn_field), pfn);
7015
c7e266a6 7016 /* Finish creating the initializer. */
4038c495
GB
7017 v = VEC_alloc(constructor_elt, gc, 2);
7018 CONSTRUCTOR_APPEND_ELT(v, pfn_field, pfn);
7019 CONSTRUCTOR_APPEND_ELT(v, delta_field, delta);
7020 u = build_constructor (type, v);
6de9cd9a 7021 TREE_CONSTANT (u) = TREE_CONSTANT (pfn) & TREE_CONSTANT (delta);
530ec96d
MM
7022 TREE_STATIC (u) = (TREE_CONSTANT (u)
7023 && (initializer_constant_valid_p (pfn, TREE_TYPE (pfn))
7024 != NULL_TREE)
c8094d83 7025 && (initializer_constant_valid_p (delta, TREE_TYPE (delta))
530ec96d 7026 != NULL_TREE));
594740f3 7027 return u;
594740f3
MS
7028}
7029
8d08fdba
MS
7030/* Build a constructor for a pointer to member function. It can be
7031 used to initialize global variables, local variable, or used
7032 as a value in expressions. TYPE is the POINTER to METHOD_TYPE we
7033 want to be.
7034
838dfd8a 7035 If FORCE is nonzero, then force this conversion, even if
8d08fdba 7036 we would rather not do it. Usually set when using an explicit
08e17d9d 7037 cast. A C-style cast is being processed iff C_CAST_P is true.
51c184be
MS
7038
7039 Return error_mark_node, if something goes wrong. */
8d08fdba
MS
7040
7041tree
135d47df
PC
7042build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p,
7043 tsubst_flags_t complain)
8d08fdba 7044{
e08a8f45 7045 tree fn;
7993382e
MM
7046 tree pfn_type;
7047 tree to_type;
7048
7049 if (error_operand_p (pfn))
7050 return error_mark_node;
7051
7052 pfn_type = TREE_TYPE (pfn);
7053 to_type = build_ptrmemfunc_type (type);
b928a651 7054
e92cc029 7055 /* Handle multiple conversions of pointer to member functions. */
7993382e 7056 if (TYPE_PTRMEMFUNC_P (pfn_type))
8d08fdba 7057 {
530ec96d 7058 tree delta = NULL_TREE;
7133357a 7059 tree npfn = NULL_TREE;
1f84ec23 7060 tree n;
594740f3 7061
c8094d83 7062 if (!force
30f86ec3 7063 && !can_convert_arg (to_type, TREE_TYPE (pfn), pfn, LOOKUP_NORMAL))
c8094d83 7064 error ("invalid conversion to type %qT from type %qT",
0cbd7506 7065 to_type, pfn_type);
9ca21c0a 7066
3f2b640a
JM
7067 n = get_delta_difference (TYPE_PTRMEMFUNC_OBJECT_TYPE (pfn_type),
7068 TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type),
08e17d9d 7069 force,
135d47df
PC
7070 c_cast_p, complain);
7071 if (n == error_mark_node)
7072 return error_mark_node;
3f2b640a 7073
c7e266a6
MM
7074 /* We don't have to do any conversion to convert a
7075 pointer-to-member to its own type. But, we don't want to
7076 just return a PTRMEM_CST if there's an explicit cast; that
7077 cast should make the expression an invalid template argument. */
3f2b640a
JM
7078 if (TREE_CODE (pfn) != PTRMEM_CST)
7079 {
7080 if (same_type_p (to_type, pfn_type))
7081 return pfn;
7082 else if (integer_zerop (n))
5ade1ed2
DG
7083 return build_reinterpret_cast (to_type, pfn,
7084 tf_warning_or_error);
3f2b640a 7085 }
c7e266a6 7086
7def1251
JM
7087 if (TREE_SIDE_EFFECTS (pfn))
7088 pfn = save_expr (pfn);
7089
530ec96d
MM
7090 /* Obtain the function pointer and the current DELTA. */
7091 if (TREE_CODE (pfn) == PTRMEM_CST)
18ae7f63 7092 expand_ptrmemfunc_cst (pfn, &delta, &npfn);
530ec96d
MM
7093 else
7094 {
50ad9642
MM
7095 npfn = build_ptrmemfunc_access_expr (pfn, pfn_identifier);
7096 delta = build_ptrmemfunc_access_expr (pfn, delta_identifier);
530ec96d
MM
7097 }
7098
3461fba7 7099 /* Just adjust the DELTA field. */
50bc768d
NS
7100 gcc_assert (same_type_ignoring_top_level_qualifiers_p
7101 (TREE_TYPE (delta), ptrdiff_type_node));
cb7fdde2 7102 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta)
ba47d38d
AH
7103 n = cp_build_binary_op (input_location,
7104 LSHIFT_EXPR, n, integer_one_node,
5ade1ed2 7105 tf_warning_or_error);
ba47d38d
AH
7106 delta = cp_build_binary_op (input_location,
7107 PLUS_EXPR, delta, n, tf_warning_or_error);
18ae7f63 7108 return build_ptrmemfunc1 (to_type, delta, npfn);
8d08fdba 7109 }
51c184be 7110
e92cc029 7111 /* Handle null pointer to member function conversions. */
33c2474d 7112 if (null_ptr_cst_p (pfn))
51c184be 7113 {
c2255bc4 7114 pfn = build_c_cast (input_location, type, integer_zero_node);
b928a651 7115 return build_ptrmemfunc1 (to_type,
c8094d83 7116 integer_zero_node,
18ae7f63 7117 pfn);
51c184be
MS
7118 }
7119
e6e174e5 7120 if (type_unknown_p (pfn))
23fca1f5 7121 return instantiate_type (type, pfn, tf_warning_or_error);
a0a33927 7122
e08a8f45 7123 fn = TREE_OPERAND (pfn, 0);
37048601
NS
7124 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
7125 /* In a template, we will have preserved the
7126 OFFSET_REF. */
7127 || (processing_template_decl && TREE_CODE (fn) == OFFSET_REF));
b928a651 7128 return make_ptrmem_cst (to_type, fn);
e08a8f45 7129}
8d08fdba 7130
18ae7f63 7131/* Return the DELTA, IDX, PFN, and DELTA2 values for the PTRMEM_CST
fed3cef0
RK
7132 given by CST.
7133
7134 ??? There is no consistency as to the types returned for the above
852dcbdd 7135 values. Some code acts as if it were a sizetype and some as if it were
fed3cef0 7136 integer_type_node. */
8d08fdba 7137
e08a8f45 7138void
acd8e2d0 7139expand_ptrmemfunc_cst (tree cst, tree *delta, tree *pfn)
e08a8f45
MM
7140{
7141 tree type = TREE_TYPE (cst);
7142 tree fn = PTRMEM_CST_MEMBER (cst);
3927874d 7143 tree ptr_class, fn_class;
8d08fdba 7144
50bc768d 7145 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
3927874d
JM
7146
7147 /* The class that the function belongs to. */
4f1c5b7d 7148 fn_class = DECL_CONTEXT (fn);
3927874d
JM
7149
7150 /* The class that we're creating a pointer to member of. */
7151 ptr_class = TYPE_PTRMEMFUNC_OBJECT_TYPE (type);
7152
7153 /* First, calculate the adjustment to the function's class. */
08e17d9d 7154 *delta = get_delta_difference (fn_class, ptr_class, /*force=*/0,
135d47df 7155 /*c_cast_p=*/0, tf_warning_or_error);
3927874d 7156
e08a8f45 7157 if (!DECL_VIRTUAL_P (fn))
18ae7f63 7158 *pfn = convert (TYPE_PTRMEMFUNC_FN_TYPE (type), build_addr_func (fn));
8d08fdba 7159 else
51c184be 7160 {
3927874d 7161 /* If we're dealing with a virtual function, we have to adjust 'this'
0cbd7506
MS
7162 again, to point to the base which provides the vtable entry for
7163 fn; the call will do the opposite adjustment. */
e93ee644 7164 tree orig_class = DECL_CONTEXT (fn);
3927874d 7165 tree binfo = binfo_or_else (orig_class, fn_class);
455f19cb
MM
7166 *delta = build2 (PLUS_EXPR, TREE_TYPE (*delta),
7167 *delta, BINFO_OFFSET (binfo));
7168 *delta = fold_if_not_in_template (*delta);
3927874d 7169
3461fba7
NS
7170 /* We set PFN to the vtable offset at which the function can be
7171 found, plus one (unless ptrmemfunc_vbit_in_delta, in which
7172 case delta is shifted left, and then incremented). */
cb7fdde2 7173 *pfn = DECL_VINDEX (fn);
455f19cb
MM
7174 *pfn = build2 (MULT_EXPR, integer_type_node, *pfn,
7175 TYPE_SIZE_UNIT (vtable_entry_type));
7176 *pfn = fold_if_not_in_template (*pfn);
cb7fdde2
AO
7177
7178 switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
7179 {
7180 case ptrmemfunc_vbit_in_pfn:
455f19cb
MM
7181 *pfn = build2 (PLUS_EXPR, integer_type_node, *pfn,
7182 integer_one_node);
7183 *pfn = fold_if_not_in_template (*pfn);
cb7fdde2
AO
7184 break;
7185
7186 case ptrmemfunc_vbit_in_delta:
455f19cb
MM
7187 *delta = build2 (LSHIFT_EXPR, TREE_TYPE (*delta),
7188 *delta, integer_one_node);
7189 *delta = fold_if_not_in_template (*delta);
7190 *delta = build2 (PLUS_EXPR, TREE_TYPE (*delta),
7191 *delta, integer_one_node);
7192 *delta = fold_if_not_in_template (*delta);
cb7fdde2
AO
7193 break;
7194
7195 default:
315fb5db 7196 gcc_unreachable ();
cb7fdde2
AO
7197 }
7198
455f19cb
MM
7199 *pfn = build_nop (TYPE_PTRMEMFUNC_FN_TYPE (type), *pfn);
7200 *pfn = fold_if_not_in_template (*pfn);
e08a8f45
MM
7201 }
7202}
8d08fdba 7203
e08a8f45
MM
7204/* Return an expression for PFN from the pointer-to-member function
7205 given by T. */
7206
b5791fdc 7207static tree
acd8e2d0 7208pfn_from_ptrmemfunc (tree t)
e08a8f45
MM
7209{
7210 if (TREE_CODE (t) == PTRMEM_CST)
7211 {
7212 tree delta;
e08a8f45 7213 tree pfn;
c8094d83 7214
18ae7f63 7215 expand_ptrmemfunc_cst (t, &delta, &pfn);
e08a8f45
MM
7216 if (pfn)
7217 return pfn;
51c184be 7218 }
8d08fdba 7219
50ad9642 7220 return build_ptrmemfunc_access_expr (t, pfn_identifier);
8d08fdba
MS
7221}
7222
a298680c
OW
7223/* Return an expression for DELTA from the pointer-to-member function
7224 given by T. */
7225
7226static tree
7227delta_from_ptrmemfunc (tree t)
7228{
7229 if (TREE_CODE (t) == PTRMEM_CST)
7230 {
7231 tree delta;
7232 tree pfn;
7233
7234 expand_ptrmemfunc_cst (t, &delta, &pfn);
7235 if (delta)
7236 return delta;
7237 }
7238
7239 return build_ptrmemfunc_access_expr (t, delta_identifier);
7240}
7241
a7a64a77 7242/* Convert value RHS to type TYPE as preparation for an assignment to
9d9f52d3
SZ
7243 an lvalue of type TYPE. ERRTYPE indicates what kind of error the
7244 implicit conversion is. If FNDECL is non-NULL, we are doing the
7245 conversion in order to pass the PARMNUMth argument of FNDECL.
7246 If FNDECL is NULL, we are doing the conversion in function pointer
7247 argument passing, conversion in initialization, etc. */
8d08fdba
MS
7248
7249static tree
acd8e2d0 7250convert_for_assignment (tree type, tree rhs,
2f5b91f5 7251 impl_conv_rhs errtype, tree fndecl, int parmnum,
e57d93c6 7252 tsubst_flags_t complain, int flags)
8d08fdba 7253{
926ce8bd
KH
7254 tree rhstype;
7255 enum tree_code coder;
8d08fdba 7256
8d08fdba
MS
7257 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
7258 if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
7259 rhs = TREE_OPERAND (rhs, 0);
7260
a7a64a77
MM
7261 rhstype = TREE_TYPE (rhs);
7262 coder = TREE_CODE (rhstype);
7263
7d149679 7264 if (TREE_CODE (type) == VECTOR_TYPE && coder == VECTOR_TYPE
00c8e9f6 7265 && vector_types_convertible_p (type, rhstype, true))
416f380b
JJ
7266 {
7267 rhs = mark_rvalue_use (rhs);
7268 return convert (type, rhs);
7269 }
7d149679 7270
a7a64a77 7271 if (rhs == error_mark_node || rhstype == error_mark_node)
8d08fdba 7272 return error_mark_node;
2c73f9f5 7273 if (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node)
8d08fdba
MS
7274 return error_mark_node;
7275
a7a64a77 7276 /* The RHS of an assignment cannot have void type. */
8d08fdba
MS
7277 if (coder == VOID_TYPE)
7278 {
5ade1ed2
DG
7279 if (complain & tf_error)
7280 error ("void value not ignored as it ought to be");
8d08fdba
MS
7281 return error_mark_node;
7282 }
8d08fdba 7283
a7a64a77
MM
7284 /* Simplify the RHS if possible. */
7285 if (TREE_CODE (rhs) == CONST_DECL)
7286 rhs = DECL_INITIAL (rhs);
660845bf
ZL
7287
7288 if (c_dialect_objc ())
7289 {
7290 int parmno;
2f5b91f5 7291 tree selector;
660845bf
ZL
7292 tree rname = fndecl;
7293
2f5b91f5
SZ
7294 switch (errtype)
7295 {
7296 case ICR_ASSIGN:
7297 parmno = -1;
7298 break;
7299 case ICR_INIT:
7300 parmno = -2;
7301 break;
7302 default:
7303 selector = objc_message_selector ();
7304 parmno = parmnum;
7305 if (selector && parmno > 1)
7306 {
7307 rname = selector;
7308 parmno -= 1;
7309 }
660845bf
ZL
7310 }
7311
7312 if (objc_compare_types (type, rhstype, parmno, rname))
416f380b
JJ
7313 {
7314 rhs = mark_rvalue_use (rhs);
7315 return convert (type, rhs);
7316 }
660845bf
ZL
7317 }
7318
a7a64a77
MM
7319 /* [expr.ass]
7320
7321 The expression is implicitly converted (clause _conv_) to the
72a08131
JM
7322 cv-unqualified type of the left operand.
7323
7324 We allow bad conversions here because by the time we get to this point
7325 we are committed to doing the conversion. If we end up doing a bad
7326 conversion, convert_like will complain. */
c5adc427 7327 if (!can_convert_arg_bad (type, rhstype, rhs, flags))
a7a64a77 7328 {
32facac8 7329 /* When -Wno-pmf-conversions is use, we just silently allow
a7a64a77
MM
7330 conversions from pointers-to-members to plain pointers. If
7331 the conversion doesn't work, cp_convert will complain. */
c8094d83
MS
7332 if (!warn_pmf2ptr
7333 && TYPE_PTR_P (type)
a7a64a77
MM
7334 && TYPE_PTRMEMFUNC_P (rhstype))
7335 rhs = cp_convert (strip_top_quals (type), rhs);
72a08131 7336 else
32facac8 7337 {
5ade1ed2
DG
7338 if (complain & tf_error)
7339 {
7340 /* If the right-hand side has unknown type, then it is an
7341 overloaded function. Call instantiate_type to get error
7342 messages. */
7343 if (rhstype == unknown_type_node)
7344 instantiate_type (type, rhs, tf_warning_or_error);
7345 else if (fndecl)
7346 error ("cannot convert %qT to %qT for argument %qP to %qD",
7347 rhstype, type, parmnum, fndecl);
7348 else
2f5b91f5
SZ
7349 switch (errtype)
7350 {
7351 case ICR_DEFAULT_ARGUMENT:
7352 error ("cannot convert %qT to %qT in default argument",
7353 rhstype, type);
7354 break;
7355 case ICR_ARGPASS:
7356 error ("cannot convert %qT to %qT in argument passing",
7357 rhstype, type);
7358 break;
7359 case ICR_CONVERTING:
7360 error ("cannot convert %qT to %qT",
7361 rhstype, type);
7362 break;
7363 case ICR_INIT:
7364 error ("cannot convert %qT to %qT in initialization",
7365 rhstype, type);
7366 break;
7367 case ICR_RETURN:
7368 error ("cannot convert %qT to %qT in return",
7369 rhstype, type);
7370 break;
7371 case ICR_ASSIGN:
7372 error ("cannot convert %qT to %qT in assignment",
7373 rhstype, type);
7374 break;
7375 default:
7376 gcc_unreachable();
7377 }
5ade1ed2 7378 }
32facac8
ML
7379 return error_mark_node;
7380 }
51c184be 7381 }
104f8784
KG
7382 if (warn_missing_format_attribute)
7383 {
7384 const enum tree_code codel = TREE_CODE (type);
7385 if ((codel == POINTER_TYPE || codel == REFERENCE_TYPE)
7386 && coder == codel
5ade1ed2
DG
7387 && check_missing_format_attribute (type, rhstype)
7388 && (complain & tf_warning))
2f5b91f5
SZ
7389 switch (errtype)
7390 {
7391 case ICR_ARGPASS:
7392 case ICR_DEFAULT_ARGUMENT:
7393 if (fndecl)
7394 warning (OPT_Wmissing_format_attribute,
9d9f52d3 7395 "parameter %qP of %qD might be a candidate "
2f5b91f5
SZ
7396 "for a format attribute", parmnum, fndecl);
7397 else
7398 warning (OPT_Wmissing_format_attribute,
7399 "parameter might be a candidate "
7400 "for a format attribute");
7401 break;
7402 case ICR_CONVERTING:
7403 warning (OPT_Wmissing_format_attribute,
7404 "target of conversion might be might be a candidate "
7405 "for a format attribute");
7406 break;
7407 case ICR_INIT:
7408 warning (OPT_Wmissing_format_attribute,
7409 "target of initialization might be a candidate "
7410 "for a format attribute");
7411 break;
7412 case ICR_RETURN:
7413 warning (OPT_Wmissing_format_attribute,
7414 "return type might be a candidate "
7415 "for a format attribute");
7416 break;
7417 case ICR_ASSIGN:
7418 warning (OPT_Wmissing_format_attribute,
7419 "left-hand side of assignment might be a candidate "
7420 "for a format attribute");
7421 break;
7422 default:
7423 gcc_unreachable();
7424 }
104f8784 7425 }
3db45ab5 7426
a99e5cb4
ILT
7427 /* If -Wparentheses, warn about a = b = c when a has type bool and b
7428 does not. */
fbc8d2d3 7429 if (warn_parentheses
66be89f0 7430 && TREE_CODE (type) == BOOLEAN_TYPE
fbc8d2d3 7431 && TREE_CODE (rhs) == MODIFY_EXPR
a99e5cb4 7432 && !TREE_NO_WARNING (rhs)
69fb9832 7433 && TREE_CODE (TREE_TYPE (rhs)) != BOOLEAN_TYPE
5ade1ed2 7434 && (complain & tf_warning))
fbc8d2d3 7435 {
69fb9832
MLI
7436 location_t loc = EXPR_HAS_LOCATION (rhs)
7437 ? EXPR_LOCATION (rhs) : input_location;
7438
7439 warning_at (loc, OPT_Wparentheses,
7440 "suggest parentheses around assignment used as truth value");
fbc8d2d3
ILT
7441 TREE_NO_WARNING (rhs) = 1;
7442 }
7443
e57d93c6
JM
7444 return perform_implicit_conversion_flags (strip_top_quals (type), rhs,
7445 complain, flags);
8d08fdba
MS
7446}
7447
56ae6d77 7448/* Convert RHS to be of type TYPE.
838dfd8a 7449 If EXP is nonzero, it is the target of the initialization.
9d9f52d3 7450 ERRTYPE indicates what kind of error the implicit conversion is.
8d08fdba
MS
7451
7452 Two major differences between the behavior of
7453 `convert_for_assignment' and `convert_for_initialization'
7454 are that references are bashed in the former, while
7455 copied in the latter, and aggregates are assigned in
7456 the former (operator=) while initialized in the
7457 latter (X(X&)).
7458
7459 If using constructor make sure no conversion operator exists, if one does
878cd289
MS
7460 exist, an ambiguity exists.
7461
7462 If flags doesn't include LOOKUP_COMPLAIN, don't complain about anything. */
e92cc029 7463
8d08fdba 7464tree
acd8e2d0 7465convert_for_initialization (tree exp, tree type, tree rhs, int flags,
2f5b91f5 7466 impl_conv_rhs errtype, tree fndecl, int parmnum,
5ade1ed2 7467 tsubst_flags_t complain)
8d08fdba 7468{
926ce8bd
KH
7469 enum tree_code codel = TREE_CODE (type);
7470 tree rhstype;
7471 enum tree_code coder;
8d08fdba
MS
7472
7473 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
7474 Strip such NOP_EXPRs, since RHS is used in non-lvalue context. */
7475 if (TREE_CODE (rhs) == NOP_EXPR
a0a33927
MS
7476 && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))
7477 && codel != REFERENCE_TYPE)
8d08fdba
MS
7478 rhs = TREE_OPERAND (rhs, 0);
7479
57b52959
VR
7480 if (type == error_mark_node
7481 || rhs == error_mark_node
8d08fdba
MS
7482 || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node))
7483 return error_mark_node;
7484
8d08fdba 7485 if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
8ccc31eb
MS
7486 && TREE_CODE (type) != ARRAY_TYPE
7487 && (TREE_CODE (type) != REFERENCE_TYPE
7488 || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
59e76fc6
JM
7489 || (TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
7490 && (TREE_CODE (type) != REFERENCE_TYPE
7491 || TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE))
8d08fdba 7492 || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
0a72704b 7493 rhs = decay_conversion (rhs);
8d08fdba
MS
7494
7495 rhstype = TREE_TYPE (rhs);
7496 coder = TREE_CODE (rhstype);
7497
8d08fdba
MS
7498 if (coder == ERROR_MARK)
7499 return error_mark_node;
7500
8d08fdba
MS
7501 /* We accept references to incomplete types, so we can
7502 return here before checking if RHS is of complete type. */
c8094d83 7503
8d08fdba 7504 if (codel == REFERENCE_TYPE)
2986ae00
MS
7505 {
7506 /* This should eventually happen in convert_arguments. */
a703fb38 7507 int savew = 0, savee = 0;
2986ae00
MS
7508
7509 if (fndecl)
7510 savew = warningcount, savee = errorcount;
7e99327d 7511 rhs = initialize_reference (type, rhs, /*decl=*/NULL_TREE,
60d21717 7512 /*cleanup=*/NULL, complain);
2986ae00
MS
7513 if (fndecl)
7514 {
7515 if (warningcount > savew)
dee15844 7516 warning (0, "in passing argument %P of %q+D", parmnum, fndecl);
2986ae00 7517 else if (errorcount > savee)
dee15844 7518 error ("in passing argument %P of %q+D", parmnum, fndecl);
2986ae00
MS
7519 }
7520 return rhs;
c8094d83 7521 }
8d08fdba 7522
66543169
NS
7523 if (exp != 0)
7524 exp = require_complete_type (exp);
8d08fdba
MS
7525 if (exp == error_mark_node)
7526 return error_mark_node;
7527
ee76b931 7528 rhstype = non_reference (rhstype);
8d08fdba 7529
6467930b
MS
7530 type = complete_type (type);
7531
37a7519a
JM
7532 if (DIRECT_INIT_EXPR_P (type, rhs))
7533 /* Don't try to do copy-initialization if we already have
7534 direct-initialization. */
7535 return rhs;
7536
9e1e64ec 7537 if (MAYBE_CLASS_TYPE_P (type))
277294d7 7538 return ocp_convert (type, rhs, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
8d08fdba 7539
5ade1ed2 7540 return convert_for_assignment (type, rhs, errtype, fndecl, parmnum,
e57d93c6 7541 complain, flags);
8d08fdba
MS
7542}
7543\f
efee38a9 7544/* If RETVAL is the address of, or a reference to, a local variable or
34cd5ae7 7545 temporary give an appropriate warning. */
8d08fdba 7546
efee38a9 7547static void
acd8e2d0 7548maybe_warn_about_returning_address_of_local (tree retval)
efee38a9
MM
7549{
7550 tree valtype = TREE_TYPE (DECL_RESULT (current_function_decl));
2bfa73e4 7551 tree whats_returned = retval;
8d08fdba 7552
2bfa73e4 7553 for (;;)
efee38a9 7554 {
efee38a9 7555 if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
2bfa73e4 7556 whats_returned = TREE_OPERAND (whats_returned, 1);
5f9e56b3
TB
7557 else if (CONVERT_EXPR_P (whats_returned)
7558 || TREE_CODE (whats_returned) == NON_LVALUE_EXPR)
efee38a9 7559 whats_returned = TREE_OPERAND (whats_returned, 0);
2bfa73e4
BS
7560 else
7561 break;
7562 }
7563
7564 if (TREE_CODE (whats_returned) != ADDR_EXPR)
7565 return;
c8094d83 7566 whats_returned = TREE_OPERAND (whats_returned, 0);
2bfa73e4
BS
7567
7568 if (TREE_CODE (valtype) == REFERENCE_TYPE)
7569 {
7570 if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
7571 || TREE_CODE (whats_returned) == TARGET_EXPR)
efee38a9 7572 {
d4ee4d25 7573 warning (0, "returning reference to temporary");
2bfa73e4 7574 return;
efee38a9 7575 }
c8094d83 7576 if (TREE_CODE (whats_returned) == VAR_DECL
2bfa73e4
BS
7577 && DECL_NAME (whats_returned)
7578 && TEMP_NAME_P (DECL_NAME (whats_returned)))
efee38a9 7579 {
d4ee4d25 7580 warning (0, "reference to non-lvalue returned");
2bfa73e4 7581 return;
efee38a9
MM
7582 }
7583 }
efee38a9 7584
a1a95249
JM
7585 while (TREE_CODE (whats_returned) == COMPONENT_REF
7586 || TREE_CODE (whats_returned) == ARRAY_REF)
7587 whats_returned = TREE_OPERAND (whats_returned, 0);
7588
a2f1f4c3 7589 if (DECL_P (whats_returned)
2bfa73e4
BS
7590 && DECL_NAME (whats_returned)
7591 && DECL_FUNCTION_SCOPE_P (whats_returned)
7592 && !(TREE_STATIC (whats_returned)
7593 || TREE_PUBLIC (whats_returned)))
7594 {
7595 if (TREE_CODE (valtype) == REFERENCE_TYPE)
dee15844
JM
7596 warning (0, "reference to local variable %q+D returned",
7597 whats_returned);
2bfa73e4 7598 else
dee15844
JM
7599 warning (0, "address of local variable %q+D returned",
7600 whats_returned);
2bfa73e4 7601 return;
efee38a9
MM
7602 }
7603}
7604
0e339752 7605/* Check that returning RETVAL from the current function is valid.
efee38a9
MM
7606 Return an expression explicitly showing all conversions required to
7607 change RETVAL into the function return type, and to assign it to
0c9b182b
JJ
7608 the DECL_RESULT for the function. Set *NO_WARNING to true if
7609 code reaches end of non-void function warning shouldn't be issued
7610 on this RETURN_EXPR. */
efee38a9
MM
7611
7612tree
0c9b182b 7613check_return_expr (tree retval, bool *no_warning)
8d08fdba 7614{
efee38a9
MM
7615 tree result;
7616 /* The type actually returned by the function, after any
7617 promotions. */
7618 tree valtype;
7619 int fn_returns_value_p;
8af2fec4 7620 bool named_return_value_okay_p;
efee38a9 7621
0c9b182b
JJ
7622 *no_warning = false;
7623
efee38a9
MM
7624 /* A `volatile' function is one that isn't supposed to return, ever.
7625 (This is a G++ extension, used to get better code for functions
7626 that call the `volatile' function.) */
8d08fdba 7627 if (TREE_THIS_VOLATILE (current_function_decl))
d4ee4d25 7628 warning (0, "function declared %<noreturn%> has a %<return%> statement");
8d08fdba 7629
efee38a9 7630 /* Check for various simple errors. */
a0de9d20 7631 if (DECL_DESTRUCTOR_P (current_function_decl))
8d08fdba 7632 {
1c2c08a5 7633 if (retval)
8251199e 7634 error ("returning a value from a destructor");
efee38a9 7635 return NULL_TREE;
1c2c08a5 7636 }
90418208 7637 else if (DECL_CONSTRUCTOR_P (current_function_decl))
0dde4175 7638 {
90418208
JM
7639 if (in_function_try_handler)
7640 /* If a return statement appears in a handler of the
c6002625 7641 function-try-block of a constructor, the program is ill-formed. */
90418208
JM
7642 error ("cannot return from a handler of a function-try-block of a constructor");
7643 else if (retval)
7644 /* You can't return a value from a constructor. */
7645 error ("returning a value from a constructor");
7646 return NULL_TREE;
efee38a9 7647 }
efee38a9 7648
d5f4eddd
JM
7649 /* As an extension, deduce lambda return type from a return statement
7650 anywhere in the body. */
7651 if (retval && LAMBDA_FUNCTION_P (current_function_decl))
7652 {
7653 tree lambda = CLASSTYPE_LAMBDA_EXPR (current_class_type);
7654 if (LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda))
7655 {
7656 tree type = lambda_return_type (retval);
7657 tree oldtype = LAMBDA_EXPR_RETURN_TYPE (lambda);
7658
7659 if (VOID_TYPE_P (type))
7660 { /* Nothing. */ }
7661 else if (oldtype == NULL_TREE)
7662 {
7663 pedwarn (input_location, OPT_pedantic, "lambda return type "
7664 "can only be deduced when the return statement is "
7665 "the only statement in the function body");
7666 apply_lambda_return_type (lambda, type);
7667 }
7668 else if (!same_type_p (type, oldtype))
7669 error ("inconsistent types %qT and %qT deduced for "
7670 "lambda return type", type, oldtype);
7671 }
7672 }
7673
efc7052d
JM
7674 if (processing_template_decl)
7675 {
7676 current_function_returns_value = 1;
7b3e2d46 7677 if (check_for_bare_parameter_packs (retval))
4439d02f 7678 retval = error_mark_node;
efc7052d
JM
7679 return retval;
7680 }
c8094d83 7681
efee38a9
MM
7682 /* When no explicit return-value is given in a function with a named
7683 return value, the named return value is used. */
7684 result = DECL_RESULT (current_function_decl);
7685 valtype = TREE_TYPE (result);
50bc768d 7686 gcc_assert (valtype != NULL_TREE);
b72801e2 7687 fn_returns_value_p = !VOID_TYPE_P (valtype);
efee38a9
MM
7688 if (!retval && DECL_NAME (result) && fn_returns_value_p)
7689 retval = result;
7690
7691 /* Check for a return statement with no return value in a function
7692 that's supposed to return a value. */
7693 if (!retval && fn_returns_value_p)
7694 {
cbe5f3b3 7695 permerror (input_location, "return-statement with no value, in function returning %qT",
37ec60ed 7696 valtype);
efee38a9
MM
7697 /* Clear this, so finish_function won't say that we reach the
7698 end of a non-void function (which we don't, we gave a
7699 return!). */
7700 current_function_returns_null = 0;
0c9b182b 7701 /* And signal caller that TREE_NO_WARNING should be set on the
3db45ab5
MS
7702 RETURN_EXPR to avoid control reaches end of non-void function
7703 warnings in tree-cfg.c. */
0c9b182b 7704 *no_warning = true;
efee38a9
MM
7705 }
7706 /* Check for a return statement with a value in a function that
7707 isn't supposed to return a value. */
7708 else if (retval && !fn_returns_value_p)
c8094d83 7709 {
b72801e2 7710 if (VOID_TYPE_P (TREE_TYPE (retval)))
efee38a9
MM
7711 /* You can return a `void' value from a function of `void'
7712 type. In that case, we have to evaluate the expression for
7713 its side-effects. */
7714 finish_expr_stmt (retval);
7715 else
cbe5f3b3 7716 permerror (input_location, "return-statement with a value, in function "
37ec60ed 7717 "returning 'void'");
efee38a9
MM
7718 current_function_returns_null = 1;
7719
7720 /* There's really no value to return, after all. */
7721 return NULL_TREE;
0dde4175 7722 }
efee38a9
MM
7723 else if (!retval)
7724 /* Remember that this function can sometimes return without a
7725 value. */
7726 current_function_returns_null = 1;
90418208
JM
7727 else
7728 /* Remember that this function did return a value. */
7729 current_function_returns_value = 1;
1c2c08a5 7730
276318a5 7731 /* Check for erroneous operands -- but after giving ourselves a
5ae9ba3e
MM
7732 chance to provide an error about returning a value from a void
7733 function. */
7734 if (error_operand_p (retval))
7735 {
7736 current_function_return_value = error_mark_node;
7737 return error_mark_node;
7738 }
7739
7f477e81 7740 /* Only operator new(...) throw(), can return NULL [expr.new/13]. */
596ea4e5
AS
7741 if ((DECL_OVERLOADED_OPERATOR_P (current_function_decl) == NEW_EXPR
7742 || DECL_OVERLOADED_OPERATOR_P (current_function_decl) == VEC_NEW_EXPR)
7f477e81 7743 && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl))
708cae97 7744 && ! flag_check_new
aedfac0e 7745 && retval && null_ptr_cst_p (retval))
d4ee4d25 7746 warning (0, "%<operator new%> must not return NULL unless it is "
0cbd7506 7747 "declared %<throw()%> (or -fcheck-new is in effect)");
8d08fdba 7748
824b9a4c 7749 /* Effective C++ rule 15. See also start_function. */
eb448459 7750 if (warn_ecpp
47293da3
GB
7751 && DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR))
7752 {
7753 bool warn = true;
7754
7755 /* The function return type must be a reference to the current
7756 class. */
7757 if (TREE_CODE (valtype) == REFERENCE_TYPE
7758 && same_type_ignoring_top_level_qualifiers_p
7759 (TREE_TYPE (valtype), TREE_TYPE (current_class_ref)))
7760 {
7761 /* Returning '*this' is obviously OK. */
7762 if (retval == current_class_ref)
7763 warn = false;
7764 /* If we are calling a function whose return type is the same of
7765 the current class reference, it is ok. */
7766 else if (TREE_CODE (retval) == INDIRECT_REF
7767 && TREE_CODE (TREE_OPERAND (retval, 0)) == CALL_EXPR)
616adc47 7768 warn = false;
47293da3
GB
7769 }
7770
7771 if (warn)
b323323f 7772 warning (OPT_Weffc__, "%<operator=%> should return a reference to %<*this%>");
47293da3 7773 }
824b9a4c 7774
07b2f2fd
JM
7775 /* The fabled Named Return Value optimization, as per [class.copy]/15:
7776
7777 [...] For a function with a class return type, if the expression
7778 in the return statement is the name of a local object, and the cv-
7779 unqualified type of the local object is the same as the function
7780 return type, an implementation is permitted to omit creating the tem-
7781 porary object to hold the function return value [...]
7782
7783 So, if this is a value-returning function that always returns the same
7784 local variable, remember it.
0d97bf4c
JM
7785
7786 It might be nice to be more flexible, and choose the first suitable
7787 variable even if the function sometimes returns something else, but
7788 then we run the risk of clobbering the variable we chose if the other
7789 returned expression uses the chosen variable somehow. And people expect
07b2f2fd
JM
7790 this restriction, anyway. (jason 2000-11-19)
7791
324f9dfb 7792 See finish_function and finalize_nrv for the rest of this optimization. */
0d97bf4c 7793
8af2fec4
RY
7794 named_return_value_okay_p =
7795 (retval != NULL_TREE
7796 /* Must be a local, automatic variable. */
7797 && TREE_CODE (retval) == VAR_DECL
7798 && DECL_CONTEXT (retval) == current_function_decl
7799 && ! TREE_STATIC (retval)
59fe9274 7800 && ! DECL_ANON_UNION_VAR_P (retval)
8af2fec4
RY
7801 && (DECL_ALIGN (retval)
7802 >= DECL_ALIGN (DECL_RESULT (current_function_decl)))
7803 /* The cv-unqualified type of the returned value must be the
7804 same as the cv-unqualified return type of the
7805 function. */
7806 && same_type_p ((TYPE_MAIN_VARIANT (TREE_TYPE (retval))),
7807 (TYPE_MAIN_VARIANT
0e95aec1
CB
7808 (TREE_TYPE (TREE_TYPE (current_function_decl)))))
7809 /* And the returned value must be non-volatile. */
7810 && ! TYPE_VOLATILE (TREE_TYPE (retval)));
8af2fec4 7811
01f9e964 7812 if (fn_returns_value_p && flag_elide_constructors)
0d97bf4c 7813 {
8af2fec4
RY
7814 if (named_return_value_okay_p
7815 && (current_function_return_value == NULL_TREE
7816 || current_function_return_value == retval))
0d97bf4c
JM
7817 current_function_return_value = retval;
7818 else
7819 current_function_return_value = error_mark_node;
7820 }
7821
efee38a9
MM
7822 /* We don't need to do any conversions when there's nothing being
7823 returned. */
5ae9ba3e
MM
7824 if (!retval)
7825 return NULL_TREE;
efee38a9
MM
7826
7827 /* Do any required conversions. */
7828 if (retval == result || DECL_CONSTRUCTOR_P (current_function_decl))
7829 /* No conversions are required. */
7830 ;
8d08fdba
MS
7831 else
7832 {
efee38a9 7833 /* The type the function is declared to return. */
cce2be43 7834 tree functype = TREE_TYPE (TREE_TYPE (current_function_decl));
8af2fec4 7835 int flags = LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING;
cce2be43 7836
51b15ede
NS
7837 /* The functype's return type will have been set to void, if it
7838 was an incomplete type. Just treat this as 'return;' */
7839 if (VOID_TYPE_P (functype))
7840 return error_mark_node;
3db45ab5 7841
8af2fec4
RY
7842 /* Under C++0x [12.8/16 class.copy], a returned lvalue is sometimes
7843 treated as an rvalue for the purposes of overload resolution to
7844 favor move constructors over copy constructors. */
c1ae8be5 7845 if ((cxx_dialect != cxx98)
8af2fec4
RY
7846 && named_return_value_okay_p
7847 /* The variable must not have the `volatile' qualifier. */
a3360e77 7848 && !CP_TYPE_VOLATILE_P (TREE_TYPE (retval))
8af2fec4
RY
7849 /* The return type must be a class type. */
7850 && CLASS_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
7851 flags = flags | LOOKUP_PREFER_RVALUE;
7852
cce2be43
JM
7853 /* First convert the value to the function's return type, then
7854 to the type of return value's location to handle the
0cbd7506 7855 case that functype is smaller than the valtype. */
c1bc6829 7856 retval = convert_for_initialization
2f5b91f5 7857 (NULL_TREE, functype, retval, flags, ICR_RETURN, NULL_TREE, 0,
5ade1ed2 7858 tf_warning_or_error);
cce2be43
JM
7859 retval = convert (valtype, retval);
7860
efee38a9 7861 /* If the conversion failed, treat this just like `return;'. */
691c003d 7862 if (retval == error_mark_node)
90418208 7863 return retval;
02531345 7864 /* We can't initialize a register from a AGGR_INIT_EXPR. */
e3b5732b 7865 else if (! cfun->returns_struct
c1bc6829 7866 && TREE_CODE (retval) == TARGET_EXPR
02531345 7867 && TREE_CODE (TREE_OPERAND (retval, 1)) == AGGR_INIT_EXPR)
f293ce4b
RS
7868 retval = build2 (COMPOUND_EXPR, TREE_TYPE (retval), retval,
7869 TREE_OPERAND (retval, 0));
efee38a9
MM
7870 else
7871 maybe_warn_about_returning_address_of_local (retval);
8d08fdba 7872 }
c8094d83 7873
efee38a9 7874 /* Actually copy the value returned into the appropriate location. */
691c003d 7875 if (retval && retval != result)
f293ce4b 7876 retval = build2 (INIT_EXPR, TREE_TYPE (result), result, retval);
b88c08b6 7877
efee38a9
MM
7878 return retval;
7879}
7880
8d08fdba 7881\f
838dfd8a 7882/* Returns nonzero if the pointer-type FROM can be converted to the
ceab47eb 7883 pointer-type TO via a qualification conversion. If CONSTP is -1,
838dfd8a 7884 then we return nonzero if the pointers are similar, and the
ceab47eb
MM
7885 cv-qualification signature of FROM is a proper subset of that of TO.
7886
7887 If CONSTP is positive, then all outer pointers have been
7888 const-qualified. */
e92cc029 7889
bd6dd845 7890static int
acd8e2d0 7891comp_ptr_ttypes_real (tree to, tree from, int constp)
a0a33927 7892{
a5ac359a 7893 bool to_more_cv_qualified = false;
f83c7f63 7894 bool is_opaque_pointer = false;
ceab47eb 7895
a0a33927
MS
7896 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7897 {
7898 if (TREE_CODE (to) != TREE_CODE (from))
7899 return 0;
7900
d11ad92e 7901 if (TREE_CODE (from) == OFFSET_TYPE
b7a78333
MM
7902 && !same_type_p (TYPE_OFFSET_BASETYPE (from),
7903 TYPE_OFFSET_BASETYPE (to)))
7904 return 0;
d11ad92e 7905
f30432d7
MS
7906 /* Const and volatile mean something different for function types,
7907 so the usual checks are not appropriate. */
7908 if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
7909 {
660845bf
ZL
7910 /* In Objective-C++, some types may have been 'volatilized' by
7911 the compiler for EH; when comparing them here, the volatile
7912 qualification must be ignored. */
7913 bool objc_quals_match = objc_type_quals_match (to, from);
7914
7915 if (!at_least_as_qualified_p (to, from) && !objc_quals_match)
02020185 7916 return 0;
a0a33927 7917
660845bf 7918 if (!at_least_as_qualified_p (from, to) && !objc_quals_match)
02020185 7919 {
ceab47eb
MM
7920 if (constp == 0)
7921 return 0;
a5ac359a 7922 to_more_cv_qualified = true;
ceab47eb
MM
7923 }
7924
7925 if (constp > 0)
7926 constp &= TYPE_READONLY (to);
f30432d7 7927 }
a0a33927 7928
f83c7f63
DJ
7929 if (TREE_CODE (to) == VECTOR_TYPE)
7930 is_opaque_pointer = vector_targets_convertible_p (to, from);
7931
ae0b7dfc 7932 if (TREE_CODE (to) != POINTER_TYPE && !TYPE_PTRMEM_P (to))
8de9bb0e 7933 return ((constp >= 0 || to_more_cv_qualified)
f83c7f63
DJ
7934 && (is_opaque_pointer
7935 || same_type_ignoring_top_level_qualifiers_p (to, from)));
a0a33927
MS
7936 }
7937}
7938
8de9bb0e
NS
7939/* When comparing, say, char ** to char const **, this function takes
7940 the 'char *' and 'char const *'. Do not pass non-pointer/reference
7941 types to this function. */
e92cc029 7942
a0a33927 7943int
acd8e2d0 7944comp_ptr_ttypes (tree to, tree from)
a0a33927
MS
7945{
7946 return comp_ptr_ttypes_real (to, from, 1);
7947}
d11ad92e 7948
d4684c00
JM
7949/* Returns true iff FNTYPE is a non-class type that involves
7950 error_mark_node. We can get FUNCTION_TYPE with buried error_mark_node
7951 if a parameter type is ill-formed. */
7952
7953bool
7954error_type_p (const_tree type)
7955{
7956 tree t;
7957
7958 switch (TREE_CODE (type))
7959 {
7960 case ERROR_MARK:
7961 return true;
7962
7963 case POINTER_TYPE:
7964 case REFERENCE_TYPE:
7965 case OFFSET_TYPE:
7966 return error_type_p (TREE_TYPE (type));
7967
7968 case FUNCTION_TYPE:
7969 case METHOD_TYPE:
7970 if (error_type_p (TREE_TYPE (type)))
7971 return true;
7972 for (t = TYPE_ARG_TYPES (type); t; t = TREE_CHAIN (t))
7973 if (error_type_p (TREE_VALUE (t)))
7974 return true;
7975 return false;
7976
7977 case RECORD_TYPE:
7978 if (TYPE_PTRMEMFUNC_P (type))
7979 return error_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type));
7980 return false;
7981
7982 default:
7983 return false;
7984 }
7985}
7986
d11ad92e
MS
7987/* Returns 1 if to and from are (possibly multi-level) pointers to the same
7988 type or inheritance-related types, regardless of cv-quals. */
7989
7990int
58f9752a 7991ptr_reasonably_similar (const_tree to, const_tree from)
d11ad92e
MS
7992{
7993 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7994 {
72a08131 7995 /* Any target type is similar enough to void. */
d4684c00
JM
7996 if (TREE_CODE (to) == VOID_TYPE)
7997 return !error_type_p (from);
7998 if (TREE_CODE (from) == VOID_TYPE)
7999 return !error_type_p (to);
72a08131 8000
d11ad92e
MS
8001 if (TREE_CODE (to) != TREE_CODE (from))
8002 return 0;
8003
8004 if (TREE_CODE (from) == OFFSET_TYPE
96d84882
PB
8005 && comptypes (TYPE_OFFSET_BASETYPE (to),
8006 TYPE_OFFSET_BASETYPE (from),
8007 COMPARE_BASE | COMPARE_DERIVED))
d11ad92e
MS
8008 continue;
8009
d70b8c3a 8010 if (TREE_CODE (to) == VECTOR_TYPE
00c8e9f6 8011 && vector_types_convertible_p (to, from, false))
d70b8c3a
PB
8012 return 1;
8013
8a2b77e7
JM
8014 if (TREE_CODE (to) == INTEGER_TYPE
8015 && TYPE_PRECISION (to) == TYPE_PRECISION (from))
8016 return 1;
8017
8018 if (TREE_CODE (to) == FUNCTION_TYPE)
d4684c00 8019 return !error_type_p (to) && !error_type_p (from);
8a2b77e7 8020
d11ad92e 8021 if (TREE_CODE (to) != POINTER_TYPE)
96d84882 8022 return comptypes
c8094d83 8023 (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
c8a209ca 8024 COMPARE_BASE | COMPARE_DERIVED);
d11ad92e
MS
8025 }
8026}
c11b6f21 8027
34b5375f
MM
8028/* Return true if TO and FROM (both of which are POINTER_TYPEs or
8029 pointer-to-member types) are the same, ignoring cv-qualification at
8030 all levels. */
c11b6f21 8031
34b5375f 8032bool
acd8e2d0 8033comp_ptr_ttypes_const (tree to, tree from)
c11b6f21 8034{
f83c7f63
DJ
8035 bool is_opaque_pointer = false;
8036
c11b6f21
MS
8037 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
8038 {
8039 if (TREE_CODE (to) != TREE_CODE (from))
34b5375f 8040 return false;
c11b6f21
MS
8041
8042 if (TREE_CODE (from) == OFFSET_TYPE
3bfdc719
MM
8043 && same_type_p (TYPE_OFFSET_BASETYPE (from),
8044 TYPE_OFFSET_BASETYPE (to)))
c11b6f21
MS
8045 continue;
8046
f83c7f63
DJ
8047 if (TREE_CODE (to) == VECTOR_TYPE)
8048 is_opaque_pointer = vector_targets_convertible_p (to, from);
8049
c11b6f21 8050 if (TREE_CODE (to) != POINTER_TYPE)
f83c7f63
DJ
8051 return (is_opaque_pointer
8052 || same_type_ignoring_top_level_qualifiers_p (to, from));
c11b6f21
MS
8053 }
8054}
8055
89d684bb
BM
8056/* Returns the type qualifiers for this type, including the qualifiers on the
8057 elements for an array type. */
27778b73
MM
8058
8059int
ac7d7749 8060cp_type_quals (const_tree type)
27778b73 8061{
2872152c 8062 int quals;
4e9b57fa 8063 /* This CONST_CAST is okay because strip_array_types returns its
75547801 8064 argument unmodified and we assign it to a const_tree. */
2872152c
JM
8065 type = strip_array_types (CONST_CAST_TREE (type));
8066 if (type == error_mark_node
8067 /* Quals on a FUNCTION_TYPE are memfn quals. */
8068 || TREE_CODE (type) == FUNCTION_TYPE)
328de7c2 8069 return TYPE_UNQUALIFIED;
2872152c
JM
8070 quals = TYPE_QUALS (type);
8071 /* METHOD and REFERENCE_TYPEs should never have quals. */
8072 gcc_assert ((TREE_CODE (type) != METHOD_TYPE
8073 && TREE_CODE (type) != REFERENCE_TYPE)
8074 || ((quals & (TYPE_QUAL_CONST|TYPE_QUAL_VOLATILE))
8075 == TYPE_UNQUALIFIED));
8076 return quals;
8077}
8078
8079/* Returns the function-cv-quals for TYPE, which must be a FUNCTION_TYPE or
8080 METHOD_TYPE. */
8081
8082int
8083type_memfn_quals (const_tree type)
8084{
8085 if (TREE_CODE (type) == FUNCTION_TYPE)
8086 return TYPE_QUALS (type);
8087 else if (TREE_CODE (type) == METHOD_TYPE)
8088 return cp_type_quals (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (type))));
8089 else
8090 gcc_unreachable ();
8091}
8092
8093/* Returns the FUNCTION_TYPE TYPE with its function-cv-quals changed to
8094 MEMFN_QUALS. */
8095
8096tree
8097apply_memfn_quals (tree type, cp_cv_quals memfn_quals)
8098{
8099 /* Could handle METHOD_TYPE here if necessary. */
8100 gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
8101 if (TYPE_QUALS (type) == memfn_quals)
8102 return type;
8103 /* This should really have a different TYPE_MAIN_VARIANT, but that gets
8104 complex. */
8105 return build_qualified_type (type, memfn_quals);
91063b51 8106}
a7a7710d 8107
36c37128
JM
8108/* Returns nonzero if TYPE is const or volatile. */
8109
8110bool
8111cv_qualified_p (const_tree type)
8112{
8113 int quals = cp_type_quals (type);
8114 return (quals & (TYPE_QUAL_CONST|TYPE_QUAL_VOLATILE)) != 0;
8115}
8116
f4f206f4 8117/* Returns nonzero if the TYPE contains a mutable member. */
a7a7710d 8118
acd8e2d0 8119bool
58f9752a 8120cp_has_mutable_p (const_tree type)
a7a7710d 8121{
4e9b57fa 8122 /* This CONST_CAST is okay because strip_array_types returns its
75547801 8123 argument unmodified and we assign it to a const_tree. */
b1d5455a 8124 type = strip_array_types (CONST_CAST_TREE(type));
a7a7710d
NS
8125
8126 return CLASS_TYPE_P (type) && CLASSTYPE_HAS_MUTABLE (type);
8127}
af7b9902 8128
15896502
MM
8129/* Set TREE_READONLY and TREE_VOLATILE on DECL as indicated by the
8130 TYPE_QUALS. For a VAR_DECL, this may be an optimistic
8131 approximation. In particular, consider:
8132
8133 int f();
8134 struct S { int i; };
8135 const S s = { f(); }
8136
8137 Here, we will make "s" as TREE_READONLY (because it is declared
8138 "const") -- only to reverse ourselves upon seeing that the
8139 initializer is non-constant. */
8140
9804209d
DG
8141void
8142cp_apply_type_quals_to_decl (int type_quals, tree decl)
8143{
8144 tree type = TREE_TYPE (decl);
8145
8146 if (type == error_mark_node)
8147 return;
8148
0d9c0892
JM
8149 if (TREE_CODE (decl) == TYPE_DECL)
8150 return;
8151
93e1ddcf
JM
8152 gcc_assert (!(TREE_CODE (type) == FUNCTION_TYPE
8153 && type_quals != TYPE_UNQUALIFIED));
9804209d 8154
67935995
MM
8155 /* Avoid setting TREE_READONLY incorrectly. */
8156 if (/* If the object has a constructor, the constructor may modify
8157 the object. */
8158 TYPE_NEEDS_CONSTRUCTING (type)
8159 /* If the type isn't complete, we don't know yet if it will need
8160 constructing. */
c8094d83 8161 || !COMPLETE_TYPE_P (type)
67935995
MM
8162 /* If the type has a mutable component, that component might be
8163 modified. */
8164 || TYPE_HAS_MUTABLE_P (type))
8165 type_quals &= ~TYPE_QUAL_CONST;
8166
9804209d
DG
8167 c_apply_type_quals_to_decl (type_quals, decl);
8168}
8169
af7b9902 8170/* Subroutine of casts_away_constness. Make T1 and T2 point at
33c25e5c 8171 exemplar types such that casting T1 to T2 is casting away constness
af7b9902
MM
8172 if and only if there is no implicit conversion from T1 to T2. */
8173
8174static void
acd8e2d0 8175casts_away_constness_r (tree *t1, tree *t2)
af7b9902
MM
8176{
8177 int quals1;
8178 int quals2;
8179
8180 /* [expr.const.cast]
8181
8182 For multi-level pointer to members and multi-level mixed pointers
8183 and pointers to members (conv.qual), the "member" aspect of a
8184 pointer to member level is ignored when determining if a const
8185 cv-qualifier has been cast away. */
af7b9902
MM
8186 /* [expr.const.cast]
8187
8188 For two pointer types:
8189
0cbd7506
MS
8190 X1 is T1cv1,1 * ... cv1,N * where T1 is not a pointer type
8191 X2 is T2cv2,1 * ... cv2,M * where T2 is not a pointer type
8192 K is min(N,M)
af7b9902
MM
8193
8194 casting from X1 to X2 casts away constness if, for a non-pointer
8195 type T there does not exist an implicit conversion (clause
8196 _conv_) from:
8197
0cbd7506 8198 Tcv1,(N-K+1) * cv1,(N-K+2) * ... cv1,N *
c8094d83 8199
af7b9902
MM
8200 to
8201
0cbd7506 8202 Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *. */
dad732fa
MM
8203 if ((!TYPE_PTR_P (*t1) && !TYPE_PTRMEM_P (*t1))
8204 || (!TYPE_PTR_P (*t2) && !TYPE_PTRMEM_P (*t2)))
af7b9902
MM
8205 {
8206 *t1 = cp_build_qualified_type (void_type_node,
89d684bb 8207 cp_type_quals (*t1));
af7b9902 8208 *t2 = cp_build_qualified_type (void_type_node,
89d684bb 8209 cp_type_quals (*t2));
af7b9902
MM
8210 return;
8211 }
c8094d83 8212
89d684bb
BM
8213 quals1 = cp_type_quals (*t1);
8214 quals2 = cp_type_quals (*t2);
dad732fa
MM
8215
8216 if (TYPE_PTRMEM_P (*t1))
8217 *t1 = TYPE_PTRMEM_POINTED_TO_TYPE (*t1);
8218 else
8219 *t1 = TREE_TYPE (*t1);
8220 if (TYPE_PTRMEM_P (*t2))
8221 *t2 = TYPE_PTRMEM_POINTED_TO_TYPE (*t2);
8222 else
8223 *t2 = TREE_TYPE (*t2);
8224
af7b9902
MM
8225 casts_away_constness_r (t1, t2);
8226 *t1 = build_pointer_type (*t1);
8227 *t2 = build_pointer_type (*t2);
8228 *t1 = cp_build_qualified_type (*t1, quals1);
8229 *t2 = cp_build_qualified_type (*t2, quals2);
8230}
8231
838dfd8a 8232/* Returns nonzero if casting from TYPE1 to TYPE2 casts away
36ef7262
MLI
8233 constness.
8234
8235 ??? This function returns non-zero if casting away qualifiers not
8236 just const. We would like to return to the caller exactly which
8237 qualifiers are casted away to give more accurate diagnostics.
8238*/
af7b9902 8239
acd8e2d0
NS
8240static bool
8241casts_away_constness (tree t1, tree t2)
af7b9902
MM
8242{
8243 if (TREE_CODE (t2) == REFERENCE_TYPE)
8244 {
8245 /* [expr.const.cast]
c8094d83 8246
af7b9902
MM
8247 Casting from an lvalue of type T1 to an lvalue of type T2
8248 using a reference cast casts away constness if a cast from an
8249 rvalue of type "pointer to T1" to the type "pointer to T2"
8250 casts away constness. */
acd8e2d0 8251 t1 = (TREE_CODE (t1) == REFERENCE_TYPE ? TREE_TYPE (t1) : t1);
af7b9902
MM
8252 return casts_away_constness (build_pointer_type (t1),
8253 build_pointer_type (TREE_TYPE (t2)));
8254 }
8255
8256 if (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
8257 /* [expr.const.cast]
c8094d83 8258
af7b9902
MM
8259 Casting from an rvalue of type "pointer to data member of X
8260 of type T1" to the type "pointer to data member of Y of type
8261 T2" casts away constness if a cast from an rvalue of type
aba649ba 8262 "pointer to T1" to the type "pointer to T2" casts away
af7b9902 8263 constness. */
3e0b4710 8264 return casts_away_constness
a5ac359a
MM
8265 (build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t1)),
8266 build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t2)));
af7b9902
MM
8267
8268 /* Casting away constness is only something that makes sense for
8269 pointer or reference types. */
c8094d83 8270 if (TREE_CODE (t1) != POINTER_TYPE
af7b9902 8271 || TREE_CODE (t2) != POINTER_TYPE)
acd8e2d0 8272 return false;
af7b9902
MM
8273
8274 /* Top-level qualifiers don't matter. */
8275 t1 = TYPE_MAIN_VARIANT (t1);
8276 t2 = TYPE_MAIN_VARIANT (t2);
8277 casts_away_constness_r (&t1, &t2);
8278 if (!can_convert (t2, t1))
acd8e2d0 8279 return true;
af7b9902 8280
acd8e2d0 8281 return false;
af7b9902 8282}
6816f040 8283
ee76b931
MM
8284/* If T is a REFERENCE_TYPE return the type to which T refers.
8285 Otherwise, return T itself. */
8286
8287tree
8288non_reference (tree t)
8289{
8290 if (TREE_CODE (t) == REFERENCE_TYPE)
8291 t = TREE_TYPE (t);
8292 return t;
8293}
37dc0d8d
JM
8294
8295
8296/* Return nonzero if REF is an lvalue valid for this language;
8297 otherwise, print an error message and return zero. USE says
8298 how the lvalue is being used and so selects the error message. */
8299
8300int
4af9e878 8301lvalue_or_else (tree ref, enum lvalue_use use, tsubst_flags_t complain)
37dc0d8d
JM
8302{
8303 int win = lvalue_p (ref);
8304
5ade1ed2 8305 if (!win && (complain & tf_error))
37dc0d8d
JM
8306 lvalue_error (use);
8307
8308 return win;
8309}
03a904b5 8310
This page took 5.34235 seconds and 5 git commands to generate.