1 /* Build expressions with type checking for C++ compiler.
2 Copyright (C) 1987-2022 Free Software Foundation, Inc.
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21
22 /* This file is part of the C++ front end.
23 It contains routines to build C++ expressions given their operands,
24 including computing the types of the result, C and C++ specific error
25 checks, and some optimization. */
26
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "target.h"
31 #include "cp-tree.h"
32 #include "stor-layout.h"
33 #include "varasm.h"
34 #include "intl.h"
35 #include "convert.h"
36 #include "c-family/c-objc.h"
37 #include "c-family/c-ubsan.h"
38 #include "gcc-rich-location.h"
39 #include "stringpool.h"
40 #include "attribs.h"
41 #include "asan.h"
42 #include "gimplify.h"
43
44 static tree cp_build_addr_expr_strict (tree, tsubst_flags_t);
45 static tree cp_build_function_call (tree, tree, tsubst_flags_t);
46 static tree pfn_from_ptrmemfunc (tree);
47 static tree delta_from_ptrmemfunc (tree);
48 static tree convert_for_assignment (tree, tree, impl_conv_rhs, tree, int,
49 tsubst_flags_t, int);
50 static tree cp_pointer_int_sum (location_t, enum tree_code, tree, tree,
51 tsubst_flags_t);
52 static tree rationalize_conditional_expr (enum tree_code, tree,
53 tsubst_flags_t);
54 static bool comp_ptr_ttypes_real (tree, tree, int);
55 static bool comp_except_types (tree, tree, bool);
56 static bool comp_array_types (const_tree, const_tree, compare_bounds_t, bool);
57 static tree pointer_diff (location_t, tree, tree, tree, tsubst_flags_t, tree *);
58 static tree get_delta_difference (tree, tree, bool, bool, tsubst_flags_t);
59 static void casts_away_constness_r (tree *, tree *, tsubst_flags_t);
60 static bool casts_away_constness (tree, tree, tsubst_flags_t);
61 static bool maybe_warn_about_returning_address_of_local (tree, location_t = UNKNOWN_LOCATION);
62 static void error_args_num (location_t, tree, bool);
63 static int convert_arguments (tree, vec<tree, va_gc> **, tree, int,
64 tsubst_flags_t);
65 static bool is_std_move_p (tree);
66 static bool is_std_forward_p (tree);
67
68 /* Do `exp = require_complete_type (exp);' to make sure exp
69 does not have an incomplete type. (That includes void types.)
70 Returns error_mark_node if the VALUE does not have
71 complete type when this function returns. */
72
73 tree
require_complete_type_sfinae(tree value,tsubst_flags_t complain)74 require_complete_type_sfinae (tree value, tsubst_flags_t complain)
75 {
76 tree type;
77
78 if (processing_template_decl || value == error_mark_node)
79 return value;
80
81 if (TREE_CODE (value) == OVERLOAD)
82 type = unknown_type_node;
83 else
84 type = TREE_TYPE (value);
85
86 if (type == error_mark_node)
87 return error_mark_node;
88
89 /* First, detect a valid value with a complete type. */
90 if (COMPLETE_TYPE_P (type))
91 return value;
92
93 if (complete_type_or_maybe_complain (type, value, complain))
94 return value;
95 else
96 return error_mark_node;
97 }
98
99 tree
require_complete_type(tree value)100 require_complete_type (tree value)
101 {
102 return require_complete_type_sfinae (value, tf_warning_or_error);
103 }
104
105 /* Try to complete TYPE, if it is incomplete. For example, if TYPE is
106 a template instantiation, do the instantiation. Returns TYPE,
107 whether or not it could be completed, unless something goes
108 horribly wrong, in which case the error_mark_node is returned. */
109
110 tree
complete_type(tree type)111 complete_type (tree type)
112 {
113 if (type == NULL_TREE)
114 /* Rather than crash, we return something sure to cause an error
115 at some point. */
116 return error_mark_node;
117
118 if (type == error_mark_node || COMPLETE_TYPE_P (type))
119 ;
120 else if (TREE_CODE (type) == ARRAY_TYPE)
121 {
122 tree t = complete_type (TREE_TYPE (type));
123 unsigned int needs_constructing, has_nontrivial_dtor;
124 if (COMPLETE_TYPE_P (t) && !dependent_type_p (type))
125 layout_type (type);
126 needs_constructing
127 = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (t));
128 has_nontrivial_dtor
129 = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TYPE_MAIN_VARIANT (t));
130 for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
131 {
132 TYPE_NEEDS_CONSTRUCTING (t) = needs_constructing;
133 TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = has_nontrivial_dtor;
134 }
135 }
136 else if (CLASS_TYPE_P (type))
137 {
138 if (modules_p ())
139 /* TYPE could be a class member we've not loaded the definition of. */
140 lazy_load_pendings (TYPE_NAME (TYPE_MAIN_VARIANT (type)));
141
142 if (CLASSTYPE_TEMPLATE_INSTANTIATION (type))
143 instantiate_class_template (TYPE_MAIN_VARIANT (type));
144 }
145
146 return type;
147 }
148
149 /* Like complete_type, but issue an error if the TYPE cannot be completed.
150 VALUE is used for informative diagnostics.
151 Returns NULL_TREE if the type cannot be made complete. */
152
153 tree
complete_type_or_maybe_complain(tree type,tree value,tsubst_flags_t complain)154 complete_type_or_maybe_complain (tree type, tree value, tsubst_flags_t complain)
155 {
156 type = complete_type (type);
157 if (type == error_mark_node)
158 /* We already issued an error. */
159 return NULL_TREE;
160 else if (!COMPLETE_TYPE_P (type))
161 {
162 if (complain & tf_error)
163 cxx_incomplete_type_diagnostic (value, type, DK_ERROR);
164 note_failed_type_completion_for_satisfaction (type);
165 return NULL_TREE;
166 }
167 else
168 return type;
169 }
170
171 tree
complete_type_or_else(tree type,tree value)172 complete_type_or_else (tree type, tree value)
173 {
174 return complete_type_or_maybe_complain (type, value, tf_warning_or_error);
175 }
176
177
178 /* Return the common type of two parameter lists.
179 We assume that comptypes has already been done and returned 1;
180 if that isn't so, this may crash.
181
182 As an optimization, free the space we allocate if the parameter
183 lists are already common. */
184
185 static tree
commonparms(tree p1,tree p2)186 commonparms (tree p1, tree p2)
187 {
188 tree oldargs = p1, newargs, n;
189 int i, len;
190 int any_change = 0;
191
192 len = list_length (p1);
193 newargs = tree_last (p1);
194
195 if (newargs == void_list_node)
196 i = 1;
197 else
198 {
199 i = 0;
200 newargs = 0;
201 }
202
203 for (; i < len; i++)
204 newargs = tree_cons (NULL_TREE, NULL_TREE, newargs);
205
206 n = newargs;
207
208 for (i = 0; p1;
209 p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n), i++)
210 {
211 if (TREE_PURPOSE (p1) && !TREE_PURPOSE (p2))
212 {
213 TREE_PURPOSE (n) = TREE_PURPOSE (p1);
214 any_change = 1;
215 }
216 else if (! TREE_PURPOSE (p1))
217 {
218 if (TREE_PURPOSE (p2))
219 {
220 TREE_PURPOSE (n) = TREE_PURPOSE (p2);
221 any_change = 1;
222 }
223 }
224 else
225 {
226 if (simple_cst_equal (TREE_PURPOSE (p1), TREE_PURPOSE (p2)) != 1)
227 any_change = 1;
228 TREE_PURPOSE (n) = TREE_PURPOSE (p2);
229 }
230 if (TREE_VALUE (p1) != TREE_VALUE (p2))
231 {
232 any_change = 1;
233 TREE_VALUE (n) = merge_types (TREE_VALUE (p1), TREE_VALUE (p2));
234 }
235 else
236 TREE_VALUE (n) = TREE_VALUE (p1);
237 }
238 if (! any_change)
239 return oldargs;
240
241 return newargs;
242 }
243
244 /* Given a type, perhaps copied for a typedef,
245 find the "original" version of it. */
246 static tree
original_type(tree t)247 original_type (tree t)
248 {
249 int quals = cp_type_quals (t);
250 while (t != error_mark_node
251 && TYPE_NAME (t) != NULL_TREE)
252 {
253 tree x = TYPE_NAME (t);
254 if (TREE_CODE (x) != TYPE_DECL)
255 break;
256 x = DECL_ORIGINAL_TYPE (x);
257 if (x == NULL_TREE)
258 break;
259 t = x;
260 }
261 return cp_build_qualified_type (t, quals);
262 }
263
264 /* Merge the attributes of type OTHER_TYPE into the attributes of type TYPE
265 and return a variant of TYPE with the merged attributes. */
266
267 static tree
merge_type_attributes_from(tree type,tree other_type)268 merge_type_attributes_from (tree type, tree other_type)
269 {
270 tree attrs = targetm.merge_type_attributes (type, other_type);
271 attrs = restrict_type_identity_attributes_to (attrs, TYPE_ATTRIBUTES (type));
272 return cp_build_type_attribute_variant (type, attrs);
273 }
274
275 /* Return the common type for two arithmetic types T1 and T2 under the
276 usual arithmetic conversions. The default conversions have already
277 been applied, and enumerated types converted to their compatible
278 integer types. */
279
280 static tree
cp_common_type(tree t1,tree t2)281 cp_common_type (tree t1, tree t2)
282 {
283 enum tree_code code1 = TREE_CODE (t1);
284 enum tree_code code2 = TREE_CODE (t2);
285 tree attributes;
286 int i;
287
288
289 /* In what follows, we slightly generalize the rules given in [expr] so
290 as to deal with `long long' and `complex'. First, merge the
291 attributes. */
292 attributes = (*targetm.merge_type_attributes) (t1, t2);
293
294 if (SCOPED_ENUM_P (t1) || SCOPED_ENUM_P (t2))
295 {
296 if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
297 return build_type_attribute_variant (t1, attributes);
298 else
299 return NULL_TREE;
300 }
301
302 /* FIXME: Attributes. */
303 gcc_assert (ARITHMETIC_TYPE_P (t1)
304 || VECTOR_TYPE_P (t1)
305 || UNSCOPED_ENUM_P (t1));
306 gcc_assert (ARITHMETIC_TYPE_P (t2)
307 || VECTOR_TYPE_P (t2)
308 || UNSCOPED_ENUM_P (t2));
309
310 /* If one type is complex, form the common type of the non-complex
311 components, then make that complex. Use T1 or T2 if it is the
312 required type. */
313 if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE)
314 {
315 tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1;
316 tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2;
317 tree subtype
318 = type_after_usual_arithmetic_conversions (subtype1, subtype2);
319
320 if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype)
321 return build_type_attribute_variant (t1, attributes);
322 else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
323 return build_type_attribute_variant (t2, attributes);
324 else
325 return build_type_attribute_variant (build_complex_type (subtype),
326 attributes);
327 }
328
329 if (code1 == VECTOR_TYPE)
330 {
331 /* When we get here we should have two vectors of the same size.
332 Just prefer the unsigned one if present. */
333 if (TYPE_UNSIGNED (t1))
334 return merge_type_attributes_from (t1, t2);
335 else
336 return merge_type_attributes_from (t2, t1);
337 }
338
339 /* If only one is real, use it as the result. */
340 if (code1 == REAL_TYPE && code2 != REAL_TYPE)
341 return build_type_attribute_variant (t1, attributes);
342 if (code2 == REAL_TYPE && code1 != REAL_TYPE)
343 return build_type_attribute_variant (t2, attributes);
344
345 /* Both real or both integers; use the one with greater precision. */
346 if (TYPE_PRECISION (t1) > TYPE_PRECISION (t2))
347 return build_type_attribute_variant (t1, attributes);
348 else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
349 return build_type_attribute_variant (t2, attributes);
350
351 /* The types are the same; no need to do anything fancy. */
352 if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
353 return build_type_attribute_variant (t1, attributes);
354
355 if (code1 != REAL_TYPE)
356 {
357 /* If one is unsigned long long, then convert the other to unsigned
358 long long. */
359 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_long_unsigned_type_node)
360 || same_type_p (TYPE_MAIN_VARIANT (t2), long_long_unsigned_type_node))
361 return build_type_attribute_variant (long_long_unsigned_type_node,
362 attributes);
363 /* If one is a long long, and the other is an unsigned long, and
364 long long can represent all the values of an unsigned long, then
365 convert to a long long. Otherwise, convert to an unsigned long
366 long. Otherwise, if either operand is long long, convert the
367 other to long long.
368
369 Since we're here, we know the TYPE_PRECISION is the same;
370 therefore converting to long long cannot represent all the values
371 of an unsigned long, so we choose unsigned long long in that
372 case. */
373 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_long_integer_type_node)
374 || same_type_p (TYPE_MAIN_VARIANT (t2), long_long_integer_type_node))
375 {
376 tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
377 ? long_long_unsigned_type_node
378 : long_long_integer_type_node);
379 return build_type_attribute_variant (t, attributes);
380 }
381
382 /* Go through the same procedure, but for longs. */
383 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_unsigned_type_node)
384 || same_type_p (TYPE_MAIN_VARIANT (t2), long_unsigned_type_node))
385 return build_type_attribute_variant (long_unsigned_type_node,
386 attributes);
387 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_integer_type_node)
388 || same_type_p (TYPE_MAIN_VARIANT (t2), long_integer_type_node))
389 {
390 tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
391 ? long_unsigned_type_node : long_integer_type_node);
392 return build_type_attribute_variant (t, attributes);
393 }
394
395 /* For __intN types, either the type is __int128 (and is lower
396 priority than the types checked above, but higher than other
397 128-bit types) or it's known to not be the same size as other
398 types (enforced in toplev.cc). Prefer the unsigned type. */
399 for (i = 0; i < NUM_INT_N_ENTS; i ++)
400 {
401 if (int_n_enabled_p [i]
402 && (same_type_p (TYPE_MAIN_VARIANT (t1), int_n_trees[i].signed_type)
403 || same_type_p (TYPE_MAIN_VARIANT (t2), int_n_trees[i].signed_type)
404 || same_type_p (TYPE_MAIN_VARIANT (t1), int_n_trees[i].unsigned_type)
405 || same_type_p (TYPE_MAIN_VARIANT (t2), int_n_trees[i].unsigned_type)))
406 {
407 tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
408 ? int_n_trees[i].unsigned_type
409 : int_n_trees[i].signed_type);
410 return build_type_attribute_variant (t, attributes);
411 }
412 }
413
414 /* Otherwise prefer the unsigned one. */
415 if (TYPE_UNSIGNED (t1))
416 return build_type_attribute_variant (t1, attributes);
417 else
418 return build_type_attribute_variant (t2, attributes);
419 }
420 else
421 {
422 if (same_type_p (TYPE_MAIN_VARIANT (t1), long_double_type_node)
423 || same_type_p (TYPE_MAIN_VARIANT (t2), long_double_type_node))
424 return build_type_attribute_variant (long_double_type_node,
425 attributes);
426 if (same_type_p (TYPE_MAIN_VARIANT (t1), double_type_node)
427 || same_type_p (TYPE_MAIN_VARIANT (t2), double_type_node))
428 return build_type_attribute_variant (double_type_node,
429 attributes);
430 if (same_type_p (TYPE_MAIN_VARIANT (t1), float_type_node)
431 || same_type_p (TYPE_MAIN_VARIANT (t2), float_type_node))
432 return build_type_attribute_variant (float_type_node,
433 attributes);
434
435 /* Two floating-point types whose TYPE_MAIN_VARIANTs are none of
436 the standard C++ floating-point types. Logic earlier in this
437 function has already eliminated the possibility that
438 TYPE_PRECISION (t2) != TYPE_PRECISION (t1), so there's no
439 compelling reason to choose one or the other. */
440 return build_type_attribute_variant (t1, attributes);
441 }
442 }
443
444 /* T1 and T2 are arithmetic or enumeration types. Return the type
445 that will result from the "usual arithmetic conversions" on T1 and
446 T2 as described in [expr]. */
447
448 tree
type_after_usual_arithmetic_conversions(tree t1,tree t2)449 type_after_usual_arithmetic_conversions (tree t1, tree t2)
450 {
451 gcc_assert (ARITHMETIC_TYPE_P (t1)
452 || VECTOR_TYPE_P (t1)
453 || UNSCOPED_ENUM_P (t1));
454 gcc_assert (ARITHMETIC_TYPE_P (t2)
455 || VECTOR_TYPE_P (t2)
456 || UNSCOPED_ENUM_P (t2));
457
458 /* Perform the integral promotions. We do not promote real types here. */
459 if (INTEGRAL_OR_ENUMERATION_TYPE_P (t1)
460 && INTEGRAL_OR_ENUMERATION_TYPE_P (t2))
461 {
462 t1 = type_promotes_to (t1);
463 t2 = type_promotes_to (t2);
464 }
465
466 return cp_common_type (t1, t2);
467 }
468
469 static void
composite_pointer_error(const op_location_t & location,diagnostic_t kind,tree t1,tree t2,composite_pointer_operation operation)470 composite_pointer_error (const op_location_t &location,
471 diagnostic_t kind, tree t1, tree t2,
472 composite_pointer_operation operation)
473 {
474 switch (operation)
475 {
476 case CPO_COMPARISON:
477 emit_diagnostic (kind, location, 0,
478 "comparison between "
479 "distinct pointer types %qT and %qT lacks a cast",
480 t1, t2);
481 break;
482 case CPO_CONVERSION:
483 emit_diagnostic (kind, location, 0,
484 "conversion between "
485 "distinct pointer types %qT and %qT lacks a cast",
486 t1, t2);
487 break;
488 case CPO_CONDITIONAL_EXPR:
489 emit_diagnostic (kind, location, 0,
490 "conditional expression between "
491 "distinct pointer types %qT and %qT lacks a cast",
492 t1, t2);
493 break;
494 default:
495 gcc_unreachable ();
496 }
497 }
498
499 /* Subroutine of composite_pointer_type to implement the recursive
500 case. See that function for documentation of the parameters. And ADD_CONST
501 is used to track adding "const" where needed. */
502
503 static tree
composite_pointer_type_r(const op_location_t & location,tree t1,tree t2,bool * add_const,composite_pointer_operation operation,tsubst_flags_t complain)504 composite_pointer_type_r (const op_location_t &location,
505 tree t1, tree t2, bool *add_const,
506 composite_pointer_operation operation,
507 tsubst_flags_t complain)
508 {
509 tree pointee1;
510 tree pointee2;
511 tree result_type;
512 tree attributes;
513
514 /* Determine the types pointed to by T1 and T2. */
515 if (TYPE_PTR_P (t1))
516 {
517 pointee1 = TREE_TYPE (t1);
518 pointee2 = TREE_TYPE (t2);
519 }
520 else
521 {
522 pointee1 = TYPE_PTRMEM_POINTED_TO_TYPE (t1);
523 pointee2 = TYPE_PTRMEM_POINTED_TO_TYPE (t2);
524 }
525
526 /* [expr.type]
527
528 If T1 and T2 are similar types, the result is the cv-combined type of
529 T1 and T2. */
530 if (same_type_ignoring_top_level_qualifiers_p (pointee1, pointee2))
531 result_type = pointee1;
532 else if ((TYPE_PTR_P (pointee1) && TYPE_PTR_P (pointee2))
533 || (TYPE_PTRMEM_P (pointee1) && TYPE_PTRMEM_P (pointee2)))
534 {
535 result_type = composite_pointer_type_r (location, pointee1, pointee2,
536 add_const, operation, complain);
537 if (result_type == error_mark_node)
538 return error_mark_node;
539 }
540 else
541 {
542 if (complain & tf_error)
543 composite_pointer_error (location, DK_PERMERROR,
544 t1, t2, operation);
545 else
546 return error_mark_node;
547 result_type = void_type_node;
548 }
549 const int q1 = cp_type_quals (pointee1);
550 const int q2 = cp_type_quals (pointee2);
551 const int quals = q1 | q2;
552 result_type = cp_build_qualified_type (result_type,
553 (quals | (*add_const
554 ? TYPE_QUAL_CONST
555 : TYPE_UNQUALIFIED)));
556 /* The cv-combined type can add "const" as per [conv.qual]/3.3 (except for
557 the TLQ). The reason is that both T1 and T2 can then be converted to the
558 cv-combined type of T1 and T2. */
559 if (quals != q1 || quals != q2)
560 *add_const = true;
561 /* If the original types were pointers to members, so is the
562 result. */
563 if (TYPE_PTRMEM_P (t1))
564 {
565 if (!same_type_p (TYPE_PTRMEM_CLASS_TYPE (t1),
566 TYPE_PTRMEM_CLASS_TYPE (t2)))
567 {
568 if (complain & tf_error)
569 composite_pointer_error (location, DK_PERMERROR,
570 t1, t2, operation);
571 else
572 return error_mark_node;
573 }
574 result_type = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
575 result_type);
576 }
577 else
578 result_type = build_pointer_type (result_type);
579
580 /* Merge the attributes. */
581 attributes = (*targetm.merge_type_attributes) (t1, t2);
582 return build_type_attribute_variant (result_type, attributes);
583 }
584
585 /* Return the composite pointer type (see [expr.type]) for T1 and T2.
586 ARG1 and ARG2 are the values with those types. The OPERATION is to
587 describe the operation between the pointer types,
588 in case an error occurs.
589
590 This routine also implements the computation of a common type for
591 pointers-to-members as per [expr.eq]. */
592
593 tree
composite_pointer_type(const op_location_t & location,tree t1,tree t2,tree arg1,tree arg2,composite_pointer_operation operation,tsubst_flags_t complain)594 composite_pointer_type (const op_location_t &location,
595 tree t1, tree t2, tree arg1, tree arg2,
596 composite_pointer_operation operation,
597 tsubst_flags_t complain)
598 {
599 tree class1;
600 tree class2;
601
602 /* [expr.type]
603
604 If one operand is a null pointer constant, the composite pointer
605 type is the type of the other operand. */
606 if (null_ptr_cst_p (arg1))
607 return t2;
608 if (null_ptr_cst_p (arg2))
609 return t1;
610
611 /* We have:
612
613 [expr.type]
614
615 If one of the operands has type "pointer to cv1 void", then
616 the other has type "pointer to cv2 T", and the composite pointer
617 type is "pointer to cv12 void", where cv12 is the union of cv1
618 and cv2.
619
620 If either type is a pointer to void, make sure it is T1. */
621 if (TYPE_PTR_P (t2) && VOID_TYPE_P (TREE_TYPE (t2)))
622 std::swap (t1, t2);
623
624 /* Now, if T1 is a pointer to void, merge the qualifiers. */
625 if (TYPE_PTR_P (t1) && VOID_TYPE_P (TREE_TYPE (t1)))
626 {
627 tree attributes;
628 tree result_type;
629
630 if (TYPE_PTRFN_P (t2))
631 {
632 if (complain & tf_error)
633 {
634 switch (operation)
635 {
636 case CPO_COMPARISON:
637 pedwarn (location, OPT_Wpedantic,
638 "ISO C++ forbids comparison between pointer "
639 "of type %<void *%> and pointer-to-function");
640 break;
641 case CPO_CONVERSION:
642 pedwarn (location, OPT_Wpedantic,
643 "ISO C++ forbids conversion between pointer "
644 "of type %<void *%> and pointer-to-function");
645 break;
646 case CPO_CONDITIONAL_EXPR:
647 pedwarn (location, OPT_Wpedantic,
648 "ISO C++ forbids conditional expression between "
649 "pointer of type %<void *%> and "
650 "pointer-to-function");
651 break;
652 default:
653 gcc_unreachable ();
654 }
655 }
656 else
657 return error_mark_node;
658 }
659 result_type
660 = cp_build_qualified_type (void_type_node,
661 (cp_type_quals (TREE_TYPE (t1))
662 | cp_type_quals (TREE_TYPE (t2))));
663 result_type = build_pointer_type (result_type);
664 /* Merge the attributes. */
665 attributes = (*targetm.merge_type_attributes) (t1, t2);
666 return build_type_attribute_variant (result_type, attributes);
667 }
668
669 if (c_dialect_objc () && TYPE_PTR_P (t1)
670 && TYPE_PTR_P (t2))
671 {
672 if (objc_have_common_type (t1, t2, -3, NULL_TREE))
673 return objc_common_type (t1, t2);
674 }
675
676 /* if T1 or T2 is "pointer to noexcept function" and the other type is
677 "pointer to function", where the function types are otherwise the same,
678 "pointer to function" */
679 if (fnptr_conv_p (t1, t2))
680 return t1;
681 if (fnptr_conv_p (t2, t1))
682 return t2;
683
684 /* [expr.eq] permits the application of a pointer conversion to
685 bring the pointers to a common type. */
686 if (TYPE_PTR_P (t1) && TYPE_PTR_P (t2)
687 && CLASS_TYPE_P (TREE_TYPE (t1))
688 && CLASS_TYPE_P (TREE_TYPE (t2))
689 && !same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (t1),
690 TREE_TYPE (t2)))
691 {
692 class1 = TREE_TYPE (t1);
693 class2 = TREE_TYPE (t2);
694
695 if (DERIVED_FROM_P (class1, class2))
696 t2 = (build_pointer_type
697 (cp_build_qualified_type (class1, cp_type_quals (class2))));
698 else if (DERIVED_FROM_P (class2, class1))
699 t1 = (build_pointer_type
700 (cp_build_qualified_type (class2, cp_type_quals (class1))));
701 else
702 {
703 if (complain & tf_error)
704 composite_pointer_error (location, DK_ERROR, t1, t2, operation);
705 return error_mark_node;
706 }
707 }
708 /* [expr.eq] permits the application of a pointer-to-member
709 conversion to change the class type of one of the types. */
710 else if (TYPE_PTRMEM_P (t1)
711 && !same_type_p (TYPE_PTRMEM_CLASS_TYPE (t1),
712 TYPE_PTRMEM_CLASS_TYPE (t2)))
713 {
714 class1 = TYPE_PTRMEM_CLASS_TYPE (t1);
715 class2 = TYPE_PTRMEM_CLASS_TYPE (t2);
716
717 if (DERIVED_FROM_P (class1, class2))
718 t1 = build_ptrmem_type (class2, TYPE_PTRMEM_POINTED_TO_TYPE (t1));
719 else if (DERIVED_FROM_P (class2, class1))
720 t2 = build_ptrmem_type (class1, TYPE_PTRMEM_POINTED_TO_TYPE (t2));
721 else
722 {
723 if (complain & tf_error)
724 switch (operation)
725 {
726 case CPO_COMPARISON:
727 error_at (location, "comparison between distinct "
728 "pointer-to-member types %qT and %qT lacks a cast",
729 t1, t2);
730 break;
731 case CPO_CONVERSION:
732 error_at (location, "conversion between distinct "
733 "pointer-to-member types %qT and %qT lacks a cast",
734 t1, t2);
735 break;
736 case CPO_CONDITIONAL_EXPR:
737 error_at (location, "conditional expression between distinct "
738 "pointer-to-member types %qT and %qT lacks a cast",
739 t1, t2);
740 break;
741 default:
742 gcc_unreachable ();
743 }
744 return error_mark_node;
745 }
746 }
747
748 bool add_const = false;
749 return composite_pointer_type_r (location, t1, t2, &add_const, operation,
750 complain);
751 }
752
753 /* Return the merged type of two types.
754 We assume that comptypes has already been done and returned 1;
755 if that isn't so, this may crash.
756
757 This just combines attributes and default arguments; any other
758 differences would cause the two types to compare unalike. */
759
760 tree
merge_types(tree t1,tree t2)761 merge_types (tree t1, tree t2)
762 {
763 enum tree_code code1;
764 enum tree_code code2;
765 tree attributes;
766
767 /* Save time if the two types are the same. */
768 if (t1 == t2)
769 return t1;
770 if (original_type (t1) == original_type (t2))
771 return t1;
772
773 /* If one type is nonsense, use the other. */
774 if (t1 == error_mark_node)
775 return t2;
776 if (t2 == error_mark_node)
777 return t1;
778
779 /* Handle merging an auto redeclaration with a previous deduced
780 return type. */
781 if (is_auto (t1))
782 return t2;
783
784 /* Merge the attributes. */
785 attributes = (*targetm.merge_type_attributes) (t1, t2);
786
787 if (TYPE_PTRMEMFUNC_P (t1))
788 t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
789 if (TYPE_PTRMEMFUNC_P (t2))
790 t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
791
792 code1 = TREE_CODE (t1);
793 code2 = TREE_CODE (t2);
794 if (code1 != code2)
795 {
796 gcc_assert (code1 == TYPENAME_TYPE || code2 == TYPENAME_TYPE);
797 if (code1 == TYPENAME_TYPE)
798 {
799 t1 = resolve_typename_type (t1, /*only_current_p=*/true);
800 code1 = TREE_CODE (t1);
801 }
802 else
803 {
804 t2 = resolve_typename_type (t2, /*only_current_p=*/true);
805 code2 = TREE_CODE (t2);
806 }
807 }
808
809 switch (code1)
810 {
811 case POINTER_TYPE:
812 case REFERENCE_TYPE:
813 /* For two pointers, do this recursively on the target type. */
814 {
815 tree target = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
816 int quals = cp_type_quals (t1);
817
818 if (code1 == POINTER_TYPE)
819 {
820 t1 = build_pointer_type (target);
821 if (TREE_CODE (target) == METHOD_TYPE)
822 t1 = build_ptrmemfunc_type (t1);
823 }
824 else
825 t1 = cp_build_reference_type (target, TYPE_REF_IS_RVALUE (t1));
826 t1 = build_type_attribute_variant (t1, attributes);
827 t1 = cp_build_qualified_type (t1, quals);
828
829 return t1;
830 }
831
832 case OFFSET_TYPE:
833 {
834 int quals;
835 tree pointee;
836 quals = cp_type_quals (t1);
837 pointee = merge_types (TYPE_PTRMEM_POINTED_TO_TYPE (t1),
838 TYPE_PTRMEM_POINTED_TO_TYPE (t2));
839 t1 = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
840 pointee);
841 t1 = cp_build_qualified_type (t1, quals);
842 break;
843 }
844
845 case ARRAY_TYPE:
846 {
847 tree elt = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
848 /* Save space: see if the result is identical to one of the args. */
849 if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1))
850 return build_type_attribute_variant (t1, attributes);
851 if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2))
852 return build_type_attribute_variant (t2, attributes);
853 /* Merge the element types, and have a size if either arg has one. */
854 t1 = build_cplus_array_type
855 (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
856 break;
857 }
858
859 case FUNCTION_TYPE:
860 /* Function types: prefer the one that specified arg types.
861 If both do, merge the arg types. Also merge the return types. */
862 {
863 tree valtype = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
864 tree p1 = TYPE_ARG_TYPES (t1);
865 tree p2 = TYPE_ARG_TYPES (t2);
866 tree parms;
867
868 /* Save space: see if the result is identical to one of the args. */
869 if (valtype == TREE_TYPE (t1) && ! p2)
870 return cp_build_type_attribute_variant (t1, attributes);
871 if (valtype == TREE_TYPE (t2) && ! p1)
872 return cp_build_type_attribute_variant (t2, attributes);
873
874 /* Simple way if one arg fails to specify argument types. */
875 if (p1 == NULL_TREE || TREE_VALUE (p1) == void_type_node)
876 parms = p2;
877 else if (p2 == NULL_TREE || TREE_VALUE (p2) == void_type_node)
878 parms = p1;
879 else
880 parms = commonparms (p1, p2);
881
882 cp_cv_quals quals = type_memfn_quals (t1);
883 cp_ref_qualifier rqual = type_memfn_rqual (t1);
884 gcc_assert (quals == type_memfn_quals (t2));
885 gcc_assert (rqual == type_memfn_rqual (t2));
886
887 tree rval = build_function_type (valtype, parms);
888 rval = apply_memfn_quals (rval, quals);
889 tree raises = merge_exception_specifiers (TYPE_RAISES_EXCEPTIONS (t1),
890 TYPE_RAISES_EXCEPTIONS (t2));
891 bool late_return_type_p = TYPE_HAS_LATE_RETURN_TYPE (t1);
892 t1 = build_cp_fntype_variant (rval, rqual, raises, late_return_type_p);
893 break;
894 }
895
896 case METHOD_TYPE:
897 {
898 /* Get this value the long way, since TYPE_METHOD_BASETYPE
899 is just the main variant of this. */
900 tree basetype = class_of_this_parm (t2);
901 tree raises = merge_exception_specifiers (TYPE_RAISES_EXCEPTIONS (t1),
902 TYPE_RAISES_EXCEPTIONS (t2));
903 cp_ref_qualifier rqual = type_memfn_rqual (t1);
904 tree t3;
905 bool late_return_type_1_p = TYPE_HAS_LATE_RETURN_TYPE (t1);
906
907 /* If this was a member function type, get back to the
908 original type of type member function (i.e., without
909 the class instance variable up front. */
910 t1 = build_function_type (TREE_TYPE (t1),
911 TREE_CHAIN (TYPE_ARG_TYPES (t1)));
912 t2 = build_function_type (TREE_TYPE (t2),
913 TREE_CHAIN (TYPE_ARG_TYPES (t2)));
914 t3 = merge_types (t1, t2);
915 t3 = build_method_type_directly (basetype, TREE_TYPE (t3),
916 TYPE_ARG_TYPES (t3));
917 t1 = build_cp_fntype_variant (t3, rqual, raises, late_return_type_1_p);
918 break;
919 }
920
921 case TYPENAME_TYPE:
922 /* There is no need to merge attributes into a TYPENAME_TYPE.
923 When the type is instantiated it will have whatever
924 attributes result from the instantiation. */
925 return t1;
926
927 default:;
928 if (attribute_list_equal (TYPE_ATTRIBUTES (t1), attributes))
929 return t1;
930 else if (attribute_list_equal (TYPE_ATTRIBUTES (t2), attributes))
931 return t2;
932 break;
933 }
934
935 return cp_build_type_attribute_variant (t1, attributes);
936 }
937
938 /* Return the ARRAY_TYPE type without its domain. */
939
940 tree
strip_array_domain(tree type)941 strip_array_domain (tree type)
942 {
943 tree t2;
944 gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
945 if (TYPE_DOMAIN (type) == NULL_TREE)
946 return type;
947 t2 = build_cplus_array_type (TREE_TYPE (type), NULL_TREE);
948 return cp_build_type_attribute_variant (t2, TYPE_ATTRIBUTES (type));
949 }
950
951 /* Wrapper around cp_common_type that is used by c-common.cc and other
952 front end optimizations that remove promotions.
953
954 Return the common type for two arithmetic types T1 and T2 under the
955 usual arithmetic conversions. The default conversions have already
956 been applied, and enumerated types converted to their compatible
957 integer types. */
958
959 tree
common_type(tree t1,tree t2)960 common_type (tree t1, tree t2)
961 {
962 /* If one type is nonsense, use the other */
963 if (t1 == error_mark_node)
964 return t2;
965 if (t2 == error_mark_node)
966 return t1;
967
968 return cp_common_type (t1, t2);
969 }
970
971 /* Return the common type of two pointer types T1 and T2. This is the
972 type for the result of most arithmetic operations if the operands
973 have the given two types.
974
975 We assume that comp_target_types has already been done and returned
976 nonzero; if that isn't so, this may crash. */
977
978 tree
common_pointer_type(tree t1,tree t2)979 common_pointer_type (tree t1, tree t2)
980 {
981 gcc_assert ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
982 || (TYPE_PTRDATAMEM_P (t1) && TYPE_PTRDATAMEM_P (t2))
983 || (TYPE_PTRMEMFUNC_P (t1) && TYPE_PTRMEMFUNC_P (t2)));
984
985 return composite_pointer_type (input_location, t1, t2,
986 error_mark_node, error_mark_node,
987 CPO_CONVERSION, tf_warning_or_error);
988 }
989
990 /* Compare two exception specifier types for exactness or subsetness, if
991 allowed. Returns false for mismatch, true for match (same, or
992 derived and !exact).
993
994 [except.spec] "If a class X ... objects of class X or any class publicly
995 and unambiguously derived from X. Similarly, if a pointer type Y * ...
996 exceptions of type Y * or that are pointers to any type publicly and
997 unambiguously derived from Y. Otherwise a function only allows exceptions
998 that have the same type ..."
999 This does not mention cv qualifiers and is different to what throw
1000 [except.throw] and catch [except.catch] will do. They will ignore the
1001 top level cv qualifiers, and allow qualifiers in the pointer to class
1002 example.
1003
1004 We implement the letter of the standard. */
1005
1006 static bool
comp_except_types(tree a,tree b,bool exact)1007 comp_except_types (tree a, tree b, bool exact)
1008 {
1009 if (same_type_p (a, b))
1010 return true;
1011 else if (!exact)
1012 {
1013 if (cp_type_quals (a) || cp_type_quals (b))
1014 return false;
1015
1016 if (TYPE_PTR_P (a) && TYPE_PTR_P (b))
1017 {
1018 a = TREE_TYPE (a);
1019 b = TREE_TYPE (b);
1020 if (cp_type_quals (a) || cp_type_quals (b))
1021 return false;
1022 }
1023
1024 if (TREE_CODE (a) != RECORD_TYPE
1025 || TREE_CODE (b) != RECORD_TYPE)
1026 return false;
1027
1028 if (publicly_uniquely_derived_p (a, b))
1029 return true;
1030 }
1031 return false;
1032 }
1033
1034 /* Return true if TYPE1 and TYPE2 are equivalent exception specifiers.
1035 If EXACT is ce_derived, T2 can be stricter than T1 (according to 15.4/5).
1036 If EXACT is ce_type, the C++17 type compatibility rules apply.
1037 If EXACT is ce_normal, the compatibility rules in 15.4/3 apply.
1038 If EXACT is ce_exact, the specs must be exactly the same. Exception lists
1039 are unordered, but we've already filtered out duplicates. Most lists will
1040 be in order, we should try to make use of that. */
1041
1042 bool
comp_except_specs(const_tree t1,const_tree t2,int exact)1043 comp_except_specs (const_tree t1, const_tree t2, int exact)
1044 {
1045 const_tree probe;
1046 const_tree base;
1047 int length = 0;
1048
1049 if (t1 == t2)
1050 return true;
1051
1052 /* First handle noexcept. */
1053 if (exact < ce_exact)
1054 {
1055 if (exact == ce_type
1056 && (canonical_eh_spec (CONST_CAST_TREE (t1))
1057 == canonical_eh_spec (CONST_CAST_TREE (t2))))
1058 return true;
1059
1060 /* noexcept(false) is compatible with no exception-specification,
1061 and less strict than any spec. */
1062 if (t1 == noexcept_false_spec)
1063 return t2 == NULL_TREE || exact == ce_derived;
1064 /* Even a derived noexcept(false) is compatible with no
1065 exception-specification. */
1066 if (t2 == noexcept_false_spec)
1067 return t1 == NULL_TREE;
1068
1069 /* Otherwise, if we aren't looking for an exact match, noexcept is
1070 equivalent to throw(). */
1071 if (t1 == noexcept_true_spec)
1072 t1 = empty_except_spec;
1073 if (t2 == noexcept_true_spec)
1074 t2 = empty_except_spec;
1075 }
1076
1077 /* If any noexcept is left, it is only comparable to itself;
1078 either we're looking for an exact match or we're redeclaring a
1079 template with dependent noexcept. */
1080 if ((t1 && TREE_PURPOSE (t1))
1081 || (t2 && TREE_PURPOSE (t2)))
1082 return (t1 && t2
1083 && cp_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2)));
1084
1085 if (t1 == NULL_TREE) /* T1 is ... */
1086 return t2 == NULL_TREE || exact == ce_derived;
1087 if (!TREE_VALUE (t1)) /* t1 is EMPTY */
1088 return t2 != NULL_TREE && !TREE_VALUE (t2);
1089 if (t2 == NULL_TREE) /* T2 is ... */
1090 return false;
1091 if (TREE_VALUE (t1) && !TREE_VALUE (t2)) /* T2 is EMPTY, T1 is not */
1092 return exact == ce_derived;
1093
1094 /* Neither set is ... or EMPTY, make sure each part of T2 is in T1.
1095 Count how many we find, to determine exactness. For exact matching and
1096 ordered T1, T2, this is an O(n) operation, otherwise its worst case is
1097 O(nm). */
1098 for (base = t1; t2 != NULL_TREE; t2 = TREE_CHAIN (t2))
1099 {
1100 for (probe = base; probe != NULL_TREE; probe = TREE_CHAIN (probe))
1101 {
1102 tree a = TREE_VALUE (probe);
1103 tree b = TREE_VALUE (t2);
1104
1105 if (comp_except_types (a, b, exact))
1106 {
1107 if (probe == base && exact > ce_derived)
1108 base = TREE_CHAIN (probe);
1109 length++;
1110 break;
1111 }
1112 }
1113 if (probe == NULL_TREE)
1114 return false;
1115 }
1116 return exact == ce_derived || base == NULL_TREE || length == list_length (t1);
1117 }
1118
1119 /* Compare the array types T1 and T2. CB says how we should behave when
1120 comparing array bounds: bounds_none doesn't allow dimensionless arrays,
1121 bounds_either says than any array can be [], bounds_first means that
1122 onlt T1 can be an array with unknown bounds. STRICT is true if
1123 qualifiers must match when comparing the types of the array elements. */
1124
1125 static bool
comp_array_types(const_tree t1,const_tree t2,compare_bounds_t cb,bool strict)1126 comp_array_types (const_tree t1, const_tree t2, compare_bounds_t cb,
1127 bool strict)
1128 {
1129 tree d1;
1130 tree d2;
1131 tree max1, max2;
1132
1133 if (t1 == t2)
1134 return true;
1135
1136 /* The type of the array elements must be the same. */
1137 if (strict
1138 ? !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))
1139 : !similar_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1140 return false;
1141
1142 d1 = TYPE_DOMAIN (t1);
1143 d2 = TYPE_DOMAIN (t2);
1144
1145 if (d1 == d2)
1146 return true;
1147
1148 /* If one of the arrays is dimensionless, and the other has a
1149 dimension, they are of different types. However, it is valid to
1150 write:
1151
1152 extern int a[];
1153 int a[3];
1154
1155 by [basic.link]:
1156
1157 declarations for an array object can specify
1158 array types that differ by the presence or absence of a major
1159 array bound (_dcl.array_). */
1160 if (!d1 && d2)
1161 return cb >= bounds_either;
1162 else if (d1 && !d2)
1163 return cb == bounds_either;
1164
1165 /* Check that the dimensions are the same. */
1166
1167 if (!cp_tree_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2)))
1168 return false;
1169 max1 = TYPE_MAX_VALUE (d1);
1170 max2 = TYPE_MAX_VALUE (d2);
1171
1172 if (!cp_tree_equal (max1, max2))
1173 return false;
1174
1175 return true;
1176 }
1177
1178 /* Compare the relative position of T1 and T2 into their respective
1179 template parameter list.
1180 T1 and T2 must be template parameter types.
1181 Return TRUE if T1 and T2 have the same position, FALSE otherwise. */
1182
1183 static bool
comp_template_parms_position(tree t1,tree t2)1184 comp_template_parms_position (tree t1, tree t2)
1185 {
1186 tree index1, index2;
1187 gcc_assert (t1 && t2
1188 && TREE_CODE (t1) == TREE_CODE (t2)
1189 && (TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM
1190 || TREE_CODE (t1) == TEMPLATE_TEMPLATE_PARM
1191 || TREE_CODE (t1) == TEMPLATE_TYPE_PARM));
1192
1193 index1 = TEMPLATE_TYPE_PARM_INDEX (TYPE_MAIN_VARIANT (t1));
1194 index2 = TEMPLATE_TYPE_PARM_INDEX (TYPE_MAIN_VARIANT (t2));
1195
1196 /* Then compare their relative position. */
1197 if (TEMPLATE_PARM_IDX (index1) != TEMPLATE_PARM_IDX (index2)
1198 || TEMPLATE_PARM_LEVEL (index1) != TEMPLATE_PARM_LEVEL (index2)
1199 || (TEMPLATE_PARM_PARAMETER_PACK (index1)
1200 != TEMPLATE_PARM_PARAMETER_PACK (index2)))
1201 return false;
1202
1203 /* In C++14 we can end up comparing 'auto' to a normal template
1204 parameter. Don't confuse them. */
1205 if (cxx_dialect >= cxx14 && (is_auto (t1) || is_auto (t2)))
1206 return TYPE_IDENTIFIER (t1) == TYPE_IDENTIFIER (t2);
1207
1208 return true;
1209 }
1210
1211 /* Heuristic check if two parameter types can be considered ABI-equivalent. */
1212
1213 static bool
cxx_safe_arg_type_equiv_p(tree t1,tree t2)1214 cxx_safe_arg_type_equiv_p (tree t1, tree t2)
1215 {
1216 t1 = TYPE_MAIN_VARIANT (t1);
1217 t2 = TYPE_MAIN_VARIANT (t2);
1218
1219 if (TYPE_PTR_P (t1)
1220 && TYPE_PTR_P (t2))
1221 return true;
1222
1223 /* The signedness of the parameter matters only when an integral
1224 type smaller than int is promoted to int, otherwise only the
1225 precision of the parameter matters.
1226 This check should make sure that the callee does not see
1227 undefined values in argument registers. */
1228 if (INTEGRAL_TYPE_P (t1)
1229 && INTEGRAL_TYPE_P (t2)
1230 && TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
1231 && (TYPE_UNSIGNED (t1) == TYPE_UNSIGNED (t2)
1232 || !targetm.calls.promote_prototypes (NULL_TREE)
1233 || TYPE_PRECISION (t1) >= TYPE_PRECISION (integer_type_node)))
1234 return true;
1235
1236 return same_type_p (t1, t2);
1237 }
1238
1239 /* Check if a type cast between two function types can be considered safe. */
1240
1241 static bool
cxx_safe_function_type_cast_p(tree t1,tree t2)1242 cxx_safe_function_type_cast_p (tree t1, tree t2)
1243 {
1244 if (TREE_TYPE (t1) == void_type_node &&
1245 TYPE_ARG_TYPES (t1) == void_list_node)
1246 return true;
1247
1248 if (TREE_TYPE (t2) == void_type_node &&
1249 TYPE_ARG_TYPES (t2) == void_list_node)
1250 return true;
1251
1252 if (!cxx_safe_arg_type_equiv_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1253 return false;
1254
1255 for (t1 = TYPE_ARG_TYPES (t1), t2 = TYPE_ARG_TYPES (t2);
1256 t1 && t2;
1257 t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1258 if (!cxx_safe_arg_type_equiv_p (TREE_VALUE (t1), TREE_VALUE (t2)))
1259 return false;
1260
1261 return true;
1262 }
1263
1264 /* Subroutine in comptypes. */
1265
1266 static bool
structural_comptypes(tree t1,tree t2,int strict)1267 structural_comptypes (tree t1, tree t2, int strict)
1268 {
1269 /* Both should be types that are not obviously the same. */
1270 gcc_checking_assert (t1 != t2 && TYPE_P (t1) && TYPE_P (t2));
1271
1272 /* Suppress typename resolution under spec_hasher::equal in place of calling
1273 push_to_top_level there. */
1274 if (!comparing_specializations)
1275 {
1276 /* TYPENAME_TYPEs should be resolved if the qualifying scope is the
1277 current instantiation. */
1278 if (TREE_CODE (t1) == TYPENAME_TYPE)
1279 t1 = resolve_typename_type (t1, /*only_current_p=*/true);
1280
1281 if (TREE_CODE (t2) == TYPENAME_TYPE)
1282 t2 = resolve_typename_type (t2, /*only_current_p=*/true);
1283 }
1284
1285 if (TYPE_PTRMEMFUNC_P (t1))
1286 t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
1287 if (TYPE_PTRMEMFUNC_P (t2))
1288 t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
1289
1290 /* Different classes of types can't be compatible. */
1291 if (TREE_CODE (t1) != TREE_CODE (t2))
1292 return false;
1293
1294 /* Qualifiers must match. For array types, we will check when we
1295 recur on the array element types. */
1296 if (TREE_CODE (t1) != ARRAY_TYPE
1297 && cp_type_quals (t1) != cp_type_quals (t2))
1298 return false;
1299 if (TREE_CODE (t1) == FUNCTION_TYPE
1300 && type_memfn_quals (t1) != type_memfn_quals (t2))
1301 return false;
1302 /* Need to check this before TYPE_MAIN_VARIANT.
1303 FIXME function qualifiers should really change the main variant. */
1304 if (FUNC_OR_METHOD_TYPE_P (t1))
1305 {
1306 if (type_memfn_rqual (t1) != type_memfn_rqual (t2))
1307 return false;
1308 if (flag_noexcept_type
1309 && !comp_except_specs (TYPE_RAISES_EXCEPTIONS (t1),
1310 TYPE_RAISES_EXCEPTIONS (t2),
1311 ce_type))
1312 return false;
1313 }
1314
1315 /* Allow for two different type nodes which have essentially the same
1316 definition. Note that we already checked for equality of the type
1317 qualifiers (just above). */
1318 if (TREE_CODE (t1) != ARRAY_TYPE
1319 && TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
1320 goto check_alias;
1321
1322 /* Compare the types. Return false on known not-same. Break on not
1323 known. Never return true from this switch -- you'll break
1324 specialization comparison. */
1325 switch (TREE_CODE (t1))
1326 {
1327 case VOID_TYPE:
1328 case BOOLEAN_TYPE:
1329 /* All void and bool types are the same. */
1330 break;
1331
1332 case OPAQUE_TYPE:
1333 case INTEGER_TYPE:
1334 case FIXED_POINT_TYPE:
1335 case REAL_TYPE:
1336 /* With these nodes, we can't determine type equivalence by
1337 looking at what is stored in the nodes themselves, because
1338 two nodes might have different TYPE_MAIN_VARIANTs but still
1339 represent the same type. For example, wchar_t and int could
1340 have the same properties (TYPE_PRECISION, TYPE_MIN_VALUE,
1341 TYPE_MAX_VALUE, etc.), but have different TYPE_MAIN_VARIANTs
1342 and are distinct types. On the other hand, int and the
1343 following typedef
1344
1345 typedef int INT __attribute((may_alias));
1346
1347 have identical properties, different TYPE_MAIN_VARIANTs, but
1348 represent the same type. The canonical type system keeps
1349 track of equivalence in this case, so we fall back on it. */
1350 if (TYPE_CANONICAL (t1) != TYPE_CANONICAL (t2))
1351 return false;
1352
1353 /* We don't need or want the attribute comparison. */
1354 goto check_alias;
1355
1356 case TEMPLATE_TEMPLATE_PARM:
1357 case BOUND_TEMPLATE_TEMPLATE_PARM:
1358 if (!comp_template_parms_position (t1, t2))
1359 return false;
1360 if (!comp_template_parms
1361 (DECL_TEMPLATE_PARMS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t1)),
1362 DECL_TEMPLATE_PARMS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t2))))
1363 return false;
1364 if (TREE_CODE (t1) == TEMPLATE_TEMPLATE_PARM)
1365 break;
1366 /* Don't check inheritance. */
1367 strict = COMPARE_STRICT;
1368 /* Fall through. */
1369
1370 case RECORD_TYPE:
1371 case UNION_TYPE:
1372 if (TYPE_TEMPLATE_INFO (t1) && TYPE_TEMPLATE_INFO (t2)
1373 && (TYPE_TI_TEMPLATE (t1) == TYPE_TI_TEMPLATE (t2)
1374 || TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM)
1375 && comp_template_args (TYPE_TI_ARGS (t1), TYPE_TI_ARGS (t2)))
1376 break;
1377
1378 if ((strict & COMPARE_BASE) && DERIVED_FROM_P (t1, t2))
1379 break;
1380 else if ((strict & COMPARE_DERIVED) && DERIVED_FROM_P (t2, t1))
1381 break;
1382
1383 return false;
1384
1385 case OFFSET_TYPE:
1386 if (!comptypes (TYPE_OFFSET_BASETYPE (t1), TYPE_OFFSET_BASETYPE (t2),
1387 strict & ~COMPARE_REDECLARATION))
1388 return false;
1389 if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1390 return false;
1391 break;
1392
1393 case REFERENCE_TYPE:
1394 if (TYPE_REF_IS_RVALUE (t1) != TYPE_REF_IS_RVALUE (t2))
1395 return false;
1396 /* fall through to checks for pointer types */
1397 gcc_fallthrough ();
1398
1399 case POINTER_TYPE:
1400 if (TYPE_MODE (t1) != TYPE_MODE (t2)
1401 || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1402 return false;
1403 break;
1404
1405 case METHOD_TYPE:
1406 case FUNCTION_TYPE:
1407 /* Exception specs and memfn_rquals were checked above. */
1408 if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1409 return false;
1410 if (!compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)))
1411 return false;
1412 break;
1413
1414 case ARRAY_TYPE:
1415 /* Target types must match incl. qualifiers. */
1416 if (!comp_array_types (t1, t2, ((strict & COMPARE_REDECLARATION)
1417 ? bounds_either : bounds_none),
1418 /*strict=*/true))
1419 return false;
1420 break;
1421
1422 case TEMPLATE_TYPE_PARM:
1423 /* If T1 and T2 don't have the same relative position in their
1424 template parameters set, they can't be equal. */
1425 if (!comp_template_parms_position (t1, t2))
1426 return false;
1427 /* If T1 and T2 don't represent the same class template deduction,
1428 they aren't equal. */
1429 if (CLASS_PLACEHOLDER_TEMPLATE (t1)
1430 != CLASS_PLACEHOLDER_TEMPLATE (t2))
1431 return false;
1432 /* Constrained 'auto's are distinct from parms that don't have the same
1433 constraints. */
1434 if (!equivalent_placeholder_constraints (t1, t2))
1435 return false;
1436 break;
1437
1438 case TYPENAME_TYPE:
1439 if (!cp_tree_equal (TYPENAME_TYPE_FULLNAME (t1),
1440 TYPENAME_TYPE_FULLNAME (t2)))
1441 return false;
1442 /* Qualifiers don't matter on scopes. */
1443 if (!same_type_ignoring_top_level_qualifiers_p (TYPE_CONTEXT (t1),
1444 TYPE_CONTEXT (t2)))
1445 return false;
1446 break;
1447
1448 case UNBOUND_CLASS_TEMPLATE:
1449 if (!cp_tree_equal (TYPE_IDENTIFIER (t1), TYPE_IDENTIFIER (t2)))
1450 return false;
1451 if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
1452 return false;
1453 break;
1454
1455 case COMPLEX_TYPE:
1456 if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1457 return false;
1458 break;
1459
1460 case VECTOR_TYPE:
1461 if (gnu_vector_type_p (t1) != gnu_vector_type_p (t2)
1462 || maybe_ne (TYPE_VECTOR_SUBPARTS (t1), TYPE_VECTOR_SUBPARTS (t2))
1463 || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1464 return false;
1465 break;
1466
1467 case TYPE_PACK_EXPANSION:
1468 return (same_type_p (PACK_EXPANSION_PATTERN (t1),
1469 PACK_EXPANSION_PATTERN (t2))
1470 && comp_template_args (PACK_EXPANSION_EXTRA_ARGS (t1),
1471 PACK_EXPANSION_EXTRA_ARGS (t2)));
1472
1473 case DECLTYPE_TYPE:
1474 if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t1)
1475 != DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t2))
1476 return false;
1477 if (DECLTYPE_FOR_LAMBDA_CAPTURE (t1) != DECLTYPE_FOR_LAMBDA_CAPTURE (t2))
1478 return false;
1479 if (DECLTYPE_FOR_LAMBDA_PROXY (t1) != DECLTYPE_FOR_LAMBDA_PROXY (t2))
1480 return false;
1481 if (!cp_tree_equal (DECLTYPE_TYPE_EXPR (t1), DECLTYPE_TYPE_EXPR (t2)))
1482 return false;
1483 break;
1484
1485 case UNDERLYING_TYPE:
1486 if (!same_type_p (UNDERLYING_TYPE_TYPE (t1), UNDERLYING_TYPE_TYPE (t2)))
1487 return false;
1488 break;
1489
1490 case TYPEOF_TYPE:
1491 if (!cp_tree_equal (TYPEOF_TYPE_EXPR (t1), TYPEOF_TYPE_EXPR (t2)))
1492 return false;
1493 break;
1494
1495 default:
1496 return false;
1497 }
1498
1499 /* If we get here, we know that from a target independent POV the
1500 types are the same. Make sure the target attributes are also
1501 the same. */
1502 if (!comp_type_attributes (t1, t2))
1503 return false;
1504
1505 check_alias:
1506 if (comparing_dependent_aliases)
1507 {
1508 /* Don't treat an alias template specialization with dependent
1509 arguments as equivalent to its underlying type when used as a
1510 template argument; we need them to be distinct so that we
1511 substitute into the specialization arguments at instantiation
1512 time. And aliases can't be equivalent without being ==, so
1513 we don't need to look any deeper. */
1514 tree dep1 = dependent_alias_template_spec_p (t1, nt_transparent);
1515 tree dep2 = dependent_alias_template_spec_p (t2, nt_transparent);
1516 if ((dep1 || dep2) && dep1 != dep2)
1517 return false;
1518 }
1519
1520 return true;
1521 }
1522
1523 /* Return true if T1 and T2 are related as allowed by STRICT. STRICT
1524 is a bitwise-or of the COMPARE_* flags. */
1525
1526 bool
comptypes(tree t1,tree t2,int strict)1527 comptypes (tree t1, tree t2, int strict)
1528 {
1529 gcc_checking_assert (t1 && t2);
1530
1531 /* TYPE_ARGUMENT_PACKS are not really types. */
1532 gcc_checking_assert (TREE_CODE (t1) != TYPE_ARGUMENT_PACK
1533 && TREE_CODE (t2) != TYPE_ARGUMENT_PACK);
1534
1535 if (t1 == t2)
1536 return true;
1537
1538 /* Suppress errors caused by previously reported errors. */
1539 if (t1 == error_mark_node || t2 == error_mark_node)
1540 return false;
1541
1542 if (strict == COMPARE_STRICT)
1543 {
1544 if (TYPE_STRUCTURAL_EQUALITY_P (t1) || TYPE_STRUCTURAL_EQUALITY_P (t2))
1545 /* At least one of the types requires structural equality, so
1546 perform a deep check. */
1547 return structural_comptypes (t1, t2, strict);
1548
1549 if (flag_checking && param_use_canonical_types)
1550 {
1551 bool result = structural_comptypes (t1, t2, strict);
1552
1553 if (result && TYPE_CANONICAL (t1) != TYPE_CANONICAL (t2))
1554 /* The two types are structurally equivalent, but their
1555 canonical types were different. This is a failure of the
1556 canonical type propagation code.*/
1557 internal_error
1558 ("canonical types differ for identical types %qT and %qT",
1559 t1, t2);
1560 else if (!result && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2))
1561 /* Two types are structurally different, but the canonical
1562 types are the same. This means we were over-eager in
1563 assigning canonical types. */
1564 internal_error
1565 ("same canonical type node for different types %qT and %qT",
1566 t1, t2);
1567
1568 return result;
1569 }
1570 if (!flag_checking && param_use_canonical_types)
1571 return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2);
1572 else
1573 return structural_comptypes (t1, t2, strict);
1574 }
1575 else if (strict == COMPARE_STRUCTURAL)
1576 return structural_comptypes (t1, t2, COMPARE_STRICT);
1577 else
1578 return structural_comptypes (t1, t2, strict);
1579 }
1580
1581 /* Returns nonzero iff TYPE1 and TYPE2 are the same type, ignoring
1582 top-level qualifiers. */
1583
1584 bool
same_type_ignoring_top_level_qualifiers_p(tree type1,tree type2)1585 same_type_ignoring_top_level_qualifiers_p (tree type1, tree type2)
1586 {
1587 if (type1 == error_mark_node || type2 == error_mark_node)
1588 return false;
1589 if (type1 == type2)
1590 return true;
1591
1592 type1 = cp_build_qualified_type (type1, TYPE_UNQUALIFIED);
1593 type2 = cp_build_qualified_type (type2, TYPE_UNQUALIFIED);
1594 return same_type_p (type1, type2);
1595 }
1596
1597 /* Returns nonzero iff TYPE1 and TYPE2 are similar, as per [conv.qual]. */
1598
1599 bool
similar_type_p(tree type1,tree type2)1600 similar_type_p (tree type1, tree type2)
1601 {
1602 if (type1 == error_mark_node || type2 == error_mark_node)
1603 return false;
1604
1605 /* Informally, two types are similar if, ignoring top-level cv-qualification:
1606 * they are the same type; or
1607 * they are both pointers, and the pointed-to types are similar; or
1608 * they are both pointers to member of the same class, and the types of
1609 the pointed-to members are similar; or
1610 * they are both arrays of the same size or both arrays of unknown bound,
1611 and the array element types are similar. */
1612
1613 if (same_type_ignoring_top_level_qualifiers_p (type1, type2))
1614 return true;
1615
1616 if ((TYPE_PTR_P (type1) && TYPE_PTR_P (type2))
1617 || (TYPE_PTRDATAMEM_P (type1) && TYPE_PTRDATAMEM_P (type2))
1618 || (TREE_CODE (type1) == ARRAY_TYPE && TREE_CODE (type2) == ARRAY_TYPE))
1619 return comp_ptr_ttypes_const (type1, type2, bounds_either);
1620
1621 return false;
1622 }
1623
1624 /* Helper function for layout_compatible_type_p and
1625 is_corresponding_member_aggr. Advance to next members (NULL if
1626 no further ones) and return true if those members are still part of
1627 the common initial sequence. */
1628
1629 bool
next_common_initial_sequence(tree & memb1,tree & memb2)1630 next_common_initial_sequence (tree &memb1, tree &memb2)
1631 {
1632 while (memb1)
1633 {
1634 if (TREE_CODE (memb1) != FIELD_DECL
1635 || (DECL_FIELD_IS_BASE (memb1) && is_empty_field (memb1)))
1636 {
1637 memb1 = DECL_CHAIN (memb1);
1638 continue;
1639 }
1640 if (DECL_FIELD_IS_BASE (memb1))
1641 {
1642 memb1 = TYPE_FIELDS (TREE_TYPE (memb1));
1643 continue;
1644 }
1645 break;
1646 }
1647 while (memb2)
1648 {
1649 if (TREE_CODE (memb2) != FIELD_DECL
1650 || (DECL_FIELD_IS_BASE (memb2) && is_empty_field (memb2)))
1651 {
1652 memb2 = DECL_CHAIN (memb2);
1653 continue;
1654 }
1655 if (DECL_FIELD_IS_BASE (memb2))
1656 {
1657 memb2 = TYPE_FIELDS (TREE_TYPE (memb2));
1658 continue;
1659 }
1660 break;
1661 }
1662 if (memb1 == NULL_TREE && memb2 == NULL_TREE)
1663 return true;
1664 if (memb1 == NULL_TREE || memb2 == NULL_TREE)
1665 return false;
1666 if (DECL_BIT_FIELD_TYPE (memb1))
1667 {
1668 if (!DECL_BIT_FIELD_TYPE (memb2))
1669 return false;
1670 if (!layout_compatible_type_p (DECL_BIT_FIELD_TYPE (memb1),
1671 DECL_BIT_FIELD_TYPE (memb2)))
1672 return false;
1673 if (TYPE_PRECISION (TREE_TYPE (memb1))
1674 != TYPE_PRECISION (TREE_TYPE (memb2)))
1675 return false;
1676 }
1677 else if (DECL_BIT_FIELD_TYPE (memb2))
1678 return false;
1679 else if (!layout_compatible_type_p (TREE_TYPE (memb1), TREE_TYPE (memb2)))
1680 return false;
1681 if ((!lookup_attribute ("no_unique_address", DECL_ATTRIBUTES (memb1)))
1682 != !lookup_attribute ("no_unique_address", DECL_ATTRIBUTES (memb2)))
1683 return false;
1684 if (!tree_int_cst_equal (bit_position (memb1), bit_position (memb2)))
1685 return false;
1686 return true;
1687 }
1688
1689 /* Return true if TYPE1 and TYPE2 are layout-compatible types. */
1690
1691 bool
layout_compatible_type_p(tree type1,tree type2)1692 layout_compatible_type_p (tree type1, tree type2)
1693 {
1694 if (type1 == error_mark_node || type2 == error_mark_node)
1695 return false;
1696 if (type1 == type2)
1697 return true;
1698 if (TREE_CODE (type1) != TREE_CODE (type2))
1699 return false;
1700
1701 type1 = cp_build_qualified_type (type1, TYPE_UNQUALIFIED);
1702 type2 = cp_build_qualified_type (type2, TYPE_UNQUALIFIED);
1703
1704 if (TREE_CODE (type1) == ENUMERAL_TYPE)
1705 return (TYPE_ALIGN (type1) == TYPE_ALIGN (type2)
1706 && tree_int_cst_equal (TYPE_SIZE (type1), TYPE_SIZE (type2))
1707 && same_type_p (finish_underlying_type (type1),
1708 finish_underlying_type (type2)));
1709
1710 if (CLASS_TYPE_P (type1)
1711 && std_layout_type_p (type1)
1712 && std_layout_type_p (type2)
1713 && TYPE_ALIGN (type1) == TYPE_ALIGN (type2)
1714 && tree_int_cst_equal (TYPE_SIZE (type1), TYPE_SIZE (type2)))
1715 {
1716 tree field1 = TYPE_FIELDS (type1);
1717 tree field2 = TYPE_FIELDS (type2);
1718 if (TREE_CODE (type1) == RECORD_TYPE)
1719 {
1720 while (1)
1721 {
1722 if (!next_common_initial_sequence (field1, field2))
1723 return false;
1724 if (field1 == NULL_TREE)
1725 return true;
1726 field1 = DECL_CHAIN (field1);
1727 field2 = DECL_CHAIN (field2);
1728 }
1729 }
1730 /* Otherwise both types must be union types.
1731 The standard says:
1732 "Two standard-layout unions are layout-compatible if they have
1733 the same number of non-static data members and corresponding
1734 non-static data members (in any order) have layout-compatible
1735 types."
1736 but the code anticipates that bitfield vs. non-bitfield,
1737 different bitfield widths or presence/absence of
1738 [[no_unique_address]] should be checked as well. */
1739 auto_vec<tree, 16> vec;
1740 unsigned int count = 0;
1741 for (; field1; field1 = DECL_CHAIN (field1))
1742 if (TREE_CODE (field1) == FIELD_DECL)
1743 count++;
1744 for (; field2; field2 = DECL_CHAIN (field2))
1745 if (TREE_CODE (field2) == FIELD_DECL)
1746 vec.safe_push (field2);
1747 /* Discussions on core lean towards treating multiple union fields
1748 of the same type as the same field, so this might need changing
1749 in the future. */
1750 if (count != vec.length ())
1751 return false;
1752 for (field1 = TYPE_FIELDS (type1); field1; field1 = DECL_CHAIN (field1))
1753 {
1754 if (TREE_CODE (field1) != FIELD_DECL)
1755 continue;
1756 unsigned int j;
1757 tree t1 = DECL_BIT_FIELD_TYPE (field1);
1758 if (t1 == NULL_TREE)
1759 t1 = TREE_TYPE (field1);
1760 FOR_EACH_VEC_ELT (vec, j, field2)
1761 {
1762 tree t2 = DECL_BIT_FIELD_TYPE (field2);
1763 if (t2 == NULL_TREE)
1764 t2 = TREE_TYPE (field2);
1765 if (DECL_BIT_FIELD_TYPE (field1))
1766 {
1767 if (!DECL_BIT_FIELD_TYPE (field2))
1768 continue;
1769 if (TYPE_PRECISION (TREE_TYPE (field1))
1770 != TYPE_PRECISION (TREE_TYPE (field2)))
1771 continue;
1772 }
1773 else if (DECL_BIT_FIELD_TYPE (field2))
1774 continue;
1775 if (!layout_compatible_type_p (t1, t2))
1776 continue;
1777 if ((!lookup_attribute ("no_unique_address",
1778 DECL_ATTRIBUTES (field1)))
1779 != !lookup_attribute ("no_unique_address",
1780 DECL_ATTRIBUTES (field2)))
1781 continue;
1782 break;
1783 }
1784 if (j == vec.length ())
1785 return false;
1786 vec.unordered_remove (j);
1787 }
1788 return true;
1789 }
1790
1791 return same_type_p (type1, type2);
1792 }
1793
1794 /* Returns 1 if TYPE1 is at least as qualified as TYPE2. */
1795
1796 bool
at_least_as_qualified_p(const_tree type1,const_tree type2)1797 at_least_as_qualified_p (const_tree type1, const_tree type2)
1798 {
1799 int q1 = cp_type_quals (type1);
1800 int q2 = cp_type_quals (type2);
1801
1802 /* All qualifiers for TYPE2 must also appear in TYPE1. */
1803 return (q1 & q2) == q2;
1804 }
1805
1806 /* Returns 1 if TYPE1 is more cv-qualified than TYPE2, -1 if TYPE2 is
1807 more cv-qualified that TYPE1, and 0 otherwise. */
1808
1809 int
comp_cv_qualification(int q1,int q2)1810 comp_cv_qualification (int q1, int q2)
1811 {
1812 if (q1 == q2)
1813 return 0;
1814
1815 if ((q1 & q2) == q2)
1816 return 1;
1817 else if ((q1 & q2) == q1)
1818 return -1;
1819
1820 return 0;
1821 }
1822
1823 int
comp_cv_qualification(const_tree type1,const_tree type2)1824 comp_cv_qualification (const_tree type1, const_tree type2)
1825 {
1826 int q1 = cp_type_quals (type1);
1827 int q2 = cp_type_quals (type2);
1828 return comp_cv_qualification (q1, q2);
1829 }
1830
1831 /* Returns 1 if the cv-qualification signature of TYPE1 is a proper
1832 subset of the cv-qualification signature of TYPE2, and the types
1833 are similar. Returns -1 if the other way 'round, and 0 otherwise. */
1834
1835 int
comp_cv_qual_signature(tree type1,tree type2)1836 comp_cv_qual_signature (tree type1, tree type2)
1837 {
1838 if (comp_ptr_ttypes_real (type2, type1, -1))
1839 return 1;
1840 else if (comp_ptr_ttypes_real (type1, type2, -1))
1841 return -1;
1842 else
1843 return 0;
1844 }
1845
1846 /* Subroutines of `comptypes'. */
1847
1848 /* Return true if two parameter type lists PARMS1 and PARMS2 are
1849 equivalent in the sense that functions with those parameter types
1850 can have equivalent types. The two lists must be equivalent,
1851 element by element. */
1852
1853 bool
compparms(const_tree parms1,const_tree parms2)1854 compparms (const_tree parms1, const_tree parms2)
1855 {
1856 const_tree t1, t2;
1857
1858 /* An unspecified parmlist matches any specified parmlist
1859 whose argument types don't need default promotions. */
1860
1861 for (t1 = parms1, t2 = parms2;
1862 t1 || t2;
1863 t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1864 {
1865 /* If one parmlist is shorter than the other,
1866 they fail to match. */
1867 if (!t1 || !t2)
1868 return false;
1869 if (!same_type_p (TREE_VALUE (t1), TREE_VALUE (t2)))
1870 return false;
1871 }
1872 return true;
1873 }
1874
1875
1876 /* Process a sizeof or alignof expression where the operand is a type.
1877 STD_ALIGNOF indicates whether an alignof has C++11 (minimum alignment)
1878 or GNU (preferred alignment) semantics; it is ignored if OP is
1879 SIZEOF_EXPR. */
1880
1881 tree
cxx_sizeof_or_alignof_type(location_t loc,tree type,enum tree_code op,bool std_alignof,bool complain)1882 cxx_sizeof_or_alignof_type (location_t loc, tree type, enum tree_code op,
1883 bool std_alignof, bool complain)
1884 {
1885 gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
1886 if (type == error_mark_node)
1887 return error_mark_node;
1888
1889 type = non_reference (type);
1890 if (TREE_CODE (type) == METHOD_TYPE)
1891 {
1892 if (complain)
1893 {
1894 pedwarn (loc, OPT_Wpointer_arith,
1895 "invalid application of %qs to a member function",
1896 OVL_OP_INFO (false, op)->name);
1897 return size_one_node;
1898 }
1899 else
1900 return error_mark_node;
1901 }
1902 else if (VOID_TYPE_P (type) && std_alignof)
1903 {
1904 if (complain)
1905 error_at (loc, "invalid application of %qs to a void type",
1906 OVL_OP_INFO (false, op)->name);
1907 return error_mark_node;
1908 }
1909
1910 bool dependent_p = dependent_type_p (type);
1911 if (!dependent_p)
1912 complete_type (type);
1913 if (dependent_p
1914 /* VLA types will have a non-constant size. In the body of an
1915 uninstantiated template, we don't need to try to compute the
1916 value, because the sizeof expression is not an integral
1917 constant expression in that case. And, if we do try to
1918 compute the value, we'll likely end up with SAVE_EXPRs, which
1919 the template substitution machinery does not expect to see. */
1920 || (processing_template_decl
1921 && COMPLETE_TYPE_P (type)
1922 && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
1923 {
1924 tree value = build_min (op, size_type_node, type);
1925 TREE_READONLY (value) = 1;
1926 if (op == ALIGNOF_EXPR && std_alignof)
1927 ALIGNOF_EXPR_STD_P (value) = true;
1928 SET_EXPR_LOCATION (value, loc);
1929 return value;
1930 }
1931
1932 return c_sizeof_or_alignof_type (loc, complete_type (type),
1933 op == SIZEOF_EXPR, std_alignof,
1934 complain);
1935 }
1936
1937 /* Return the size of the type, without producing any warnings for
1938 types whose size cannot be taken. This routine should be used only
1939 in some other routine that has already produced a diagnostic about
1940 using the size of such a type. */
1941 tree
cxx_sizeof_nowarn(tree type)1942 cxx_sizeof_nowarn (tree type)
1943 {
1944 if (TREE_CODE (type) == FUNCTION_TYPE
1945 || VOID_TYPE_P (type)
1946 || TREE_CODE (type) == ERROR_MARK)
1947 return size_one_node;
1948 else if (!COMPLETE_TYPE_P (type))
1949 return size_zero_node;
1950 else
1951 return cxx_sizeof_or_alignof_type (input_location, type,
1952 SIZEOF_EXPR, false, false);
1953 }
1954
1955 /* Process a sizeof expression where the operand is an expression. */
1956
1957 static tree
cxx_sizeof_expr(location_t loc,tree e,tsubst_flags_t complain)1958 cxx_sizeof_expr (location_t loc, tree e, tsubst_flags_t complain)
1959 {
1960 if (e == error_mark_node)
1961 return error_mark_node;
1962
1963 if (instantiation_dependent_uneval_expression_p (e))
1964 {
1965 e = build_min (SIZEOF_EXPR, size_type_node, e);
1966 TREE_SIDE_EFFECTS (e) = 0;
1967 TREE_READONLY (e) = 1;
1968 SET_EXPR_LOCATION (e, loc);
1969
1970 return e;
1971 }
1972
1973 location_t e_loc = cp_expr_loc_or_loc (e, loc);
1974 STRIP_ANY_LOCATION_WRAPPER (e);
1975
1976 /* To get the size of a static data member declared as an array of
1977 unknown bound, we need to instantiate it. */
1978 if (VAR_P (e)
1979 && VAR_HAD_UNKNOWN_BOUND (e)
1980 && DECL_TEMPLATE_INSTANTIATION (e))
1981 instantiate_decl (e, /*defer_ok*/true, /*expl_inst_mem*/false);
1982
1983 if (TREE_CODE (e) == PARM_DECL
1984 && DECL_ARRAY_PARAMETER_P (e)
1985 && (complain & tf_warning))
1986 {
1987 auto_diagnostic_group d;
1988 if (warning_at (e_loc, OPT_Wsizeof_array_argument,
1989 "%<sizeof%> on array function parameter %qE "
1990 "will return size of %qT", e, TREE_TYPE (e)))
1991 inform (DECL_SOURCE_LOCATION (e), "declared here");
1992 }
1993
1994 e = mark_type_use (e);
1995
1996 if (bitfield_p (e))
1997 {
1998 if (complain & tf_error)
1999 error_at (e_loc,
2000 "invalid application of %<sizeof%> to a bit-field");
2001 else
2002 return error_mark_node;
2003 e = char_type_node;
2004 }
2005 else if (is_overloaded_fn (e))
2006 {
2007 if (complain & tf_error)
2008 permerror (e_loc, "ISO C++ forbids applying %<sizeof%> to "
2009 "an expression of function type");
2010 else
2011 return error_mark_node;
2012 e = char_type_node;
2013 }
2014 else if (type_unknown_p (e))
2015 {
2016 if (complain & tf_error)
2017 cxx_incomplete_type_error (e_loc, e, TREE_TYPE (e));
2018 else
2019 return error_mark_node;
2020 e = char_type_node;
2021 }
2022 else
2023 e = TREE_TYPE (e);
2024
2025 return cxx_sizeof_or_alignof_type (loc, e, SIZEOF_EXPR, false,
2026 complain & tf_error);
2027 }
2028
2029 /* Implement the __alignof keyword: Return the minimum required
2030 alignment of E, measured in bytes. For VAR_DECL's and
2031 FIELD_DECL's return DECL_ALIGN (which can be set from an
2032 "aligned" __attribute__ specification). STD_ALIGNOF acts
2033 like in cxx_sizeof_or_alignof_type. */
2034
2035 static tree
cxx_alignof_expr(location_t loc,tree e,bool std_alignof,tsubst_flags_t complain)2036 cxx_alignof_expr (location_t loc, tree e, bool std_alignof,
2037 tsubst_flags_t complain)
2038 {
2039 tree t;
2040
2041 if (e == error_mark_node)
2042 return error_mark_node;
2043
2044 if (processing_template_decl)
2045 {
2046 e = build_min (ALIGNOF_EXPR, size_type_node, e);
2047 TREE_SIDE_EFFECTS (e) = 0;
2048 TREE_READONLY (e) = 1;
2049 SET_EXPR_LOCATION (e, loc);
2050 ALIGNOF_EXPR_STD_P (e) = std_alignof;
2051
2052 return e;
2053 }
2054
2055 location_t e_loc = cp_expr_loc_or_loc (e, loc);
2056 STRIP_ANY_LOCATION_WRAPPER (e);
2057
2058 e = mark_type_use (e);
2059
2060 if (!verify_type_context (loc, TCTX_ALIGNOF, TREE_TYPE (e),
2061 !(complain & tf_error)))
2062 {
2063 if (!(complain & tf_error))
2064 return error_mark_node;
2065 t = size_one_node;
2066 }
2067 else if (VAR_P (e))
2068 t = size_int (DECL_ALIGN_UNIT (e));
2069 else if (bitfield_p (e))
2070 {
2071 if (complain & tf_error)
2072 error_at (e_loc,
2073 "invalid application of %<__alignof%> to a bit-field");
2074 else
2075 return error_mark_node;
2076 t = size_one_node;
2077 }
2078 else if (TREE_CODE (e) == COMPONENT_REF
2079 && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL)
2080 t = size_int (DECL_ALIGN_UNIT (TREE_OPERAND (e, 1)));
2081 else if (is_overloaded_fn (e))
2082 {
2083 if (complain & tf_error)
2084 permerror (e_loc, "ISO C++ forbids applying %<__alignof%> to "
2085 "an expression of function type");
2086 else
2087 return error_mark_node;
2088 if (TREE_CODE (e) == FUNCTION_DECL)
2089 t = size_int (DECL_ALIGN_UNIT (e));
2090 else
2091 t = size_one_node;
2092 }
2093 else if (type_unknown_p (e))
2094 {
2095 if (complain & tf_error)
2096 cxx_incomplete_type_error (e_loc, e, TREE_TYPE (e));
2097 else
2098 return error_mark_node;
2099 t = size_one_node;
2100 }
2101 else
2102 return cxx_sizeof_or_alignof_type (loc, TREE_TYPE (e),
2103 ALIGNOF_EXPR, std_alignof,
2104 complain & tf_error);
2105
2106 return fold_convert_loc (loc, size_type_node, t);
2107 }
2108
2109 /* Process a sizeof or alignof expression E with code OP where the operand
2110 is an expression. STD_ALIGNOF acts like in cxx_sizeof_or_alignof_type. */
2111
2112 tree
cxx_sizeof_or_alignof_expr(location_t loc,tree e,enum tree_code op,bool std_alignof,bool complain)2113 cxx_sizeof_or_alignof_expr (location_t loc, tree e, enum tree_code op,
2114 bool std_alignof, bool complain)
2115 {
2116 gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
2117 if (op == SIZEOF_EXPR)
2118 return cxx_sizeof_expr (loc, e, complain? tf_warning_or_error : tf_none);
2119 else
2120 return cxx_alignof_expr (loc, e, std_alignof,
2121 complain? tf_warning_or_error : tf_none);
2122 }
2123
2124 /* Build a representation of an expression 'alignas(E).' Return the
2125 folded integer value of E if it is an integral constant expression
2126 that resolves to a valid alignment. If E depends on a template
2127 parameter, return a syntactic representation tree of kind
2128 ALIGNOF_EXPR. Otherwise, return an error_mark_node if the
2129 expression is ill formed, or NULL_TREE if E is NULL_TREE. */
2130
2131 tree
cxx_alignas_expr(tree e)2132 cxx_alignas_expr (tree e)
2133 {
2134 if (e == NULL_TREE || e == error_mark_node
2135 || (!TYPE_P (e) && !require_potential_rvalue_constant_expression (e)))
2136 return e;
2137
2138 if (TYPE_P (e))
2139 /* [dcl.align]/3:
2140
2141 When the alignment-specifier is of the form
2142 alignas(type-id), it shall have the same effect as
2143 alignas(alignof(type-id)). */
2144
2145 return cxx_sizeof_or_alignof_type (input_location,
2146 e, ALIGNOF_EXPR,
2147 /*std_alignof=*/true,
2148 /*complain=*/true);
2149
2150 /* If we reach this point, it means the alignas expression if of
2151 the form "alignas(assignment-expression)", so we should follow
2152 what is stated by [dcl.align]/2. */
2153
2154 if (value_dependent_expression_p (e))
2155 /* Leave value-dependent expression alone for now. */
2156 return e;
2157
2158 e = instantiate_non_dependent_expr (e);
2159 e = mark_rvalue_use (e);
2160
2161 /* [dcl.align]/2 says:
2162
2163 the assignment-expression shall be an integral constant
2164 expression. */
2165
2166 if (!INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (e)))
2167 {
2168 error ("%<alignas%> argument has non-integral type %qT", TREE_TYPE (e));
2169 return error_mark_node;
2170 }
2171
2172 return cxx_constant_value (e);
2173 }
2174
2175
2176 /* EXPR is being used in a context that is not a function call.
2177 Enforce:
2178
2179 [expr.ref]
2180
2181 The expression can be used only as the left-hand operand of a
2182 member function call.
2183
2184 [expr.mptr.operator]
2185
2186 If the result of .* or ->* is a function, then that result can be
2187 used only as the operand for the function call operator ().
2188
2189 by issuing an error message if appropriate. Returns true iff EXPR
2190 violates these rules. */
2191
2192 bool
invalid_nonstatic_memfn_p(location_t loc,tree expr,tsubst_flags_t complain)2193 invalid_nonstatic_memfn_p (location_t loc, tree expr, tsubst_flags_t complain)
2194 {
2195 if (expr == NULL_TREE)
2196 return false;
2197 /* Don't enforce this in MS mode. */
2198 if (flag_ms_extensions)
2199 return false;
2200 if (is_overloaded_fn (expr) && !really_overloaded_fn (expr))
2201 expr = get_first_fn (expr);
2202 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (expr))
2203 {
2204 if (complain & tf_error)
2205 {
2206 if (DECL_P (expr))
2207 {
2208 error_at (loc, "invalid use of non-static member function %qD",
2209 expr);
2210 inform (DECL_SOURCE_LOCATION (expr), "declared here");
2211 }
2212 else
2213 error_at (loc, "invalid use of non-static member function of "
2214 "type %qT", TREE_TYPE (expr));
2215 }
2216 return true;
2217 }
2218 return false;
2219 }
2220
2221 /* If EXP is a reference to a bit-field, and the type of EXP does not
2222 match the declared type of the bit-field, return the declared type
2223 of the bit-field. Otherwise, return NULL_TREE. */
2224
2225 tree
is_bitfield_expr_with_lowered_type(const_tree exp)2226 is_bitfield_expr_with_lowered_type (const_tree exp)
2227 {
2228 switch (TREE_CODE (exp))
2229 {
2230 case COND_EXPR:
2231 if (!is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1)
2232 ? TREE_OPERAND (exp, 1)
2233 : TREE_OPERAND (exp, 0)))
2234 return NULL_TREE;
2235 return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 2));
2236
2237 case COMPOUND_EXPR:
2238 return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1));
2239
2240 case MODIFY_EXPR:
2241 case SAVE_EXPR:
2242 case UNARY_PLUS_EXPR:
2243 case PREDECREMENT_EXPR:
2244 case PREINCREMENT_EXPR:
2245 case POSTDECREMENT_EXPR:
2246 case POSTINCREMENT_EXPR:
2247 case NEGATE_EXPR:
2248 case NON_LVALUE_EXPR:
2249 case BIT_NOT_EXPR:
2250 return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0));
2251
2252 case COMPONENT_REF:
2253 {
2254 tree field;
2255
2256 field = TREE_OPERAND (exp, 1);
2257 if (TREE_CODE (field) != FIELD_DECL || !DECL_BIT_FIELD_TYPE (field))
2258 return NULL_TREE;
2259 if (same_type_ignoring_top_level_qualifiers_p
2260 (TREE_TYPE (exp), DECL_BIT_FIELD_TYPE (field)))
2261 return NULL_TREE;
2262 return DECL_BIT_FIELD_TYPE (field);
2263 }
2264
2265 case VAR_DECL:
2266 if (DECL_HAS_VALUE_EXPR_P (exp))
2267 return is_bitfield_expr_with_lowered_type (DECL_VALUE_EXPR
2268 (CONST_CAST_TREE (exp)));
2269 return NULL_TREE;
2270
2271 case VIEW_CONVERT_EXPR:
2272 if (location_wrapper_p (exp))
2273 return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0));
2274 else
2275 return NULL_TREE;
2276
2277 default:
2278 return NULL_TREE;
2279 }
2280 }
2281
2282 /* Like is_bitfield_with_lowered_type, except that if EXP is not a
2283 bitfield with a lowered type, the type of EXP is returned, rather
2284 than NULL_TREE. */
2285
2286 tree
unlowered_expr_type(const_tree exp)2287 unlowered_expr_type (const_tree exp)
2288 {
2289 tree type;
2290 tree etype = TREE_TYPE (exp);
2291
2292 type = is_bitfield_expr_with_lowered_type (exp);
2293 if (type)
2294 type = cp_build_qualified_type (type, cp_type_quals (etype));
2295 else
2296 type = etype;
2297
2298 return type;
2299 }
2300
2301 /* Perform the conversions in [expr] that apply when an lvalue appears
2302 in an rvalue context: the lvalue-to-rvalue, array-to-pointer, and
2303 function-to-pointer conversions. In addition, bitfield references are
2304 converted to their declared types. Note that this function does not perform
2305 the lvalue-to-rvalue conversion for class types. If you need that conversion
2306 for class types, then you probably need to use force_rvalue.
2307
2308 Although the returned value is being used as an rvalue, this
2309 function does not wrap the returned expression in a
2310 NON_LVALUE_EXPR; the caller is expected to be mindful of the fact
2311 that the return value is no longer an lvalue. */
2312
2313 tree
decay_conversion(tree exp,tsubst_flags_t complain,bool reject_builtin)2314 decay_conversion (tree exp,
2315 tsubst_flags_t complain,
2316 bool reject_builtin /* = true */)
2317 {
2318 tree type;
2319 enum tree_code code;
2320 location_t loc = cp_expr_loc_or_input_loc (exp);
2321
2322 type = TREE_TYPE (exp);
2323 if (type == error_mark_node)
2324 return error_mark_node;
2325
2326 exp = resolve_nondeduced_context_or_error (exp, complain);
2327
2328 code = TREE_CODE (type);
2329
2330 if (error_operand_p (exp))
2331 return error_mark_node;
2332
2333 if (NULLPTR_TYPE_P (type) && !TREE_SIDE_EFFECTS (exp))
2334 {
2335 mark_rvalue_use (exp, loc, reject_builtin);
2336 return nullptr_node;
2337 }
2338
2339 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
2340 Leave such NOP_EXPRs, since RHS is being used in non-lvalue context. */
2341 if (code == VOID_TYPE)
2342 {
2343 if (complain & tf_error)
2344 error_at (loc, "void value not ignored as it ought to be");
2345 return error_mark_node;
2346 }
2347 if (invalid_nonstatic_memfn_p (loc, exp, complain))
2348 return error_mark_node;
2349 if (code == FUNCTION_TYPE || is_overloaded_fn (exp))
2350 {
2351 exp = mark_lvalue_use (exp);
2352 if (reject_builtin && reject_gcc_builtin (exp, loc))
2353 return error_mark_node;
2354 return cp_build_addr_expr (exp, complain);
2355 }
2356 if (code == ARRAY_TYPE)
2357 {
2358 tree adr;
2359 tree ptrtype;
2360
2361 exp = mark_lvalue_use (exp);
2362
2363 if (INDIRECT_REF_P (exp))
2364 return build_nop (build_pointer_type (TREE_TYPE (type)),
2365 TREE_OPERAND (exp, 0));
2366
2367 if (TREE_CODE (exp) == COMPOUND_EXPR)
2368 {
2369 tree op1 = decay_conversion (TREE_OPERAND (exp, 1), complain);
2370 if (op1 == error_mark_node)
2371 return error_mark_node;
2372 return build2 (COMPOUND_EXPR, TREE_TYPE (op1),
2373 TREE_OPERAND (exp, 0), op1);
2374 }
2375
2376 if (!obvalue_p (exp)
2377 && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp)))
2378 {
2379 if (complain & tf_error)
2380 error_at (loc, "invalid use of non-lvalue array");
2381 return error_mark_node;
2382 }
2383
2384 /* Don't let an array compound literal decay to a pointer. It can
2385 still be used to initialize an array or bind to a reference. */
2386 if (TREE_CODE (exp) == TARGET_EXPR)
2387 {
2388 if (complain & tf_error)
2389 error_at (loc, "taking address of temporary array");
2390 return error_mark_node;
2391 }
2392
2393 ptrtype = build_pointer_type (TREE_TYPE (type));
2394
2395 if (VAR_P (exp))
2396 {
2397 if (!cxx_mark_addressable (exp))
2398 return error_mark_node;
2399 adr = build_nop (ptrtype, build_address (exp));
2400 return adr;
2401 }
2402 /* This way is better for a COMPONENT_REF since it can
2403 simplify the offset for a component. */
2404 adr = cp_build_addr_expr (exp, complain);
2405 return cp_convert (ptrtype, adr, complain);
2406 }
2407
2408 /* Otherwise, it's the lvalue-to-rvalue conversion. */
2409 exp = mark_rvalue_use (exp, loc, reject_builtin);
2410
2411 /* If a bitfield is used in a context where integral promotion
2412 applies, then the caller is expected to have used
2413 default_conversion. That function promotes bitfields correctly
2414 before calling this function. At this point, if we have a
2415 bitfield referenced, we may assume that is not subject to
2416 promotion, and that, therefore, the type of the resulting rvalue
2417 is the declared type of the bitfield. */
2418 exp = convert_bitfield_to_declared_type (exp);
2419
2420 /* We do not call rvalue() here because we do not want to wrap EXP
2421 in a NON_LVALUE_EXPR. */
2422
2423 /* [basic.lval]
2424
2425 Non-class rvalues always have cv-unqualified types. */
2426 type = TREE_TYPE (exp);
2427 if (!CLASS_TYPE_P (type) && cv_qualified_p (type))
2428 exp = build_nop (cv_unqualified (type), exp);
2429
2430 if (!complete_type_or_maybe_complain (type, exp, complain))
2431 return error_mark_node;
2432
2433 return exp;
2434 }
2435
2436 /* Perform preparatory conversions, as part of the "usual arithmetic
2437 conversions". In particular, as per [expr]:
2438
2439 Whenever an lvalue expression appears as an operand of an
2440 operator that expects the rvalue for that operand, the
2441 lvalue-to-rvalue, array-to-pointer, or function-to-pointer
2442 standard conversions are applied to convert the expression to an
2443 rvalue.
2444
2445 In addition, we perform integral promotions here, as those are
2446 applied to both operands to a binary operator before determining
2447 what additional conversions should apply. */
2448
2449 static tree
cp_default_conversion(tree exp,tsubst_flags_t complain)2450 cp_default_conversion (tree exp, tsubst_flags_t complain)
2451 {
2452 /* Check for target-specific promotions. */
2453 tree promoted_type = targetm.promoted_type (TREE_TYPE (exp));
2454 if (promoted_type)
2455 exp = cp_convert (promoted_type, exp, complain);
2456 /* Perform the integral promotions first so that bitfield
2457 expressions (which may promote to "int", even if the bitfield is
2458 declared "unsigned") are promoted correctly. */
2459 else if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (exp)))
2460 exp = cp_perform_integral_promotions (exp, complain);
2461 /* Perform the other conversions. */
2462 exp = decay_conversion (exp, complain);
2463
2464 return exp;
2465 }
2466
2467 /* C version. */
2468
2469 tree
default_conversion(tree exp)2470 default_conversion (tree exp)
2471 {
2472 return cp_default_conversion (exp, tf_warning_or_error);
2473 }
2474
2475 /* EXPR is an expression with an integral or enumeration type.
2476 Perform the integral promotions in [conv.prom], and return the
2477 converted value. */
2478
2479 tree
cp_perform_integral_promotions(tree expr,tsubst_flags_t complain)2480 cp_perform_integral_promotions (tree expr, tsubst_flags_t complain)
2481 {
2482 tree type;
2483 tree promoted_type;
2484
2485 expr = mark_rvalue_use (expr);
2486 if (error_operand_p (expr))
2487 return error_mark_node;
2488
2489 type = TREE_TYPE (expr);
2490
2491 /* [conv.prom]
2492
2493 A prvalue for an integral bit-field (11.3.9) can be converted to a prvalue
2494 of type int if int can represent all the values of the bit-field;
2495 otherwise, it can be converted to unsigned int if unsigned int can
2496 represent all the values of the bit-field. If the bit-field is larger yet,
2497 no integral promotion applies to it. If the bit-field has an enumerated
2498 type, it is treated as any other value of that type for promotion
2499 purposes. */
2500 tree bitfield_type = is_bitfield_expr_with_lowered_type (expr);
2501 if (bitfield_type
2502 && (TREE_CODE (bitfield_type) == ENUMERAL_TYPE
2503 || TYPE_PRECISION (type) > TYPE_PRECISION (integer_type_node)))
2504 type = bitfield_type;
2505
2506 gcc_assert (INTEGRAL_OR_ENUMERATION_TYPE_P (type));
2507 /* Scoped enums don't promote. */
2508 if (SCOPED_ENUM_P (type))
2509 return expr;
2510 promoted_type = type_promotes_to (type);
2511 if (type != promoted_type)
2512 expr = cp_convert (promoted_type, expr, complain);
2513 else if (bitfield_type && bitfield_type != type)
2514 /* Prevent decay_conversion from converting to bitfield_type. */
2515 expr = build_nop (type, expr);
2516 return expr;
2517 }
2518
2519 /* C version. */
2520
2521 tree
perform_integral_promotions(tree expr)2522 perform_integral_promotions (tree expr)
2523 {
2524 return cp_perform_integral_promotions (expr, tf_warning_or_error);
2525 }
2526
2527 /* Returns nonzero iff exp is a STRING_CST or the result of applying
2528 decay_conversion to one. */
2529
2530 int
string_conv_p(const_tree totype,const_tree exp,int warn)2531 string_conv_p (const_tree totype, const_tree exp, int warn)
2532 {
2533 tree t;
2534
2535 if (!TYPE_PTR_P (totype))
2536 return 0;
2537
2538 t = TREE_TYPE (totype);
2539 if (!same_type_p (t, char_type_node)
2540 && !same_type_p (t, char8_type_node)
2541 && !same_type_p (t, char16_type_node)
2542 && !same_type_p (t, char32_type_node)
2543 && !same_type_p (t, wchar_type_node))
2544 return 0;
2545
2546 location_t loc = EXPR_LOC_OR_LOC (exp, input_location);
2547
2548 STRIP_ANY_LOCATION_WRAPPER (exp);
2549
2550 if (TREE_CODE (exp) == STRING_CST)
2551 {
2552 /* Make sure that we don't try to convert between char and wide chars. */
2553 if (!same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (exp))), t))
2554 return 0;
2555 }
2556 else
2557 {
2558 /* Is this a string constant which has decayed to 'const char *'? */
2559 t = build_pointer_type (cp_build_qualified_type (t, TYPE_QUAL_CONST));
2560 if (!same_type_p (TREE_TYPE (exp), t))
2561 return 0;
2562 STRIP_NOPS (exp);
2563 if (TREE_CODE (exp) != ADDR_EXPR
2564 || TREE_CODE (TREE_OPERAND (exp, 0)) != STRING_CST)
2565 return 0;
2566 }
2567 if (warn)
2568 {
2569 if (cxx_dialect >= cxx11)
2570 pedwarn (loc, OPT_Wwrite_strings,
2571 "ISO C++ forbids converting a string constant to %qT",
2572 totype);
2573 else
2574 warning_at (loc, OPT_Wwrite_strings,
2575 "deprecated conversion from string constant to %qT",
2576 totype);
2577 }
2578
2579 return 1;
2580 }
2581
2582 /* Given a COND_EXPR, MIN_EXPR, or MAX_EXPR in T, return it in a form that we
2583 can, for example, use as an lvalue. This code used to be in
2584 unary_complex_lvalue, but we needed it to deal with `a = (d == c) ? b : c'
2585 expressions, where we're dealing with aggregates. But now it's again only
2586 called from unary_complex_lvalue. The case (in particular) that led to
2587 this was with CODE == ADDR_EXPR, since it's not an lvalue when we'd
2588 get it there. */
2589
2590 static tree
rationalize_conditional_expr(enum tree_code code,tree t,tsubst_flags_t complain)2591 rationalize_conditional_expr (enum tree_code code, tree t,
2592 tsubst_flags_t complain)
2593 {
2594 location_t loc = cp_expr_loc_or_input_loc (t);
2595
2596 /* For MIN_EXPR or MAX_EXPR, fold-const.cc has arranged things so that
2597 the first operand is always the one to be used if both operands
2598 are equal, so we know what conditional expression this used to be. */
2599 if (TREE_CODE (t) == MIN_EXPR || TREE_CODE (t) == MAX_EXPR)
2600 {
2601 tree op0 = TREE_OPERAND (t, 0);
2602 tree op1 = TREE_OPERAND (t, 1);
2603
2604 /* The following code is incorrect if either operand side-effects. */
2605 gcc_assert (!TREE_SIDE_EFFECTS (op0)
2606 && !TREE_SIDE_EFFECTS (op1));
2607 return
2608 build_conditional_expr (loc,
2609 build_x_binary_op (loc,
2610 (TREE_CODE (t) == MIN_EXPR
2611 ? LE_EXPR : GE_EXPR),
2612 op0, TREE_CODE (op0),
2613 op1, TREE_CODE (op1),
2614 NULL_TREE,
2615 /*overload=*/NULL,
2616 complain),
2617 cp_build_unary_op (code, op0, false, complain),
2618 cp_build_unary_op (code, op1, false, complain),
2619 complain);
2620 }
2621
2622 tree op1 = TREE_OPERAND (t, 1);
2623 if (TREE_CODE (op1) != THROW_EXPR)
2624 op1 = cp_build_unary_op (code, op1, false, complain);
2625 tree op2 = TREE_OPERAND (t, 2);
2626 if (TREE_CODE (op2) != THROW_EXPR)
2627 op2 = cp_build_unary_op (code, op2, false, complain);
2628
2629 return
2630 build_conditional_expr (loc, TREE_OPERAND (t, 0), op1, op2, complain);
2631 }
2632
2633 /* Given the TYPE of an anonymous union field inside T, return the
2634 FIELD_DECL for the field. If not found return NULL_TREE. Because
2635 anonymous unions can nest, we must also search all anonymous unions
2636 that are directly reachable. */
2637
2638 tree
lookup_anon_field(tree,tree type)2639 lookup_anon_field (tree, tree type)
2640 {
2641 tree field;
2642
2643 type = TYPE_MAIN_VARIANT (type);
2644 field = ANON_AGGR_TYPE_FIELD (type);
2645 gcc_assert (field);
2646 return field;
2647 }
2648
2649 /* Build an expression representing OBJECT.MEMBER. OBJECT is an
2650 expression; MEMBER is a DECL or baselink. If ACCESS_PATH is
2651 non-NULL, it indicates the path to the base used to name MEMBER.
2652 If PRESERVE_REFERENCE is true, the expression returned will have
2653 REFERENCE_TYPE if the MEMBER does. Otherwise, the expression
2654 returned will have the type referred to by the reference.
2655
2656 This function does not perform access control; that is either done
2657 earlier by the parser when the name of MEMBER is resolved to MEMBER
2658 itself, or later when overload resolution selects one of the
2659 functions indicated by MEMBER. */
2660
2661 tree
build_class_member_access_expr(cp_expr object,tree member,tree access_path,bool preserve_reference,tsubst_flags_t complain)2662 build_class_member_access_expr (cp_expr object, tree member,
2663 tree access_path, bool preserve_reference,
2664 tsubst_flags_t complain)
2665 {
2666 tree object_type;
2667 tree member_scope;
2668 tree result = NULL_TREE;
2669 tree using_decl = NULL_TREE;
2670
2671 if (error_operand_p (object) || error_operand_p (member))
2672 return error_mark_node;
2673
2674 gcc_assert (DECL_P (member) || BASELINK_P (member));
2675
2676 /* [expr.ref]
2677
2678 The type of the first expression shall be "class object" (of a
2679 complete type). */
2680 object_type = TREE_TYPE (object);
2681 if (!currently_open_class (object_type)
2682 && !complete_type_or_maybe_complain (object_type, object, complain))
2683 return error_mark_node;
2684 if (!CLASS_TYPE_P (object_type))
2685 {
2686 if (complain & tf_error)
2687 {
2688 if (INDIRECT_TYPE_P (object_type)
2689 && CLASS_TYPE_P (TREE_TYPE (object_type)))
2690 error ("request for member %qD in %qE, which is of pointer "
2691 "type %qT (maybe you meant to use %<->%> ?)",
2692 member, object.get_value (), object_type);
2693 else
2694 error ("request for member %qD in %qE, which is of non-class "
2695 "type %qT", member, object.get_value (), object_type);
2696 }
2697 return error_mark_node;
2698 }
2699
2700 /* The standard does not seem to actually say that MEMBER must be a
2701 member of OBJECT_TYPE. However, that is clearly what is
2702 intended. */
2703 if (DECL_P (member))
2704 {
2705 member_scope = DECL_CLASS_CONTEXT (member);
2706 if (!mark_used (member, complain) && !(complain & tf_error))
2707 return error_mark_node;
2708
2709 if (TREE_UNAVAILABLE (member))
2710 error_unavailable_use (member, NULL_TREE);
2711 else if (TREE_DEPRECATED (member))
2712 warn_deprecated_use (member, NULL_TREE);
2713 }
2714 else
2715 member_scope = BINFO_TYPE (BASELINK_ACCESS_BINFO (member));
2716 /* If MEMBER is from an anonymous aggregate, MEMBER_SCOPE will
2717 presently be the anonymous union. Go outwards until we find a
2718 type related to OBJECT_TYPE. */
2719 while ((ANON_AGGR_TYPE_P (member_scope) || UNSCOPED_ENUM_P (member_scope))
2720 && !same_type_ignoring_top_level_qualifiers_p (member_scope,
2721 object_type))
2722 member_scope = TYPE_CONTEXT (member_scope);
2723 if (!member_scope || !DERIVED_FROM_P (member_scope, object_type))
2724 {
2725 if (complain & tf_error)
2726 {
2727 if (TREE_CODE (member) == FIELD_DECL)
2728 error ("invalid use of non-static data member %qE", member);
2729 else
2730 error ("%qD is not a member of %qT", member, object_type);
2731 }
2732 return error_mark_node;
2733 }
2734
2735 /* Transform `(a, b).x' into `(*(a, &b)).x', `(a ? b : c).x' into
2736 `(*(a ? &b : &c)).x', and so on. A COND_EXPR is only an lvalue
2737 in the front end; only _DECLs and _REFs are lvalues in the back end. */
2738 if (tree temp = unary_complex_lvalue (ADDR_EXPR, object))
2739 {
2740 temp = cp_build_fold_indirect_ref (temp);
2741 if (!lvalue_p (object) && lvalue_p (temp))
2742 /* Preserve rvalueness. */
2743 temp = move (temp);
2744 object = temp;
2745 }
2746
2747 /* In [expr.ref], there is an explicit list of the valid choices for
2748 MEMBER. We check for each of those cases here. */
2749 if (VAR_P (member))
2750 {
2751 /* A static data member. */
2752 result = member;
2753 mark_exp_read (object);
2754
2755 if (tree wrap = maybe_get_tls_wrapper_call (result))
2756 /* Replace an evaluated use of the thread_local variable with
2757 a call to its wrapper. */
2758 result = wrap;
2759
2760 /* If OBJECT has side-effects, they are supposed to occur. */
2761 if (TREE_SIDE_EFFECTS (object))
2762 result = build2 (COMPOUND_EXPR, TREE_TYPE (result), object, result);
2763 }
2764 else if (TREE_CODE (member) == FIELD_DECL)
2765 {
2766 /* A non-static data member. */
2767 bool null_object_p;
2768 int type_quals;
2769 tree member_type;
2770
2771 if (INDIRECT_REF_P (object))
2772 null_object_p =
2773 integer_zerop (tree_strip_nop_conversions (TREE_OPERAND (object, 0)));
2774 else
2775 null_object_p = false;
2776
2777 /* Convert OBJECT to the type of MEMBER. */
2778 if (!same_type_p (TYPE_MAIN_VARIANT (object_type),
2779 TYPE_MAIN_VARIANT (member_scope)))
2780 {
2781 tree binfo;
2782 base_kind kind;
2783
2784 /* We didn't complain above about a currently open class, but now we
2785 must: we don't know how to refer to a base member before layout is
2786 complete. But still don't complain in a template. */
2787 if (!cp_unevaluated_operand
2788 && !dependent_type_p (object_type)
2789 && !complete_type_or_maybe_complain (object_type, object,
2790 complain))
2791 return error_mark_node;
2792
2793 binfo = lookup_base (access_path ? access_path : object_type,
2794 member_scope, ba_unique, &kind, complain);
2795 if (binfo == error_mark_node)
2796 return error_mark_node;
2797
2798 /* It is invalid to try to get to a virtual base of a
2799 NULL object. The most common cause is invalid use of
2800 offsetof macro. */
2801 if (null_object_p && kind == bk_via_virtual)
2802 {
2803 if (complain & tf_error)
2804 {
2805 error ("invalid access to non-static data member %qD in "
2806 "virtual base of NULL object", member);
2807 }
2808 return error_mark_node;
2809 }
2810
2811 /* Convert to the base. */
2812 object = build_base_path (PLUS_EXPR, object, binfo,
2813 /*nonnull=*/1, complain);
2814 /* If we found the base successfully then we should be able
2815 to convert to it successfully. */
2816 gcc_assert (object != error_mark_node);
2817 }
2818
2819 /* If MEMBER is from an anonymous aggregate, we have converted
2820 OBJECT so that it refers to the class containing the
2821 anonymous union. Generate a reference to the anonymous union
2822 itself, and recur to find MEMBER. */
2823 if (ANON_AGGR_TYPE_P (DECL_CONTEXT (member))
2824 /* When this code is called from build_field_call, the
2825 object already has the type of the anonymous union.
2826 That is because the COMPONENT_REF was already
2827 constructed, and was then disassembled before calling
2828 build_field_call. After the function-call code is
2829 cleaned up, this waste can be eliminated. */
2830 && (!same_type_ignoring_top_level_qualifiers_p
2831 (TREE_TYPE (object), DECL_CONTEXT (member))))
2832 {
2833 tree anonymous_union;
2834
2835 anonymous_union = lookup_anon_field (TREE_TYPE (object),
2836 DECL_CONTEXT (member));
2837 object = build_class_member_access_expr (object,
2838 anonymous_union,
2839 /*access_path=*/NULL_TREE,
2840 preserve_reference,
2841 complain);
2842 }
2843
2844 /* Compute the type of the field, as described in [expr.ref]. */
2845 type_quals = TYPE_UNQUALIFIED;
2846 member_type = TREE_TYPE (member);
2847 if (!TYPE_REF_P (member_type))
2848 {
2849 type_quals = (cp_type_quals (member_type)
2850 | cp_type_quals (object_type));
2851
2852 /* A field is const (volatile) if the enclosing object, or the
2853 field itself, is const (volatile). But, a mutable field is
2854 not const, even within a const object. */
2855 if (DECL_MUTABLE_P (member))
2856 type_quals &= ~TYPE_QUAL_CONST;
2857 member_type = cp_build_qualified_type (member_type, type_quals);
2858 }
2859
2860 result = build3_loc (input_location, COMPONENT_REF, member_type,
2861 object, member, NULL_TREE);
2862
2863 /* Mark the expression const or volatile, as appropriate. Even
2864 though we've dealt with the type above, we still have to mark the
2865 expression itself. */
2866 if (type_quals & TYPE_QUAL_CONST)
2867 TREE_READONLY (result) = 1;
2868 if (type_quals & TYPE_QUAL_VOLATILE)
2869 TREE_THIS_VOLATILE (result) = 1;
2870 }
2871 else if (BASELINK_P (member))
2872 {
2873 /* The member is a (possibly overloaded) member function. */
2874 tree functions;
2875 tree type;
2876
2877 /* If the MEMBER is exactly one static member function, then we
2878 know the type of the expression. Otherwise, we must wait
2879 until overload resolution has been performed. */
2880 functions = BASELINK_FUNCTIONS (member);
2881 if (TREE_CODE (functions) == FUNCTION_DECL
2882 && DECL_STATIC_FUNCTION_P (functions))
2883 type = TREE_TYPE (functions);
2884 else
2885 type = unknown_type_node;
2886 /* Note that we do not convert OBJECT to the BASELINK_BINFO
2887 base. That will happen when the function is called. */
2888 result = build3_loc (input_location, COMPONENT_REF, type, object, member,
2889 NULL_TREE);
2890 }
2891 else if (TREE_CODE (member) == CONST_DECL)
2892 {
2893 /* The member is an enumerator. */
2894 result = member;
2895 /* If OBJECT has side-effects, they are supposed to occur. */
2896 if (TREE_SIDE_EFFECTS (object))
2897 result = build2 (COMPOUND_EXPR, TREE_TYPE (result),
2898 object, result);
2899 }
2900 else if ((using_decl = strip_using_decl (member)) != member)
2901 result = build_class_member_access_expr (object,
2902 using_decl,
2903 access_path, preserve_reference,
2904 complain);
2905 else
2906 {
2907 if (complain & tf_error)
2908 error ("invalid use of %qD", member);
2909 return error_mark_node;
2910 }
2911
2912 if (!preserve_reference)
2913 /* [expr.ref]
2914
2915 If E2 is declared to have type "reference to T", then ... the
2916 type of E1.E2 is T. */
2917 result = convert_from_reference (result);
2918
2919 return result;
2920 }
2921
2922 /* Return the destructor denoted by OBJECT.SCOPE::DTOR_NAME, or, if
2923 SCOPE is NULL, by OBJECT.DTOR_NAME, where DTOR_NAME is ~type. */
2924
2925 tree
lookup_destructor(tree object,tree scope,tree dtor_name,tsubst_flags_t complain)2926 lookup_destructor (tree object, tree scope, tree dtor_name,
2927 tsubst_flags_t complain)
2928 {
2929 tree object_type = TREE_TYPE (object);
2930 tree dtor_type = TREE_OPERAND (dtor_name, 0);
2931 tree expr;
2932
2933 /* We've already complained about this destructor. */
2934 if (dtor_type == error_mark_node)
2935 return error_mark_node;
2936
2937 if (scope && !check_dtor_name (scope, dtor_type))
2938 {
2939 if (complain & tf_error)
2940 error ("qualified type %qT does not match destructor name ~%qT",
2941 scope, dtor_type);
2942 return error_mark_node;
2943 }
2944 if (is_auto (dtor_type))
2945 dtor_type = object_type;
2946 else if (identifier_p (dtor_type))
2947 {
2948 /* In a template, names we can't find a match for are still accepted
2949 destructor names, and we check them here. */
2950 if (check_dtor_name (object_type, dtor_type))
2951 dtor_type = object_type;
2952 else
2953 {
2954 if (complain & tf_error)
2955 error ("object type %qT does not match destructor name ~%qT",
2956 object_type, dtor_type);
2957 return error_mark_node;
2958 }
2959
2960 }
2961 else if (!DERIVED_FROM_P (dtor_type, TYPE_MAIN_VARIANT (object_type)))
2962 {
2963 if (complain & tf_error)
2964 error ("the type being destroyed is %qT, but the destructor "
2965 "refers to %qT", TYPE_MAIN_VARIANT (object_type), dtor_type);
2966 return error_mark_node;
2967 }
2968 expr = lookup_member (dtor_type, complete_dtor_identifier,
2969 /*protect=*/1, /*want_type=*/false,
2970 tf_warning_or_error);
2971 if (!expr)
2972 {
2973 if (complain & tf_error)
2974 cxx_incomplete_type_error (dtor_name, dtor_type);
2975 return error_mark_node;
2976 }
2977 expr = (adjust_result_of_qualified_name_lookup
2978 (expr, dtor_type, object_type));
2979 if (scope == NULL_TREE)
2980 /* We need to call adjust_result_of_qualified_name_lookup in case the
2981 destructor names a base class, but we unset BASELINK_QUALIFIED_P so
2982 that we still get virtual function binding. */
2983 BASELINK_QUALIFIED_P (expr) = false;
2984 return expr;
2985 }
2986
2987 /* An expression of the form "A::template B" has been resolved to
2988 DECL. Issue a diagnostic if B is not a template or template
2989 specialization. */
2990
2991 void
check_template_keyword(tree decl)2992 check_template_keyword (tree decl)
2993 {
2994 /* The standard says:
2995
2996 [temp.names]
2997
2998 If a name prefixed by the keyword template is not a member
2999 template, the program is ill-formed.
3000
3001 DR 228 removed the restriction that the template be a member
3002 template.
3003
3004 DR 96, if accepted would add the further restriction that explicit
3005 template arguments must be provided if the template keyword is
3006 used, but, as of 2005-10-16, that DR is still in "drafting". If
3007 this DR is accepted, then the semantic checks here can be
3008 simplified, as the entity named must in fact be a template
3009 specialization, rather than, as at present, a set of overloaded
3010 functions containing at least one template function. */
3011 if (TREE_CODE (decl) != TEMPLATE_DECL
3012 && TREE_CODE (decl) != TEMPLATE_ID_EXPR)
3013 {
3014 if (VAR_P (decl))
3015 {
3016 if (DECL_USE_TEMPLATE (decl)
3017 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl)))
3018 ;
3019 else
3020 permerror (input_location, "%qD is not a template", decl);
3021 }
3022 else if (!is_overloaded_fn (decl))
3023 permerror (input_location, "%qD is not a template", decl);
3024 else
3025 {
3026 bool found = false;
3027
3028 for (lkp_iterator iter (MAYBE_BASELINK_FUNCTIONS (decl));
3029 !found && iter; ++iter)
3030 {
3031 tree fn = *iter;
3032 if (TREE_CODE (fn) == TEMPLATE_DECL
3033 || TREE_CODE (fn) == TEMPLATE_ID_EXPR
3034 || (TREE_CODE (fn) == FUNCTION_DECL
3035 && DECL_USE_TEMPLATE (fn)
3036 && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (fn))))
3037 found = true;
3038 }
3039 if (!found)
3040 permerror (input_location, "%qD is not a template", decl);
3041 }
3042 }
3043 }
3044
3045 /* Record that an access failure occurred on BASETYPE_PATH attempting
3046 to access DECL, where DIAG_DECL should be used for diagnostics. */
3047
3048 void
record_access_failure(tree basetype_path,tree decl,tree diag_decl)3049 access_failure_info::record_access_failure (tree basetype_path,
3050 tree decl, tree diag_decl)
3051 {
3052 m_was_inaccessible = true;
3053 m_basetype_path = basetype_path;
3054 m_decl = decl;
3055 m_diag_decl = diag_decl;
3056 }
3057
3058 /* If an access failure was recorded, then attempt to locate an
3059 accessor function for the pertinent field.
3060 Otherwise, return NULL_TREE. */
3061
3062 tree
get_any_accessor(bool const_p) const3063 access_failure_info::get_any_accessor (bool const_p) const
3064 {
3065 if (!was_inaccessible_p ())
3066 return NULL_TREE;
3067
3068 tree accessor
3069 = locate_field_accessor (m_basetype_path, m_diag_decl, const_p);
3070 if (!accessor)
3071 return NULL_TREE;
3072
3073 /* The accessor must itself be accessible for it to be a reasonable
3074 suggestion. */
3075 if (!accessible_p (m_basetype_path, accessor, true))
3076 return NULL_TREE;
3077
3078 return accessor;
3079 }
3080
3081 /* Add a fix-it hint to RICHLOC suggesting the use of ACCESSOR_DECL, by
3082 replacing the primary location in RICHLOC with "accessor()". */
3083
3084 void
add_fixit_hint(rich_location * richloc,tree accessor_decl)3085 access_failure_info::add_fixit_hint (rich_location *richloc,
3086 tree accessor_decl)
3087 {
3088 pretty_printer pp;
3089 pp_string (&pp, IDENTIFIER_POINTER (DECL_NAME (accessor_decl)));
3090 pp_string (&pp, "()");
3091 richloc->add_fixit_replace (pp_formatted_text (&pp));
3092 }
3093
3094 /* If an access failure was recorded, then attempt to locate an
3095 accessor function for the pertinent field, and if one is
3096 available, add a note and fix-it hint suggesting using it. */
3097
3098 void
maybe_suggest_accessor(bool const_p) const3099 access_failure_info::maybe_suggest_accessor (bool const_p) const
3100 {
3101 tree accessor = get_any_accessor (const_p);
3102 if (accessor == NULL_TREE)
3103 return;
3104 rich_location richloc (line_table, input_location);
3105 add_fixit_hint (&richloc, accessor);
3106 inform (&richloc, "field %q#D can be accessed via %q#D",
3107 m_diag_decl, accessor);
3108 }
3109
3110 /* Subroutine of finish_class_member_access_expr.
3111 Issue an error about NAME not being a member of ACCESS_PATH (or
3112 OBJECT_TYPE), potentially providing a fix-it hint for misspelled
3113 names. */
3114
3115 static void
complain_about_unrecognized_member(tree access_path,tree name,tree object_type)3116 complain_about_unrecognized_member (tree access_path, tree name,
3117 tree object_type)
3118 {
3119 /* Attempt to provide a hint about misspelled names. */
3120 tree guessed_id = lookup_member_fuzzy (access_path, name,
3121 /*want_type=*/false);
3122 if (guessed_id == NULL_TREE)
3123 {
3124 /* No hint. */
3125 error ("%q#T has no member named %qE",
3126 TREE_CODE (access_path) == TREE_BINFO
3127 ? TREE_TYPE (access_path) : object_type, name);
3128 return;
3129 }
3130
3131 location_t bogus_component_loc = input_location;
3132 gcc_rich_location rich_loc (bogus_component_loc);
3133
3134 /* Check that the guessed name is accessible along access_path. */
3135 access_failure_info afi;
3136 lookup_member (access_path, guessed_id, /*protect=*/1,
3137 /*want_type=*/false, /*complain=*/false,
3138 &afi);
3139 if (afi.was_inaccessible_p ())
3140 {
3141 tree accessor = afi.get_any_accessor (TYPE_READONLY (object_type));
3142 if (accessor)
3143 {
3144 /* The guessed name isn't directly accessible, but can be accessed
3145 via an accessor member function. */
3146 afi.add_fixit_hint (&rich_loc, accessor);
3147 error_at (&rich_loc,
3148 "%q#T has no member named %qE;"
3149 " did you mean %q#D? (accessible via %q#D)",
3150 TREE_CODE (access_path) == TREE_BINFO
3151 ? TREE_TYPE (access_path) : object_type,
3152 name, afi.get_diag_decl (), accessor);
3153 }
3154 else
3155 {
3156 /* The guessed name isn't directly accessible, and no accessor
3157 member function could be found. */
3158 error_at (&rich_loc,
3159 "%q#T has no member named %qE;"
3160 " did you mean %q#D? (not accessible from this context)",
3161 TREE_CODE (access_path) == TREE_BINFO
3162 ? TREE_TYPE (access_path) : object_type,
3163 name, afi.get_diag_decl ());
3164 complain_about_access (afi.get_decl (), afi.get_diag_decl (),
3165 afi.get_diag_decl (), false, ak_none);
3166 }
3167 }
3168 else
3169 {
3170 /* The guessed name is directly accessible; suggest it. */
3171 rich_loc.add_fixit_misspelled_id (bogus_component_loc,
3172 guessed_id);
3173 error_at (&rich_loc,
3174 "%q#T has no member named %qE;"
3175 " did you mean %qE?",
3176 TREE_CODE (access_path) == TREE_BINFO
3177 ? TREE_TYPE (access_path) : object_type,
3178 name, guessed_id);
3179 }
3180 }
3181
3182 /* This function is called by the parser to process a class member
3183 access expression of the form OBJECT.NAME. NAME is a node used by
3184 the parser to represent a name; it is not yet a DECL. It may,
3185 however, be a BASELINK where the BASELINK_FUNCTIONS is a
3186 TEMPLATE_ID_EXPR. Templates must be looked up by the parser, and
3187 there is no reason to do the lookup twice, so the parser keeps the
3188 BASELINK. TEMPLATE_P is true iff NAME was explicitly declared to
3189 be a template via the use of the "A::template B" syntax. */
3190
3191 tree
finish_class_member_access_expr(cp_expr object,tree name,bool template_p,tsubst_flags_t complain)3192 finish_class_member_access_expr (cp_expr object, tree name, bool template_p,
3193 tsubst_flags_t complain)
3194 {
3195 tree expr;
3196 tree object_type;
3197 tree member;
3198 tree access_path = NULL_TREE;
3199 tree orig_object = object;
3200 tree orig_name = name;
3201
3202 if (object == error_mark_node || name == error_mark_node)
3203 return error_mark_node;
3204
3205 /* If OBJECT is an ObjC class instance, we must obey ObjC access rules. */
3206 if (!objc_is_public (object, name))
3207 return error_mark_node;
3208
3209 object_type = TREE_TYPE (object);
3210
3211 if (processing_template_decl)
3212 {
3213 if (/* If OBJECT is dependent, so is OBJECT.NAME. */
3214 type_dependent_object_expression_p (object)
3215 /* If NAME is "f<args>", where either 'f' or 'args' is
3216 dependent, then the expression is dependent. */
3217 || (TREE_CODE (name) == TEMPLATE_ID_EXPR
3218 && dependent_template_id_p (TREE_OPERAND (name, 0),
3219 TREE_OPERAND (name, 1)))
3220 /* If NAME is "T::X" where "T" is dependent, then the
3221 expression is dependent. */
3222 || (TREE_CODE (name) == SCOPE_REF
3223 && TYPE_P (TREE_OPERAND (name, 0))
3224 && dependent_scope_p (TREE_OPERAND (name, 0)))
3225 /* If NAME is operator T where "T" is dependent, we can't
3226 lookup until we instantiate the T. */
3227 || (TREE_CODE (name) == IDENTIFIER_NODE
3228 && IDENTIFIER_CONV_OP_P (name)
3229 && dependent_type_p (TREE_TYPE (name))))
3230 {
3231 dependent:
3232 return build_min_nt_loc (UNKNOWN_LOCATION, COMPONENT_REF,
3233 orig_object, orig_name, NULL_TREE);
3234 }
3235 object = build_non_dependent_expr (object);
3236 }
3237 else if (c_dialect_objc ()
3238 && identifier_p (name)
3239 && (expr = objc_maybe_build_component_ref (object, name)))
3240 return expr;
3241
3242 /* [expr.ref]
3243
3244 The type of the first expression shall be "class object" (of a
3245 complete type). */
3246 if (!currently_open_class (object_type)
3247 && !complete_type_or_maybe_complain (object_type, object, complain))
3248 return error_mark_node;
3249 if (!CLASS_TYPE_P (object_type))
3250 {
3251 if (complain & tf_error)
3252 {
3253 if (INDIRECT_TYPE_P (object_type)
3254 && CLASS_TYPE_P (TREE_TYPE (object_type)))
3255 error ("request for member %qD in %qE, which is of pointer "
3256 "type %qT (maybe you meant to use %<->%> ?)",
3257 name, object.get_value (), object_type);
3258 else
3259 error ("request for member %qD in %qE, which is of non-class "
3260 "type %qT", name, object.get_value (), object_type);
3261 }
3262 return error_mark_node;
3263 }
3264
3265 if (BASELINK_P (name))
3266 /* A member function that has already been looked up. */
3267 member = name;
3268 else
3269 {
3270 bool is_template_id = false;
3271 tree template_args = NULL_TREE;
3272 tree scope = NULL_TREE;
3273
3274 access_path = object_type;
3275
3276 if (TREE_CODE (name) == SCOPE_REF)
3277 {
3278 /* A qualified name. The qualifying class or namespace `S'
3279 has already been looked up; it is either a TYPE or a
3280 NAMESPACE_DECL. */
3281 scope = TREE_OPERAND (name, 0);
3282 name = TREE_OPERAND (name, 1);
3283
3284 /* If SCOPE is a namespace, then the qualified name does not
3285 name a member of OBJECT_TYPE. */
3286 if (TREE_CODE (scope) == NAMESPACE_DECL)
3287 {
3288 if (complain & tf_error)
3289 error ("%<%D::%D%> is not a member of %qT",
3290 scope, name, object_type);
3291 return error_mark_node;
3292 }
3293 }
3294
3295 if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
3296 {
3297 is_template_id = true;
3298 template_args = TREE_OPERAND (name, 1);
3299 name = TREE_OPERAND (name, 0);
3300
3301 if (!identifier_p (name))
3302 name = OVL_NAME (name);
3303 }
3304
3305 if (scope)
3306 {
3307 if (TREE_CODE (scope) == ENUMERAL_TYPE)
3308 {
3309 gcc_assert (!is_template_id);
3310 /* Looking up a member enumerator (c++/56793). */
3311 if (!TYPE_CLASS_SCOPE_P (scope)
3312 || !DERIVED_FROM_P (TYPE_CONTEXT (scope), object_type))
3313 {
3314 if (complain & tf_error)
3315 error ("%<%D::%D%> is not a member of %qT",
3316 scope, name, object_type);
3317 return error_mark_node;
3318 }
3319 tree val = lookup_enumerator (scope, name);
3320 if (!val)
3321 {
3322 if (complain & tf_error)
3323 error ("%qD is not a member of %qD",
3324 name, scope);
3325 return error_mark_node;
3326 }
3327
3328 if (TREE_SIDE_EFFECTS (object))
3329 val = build2 (COMPOUND_EXPR, TREE_TYPE (val), object, val);
3330 return val;
3331 }
3332
3333 gcc_assert (CLASS_TYPE_P (scope));
3334 gcc_assert (identifier_p (name) || TREE_CODE (name) == BIT_NOT_EXPR);
3335
3336 if (constructor_name_p (name, scope))
3337 {
3338 if (complain & tf_error)
3339 error ("cannot call constructor %<%T::%D%> directly",
3340 scope, name);
3341 return error_mark_node;
3342 }
3343
3344 /* Find the base of OBJECT_TYPE corresponding to SCOPE. */
3345 access_path = lookup_base (object_type, scope, ba_check,
3346 NULL, complain);
3347 if (access_path == error_mark_node)
3348 return error_mark_node;
3349 if (!access_path)
3350 {
3351 if (any_dependent_bases_p (object_type))
3352 goto dependent;
3353 if (complain & tf_error)
3354 error ("%qT is not a base of %qT", scope, object_type);
3355 return error_mark_node;
3356 }
3357 }
3358
3359 if (TREE_CODE (name) == BIT_NOT_EXPR)
3360 {
3361 if (dependent_type_p (object_type))
3362 /* The destructor isn't declared yet. */
3363 goto dependent;
3364 member = lookup_destructor (object, scope, name, complain);
3365 }
3366 else
3367 {
3368 /* Look up the member. */
3369 access_failure_info afi;
3370 if (processing_template_decl)
3371 /* Even though this class member access expression is at this
3372 point not dependent, the member itself may be dependent, and
3373 we must not potentially push a access check for a dependent
3374 member onto TI_DEFERRED_ACCESS_CHECKS. So don't check access
3375 ahead of time here; we're going to redo this member lookup at
3376 instantiation time anyway. */
3377 push_deferring_access_checks (dk_no_check);
3378 member = lookup_member (access_path, name, /*protect=*/1,
3379 /*want_type=*/false, complain,
3380 &afi);
3381 if (processing_template_decl)
3382 pop_deferring_access_checks ();
3383 afi.maybe_suggest_accessor (TYPE_READONLY (object_type));
3384 if (member == NULL_TREE)
3385 {
3386 if (dependent_type_p (object_type))
3387 /* Try again at instantiation time. */
3388 goto dependent;
3389 if (complain & tf_error)
3390 complain_about_unrecognized_member (access_path, name,
3391 object_type);
3392 return error_mark_node;
3393 }
3394 if (member == error_mark_node)
3395 return error_mark_node;
3396 if (DECL_P (member)
3397 && any_dependent_type_attributes_p (DECL_ATTRIBUTES (member)))
3398 /* Dependent type attributes on the decl mean that the TREE_TYPE is
3399 wrong, so don't use it. */
3400 goto dependent;
3401 if (TREE_CODE (member) == USING_DECL && DECL_DEPENDENT_P (member))
3402 goto dependent;
3403 }
3404
3405 if (is_template_id)
3406 {
3407 tree templ = member;
3408
3409 if (BASELINK_P (templ))
3410 member = lookup_template_function (templ, template_args);
3411 else if (variable_template_p (templ))
3412 member = (lookup_and_finish_template_variable
3413 (templ, template_args, complain));
3414 else
3415 {
3416 if (complain & tf_error)
3417 error ("%qD is not a member template function", name);
3418 return error_mark_node;
3419 }
3420 }
3421 }
3422
3423 if (TREE_UNAVAILABLE (member))
3424 error_unavailable_use (member, NULL_TREE);
3425 else if (TREE_DEPRECATED (member))
3426 warn_deprecated_use (member, NULL_TREE);
3427
3428 if (template_p)
3429 check_template_keyword (member);
3430
3431 expr = build_class_member_access_expr (object, member, access_path,
3432 /*preserve_reference=*/false,
3433 complain);
3434 if (processing_template_decl && expr != error_mark_node)
3435 {
3436 if (BASELINK_P (member))
3437 {
3438 if (TREE_CODE (orig_name) == SCOPE_REF)
3439 BASELINK_QUALIFIED_P (member) = 1;
3440 orig_name = member;
3441 }
3442 return build_min_non_dep (COMPONENT_REF, expr,
3443 orig_object, orig_name,
3444 NULL_TREE);
3445 }
3446
3447 return expr;
3448 }
3449
3450 /* Build a COMPONENT_REF of OBJECT and MEMBER with the appropriate
3451 type. */
3452
3453 tree
build_simple_component_ref(tree object,tree member)3454 build_simple_component_ref (tree object, tree member)
3455 {
3456 tree type = cp_build_qualified_type (TREE_TYPE (member),
3457 cp_type_quals (TREE_TYPE (object)));
3458 return build3_loc (input_location,
3459 COMPONENT_REF, type,
3460 object, member, NULL_TREE);
3461 }
3462
3463 /* Return an expression for the MEMBER_NAME field in the internal
3464 representation of PTRMEM, a pointer-to-member function. (Each
3465 pointer-to-member function type gets its own RECORD_TYPE so it is
3466 more convenient to access the fields by name than by FIELD_DECL.)
3467 This routine converts the NAME to a FIELD_DECL and then creates the
3468 node for the complete expression. */
3469
3470 tree
build_ptrmemfunc_access_expr(tree ptrmem,tree member_name)3471 build_ptrmemfunc_access_expr (tree ptrmem, tree member_name)
3472 {
3473 tree ptrmem_type;
3474 tree member;
3475
3476 if (TREE_CODE (ptrmem) == CONSTRUCTOR)
3477 {
3478 for (auto &e: CONSTRUCTOR_ELTS (ptrmem))
3479 if (e.index && DECL_P (e.index) && DECL_NAME (e.index) == member_name)
3480 return e.value;
3481 gcc_unreachable ();
3482 }
3483
3484 /* This code is a stripped down version of
3485 build_class_member_access_expr. It does not work to use that
3486 routine directly because it expects the object to be of class
3487 type. */
3488 ptrmem_type = TREE_TYPE (ptrmem);
3489 gcc_assert (TYPE_PTRMEMFUNC_P (ptrmem_type));
3490 for (member = TYPE_FIELDS (ptrmem_type); member;
3491 member = DECL_CHAIN (member))
3492 if (DECL_NAME (member) == member_name)
3493 break;
3494 return build_simple_component_ref (ptrmem, member);
3495 }
3496
3497 /* Return a TREE_LIST of namespace-scope overloads for the given operator,
3498 and for any other relevant operator. */
3499
3500 static tree
op_unqualified_lookup(tree_code code,bool is_assign)3501 op_unqualified_lookup (tree_code code, bool is_assign)
3502 {
3503 tree lookups = NULL_TREE;
3504
3505 if (cxx_dialect >= cxx20 && !is_assign)
3506 {
3507 if (code == NE_EXPR)
3508 {
3509 /* != can get rewritten in terms of ==. */
3510 tree fnname = ovl_op_identifier (false, EQ_EXPR);
3511 if (tree fns = lookup_name (fnname, LOOK_where::BLOCK_NAMESPACE))
3512 lookups = tree_cons (fnname, fns, lookups);
3513 }
3514 else if (code == GT_EXPR || code == LE_EXPR
3515 || code == LT_EXPR || code == GE_EXPR)
3516 {
3517 /* These can get rewritten in terms of <=>. */
3518 tree fnname = ovl_op_identifier (false, SPACESHIP_EXPR);
3519 if (tree fns = lookup_name (fnname, LOOK_where::BLOCK_NAMESPACE))
3520 lookups = tree_cons (fnname, fns, lookups);
3521 }
3522 }
3523
3524 tree fnname = ovl_op_identifier (is_assign, code);
3525 if (tree fns = lookup_name (fnname, LOOK_where::BLOCK_NAMESPACE))
3526 lookups = tree_cons (fnname, fns, lookups);
3527
3528 if (lookups)
3529 return lookups;
3530 else
3531 return build_tree_list (NULL_TREE, NULL_TREE);
3532 }
3533
3534 /* Create a DEPENDENT_OPERATOR_TYPE for a dependent operator expression of
3535 the given operator. LOOKUPS, if non-NULL, is the result of phase 1
3536 name lookup for the given operator. */
3537
3538 tree
build_dependent_operator_type(tree lookups,tree_code code,bool is_assign)3539 build_dependent_operator_type (tree lookups, tree_code code, bool is_assign)
3540 {
3541 if (lookups)
3542 /* We're partially instantiating a dependent operator expression, and
3543 LOOKUPS is the result of phase 1 name lookup that we performed
3544 earlier at template definition time, so just reuse the corresponding
3545 DEPENDENT_OPERATOR_TYPE. */
3546 return TREE_TYPE (lookups);
3547
3548 /* Otherwise we're processing a dependent operator expression at template
3549 definition time, so perform phase 1 name lookup now. */
3550 lookups = op_unqualified_lookup (code, is_assign);
3551
3552 tree type = cxx_make_type (DEPENDENT_OPERATOR_TYPE);
3553 DEPENDENT_OPERATOR_TYPE_SAVED_LOOKUPS (type) = lookups;
3554 TREE_TYPE (lookups) = type;
3555 return type;
3556 }
3557
3558 /* Given an expression PTR for a pointer, return an expression
3559 for the value pointed to.
3560 ERRORSTRING is the name of the operator to appear in error messages.
3561
3562 This function may need to overload OPERATOR_FNNAME.
3563 Must also handle REFERENCE_TYPEs for C++. */
3564
3565 tree
build_x_indirect_ref(location_t loc,tree expr,ref_operator errorstring,tree lookups,tsubst_flags_t complain)3566 build_x_indirect_ref (location_t loc, tree expr, ref_operator errorstring,
3567 tree lookups, tsubst_flags_t complain)
3568 {
3569 tree orig_expr = expr;
3570 tree rval;
3571 tree overload = NULL_TREE;
3572
3573 if (processing_template_decl)
3574 {
3575 /* Retain the type if we know the operand is a pointer. */
3576 if (TREE_TYPE (expr) && INDIRECT_TYPE_P (TREE_TYPE (expr)))
3577 {
3578 if (expr == current_class_ptr
3579 || (TREE_CODE (expr) == NOP_EXPR
3580 && TREE_OPERAND (expr, 0) == current_class_ptr
3581 && (same_type_ignoring_top_level_qualifiers_p
3582 (TREE_TYPE (expr), TREE_TYPE (current_class_ptr)))))
3583 return current_class_ref;
3584 return build_min (INDIRECT_REF, TREE_TYPE (TREE_TYPE (expr)), expr);
3585 }
3586 if (type_dependent_expression_p (expr))
3587 {
3588 expr = build_min_nt_loc (loc, INDIRECT_REF, expr);
3589 TREE_TYPE (expr)
3590 = build_dependent_operator_type (lookups, INDIRECT_REF, false);
3591 return expr;
3592 }
3593 expr = build_non_dependent_expr (expr);
3594 }
3595
3596 rval = build_new_op (loc, INDIRECT_REF, LOOKUP_NORMAL, expr,
3597 NULL_TREE, NULL_TREE, lookups,
3598 &overload, complain);
3599 if (!rval)
3600 rval = cp_build_indirect_ref (loc, expr, errorstring, complain);
3601
3602 if (processing_template_decl && rval != error_mark_node)
3603 {
3604 if (overload != NULL_TREE)
3605 return (build_min_non_dep_op_overload
3606 (INDIRECT_REF, rval, overload, orig_expr));
3607
3608 return build_min_non_dep (INDIRECT_REF, rval, orig_expr);
3609 }
3610 else
3611 return rval;
3612 }
3613
3614 /* Like c-family strict_aliasing_warning, but don't warn for dependent
3615 types or expressions. */
3616
3617 static bool
cp_strict_aliasing_warning(location_t loc,tree type,tree expr)3618 cp_strict_aliasing_warning (location_t loc, tree type, tree expr)
3619 {
3620 if (processing_template_decl)
3621 {
3622 tree e = expr;
3623 STRIP_NOPS (e);
3624 if (dependent_type_p (type) || type_dependent_expression_p (e))
3625 return false;
3626 }
3627 return strict_aliasing_warning (loc, type, expr);
3628 }
3629
3630 /* The implementation of the above, and of indirection implied by other
3631 constructs. If DO_FOLD is true, fold away INDIRECT_REF of ADDR_EXPR. */
3632
3633 static tree
cp_build_indirect_ref_1(location_t loc,tree ptr,ref_operator errorstring,tsubst_flags_t complain,bool do_fold)3634 cp_build_indirect_ref_1 (location_t loc, tree ptr, ref_operator errorstring,
3635 tsubst_flags_t complain, bool do_fold)
3636 {
3637 tree pointer, type;
3638
3639 /* RO_NULL should only be used with the folding entry points below, not
3640 cp_build_indirect_ref. */
3641 gcc_checking_assert (errorstring != RO_NULL || do_fold);
3642
3643 if (ptr == current_class_ptr
3644 || (TREE_CODE (ptr) == NOP_EXPR
3645 && TREE_OPERAND (ptr, 0) == current_class_ptr
3646 && (same_type_ignoring_top_level_qualifiers_p
3647 (TREE_TYPE (ptr), TREE_TYPE (current_class_ptr)))))
3648 return current_class_ref;
3649
3650 pointer = (TYPE_REF_P (TREE_TYPE (ptr))
3651 ? ptr : decay_conversion (ptr, complain));
3652 if (pointer == error_mark_node)
3653 return error_mark_node;
3654
3655 type = TREE_TYPE (pointer);
3656
3657 if (INDIRECT_TYPE_P (type))
3658 {
3659 /* [expr.unary.op]
3660
3661 If the type of the expression is "pointer to T," the type
3662 of the result is "T." */
3663 tree t = TREE_TYPE (type);
3664
3665 if ((CONVERT_EXPR_P (ptr)
3666 || TREE_CODE (ptr) == VIEW_CONVERT_EXPR)
3667 && (!CLASS_TYPE_P (t) || !CLASSTYPE_EMPTY_P (t)))
3668 {
3669 /* If a warning is issued, mark it to avoid duplicates from
3670 the backend. This only needs to be done at
3671 warn_strict_aliasing > 2. */
3672 if (warn_strict_aliasing > 2
3673 && cp_strict_aliasing_warning (EXPR_LOCATION (ptr),
3674 type, TREE_OPERAND (ptr, 0)))
3675 suppress_warning (ptr, OPT_Wstrict_aliasing);
3676 }
3677
3678 if (VOID_TYPE_P (t))
3679 {
3680 /* A pointer to incomplete type (other than cv void) can be
3681 dereferenced [expr.unary.op]/1 */
3682 if (complain & tf_error)
3683 error_at (loc, "%qT is not a pointer-to-object type", type);
3684 return error_mark_node;
3685 }
3686 else if (do_fold && TREE_CODE (pointer) == ADDR_EXPR
3687 && same_type_p (t, TREE_TYPE (TREE_OPERAND (pointer, 0))))
3688 /* The POINTER was something like `&x'. We simplify `*&x' to
3689 `x'. */
3690 return TREE_OPERAND (pointer, 0);
3691 else
3692 {
3693 tree ref = build1 (INDIRECT_REF, t, pointer);
3694
3695 /* We *must* set TREE_READONLY when dereferencing a pointer to const,
3696 so that we get the proper error message if the result is used
3697 to assign to. Also, &* is supposed to be a no-op. */
3698 TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
3699 TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
3700 TREE_SIDE_EFFECTS (ref)
3701 = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (pointer));
3702 return ref;
3703 }
3704 }
3705 else if (!(complain & tf_error))
3706 /* Don't emit any errors; we'll just return ERROR_MARK_NODE later. */
3707 ;
3708 /* `pointer' won't be an error_mark_node if we were given a
3709 pointer to member, so it's cool to check for this here. */
3710 else if (TYPE_PTRMEM_P (type))
3711 switch (errorstring)
3712 {
3713 case RO_ARRAY_INDEXING:
3714 error_at (loc,
3715 "invalid use of array indexing on pointer to member");
3716 break;
3717 case RO_UNARY_STAR:
3718 error_at (loc, "invalid use of unary %<*%> on pointer to member");
3719 break;
3720 case RO_IMPLICIT_CONVERSION:
3721 error_at (loc, "invalid use of implicit conversion on pointer "
3722 "to member");
3723 break;
3724 case RO_ARROW_STAR:
3725 error_at (loc, "left hand operand of %<->*%> must be a pointer to "
3726 "class, but is a pointer to member of type %qT", type);
3727 break;
3728 default:
3729 gcc_unreachable ();
3730 }
3731 else if (pointer != error_mark_node)
3732 invalid_indirection_error (loc, type, errorstring);
3733
3734 return error_mark_node;
3735 }
3736
3737 /* Entry point used by c-common, which expects folding. */
3738
3739 tree
build_indirect_ref(location_t loc,tree ptr,ref_operator errorstring)3740 build_indirect_ref (location_t loc, tree ptr, ref_operator errorstring)
3741 {
3742 return cp_build_indirect_ref_1 (loc, ptr, errorstring,
3743 tf_warning_or_error, true);
3744 }
3745
3746 /* Entry point used by internal indirection needs that don't correspond to any
3747 syntactic construct. */
3748
3749 tree
cp_build_fold_indirect_ref(tree pointer)3750 cp_build_fold_indirect_ref (tree pointer)
3751 {
3752 return cp_build_indirect_ref_1 (input_location, pointer, RO_NULL,
3753 tf_warning_or_error, true);
3754 }
3755
3756 /* Entry point used by indirection needs that correspond to some syntactic
3757 construct. */
3758
3759 tree
cp_build_indirect_ref(location_t loc,tree ptr,ref_operator errorstring,tsubst_flags_t complain)3760 cp_build_indirect_ref (location_t loc, tree ptr, ref_operator errorstring,
3761 tsubst_flags_t complain)
3762 {
3763 return cp_build_indirect_ref_1 (loc, ptr, errorstring, complain, false);
3764 }
3765
3766 /* This handles expressions of the form "a[i]", which denotes
3767 an array reference.
3768
3769 This is logically equivalent in C to *(a+i), but we may do it differently.
3770 If A is a variable or a member, we generate a primitive ARRAY_REF.
3771 This avoids forcing the array out of registers, and can work on
3772 arrays that are not lvalues (for example, members of structures returned
3773 by functions).
3774
3775 If INDEX is of some user-defined type, it must be converted to
3776 integer type. Otherwise, to make a compatible PLUS_EXPR, it
3777 will inherit the type of the array, which will be some pointer type.
3778
3779 LOC is the location to use in building the array reference. */
3780
3781 tree
cp_build_array_ref(location_t loc,tree array,tree idx,tsubst_flags_t complain)3782 cp_build_array_ref (location_t loc, tree array, tree idx,
3783 tsubst_flags_t complain)
3784 {
3785 tree first = NULL_TREE;
3786 tree ret;
3787
3788 if (idx == 0)
3789 {
3790 if (complain & tf_error)
3791 error_at (loc, "subscript missing in array reference");
3792 return error_mark_node;
3793 }
3794
3795 if (TREE_TYPE (array) == error_mark_node
3796 || TREE_TYPE (idx) == error_mark_node)
3797 return error_mark_node;
3798
3799 /* If ARRAY is a COMPOUND_EXPR or COND_EXPR, move our reference
3800 inside it. */
3801 switch (TREE_CODE (array))
3802 {
3803 case COMPOUND_EXPR:
3804 {
3805 tree value = cp_build_array_ref (loc, TREE_OPERAND (array, 1), idx,
3806 complain);
3807 ret = build2 (COMPOUND_EXPR, TREE_TYPE (value),
3808 TREE_OPERAND (array, 0), value);
3809 SET_EXPR_LOCATION (ret, loc);
3810 return ret;
3811 }
3812
3813 case COND_EXPR:
3814 ret = build_conditional_expr
3815 (loc, TREE_OPERAND (array, 0),
3816 cp_build_array_ref (loc, TREE_OPERAND (array, 1), idx,
3817 complain),
3818 cp_build_array_ref (loc, TREE_OPERAND (array, 2), idx,
3819 complain),
3820 complain);
3821 protected_set_expr_location (ret, loc);
3822 return ret;
3823
3824 default:
3825 break;
3826 }
3827
3828 bool non_lvalue = convert_vector_to_array_for_subscript (loc, &array, idx);
3829
3830 /* 0[array] */
3831 if (TREE_CODE (TREE_TYPE (idx)) == ARRAY_TYPE)
3832 {
3833 std::swap (array, idx);
3834 if (flag_strong_eval_order == 2 && TREE_SIDE_EFFECTS (array))
3835 idx = first = save_expr (idx);
3836 }
3837
3838 if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE)
3839 {
3840 tree rval, type;
3841
3842 warn_array_subscript_with_type_char (loc, idx);
3843
3844 if (!INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (idx)))
3845 {
3846 if (complain & tf_error)
3847 error_at (loc, "array subscript is not an integer");
3848 return error_mark_node;
3849 }
3850
3851 /* Apply integral promotions *after* noticing character types.
3852 (It is unclear why we do these promotions -- the standard
3853 does not say that we should. In fact, the natural thing would
3854 seem to be to convert IDX to ptrdiff_t; we're performing
3855 pointer arithmetic.) */
3856 idx = cp_perform_integral_promotions (idx, complain);
3857
3858 idx = maybe_fold_non_dependent_expr (idx, complain);
3859
3860 /* An array that is indexed by a non-constant
3861 cannot be stored in a register; we must be able to do
3862 address arithmetic on its address.
3863 Likewise an array of elements of variable size. */
3864 if (TREE_CODE (idx) != INTEGER_CST
3865 || (COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (array)))
3866 && (TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))))
3867 != INTEGER_CST)))
3868 {
3869 if (!cxx_mark_addressable (array, true))
3870 return error_mark_node;
3871 }
3872
3873 /* An array that is indexed by a constant value which is not within
3874 the array bounds cannot be stored in a register either; because we
3875 would get a crash in store_bit_field/extract_bit_field when trying
3876 to access a non-existent part of the register. */
3877 if (TREE_CODE (idx) == INTEGER_CST
3878 && TYPE_DOMAIN (TREE_TYPE (array))
3879 && ! int_fits_type_p (idx, TYPE_DOMAIN (TREE_TYPE (array))))
3880 {
3881 if (!cxx_mark_addressable (array))
3882 return error_mark_node;
3883 }
3884
3885 /* Note in C++ it is valid to subscript a `register' array, since
3886 it is valid to take the address of something with that
3887 storage specification. */
3888 if (extra_warnings)
3889 {
3890 tree foo = array;
3891 while (TREE_CODE (foo) == COMPONENT_REF)
3892 foo = TREE_OPERAND (foo, 0);
3893 if (VAR_P (foo) && DECL_REGISTER (foo)
3894 && (complain & tf_warning))
3895 warning_at (loc, OPT_Wextra,
3896 "subscripting array declared %<register%>");
3897 }
3898
3899 type = TREE_TYPE (TREE_TYPE (array));
3900 rval = build4 (ARRAY_REF, type, array, idx, NULL_TREE, NULL_TREE);
3901 /* Array ref is const/volatile if the array elements are
3902 or if the array is.. */
3903 TREE_READONLY (rval)
3904 |= (CP_TYPE_CONST_P (type) | TREE_READONLY (array));
3905 TREE_SIDE_EFFECTS (rval)
3906 |= (CP_TYPE_VOLATILE_P (type) | TREE_SIDE_EFFECTS (array));
3907 TREE_THIS_VOLATILE (rval)
3908 |= (CP_TYPE_VOLATILE_P (type) | TREE_THIS_VOLATILE (array));
3909 ret = require_complete_type_sfinae (rval, complain);
3910 protected_set_expr_location (ret, loc);
3911 if (non_lvalue)
3912 ret = non_lvalue_loc (loc, ret);
3913 if (first)
3914 ret = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (ret), first, ret);
3915 return ret;
3916 }
3917
3918 {
3919 tree ar = cp_default_conversion (array, complain);
3920 tree ind = cp_default_conversion (idx, complain);
3921
3922 if (!first && flag_strong_eval_order == 2 && TREE_SIDE_EFFECTS (ind))
3923 ar = first = save_expr (ar);
3924
3925 /* Put the integer in IND to simplify error checking. */
3926 if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE)
3927 std::swap (ar, ind);
3928
3929 if (ar == error_mark_node || ind == error_mark_node)
3930 return error_mark_node;
3931
3932 if (!TYPE_PTR_P (TREE_TYPE (ar)))
3933 {
3934 if (complain & tf_error)
3935 error_at (loc, "subscripted value is neither array nor pointer");
3936 return error_mark_node;
3937 }
3938 if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
3939 {
3940 if (complain & tf_error)
3941 error_at (loc, "array subscript is not an integer");
3942 return error_mark_node;
3943 }
3944
3945 warn_array_subscript_with_type_char (loc, idx);
3946
3947 ret = cp_build_binary_op (input_location, PLUS_EXPR, ar, ind, complain);
3948 if (first)
3949 ret = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (ret), first, ret);
3950 ret = cp_build_indirect_ref (loc, ret, RO_ARRAY_INDEXING, complain);
3951 protected_set_expr_location (ret, loc);
3952 if (non_lvalue)
3953 ret = non_lvalue_loc (loc, ret);
3954 return ret;
3955 }
3956 }
3957
3958 /* Entry point for Obj-C++. */
3959
3960 tree
build_array_ref(location_t loc,tree array,tree idx)3961 build_array_ref (location_t loc, tree array, tree idx)
3962 {
3963 return cp_build_array_ref (loc, array, idx, tf_warning_or_error);
3964 }
3965
3966 /* Resolve a pointer to member function. INSTANCE is the object
3967 instance to use, if the member points to a virtual member.
3968
3969 This used to avoid checking for virtual functions if basetype
3970 has no virtual functions, according to an earlier ANSI draft.
3971 With the final ISO C++ rules, such an optimization is
3972 incorrect: A pointer to a derived member can be static_cast
3973 to pointer-to-base-member, as long as the dynamic object
3974 later has the right member. So now we only do this optimization
3975 when we know the dynamic type of the object. */
3976
3977 tree
get_member_function_from_ptrfunc(tree * instance_ptrptr,tree function,tsubst_flags_t complain)3978 get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function,
3979 tsubst_flags_t complain)
3980 {
3981 if (TREE_CODE (function) == OFFSET_REF)
3982 function = TREE_OPERAND (function, 1);
3983
3984 if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function)))
3985 {
3986 tree idx, delta, e1, e2, e3, vtbl;
3987 bool nonvirtual;
3988 tree fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function));
3989 tree basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype));
3990
3991 tree instance_ptr = *instance_ptrptr;
3992 tree instance_save_expr = 0;
3993 if (instance_ptr == error_mark_node)
3994 {
3995 if (TREE_CODE (function) == PTRMEM_CST)
3996 {
3997 /* Extracting the function address from a pmf is only
3998 allowed with -Wno-pmf-conversions. It only works for
3999 pmf constants. */
4000 e1 = build_addr_func (PTRMEM_CST_MEMBER (function), complain);
4001 e1 = convert (fntype, e1);
4002 return e1;
4003 }
4004 else
4005 {
4006 if (complain & tf_error)
4007 error ("object missing in use of %qE", function);
4008 return error_mark_node;
4009 }
4010 }
4011
4012 /* True if we know that the dynamic type of the object doesn't have
4013 virtual functions, so we can assume the PFN field is a pointer. */
4014 nonvirtual = (COMPLETE_TYPE_P (basetype)
4015 && !TYPE_POLYMORPHIC_P (basetype)
4016 && resolves_to_fixed_type_p (instance_ptr, 0));
4017
4018 /* If we don't really have an object (i.e. in an ill-formed
4019 conversion from PMF to pointer), we can't resolve virtual
4020 functions anyway. */
4021 if (!nonvirtual && is_dummy_object (instance_ptr))
4022 nonvirtual = true;
4023
4024 if (TREE_SIDE_EFFECTS (instance_ptr))
4025 instance_ptr = instance_save_expr = save_expr (instance_ptr);
4026
4027 if (TREE_SIDE_EFFECTS (function))
4028 function = save_expr (function);
4029
4030 /* Start by extracting all the information from the PMF itself. */
4031 e3 = pfn_from_ptrmemfunc (function);
4032 delta = delta_from_ptrmemfunc (function);
4033 idx = build1 (NOP_EXPR, vtable_index_type, e3);
4034 switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
4035 {
4036 int flag_sanitize_save;
4037 case ptrmemfunc_vbit_in_pfn:
4038 e1 = cp_build_binary_op (input_location,
4039 BIT_AND_EXPR, idx, integer_one_node,
4040 complain);
4041 idx = cp_build_binary_op (input_location,
4042 MINUS_EXPR, idx, integer_one_node,
4043 complain);
4044 if (idx == error_mark_node)
4045 return error_mark_node;
4046 break;
4047
4048 case ptrmemfunc_vbit_in_delta:
4049 e1 = cp_build_binary_op (input_location,
4050 BIT_AND_EXPR, delta, integer_one_node,
4051 complain);
4052 /* Don't instrument the RSHIFT_EXPR we're about to create because
4053 we're going to use DELTA number of times, and that wouldn't play
4054 well with SAVE_EXPRs therein. */
4055 flag_sanitize_save = flag_sanitize;
4056 flag_sanitize = 0;
4057 delta = cp_build_binary_op (input_location,
4058 RSHIFT_EXPR, delta, integer_one_node,
4059 complain);
4060 flag_sanitize = flag_sanitize_save;
4061 if (delta == error_mark_node)
4062 return error_mark_node;
4063 break;
4064
4065 default:
4066 gcc_unreachable ();
4067 }
4068
4069 if (e1 == error_mark_node)
4070 return error_mark_node;
4071
4072 /* Convert down to the right base before using the instance. A
4073 special case is that in a pointer to member of class C, C may
4074 be incomplete. In that case, the function will of course be
4075 a member of C, and no conversion is required. In fact,
4076 lookup_base will fail in that case, because incomplete
4077 classes do not have BINFOs. */
4078 if (!same_type_ignoring_top_level_qualifiers_p
4079 (basetype, TREE_TYPE (TREE_TYPE (instance_ptr))))
4080 {
4081 basetype = lookup_base (TREE_TYPE (TREE_TYPE (instance_ptr)),
4082 basetype, ba_check, NULL, complain);
4083 instance_ptr = build_base_path (PLUS_EXPR, instance_ptr, basetype,
4084 1, complain);
4085 if (instance_ptr == error_mark_node)
4086 return error_mark_node;
4087 }
4088 /* ...and then the delta in the PMF. */
4089 instance_ptr = fold_build_pointer_plus (instance_ptr, delta);
4090
4091 /* Hand back the adjusted 'this' argument to our caller. */
4092 *instance_ptrptr = instance_ptr;
4093
4094 if (nonvirtual)
4095 /* Now just return the pointer. */
4096 return e3;
4097
4098 /* Next extract the vtable pointer from the object. */
4099 vtbl = build1 (NOP_EXPR, build_pointer_type (vtbl_ptr_type_node),
4100 instance_ptr);
4101 vtbl = cp_build_fold_indirect_ref (vtbl);
4102 if (vtbl == error_mark_node)
4103 return error_mark_node;
4104
4105 /* Finally, extract the function pointer from the vtable. */
4106 e2 = fold_build_pointer_plus_loc (input_location, vtbl, idx);
4107 e2 = cp_build_fold_indirect_ref (e2);
4108 if (e2 == error_mark_node)
4109 return error_mark_node;
4110 TREE_CONSTANT (e2) = 1;
4111
4112 /* When using function descriptors, the address of the
4113 vtable entry is treated as a function pointer. */
4114 if (TARGET_VTABLE_USES_DESCRIPTORS)
4115 e2 = build1 (NOP_EXPR, TREE_TYPE (e2),
4116 cp_build_addr_expr (e2, complain));
4117
4118 e2 = fold_convert (TREE_TYPE (e3), e2);
4119 e1 = build_conditional_expr (input_location, e1, e2, e3, complain);
4120 if (e1 == error_mark_node)
4121 return error_mark_node;
4122
4123 /* Make sure this doesn't get evaluated first inside one of the
4124 branches of the COND_EXPR. */
4125 if (instance_save_expr)
4126 e1 = build2 (COMPOUND_EXPR, TREE_TYPE (e1),
4127 instance_save_expr, e1);
4128
4129 function = e1;
4130 }
4131 return function;
4132 }
4133
4134 /* Used by the C-common bits. */
4135 tree
build_function_call(location_t,tree function,tree params)4136 build_function_call (location_t /*loc*/,
4137 tree function, tree params)
4138 {
4139 return cp_build_function_call (function, params, tf_warning_or_error);
4140 }
4141
4142 /* Used by the C-common bits. */
4143 tree
build_function_call_vec(location_t,vec<location_t>,tree function,vec<tree,va_gc> * params,vec<tree,va_gc> *,tree orig_function)4144 build_function_call_vec (location_t /*loc*/, vec<location_t> /*arg_loc*/,
4145 tree function, vec<tree, va_gc> *params,
4146 vec<tree, va_gc> * /*origtypes*/, tree orig_function)
4147 {
4148 vec<tree, va_gc> *orig_params = params;
4149 tree ret = cp_build_function_call_vec (function, ¶ms,
4150 tf_warning_or_error, orig_function);
4151
4152 /* cp_build_function_call_vec can reallocate PARAMS by adding
4153 default arguments. That should never happen here. Verify
4154 that. */
4155 gcc_assert (params == orig_params);
4156
4157 return ret;
4158 }
4159
4160 /* Build a function call using a tree list of arguments. */
4161
4162 static tree
cp_build_function_call(tree function,tree params,tsubst_flags_t complain)4163 cp_build_function_call (tree function, tree params, tsubst_flags_t complain)
4164 {
4165 tree ret;
4166
4167 releasing_vec vec;
4168 for (; params != NULL_TREE; params = TREE_CHAIN (params))
4169 vec_safe_push (vec, TREE_VALUE (params));
4170 ret = cp_build_function_call_vec (function, &vec, complain);
4171 return ret;
4172 }
4173
4174 /* Build a function call using varargs. */
4175
4176 tree
cp_build_function_call_nary(tree function,tsubst_flags_t complain,...)4177 cp_build_function_call_nary (tree function, tsubst_flags_t complain, ...)
4178 {
4179 va_list args;
4180 tree ret, t;
4181
4182 releasing_vec vec;
4183 va_start (args, complain);
4184 for (t = va_arg (args, tree); t != NULL_TREE; t = va_arg (args, tree))
4185 vec_safe_push (vec, t);
4186 va_end (args);
4187 ret = cp_build_function_call_vec (function, &vec, complain);
4188 return ret;
4189 }
4190
4191 /* Build a function call using a vector of arguments.
4192 If FUNCTION is the result of resolving an overloaded target built-in,
4193 ORIG_FNDECL is the original function decl, otherwise it is null.
4194 PARAMS may be NULL if there are no parameters. This changes the
4195 contents of PARAMS. */
4196
4197 tree
cp_build_function_call_vec(tree function,vec<tree,va_gc> ** params,tsubst_flags_t complain,tree orig_fndecl)4198 cp_build_function_call_vec (tree function, vec<tree, va_gc> **params,
4199 tsubst_flags_t complain, tree orig_fndecl)
4200 {
4201 tree fntype, fndecl;
4202 int is_method;
4203 tree original = function;
4204 int nargs;
4205 tree *argarray;
4206 tree parm_types;
4207 vec<tree, va_gc> *allocated = NULL;
4208 tree ret;
4209
4210 /* For Objective-C, convert any calls via a cast to OBJC_TYPE_REF
4211 expressions, like those used for ObjC messenger dispatches. */
4212 if (params != NULL && !vec_safe_is_empty (*params))
4213 function = objc_rewrite_function_call (function, (**params)[0]);
4214
4215 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4216 Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context. */
4217 if (TREE_CODE (function) == NOP_EXPR
4218 && TREE_TYPE (function) == TREE_TYPE (TREE_OPERAND (function, 0)))
4219 function = TREE_OPERAND (function, 0);
4220
4221 if (TREE_CODE (function) == FUNCTION_DECL)
4222 {
4223 if (!mark_used (function, complain))
4224 return error_mark_node;
4225 fndecl = function;
4226
4227 /* Convert anything with function type to a pointer-to-function. */
4228 if (DECL_MAIN_P (function))
4229 {
4230 if (complain & tf_error)
4231 pedwarn (input_location, OPT_Wpedantic,
4232 "ISO C++ forbids calling %<::main%> from within program");
4233 else
4234 return error_mark_node;
4235 }
4236 function = build_addr_func (function, complain);
4237 }
4238 else
4239 {
4240 fndecl = NULL_TREE;
4241
4242 function = build_addr_func (function, complain);
4243 }
4244
4245 if (function == error_mark_node)
4246 return error_mark_node;
4247
4248 fntype = TREE_TYPE (function);
4249
4250 if (TYPE_PTRMEMFUNC_P (fntype))
4251 {
4252 if (complain & tf_error)
4253 error ("must use %<.*%> or %<->*%> to call pointer-to-member "
4254 "function in %<%E (...)%>, e.g. %<(... ->* %E) (...)%>",
4255 original, original);
4256 return error_mark_node;
4257 }
4258
4259 is_method = (TYPE_PTR_P (fntype)
4260 && TREE_CODE (TREE_TYPE (fntype)) == METHOD_TYPE);
4261
4262 if (!(TYPE_PTRFN_P (fntype)
4263 || is_method
4264 || TREE_CODE (function) == TEMPLATE_ID_EXPR))
4265 {
4266 if (complain & tf_error)
4267 {
4268 if (!flag_diagnostics_show_caret)
4269 error_at (input_location,
4270 "%qE cannot be used as a function", original);
4271 else if (DECL_P (original))
4272 error_at (input_location,
4273 "%qD cannot be used as a function", original);
4274 else
4275 error_at (input_location,
4276 "expression cannot be used as a function");
4277 }
4278
4279 return error_mark_node;
4280 }
4281
4282 /* fntype now gets the type of function pointed to. */
4283 fntype = TREE_TYPE (fntype);
4284 parm_types = TYPE_ARG_TYPES (fntype);
4285
4286 if (params == NULL)
4287 {
4288 allocated = make_tree_vector ();
4289 params = &allocated;
4290 }
4291
4292 nargs = convert_arguments (parm_types, params, fndecl, LOOKUP_NORMAL,
4293 complain);
4294 if (nargs < 0)
4295 return error_mark_node;
4296
4297 argarray = (*params)->address ();
4298
4299 /* Check for errors in format strings and inappropriately
4300 null parameters. */
4301 bool warned_p = check_function_arguments (input_location, fndecl, fntype,
4302 nargs, argarray, NULL);
4303
4304 ret = build_cxx_call (function, nargs, argarray, complain, orig_fndecl);
4305
4306 if (warned_p)
4307 {
4308 tree c = extract_call_expr (ret);
4309 if (TREE_CODE (c) == CALL_EXPR)
4310 suppress_warning (c, OPT_Wnonnull);
4311 }
4312
4313 if (allocated != NULL)
4314 release_tree_vector (allocated);
4315
4316 return ret;
4317 }
4318
4319 /* Subroutine of convert_arguments.
4320 Print an error message about a wrong number of arguments. */
4321
4322 static void
error_args_num(location_t loc,tree fndecl,bool too_many_p)4323 error_args_num (location_t loc, tree fndecl, bool too_many_p)
4324 {
4325 if (fndecl)
4326 {
4327 if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
4328 {
4329 if (DECL_NAME (fndecl) == NULL_TREE
4330 || (DECL_NAME (fndecl)
4331 == DECL_NAME (TYPE_NAME (DECL_CONTEXT (fndecl)))))
4332 error_at (loc,
4333 too_many_p
4334 ? G_("too many arguments to constructor %q#D")
4335 : G_("too few arguments to constructor %q#D"),
4336 fndecl);
4337 else
4338 error_at (loc,
4339 too_many_p
4340 ? G_("too many arguments to member function %q#D")
4341 : G_("too few arguments to member function %q#D"),
4342 fndecl);
4343 }
4344 else
4345 error_at (loc,
4346 too_many_p
4347 ? G_("too many arguments to function %q#D")
4348 : G_("too few arguments to function %q#D"),
4349 fndecl);
4350 if (!DECL_IS_UNDECLARED_BUILTIN (fndecl))
4351 inform (DECL_SOURCE_LOCATION (fndecl), "declared here");
4352 }
4353 else
4354 {
4355 if (c_dialect_objc () && objc_message_selector ())
4356 error_at (loc,
4357 too_many_p
4358 ? G_("too many arguments to method %q#D")
4359 : G_("too few arguments to method %q#D"),
4360 objc_message_selector ());
4361 else
4362 error_at (loc, too_many_p ? G_("too many arguments to function")
4363 : G_("too few arguments to function"));
4364 }
4365 }
4366
4367 /* Convert the actual parameter expressions in the list VALUES to the
4368 types in the list TYPELIST. The converted expressions are stored
4369 back in the VALUES vector.
4370 If parmdecls is exhausted, or when an element has NULL as its type,
4371 perform the default conversions.
4372
4373 NAME is an IDENTIFIER_NODE or 0. It is used only for error messages.
4374
4375 This is also where warnings about wrong number of args are generated.
4376
4377 Returns the actual number of arguments processed (which might be less
4378 than the length of the vector), or -1 on error.
4379
4380 In C++, unspecified trailing parameters can be filled in with their
4381 default arguments, if such were specified. Do so here. */
4382
4383 static int
convert_arguments(tree typelist,vec<tree,va_gc> ** values,tree fndecl,int flags,tsubst_flags_t complain)4384 convert_arguments (tree typelist, vec<tree, va_gc> **values, tree fndecl,
4385 int flags, tsubst_flags_t complain)
4386 {
4387 tree typetail;
4388 unsigned int i;
4389
4390 /* Argument passing is always copy-initialization. */
4391 flags |= LOOKUP_ONLYCONVERTING;
4392
4393 for (i = 0, typetail = typelist;
4394 i < vec_safe_length (*values);
4395 i++)
4396 {
4397 tree type = typetail ? TREE_VALUE (typetail) : 0;
4398 tree val = (**values)[i];
4399
4400 if (val == error_mark_node || type == error_mark_node)
4401 return -1;
4402
4403 if (type == void_type_node)
4404 {
4405 if (complain & tf_error)
4406 {
4407 error_args_num (input_location, fndecl, /*too_many_p=*/true);
4408 return i;
4409 }
4410 else
4411 return -1;
4412 }
4413
4414 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
4415 Strip such NOP_EXPRs, since VAL is used in non-lvalue context. */
4416 if (TREE_CODE (val) == NOP_EXPR
4417 && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))
4418 && (type == 0 || !TYPE_REF_P (type)))
4419 val = TREE_OPERAND (val, 0);
4420
4421 if (type == 0 || !TYPE_REF_P (type))
4422 {
4423 if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE
4424 || FUNC_OR_METHOD_TYPE_P (TREE_TYPE (val)))
4425 val = decay_conversion (val, complain);
4426 }
4427
4428 if (val == error_mark_node)
4429 return -1;
4430
4431 if (type != 0)
4432 {
4433 /* Formal parm type is specified by a function prototype. */
4434 tree parmval;
4435
4436 if (!COMPLETE_TYPE_P (complete_type (type)))
4437 {
4438 if (complain & tf_error)
4439 {
4440 location_t loc = EXPR_LOC_OR_LOC (val, input_location);
4441 if (fndecl)
4442 {
4443 auto_diagnostic_group d;
4444 error_at (loc,
4445 "parameter %P of %qD has incomplete type %qT",
4446 i, fndecl, type);
4447 inform (get_fndecl_argument_location (fndecl, i),
4448 " declared here");
4449 }
4450 else
4451 error_at (loc, "parameter %P has incomplete type %qT", i,
4452 type);
4453 }
4454 parmval = error_mark_node;
4455 }
4456 else
4457 {
4458 parmval = convert_for_initialization
4459 (NULL_TREE, type, val, flags,
4460 ICR_ARGPASS, fndecl, i, complain);
4461 parmval = convert_for_arg_passing (type, parmval, complain);
4462 }
4463
4464 if (parmval == error_mark_node)
4465 return -1;
4466
4467 (**values)[i] = parmval;
4468 }
4469 else
4470 {
4471 if (fndecl && magic_varargs_p (fndecl))
4472 /* Don't do ellipsis conversion for __built_in_constant_p
4473 as this will result in spurious errors for non-trivial
4474 types. */
4475 val = require_complete_type_sfinae (val, complain);
4476 else
4477 val = convert_arg_to_ellipsis (val, complain);
4478
4479 (**values)[i] = val;
4480 }
4481
4482 if (typetail)
4483 typetail = TREE_CHAIN (typetail);
4484 }
4485
4486 if (typetail != 0 && typetail != void_list_node)
4487 {
4488 /* See if there are default arguments that can be used. Because
4489 we hold default arguments in the FUNCTION_TYPE (which is so
4490 wrong), we can see default parameters here from deduced
4491 contexts (and via typeof) for indirect function calls.
4492 Fortunately we know whether we have a function decl to
4493 provide default arguments in a language conformant
4494 manner. */
4495 if (fndecl && TREE_PURPOSE (typetail)
4496 && TREE_CODE (TREE_PURPOSE (typetail)) != DEFERRED_PARSE)
4497 {
4498 for (; typetail != void_list_node; ++i)
4499 {
4500 /* After DR777, with explicit template args we can end up with a
4501 default argument followed by no default argument. */
4502 if (!TREE_PURPOSE (typetail))
4503 break;
4504 tree parmval
4505 = convert_default_arg (TREE_VALUE (typetail),
4506 TREE_PURPOSE (typetail),
4507 fndecl, i, complain);
4508
4509 if (parmval == error_mark_node)
4510 return -1;
4511
4512 vec_safe_push (*values, parmval);
4513 typetail = TREE_CHAIN (typetail);
4514 /* ends with `...'. */
4515 if (typetail == NULL_TREE)
4516 break;
4517 }
4518 }
4519
4520 if (typetail && typetail != void_list_node)
4521 {
4522 if (complain & tf_error)
4523 error_args_num (input_location, fndecl, /*too_many_p=*/false);
4524 return -1;
4525 }
4526 }
4527
4528 return (int) i;
4529 }
4530
4531 /* Build a binary-operation expression, after performing default
4532 conversions on the operands. CODE is the kind of expression to
4533 build. ARG1 and ARG2 are the arguments. ARG1_CODE and ARG2_CODE
4534 are the tree codes which correspond to ARG1 and ARG2 when issuing
4535 warnings about possibly misplaced parentheses. They may differ
4536 from the TREE_CODE of ARG1 and ARG2 if the parser has done constant
4537 folding (e.g., if the parser sees "a | 1 + 1", it may call this
4538 routine with ARG2 being an INTEGER_CST and ARG2_CODE == PLUS_EXPR).
4539 To avoid issuing any parentheses warnings, pass ARG1_CODE and/or
4540 ARG2_CODE as ERROR_MARK. */
4541
4542 tree
build_x_binary_op(const op_location_t & loc,enum tree_code code,tree arg1,enum tree_code arg1_code,tree arg2,enum tree_code arg2_code,tree lookups,tree * overload_p,tsubst_flags_t complain)4543 build_x_binary_op (const op_location_t &loc, enum tree_code code, tree arg1,
4544 enum tree_code arg1_code, tree arg2,
4545 enum tree_code arg2_code, tree lookups,
4546 tree *overload_p, tsubst_flags_t complain)
4547 {
4548 tree orig_arg1;
4549 tree orig_arg2;
4550 tree expr;
4551 tree overload = NULL_TREE;
4552
4553 orig_arg1 = arg1;
4554 orig_arg2 = arg2;
4555
4556 if (processing_template_decl)
4557 {
4558 if (type_dependent_expression_p (arg1)
4559 || type_dependent_expression_p (arg2))
4560 {
4561 expr = build_min_nt_loc (loc, code, arg1, arg2);
4562 TREE_TYPE (expr)
4563 = build_dependent_operator_type (lookups, code, false);
4564 return expr;
4565 }
4566 arg1 = build_non_dependent_expr (arg1);
4567 arg2 = build_non_dependent_expr (arg2);
4568 }
4569
4570 if (code == DOTSTAR_EXPR)
4571 expr = build_m_component_ref (arg1, arg2, complain);
4572 else
4573 expr = build_new_op (loc, code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE,
4574 lookups, &overload, complain);
4575
4576 if (overload_p != NULL)
4577 *overload_p = overload;
4578
4579 /* Check for cases such as x+y<<z which users are likely to
4580 misinterpret. But don't warn about obj << x + y, since that is a
4581 common idiom for I/O. */
4582 if (warn_parentheses
4583 && (complain & tf_warning)
4584 && !processing_template_decl
4585 && !error_operand_p (arg1)
4586 && !error_operand_p (arg2)
4587 && (code != LSHIFT_EXPR
4588 || !CLASS_TYPE_P (TREE_TYPE (arg1))))
4589 warn_about_parentheses (loc, code, arg1_code, orig_arg1,
4590 arg2_code, orig_arg2);
4591
4592 if (processing_template_decl && expr != error_mark_node)
4593 {
4594 if (overload != NULL_TREE)
4595 return (build_min_non_dep_op_overload
4596 (code, expr, overload, orig_arg1, orig_arg2));
4597
4598 return build_min_non_dep (code, expr, orig_arg1, orig_arg2);
4599 }
4600
4601 return expr;
4602 }
4603
4604 /* Build and return an ARRAY_REF expression. */
4605
4606 tree
build_x_array_ref(location_t loc,tree arg1,tree arg2,tsubst_flags_t complain)4607 build_x_array_ref (location_t loc, tree arg1, tree arg2,
4608 tsubst_flags_t complain)
4609 {
4610 tree orig_arg1 = arg1;
4611 tree orig_arg2 = arg2;
4612 tree expr;
4613 tree overload = NULL_TREE;
4614
4615 if (processing_template_decl)
4616 {
4617 if (type_dependent_expression_p (arg1)
4618 || type_dependent_expression_p (arg2))
4619 return build_min_nt_loc (loc, ARRAY_REF, arg1, arg2,
4620 NULL_TREE, NULL_TREE);
4621 arg1 = build_non_dependent_expr (arg1);
4622 arg2 = build_non_dependent_expr (arg2);
4623 }
4624
4625 expr = build_new_op (loc, ARRAY_REF, LOOKUP_NORMAL, arg1, arg2,
4626 NULL_TREE, NULL_TREE, &overload, complain);
4627
4628 if (processing_template_decl && expr != error_mark_node)
4629 {
4630 if (overload != NULL_TREE)
4631 return (build_min_non_dep_op_overload
4632 (ARRAY_REF, expr, overload, orig_arg1, orig_arg2));
4633
4634 return build_min_non_dep (ARRAY_REF, expr, orig_arg1, orig_arg2,
4635 NULL_TREE, NULL_TREE);
4636 }
4637 return expr;
4638 }
4639
4640 /* Return whether OP is an expression of enum type cast to integer
4641 type. In C++ even unsigned enum types are cast to signed integer
4642 types. We do not want to issue warnings about comparisons between
4643 signed and unsigned types when one of the types is an enum type.
4644 Those warnings are always false positives in practice. */
4645
4646 static bool
enum_cast_to_int(tree op)4647 enum_cast_to_int (tree op)
4648 {
4649 if (CONVERT_EXPR_P (op)
4650 && TREE_TYPE (op) == integer_type_node
4651 && TREE_CODE (TREE_TYPE (TREE_OPERAND (op, 0))) == ENUMERAL_TYPE
4652 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op, 0))))
4653 return true;
4654
4655 /* The cast may have been pushed into a COND_EXPR. */
4656 if (TREE_CODE (op) == COND_EXPR)
4657 return (enum_cast_to_int (TREE_OPERAND (op, 1))
4658 || enum_cast_to_int (TREE_OPERAND (op, 2)));
4659
4660 return false;
4661 }
4662
4663 /* For the c-common bits. */
4664 tree
build_binary_op(location_t location,enum tree_code code,tree op0,tree op1,bool)4665 build_binary_op (location_t location, enum tree_code code, tree op0, tree op1,
4666 bool /*convert_p*/)
4667 {
4668 return cp_build_binary_op (location, code, op0, op1, tf_warning_or_error);
4669 }
4670
4671 /* Build a vector comparison of ARG0 and ARG1 using CODE opcode
4672 into a value of TYPE type. Comparison is done via VEC_COND_EXPR. */
4673
4674 static tree
build_vec_cmp(tree_code code,tree type,tree arg0,tree arg1)4675 build_vec_cmp (tree_code code, tree type,
4676 tree arg0, tree arg1)
4677 {
4678 tree zero_vec = build_zero_cst (type);
4679 tree minus_one_vec = build_minus_one_cst (type);
4680 tree cmp_type = truth_type_for (type);
4681 tree cmp = build2 (code, cmp_type, arg0, arg1);
4682 return build3 (VEC_COND_EXPR, type, cmp, minus_one_vec, zero_vec);
4683 }
4684
4685 /* Possibly warn about an address never being NULL. */
4686
4687 static void
warn_for_null_address(location_t location,tree op,tsubst_flags_t complain)4688 warn_for_null_address (location_t location, tree op, tsubst_flags_t complain)
4689 {
4690 /* Prevent warnings issued for macro expansion. */
4691 if (!warn_address
4692 || (complain & tf_warning) == 0
4693 || c_inhibit_evaluation_warnings != 0
4694 || from_macro_expansion_at (location)
4695 || warning_suppressed_p (op, OPT_Waddress))
4696 return;
4697
4698 if (TREE_CODE (op) == NON_DEPENDENT_EXPR)
4699 op = TREE_OPERAND (op, 0);
4700
4701 tree cop = fold_for_warn (op);
4702
4703 if (TREE_CODE (cop) == NON_LVALUE_EXPR)
4704 /* Unwrap the expression for C++ 98. */
4705 cop = TREE_OPERAND (cop, 0);
4706
4707 if (TREE_CODE (cop) == PTRMEM_CST)
4708 {
4709 /* The address of a nonstatic data member is never null. */
4710 warning_at (location, OPT_Waddress,
4711 "the address %qE will never be NULL",
4712 cop);
4713 return;
4714 }
4715
4716 if (TREE_CODE (cop) == NOP_EXPR)
4717 {
4718 /* Allow casts to intptr_t to suppress the warning. */
4719 tree type = TREE_TYPE (cop);
4720 if (TREE_CODE (type) == INTEGER_TYPE)
4721 return;
4722
4723 STRIP_NOPS (cop);
4724 }
4725
4726 bool warned = false;
4727 if (TREE_CODE (cop) == ADDR_EXPR)
4728 {
4729 cop = TREE_OPERAND (cop, 0);
4730
4731 /* Set to true in the loop below if OP dereferences its operand.
4732 In such a case the ultimate target need not be a decl for
4733 the null [in]equality test to be necessarily constant. */
4734 bool deref = false;
4735
4736 /* Get the outermost array or object, or member. */
4737 while (handled_component_p (cop))
4738 {
4739 if (TREE_CODE (cop) == COMPONENT_REF)
4740 {
4741 /* Get the member (its address is never null). */
4742 cop = TREE_OPERAND (cop, 1);
4743 break;
4744 }
4745
4746 /* Get the outer array/object to refer to in the warning. */
4747 cop = TREE_OPERAND (cop, 0);
4748 deref = true;
4749 }
4750
4751 if ((!deref && !decl_with_nonnull_addr_p (cop))
4752 || from_macro_expansion_at (location)
4753 || warning_suppressed_p (cop, OPT_Waddress))
4754 return;
4755
4756 warned = warning_at (location, OPT_Waddress,
4757 "the address of %qD will never be NULL", cop);
4758 op = cop;
4759 }
4760 else if (TREE_CODE (cop) == POINTER_PLUS_EXPR)
4761 {
4762 /* Adding zero to the null pointer is well-defined in C++. When
4763 the offset is unknown (i.e., not a constant) warn anyway since
4764 it's less likely that the pointer operand is null than not. */
4765 tree off = TREE_OPERAND (cop, 1);
4766 if (!integer_zerop (off)
4767 && !warning_suppressed_p (cop, OPT_Waddress))
4768 warning_at (location, OPT_Waddress, "comparing the result of pointer "
4769 "addition %qE and NULL", cop);
4770 return;
4771 }
4772 else if (CONVERT_EXPR_P (op)
4773 && TYPE_REF_P (TREE_TYPE (TREE_OPERAND (op, 0))))
4774 {
4775 STRIP_NOPS (op);
4776
4777 if (TREE_CODE (op) == COMPONENT_REF)
4778 op = TREE_OPERAND (op, 1);
4779
4780 if (DECL_P (op))
4781 warned = warning_at (location, OPT_Waddress,
4782 "the compiler can assume that the address of "
4783 "%qD will never be NULL", op);
4784 }
4785
4786 if (warned && DECL_P (op))
4787 inform (DECL_SOURCE_LOCATION (op), "%qD declared here", op);
4788 }
4789
4790 /* Warn about [expr.arith.conv]/2: If one operand is of enumeration type and
4791 the other operand is of a different enumeration type or a floating-point
4792 type, this behavior is deprecated ([depr.arith.conv.enum]). CODE is the
4793 code of the binary operation, TYPE0 and TYPE1 are the types of the operands,
4794 and LOC is the location for the whole binary expression.
4795 TODO: Consider combining this with -Wenum-compare in build_new_op_1. */
4796
4797 static void
do_warn_enum_conversions(location_t loc,enum tree_code code,tree type0,tree type1)4798 do_warn_enum_conversions (location_t loc, enum tree_code code, tree type0,
4799 tree type1)
4800 {
4801 if (TREE_CODE (type0) == ENUMERAL_TYPE
4802 && TREE_CODE (type1) == ENUMERAL_TYPE
4803 && TYPE_MAIN_VARIANT (type0) != TYPE_MAIN_VARIANT (type1))
4804 {
4805 /* In C++20, -Wdeprecated-enum-enum-conversion is on by default.
4806 Otherwise, warn if -Wenum-conversion is on. */
4807 enum opt_code opt;
4808 if (warn_deprecated_enum_enum_conv)
4809 opt = OPT_Wdeprecated_enum_enum_conversion;
4810 else if (warn_enum_conversion)
4811 opt = OPT_Wenum_conversion;
4812 else
4813 return;
4814
4815 switch (code)
4816 {
4817 case GT_EXPR:
4818 case LT_EXPR:
4819 case GE_EXPR:
4820 case LE_EXPR:
4821 case EQ_EXPR:
4822 case NE_EXPR:
4823 /* Comparisons are handled by -Wenum-compare. */
4824 return;
4825 case SPACESHIP_EXPR:
4826 /* This is invalid, don't warn. */
4827 return;
4828 case BIT_AND_EXPR:
4829 case BIT_IOR_EXPR:
4830 case BIT_XOR_EXPR:
4831 warning_at (loc, opt, "bitwise operation between different "
4832 "enumeration types %qT and %qT is deprecated",
4833 type0, type1);
4834 return;
4835 default:
4836 warning_at (loc, opt, "arithmetic between different enumeration "
4837 "types %qT and %qT is deprecated", type0, type1);
4838 return;
4839 }
4840 }
4841 else if ((TREE_CODE (type0) == ENUMERAL_TYPE
4842 && TREE_CODE (type1) == REAL_TYPE)
4843 || (TREE_CODE (type0) == REAL_TYPE
4844 && TREE_CODE (type1) == ENUMERAL_TYPE))
4845 {
4846 const bool enum_first_p = TREE_CODE (type0) == ENUMERAL_TYPE;
4847 /* In C++20, -Wdeprecated-enum-float-conversion is on by default.
4848 Otherwise, warn if -Wenum-conversion is on. */
4849 enum opt_code opt;
4850 if (warn_deprecated_enum_float_conv)
4851 opt = OPT_Wdeprecated_enum_float_conversion;
4852 else if (warn_enum_conversion)
4853 opt = OPT_Wenum_conversion;
4854 else
4855 return;
4856
4857 switch (code)
4858 {
4859 case GT_EXPR:
4860 case LT_EXPR:
4861 case GE_EXPR:
4862 case LE_EXPR:
4863 case EQ_EXPR:
4864 case NE_EXPR:
4865 if (enum_first_p)
4866 warning_at (loc, opt, "comparison of enumeration type %qT with "
4867 "floating-point type %qT is deprecated",
4868 type0, type1);
4869 else
4870 warning_at (loc, opt, "comparison of floating-point type %qT "
4871 "with enumeration type %qT is deprecated",
4872 type0, type1);
4873 return;
4874 case SPACESHIP_EXPR:
4875 /* This is invalid, don't warn. */
4876 return;
4877 default:
4878 if (enum_first_p)
4879 warning_at (loc, opt, "arithmetic between enumeration type %qT "
4880 "and floating-point type %qT is deprecated",
4881 type0, type1);
4882 else
4883 warning_at (loc, opt, "arithmetic between floating-point type %qT "
4884 "and enumeration type %qT is deprecated",
4885 type0, type1);
4886 return;
4887 }
4888 }
4889 }
4890
4891 /* Build a binary-operation expression without default conversions.
4892 CODE is the kind of expression to build.
4893 LOCATION is the location_t of the operator in the source code.
4894 This function differs from `build' in several ways:
4895 the data type of the result is computed and recorded in it,
4896 warnings are generated if arg data types are invalid,
4897 special handling for addition and subtraction of pointers is known,
4898 and some optimization is done (operations on narrow ints
4899 are done in the narrower type when that gives the same result).
4900 Constant folding is also done before the result is returned.
4901
4902 Note that the operands will never have enumeral types
4903 because either they have just had the default conversions performed
4904 or they have both just been converted to some other type in which
4905 the arithmetic is to be done.
4906
4907 C++: must do special pointer arithmetic when implementing
4908 multiple inheritance, and deal with pointer to member functions. */
4909
4910 tree
cp_build_binary_op(const op_location_t & location,enum tree_code code,tree orig_op0,tree orig_op1,tsubst_flags_t complain)4911 cp_build_binary_op (const op_location_t &location,
4912 enum tree_code code, tree orig_op0, tree orig_op1,
4913 tsubst_flags_t complain)
4914 {
4915 tree op0, op1;
4916 enum tree_code code0, code1;
4917 tree type0, type1;
4918 const char *invalid_op_diag;
4919
4920 /* Expression code to give to the expression when it is built.
4921 Normally this is CODE, which is what the caller asked for,
4922 but in some special cases we change it. */
4923 enum tree_code resultcode = code;
4924
4925 /* Data type in which the computation is to be performed.
4926 In the simplest cases this is the common type of the arguments. */
4927 tree result_type = NULL_TREE;
4928
4929 /* Nonzero means operands have already been type-converted
4930 in whatever way is necessary.
4931 Zero means they need to be converted to RESULT_TYPE. */
4932 int converted = 0;
4933
4934 /* Nonzero means create the expression with this type, rather than
4935 RESULT_TYPE. */
4936 tree build_type = 0;
4937
4938 /* Nonzero means after finally constructing the expression
4939 convert it to this type. */
4940 tree final_type = 0;
4941
4942 tree result;
4943
4944 /* Nonzero if this is an operation like MIN or MAX which can
4945 safely be computed in short if both args are promoted shorts.
4946 Also implies COMMON.
4947 -1 indicates a bitwise operation; this makes a difference
4948 in the exact conditions for when it is safe to do the operation
4949 in a narrower mode. */
4950 int shorten = 0;
4951
4952 /* Nonzero if this is a comparison operation;
4953 if both args are promoted shorts, compare the original shorts.
4954 Also implies COMMON. */
4955 int short_compare = 0;
4956
4957 /* Nonzero if this is a right-shift operation, which can be computed on the
4958 original short and then promoted if the operand is a promoted short. */
4959 int short_shift = 0;
4960
4961 /* Nonzero means set RESULT_TYPE to the common type of the args. */
4962 int common = 0;
4963
4964 /* True if both operands have arithmetic type. */
4965 bool arithmetic_types_p;
4966
4967 /* Remember whether we're doing / or %. */
4968 bool doing_div_or_mod = false;
4969
4970 /* Remember whether we're doing << or >>. */
4971 bool doing_shift = false;
4972
4973 /* Tree holding instrumentation expression. */
4974 tree instrument_expr = NULL_TREE;
4975
4976 /* Apply default conversions. */
4977 op0 = resolve_nondeduced_context (orig_op0, complain);
4978 op1 = resolve_nondeduced_context (orig_op1, complain);
4979
4980 if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
4981 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
4982 || code == TRUTH_XOR_EXPR)
4983 {
4984 if (!really_overloaded_fn (op0) && !VOID_TYPE_P (TREE_TYPE (op0)))
4985 op0 = decay_conversion (op0, complain);
4986 if (!really_overloaded_fn (op1) && !VOID_TYPE_P (TREE_TYPE (op1)))
4987 op1 = decay_conversion (op1, complain);
4988 }
4989 else
4990 {
4991 if (!really_overloaded_fn (op0) && !VOID_TYPE_P (TREE_TYPE (op0)))
4992 op0 = cp_default_conversion (op0, complain);
4993 if (!really_overloaded_fn (op1) && !VOID_TYPE_P (TREE_TYPE (op1)))
4994 op1 = cp_default_conversion (op1, complain);
4995 }
4996
4997 /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue. */
4998 STRIP_TYPE_NOPS (op0);
4999 STRIP_TYPE_NOPS (op1);
5000
5001 /* DTRT if one side is an overloaded function, but complain about it. */
5002 if (type_unknown_p (op0))
5003 {
5004 tree t = instantiate_type (TREE_TYPE (op1), op0, tf_none);
5005 if (t != error_mark_node)
5006 {
5007 if (complain & tf_error)
5008 permerror (location,
5009 "assuming cast to type %qT from overloaded function",
5010 TREE_TYPE (t));
5011 op0 = t;
5012 }
5013 }
5014 if (type_unknown_p (op1))
5015 {
5016 tree t = instantiate_type (TREE_TYPE (op0), op1, tf_none);
5017 if (t != error_mark_node)
5018 {
5019 if (complain & tf_error)
5020 permerror (location,
5021 "assuming cast to type %qT from overloaded function",
5022 TREE_TYPE (t));
5023 op1 = t;
5024 }
5025 }
5026
5027 type0 = TREE_TYPE (op0);
5028 type1 = TREE_TYPE (op1);
5029
5030 /* The expression codes of the data types of the arguments tell us
5031 whether the arguments are integers, floating, pointers, etc. */
5032 code0 = TREE_CODE (type0);
5033 code1 = TREE_CODE (type1);
5034
5035 /* If an error was already reported for one of the arguments,
5036 avoid reporting another error. */
5037 if (code0 == ERROR_MARK || code1 == ERROR_MARK)
5038 return error_mark_node;
5039
5040 if ((invalid_op_diag
5041 = targetm.invalid_binary_op (code, type0, type1)))
5042 {
5043 if (complain & tf_error)
5044 error (invalid_op_diag);
5045 return error_mark_node;
5046 }
5047
5048 /* Issue warnings about peculiar, but valid, uses of NULL. */
5049 if ((null_node_p (orig_op0) || null_node_p (orig_op1))
5050 /* It's reasonable to use pointer values as operands of &&
5051 and ||, so NULL is no exception. */
5052 && code != TRUTH_ANDIF_EXPR && code != TRUTH_ORIF_EXPR
5053 && ( /* Both are NULL (or 0) and the operation was not a
5054 comparison or a pointer subtraction. */
5055 (null_ptr_cst_p (orig_op0) && null_ptr_cst_p (orig_op1)
5056 && code != EQ_EXPR && code != NE_EXPR && code != MINUS_EXPR)
5057 /* Or if one of OP0 or OP1 is neither a pointer nor NULL. */
5058 || (!null_ptr_cst_p (orig_op0)
5059 && !TYPE_PTR_OR_PTRMEM_P (type0))
5060 || (!null_ptr_cst_p (orig_op1)
5061 && !TYPE_PTR_OR_PTRMEM_P (type1)))
5062 && (complain & tf_warning))
5063 {
5064 location_t loc =
5065 expansion_point_location_if_in_system_header (input_location);
5066
5067 warning_at (loc, OPT_Wpointer_arith, "NULL used in arithmetic");
5068 }
5069
5070 /* In case when one of the operands of the binary operation is
5071 a vector and another is a scalar -- convert scalar to vector. */
5072 if ((gnu_vector_type_p (type0) && code1 != VECTOR_TYPE)
5073 || (gnu_vector_type_p (type1) && code0 != VECTOR_TYPE))
5074 {
5075 enum stv_conv convert_flag = scalar_to_vector (location, code, op0, op1,
5076 complain & tf_error);
5077
5078 switch (convert_flag)
5079 {
5080 case stv_error:
5081 return error_mark_node;
5082 case stv_firstarg:
5083 {
5084 op0 = convert (TREE_TYPE (type1), op0);
5085 op0 = save_expr (op0);
5086 op0 = build_vector_from_val (type1, op0);
5087 type0 = TREE_TYPE (op0);
5088 code0 = TREE_CODE (type0);
5089 converted = 1;
5090 break;
5091 }
5092 case stv_secondarg:
5093 {
5094 op1 = convert (TREE_TYPE (type0), op1);
5095 op1 = save_expr (op1);
5096 op1 = build_vector_from_val (type0, op1);
5097 type1 = TREE_TYPE (op1);
5098 code1 = TREE_CODE (type1);
5099 converted = 1;
5100 break;
5101 }
5102 default:
5103 break;
5104 }
5105 }
5106
5107 switch (code)
5108 {
5109 case MINUS_EXPR:
5110 /* Subtraction of two similar pointers.
5111 We must subtract them as integers, then divide by object size. */
5112 if (code0 == POINTER_TYPE && code1 == POINTER_TYPE
5113 && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type0),
5114 TREE_TYPE (type1)))
5115 {
5116 result = pointer_diff (location, op0, op1,
5117 common_pointer_type (type0, type1), complain,
5118 &instrument_expr);
5119 if (instrument_expr != NULL)
5120 result = build2 (COMPOUND_EXPR, TREE_TYPE (result),
5121 instrument_expr, result);
5122
5123 return result;
5124 }
5125 /* In all other cases except pointer - int, the usual arithmetic
5126 rules apply. */
5127 else if (!(code0 == POINTER_TYPE && code1 == INTEGER_TYPE))
5128 {
5129 common = 1;
5130 break;
5131 }
5132 /* The pointer - int case is just like pointer + int; fall
5133 through. */
5134 gcc_fallthrough ();
5135 case PLUS_EXPR:
5136 if ((code0 == POINTER_TYPE || code1 == POINTER_TYPE)
5137 && (code0 == INTEGER_TYPE || code1 == INTEGER_TYPE))
5138 {
5139 tree ptr_operand;
5140 tree int_operand;
5141 ptr_operand = ((code0 == POINTER_TYPE) ? op0 : op1);
5142 int_operand = ((code0 == INTEGER_TYPE) ? op0 : op1);
5143 if (processing_template_decl)
5144 {
5145 result_type = TREE_TYPE (ptr_operand);
5146 break;
5147 }
5148 return cp_pointer_int_sum (location, code,
5149 ptr_operand,
5150 int_operand,
5151 complain);
5152 }
5153 common = 1;
5154 break;
5155
5156 case MULT_EXPR:
5157 common = 1;
5158 break;
5159
5160 case TRUNC_DIV_EXPR:
5161 case CEIL_DIV_EXPR:
5162 case FLOOR_DIV_EXPR:
5163 case ROUND_DIV_EXPR:
5164 case EXACT_DIV_EXPR:
5165 if (TREE_CODE (op0) == SIZEOF_EXPR && TREE_CODE (op1) == SIZEOF_EXPR)
5166 {
5167 tree type0 = TREE_OPERAND (op0, 0);
5168 tree type1 = TREE_OPERAND (op1, 0);
5169 tree first_arg = tree_strip_any_location_wrapper (type0);
5170 if (!TYPE_P (type0))
5171 type0 = TREE_TYPE (type0);
5172 if (!TYPE_P (type1))
5173 type1 = TREE_TYPE (type1);
5174 if (INDIRECT_TYPE_P (type0) && same_type_p (TREE_TYPE (type0), type1))
5175 {
5176 if (!(TREE_CODE (first_arg) == PARM_DECL
5177 && DECL_ARRAY_PARAMETER_P (first_arg)
5178 && warn_sizeof_array_argument)
5179 && (complain & tf_warning))
5180 {
5181 auto_diagnostic_group d;
5182 if (warning_at (location, OPT_Wsizeof_pointer_div,
5183 "division %<sizeof (%T) / sizeof (%T)%> does "
5184 "not compute the number of array elements",
5185 type0, type1))
5186 if (DECL_P (first_arg))
5187 inform (DECL_SOURCE_LOCATION (first_arg),
5188 "first %<sizeof%> operand was declared here");
5189 }
5190 }
5191 else if (TREE_CODE (type0) == ARRAY_TYPE
5192 && !char_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (type0)))
5193 /* Set by finish_parenthesized_expr. */
5194 && !warning_suppressed_p (op1, OPT_Wsizeof_array_div)
5195 && (complain & tf_warning))
5196 maybe_warn_sizeof_array_div (location, first_arg, type0,
5197 op1, non_reference (type1));
5198 }
5199
5200 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
5201 || code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
5202 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
5203 || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
5204 {
5205 enum tree_code tcode0 = code0, tcode1 = code1;
5206 doing_div_or_mod = true;
5207 warn_for_div_by_zero (location, fold_for_warn (op1));
5208
5209 if (tcode0 == COMPLEX_TYPE || tcode0 == VECTOR_TYPE)
5210 tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
5211 if (tcode1 == COMPLEX_TYPE || tcode1 == VECTOR_TYPE)
5212 tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
5213
5214 if (!(tcode0 == INTEGER_TYPE && tcode1 == INTEGER_TYPE))
5215 resultcode = RDIV_EXPR;
5216 else
5217 {
5218 /* When dividing two signed integers, we have to promote to int.
5219 unless we divide by a constant != -1. Note that default
5220 conversion will have been performed on the operands at this
5221 point, so we have to dig out the original type to find out if
5222 it was unsigned. */
5223 tree stripped_op1 = tree_strip_any_location_wrapper (op1);
5224 shorten = ((TREE_CODE (op0) == NOP_EXPR
5225 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0,
5226 0)))
5227 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0)))
5228 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0,
5229 0)))
5230 < TYPE_PRECISION (type0)))
5231 || (TREE_CODE (stripped_op1) == INTEGER_CST
5232 && ! integer_all_onesp (stripped_op1)));
5233 }
5234
5235 common = 1;
5236 }
5237 break;
5238
5239 case BIT_AND_EXPR:
5240 case BIT_IOR_EXPR:
5241 case BIT_XOR_EXPR:
5242 if ((code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
5243 || (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
5244 && !VECTOR_FLOAT_TYPE_P (type0)
5245 && !VECTOR_FLOAT_TYPE_P (type1)))
5246 shorten = -1;
5247 break;
5248
5249 case TRUNC_MOD_EXPR:
5250 case FLOOR_MOD_EXPR:
5251 doing_div_or_mod = true;
5252 warn_for_div_by_zero (location, fold_for_warn (op1));
5253
5254 if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
5255 && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
5256 && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE)
5257 common = 1;
5258 else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
5259 {
5260 /* Although it would be tempting to shorten always here, that loses
5261 on some targets, since the modulo instruction is undefined if the
5262 quotient can't be represented in the computation mode. We shorten
5263 only if unsigned or if dividing by something we know != -1. */
5264 tree stripped_op1 = tree_strip_any_location_wrapper (op1);
5265 shorten = ((TREE_CODE (op0) == NOP_EXPR
5266 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0)))
5267 && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0)))
5268 && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0)))
5269 < TYPE_PRECISION (type0)))
5270 || (TREE_CODE (stripped_op1) == INTEGER_CST
5271 && ! integer_all_onesp (stripped_op1)));
5272 common = 1;
5273 }
5274 break;
5275
5276 case TRUTH_ANDIF_EXPR:
5277 case TRUTH_ORIF_EXPR:
5278 case TRUTH_AND_EXPR:
5279 case TRUTH_OR_EXPR:
5280 if (!VECTOR_TYPE_P (type0) && gnu_vector_type_p (type1))
5281 {
5282 if (!COMPARISON_CLASS_P (op1))
5283 op1 = cp_build_binary_op (EXPR_LOCATION (op1), NE_EXPR, op1,
5284 build_zero_cst (type1), complain);
5285 if (code == TRUTH_ANDIF_EXPR)
5286 {
5287 tree z = build_zero_cst (TREE_TYPE (op1));
5288 return build_conditional_expr (location, op0, op1, z, complain);
5289 }
5290 else if (code == TRUTH_ORIF_EXPR)
5291 {
5292 tree m1 = build_all_ones_cst (TREE_TYPE (op1));
5293 return build_conditional_expr (location, op0, m1, op1, complain);
5294 }
5295 else
5296 gcc_unreachable ();
5297 }
5298 if (gnu_vector_type_p (type0)
5299 && (!VECTOR_TYPE_P (type1) || gnu_vector_type_p (type1)))
5300 {
5301 if (!COMPARISON_CLASS_P (op0))
5302 op0 = cp_build_binary_op (EXPR_LOCATION (op0), NE_EXPR, op0,
5303 build_zero_cst (type0), complain);
5304 if (!VECTOR_TYPE_P (type1))
5305 {
5306 tree m1 = build_all_ones_cst (TREE_TYPE (op0));
5307 tree z = build_zero_cst (TREE_TYPE (op0));
5308 op1 = build_conditional_expr (location, op1, m1, z, complain);
5309 }
5310 else if (!COMPARISON_CLASS_P (op1))
5311 op1 = cp_build_binary_op (EXPR_LOCATION (op1), NE_EXPR, op1,
5312 build_zero_cst (type1), complain);
5313
5314 if (code == TRUTH_ANDIF_EXPR)
5315 code = BIT_AND_EXPR;
5316 else if (code == TRUTH_ORIF_EXPR)
5317 code = BIT_IOR_EXPR;
5318 else
5319 gcc_unreachable ();
5320
5321 return cp_build_binary_op (location, code, op0, op1, complain);
5322 }
5323
5324 result_type = boolean_type_node;
5325 break;
5326
5327 /* Shift operations: result has same type as first operand;
5328 always convert second operand to int.
5329 Also set SHORT_SHIFT if shifting rightward. */
5330
5331 case RSHIFT_EXPR:
5332 if (gnu_vector_type_p (type0)
5333 && code1 == INTEGER_TYPE
5334 && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE)
5335 {
5336 result_type = type0;
5337 converted = 1;
5338 }
5339 else if (gnu_vector_type_p (type0)
5340 && gnu_vector_type_p (type1)
5341 && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
5342 && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
5343 && known_eq (TYPE_VECTOR_SUBPARTS (type0),
5344 TYPE_VECTOR_SUBPARTS (type1)))
5345 {
5346 result_type = type0;
5347 converted = 1;
5348 }
5349 else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
5350 {
5351 tree const_op1 = fold_for_warn (op1);
5352 if (TREE_CODE (const_op1) != INTEGER_CST)
5353 const_op1 = op1;
5354 result_type = type0;
5355 doing_shift = true;
5356 if (TREE_CODE (const_op1) == INTEGER_CST)
5357 {
5358 if (tree_int_cst_lt (const_op1, integer_zero_node))
5359 {
5360 if ((complain & tf_warning)
5361 && c_inhibit_evaluation_warnings == 0)
5362 warning_at (location, OPT_Wshift_count_negative,
5363 "right shift count is negative");
5364 }
5365 else
5366 {
5367 if (!integer_zerop (const_op1))
5368 short_shift = 1;
5369
5370 if (compare_tree_int (const_op1, TYPE_PRECISION (type0)) >= 0
5371 && (complain & tf_warning)
5372 && c_inhibit_evaluation_warnings == 0)
5373 warning_at (location, OPT_Wshift_count_overflow,
5374 "right shift count >= width of type");
5375 }
5376 }
5377 /* Avoid converting op1 to result_type later. */
5378 converted = 1;
5379 }
5380 break;
5381
5382 case LSHIFT_EXPR:
5383 if (gnu_vector_type_p (type0)
5384 && code1 == INTEGER_TYPE
5385 && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE)
5386 {
5387 result_type = type0;
5388 converted = 1;
5389 }
5390 else if (gnu_vector_type_p (type0)
5391 && gnu_vector_type_p (type1)
5392 && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
5393 && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
5394 && known_eq (TYPE_VECTOR_SUBPARTS (type0),
5395 TYPE_VECTOR_SUBPARTS (type1)))
5396 {
5397 result_type = type0;
5398 converted = 1;
5399 }
5400 else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
5401 {
5402 tree const_op0 = fold_for_warn (op0);
5403 if (TREE_CODE (const_op0) != INTEGER_CST)
5404 const_op0 = op0;
5405 tree const_op1 = fold_for_warn (op1);
5406 if (TREE_CODE (const_op1) != INTEGER_CST)
5407 const_op1 = op1;
5408 result_type = type0;
5409 doing_shift = true;
5410 if (TREE_CODE (const_op0) == INTEGER_CST
5411 && tree_int_cst_sgn (const_op0) < 0
5412 && !TYPE_OVERFLOW_WRAPS (type0)
5413 && (complain & tf_warning)
5414 && c_inhibit_evaluation_warnings == 0)
5415 warning_at (location, OPT_Wshift_negative_value,
5416 "left shift of negative value");
5417 if (TREE_CODE (const_op1) == INTEGER_CST)
5418 {
5419 if (tree_int_cst_lt (const_op1, integer_zero_node))
5420 {
5421 if ((complain & tf_warning)
5422 && c_inhibit_evaluation_warnings == 0)
5423 warning_at (location, OPT_Wshift_count_negative,
5424 "left shift count is negative");
5425 }
5426 else if (compare_tree_int (const_op1,
5427 TYPE_PRECISION (type0)) >= 0)
5428 {
5429 if ((complain & tf_warning)
5430 && c_inhibit_evaluation_warnings == 0)
5431 warning_at (location, OPT_Wshift_count_overflow,
5432 "left shift count >= width of type");
5433 }
5434 else if (TREE_CODE (const_op0) == INTEGER_CST
5435 && (complain & tf_warning))
5436 maybe_warn_shift_overflow (location, const_op0, const_op1);
5437 }
5438 /* Avoid converting op1 to result_type later. */
5439 converted = 1;
5440 }
5441 break;
5442
5443 case EQ_EXPR:
5444 case NE_EXPR:
5445 if (gnu_vector_type_p (type0) && gnu_vector_type_p (type1))
5446 goto vector_compare;
5447 if ((complain & tf_warning)
5448 && c_inhibit_evaluation_warnings == 0
5449 && (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1)))
5450 warning_at (location, OPT_Wfloat_equal,
5451 "comparing floating-point with %<==%> "
5452 "or %<!=%> is unsafe");
5453 if (complain & tf_warning)
5454 {
5455 tree stripped_orig_op0 = tree_strip_any_location_wrapper (orig_op0);
5456 tree stripped_orig_op1 = tree_strip_any_location_wrapper (orig_op1);
5457 if ((TREE_CODE (stripped_orig_op0) == STRING_CST
5458 && !integer_zerop (cp_fully_fold (op1)))
5459 || (TREE_CODE (stripped_orig_op1) == STRING_CST
5460 && !integer_zerop (cp_fully_fold (op0))))
5461 warning_at (location, OPT_Waddress,
5462 "comparison with string literal results in "
5463 "unspecified behavior");
5464 else if (warn_array_compare
5465 && TREE_CODE (TREE_TYPE (orig_op0)) == ARRAY_TYPE
5466 && TREE_CODE (TREE_TYPE (orig_op1)) == ARRAY_TYPE)
5467 do_warn_array_compare (location, code, stripped_orig_op0,
5468 stripped_orig_op1);
5469 }
5470
5471 build_type = boolean_type_node;
5472 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
5473 || code0 == COMPLEX_TYPE || code0 == ENUMERAL_TYPE)
5474 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
5475 || code1 == COMPLEX_TYPE || code1 == ENUMERAL_TYPE))
5476 short_compare = 1;
5477 else if (((code0 == POINTER_TYPE || TYPE_PTRDATAMEM_P (type0))
5478 && null_ptr_cst_p (orig_op1))
5479 /* Handle, eg, (void*)0 (c++/43906), and more. */
5480 || (code0 == POINTER_TYPE
5481 && TYPE_PTR_P (type1) && integer_zerop (op1)))
5482 {
5483 if (TYPE_PTR_P (type1))
5484 result_type = composite_pointer_type (location,
5485 type0, type1, op0, op1,
5486 CPO_COMPARISON, complain);
5487 else
5488 result_type = type0;
5489
5490 if (char_type_p (TREE_TYPE (orig_op1)))
5491 {
5492 auto_diagnostic_group d;
5493 if (warning_at (location, OPT_Wpointer_compare,
5494 "comparison between pointer and zero character "
5495 "constant"))
5496 inform (location,
5497 "did you mean to dereference the pointer?");
5498 }
5499 warn_for_null_address (location, op0, complain);
5500 }
5501 else if (((code1 == POINTER_TYPE || TYPE_PTRDATAMEM_P (type1))
5502 && null_ptr_cst_p (orig_op0))
5503 /* Handle, eg, (void*)0 (c++/43906), and more. */
5504 || (code1 == POINTER_TYPE
5505 && TYPE_PTR_P (type0) && integer_zerop (op0)))
5506 {
5507 if (TYPE_PTR_P (type0))
5508 result_type = composite_pointer_type (location,
5509 type0, type1, op0, op1,
5510 CPO_COMPARISON, complain);
5511 else
5512 result_type = type1;
5513
5514 if (char_type_p (TREE_TYPE (orig_op0)))
5515 {
5516 auto_diagnostic_group d;
5517 if (warning_at (location, OPT_Wpointer_compare,
5518 "comparison between pointer and zero character "
5519 "constant"))
5520 inform (location,
5521 "did you mean to dereference the pointer?");
5522 }
5523 warn_for_null_address (location, op1, complain);
5524 }
5525 else if ((code0 == POINTER_TYPE && code1 == POINTER_TYPE)
5526 || (TYPE_PTRDATAMEM_P (type0) && TYPE_PTRDATAMEM_P (type1)))
5527 result_type = composite_pointer_type (location,
5528 type0, type1, op0, op1,
5529 CPO_COMPARISON, complain);
5530 else if (null_ptr_cst_p (orig_op0) && null_ptr_cst_p (orig_op1))
5531 /* One of the operands must be of nullptr_t type. */
5532 result_type = TREE_TYPE (nullptr_node);
5533 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
5534 {
5535 result_type = type0;
5536 if (complain & tf_error)
5537 permerror (location, "ISO C++ forbids comparison between "
5538 "pointer and integer");
5539 else
5540 return error_mark_node;
5541 }
5542 else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
5543 {
5544 result_type = type1;
5545 if (complain & tf_error)
5546 permerror (location, "ISO C++ forbids comparison between "
5547 "pointer and integer");
5548 else
5549 return error_mark_node;
5550 }
5551 else if (TYPE_PTRMEMFUNC_P (type0) && null_ptr_cst_p (orig_op1))
5552 {
5553 if (TARGET_PTRMEMFUNC_VBIT_LOCATION
5554 == ptrmemfunc_vbit_in_delta)
5555 {
5556 tree pfn0, delta0, e1, e2;
5557
5558 if (TREE_SIDE_EFFECTS (op0))
5559 op0 = cp_save_expr (op0);
5560
5561 pfn0 = pfn_from_ptrmemfunc (op0);
5562 delta0 = delta_from_ptrmemfunc (op0);
5563 e1 = cp_build_binary_op (location,
5564 EQ_EXPR,
5565 pfn0,
5566 build_zero_cst (TREE_TYPE (pfn0)),
5567 complain);
5568 e2 = cp_build_binary_op (location,
5569 BIT_AND_EXPR,
5570 delta0,
5571 integer_one_node,
5572 complain);
5573
5574 if (complain & tf_warning)
5575 maybe_warn_zero_as_null_pointer_constant (op1, input_location);
5576
5577 e2 = cp_build_binary_op (location,
5578 EQ_EXPR, e2, integer_zero_node,
5579 complain);
5580 op0 = cp_build_binary_op (location,
5581 TRUTH_ANDIF_EXPR, e1, e2,
5582 complain);
5583 op1 = cp_convert (TREE_TYPE (op0), integer_one_node, complain);
5584 }
5585 else
5586 {
5587 op0 = build_ptrmemfunc_access_expr (op0, pfn_identifier);
5588 op1 = cp_convert (TREE_TYPE (op0), op1, complain);
5589 }
5590 result_type = TREE_TYPE (op0);
5591
5592 warn_for_null_address (location, orig_op0, complain);
5593 }
5594 else if (TYPE_PTRMEMFUNC_P (type1) && null_ptr_cst_p (orig_op0))
5595 return cp_build_binary_op (location, code, op1, op0, complain);
5596 else if (TYPE_PTRMEMFUNC_P (type0) && TYPE_PTRMEMFUNC_P (type1))
5597 {
5598 tree type;
5599 /* E will be the final comparison. */
5600 tree e;
5601 /* E1 and E2 are for scratch. */
5602 tree e1;
5603 tree e2;
5604 tree pfn0;
5605 tree pfn1;
5606 tree delta0;
5607 tree delta1;
5608
5609 type = composite_pointer_type (location, type0, type1, op0, op1,
5610 CPO_COMPARISON, complain);
5611
5612 if (!same_type_p (TREE_TYPE (op0), type))
5613 op0 = cp_convert_and_check (type, op0, complain);
5614 if (!same_type_p (TREE_TYPE (op1), type))
5615 op1 = cp_convert_and_check (type, op1, complain);
5616
5617 if (op0 == error_mark_node || op1 == error_mark_node)
5618 return error_mark_node;
5619
5620 if (TREE_SIDE_EFFECTS (op0))
5621 op0 = save_expr (op0);
5622 if (TREE_SIDE_EFFECTS (op1))
5623 op1 = save_expr (op1);
5624
5625 pfn0 = pfn_from_ptrmemfunc (op0);
5626 pfn0 = cp_fully_fold (pfn0);
5627 /* Avoid -Waddress warnings (c++/64877). */
5628 if (TREE_CODE (pfn0) == ADDR_EXPR)
5629 suppress_warning (pfn0, OPT_Waddress);
5630 pfn1 = pfn_from_ptrmemfunc (op1);
5631 pfn1 = cp_fully_fold (pfn1);
5632 delta0 = delta_from_ptrmemfunc (op0);
5633 delta1 = delta_from_ptrmemfunc (op1);
5634 if (TARGET_PTRMEMFUNC_VBIT_LOCATION
5635 == ptrmemfunc_vbit_in_delta)
5636 {
5637 /* We generate:
5638
5639 (op0.pfn == op1.pfn
5640 && ((op0.delta == op1.delta)
5641 || (!op0.pfn && op0.delta & 1 == 0
5642 && op1.delta & 1 == 0))
5643
5644 The reason for the `!op0.pfn' bit is that a NULL
5645 pointer-to-member is any member with a zero PFN and
5646 LSB of the DELTA field is 0. */
5647
5648 e1 = cp_build_binary_op (location, BIT_AND_EXPR,
5649 delta0,
5650 integer_one_node,
5651 complain);
5652 e1 = cp_build_binary_op (location,
5653 EQ_EXPR, e1, integer_zero_node,
5654 complain);
5655 e2 = cp_build_binary_op (location, BIT_AND_EXPR,
5656 delta1,
5657 integer_one_node,
5658 complain);
5659 e2 = cp_build_binary_op (location,
5660 EQ_EXPR, e2, integer_zero_node,
5661 complain);
5662 e1 = cp_build_binary_op (location,
5663 TRUTH_ANDIF_EXPR, e2, e1,
5664 complain);
5665 e2 = cp_build_binary_op (location, EQ_EXPR,
5666 pfn0,
5667 build_zero_cst (TREE_TYPE (pfn0)),
5668 complain);
5669 e2 = cp_build_binary_op (location,
5670 TRUTH_ANDIF_EXPR, e2, e1, complain);
5671 e1 = cp_build_binary_op (location,
5672 EQ_EXPR, delta0, delta1, complain);
5673 e1 = cp_build_binary_op (location,
5674 TRUTH_ORIF_EXPR, e1, e2, complain);
5675 }
5676 else
5677 {
5678 /* We generate:
5679
5680 (op0.pfn == op1.pfn
5681 && (!op0.pfn || op0.delta == op1.delta))
5682
5683 The reason for the `!op0.pfn' bit is that a NULL
5684 pointer-to-member is any member with a zero PFN; the
5685 DELTA field is unspecified. */
5686
5687 e1 = cp_build_binary_op (location,
5688 EQ_EXPR, delta0, delta1, complain);
5689 e2 = cp_build_binary_op (location,
5690 EQ_EXPR,
5691 pfn0,
5692 build_zero_cst (TREE_TYPE (pfn0)),
5693 complain);
5694 e1 = cp_build_binary_op (location,
5695 TRUTH_ORIF_EXPR, e1, e2, complain);
5696 }
5697 e2 = build2 (EQ_EXPR, boolean_type_node, pfn0, pfn1);
5698 e = cp_build_binary_op (location,
5699 TRUTH_ANDIF_EXPR, e2, e1, complain);
5700 if (code == EQ_EXPR)
5701 return e;
5702 return cp_build_binary_op (location,
5703 EQ_EXPR, e, integer_zero_node, complain);
5704 }
5705 else
5706 {
5707 gcc_assert (!TYPE_PTRMEMFUNC_P (type0)
5708 || !same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type0),
5709 type1));
5710 gcc_assert (!TYPE_PTRMEMFUNC_P (type1)
5711 || !same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type1),
5712 type0));
5713 }
5714
5715 break;
5716
5717 case MAX_EXPR:
5718 case MIN_EXPR:
5719 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
5720 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
5721 shorten = 1;
5722 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
5723 result_type = composite_pointer_type (location,
5724 type0, type1, op0, op1,
5725 CPO_COMPARISON, complain);
5726 break;
5727
5728 case LE_EXPR:
5729 case GE_EXPR:
5730 case LT_EXPR:
5731 case GT_EXPR:
5732 case SPACESHIP_EXPR:
5733 if (TREE_CODE (orig_op0) == STRING_CST
5734 || TREE_CODE (orig_op1) == STRING_CST)
5735 {
5736 if (complain & tf_warning)
5737 warning_at (location, OPT_Waddress,
5738 "comparison with string literal results "
5739 "in unspecified behavior");
5740 }
5741 else if (warn_array_compare
5742 && TREE_CODE (TREE_TYPE (orig_op0)) == ARRAY_TYPE
5743 && TREE_CODE (TREE_TYPE (orig_op1)) == ARRAY_TYPE
5744 && code != SPACESHIP_EXPR
5745 && (complain & tf_warning))
5746 do_warn_array_compare (location, code,
5747 tree_strip_any_location_wrapper (orig_op0),
5748 tree_strip_any_location_wrapper (orig_op1));
5749
5750 if (gnu_vector_type_p (type0) && gnu_vector_type_p (type1))
5751 {
5752 vector_compare:
5753 tree intt;
5754 if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type0),
5755 TREE_TYPE (type1))
5756 && !vector_types_compatible_elements_p (type0, type1))
5757 {
5758 if (complain & tf_error)
5759 {
5760 error_at (location, "comparing vectors with different "
5761 "element types");
5762 inform (location, "operand types are %qT and %qT",
5763 type0, type1);
5764 }
5765 return error_mark_node;
5766 }
5767
5768 if (maybe_ne (TYPE_VECTOR_SUBPARTS (type0),
5769 TYPE_VECTOR_SUBPARTS (type1)))
5770 {
5771 if (complain & tf_error)
5772 {
5773 error_at (location, "comparing vectors with different "
5774 "number of elements");
5775 inform (location, "operand types are %qT and %qT",
5776 type0, type1);
5777 }
5778 return error_mark_node;
5779 }
5780
5781 /* It's not precisely specified how the usual arithmetic
5782 conversions apply to the vector types. Here, we use
5783 the unsigned type if one of the operands is signed and
5784 the other one is unsigned. */
5785 if (TYPE_UNSIGNED (type0) != TYPE_UNSIGNED (type1))
5786 {
5787 if (!TYPE_UNSIGNED (type0))
5788 op0 = build1 (VIEW_CONVERT_EXPR, type1, op0);
5789 else
5790 op1 = build1 (VIEW_CONVERT_EXPR, type0, op1);
5791 warning_at (location, OPT_Wsign_compare, "comparison between "
5792 "types %qT and %qT", type0, type1);
5793 }
5794
5795 if (resultcode == SPACESHIP_EXPR)
5796 {
5797 if (complain & tf_error)
5798 sorry_at (location, "three-way comparison of vectors");
5799 return error_mark_node;
5800 }
5801
5802 /* Always construct signed integer vector type. */
5803 intt = c_common_type_for_size
5804 (GET_MODE_BITSIZE (SCALAR_TYPE_MODE (TREE_TYPE (type0))), 0);
5805 if (!intt)
5806 {
5807 if (complain & tf_error)
5808 error_at (location, "could not find an integer type "
5809 "of the same size as %qT", TREE_TYPE (type0));
5810 return error_mark_node;
5811 }
5812 result_type = build_opaque_vector_type (intt,
5813 TYPE_VECTOR_SUBPARTS (type0));
5814 return build_vec_cmp (resultcode, result_type, op0, op1);
5815 }
5816 build_type = boolean_type_node;
5817 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
5818 || code0 == ENUMERAL_TYPE)
5819 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
5820 || code1 == ENUMERAL_TYPE))
5821 short_compare = 1;
5822 else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
5823 result_type = composite_pointer_type (location,
5824 type0, type1, op0, op1,
5825 CPO_COMPARISON, complain);
5826 else if ((code0 == POINTER_TYPE && null_ptr_cst_p (orig_op1))
5827 || (code1 == POINTER_TYPE && null_ptr_cst_p (orig_op0))
5828 || (null_ptr_cst_p (orig_op0) && null_ptr_cst_p (orig_op1)))
5829 {
5830 /* Core Issue 1512 made this ill-formed. */
5831 if (complain & tf_error)
5832 error_at (location, "ordered comparison of pointer with "
5833 "integer zero (%qT and %qT)", type0, type1);
5834 return error_mark_node;
5835 }
5836 else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
5837 {
5838 result_type = type0;
5839 if (complain & tf_error)
5840 permerror (location, "ISO C++ forbids comparison between "
5841 "pointer and integer");
5842 else
5843 return error_mark_node;
5844 }
5845 else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
5846 {
5847 result_type = type1;
5848 if (complain & tf_error)
5849 permerror (location, "ISO C++ forbids comparison between "
5850 "pointer and integer");
5851 else
5852 return error_mark_node;
5853 }
5854
5855 if ((code0 == POINTER_TYPE || code1 == POINTER_TYPE)
5856 && !processing_template_decl
5857 && sanitize_flags_p (SANITIZE_POINTER_COMPARE))
5858 {
5859 op0 = save_expr (op0);
5860 op1 = save_expr (op1);
5861
5862 tree tt = builtin_decl_explicit (BUILT_IN_ASAN_POINTER_COMPARE);
5863 instrument_expr = build_call_expr_loc (location, tt, 2, op0, op1);
5864 }
5865
5866 break;
5867
5868 case UNORDERED_EXPR:
5869 case ORDERED_EXPR:
5870 case UNLT_EXPR:
5871 case UNLE_EXPR:
5872 case UNGT_EXPR:
5873 case UNGE_EXPR:
5874 case UNEQ_EXPR:
5875 build_type = integer_type_node;
5876 if (code0 != REAL_TYPE || code1 != REAL_TYPE)
5877 {
5878 if (complain & tf_error)
5879 error ("unordered comparison on non-floating-point argument");
5880 return error_mark_node;
5881 }
5882 common = 1;
5883 break;
5884
5885 default:
5886 break;
5887 }
5888
5889 if (((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE
5890 || code0 == ENUMERAL_TYPE)
5891 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
5892 || code1 == COMPLEX_TYPE || code1 == ENUMERAL_TYPE)))
5893 arithmetic_types_p = 1;
5894 else
5895 {
5896 arithmetic_types_p = 0;
5897 /* Vector arithmetic is only allowed when both sides are vectors. */
5898 if (gnu_vector_type_p (type0) && gnu_vector_type_p (type1))
5899 {
5900 if (!tree_int_cst_equal (TYPE_SIZE (type0), TYPE_SIZE (type1))
5901 || !vector_types_compatible_elements_p (type0, type1))
5902 {
5903 if (complain & tf_error)
5904 {
5905 /* "location" already embeds the locations of the
5906 operands, so we don't need to add them separately
5907 to richloc. */
5908 rich_location richloc (line_table, location);
5909 binary_op_error (&richloc, code, type0, type1);
5910 }
5911 return error_mark_node;
5912 }
5913 arithmetic_types_p = 1;
5914 }
5915 }
5916 /* Determine the RESULT_TYPE, if it is not already known. */
5917 if (!result_type
5918 && arithmetic_types_p
5919 && (shorten || common || short_compare))
5920 {
5921 result_type = cp_common_type (type0, type1);
5922 if (complain & tf_warning)
5923 {
5924 do_warn_double_promotion (result_type, type0, type1,
5925 "implicit conversion from %qH to %qI "
5926 "to match other operand of binary "
5927 "expression",
5928 location);
5929 do_warn_enum_conversions (location, code, TREE_TYPE (orig_op0),
5930 TREE_TYPE (orig_op1));
5931 }
5932 }
5933
5934 if (code == SPACESHIP_EXPR)
5935 {
5936 iloc_sentinel s (location);
5937
5938 tree orig_type0 = TREE_TYPE (orig_op0);
5939 tree_code orig_code0 = TREE_CODE (orig_type0);
5940 tree orig_type1 = TREE_TYPE (orig_op1);
5941 tree_code orig_code1 = TREE_CODE (orig_type1);
5942 if (!result_type || result_type == error_mark_node)
5943 /* Nope. */
5944 result_type = NULL_TREE;
5945 else if ((orig_code0 == BOOLEAN_TYPE) != (orig_code1 == BOOLEAN_TYPE))
5946 /* "If one of the operands is of type bool and the other is not, the
5947 program is ill-formed." */
5948 result_type = NULL_TREE;
5949 else if (code0 == POINTER_TYPE && orig_code0 != POINTER_TYPE
5950 && code1 == POINTER_TYPE && orig_code1 != POINTER_TYPE)
5951 /* We only do array/function-to-pointer conversion if "at least one of
5952 the operands is of pointer type". */
5953 result_type = NULL_TREE;
5954 else if (TYPE_PTRFN_P (result_type) || NULLPTR_TYPE_P (result_type))
5955 /* <=> no longer supports equality relations. */
5956 result_type = NULL_TREE;
5957 else if (orig_code0 == ENUMERAL_TYPE && orig_code1 == ENUMERAL_TYPE
5958 && !(same_type_ignoring_top_level_qualifiers_p
5959 (orig_type0, orig_type1)))
5960 /* "If both operands have arithmetic types, or one operand has integral
5961 type and the other operand has unscoped enumeration type, the usual
5962 arithmetic conversions are applied to the operands." So we don't do
5963 arithmetic conversions if the operands both have enumeral type. */
5964 result_type = NULL_TREE;
5965 else if ((orig_code0 == ENUMERAL_TYPE && orig_code1 == REAL_TYPE)
5966 || (orig_code0 == REAL_TYPE && orig_code1 == ENUMERAL_TYPE))
5967 /* [depr.arith.conv.enum]: Three-way comparisons between such operands
5968 [where one is of enumeration type and the other is of a different
5969 enumeration type or a floating-point type] are ill-formed. */
5970 result_type = NULL_TREE;
5971
5972 if (result_type)
5973 {
5974 build_type = spaceship_type (result_type, complain);
5975 if (build_type == error_mark_node)
5976 return error_mark_node;
5977 }
5978
5979 if (result_type && arithmetic_types_p)
5980 {
5981 /* If a narrowing conversion is required, other than from an integral
5982 type to a floating point type, the program is ill-formed. */
5983 bool ok = true;
5984 if (TREE_CODE (result_type) == REAL_TYPE
5985 && CP_INTEGRAL_TYPE_P (orig_type0))
5986 /* OK */;
5987 else if (!check_narrowing (result_type, orig_op0, complain))
5988 ok = false;
5989 if (TREE_CODE (result_type) == REAL_TYPE
5990 && CP_INTEGRAL_TYPE_P (orig_type1))
5991 /* OK */;
5992 else if (!check_narrowing (result_type, orig_op1, complain))
5993 ok = false;
5994 if (!ok && !(complain & tf_error))
5995 return error_mark_node;
5996 }
5997 }
5998
5999 if (!result_type)
6000 {
6001 if (complain & tf_error)
6002 {
6003 binary_op_rich_location richloc (location,
6004 orig_op0, orig_op1, true);
6005 error_at (&richloc,
6006 "invalid operands of types %qT and %qT to binary %qO",
6007 TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), code);
6008 }
6009 return error_mark_node;
6010 }
6011
6012 /* If we're in a template, the only thing we need to know is the
6013 RESULT_TYPE. */
6014 if (processing_template_decl)
6015 {
6016 /* Since the middle-end checks the type when doing a build2, we
6017 need to build the tree in pieces. This built tree will never
6018 get out of the front-end as we replace it when instantiating
6019 the template. */
6020 tree tmp = build2 (resultcode,
6021 build_type ? build_type : result_type,
6022 NULL_TREE, op1);
6023 TREE_OPERAND (tmp, 0) = op0;
6024 return tmp;
6025 }
6026
6027 /* Remember the original type; RESULT_TYPE might be changed later on
6028 by shorten_binary_op. */
6029 tree orig_type = result_type;
6030
6031 if (arithmetic_types_p)
6032 {
6033 bool first_complex = (code0 == COMPLEX_TYPE);
6034 bool second_complex = (code1 == COMPLEX_TYPE);
6035 int none_complex = (!first_complex && !second_complex);
6036
6037 /* Adapted from patch for c/24581. */
6038 if (first_complex != second_complex
6039 && (code == PLUS_EXPR
6040 || code == MINUS_EXPR
6041 || code == MULT_EXPR
6042 || (code == TRUNC_DIV_EXPR && first_complex))
6043 && TREE_CODE (TREE_TYPE (result_type)) == REAL_TYPE
6044 && flag_signed_zeros)
6045 {
6046 /* An operation on mixed real/complex operands must be
6047 handled specially, but the language-independent code can
6048 more easily optimize the plain complex arithmetic if
6049 -fno-signed-zeros. */
6050 tree real_type = TREE_TYPE (result_type);
6051 tree real, imag;
6052 if (first_complex)
6053 {
6054 if (TREE_TYPE (op0) != result_type)
6055 op0 = cp_convert_and_check (result_type, op0, complain);
6056 if (TREE_TYPE (op1) != real_type)
6057 op1 = cp_convert_and_check (real_type, op1, complain);
6058 }
6059 else
6060 {
6061 if (TREE_TYPE (op0) != real_type)
6062 op0 = cp_convert_and_check (real_type, op0, complain);
6063 if (TREE_TYPE (op1) != result_type)
6064 op1 = cp_convert_and_check (result_type, op1, complain);
6065 }
6066 if (TREE_CODE (op0) == ERROR_MARK || TREE_CODE (op1) == ERROR_MARK)
6067 return error_mark_node;
6068 if (first_complex)
6069 {
6070 op0 = save_expr (op0);
6071 real = cp_build_unary_op (REALPART_EXPR, op0, true, complain);
6072 imag = cp_build_unary_op (IMAGPART_EXPR, op0, true, complain);
6073 switch (code)
6074 {
6075 case MULT_EXPR:
6076 case TRUNC_DIV_EXPR:
6077 op1 = save_expr (op1);
6078 imag = build2 (resultcode, real_type, imag, op1);
6079 /* Fall through. */
6080 case PLUS_EXPR:
6081 case MINUS_EXPR:
6082 real = build2 (resultcode, real_type, real, op1);
6083 break;
6084 default:
6085 gcc_unreachable();
6086 }
6087 }
6088 else
6089 {
6090 op1 = save_expr (op1);
6091 real = cp_build_unary_op (REALPART_EXPR, op1, true, complain);
6092 imag = cp_build_unary_op (IMAGPART_EXPR, op1, true, complain);
6093 switch (code)
6094 {
6095 case MULT_EXPR:
6096 op0 = save_expr (op0);
6097 imag = build2 (resultcode, real_type, op0, imag);
6098 /* Fall through. */
6099 case PLUS_EXPR:
6100 real = build2 (resultcode, real_type, op0, real);
6101 break;
6102 case MINUS_EXPR:
6103 real = build2 (resultcode, real_type, op0, real);
6104 imag = build1 (NEGATE_EXPR, real_type, imag);
6105 break;
6106 default:
6107 gcc_unreachable();
6108 }
6109 }
6110 result = build2 (COMPLEX_EXPR, result_type, real, imag);
6111 return result;
6112 }
6113
6114 /* For certain operations (which identify themselves by shorten != 0)
6115 if both args were extended from the same smaller type,
6116 do the arithmetic in that type and then extend.
6117
6118 shorten !=0 and !=1 indicates a bitwise operation.
6119 For them, this optimization is safe only if
6120 both args are zero-extended or both are sign-extended.
6121 Otherwise, we might change the result.
6122 E.g., (short)-1 | (unsigned short)-1 is (int)-1
6123 but calculated in (unsigned short) it would be (unsigned short)-1. */
6124
6125 if (shorten && none_complex)
6126 {
6127 final_type = result_type;
6128 result_type = shorten_binary_op (result_type, op0, op1,
6129 shorten == -1);
6130 }
6131
6132 /* Shifts can be shortened if shifting right. */
6133
6134 if (short_shift)
6135 {
6136 int unsigned_arg;
6137 tree arg0 = get_narrower (op0, &unsigned_arg);
6138 /* We're not really warning here but when we set short_shift we
6139 used fold_for_warn to fold the operand. */
6140 tree const_op1 = fold_for_warn (op1);
6141
6142 final_type = result_type;
6143
6144 if (arg0 == op0 && final_type == TREE_TYPE (op0))
6145 unsigned_arg = TYPE_UNSIGNED (TREE_TYPE (op0));
6146
6147 if (TYPE_PRECISION (TREE_TYPE (arg0)) < TYPE_PRECISION (result_type)
6148 && tree_int_cst_sgn (const_op1) > 0
6149 /* We can shorten only if the shift count is less than the
6150 number of bits in the smaller type size. */
6151 && compare_tree_int (const_op1,
6152 TYPE_PRECISION (TREE_TYPE (arg0))) < 0
6153 /* We cannot drop an unsigned shift after sign-extension. */
6154 && (!TYPE_UNSIGNED (final_type) || unsigned_arg))
6155 {
6156 /* Do an unsigned shift if the operand was zero-extended. */
6157 result_type
6158 = c_common_signed_or_unsigned_type (unsigned_arg,
6159 TREE_TYPE (arg0));
6160 /* Convert value-to-be-shifted to that type. */
6161 if (TREE_TYPE (op0) != result_type)
6162 op0 = convert (result_type, op0);
6163 converted = 1;
6164 }
6165 }
6166
6167 /* Comparison operations are shortened too but differently.
6168 They identify themselves by setting short_compare = 1. */
6169
6170 if (short_compare)
6171 {
6172 /* We call shorten_compare only for diagnostics. */
6173 tree xop0 = fold_simple (op0);
6174 tree xop1 = fold_simple (op1);
6175 tree xresult_type = result_type;
6176 enum tree_code xresultcode = resultcode;
6177 shorten_compare (location, &xop0, &xop1, &xresult_type,
6178 &xresultcode);
6179 }
6180
6181 if ((short_compare || code == MIN_EXPR || code == MAX_EXPR)
6182 && warn_sign_compare
6183 /* Do not warn until the template is instantiated; we cannot
6184 bound the ranges of the arguments until that point. */
6185 && !processing_template_decl
6186 && (complain & tf_warning)
6187 && c_inhibit_evaluation_warnings == 0
6188 /* Even unsigned enum types promote to signed int. We don't
6189 want to issue -Wsign-compare warnings for this case. */
6190 && !enum_cast_to_int (orig_op0)
6191 && !enum_cast_to_int (orig_op1))
6192 {
6193 warn_for_sign_compare (location, orig_op0, orig_op1, op0, op1,
6194 result_type, resultcode);
6195 }
6196 }
6197
6198 /* If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
6199 Then the expression will be built.
6200 It will be given type FINAL_TYPE if that is nonzero;
6201 otherwise, it will be given type RESULT_TYPE. */
6202 if (! converted)
6203 {
6204 warning_sentinel w (warn_sign_conversion, short_compare);
6205 if (!same_type_p (TREE_TYPE (op0), result_type))
6206 op0 = cp_convert_and_check (result_type, op0, complain);
6207 if (!same_type_p (TREE_TYPE (op1), result_type))
6208 op1 = cp_convert_and_check (result_type, op1, complain);
6209
6210 if (op0 == error_mark_node || op1 == error_mark_node)
6211 return error_mark_node;
6212 }
6213
6214 if (build_type == NULL_TREE)
6215 build_type = result_type;
6216
6217 if (doing_shift
6218 && flag_strong_eval_order == 2
6219 && TREE_SIDE_EFFECTS (op1)
6220 && !processing_template_decl)
6221 {
6222 /* In C++17, in both op0 << op1 and op0 >> op1 op0 is sequenced before
6223 op1, so if op1 has side-effects, use SAVE_EXPR around op0. */
6224 op0 = cp_save_expr (op0);
6225 instrument_expr = op0;
6226 }
6227
6228 if (sanitize_flags_p ((SANITIZE_SHIFT
6229 | SANITIZE_DIVIDE
6230 | SANITIZE_FLOAT_DIVIDE
6231 | SANITIZE_SI_OVERFLOW))
6232 && current_function_decl != NULL_TREE
6233 && !processing_template_decl
6234 && (doing_div_or_mod || doing_shift))
6235 {
6236 /* OP0 and/or OP1 might have side-effects. */
6237 op0 = cp_save_expr (op0);
6238 op1 = cp_save_expr (op1);
6239 op0 = fold_non_dependent_expr (op0, complain);
6240 op1 = fold_non_dependent_expr (op1, complain);
6241 tree instrument_expr1 = NULL_TREE;
6242 if (doing_div_or_mod
6243 && sanitize_flags_p (SANITIZE_DIVIDE
6244 | SANITIZE_FLOAT_DIVIDE
6245 | SANITIZE_SI_OVERFLOW))
6246 {
6247 /* For diagnostics we want to use the promoted types without
6248 shorten_binary_op. So convert the arguments to the
6249 original result_type. */
6250 tree cop0 = op0;
6251 tree cop1 = op1;
6252 if (TREE_TYPE (cop0) != orig_type)
6253 cop0 = cp_convert (orig_type, op0, complain);
6254 if (TREE_TYPE (cop1) != orig_type)
6255 cop1 = cp_convert (orig_type, op1, complain);
6256 instrument_expr1 = ubsan_instrument_division (location, cop0, cop1);
6257 }
6258 else if (doing_shift && sanitize_flags_p (SANITIZE_SHIFT))
6259 instrument_expr1 = ubsan_instrument_shift (location, code, op0, op1);
6260 if (instrument_expr != NULL)
6261 instrument_expr = add_stmt_to_compound (instrument_expr,
6262 instrument_expr1);
6263 else
6264 instrument_expr = instrument_expr1;
6265 }
6266
6267 result = build2_loc (location, resultcode, build_type, op0, op1);
6268 if (final_type != 0)
6269 result = cp_convert (final_type, result, complain);
6270
6271 if (instrument_expr != NULL)
6272 result = build2 (COMPOUND_EXPR, TREE_TYPE (result),
6273 instrument_expr, result);
6274
6275 if (resultcode == SPACESHIP_EXPR && !processing_template_decl)
6276 result = get_target_expr_sfinae (result, complain);
6277
6278 if (!c_inhibit_evaluation_warnings)
6279 {
6280 if (!processing_template_decl)
6281 {
6282 op0 = cp_fully_fold (op0);
6283 /* Only consider the second argument if the first isn't overflowed. */
6284 if (!CONSTANT_CLASS_P (op0) || TREE_OVERFLOW_P (op0))
6285 return result;
6286 op1 = cp_fully_fold (op1);
6287 if (!CONSTANT_CLASS_P (op1) || TREE_OVERFLOW_P (op1))
6288 return result;
6289 }
6290 else if (!CONSTANT_CLASS_P (op0) || !CONSTANT_CLASS_P (op1)
6291 || TREE_OVERFLOW_P (op0) || TREE_OVERFLOW_P (op1))
6292 return result;
6293
6294 tree result_ovl = fold_build2 (resultcode, build_type, op0, op1);
6295 if (TREE_OVERFLOW_P (result_ovl))
6296 overflow_warning (location, result_ovl);
6297 }
6298
6299 return result;
6300 }
6301
6302 /* Build a VEC_PERM_EXPR.
6303 This is a simple wrapper for c_build_vec_perm_expr. */
6304 tree
build_x_vec_perm_expr(location_t loc,tree arg0,tree arg1,tree arg2,tsubst_flags_t complain)6305 build_x_vec_perm_expr (location_t loc,
6306 tree arg0, tree arg1, tree arg2,
6307 tsubst_flags_t complain)
6308 {
6309 tree orig_arg0 = arg0;
6310 tree orig_arg1 = arg1;
6311 tree orig_arg2 = arg2;
6312 if (processing_template_decl)
6313 {
6314 if (type_dependent_expression_p (arg0)
6315 || type_dependent_expression_p (arg1)
6316 || type_dependent_expression_p (arg2))
6317 return build_min_nt_loc (loc, VEC_PERM_EXPR, arg0, arg1, arg2);
6318 arg0 = build_non_dependent_expr (arg0);
6319 if (arg1)
6320 arg1 = build_non_dependent_expr (arg1);
6321 arg2 = build_non_dependent_expr (arg2);
6322 }
6323 tree exp = c_build_vec_perm_expr (loc, arg0, arg1, arg2, complain & tf_error);
6324 if (processing_template_decl && exp != error_mark_node)
6325 return build_min_non_dep (VEC_PERM_EXPR, exp, orig_arg0,
6326 orig_arg1, orig_arg2);
6327 return exp;
6328 }
6329
6330 /* Build a VEC_PERM_EXPR.
6331 This is a simple wrapper for c_build_shufflevector. */
6332 tree
build_x_shufflevector(location_t loc,vec<tree,va_gc> * args,tsubst_flags_t complain)6333 build_x_shufflevector (location_t loc, vec<tree, va_gc> *args,
6334 tsubst_flags_t complain)
6335 {
6336 tree arg0 = (*args)[0];
6337 tree arg1 = (*args)[1];
6338 if (processing_template_decl)
6339 {
6340 for (unsigned i = 0; i < args->length (); ++i)
6341 if (i <= 1
6342 ? type_dependent_expression_p ((*args)[i])
6343 : instantiation_dependent_expression_p ((*args)[i]))
6344 {
6345 tree exp = build_min_nt_call_vec (NULL, args);
6346 CALL_EXPR_IFN (exp) = IFN_SHUFFLEVECTOR;
6347 return exp;
6348 }
6349 arg0 = build_non_dependent_expr (arg0);
6350 arg1 = build_non_dependent_expr (arg1);
6351 /* ??? Nothing needed for the index arguments? */
6352 }
6353 auto_vec<tree, 16> mask;
6354 for (unsigned i = 2; i < args->length (); ++i)
6355 {
6356 tree idx = fold_non_dependent_expr ((*args)[i], complain);
6357 mask.safe_push (idx);
6358 }
6359 tree exp = c_build_shufflevector (loc, arg0, arg1, mask, complain & tf_error);
6360 if (processing_template_decl && exp != error_mark_node)
6361 {
6362 exp = build_min_non_dep_call_vec (exp, NULL, args);
6363 CALL_EXPR_IFN (exp) = IFN_SHUFFLEVECTOR;
6364 }
6365 return exp;
6366 }
6367
6368 /* Return a tree for the sum or difference (RESULTCODE says which)
6369 of pointer PTROP and integer INTOP. */
6370
6371 static tree
cp_pointer_int_sum(location_t loc,enum tree_code resultcode,tree ptrop,tree intop,tsubst_flags_t complain)6372 cp_pointer_int_sum (location_t loc, enum tree_code resultcode, tree ptrop,
6373 tree intop, tsubst_flags_t complain)
6374 {
6375 tree res_type = TREE_TYPE (ptrop);
6376
6377 /* pointer_int_sum() uses size_in_bytes() on the TREE_TYPE(res_type)
6378 in certain circumstance (when it's valid to do so). So we need
6379 to make sure it's complete. We don't need to check here, if we
6380 can actually complete it at all, as those checks will be done in
6381 pointer_int_sum() anyway. */
6382 complete_type (TREE_TYPE (res_type));
6383
6384 return pointer_int_sum (loc, resultcode, ptrop,
6385 intop, complain & tf_warning_or_error);
6386 }
6387
6388 /* Return a tree for the difference of pointers OP0 and OP1.
6389 The resulting tree has type int. If POINTER_SUBTRACT sanitization is
6390 enabled, assign to INSTRUMENT_EXPR call to libsanitizer. */
6391
6392 static tree
pointer_diff(location_t loc,tree op0,tree op1,tree ptrtype,tsubst_flags_t complain,tree * instrument_expr)6393 pointer_diff (location_t loc, tree op0, tree op1, tree ptrtype,
6394 tsubst_flags_t complain, tree *instrument_expr)
6395 {
6396 tree result, inttype;
6397 tree restype = ptrdiff_type_node;
6398 tree target_type = TREE_TYPE (ptrtype);
6399
6400 if (!complete_type_or_maybe_complain (target_type, NULL_TREE, complain))
6401 return error_mark_node;
6402
6403 if (VOID_TYPE_P (target_type))
6404 {
6405 if (complain & tf_error)
6406 permerror (loc, "ISO C++ forbids using pointer of "
6407 "type %<void *%> in subtraction");
6408 else
6409 return error_mark_node;
6410 }
6411 if (TREE_CODE (target_type) == FUNCTION_TYPE)
6412 {
6413 if (complain & tf_error)
6414 permerror (loc, "ISO C++ forbids using pointer to "
6415 "a function in subtraction");
6416 else
6417 return error_mark_node;
6418 }
6419 if (TREE_CODE (target_type) == METHOD_TYPE)
6420 {
6421 if (complain & tf_error)
6422 permerror (loc, "ISO C++ forbids using pointer to "
6423 "a method in subtraction");
6424 else
6425 return error_mark_node;
6426 }
6427 else if (!verify_type_context (loc, TCTX_POINTER_ARITH,
6428 TREE_TYPE (TREE_TYPE (op0)),
6429 !(complain & tf_error))
6430 || !verify_type_context (loc, TCTX_POINTER_ARITH,
6431 TREE_TYPE (TREE_TYPE (op1)),
6432 !(complain & tf_error)))
6433 return error_mark_node;
6434
6435 /* Determine integer type result of the subtraction. This will usually
6436 be the same as the result type (ptrdiff_t), but may need to be a wider
6437 type if pointers for the address space are wider than ptrdiff_t. */
6438 if (TYPE_PRECISION (restype) < TYPE_PRECISION (TREE_TYPE (op0)))
6439 inttype = c_common_type_for_size (TYPE_PRECISION (TREE_TYPE (op0)), 0);
6440 else
6441 inttype = restype;
6442
6443 if (!processing_template_decl
6444 && sanitize_flags_p (SANITIZE_POINTER_SUBTRACT))
6445 {
6446 op0 = save_expr (op0);
6447 op1 = save_expr (op1);
6448
6449 tree tt = builtin_decl_explicit (BUILT_IN_ASAN_POINTER_SUBTRACT);
6450 *instrument_expr = build_call_expr_loc (loc, tt, 2, op0, op1);
6451 }
6452
6453 /* First do the subtraction, then build the divide operator
6454 and only convert at the very end.
6455 Do not do default conversions in case restype is a short type. */
6456
6457 /* POINTER_DIFF_EXPR requires a signed integer type of the same size as
6458 pointers. If some platform cannot provide that, or has a larger
6459 ptrdiff_type to support differences larger than half the address
6460 space, cast the pointers to some larger integer type and do the
6461 computations in that type. */
6462 if (TYPE_PRECISION (inttype) > TYPE_PRECISION (TREE_TYPE (op0)))
6463 op0 = cp_build_binary_op (loc,
6464 MINUS_EXPR,
6465 cp_convert (inttype, op0, complain),
6466 cp_convert (inttype, op1, complain),
6467 complain);
6468 else
6469 op0 = build2_loc (loc, POINTER_DIFF_EXPR, inttype, op0, op1);
6470
6471 /* This generates an error if op1 is a pointer to an incomplete type. */
6472 if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (op1))))
6473 {
6474 if (complain & tf_error)
6475 error_at (loc, "invalid use of a pointer to an incomplete type in "
6476 "pointer arithmetic");
6477 else
6478 return error_mark_node;
6479 }
6480
6481 if (pointer_to_zero_sized_aggr_p (TREE_TYPE (op1)))
6482 {
6483 if (complain & tf_error)
6484 error_at (loc, "arithmetic on pointer to an empty aggregate");
6485 else
6486 return error_mark_node;
6487 }
6488
6489 op1 = (TYPE_PTROB_P (ptrtype)
6490 ? size_in_bytes_loc (loc, target_type)
6491 : integer_one_node);
6492
6493 /* Do the division. */
6494
6495 result = build2_loc (loc, EXACT_DIV_EXPR, inttype, op0,
6496 cp_convert (inttype, op1, complain));
6497 return cp_convert (restype, result, complain);
6498 }
6499
6500 /* Construct and perhaps optimize a tree representation
6501 for a unary operation. CODE, a tree_code, specifies the operation
6502 and XARG is the operand. */
6503
6504 tree
build_x_unary_op(location_t loc,enum tree_code code,cp_expr xarg,tree lookups,tsubst_flags_t complain)6505 build_x_unary_op (location_t loc, enum tree_code code, cp_expr xarg,
6506 tree lookups, tsubst_flags_t complain)
6507 {
6508 tree orig_expr = xarg;
6509 tree exp;
6510 int ptrmem = 0;
6511 tree overload = NULL_TREE;
6512
6513 if (processing_template_decl)
6514 {
6515 if (type_dependent_expression_p (xarg))
6516 {
6517 tree e = build_min_nt_loc (loc, code, xarg.get_value (), NULL_TREE);
6518 TREE_TYPE (e) = build_dependent_operator_type (lookups, code, false);
6519 return e;
6520 }
6521
6522 xarg = build_non_dependent_expr (xarg);
6523 }
6524
6525 exp = NULL_TREE;
6526
6527 /* [expr.unary.op] says:
6528
6529 The address of an object of incomplete type can be taken.
6530
6531 (And is just the ordinary address operator, not an overloaded
6532 "operator &".) However, if the type is a template
6533 specialization, we must complete the type at this point so that
6534 an overloaded "operator &" will be available if required. */
6535 if (code == ADDR_EXPR
6536 && TREE_CODE (xarg) != TEMPLATE_ID_EXPR
6537 && ((CLASS_TYPE_P (TREE_TYPE (xarg))
6538 && !COMPLETE_TYPE_P (complete_type (TREE_TYPE (xarg))))
6539 || (TREE_CODE (xarg) == OFFSET_REF)))
6540 /* Don't look for a function. */;
6541 else
6542 exp = build_new_op (loc, code, LOOKUP_NORMAL, xarg, NULL_TREE,
6543 NULL_TREE, lookups, &overload, complain);
6544
6545 if (!exp && code == ADDR_EXPR)
6546 {
6547 if (is_overloaded_fn (xarg))
6548 {
6549 tree fn = get_first_fn (xarg);
6550 if (DECL_CONSTRUCTOR_P (fn) || DECL_DESTRUCTOR_P (fn))
6551 {
6552 if (complain & tf_error)
6553 error_at (loc, DECL_CONSTRUCTOR_P (fn)
6554 ? G_("taking address of constructor %qD")
6555 : G_("taking address of destructor %qD"),
6556 fn);
6557 return error_mark_node;
6558 }
6559 }
6560
6561 /* A pointer to member-function can be formed only by saying
6562 &X::mf. */
6563 if (!flag_ms_extensions && TREE_CODE (TREE_TYPE (xarg)) == METHOD_TYPE
6564 && (TREE_CODE (xarg) != OFFSET_REF || !PTRMEM_OK_P (xarg)))
6565 {
6566 if (TREE_CODE (xarg) != OFFSET_REF
6567 || !TYPE_P (TREE_OPERAND (xarg, 0)))
6568 {
6569 if (complain & tf_error)
6570 {
6571 error_at (loc, "invalid use of %qE to form a "
6572 "pointer-to-member-function", xarg.get_value ());
6573 if (TREE_CODE (xarg) != OFFSET_REF)
6574 inform (loc, " a qualified-id is required");
6575 }
6576 return error_mark_node;
6577 }
6578 else
6579 {
6580 if (complain & tf_error)
6581 error_at (loc, "parentheses around %qE cannot be used to "
6582 "form a pointer-to-member-function",
6583 xarg.get_value ());
6584 else
6585 return error_mark_node;
6586 PTRMEM_OK_P (xarg) = 1;
6587 }
6588 }
6589
6590 if (TREE_CODE (xarg) == OFFSET_REF)
6591 {
6592 ptrmem = PTRMEM_OK_P (xarg);
6593
6594 if (!ptrmem && !flag_ms_extensions
6595 && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE)
6596 {
6597 /* A single non-static member, make sure we don't allow a
6598 pointer-to-member. */
6599 xarg = build2 (OFFSET_REF, TREE_TYPE (xarg),
6600 TREE_OPERAND (xarg, 0),
6601 ovl_make (TREE_OPERAND (xarg, 1)));
6602 PTRMEM_OK_P (xarg) = ptrmem;
6603 }
6604 }
6605
6606 exp = cp_build_addr_expr_strict (xarg, complain);
6607
6608 if (TREE_CODE (exp) == PTRMEM_CST)
6609 PTRMEM_CST_LOCATION (exp) = loc;
6610 else
6611 protected_set_expr_location (exp, loc);
6612 }
6613
6614 if (processing_template_decl && exp != error_mark_node)
6615 {
6616 if (overload != NULL_TREE)
6617 return (build_min_non_dep_op_overload
6618 (code, exp, overload, orig_expr, integer_zero_node));
6619
6620 exp = build_min_non_dep (code, exp, orig_expr,
6621 /*For {PRE,POST}{INC,DEC}REMENT_EXPR*/NULL_TREE);
6622 }
6623 if (TREE_CODE (exp) == ADDR_EXPR)
6624 PTRMEM_OK_P (exp) = ptrmem;
6625 return exp;
6626 }
6627
6628 /* Construct and perhaps optimize a tree representation
6629 for __builtin_addressof operation. ARG specifies the operand. */
6630
6631 tree
cp_build_addressof(location_t loc,tree arg,tsubst_flags_t complain)6632 cp_build_addressof (location_t loc, tree arg, tsubst_flags_t complain)
6633 {
6634 tree orig_expr = arg;
6635
6636 if (processing_template_decl)
6637 {
6638 if (type_dependent_expression_p (arg))
6639 return build_min_nt_loc (loc, ADDRESSOF_EXPR, arg, NULL_TREE);
6640
6641 arg = build_non_dependent_expr (arg);
6642 }
6643
6644 tree exp = cp_build_addr_expr_strict (arg, complain);
6645
6646 if (processing_template_decl && exp != error_mark_node)
6647 exp = build_min_non_dep (ADDRESSOF_EXPR, exp, orig_expr, NULL_TREE);
6648 return exp;
6649 }
6650
6651 /* Like c_common_truthvalue_conversion, but handle pointer-to-member
6652 constants, where a null value is represented by an INTEGER_CST of
6653 -1. */
6654
6655 tree
cp_truthvalue_conversion(tree expr,tsubst_flags_t complain)6656 cp_truthvalue_conversion (tree expr, tsubst_flags_t complain)
6657 {
6658 tree type = TREE_TYPE (expr);
6659 location_t loc = cp_expr_loc_or_input_loc (expr);
6660 if (TYPE_PTR_OR_PTRMEM_P (type)
6661 /* Avoid ICE on invalid use of non-static member function. */
6662 || TREE_CODE (expr) == FUNCTION_DECL)
6663 return cp_build_binary_op (loc, NE_EXPR, expr, nullptr_node, complain);
6664 else
6665 return c_common_truthvalue_conversion (loc, expr);
6666 }
6667
6668 /* Returns EXPR contextually converted to bool. */
6669
6670 tree
contextual_conv_bool(tree expr,tsubst_flags_t complain)6671 contextual_conv_bool (tree expr, tsubst_flags_t complain)
6672 {
6673 return perform_implicit_conversion_flags (boolean_type_node, expr,
6674 complain, LOOKUP_NORMAL);
6675 }
6676
6677 /* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR. This
6678 is a low-level function; most callers should use maybe_convert_cond. */
6679
6680 tree
condition_conversion(tree expr)6681 condition_conversion (tree expr)
6682 {
6683 tree t = contextual_conv_bool (expr, tf_warning_or_error);
6684 if (!processing_template_decl)
6685 t = fold_build_cleanup_point_expr (boolean_type_node, t);
6686 return t;
6687 }
6688
6689 /* Returns the address of T. This function will fold away
6690 ADDR_EXPR of INDIRECT_REF. This is only for low-level usage;
6691 most places should use cp_build_addr_expr instead. */
6692
6693 tree
build_address(tree t)6694 build_address (tree t)
6695 {
6696 if (error_operand_p (t) || !cxx_mark_addressable (t))
6697 return error_mark_node;
6698 gcc_checking_assert (TREE_CODE (t) != CONSTRUCTOR
6699 || processing_template_decl);
6700 t = build_fold_addr_expr_loc (EXPR_LOCATION (t), t);
6701 if (TREE_CODE (t) != ADDR_EXPR)
6702 t = rvalue (t);
6703 return t;
6704 }
6705
6706 /* Return a NOP_EXPR converting EXPR to TYPE. */
6707
6708 tree
build_nop(tree type,tree expr)6709 build_nop (tree type, tree expr)
6710 {
6711 if (type == error_mark_node || error_operand_p (expr))
6712 return expr;
6713 return build1_loc (EXPR_LOCATION (expr), NOP_EXPR, type, expr);
6714 }
6715
6716 /* Take the address of ARG, whatever that means under C++ semantics.
6717 If STRICT_LVALUE is true, require an lvalue; otherwise, allow xvalues
6718 and class rvalues as well.
6719
6720 Nothing should call this function directly; instead, callers should use
6721 cp_build_addr_expr or cp_build_addr_expr_strict. */
6722
6723 static tree
cp_build_addr_expr_1(tree arg,bool strict_lvalue,tsubst_flags_t complain)6724 cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain)
6725 {
6726 tree argtype;
6727 tree val;
6728
6729 if (!arg || error_operand_p (arg))
6730 return error_mark_node;
6731
6732 arg = mark_lvalue_use (arg);
6733 if (error_operand_p (arg))
6734 return error_mark_node;
6735
6736 argtype = lvalue_type (arg);
6737 location_t loc = cp_expr_loc_or_input_loc (arg);
6738
6739 gcc_assert (!(identifier_p (arg) && IDENTIFIER_ANY_OP_P (arg)));
6740
6741 if (TREE_CODE (arg) == COMPONENT_REF && type_unknown_p (arg)
6742 && !really_overloaded_fn (arg))
6743 {
6744 /* They're trying to take the address of a unique non-static
6745 member function. This is ill-formed (except in MS-land),
6746 but let's try to DTRT.
6747 Note: We only handle unique functions here because we don't
6748 want to complain if there's a static overload; non-unique
6749 cases will be handled by instantiate_type. But we need to
6750 handle this case here to allow casts on the resulting PMF.
6751 We could defer this in non-MS mode, but it's easier to give
6752 a useful error here. */
6753
6754 /* Inside constant member functions, the `this' pointer
6755 contains an extra const qualifier. TYPE_MAIN_VARIANT
6756 is used here to remove this const from the diagnostics
6757 and the created OFFSET_REF. */
6758 tree base = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg, 0)));
6759 tree fn = get_first_fn (TREE_OPERAND (arg, 1));
6760 if (!mark_used (fn, complain) && !(complain & tf_error))
6761 return error_mark_node;
6762
6763 if (! flag_ms_extensions)
6764 {
6765 tree name = DECL_NAME (fn);
6766 if (!(complain & tf_error))
6767 return error_mark_node;
6768 else if (current_class_type
6769 && TREE_OPERAND (arg, 0) == current_class_ref)
6770 /* An expression like &memfn. */
6771 permerror (loc,
6772 "ISO C++ forbids taking the address of an unqualified"
6773 " or parenthesized non-static member function to form"
6774 " a pointer to member function. Say %<&%T::%D%>",
6775 base, name);
6776 else
6777 permerror (loc,
6778 "ISO C++ forbids taking the address of a bound member"
6779 " function to form a pointer to member function."
6780 " Say %<&%T::%D%>",
6781 base, name);
6782 }
6783 arg = build_offset_ref (base, fn, /*address_p=*/true, complain);
6784 }
6785
6786 /* Uninstantiated types are all functions. Taking the
6787 address of a function is a no-op, so just return the
6788 argument. */
6789 if (type_unknown_p (arg))
6790 return build1 (ADDR_EXPR, unknown_type_node, arg);
6791
6792 if (TREE_CODE (arg) == OFFSET_REF)
6793 /* We want a pointer to member; bypass all the code for actually taking
6794 the address of something. */
6795 goto offset_ref;
6796
6797 /* Anything not already handled and not a true memory reference
6798 is an error. */
6799 if (!FUNC_OR_METHOD_TYPE_P (argtype))
6800 {
6801 cp_lvalue_kind kind = lvalue_kind (arg);
6802 if (kind == clk_none)
6803 {
6804 if (complain & tf_error)
6805 lvalue_error (loc, lv_addressof);
6806 return error_mark_node;
6807 }
6808 if (strict_lvalue && (kind & (clk_rvalueref|clk_class)))
6809 {
6810 if (!(complain & tf_error))
6811 return error_mark_node;
6812 /* Make this a permerror because we used to accept it. */
6813 permerror (loc, "taking address of rvalue");
6814 }
6815 }
6816
6817 if (TYPE_REF_P (argtype))
6818 {
6819 tree type = build_pointer_type (TREE_TYPE (argtype));
6820 arg = build1 (CONVERT_EXPR, type, arg);
6821 return arg;
6822 }
6823 else if (pedantic && DECL_MAIN_P (tree_strip_any_location_wrapper (arg)))
6824 {
6825 /* ARM $3.4 */
6826 /* Apparently a lot of autoconf scripts for C++ packages do this,
6827 so only complain if -Wpedantic. */
6828 if (complain & (flag_pedantic_errors ? tf_error : tf_warning))
6829 pedwarn (loc, OPT_Wpedantic,
6830 "ISO C++ forbids taking address of function %<::main%>");
6831 else if (flag_pedantic_errors)
6832 return error_mark_node;
6833 }
6834
6835 /* Let &* cancel out to simplify resulting code. */
6836 if (INDIRECT_REF_P (arg))
6837 {
6838 arg = TREE_OPERAND (arg, 0);
6839 if (TYPE_REF_P (TREE_TYPE (arg)))
6840 {
6841 tree type = build_pointer_type (TREE_TYPE (TREE_TYPE (arg)));
6842 arg = build1 (CONVERT_EXPR, type, arg);
6843 }
6844 else
6845 /* Don't let this be an lvalue. */
6846 arg = rvalue (arg);
6847 return arg;
6848 }
6849
6850 /* Handle complex lvalues (when permitted)
6851 by reduction to simpler cases. */
6852 val = unary_complex_lvalue (ADDR_EXPR, arg);
6853 if (val != 0)
6854 return val;
6855
6856 switch (TREE_CODE (arg))
6857 {
6858 CASE_CONVERT:
6859 case FLOAT_EXPR:
6860 case FIX_TRUNC_EXPR:
6861 /* We should have handled this above in the lvalue_kind check. */
6862 gcc_unreachable ();
6863 break;
6864
6865 case BASELINK:
6866 arg = BASELINK_FUNCTIONS (arg);
6867 /* Fall through. */
6868
6869 case OVERLOAD:
6870 arg = OVL_FIRST (arg);
6871 break;
6872
6873 case OFFSET_REF:
6874 offset_ref:
6875 /* Turn a reference to a non-static data member into a
6876 pointer-to-member. */
6877 {
6878 tree type;
6879 tree t;
6880
6881 gcc_assert (PTRMEM_OK_P (arg));
6882
6883 t = TREE_OPERAND (arg, 1);
6884 if (TYPE_REF_P (TREE_TYPE (t)))
6885 {
6886 if (complain & tf_error)
6887 error_at (loc,
6888 "cannot create pointer to reference member %qD", t);
6889 return error_mark_node;
6890 }
6891
6892 /* Forming a pointer-to-member is a use of non-pure-virtual fns. */
6893 if (TREE_CODE (t) == FUNCTION_DECL
6894 && !DECL_PURE_VIRTUAL_P (t)
6895 && !mark_used (t, complain) && !(complain & tf_error))
6896 return error_mark_node;
6897
6898 type = build_ptrmem_type (context_for_name_lookup (t),
6899 TREE_TYPE (t));
6900 t = make_ptrmem_cst (type, t);
6901 return t;
6902 }
6903
6904 default:
6905 break;
6906 }
6907
6908 if (argtype != error_mark_node)
6909 argtype = build_pointer_type (argtype);
6910
6911 if (bitfield_p (arg))
6912 {
6913 if (complain & tf_error)
6914 error_at (loc, "attempt to take address of bit-field");
6915 return error_mark_node;
6916 }
6917
6918 /* In a template, we are processing a non-dependent expression
6919 so we can just form an ADDR_EXPR with the correct type. */
6920 if (processing_template_decl || TREE_CODE (arg) != COMPONENT_REF)
6921 {
6922 if (!mark_single_function (arg, complain))
6923 return error_mark_node;
6924 val = build_address (arg);
6925 if (TREE_CODE (arg) == OFFSET_REF)
6926 PTRMEM_OK_P (val) = PTRMEM_OK_P (arg);
6927 }
6928 else if (BASELINK_P (TREE_OPERAND (arg, 1)))
6929 {
6930 tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1));
6931
6932 /* We can only get here with a single static member
6933 function. */
6934 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
6935 && DECL_STATIC_FUNCTION_P (fn));
6936 if (!mark_used (fn, complain) && !(complain & tf_error))
6937 return error_mark_node;
6938 val = build_address (fn);
6939 if (TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
6940 /* Do not lose object's side effects. */
6941 val = build2 (COMPOUND_EXPR, TREE_TYPE (val),
6942 TREE_OPERAND (arg, 0), val);
6943 }
6944 else
6945 {
6946 tree object = TREE_OPERAND (arg, 0);
6947 tree field = TREE_OPERAND (arg, 1);
6948 gcc_assert (same_type_ignoring_top_level_qualifiers_p
6949 (TREE_TYPE (object), decl_type_context (field)));
6950 val = build_address (arg);
6951 }
6952
6953 if (TYPE_PTR_P (argtype)
6954 && TREE_CODE (TREE_TYPE (argtype)) == METHOD_TYPE)
6955 {
6956 build_ptrmemfunc_type (argtype);
6957 val = build_ptrmemfunc (argtype, val, 0,
6958 /*c_cast_p=*/false,
6959 complain);
6960 }
6961
6962 /* For addresses of immediate functions ensure we have EXPR_LOCATION
6963 set for possible later diagnostics. */
6964 if (TREE_CODE (val) == ADDR_EXPR
6965 && TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL
6966 && DECL_IMMEDIATE_FUNCTION_P (TREE_OPERAND (val, 0)))
6967 SET_EXPR_LOCATION (val, input_location);
6968
6969 return val;
6970 }
6971
6972 /* Take the address of ARG if it has one, even if it's an rvalue. */
6973
6974 tree
cp_build_addr_expr(tree arg,tsubst_flags_t complain)6975 cp_build_addr_expr (tree arg, tsubst_flags_t complain)
6976 {
6977 return cp_build_addr_expr_1 (arg, 0, complain);
6978 }
6979
6980 /* Take the address of ARG, but only if it's an lvalue. */
6981
6982 static tree
cp_build_addr_expr_strict(tree arg,tsubst_flags_t complain)6983 cp_build_addr_expr_strict (tree arg, tsubst_flags_t complain)
6984 {
6985 return cp_build_addr_expr_1 (arg, 1, complain);
6986 }
6987
6988 /* C++: Must handle pointers to members.
6989
6990 Perhaps type instantiation should be extended to handle conversion
6991 from aggregates to types we don't yet know we want? (Or are those
6992 cases typically errors which should be reported?)
6993
6994 NOCONVERT suppresses the default promotions (such as from short to int). */
6995
6996 tree
cp_build_unary_op(enum tree_code code,tree xarg,bool noconvert,tsubst_flags_t complain)6997 cp_build_unary_op (enum tree_code code, tree xarg, bool noconvert,
6998 tsubst_flags_t complain)
6999 {
7000 /* No default_conversion here. It causes trouble for ADDR_EXPR. */
7001 tree arg = xarg;
7002 location_t location = cp_expr_loc_or_input_loc (arg);
7003 tree argtype = 0;
7004 const char *errstring = NULL;
7005 tree val;
7006 const char *invalid_op_diag;
7007
7008 if (!arg || error_operand_p (arg))
7009 return error_mark_node;
7010
7011 arg = resolve_nondeduced_context (arg, complain);
7012
7013 if ((invalid_op_diag
7014 = targetm.invalid_unary_op ((code == UNARY_PLUS_EXPR
7015 ? CONVERT_EXPR
7016 : code),
7017 TREE_TYPE (arg))))
7018 {
7019 if (complain & tf_error)
7020 error (invalid_op_diag);
7021 return error_mark_node;
7022 }
7023
7024 switch (code)
7025 {
7026 case UNARY_PLUS_EXPR:
7027 case NEGATE_EXPR:
7028 {
7029 int flags = WANT_ARITH | WANT_ENUM;
7030 /* Unary plus (but not unary minus) is allowed on pointers. */
7031 if (code == UNARY_PLUS_EXPR)
7032 flags |= WANT_POINTER;
7033 arg = build_expr_type_conversion (flags, arg, true);
7034 if (!arg)
7035 errstring = (code == NEGATE_EXPR
7036 ? _("wrong type argument to unary minus")
7037 : _("wrong type argument to unary plus"));
7038 else
7039 {
7040 if (!noconvert && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (arg)))
7041 arg = cp_perform_integral_promotions (arg, complain);
7042
7043 /* Make sure the result is not an lvalue: a unary plus or minus
7044 expression is always a rvalue. */
7045 arg = rvalue (arg);
7046 }
7047 }
7048 break;
7049
7050 case BIT_NOT_EXPR:
7051 if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
7052 {
7053 code = CONJ_EXPR;
7054 if (!noconvert)
7055 {
7056 arg = cp_default_conversion (arg, complain);
7057 if (arg == error_mark_node)
7058 return error_mark_node;
7059 }
7060 }
7061 else if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM
7062 | WANT_VECTOR_OR_COMPLEX,
7063 arg, true)))
7064 errstring = _("wrong type argument to bit-complement");
7065 else if (!noconvert && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (arg)))
7066 {
7067 /* Warn if the expression has boolean value. */
7068 if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE
7069 && (complain & tf_warning)
7070 && warning_at (location, OPT_Wbool_operation,
7071 "%<~%> on an expression of type %<bool%>"))
7072 inform (location, "did you mean to use logical not (%<!%>)?");
7073 arg = cp_perform_integral_promotions (arg, complain);
7074 }
7075 else if (!noconvert && VECTOR_TYPE_P (TREE_TYPE (arg)))
7076 arg = mark_rvalue_use (arg);
7077 break;
7078
7079 case ABS_EXPR:
7080 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
7081 errstring = _("wrong type argument to abs");
7082 else if (!noconvert)
7083 {
7084 arg = cp_default_conversion (arg, complain);
7085 if (arg == error_mark_node)
7086 return error_mark_node;
7087 }
7088 break;
7089
7090 case CONJ_EXPR:
7091 /* Conjugating a real value is a no-op, but allow it anyway. */
7092 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
7093 errstring = _("wrong type argument to conjugation");
7094 else if (!noconvert)
7095 {
7096 arg = cp_default_conversion (arg, complain);
7097 if (arg == error_mark_node)
7098 return error_mark_node;
7099 }
7100 break;
7101
7102 case TRUTH_NOT_EXPR:
7103 if (gnu_vector_type_p (TREE_TYPE (arg)))
7104 return cp_build_binary_op (input_location, EQ_EXPR, arg,
7105 build_zero_cst (TREE_TYPE (arg)), complain);
7106 arg = perform_implicit_conversion (boolean_type_node, arg,
7107 complain);
7108 if (arg != error_mark_node)
7109 {
7110 val = invert_truthvalue_loc (location, arg);
7111 if (obvalue_p (val))
7112 val = non_lvalue_loc (location, val);
7113 return val;
7114 }
7115 errstring = _("in argument to unary !");
7116 break;
7117
7118 case NOP_EXPR:
7119 break;
7120
7121 case REALPART_EXPR:
7122 case IMAGPART_EXPR:
7123 arg = build_real_imag_expr (input_location, code, arg);
7124 return arg;
7125
7126 case PREINCREMENT_EXPR:
7127 case POSTINCREMENT_EXPR:
7128 case PREDECREMENT_EXPR:
7129 case POSTDECREMENT_EXPR:
7130 /* Handle complex lvalues (when permitted)
7131 by reduction to simpler cases. */
7132
7133 val = unary_complex_lvalue (code, arg);
7134 if (val != 0)
7135 return val;
7136
7137 arg = mark_lvalue_use (arg);
7138
7139 /* Increment or decrement the real part of the value,
7140 and don't change the imaginary part. */
7141 if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
7142 {
7143 tree real, imag;
7144
7145 arg = cp_stabilize_reference (arg);
7146 real = cp_build_unary_op (REALPART_EXPR, arg, true, complain);
7147 imag = cp_build_unary_op (IMAGPART_EXPR, arg, true, complain);
7148 real = cp_build_unary_op (code, real, true, complain);
7149 if (real == error_mark_node || imag == error_mark_node)
7150 return error_mark_node;
7151 return build2 (COMPLEX_EXPR, TREE_TYPE (arg),
7152 real, imag);
7153 }
7154
7155 /* Report invalid types. */
7156
7157 if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_POINTER,
7158 arg, true)))
7159 {
7160 if (code == PREINCREMENT_EXPR)
7161 errstring = _("no pre-increment operator for type");
7162 else if (code == POSTINCREMENT_EXPR)
7163 errstring = _("no post-increment operator for type");
7164 else if (code == PREDECREMENT_EXPR)
7165 errstring = _("no pre-decrement operator for type");
7166 else
7167 errstring = _("no post-decrement operator for type");
7168 break;
7169 }
7170 else if (arg == error_mark_node)
7171 return error_mark_node;
7172
7173 /* Report something read-only. */
7174
7175 if (CP_TYPE_CONST_P (TREE_TYPE (arg))
7176 || TREE_READONLY (arg))
7177 {
7178 if (complain & tf_error)
7179 cxx_readonly_error (location, arg,
7180 ((code == PREINCREMENT_EXPR
7181 || code == POSTINCREMENT_EXPR)
7182 ? lv_increment : lv_decrement));
7183 else
7184 return error_mark_node;
7185 }
7186
7187 {
7188 tree inc;
7189 tree declared_type = unlowered_expr_type (arg);
7190
7191 argtype = TREE_TYPE (arg);
7192
7193 /* ARM $5.2.5 last annotation says this should be forbidden. */
7194 if (TREE_CODE (argtype) == ENUMERAL_TYPE)
7195 {
7196 if (complain & tf_error)
7197 permerror (location, (code == PREINCREMENT_EXPR
7198 || code == POSTINCREMENT_EXPR)
7199 ? G_("ISO C++ forbids incrementing an enum")
7200 : G_("ISO C++ forbids decrementing an enum"));
7201 else
7202 return error_mark_node;
7203 }
7204
7205 /* Compute the increment. */
7206
7207 if (TYPE_PTR_P (argtype))
7208 {
7209 tree type = complete_type (TREE_TYPE (argtype));
7210
7211 if (!COMPLETE_OR_VOID_TYPE_P (type))
7212 {
7213 if (complain & tf_error)
7214 error_at (location, ((code == PREINCREMENT_EXPR
7215 || code == POSTINCREMENT_EXPR))
7216 ? G_("cannot increment a pointer to incomplete "
7217 "type %qT")
7218 : G_("cannot decrement a pointer to incomplete "
7219 "type %qT"),
7220 TREE_TYPE (argtype));
7221 else
7222 return error_mark_node;
7223 }
7224 else if (!TYPE_PTROB_P (argtype))
7225 {
7226 if (complain & tf_error)
7227 pedwarn (location, OPT_Wpointer_arith,
7228 (code == PREINCREMENT_EXPR
7229 || code == POSTINCREMENT_EXPR)
7230 ? G_("ISO C++ forbids incrementing a pointer "
7231 "of type %qT")
7232 : G_("ISO C++ forbids decrementing a pointer "
7233 "of type %qT"),
7234 argtype);
7235 else
7236 return error_mark_node;
7237 }
7238 else if (!verify_type_context (location, TCTX_POINTER_ARITH,
7239 TREE_TYPE (argtype),
7240 !(complain & tf_error)))
7241 return error_mark_node;
7242
7243 inc = cxx_sizeof_nowarn (TREE_TYPE (argtype));
7244 }
7245 else
7246 inc = VECTOR_TYPE_P (argtype)
7247 ? build_one_cst (argtype)
7248 : integer_one_node;
7249
7250 inc = cp_convert (argtype, inc, complain);
7251
7252 /* If 'arg' is an Objective-C PROPERTY_REF expression, then we
7253 need to ask Objective-C to build the increment or decrement
7254 expression for it. */
7255 if (objc_is_property_ref (arg))
7256 return objc_build_incr_expr_for_property_ref (input_location, code,
7257 arg, inc);
7258
7259 /* Complain about anything else that is not a true lvalue. */
7260 if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
7261 || code == POSTINCREMENT_EXPR)
7262 ? lv_increment : lv_decrement),
7263 complain))
7264 return error_mark_node;
7265
7266 /* [depr.volatile.type] "Postfix ++ and -- expressions and
7267 prefix ++ and -- expressions of volatile-qualified arithmetic
7268 and pointer types are deprecated." */
7269 if (TREE_THIS_VOLATILE (arg) || CP_TYPE_VOLATILE_P (TREE_TYPE (arg)))
7270 warning_at (location, OPT_Wvolatile,
7271 "%qs expression of %<volatile%>-qualified type is "
7272 "deprecated",
7273 ((code == PREINCREMENT_EXPR
7274 || code == POSTINCREMENT_EXPR)
7275 ? "++" : "--"));
7276
7277 /* Forbid using -- or ++ in C++17 on `bool'. */
7278 if (TREE_CODE (declared_type) == BOOLEAN_TYPE)
7279 {
7280 if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
7281 {
7282 if (complain & tf_error)
7283 error_at (location,
7284 "use of an operand of type %qT in %<operator--%> "
7285 "is forbidden", boolean_type_node);
7286 return error_mark_node;
7287 }
7288 else
7289 {
7290 if (cxx_dialect >= cxx17)
7291 {
7292 if (complain & tf_error)
7293 error_at (location,
7294 "use of an operand of type %qT in "
7295 "%<operator++%> is forbidden in C++17",
7296 boolean_type_node);
7297 return error_mark_node;
7298 }
7299 /* Otherwise, [depr.incr.bool] says this is deprecated. */
7300 else
7301 warning_at (location, OPT_Wdeprecated,
7302 "use of an operand of type %qT "
7303 "in %<operator++%> is deprecated",
7304 boolean_type_node);
7305 }
7306 val = boolean_increment (code, arg);
7307 }
7308 else if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
7309 /* An rvalue has no cv-qualifiers. */
7310 val = build2 (code, cv_unqualified (TREE_TYPE (arg)), arg, inc);
7311 else
7312 val = build2 (code, TREE_TYPE (arg), arg, inc);
7313
7314 TREE_SIDE_EFFECTS (val) = 1;
7315 return val;
7316 }
7317
7318 case ADDR_EXPR:
7319 /* Note that this operation never does default_conversion
7320 regardless of NOCONVERT. */
7321 return cp_build_addr_expr (arg, complain);
7322
7323 default:
7324 break;
7325 }
7326
7327 if (!errstring)
7328 {
7329 if (argtype == 0)
7330 argtype = TREE_TYPE (arg);
7331 return build1 (code, argtype, arg);
7332 }
7333
7334 if (complain & tf_error)
7335 error_at (location, "%s", errstring);
7336 return error_mark_node;
7337 }
7338
7339 /* Hook for the c-common bits that build a unary op. */
7340 tree
build_unary_op(location_t,enum tree_code code,tree xarg,bool noconvert)7341 build_unary_op (location_t /*location*/,
7342 enum tree_code code, tree xarg, bool noconvert)
7343 {
7344 return cp_build_unary_op (code, xarg, noconvert, tf_warning_or_error);
7345 }
7346
7347 /* Adjust LVALUE, an MODIFY_EXPR, PREINCREMENT_EXPR or PREDECREMENT_EXPR,
7348 so that it is a valid lvalue even for GENERIC by replacing
7349 (lhs = rhs) with ((lhs = rhs), lhs)
7350 (--lhs) with ((--lhs), lhs)
7351 (++lhs) with ((++lhs), lhs)
7352 and if lhs has side-effects, calling cp_stabilize_reference on it, so
7353 that it can be evaluated multiple times. */
7354
7355 tree
genericize_compound_lvalue(tree lvalue)7356 genericize_compound_lvalue (tree lvalue)
7357 {
7358 if (TREE_SIDE_EFFECTS (TREE_OPERAND (lvalue, 0)))
7359 lvalue = build2 (TREE_CODE (lvalue), TREE_TYPE (lvalue),
7360 cp_stabilize_reference (TREE_OPERAND (lvalue, 0)),
7361 TREE_OPERAND (lvalue, 1));
7362 return build2 (COMPOUND_EXPR, TREE_TYPE (TREE_OPERAND (lvalue, 0)),
7363 lvalue, TREE_OPERAND (lvalue, 0));
7364 }
7365
7366 /* Apply unary lvalue-demanding operator CODE to the expression ARG
7367 for certain kinds of expressions which are not really lvalues
7368 but which we can accept as lvalues.
7369
7370 If ARG is not a kind of expression we can handle, return
7371 NULL_TREE. */
7372
7373 tree
unary_complex_lvalue(enum tree_code code,tree arg)7374 unary_complex_lvalue (enum tree_code code, tree arg)
7375 {
7376 /* Inside a template, making these kinds of adjustments is
7377 pointless; we are only concerned with the type of the
7378 expression. */
7379 if (processing_template_decl)
7380 return NULL_TREE;
7381
7382 /* Handle (a, b) used as an "lvalue". */
7383 if (TREE_CODE (arg) == COMPOUND_EXPR)
7384 {
7385 tree real_result = cp_build_unary_op (code, TREE_OPERAND (arg, 1), false,
7386 tf_warning_or_error);
7387 return build2 (COMPOUND_EXPR, TREE_TYPE (real_result),
7388 TREE_OPERAND (arg, 0), real_result);
7389 }
7390
7391 /* Handle (a ? b : c) used as an "lvalue". */
7392 if (TREE_CODE (arg) == COND_EXPR
7393 || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR)
7394 return rationalize_conditional_expr (code, arg, tf_warning_or_error);
7395
7396 /* Handle (a = b), (++a), and (--a) used as an "lvalue". */
7397 if (TREE_CODE (arg) == MODIFY_EXPR
7398 || TREE_CODE (arg) == PREINCREMENT_EXPR
7399 || TREE_CODE (arg) == PREDECREMENT_EXPR)
7400 return unary_complex_lvalue (code, genericize_compound_lvalue (arg));
7401
7402 if (code != ADDR_EXPR)
7403 return NULL_TREE;
7404
7405 /* Handle (a = b) used as an "lvalue" for `&'. */
7406 if (TREE_CODE (arg) == MODIFY_EXPR
7407 || TREE_CODE (arg) == INIT_EXPR)
7408 {
7409 tree real_result = cp_build_unary_op (code, TREE_OPERAND (arg, 0), false,
7410 tf_warning_or_error);
7411 arg = build2 (COMPOUND_EXPR, TREE_TYPE (real_result),
7412 arg, real_result);
7413 suppress_warning (arg /* What warning? */);
7414 return arg;
7415 }
7416
7417 if (FUNC_OR_METHOD_TYPE_P (TREE_TYPE (arg))
7418 || TREE_CODE (arg) == OFFSET_REF)
7419 return NULL_TREE;
7420
7421 /* We permit compiler to make function calls returning
7422 objects of aggregate type look like lvalues. */
7423 {
7424 tree targ = arg;
7425
7426 if (TREE_CODE (targ) == SAVE_EXPR)
7427 targ = TREE_OPERAND (targ, 0);
7428
7429 if (TREE_CODE (targ) == CALL_EXPR && MAYBE_CLASS_TYPE_P (TREE_TYPE (targ)))
7430 {
7431 if (TREE_CODE (arg) == SAVE_EXPR)
7432 targ = arg;
7433 else
7434 targ = build_cplus_new (TREE_TYPE (arg), arg, tf_warning_or_error);
7435 return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), targ);
7436 }
7437
7438 if (TREE_CODE (arg) == SAVE_EXPR && INDIRECT_REF_P (targ))
7439 return build3 (SAVE_EXPR, build_pointer_type (TREE_TYPE (arg)),
7440 TREE_OPERAND (targ, 0), current_function_decl, NULL);
7441 }
7442
7443 /* Don't let anything else be handled specially. */
7444 return NULL_TREE;
7445 }
7446
7447 /* Mark EXP saying that we need to be able to take the
7448 address of it; it should not be allocated in a register.
7449 Value is true if successful. ARRAY_REF_P is true if this
7450 is for ARRAY_REF construction - in that case we don't want
7451 to look through VIEW_CONVERT_EXPR from VECTOR_TYPE to ARRAY_TYPE,
7452 it is fine to use ARRAY_REFs for vector subscripts on vector
7453 register variables.
7454
7455 C++: we do not allow `current_class_ptr' to be addressable. */
7456
7457 bool
cxx_mark_addressable(tree exp,bool array_ref_p)7458 cxx_mark_addressable (tree exp, bool array_ref_p)
7459 {
7460 tree x = exp;
7461
7462 while (1)
7463 switch (TREE_CODE (x))
7464 {
7465 case VIEW_CONVERT_EXPR:
7466 if (array_ref_p
7467 && TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
7468 && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (x, 0))))
7469 return true;
7470 x = TREE_OPERAND (x, 0);
7471 break;
7472
7473 case COMPONENT_REF:
7474 if (bitfield_p (x))
7475 error ("attempt to take address of bit-field");
7476 /* FALLTHRU */
7477 case ADDR_EXPR:
7478 case ARRAY_REF:
7479 case REALPART_EXPR:
7480 case IMAGPART_EXPR:
7481 x = TREE_OPERAND (x, 0);
7482 break;
7483
7484 case PARM_DECL:
7485 if (x == current_class_ptr)
7486 {
7487 error ("cannot take the address of %<this%>, which is an rvalue expression");
7488 TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later. */
7489 return true;
7490 }
7491 /* Fall through. */
7492
7493 case VAR_DECL:
7494 /* Caller should not be trying to mark initialized
7495 constant fields addressable. */
7496 gcc_assert (DECL_LANG_SPECIFIC (x) == 0
7497 || DECL_IN_AGGR_P (x) == 0
7498 || TREE_STATIC (x)
7499 || DECL_EXTERNAL (x));
7500 /* Fall through. */
7501
7502 case RESULT_DECL:
7503 if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
7504 && !DECL_ARTIFICIAL (x))
7505 {
7506 if (VAR_P (x) && DECL_HARD_REGISTER (x))
7507 {
7508 error
7509 ("address of explicit register variable %qD requested", x);
7510 return false;
7511 }
7512 else if (extra_warnings)
7513 warning
7514 (OPT_Wextra, "address requested for %qD, which is declared %<register%>", x);
7515 }
7516 TREE_ADDRESSABLE (x) = 1;
7517 return true;
7518
7519 case CONST_DECL:
7520 case FUNCTION_DECL:
7521 TREE_ADDRESSABLE (x) = 1;
7522 return true;
7523
7524 case CONSTRUCTOR:
7525 TREE_ADDRESSABLE (x) = 1;
7526 return true;
7527
7528 case TARGET_EXPR:
7529 TREE_ADDRESSABLE (x) = 1;
7530 cxx_mark_addressable (TREE_OPERAND (x, 0));
7531 return true;
7532
7533 default:
7534 return true;
7535 }
7536 }
7537
7538 /* Build and return a conditional expression IFEXP ? OP1 : OP2. */
7539
7540 tree
build_x_conditional_expr(location_t loc,tree ifexp,tree op1,tree op2,tsubst_flags_t complain)7541 build_x_conditional_expr (location_t loc, tree ifexp, tree op1, tree op2,
7542 tsubst_flags_t complain)
7543 {
7544 tree orig_ifexp = ifexp;
7545 tree orig_op1 = op1;
7546 tree orig_op2 = op2;
7547 tree expr;
7548
7549 if (processing_template_decl)
7550 {
7551 /* The standard says that the expression is type-dependent if
7552 IFEXP is type-dependent, even though the eventual type of the
7553 expression doesn't dependent on IFEXP. */
7554 if (type_dependent_expression_p (ifexp)
7555 /* As a GNU extension, the middle operand may be omitted. */
7556 || (op1 && type_dependent_expression_p (op1))
7557 || type_dependent_expression_p (op2))
7558 return build_min_nt_loc (loc, COND_EXPR, ifexp, op1, op2);
7559 ifexp = build_non_dependent_expr (ifexp);
7560 if (op1)
7561 op1 = build_non_dependent_expr (op1);
7562 op2 = build_non_dependent_expr (op2);
7563 }
7564
7565 expr = build_conditional_expr (loc, ifexp, op1, op2, complain);
7566 if (processing_template_decl && expr != error_mark_node)
7567 {
7568 tree min = build_min_non_dep (COND_EXPR, expr,
7569 orig_ifexp, orig_op1, orig_op2);
7570 expr = convert_from_reference (min);
7571 }
7572 return expr;
7573 }
7574
7575 /* Given a list of expressions, return a compound expression
7576 that performs them all and returns the value of the last of them. */
7577
7578 tree
build_x_compound_expr_from_list(tree list,expr_list_kind exp,tsubst_flags_t complain)7579 build_x_compound_expr_from_list (tree list, expr_list_kind exp,
7580 tsubst_flags_t complain)
7581 {
7582 tree expr = TREE_VALUE (list);
7583
7584 if (BRACE_ENCLOSED_INITIALIZER_P (expr)
7585 && !CONSTRUCTOR_IS_DIRECT_INIT (expr))
7586 {
7587 if (complain & tf_error)
7588 pedwarn (cp_expr_loc_or_input_loc (expr), 0,
7589 "list-initializer for non-class type must not "
7590 "be parenthesized");
7591 else
7592 return error_mark_node;
7593 }
7594
7595 if (TREE_CHAIN (list))
7596 {
7597 if (complain & tf_error)
7598 switch (exp)
7599 {
7600 case ELK_INIT:
7601 permerror (input_location, "expression list treated as compound "
7602 "expression in initializer");
7603 break;
7604 case ELK_MEM_INIT:
7605 permerror (input_location, "expression list treated as compound "
7606 "expression in mem-initializer");
7607 break;
7608 case ELK_FUNC_CAST:
7609 permerror (input_location, "expression list treated as compound "
7610 "expression in functional cast");
7611 break;
7612 default:
7613 gcc_unreachable ();
7614 }
7615 else
7616 return error_mark_node;
7617
7618 for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
7619 expr = build_x_compound_expr (EXPR_LOCATION (TREE_VALUE (list)),
7620 expr, TREE_VALUE (list), NULL_TREE,
7621 complain);
7622 }
7623
7624 return expr;
7625 }
7626
7627 /* Like build_x_compound_expr_from_list, but using a VEC. */
7628
7629 tree
build_x_compound_expr_from_vec(vec<tree,va_gc> * vec,const char * msg,tsubst_flags_t complain)7630 build_x_compound_expr_from_vec (vec<tree, va_gc> *vec, const char *msg,
7631 tsubst_flags_t complain)
7632 {
7633 if (vec_safe_is_empty (vec))
7634 return NULL_TREE;
7635 else if (vec->length () == 1)
7636 return (*vec)[0];
7637 else
7638 {
7639 tree expr;
7640 unsigned int ix;
7641 tree t;
7642
7643 if (msg != NULL)
7644 {
7645 if (complain & tf_error)
7646 permerror (input_location,
7647 "%s expression list treated as compound expression",
7648 msg);
7649 else
7650 return error_mark_node;
7651 }
7652
7653 expr = (*vec)[0];
7654 for (ix = 1; vec->iterate (ix, &t); ++ix)
7655 expr = build_x_compound_expr (EXPR_LOCATION (t), expr,
7656 t, NULL_TREE, complain);
7657
7658 return expr;
7659 }
7660 }
7661
7662 /* Handle overloading of the ',' operator when needed. */
7663
7664 tree
build_x_compound_expr(location_t loc,tree op1,tree op2,tree lookups,tsubst_flags_t complain)7665 build_x_compound_expr (location_t loc, tree op1, tree op2,
7666 tree lookups, tsubst_flags_t complain)
7667 {
7668 tree result;
7669 tree orig_op1 = op1;
7670 tree orig_op2 = op2;
7671 tree overload = NULL_TREE;
7672
7673 if (processing_template_decl)
7674 {
7675 if (type_dependent_expression_p (op1)
7676 || type_dependent_expression_p (op2))
7677 {
7678 result = build_min_nt_loc (loc, COMPOUND_EXPR, op1, op2);
7679 TREE_TYPE (result)
7680 = build_dependent_operator_type (lookups, COMPOUND_EXPR, false);
7681 return result;
7682 }
7683 op1 = build_non_dependent_expr (op1);
7684 op2 = build_non_dependent_expr (op2);
7685 }
7686
7687 result = build_new_op (loc, COMPOUND_EXPR, LOOKUP_NORMAL, op1, op2,
7688 NULL_TREE, lookups, &overload, complain);
7689 if (!result)
7690 result = cp_build_compound_expr (op1, op2, complain);
7691
7692 if (processing_template_decl && result != error_mark_node)
7693 {
7694 if (overload != NULL_TREE)
7695 return (build_min_non_dep_op_overload
7696 (COMPOUND_EXPR, result, overload, orig_op1, orig_op2));
7697
7698 return build_min_non_dep (COMPOUND_EXPR, result, orig_op1, orig_op2);
7699 }
7700
7701 return result;
7702 }
7703
7704 /* Like cp_build_compound_expr, but for the c-common bits. */
7705
7706 tree
build_compound_expr(location_t,tree lhs,tree rhs)7707 build_compound_expr (location_t /*loc*/, tree lhs, tree rhs)
7708 {
7709 return cp_build_compound_expr (lhs, rhs, tf_warning_or_error);
7710 }
7711
7712 /* Build a compound expression. */
7713
7714 tree
cp_build_compound_expr(tree lhs,tree rhs,tsubst_flags_t complain)7715 cp_build_compound_expr (tree lhs, tree rhs, tsubst_flags_t complain)
7716 {
7717 lhs = convert_to_void (lhs, ICV_LEFT_OF_COMMA, complain);
7718
7719 if (lhs == error_mark_node || rhs == error_mark_node)
7720 return error_mark_node;
7721
7722 if (TREE_CODE (rhs) == TARGET_EXPR)
7723 {
7724 /* If the rhs is a TARGET_EXPR, then build the compound
7725 expression inside the target_expr's initializer. This
7726 helps the compiler to eliminate unnecessary temporaries. */
7727 tree init = TREE_OPERAND (rhs, 1);
7728
7729 init = build2 (COMPOUND_EXPR, TREE_TYPE (init), lhs, init);
7730 TREE_OPERAND (rhs, 1) = init;
7731
7732 return rhs;
7733 }
7734
7735 if (type_unknown_p (rhs))
7736 {
7737 if (complain & tf_error)
7738 error_at (cp_expr_loc_or_input_loc (rhs),
7739 "no context to resolve type of %qE", rhs);
7740 return error_mark_node;
7741 }
7742
7743 return build2 (COMPOUND_EXPR, TREE_TYPE (rhs), lhs, rhs);
7744 }
7745
7746 /* Issue a diagnostic message if casting from SRC_TYPE to DEST_TYPE
7747 casts away constness. CAST gives the type of cast. Returns true
7748 if the cast is ill-formed, false if it is well-formed.
7749
7750 ??? This function warns for casting away any qualifier not just
7751 const. We would like to specify exactly what qualifiers are casted
7752 away.
7753 */
7754
7755 static bool
check_for_casting_away_constness(location_t loc,tree src_type,tree dest_type,enum tree_code cast,tsubst_flags_t complain)7756 check_for_casting_away_constness (location_t loc, tree src_type,
7757 tree dest_type, enum tree_code cast,
7758 tsubst_flags_t complain)
7759 {
7760 /* C-style casts are allowed to cast away constness. With
7761 WARN_CAST_QUAL, we still want to issue a warning. */
7762 if (cast == CAST_EXPR && !warn_cast_qual)
7763 return false;
7764
7765 if (!casts_away_constness (src_type, dest_type, complain))
7766 return false;
7767
7768 switch (cast)
7769 {
7770 case CAST_EXPR:
7771 if (complain & tf_warning)
7772 warning_at (loc, OPT_Wcast_qual,
7773 "cast from type %qT to type %qT casts away qualifiers",
7774 src_type, dest_type);
7775 return false;
7776
7777 case STATIC_CAST_EXPR:
7778 if (complain & tf_error)
7779 error_at (loc, "%<static_cast%> from type %qT to type %qT casts "
7780 "away qualifiers",
7781 src_type, dest_type);
7782 return true;
7783
7784 case REINTERPRET_CAST_EXPR:
7785 if (complain & tf_error)
7786 error_at (loc, "%<reinterpret_cast%> from type %qT to type %qT "
7787 "casts away qualifiers",
7788 src_type, dest_type);
7789 return true;
7790
7791 default:
7792 gcc_unreachable();
7793 }
7794 }
7795
7796 /* Warns if the cast from expression EXPR to type TYPE is useless. */
7797 void
maybe_warn_about_useless_cast(location_t loc,tree type,tree expr,tsubst_flags_t complain)7798 maybe_warn_about_useless_cast (location_t loc, tree type, tree expr,
7799 tsubst_flags_t complain)
7800 {
7801 if (warn_useless_cast
7802 && complain & tf_warning)
7803 {
7804 if ((TYPE_REF_P (type)
7805 && (TYPE_REF_IS_RVALUE (type)
7806 ? xvalue_p (expr) : lvalue_p (expr))
7807 && same_type_p (TREE_TYPE (expr), TREE_TYPE (type)))
7808 || same_type_p (TREE_TYPE (expr), type))
7809 warning_at (loc, OPT_Wuseless_cast,
7810 "useless cast to type %q#T", type);
7811 }
7812 }
7813
7814 /* Warns if the cast ignores cv-qualifiers on TYPE. */
7815 static void
maybe_warn_about_cast_ignoring_quals(location_t loc,tree type,tsubst_flags_t complain)7816 maybe_warn_about_cast_ignoring_quals (location_t loc, tree type,
7817 tsubst_flags_t complain)
7818 {
7819 if (warn_ignored_qualifiers
7820 && complain & tf_warning
7821 && !CLASS_TYPE_P (type)
7822 && (cp_type_quals (type) & (TYPE_QUAL_CONST|TYPE_QUAL_VOLATILE)))
7823 warning_at (loc, OPT_Wignored_qualifiers,
7824 "type qualifiers ignored on cast result type");
7825 }
7826
7827 /* Convert EXPR (an expression with pointer-to-member type) to TYPE
7828 (another pointer-to-member type in the same hierarchy) and return
7829 the converted expression. If ALLOW_INVERSE_P is permitted, a
7830 pointer-to-derived may be converted to pointer-to-base; otherwise,
7831 only the other direction is permitted. If C_CAST_P is true, this
7832 conversion is taking place as part of a C-style cast. */
7833
7834 tree
convert_ptrmem(tree type,tree expr,bool allow_inverse_p,bool c_cast_p,tsubst_flags_t complain)7835 convert_ptrmem (tree type, tree expr, bool allow_inverse_p,
7836 bool c_cast_p, tsubst_flags_t complain)
7837 {
7838 if (same_type_p (type, TREE_TYPE (expr)))
7839 return expr;
7840
7841 if (TYPE_PTRDATAMEM_P (type))
7842 {
7843 tree obase = TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (expr));
7844 tree nbase = TYPE_PTRMEM_CLASS_TYPE (type);
7845 tree delta = (get_delta_difference
7846 (obase, nbase,
7847 allow_inverse_p, c_cast_p, complain));
7848
7849 if (delta == error_mark_node)
7850 return error_mark_node;
7851
7852 if (!same_type_p (obase, nbase))
7853 {
7854 if (TREE_CODE (expr) == PTRMEM_CST)
7855 expr = cplus_expand_constant (expr);
7856
7857 tree cond = cp_build_binary_op (input_location, EQ_EXPR, expr,
7858 build_int_cst (TREE_TYPE (expr), -1),
7859 complain);
7860 tree op1 = build_nop (ptrdiff_type_node, expr);
7861 tree op2 = cp_build_binary_op (input_location, PLUS_EXPR, op1, delta,
7862 complain);
7863
7864 expr = fold_build3_loc (input_location,
7865 COND_EXPR, ptrdiff_type_node, cond, op1, op2);
7866 }
7867
7868 return build_nop (type, expr);
7869 }
7870 else
7871 return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr,
7872 allow_inverse_p, c_cast_p, complain);
7873 }
7874
7875 /* Perform a static_cast from EXPR to TYPE. When C_CAST_P is true,
7876 this static_cast is being attempted as one of the possible casts
7877 allowed by a C-style cast. (In that case, accessibility of base
7878 classes is not considered, and it is OK to cast away
7879 constness.) Return the result of the cast. *VALID_P is set to
7880 indicate whether or not the cast was valid. */
7881
7882 static tree
build_static_cast_1(location_t loc,tree type,tree expr,bool c_cast_p,bool * valid_p,tsubst_flags_t complain)7883 build_static_cast_1 (location_t loc, tree type, tree expr, bool c_cast_p,
7884 bool *valid_p, tsubst_flags_t complain)
7885 {
7886 tree intype;
7887 tree result;
7888 cp_lvalue_kind clk;
7889
7890 /* Assume the cast is valid. */
7891 *valid_p = true;
7892
7893 intype = unlowered_expr_type (expr);
7894
7895 /* Save casted types in the function's used types hash table. */
7896 used_types_insert (type);
7897
7898 /* A prvalue of non-class type is cv-unqualified. */
7899 if (!CLASS_TYPE_P (type))
7900 type = cv_unqualified (type);
7901
7902 /* [expr.static.cast]
7903
7904 An lvalue of type "cv1 B", where B is a class type, can be cast
7905 to type "reference to cv2 D", where D is a class derived (clause
7906 _class.derived_) from B, if a valid standard conversion from
7907 "pointer to D" to "pointer to B" exists (_conv.ptr_), cv2 is the
7908 same cv-qualification as, or greater cv-qualification than, cv1,
7909 and B is not a virtual base class of D. */
7910 /* We check this case before checking the validity of "TYPE t =
7911 EXPR;" below because for this case:
7912
7913 struct B {};
7914 struct D : public B { D(const B&); };
7915 extern B& b;
7916 void f() { static_cast<const D&>(b); }
7917
7918 we want to avoid constructing a new D. The standard is not
7919 completely clear about this issue, but our interpretation is
7920 consistent with other compilers. */
7921 if (TYPE_REF_P (type)
7922 && CLASS_TYPE_P (TREE_TYPE (type))
7923 && CLASS_TYPE_P (intype)
7924 && (TYPE_REF_IS_RVALUE (type) || lvalue_p (expr))
7925 && DERIVED_FROM_P (intype, TREE_TYPE (type))
7926 && can_convert (build_pointer_type (TYPE_MAIN_VARIANT (intype)),
7927 build_pointer_type (TYPE_MAIN_VARIANT
7928 (TREE_TYPE (type))),
7929 complain)
7930 && (c_cast_p
7931 || at_least_as_qualified_p (TREE_TYPE (type), intype)))
7932 {
7933 tree base;
7934
7935 if (processing_template_decl)
7936 return expr;
7937
7938 /* There is a standard conversion from "D*" to "B*" even if "B"
7939 is ambiguous or inaccessible. If this is really a
7940 static_cast, then we check both for inaccessibility and
7941 ambiguity. However, if this is a static_cast being performed
7942 because the user wrote a C-style cast, then accessibility is
7943 not considered. */
7944 base = lookup_base (TREE_TYPE (type), intype,
7945 c_cast_p ? ba_unique : ba_check,
7946 NULL, complain);
7947 expr = cp_build_addr_expr (expr, complain);
7948
7949 if (sanitize_flags_p (SANITIZE_VPTR))
7950 {
7951 tree ubsan_check
7952 = cp_ubsan_maybe_instrument_downcast (loc, type,
7953 intype, expr);
7954 if (ubsan_check)
7955 expr = ubsan_check;
7956 }
7957
7958 /* Convert from "B*" to "D*". This function will check that "B"
7959 is not a virtual base of "D". Even if we don't have a guarantee
7960 that expr is NULL, if the static_cast is to a reference type,
7961 it is UB if it would be NULL, so omit the non-NULL check. */
7962 expr = build_base_path (MINUS_EXPR, expr, base,
7963 /*nonnull=*/flag_delete_null_pointer_checks,
7964 complain);
7965
7966 /* Convert the pointer to a reference -- but then remember that
7967 there are no expressions with reference type in C++.
7968
7969 We call rvalue so that there's an actual tree code
7970 (NON_LVALUE_EXPR) for the static_cast; otherwise, if the operand
7971 is a variable with the same type, the conversion would get folded
7972 away, leaving just the variable and causing lvalue_kind to give
7973 the wrong answer. */
7974 expr = cp_fold_convert (type, expr);
7975
7976 /* When -fsanitize=null, make sure to diagnose reference binding to
7977 NULL even when the reference is converted to pointer later on. */
7978 if (sanitize_flags_p (SANITIZE_NULL)
7979 && TREE_CODE (expr) == COND_EXPR
7980 && TREE_OPERAND (expr, 2)
7981 && TREE_CODE (TREE_OPERAND (expr, 2)) == INTEGER_CST
7982 && TREE_TYPE (TREE_OPERAND (expr, 2)) == type)
7983 ubsan_maybe_instrument_reference (&TREE_OPERAND (expr, 2));
7984
7985 return convert_from_reference (rvalue (expr));
7986 }
7987
7988 /* "A glvalue of type cv1 T1 can be cast to type rvalue reference to
7989 cv2 T2 if cv2 T2 is reference-compatible with cv1 T1 (8.5.3)." */
7990 if (TYPE_REF_P (type)
7991 && TYPE_REF_IS_RVALUE (type)
7992 && (clk = real_lvalue_p (expr))
7993 && reference_compatible_p (TREE_TYPE (type), intype)
7994 && (c_cast_p || at_least_as_qualified_p (TREE_TYPE (type), intype)))
7995 {
7996 if (processing_template_decl)
7997 return expr;
7998 if (clk == clk_ordinary)
7999 {
8000 /* Handle the (non-bit-field) lvalue case here by casting to
8001 lvalue reference and then changing it to an rvalue reference.
8002 Casting an xvalue to rvalue reference will be handled by the
8003 main code path. */
8004 tree lref = cp_build_reference_type (TREE_TYPE (type), false);
8005 result = (perform_direct_initialization_if_possible
8006 (lref, expr, c_cast_p, complain));
8007 result = build1 (NON_LVALUE_EXPR, type, result);
8008 return convert_from_reference (result);
8009 }
8010 else
8011 /* For a bit-field or packed field, bind to a temporary. */
8012 expr = rvalue (expr);
8013 }
8014
8015 /* Resolve overloaded address here rather than once in
8016 implicit_conversion and again in the inverse code below. */
8017 if (TYPE_PTRMEMFUNC_P (type) && type_unknown_p (expr))
8018 {
8019 expr = instantiate_type (type, expr, complain);
8020 intype = TREE_TYPE (expr);
8021 }
8022
8023 /* [expr.static.cast]
8024
8025 Any expression can be explicitly converted to type cv void. */
8026 if (VOID_TYPE_P (type))
8027 return convert_to_void (expr, ICV_CAST, complain);
8028
8029 /* [class.abstract]
8030 An abstract class shall not be used ... as the type of an explicit
8031 conversion. */
8032 if (abstract_virtuals_error_sfinae (ACU_CAST, type, complain))
8033 return error_mark_node;
8034
8035 /* [expr.static.cast]
8036
8037 An expression e can be explicitly converted to a type T using a
8038 static_cast of the form static_cast<T>(e) if the declaration T
8039 t(e);" is well-formed, for some invented temporary variable
8040 t. */
8041 result = perform_direct_initialization_if_possible (type, expr,
8042 c_cast_p, complain);
8043 /* P1975 allows static_cast<Aggr>(42), as well as static_cast<T[5]>(42),
8044 which initialize the first element of the aggregate. We need to handle
8045 the array case specifically. */
8046 if (result == NULL_TREE
8047 && cxx_dialect >= cxx20
8048 && TREE_CODE (type) == ARRAY_TYPE)
8049 {
8050 /* Create { EXPR } and perform direct-initialization from it. */
8051 tree e = build_constructor_single (init_list_type_node, NULL_TREE, expr);
8052 CONSTRUCTOR_IS_DIRECT_INIT (e) = true;
8053 CONSTRUCTOR_IS_PAREN_INIT (e) = true;
8054 result = perform_direct_initialization_if_possible (type, e, c_cast_p,
8055 complain);
8056 }
8057 if (result)
8058 {
8059 if (processing_template_decl)
8060 return expr;
8061
8062 result = convert_from_reference (result);
8063
8064 /* [expr.static.cast]
8065
8066 If T is a reference type, the result is an lvalue; otherwise,
8067 the result is an rvalue. */
8068 if (!TYPE_REF_P (type))
8069 {
8070 result = rvalue (result);
8071
8072 if (result == expr && SCALAR_TYPE_P (type))
8073 /* Leave some record of the cast. */
8074 result = build_nop (type, expr);
8075 }
8076 return result;
8077 }
8078
8079 /* [expr.static.cast]
8080
8081 The inverse of any standard conversion sequence (clause _conv_),
8082 other than the lvalue-to-rvalue (_conv.lval_), array-to-pointer
8083 (_conv.array_), function-to-pointer (_conv.func_), and boolean
8084 (_conv.bool_) conversions, can be performed explicitly using
8085 static_cast subject to the restriction that the explicit
8086 conversion does not cast away constness (_expr.const.cast_), and
8087 the following additional rules for specific cases: */
8088 /* For reference, the conversions not excluded are: integral
8089 promotions, floating-point promotion, integral conversions,
8090 floating-point conversions, floating-integral conversions,
8091 pointer conversions, and pointer to member conversions. */
8092 /* DR 128
8093
8094 A value of integral _or enumeration_ type can be explicitly
8095 converted to an enumeration type. */
8096 /* The effect of all that is that any conversion between any two
8097 types which are integral, floating, or enumeration types can be
8098 performed. */
8099 if ((INTEGRAL_OR_ENUMERATION_TYPE_P (type)
8100 || SCALAR_FLOAT_TYPE_P (type))
8101 && (INTEGRAL_OR_ENUMERATION_TYPE_P (intype)
8102 || SCALAR_FLOAT_TYPE_P (intype)))
8103 {
8104 if (processing_template_decl)
8105 return expr;
8106 return ocp_convert (type, expr, CONV_C_CAST, LOOKUP_NORMAL, complain);
8107 }
8108
8109 if (TYPE_PTR_P (type) && TYPE_PTR_P (intype)
8110 && CLASS_TYPE_P (TREE_TYPE (type))
8111 && CLASS_TYPE_P (TREE_TYPE (intype))
8112 && can_convert (build_pointer_type (TYPE_MAIN_VARIANT
8113 (TREE_TYPE (intype))),
8114 build_pointer_type (TYPE_MAIN_VARIANT
8115 (TREE_TYPE (type))),
8116 complain))
8117 {
8118 tree base;
8119
8120 if (processing_template_decl)
8121 return expr;
8122
8123 if (!c_cast_p
8124 && check_for_casting_away_constness (loc, intype, type,
8125 STATIC_CAST_EXPR,
8126 complain))
8127 return error_mark_node;
8128 base = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
8129 c_cast_p ? ba_unique : ba_check,
8130 NULL, complain);
8131 expr = build_base_path (MINUS_EXPR, expr, base, /*nonnull=*/false,
8132 complain);
8133
8134 if (sanitize_flags_p (SANITIZE_VPTR))
8135 {
8136 tree ubsan_check
8137 = cp_ubsan_maybe_instrument_downcast (loc, type,
8138 intype, expr);
8139 if (ubsan_check)
8140 expr = ubsan_check;
8141 }
8142
8143 return cp_fold_convert (type, expr);
8144 }
8145
8146 if ((TYPE_PTRDATAMEM_P (type) && TYPE_PTRDATAMEM_P (intype))
8147 || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
8148 {
8149 tree c1;
8150 tree c2;
8151 tree t1;
8152 tree t2;
8153
8154 c1 = TYPE_PTRMEM_CLASS_TYPE (intype);
8155 c2 = TYPE_PTRMEM_CLASS_TYPE (type);
8156
8157 if (TYPE_PTRDATAMEM_P (type))
8158 {
8159 t1 = (build_ptrmem_type
8160 (c1,
8161 TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (intype))));
8162 t2 = (build_ptrmem_type
8163 (c2,
8164 TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (type))));
8165 }
8166 else
8167 {
8168 t1 = intype;
8169 t2 = type;
8170 }
8171 if (can_convert (t1, t2, complain) || can_convert (t2, t1, complain))
8172 {
8173 if (!c_cast_p
8174 && check_for_casting_away_constness (loc, intype, type,
8175 STATIC_CAST_EXPR,
8176 complain))
8177 return error_mark_node;
8178 if (processing_template_decl)
8179 return expr;
8180 return convert_ptrmem (type, expr, /*allow_inverse_p=*/1,
8181 c_cast_p, complain);
8182 }
8183 }
8184
8185 /* [expr.static.cast]
8186
8187 An rvalue of type "pointer to cv void" can be explicitly
8188 converted to a pointer to object type. A value of type pointer
8189 to object converted to "pointer to cv void" and back to the
8190 original pointer type will have its original value. */
8191 if (TYPE_PTR_P (intype)
8192 && VOID_TYPE_P (TREE_TYPE (intype))
8193 && TYPE_PTROB_P (type))
8194 {
8195 if (!c_cast_p
8196 && check_for_casting_away_constness (loc, intype, type,
8197 STATIC_CAST_EXPR,
8198 complain))
8199 return error_mark_node;
8200 if (processing_template_decl)
8201 return expr;
8202 return build_nop (type, expr);
8203 }
8204
8205 *valid_p = false;
8206 return error_mark_node;
8207 }
8208
8209 /* Return an expression representing static_cast<TYPE>(EXPR). */
8210
8211 tree
build_static_cast(location_t loc,tree type,tree oexpr,tsubst_flags_t complain)8212 build_static_cast (location_t loc, tree type, tree oexpr,
8213 tsubst_flags_t complain)
8214 {
8215 tree expr = oexpr;
8216 tree result;
8217 bool valid_p;
8218
8219 if (type == error_mark_node || expr == error_mark_node)
8220 return error_mark_node;
8221
8222 bool dependent = (dependent_type_p (type)
8223 || type_dependent_expression_p (expr));
8224 if (dependent)
8225 {
8226 tmpl:
8227 expr = build_min (STATIC_CAST_EXPR, type, oexpr);
8228 /* We don't know if it will or will not have side effects. */
8229 TREE_SIDE_EFFECTS (expr) = 1;
8230 result = convert_from_reference (expr);
8231 protected_set_expr_location (result, loc);
8232 return result;
8233 }
8234 else if (processing_template_decl)
8235 expr = build_non_dependent_expr (expr);
8236
8237 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
8238 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
8239 if (!TYPE_REF_P (type)
8240 && TREE_CODE (expr) == NOP_EXPR
8241 && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
8242 expr = TREE_OPERAND (expr, 0);
8243
8244 result = build_static_cast_1 (loc, type, expr, /*c_cast_p=*/false,
8245 &valid_p, complain);
8246 if (valid_p)
8247 {
8248 if (result != error_mark_node)
8249 {
8250 maybe_warn_about_useless_cast (loc, type, expr, complain);
8251 maybe_warn_about_cast_ignoring_quals (loc, type, complain);
8252 }
8253 if (processing_template_decl)
8254 goto tmpl;
8255 protected_set_expr_location (result, loc);
8256 return result;
8257 }
8258
8259 if (complain & tf_error)
8260 {
8261 error_at (loc, "invalid %<static_cast%> from type %qT to type %qT",
8262 TREE_TYPE (expr), type);
8263 if ((TYPE_PTR_P (type) || TYPE_REF_P (type))
8264 && CLASS_TYPE_P (TREE_TYPE (type))
8265 && !COMPLETE_TYPE_P (TREE_TYPE (type)))
8266 inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (TREE_TYPE (type))),
8267 "class type %qT is incomplete", TREE_TYPE (type));
8268 tree expr_type = TREE_TYPE (expr);
8269 if (TYPE_PTR_P (expr_type))
8270 expr_type = TREE_TYPE (expr_type);
8271 if (CLASS_TYPE_P (expr_type) && !COMPLETE_TYPE_P (expr_type))
8272 inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (expr_type)),
8273 "class type %qT is incomplete", expr_type);
8274 }
8275 return error_mark_node;
8276 }
8277
8278 /* EXPR is an expression with member function or pointer-to-member
8279 function type. TYPE is a pointer type. Converting EXPR to TYPE is
8280 not permitted by ISO C++, but we accept it in some modes. If we
8281 are not in one of those modes, issue a diagnostic. Return the
8282 converted expression. */
8283
8284 tree
convert_member_func_to_ptr(tree type,tree expr,tsubst_flags_t complain)8285 convert_member_func_to_ptr (tree type, tree expr, tsubst_flags_t complain)
8286 {
8287 tree intype;
8288 tree decl;
8289
8290 intype = TREE_TYPE (expr);
8291 gcc_assert (TYPE_PTRMEMFUNC_P (intype)
8292 || TREE_CODE (intype) == METHOD_TYPE);
8293
8294 if (!(complain & tf_warning_or_error))
8295 return error_mark_node;
8296
8297 location_t loc = cp_expr_loc_or_input_loc (expr);
8298
8299 if (pedantic || warn_pmf2ptr)
8300 pedwarn (loc, pedantic ? OPT_Wpedantic : OPT_Wpmf_conversions,
8301 "converting from %qH to %qI", intype, type);
8302
8303 STRIP_ANY_LOCATION_WRAPPER (expr);
8304
8305 if (TREE_CODE (intype) == METHOD_TYPE)
8306 expr = build_addr_func (expr, complain);
8307 else if (TREE_CODE (expr) == PTRMEM_CST)
8308 expr = build_address (PTRMEM_CST_MEMBER (expr));
8309 else
8310 {
8311 decl = maybe_dummy_object (TYPE_PTRMEM_CLASS_TYPE (intype), 0);
8312 decl = build_address (decl);
8313 expr = get_member_function_from_ptrfunc (&decl, expr, complain);
8314 }
8315
8316 if (expr == error_mark_node)
8317 return error_mark_node;
8318
8319 expr = build_nop (type, expr);
8320 SET_EXPR_LOCATION (expr, loc);
8321 return expr;
8322 }
8323
8324 /* Build a NOP_EXPR to TYPE, but mark it as a reinterpret_cast so that
8325 constexpr evaluation knows to reject it. */
8326
8327 static tree
build_nop_reinterpret(tree type,tree expr)8328 build_nop_reinterpret (tree type, tree expr)
8329 {
8330 tree ret = build_nop (type, expr);
8331 if (ret != expr)
8332 REINTERPRET_CAST_P (ret) = true;
8333 return ret;
8334 }
8335
8336 /* Return a representation for a reinterpret_cast from EXPR to TYPE.
8337 If C_CAST_P is true, this reinterpret cast is being done as part of
8338 a C-style cast. If VALID_P is non-NULL, *VALID_P is set to
8339 indicate whether or not reinterpret_cast was valid. */
8340
8341 static tree
build_reinterpret_cast_1(location_t loc,tree type,tree expr,bool c_cast_p,bool * valid_p,tsubst_flags_t complain)8342 build_reinterpret_cast_1 (location_t loc, tree type, tree expr,
8343 bool c_cast_p, bool *valid_p,
8344 tsubst_flags_t complain)
8345 {
8346 tree intype;
8347
8348 /* Assume the cast is invalid. */
8349 if (valid_p)
8350 *valid_p = true;
8351
8352 if (type == error_mark_node || error_operand_p (expr))
8353 return error_mark_node;
8354
8355 intype = TREE_TYPE (expr);
8356
8357 /* Save casted types in the function's used types hash table. */
8358 used_types_insert (type);
8359
8360 /* A prvalue of non-class type is cv-unqualified. */
8361 if (!CLASS_TYPE_P (type))
8362 type = cv_unqualified (type);
8363
8364 /* [expr.reinterpret.cast]
8365 A glvalue of type T1, designating an object x, can be cast to the type
8366 "reference to T2" if an expression of type "pointer to T1" can be
8367 explicitly converted to the type "pointer to T2" using a reinterpret_cast.
8368 The result is that of *reinterpret_cast<T2 *>(p) where p is a pointer to x
8369 of type "pointer to T1". No temporary is created, no copy is made, and no
8370 constructors (11.4.4) or conversion functions (11.4.7) are called. */
8371 if (TYPE_REF_P (type))
8372 {
8373 if (!glvalue_p (expr))
8374 {
8375 if (complain & tf_error)
8376 error_at (loc, "invalid cast of a prvalue expression of type "
8377 "%qT to type %qT",
8378 intype, type);
8379 return error_mark_node;
8380 }
8381
8382 /* Warn about a reinterpret_cast from "A*" to "B&" if "A" and
8383 "B" are related class types; the reinterpret_cast does not
8384 adjust the pointer. */
8385 if (TYPE_PTR_P (intype)
8386 && (complain & tf_warning)
8387 && (comptypes (TREE_TYPE (intype), TREE_TYPE (type),
8388 COMPARE_BASE | COMPARE_DERIVED)))
8389 warning_at (loc, 0, "casting %qT to %qT does not dereference pointer",
8390 intype, type);
8391
8392 expr = cp_build_addr_expr (expr, complain);
8393
8394 if (warn_strict_aliasing > 2)
8395 cp_strict_aliasing_warning (EXPR_LOCATION (expr), type, expr);
8396
8397 if (expr != error_mark_node)
8398 expr = build_reinterpret_cast_1
8399 (loc, build_pointer_type (TREE_TYPE (type)), expr, c_cast_p,
8400 valid_p, complain);
8401 if (expr != error_mark_node)
8402 /* cp_build_indirect_ref isn't right for rvalue refs. */
8403 expr = convert_from_reference (fold_convert (type, expr));
8404 return expr;
8405 }
8406
8407 /* As a G++ extension, we consider conversions from member
8408 functions, and pointers to member functions to
8409 pointer-to-function and pointer-to-void types. If
8410 -Wno-pmf-conversions has not been specified,
8411 convert_member_func_to_ptr will issue an error message. */
8412 if ((TYPE_PTRMEMFUNC_P (intype)
8413 || TREE_CODE (intype) == METHOD_TYPE)
8414 && TYPE_PTR_P (type)
8415 && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
8416 || VOID_TYPE_P (TREE_TYPE (type))))
8417 return convert_member_func_to_ptr (type, expr, complain);
8418
8419 /* If the cast is not to a reference type, the lvalue-to-rvalue,
8420 array-to-pointer, and function-to-pointer conversions are
8421 performed. */
8422 expr = decay_conversion (expr, complain);
8423
8424 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
8425 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
8426 if (TREE_CODE (expr) == NOP_EXPR
8427 && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
8428 expr = TREE_OPERAND (expr, 0);
8429
8430 if (error_operand_p (expr))
8431 return error_mark_node;
8432
8433 intype = TREE_TYPE (expr);
8434
8435 /* [expr.reinterpret.cast]
8436 A pointer can be converted to any integral type large enough to
8437 hold it. ... A value of type std::nullptr_t can be converted to
8438 an integral type; the conversion has the same meaning and
8439 validity as a conversion of (void*)0 to the integral type. */
8440 if (CP_INTEGRAL_TYPE_P (type)
8441 && (TYPE_PTR_P (intype) || NULLPTR_TYPE_P (intype)))
8442 {
8443 if (TYPE_PRECISION (type) < TYPE_PRECISION (intype))
8444 {
8445 if (complain & tf_error)
8446 permerror (loc, "cast from %qH to %qI loses precision",
8447 intype, type);
8448 else
8449 return error_mark_node;
8450 }
8451 if (NULLPTR_TYPE_P (intype))
8452 return build_int_cst (type, 0);
8453 }
8454 /* [expr.reinterpret.cast]
8455 A value of integral or enumeration type can be explicitly
8456 converted to a pointer. */
8457 else if (TYPE_PTR_P (type) && INTEGRAL_OR_ENUMERATION_TYPE_P (intype))
8458 /* OK */
8459 ;
8460 else if ((INTEGRAL_OR_ENUMERATION_TYPE_P (type)
8461 || TYPE_PTR_OR_PTRMEM_P (type))
8462 && same_type_p (type, intype))
8463 /* DR 799 */
8464 return rvalue (expr);
8465 else if (TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype))
8466 {
8467 if ((complain & tf_warning)
8468 && !cxx_safe_function_type_cast_p (TREE_TYPE (type),
8469 TREE_TYPE (intype)))
8470 warning_at (loc, OPT_Wcast_function_type,
8471 "cast between incompatible function types"
8472 " from %qH to %qI", intype, type);
8473 return build_nop_reinterpret (type, expr);
8474 }
8475 else if (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype))
8476 {
8477 if ((complain & tf_warning)
8478 && !cxx_safe_function_type_cast_p
8479 (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE_RAW (type)),
8480 TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE_RAW (intype))))
8481 warning_at (loc, OPT_Wcast_function_type,
8482 "cast between incompatible pointer to member types"
8483 " from %qH to %qI", intype, type);
8484 return build_nop_reinterpret (type, expr);
8485 }
8486 else if ((TYPE_PTRDATAMEM_P (type) && TYPE_PTRDATAMEM_P (intype))
8487 || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
8488 {
8489 if (!c_cast_p
8490 && check_for_casting_away_constness (loc, intype, type,
8491 REINTERPRET_CAST_EXPR,
8492 complain))
8493 return error_mark_node;
8494 /* Warn about possible alignment problems. */
8495 if ((STRICT_ALIGNMENT || warn_cast_align == 2)
8496 && (complain & tf_warning)
8497 && !VOID_TYPE_P (type)
8498 && TREE_CODE (TREE_TYPE (intype)) != FUNCTION_TYPE
8499 && COMPLETE_TYPE_P (TREE_TYPE (type))
8500 && COMPLETE_TYPE_P (TREE_TYPE (intype))
8501 && min_align_of_type (TREE_TYPE (type))
8502 > min_align_of_type (TREE_TYPE (intype)))
8503 warning_at (loc, OPT_Wcast_align, "cast from %qH to %qI "
8504 "increases required alignment of target type",
8505 intype, type);
8506
8507 if (warn_strict_aliasing <= 2)
8508 /* strict_aliasing_warning STRIP_NOPs its expr. */
8509 cp_strict_aliasing_warning (EXPR_LOCATION (expr), type, expr);
8510
8511 return build_nop_reinterpret (type, expr);
8512 }
8513 else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
8514 || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type)))
8515 {
8516 if (complain & tf_warning)
8517 /* C++11 5.2.10 p8 says that "Converting a function pointer to an
8518 object pointer type or vice versa is conditionally-supported." */
8519 warning_at (loc, OPT_Wconditionally_supported,
8520 "casting between pointer-to-function and "
8521 "pointer-to-object is conditionally-supported");
8522 return build_nop_reinterpret (type, expr);
8523 }
8524 else if (gnu_vector_type_p (type) && scalarish_type_p (intype))
8525 return convert_to_vector (type, rvalue (expr));
8526 else if (gnu_vector_type_p (intype)
8527 && INTEGRAL_OR_ENUMERATION_TYPE_P (type))
8528 return convert_to_integer_nofold (type, expr);
8529 else
8530 {
8531 if (valid_p)
8532 *valid_p = false;
8533 if (complain & tf_error)
8534 error_at (loc, "invalid cast from type %qT to type %qT",
8535 intype, type);
8536 return error_mark_node;
8537 }
8538
8539 expr = cp_convert (type, expr, complain);
8540 if (TREE_CODE (expr) == NOP_EXPR)
8541 /* Mark any nop_expr that created as a reintepret_cast. */
8542 REINTERPRET_CAST_P (expr) = true;
8543 return expr;
8544 }
8545
8546 tree
build_reinterpret_cast(location_t loc,tree type,tree expr,tsubst_flags_t complain)8547 build_reinterpret_cast (location_t loc, tree type, tree expr,
8548 tsubst_flags_t complain)
8549 {
8550 tree r;
8551
8552 if (type == error_mark_node || expr == error_mark_node)
8553 return error_mark_node;
8554
8555 if (processing_template_decl)
8556 {
8557 tree t = build_min (REINTERPRET_CAST_EXPR, type, expr);
8558
8559 if (!TREE_SIDE_EFFECTS (t)
8560 && type_dependent_expression_p (expr))
8561 /* There might turn out to be side effects inside expr. */
8562 TREE_SIDE_EFFECTS (t) = 1;
8563 r = convert_from_reference (t);
8564 protected_set_expr_location (r, loc);
8565 return r;
8566 }
8567
8568 r = build_reinterpret_cast_1 (loc, type, expr, /*c_cast_p=*/false,
8569 /*valid_p=*/NULL, complain);
8570 if (r != error_mark_node)
8571 {
8572 maybe_warn_about_useless_cast (loc, type, expr, complain);
8573 maybe_warn_about_cast_ignoring_quals (loc, type, complain);
8574 }
8575 protected_set_expr_location (r, loc);
8576 return r;
8577 }
8578
8579 /* Perform a const_cast from EXPR to TYPE. If the cast is valid,
8580 return an appropriate expression. Otherwise, return
8581 error_mark_node. If the cast is not valid, and COMPLAIN is true,
8582 then a diagnostic will be issued. If VALID_P is non-NULL, we are
8583 performing a C-style cast, its value upon return will indicate
8584 whether or not the conversion succeeded. */
8585
8586 static tree
build_const_cast_1(location_t loc,tree dst_type,tree expr,tsubst_flags_t complain,bool * valid_p)8587 build_const_cast_1 (location_t loc, tree dst_type, tree expr,
8588 tsubst_flags_t complain, bool *valid_p)
8589 {
8590 tree src_type;
8591 tree reference_type;
8592
8593 /* Callers are responsible for handling error_mark_node as a
8594 destination type. */
8595 gcc_assert (dst_type != error_mark_node);
8596 /* In a template, callers should be building syntactic
8597 representations of casts, not using this machinery. */
8598 gcc_assert (!processing_template_decl);
8599
8600 /* Assume the conversion is invalid. */
8601 if (valid_p)
8602 *valid_p = false;
8603
8604 if (!INDIRECT_TYPE_P (dst_type) && !TYPE_PTRDATAMEM_P (dst_type))
8605 {
8606 if (complain & tf_error)
8607 error_at (loc, "invalid use of %<const_cast%> with type %qT, "
8608 "which is not a pointer, reference, "
8609 "nor a pointer-to-data-member type", dst_type);
8610 return error_mark_node;
8611 }
8612
8613 if (TREE_CODE (TREE_TYPE (dst_type)) == FUNCTION_TYPE)
8614 {
8615 if (complain & tf_error)
8616 error_at (loc, "invalid use of %<const_cast%> with type %qT, "
8617 "which is a pointer or reference to a function type",
8618 dst_type);
8619 return error_mark_node;
8620 }
8621
8622 /* A prvalue of non-class type is cv-unqualified. */
8623 dst_type = cv_unqualified (dst_type);
8624
8625 /* Save casted types in the function's used types hash table. */
8626 used_types_insert (dst_type);
8627
8628 src_type = TREE_TYPE (expr);
8629 /* Expressions do not really have reference types. */
8630 if (TYPE_REF_P (src_type))
8631 src_type = TREE_TYPE (src_type);
8632
8633 /* [expr.const.cast]
8634
8635 For two object types T1 and T2, if a pointer to T1 can be explicitly
8636 converted to the type "pointer to T2" using a const_cast, then the
8637 following conversions can also be made:
8638
8639 -- an lvalue of type T1 can be explicitly converted to an lvalue of
8640 type T2 using the cast const_cast<T2&>;
8641
8642 -- a glvalue of type T1 can be explicitly converted to an xvalue of
8643 type T2 using the cast const_cast<T2&&>; and
8644
8645 -- if T1 is a class type, a prvalue of type T1 can be explicitly
8646 converted to an xvalue of type T2 using the cast const_cast<T2&&>. */
8647
8648 if (TYPE_REF_P (dst_type))
8649 {
8650 reference_type = dst_type;
8651 if (!TYPE_REF_IS_RVALUE (dst_type)
8652 ? lvalue_p (expr)
8653 : obvalue_p (expr))
8654 /* OK. */;
8655 else
8656 {
8657 if (complain & tf_error)
8658 error_at (loc, "invalid %<const_cast%> of an rvalue of type %qT "
8659 "to type %qT",
8660 src_type, dst_type);
8661 return error_mark_node;
8662 }
8663 dst_type = build_pointer_type (TREE_TYPE (dst_type));
8664 src_type = build_pointer_type (src_type);
8665 }
8666 else
8667 {
8668 reference_type = NULL_TREE;
8669 /* If the destination type is not a reference type, the
8670 lvalue-to-rvalue, array-to-pointer, and function-to-pointer
8671 conversions are performed. */
8672 src_type = type_decays_to (src_type);
8673 if (src_type == error_mark_node)
8674 return error_mark_node;
8675 }
8676
8677 if (TYPE_PTR_P (src_type) || TYPE_PTRDATAMEM_P (src_type))
8678 {
8679 if (comp_ptr_ttypes_const (dst_type, src_type, bounds_none))
8680 {
8681 if (valid_p)
8682 {
8683 *valid_p = true;
8684 /* This cast is actually a C-style cast. Issue a warning if
8685 the user is making a potentially unsafe cast. */
8686 check_for_casting_away_constness (loc, src_type, dst_type,
8687 CAST_EXPR, complain);
8688 /* ??? comp_ptr_ttypes_const ignores TYPE_ALIGN. */
8689 if ((STRICT_ALIGNMENT || warn_cast_align == 2)
8690 && (complain & tf_warning)
8691 && min_align_of_type (TREE_TYPE (dst_type))
8692 > min_align_of_type (TREE_TYPE (src_type)))
8693 warning_at (loc, OPT_Wcast_align, "cast from %qH to %qI "
8694 "increases required alignment of target type",
8695 src_type, dst_type);
8696 }
8697 if (reference_type)
8698 {
8699 expr = cp_build_addr_expr (expr, complain);
8700 if (expr == error_mark_node)
8701 return error_mark_node;
8702 expr = build_nop (reference_type, expr);
8703 return convert_from_reference (expr);
8704 }
8705 else
8706 {
8707 expr = decay_conversion (expr, complain);
8708 if (expr == error_mark_node)
8709 return error_mark_node;
8710
8711 /* build_c_cast puts on a NOP_EXPR to make the result not an
8712 lvalue. Strip such NOP_EXPRs if VALUE is being used in
8713 non-lvalue context. */
8714 if (TREE_CODE (expr) == NOP_EXPR
8715 && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
8716 expr = TREE_OPERAND (expr, 0);
8717 return build_nop (dst_type, expr);
8718 }
8719 }
8720 else if (valid_p
8721 && !at_least_as_qualified_p (TREE_TYPE (dst_type),
8722 TREE_TYPE (src_type)))
8723 check_for_casting_away_constness (loc, src_type, dst_type,
8724 CAST_EXPR, complain);
8725 }
8726
8727 if (complain & tf_error)
8728 error_at (loc, "invalid %<const_cast%> from type %qT to type %qT",
8729 src_type, dst_type);
8730 return error_mark_node;
8731 }
8732
8733 tree
build_const_cast(location_t loc,tree type,tree expr,tsubst_flags_t complain)8734 build_const_cast (location_t loc, tree type, tree expr,
8735 tsubst_flags_t complain)
8736 {
8737 tree r;
8738
8739 if (type == error_mark_node || error_operand_p (expr))
8740 return error_mark_node;
8741
8742 if (processing_template_decl)
8743 {
8744 tree t = build_min (CONST_CAST_EXPR, type, expr);
8745
8746 if (!TREE_SIDE_EFFECTS (t)
8747 && type_dependent_expression_p (expr))
8748 /* There might turn out to be side effects inside expr. */
8749 TREE_SIDE_EFFECTS (t) = 1;
8750 r = convert_from_reference (t);
8751 protected_set_expr_location (r, loc);
8752 return r;
8753 }
8754
8755 r = build_const_cast_1 (loc, type, expr, complain, /*valid_p=*/NULL);
8756 if (r != error_mark_node)
8757 {
8758 maybe_warn_about_useless_cast (loc, type, expr, complain);
8759 maybe_warn_about_cast_ignoring_quals (loc, type, complain);
8760 }
8761 protected_set_expr_location (r, loc);
8762 return r;
8763 }
8764
8765 /* Like cp_build_c_cast, but for the c-common bits. */
8766
8767 tree
build_c_cast(location_t loc,tree type,tree expr)8768 build_c_cast (location_t loc, tree type, tree expr)
8769 {
8770 return cp_build_c_cast (loc, type, expr, tf_warning_or_error);
8771 }
8772
8773 /* Like the "build_c_cast" used for c-common, but using cp_expr to
8774 preserve location information even for tree nodes that don't
8775 support it. */
8776
8777 cp_expr
build_c_cast(location_t loc,tree type,cp_expr expr)8778 build_c_cast (location_t loc, tree type, cp_expr expr)
8779 {
8780 cp_expr result = cp_build_c_cast (loc, type, expr, tf_warning_or_error);
8781 result.set_location (loc);
8782 return result;
8783 }
8784
8785 /* Build an expression representing an explicit C-style cast to type
8786 TYPE of expression EXPR. */
8787
8788 tree
cp_build_c_cast(location_t loc,tree type,tree expr,tsubst_flags_t complain)8789 cp_build_c_cast (location_t loc, tree type, tree expr,
8790 tsubst_flags_t complain)
8791 {
8792 tree value = expr;
8793 tree result;
8794 bool valid_p;
8795
8796 if (type == error_mark_node || error_operand_p (expr))
8797 return error_mark_node;
8798
8799 if (processing_template_decl)
8800 {
8801 tree t = build_min (CAST_EXPR, type,
8802 tree_cons (NULL_TREE, value, NULL_TREE));
8803 /* We don't know if it will or will not have side effects. */
8804 TREE_SIDE_EFFECTS (t) = 1;
8805 return convert_from_reference (t);
8806 }
8807
8808 /* Casts to a (pointer to a) specific ObjC class (or 'id' or
8809 'Class') should always be retained, because this information aids
8810 in method lookup. */
8811 if (objc_is_object_ptr (type)
8812 && objc_is_object_ptr (TREE_TYPE (expr)))
8813 return build_nop (type, expr);
8814
8815 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
8816 Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
8817 if (!TYPE_REF_P (type)
8818 && TREE_CODE (value) == NOP_EXPR
8819 && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
8820 value = TREE_OPERAND (value, 0);
8821
8822 if (TREE_CODE (type) == ARRAY_TYPE)
8823 {
8824 /* Allow casting from T1* to T2[] because Cfront allows it.
8825 NIHCL uses it. It is not valid ISO C++ however. */
8826 if (TYPE_PTR_P (TREE_TYPE (expr)))
8827 {
8828 if (complain & tf_error)
8829 permerror (loc, "ISO C++ forbids casting to an array type %qT",
8830 type);
8831 else
8832 return error_mark_node;
8833 type = build_pointer_type (TREE_TYPE (type));
8834 }
8835 else
8836 {
8837 if (complain & tf_error)
8838 error_at (loc, "ISO C++ forbids casting to an array type %qT",
8839 type);
8840 return error_mark_node;
8841 }
8842 }
8843
8844 if (FUNC_OR_METHOD_TYPE_P (type))
8845 {
8846 if (complain & tf_error)
8847 error_at (loc, "invalid cast to function type %qT", type);
8848 return error_mark_node;
8849 }
8850
8851 if (TYPE_PTR_P (type)
8852 && TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE
8853 /* Casting to an integer of smaller size is an error detected elsewhere. */
8854 && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (value))
8855 /* Don't warn about converting any constant. */
8856 && !TREE_CONSTANT (value))
8857 warning_at (loc, OPT_Wint_to_pointer_cast,
8858 "cast to pointer from integer of different size");
8859
8860 /* A C-style cast can be a const_cast. */
8861 result = build_const_cast_1 (loc, type, value, complain & tf_warning,
8862 &valid_p);
8863 if (valid_p)
8864 {
8865 if (result != error_mark_node)
8866 {
8867 maybe_warn_about_useless_cast (loc, type, value, complain);
8868 maybe_warn_about_cast_ignoring_quals (loc, type, complain);
8869 }
8870 return result;
8871 }
8872
8873 /* Or a static cast. */
8874 result = build_static_cast_1 (loc, type, value, /*c_cast_p=*/true,
8875 &valid_p, complain);
8876 /* Or a reinterpret_cast. */
8877 if (!valid_p)
8878 result = build_reinterpret_cast_1 (loc, type, value, /*c_cast_p=*/true,
8879 &valid_p, complain);
8880 /* The static_cast or reinterpret_cast may be followed by a
8881 const_cast. */
8882 if (valid_p
8883 /* A valid cast may result in errors if, for example, a
8884 conversion to an ambiguous base class is required. */
8885 && !error_operand_p (result))
8886 {
8887 tree result_type;
8888
8889 maybe_warn_about_useless_cast (loc, type, value, complain);
8890 maybe_warn_about_cast_ignoring_quals (loc, type, complain);
8891
8892 /* Non-class rvalues always have cv-unqualified type. */
8893 if (!CLASS_TYPE_P (type))
8894 type = TYPE_MAIN_VARIANT (type);
8895 result_type = TREE_TYPE (result);
8896 if (!CLASS_TYPE_P (result_type) && !TYPE_REF_P (type))
8897 result_type = TYPE_MAIN_VARIANT (result_type);
8898 /* If the type of RESULT does not match TYPE, perform a
8899 const_cast to make it match. If the static_cast or
8900 reinterpret_cast succeeded, we will differ by at most
8901 cv-qualification, so the follow-on const_cast is guaranteed
8902 to succeed. */
8903 if (!same_type_p (non_reference (type), non_reference (result_type)))
8904 {
8905 result = build_const_cast_1 (loc, type, result, false, &valid_p);
8906 gcc_assert (valid_p);
8907 }
8908 return result;
8909 }
8910
8911 return error_mark_node;
8912 }
8913
8914 /* For use from the C common bits. */
8915 tree
build_modify_expr(location_t location,tree lhs,tree,enum tree_code modifycode,location_t,tree rhs,tree)8916 build_modify_expr (location_t location,
8917 tree lhs, tree /*lhs_origtype*/,
8918 enum tree_code modifycode,
8919 location_t /*rhs_location*/, tree rhs,
8920 tree /*rhs_origtype*/)
8921 {
8922 return cp_build_modify_expr (location, lhs, modifycode, rhs,
8923 tf_warning_or_error);
8924 }
8925
8926 /* Build an assignment expression of lvalue LHS from value RHS.
8927 MODIFYCODE is the code for a binary operator that we use
8928 to combine the old value of LHS with RHS to get the new value.
8929 Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
8930
8931 C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed. */
8932
8933 tree
cp_build_modify_expr(location_t loc,tree lhs,enum tree_code modifycode,tree rhs,tsubst_flags_t complain)8934 cp_build_modify_expr (location_t loc, tree lhs, enum tree_code modifycode,
8935 tree rhs, tsubst_flags_t complain)
8936 {
8937 lhs = mark_lvalue_use_nonread (lhs);
8938
8939 tree result = NULL_TREE;
8940 tree newrhs = rhs;
8941 tree lhstype = TREE_TYPE (lhs);
8942 tree olhs = lhs;
8943 tree olhstype = lhstype;
8944 bool plain_assign = (modifycode == NOP_EXPR);
8945 bool compound_side_effects_p = false;
8946 tree preeval = NULL_TREE;
8947
8948 /* Avoid duplicate error messages from operands that had errors. */
8949 if (error_operand_p (lhs) || error_operand_p (rhs))
8950 return error_mark_node;
8951
8952 while (TREE_CODE (lhs) == COMPOUND_EXPR)
8953 {
8954 if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
8955 compound_side_effects_p = true;
8956 lhs = TREE_OPERAND (lhs, 1);
8957 }
8958
8959 /* Handle control structure constructs used as "lvalues". Note that we
8960 leave COMPOUND_EXPR on the LHS because it is sequenced after the RHS. */
8961 switch (TREE_CODE (lhs))
8962 {
8963 /* Handle --foo = 5; as these are valid constructs in C++. */
8964 case PREDECREMENT_EXPR:
8965 case PREINCREMENT_EXPR:
8966 if (compound_side_effects_p)
8967 newrhs = rhs = stabilize_expr (rhs, &preeval);
8968 lhs = genericize_compound_lvalue (lhs);
8969 maybe_add_compound:
8970 /* If we had (bar, --foo) = 5; or (bar, (baz, --foo)) = 5;
8971 and looked through the COMPOUND_EXPRs, readd them now around
8972 the resulting lhs. */
8973 if (TREE_CODE (olhs) == COMPOUND_EXPR)
8974 {
8975 lhs = build2 (COMPOUND_EXPR, lhstype, TREE_OPERAND (olhs, 0), lhs);
8976 tree *ptr = &TREE_OPERAND (lhs, 1);
8977 for (olhs = TREE_OPERAND (olhs, 1);
8978 TREE_CODE (olhs) == COMPOUND_EXPR;
8979 olhs = TREE_OPERAND (olhs, 1))
8980 {
8981 *ptr = build2 (COMPOUND_EXPR, lhstype,
8982 TREE_OPERAND (olhs, 0), *ptr);
8983 ptr = &TREE_OPERAND (*ptr, 1);
8984 }
8985 }
8986 break;
8987
8988 case MODIFY_EXPR:
8989 if (compound_side_effects_p)
8990 newrhs = rhs = stabilize_expr (rhs, &preeval);
8991 lhs = genericize_compound_lvalue (lhs);
8992 goto maybe_add_compound;
8993
8994 case MIN_EXPR:
8995 case MAX_EXPR:
8996 /* MIN_EXPR and MAX_EXPR are currently only permitted as lvalues,
8997 when neither operand has side-effects. */
8998 if (!lvalue_or_else (lhs, lv_assign, complain))
8999 return error_mark_node;
9000
9001 gcc_assert (!TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0))
9002 && !TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 1)));
9003
9004 lhs = build3 (COND_EXPR, TREE_TYPE (lhs),
9005 build2 (TREE_CODE (lhs) == MIN_EXPR ? LE_EXPR : GE_EXPR,
9006 boolean_type_node,
9007 TREE_OPERAND (lhs, 0),
9008 TREE_OPERAND (lhs, 1)),
9009 TREE_OPERAND (lhs, 0),
9010 TREE_OPERAND (lhs, 1));
9011 gcc_fallthrough ();
9012
9013 /* Handle (a ? b : c) used as an "lvalue". */
9014 case COND_EXPR:
9015 {
9016 /* Produce (a ? (b = rhs) : (c = rhs))
9017 except that the RHS goes through a save-expr
9018 so the code to compute it is only emitted once. */
9019 if (VOID_TYPE_P (TREE_TYPE (rhs)))
9020 {
9021 if (complain & tf_error)
9022 error_at (cp_expr_loc_or_loc (rhs, loc),
9023 "void value not ignored as it ought to be");
9024 return error_mark_node;
9025 }
9026
9027 rhs = stabilize_expr (rhs, &preeval);
9028
9029 /* Check this here to avoid odd errors when trying to convert
9030 a throw to the type of the COND_EXPR. */
9031 if (!lvalue_or_else (lhs, lv_assign, complain))
9032 return error_mark_node;
9033
9034 tree op1 = TREE_OPERAND (lhs, 1);
9035 if (TREE_CODE (op1) != THROW_EXPR)
9036 op1 = cp_build_modify_expr (loc, op1, modifycode, rhs, complain);
9037 /* When sanitizing undefined behavior, even when rhs doesn't need
9038 stabilization at this point, the sanitization might add extra
9039 SAVE_EXPRs in there and so make sure there is no tree sharing
9040 in the rhs, otherwise those SAVE_EXPRs will have initialization
9041 only in one of the two branches. */
9042 if (sanitize_flags_p (SANITIZE_UNDEFINED
9043 | SANITIZE_UNDEFINED_NONDEFAULT))
9044 rhs = unshare_expr (rhs);
9045 tree op2 = TREE_OPERAND (lhs, 2);
9046 if (TREE_CODE (op2) != THROW_EXPR)
9047 op2 = cp_build_modify_expr (loc, op2, modifycode, rhs, complain);
9048 tree cond = build_conditional_expr (input_location,
9049 TREE_OPERAND (lhs, 0), op1, op2,
9050 complain);
9051
9052 if (cond == error_mark_node)
9053 return cond;
9054 /* If we had (e, (a ? b : c)) = d; or (e, (f, (a ? b : c))) = d;
9055 and looked through the COMPOUND_EXPRs, readd them now around
9056 the resulting cond before adding the preevaluated rhs. */
9057 if (TREE_CODE (olhs) == COMPOUND_EXPR)
9058 {
9059 cond = build2 (COMPOUND_EXPR, TREE_TYPE (cond),
9060 TREE_OPERAND (olhs, 0), cond);
9061 tree *ptr = &TREE_OPERAND (cond, 1);
9062 for (olhs = TREE_OPERAND (olhs, 1);
9063 TREE_CODE (olhs) == COMPOUND_EXPR;
9064 olhs = TREE_OPERAND (olhs, 1))
9065 {
9066 *ptr = build2 (COMPOUND_EXPR, TREE_TYPE (cond),
9067 TREE_OPERAND (olhs, 0), *ptr);
9068 ptr = &TREE_OPERAND (*ptr, 1);
9069 }
9070 }
9071 /* Make sure the code to compute the rhs comes out
9072 before the split. */
9073 result = cond;
9074 goto ret;
9075 }
9076
9077 default:
9078 lhs = olhs;
9079 break;
9080 }
9081
9082 if (modifycode == INIT_EXPR)
9083 {
9084 if (BRACE_ENCLOSED_INITIALIZER_P (rhs))
9085 /* Do the default thing. */;
9086 else if (TREE_CODE (rhs) == CONSTRUCTOR)
9087 {
9088 /* Compound literal. */
9089 if (! same_type_p (TREE_TYPE (rhs), lhstype))
9090 /* Call convert to generate an error; see PR 11063. */
9091 rhs = convert (lhstype, rhs);
9092 result = build2 (INIT_EXPR, lhstype, lhs, rhs);
9093 TREE_SIDE_EFFECTS (result) = 1;
9094 goto ret;
9095 }
9096 else if (! MAYBE_CLASS_TYPE_P (lhstype))
9097 /* Do the default thing. */;
9098 else
9099 {
9100 releasing_vec rhs_vec = make_tree_vector_single (rhs);
9101 result = build_special_member_call (lhs, complete_ctor_identifier,
9102 &rhs_vec, lhstype, LOOKUP_NORMAL,
9103 complain);
9104 if (result == NULL_TREE)
9105 return error_mark_node;
9106 goto ret;
9107 }
9108 }
9109 else
9110 {
9111 lhs = require_complete_type_sfinae (lhs, complain);
9112 if (lhs == error_mark_node)
9113 return error_mark_node;
9114
9115 if (modifycode == NOP_EXPR)
9116 {
9117 if (c_dialect_objc ())
9118 {
9119 result = objc_maybe_build_modify_expr (lhs, rhs);
9120 if (result)
9121 goto ret;
9122 }
9123
9124 /* `operator=' is not an inheritable operator. */
9125 if (! MAYBE_CLASS_TYPE_P (lhstype))
9126 /* Do the default thing. */;
9127 else
9128 {
9129 result = build_new_op (input_location, MODIFY_EXPR,
9130 LOOKUP_NORMAL, lhs, rhs,
9131 make_node (NOP_EXPR), NULL_TREE,
9132 /*overload=*/NULL, complain);
9133 if (result == NULL_TREE)
9134 return error_mark_node;
9135 goto ret;
9136 }
9137 lhstype = olhstype;
9138 }
9139 else
9140 {
9141 tree init = NULL_TREE;
9142
9143 /* A binary op has been requested. Combine the old LHS
9144 value with the RHS producing the value we should actually
9145 store into the LHS. */
9146 gcc_assert (!((TYPE_REF_P (lhstype)
9147 && MAYBE_CLASS_TYPE_P (TREE_TYPE (lhstype)))
9148 || MAYBE_CLASS_TYPE_P (lhstype)));
9149
9150 /* An expression of the form E1 op= E2. [expr.ass] says:
9151 "Such expressions are deprecated if E1 has volatile-qualified
9152 type and op is not one of the bitwise operators |, &, ^."
9153 We warn here rather than in cp_genericize_r because
9154 for compound assignments we are supposed to warn even if the
9155 assignment is a discarded-value expression. */
9156 if (modifycode != BIT_AND_EXPR
9157 && modifycode != BIT_IOR_EXPR
9158 && modifycode != BIT_XOR_EXPR
9159 && (TREE_THIS_VOLATILE (lhs) || CP_TYPE_VOLATILE_P (lhstype)))
9160 warning_at (loc, OPT_Wvolatile,
9161 "compound assignment with %<volatile%>-qualified left "
9162 "operand is deprecated");
9163 /* Preevaluate the RHS to make sure its evaluation is complete
9164 before the lvalue-to-rvalue conversion of the LHS:
9165
9166 [expr.ass] With respect to an indeterminately-sequenced
9167 function call, the operation of a compound assignment is a
9168 single evaluation. [ Note: Therefore, a function call shall
9169 not intervene between the lvalue-to-rvalue conversion and the
9170 side effect associated with any single compound assignment
9171 operator. -- end note ] */
9172 lhs = cp_stabilize_reference (lhs);
9173 rhs = decay_conversion (rhs, complain);
9174 if (rhs == error_mark_node)
9175 return error_mark_node;
9176 rhs = stabilize_expr (rhs, &init);
9177 newrhs = cp_build_binary_op (loc, modifycode, lhs, rhs, complain);
9178 if (newrhs == error_mark_node)
9179 {
9180 if (complain & tf_error)
9181 inform (loc, " in evaluation of %<%Q(%#T, %#T)%>",
9182 modifycode, TREE_TYPE (lhs), TREE_TYPE (rhs));
9183 return error_mark_node;
9184 }
9185
9186 if (init)
9187 newrhs = build2 (COMPOUND_EXPR, TREE_TYPE (newrhs), init, newrhs);
9188
9189 /* Now it looks like a plain assignment. */
9190 modifycode = NOP_EXPR;
9191 if (c_dialect_objc ())
9192 {
9193 result = objc_maybe_build_modify_expr (lhs, newrhs);
9194 if (result)
9195 goto ret;
9196 }
9197 }
9198 gcc_assert (!TYPE_REF_P (lhstype));
9199 gcc_assert (!TYPE_REF_P (TREE_TYPE (newrhs)));
9200 }
9201
9202 /* The left-hand side must be an lvalue. */
9203 if (!lvalue_or_else (lhs, lv_assign, complain))
9204 return error_mark_node;
9205
9206 /* Warn about modifying something that is `const'. Don't warn if
9207 this is initialization. */
9208 if (modifycode != INIT_EXPR
9209 && (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype)
9210 /* Functions are not modifiable, even though they are
9211 lvalues. */
9212 || FUNC_OR_METHOD_TYPE_P (TREE_TYPE (lhs))
9213 /* If it's an aggregate and any field is const, then it is
9214 effectively const. */
9215 || (CLASS_TYPE_P (lhstype)
9216 && C_TYPE_FIELDS_READONLY (lhstype))))
9217 {
9218 if (complain & tf_error)
9219 cxx_readonly_error (loc, lhs, lv_assign);
9220 return error_mark_node;
9221 }
9222
9223 /* If storing into a structure or union member, it may have been given a
9224 lowered bitfield type. We need to convert to the declared type first,
9225 so retrieve it now. */
9226
9227 olhstype = unlowered_expr_type (lhs);
9228
9229 /* Convert new value to destination type. */
9230
9231 if (TREE_CODE (lhstype) == ARRAY_TYPE)
9232 {
9233 int from_array;
9234
9235 if (BRACE_ENCLOSED_INITIALIZER_P (newrhs))
9236 {
9237 if (modifycode != INIT_EXPR)
9238 {
9239 if (complain & tf_error)
9240 error_at (loc,
9241 "assigning to an array from an initializer list");
9242 return error_mark_node;
9243 }
9244 if (check_array_initializer (lhs, lhstype, newrhs))
9245 return error_mark_node;
9246 newrhs = digest_init (lhstype, newrhs, complain);
9247 if (newrhs == error_mark_node)
9248 return error_mark_node;
9249 }
9250
9251 /* C++11 8.5/17: "If the destination type is an array of characters,
9252 an array of char16_t, an array of char32_t, or an array of wchar_t,
9253 and the initializer is a string literal...". */
9254 else if ((TREE_CODE (tree_strip_any_location_wrapper (newrhs))
9255 == STRING_CST)
9256 && char_type_p (TREE_TYPE (TYPE_MAIN_VARIANT (lhstype)))
9257 && modifycode == INIT_EXPR)
9258 {
9259 newrhs = digest_init (lhstype, newrhs, complain);
9260 if (newrhs == error_mark_node)
9261 return error_mark_node;
9262 }
9263
9264 else if (!same_or_base_type_p (TYPE_MAIN_VARIANT (lhstype),
9265 TYPE_MAIN_VARIANT (TREE_TYPE (newrhs))))
9266 {
9267 if (complain & tf_error)
9268 error_at (loc, "incompatible types in assignment of %qT to %qT",
9269 TREE_TYPE (rhs), lhstype);
9270 return error_mark_node;
9271 }
9272
9273 /* Allow array assignment in compiler-generated code. */
9274 else if (DECL_P (lhs) && DECL_ARTIFICIAL (lhs))
9275 /* OK, used by coroutines (co-await-initlist1.C). */;
9276 else if (!current_function_decl
9277 || !DECL_DEFAULTED_FN (current_function_decl))
9278 {
9279 /* This routine is used for both initialization and assignment.
9280 Make sure the diagnostic message differentiates the context. */
9281 if (complain & tf_error)
9282 {
9283 if (modifycode == INIT_EXPR)
9284 error_at (loc, "array used as initializer");
9285 else
9286 error_at (loc, "invalid array assignment");
9287 }
9288 return error_mark_node;
9289 }
9290
9291 from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
9292 ? 1 + (modifycode != INIT_EXPR): 0;
9293 result = build_vec_init (lhs, NULL_TREE, newrhs,
9294 /*explicit_value_init_p=*/false,
9295 from_array, complain);
9296 goto ret;
9297 }
9298
9299 if (modifycode == INIT_EXPR)
9300 /* Calls with INIT_EXPR are all direct-initialization, so don't set
9301 LOOKUP_ONLYCONVERTING. */
9302 newrhs = convert_for_initialization (lhs, olhstype, newrhs, LOOKUP_NORMAL,
9303 ICR_INIT, NULL_TREE, 0,
9304 complain | tf_no_cleanup);
9305 else
9306 newrhs = convert_for_assignment (olhstype, newrhs, ICR_ASSIGN,
9307 NULL_TREE, 0, complain, LOOKUP_IMPLICIT);
9308
9309 if (!same_type_p (lhstype, olhstype))
9310 newrhs = cp_convert_and_check (lhstype, newrhs, complain);
9311
9312 if (modifycode != INIT_EXPR)
9313 {
9314 if (TREE_CODE (newrhs) == CALL_EXPR
9315 && TYPE_NEEDS_CONSTRUCTING (lhstype))
9316 newrhs = build_cplus_new (lhstype, newrhs, complain);
9317
9318 /* Can't initialize directly from a TARGET_EXPR, since that would
9319 cause the lhs to be constructed twice, and possibly result in
9320 accidental self-initialization. So we force the TARGET_EXPR to be
9321 expanded without a target. */
9322 if (TREE_CODE (newrhs) == TARGET_EXPR)
9323 newrhs = build2 (COMPOUND_EXPR, TREE_TYPE (newrhs), newrhs,
9324 TREE_OPERAND (newrhs, 0));
9325 }
9326
9327 if (newrhs == error_mark_node)
9328 return error_mark_node;
9329
9330 if (c_dialect_objc () && flag_objc_gc)
9331 {
9332 result = objc_generate_write_barrier (lhs, modifycode, newrhs);
9333
9334 if (result)
9335 goto ret;
9336 }
9337
9338 result = build2_loc (loc, modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
9339 lhstype, lhs, newrhs);
9340
9341 TREE_SIDE_EFFECTS (result) = 1;
9342 if (!plain_assign)
9343 suppress_warning (result, OPT_Wparentheses);
9344
9345 ret:
9346 if (preeval)
9347 result = build2 (COMPOUND_EXPR, TREE_TYPE (result), preeval, result);
9348 return result;
9349 }
9350
9351 cp_expr
build_x_modify_expr(location_t loc,tree lhs,enum tree_code modifycode,tree rhs,tree lookups,tsubst_flags_t complain)9352 build_x_modify_expr (location_t loc, tree lhs, enum tree_code modifycode,
9353 tree rhs, tree lookups, tsubst_flags_t complain)
9354 {
9355 tree orig_lhs = lhs;
9356 tree orig_rhs = rhs;
9357 tree overload = NULL_TREE;
9358
9359 if (lhs == error_mark_node || rhs == error_mark_node)
9360 return cp_expr (error_mark_node, loc);
9361
9362 if (processing_template_decl)
9363 {
9364 if (modifycode == NOP_EXPR
9365 || type_dependent_expression_p (lhs)
9366 || type_dependent_expression_p (rhs))
9367 {
9368 tree op = build_min_nt_loc (loc, modifycode, NULL_TREE, NULL_TREE);
9369 tree rval = build_min_nt_loc (loc, MODOP_EXPR, lhs, op, rhs);
9370 if (modifycode != NOP_EXPR)
9371 TREE_TYPE (rval)
9372 = build_dependent_operator_type (lookups, modifycode, true);
9373 return rval;
9374 }
9375
9376 lhs = build_non_dependent_expr (lhs);
9377 rhs = build_non_dependent_expr (rhs);
9378 }
9379
9380 if (modifycode != NOP_EXPR)
9381 {
9382 tree op = build_nt (modifycode, NULL_TREE, NULL_TREE);
9383 tree rval = build_new_op (loc, MODIFY_EXPR, LOOKUP_NORMAL,
9384 lhs, rhs, op, lookups, &overload, complain);
9385 if (rval)
9386 {
9387 if (rval == error_mark_node)
9388 return rval;
9389 suppress_warning (rval /* What warning? */);
9390 if (processing_template_decl)
9391 {
9392 if (overload != NULL_TREE)
9393 return (build_min_non_dep_op_overload
9394 (MODIFY_EXPR, rval, overload, orig_lhs, orig_rhs));
9395
9396 return (build_min_non_dep
9397 (MODOP_EXPR, rval, orig_lhs, op, orig_rhs));
9398 }
9399 return rval;
9400 }
9401 }
9402 return cp_build_modify_expr (loc, lhs, modifycode, rhs, complain);
9403 }
9404
9405 /* Helper function for get_delta_difference which assumes FROM is a base
9406 class of TO. Returns a delta for the conversion of pointer-to-member
9407 of FROM to pointer-to-member of TO. If the conversion is invalid and
9408 tf_error is not set in COMPLAIN returns error_mark_node, otherwise
9409 returns zero. If FROM is not a base class of TO, returns NULL_TREE.
9410 If C_CAST_P is true, this conversion is taking place as part of a
9411 C-style cast. */
9412
9413 static tree
get_delta_difference_1(tree from,tree to,bool c_cast_p,tsubst_flags_t complain)9414 get_delta_difference_1 (tree from, tree to, bool c_cast_p,
9415 tsubst_flags_t complain)
9416 {
9417 tree binfo;
9418 base_kind kind;
9419
9420 binfo = lookup_base (to, from, c_cast_p ? ba_unique : ba_check,
9421 &kind, complain);
9422
9423 if (binfo == error_mark_node)
9424 {
9425 if (!(complain & tf_error))
9426 return error_mark_node;
9427
9428 inform (input_location, " in pointer to member function conversion");
9429 return size_zero_node;
9430 }
9431 else if (binfo)
9432 {
9433 if (kind != bk_via_virtual)
9434 return BINFO_OFFSET (binfo);
9435 else
9436 /* FROM is a virtual base class of TO. Issue an error or warning
9437 depending on whether or not this is a reinterpret cast. */
9438 {
9439 if (!(complain & tf_error))
9440 return error_mark_node;
9441
9442 error ("pointer to member conversion via virtual base %qT",
9443 BINFO_TYPE (binfo_from_vbase (binfo)));
9444
9445 return size_zero_node;
9446 }
9447 }
9448 else
9449 return NULL_TREE;
9450 }
9451
9452 /* Get difference in deltas for different pointer to member function
9453 types. If the conversion is invalid and tf_error is not set in
9454 COMPLAIN, returns error_mark_node, otherwise returns an integer
9455 constant of type PTRDIFF_TYPE_NODE and its value is zero if the
9456 conversion is invalid. If ALLOW_INVERSE_P is true, then allow reverse
9457 conversions as well. If C_CAST_P is true this conversion is taking
9458 place as part of a C-style cast.
9459
9460 Note that the naming of FROM and TO is kind of backwards; the return
9461 value is what we add to a TO in order to get a FROM. They are named
9462 this way because we call this function to find out how to convert from
9463 a pointer to member of FROM to a pointer to member of TO. */
9464
9465 static tree
get_delta_difference(tree from,tree to,bool allow_inverse_p,bool c_cast_p,tsubst_flags_t complain)9466 get_delta_difference (tree from, tree to,
9467 bool allow_inverse_p,
9468 bool c_cast_p, tsubst_flags_t complain)
9469 {
9470 tree result;
9471
9472 if (same_type_ignoring_top_level_qualifiers_p (from, to))
9473 /* Pointer to member of incomplete class is permitted*/
9474 result = size_zero_node;
9475 else
9476 result = get_delta_difference_1 (from, to, c_cast_p, complain);
9477
9478 if (result == error_mark_node)
9479 return error_mark_node;
9480
9481 if (!result)
9482 {
9483 if (!allow_inverse_p)
9484 {
9485 if (!(complain & tf_error))
9486 return error_mark_node;
9487
9488 error_not_base_type (from, to);
9489 inform (input_location, " in pointer to member conversion");
9490 result = size_zero_node;
9491 }
9492 else
9493 {
9494 result = get_delta_difference_1 (to, from, c_cast_p, complain);
9495
9496 if (result == error_mark_node)
9497 return error_mark_node;
9498
9499 if (result)
9500 result = size_diffop_loc (input_location,
9501 size_zero_node, result);
9502 else
9503 {
9504 if (!(complain & tf_error))
9505 return error_mark_node;
9506
9507 error_not_base_type (from, to);
9508 inform (input_location, " in pointer to member conversion");
9509 result = size_zero_node;
9510 }
9511 }
9512 }
9513
9514 return convert_to_integer (ptrdiff_type_node, result);
9515 }
9516
9517 /* Return a constructor for the pointer-to-member-function TYPE using
9518 the other components as specified. */
9519
9520 tree
build_ptrmemfunc1(tree type,tree delta,tree pfn)9521 build_ptrmemfunc1 (tree type, tree delta, tree pfn)
9522 {
9523 tree u = NULL_TREE;
9524 tree delta_field;
9525 tree pfn_field;
9526 vec<constructor_elt, va_gc> *v;
9527
9528 /* Pull the FIELD_DECLs out of the type. */
9529 pfn_field = TYPE_FIELDS (type);
9530 delta_field = DECL_CHAIN (pfn_field);
9531
9532 /* Make sure DELTA has the type we want. */
9533 delta = convert_and_check (input_location, delta_type_node, delta);
9534
9535 /* Convert to the correct target type if necessary. */
9536 pfn = fold_convert (TREE_TYPE (pfn_field), pfn);
9537
9538 /* Finish creating the initializer. */
9539 vec_alloc (v, 2);
9540 CONSTRUCTOR_APPEND_ELT(v, pfn_field, pfn);
9541 CONSTRUCTOR_APPEND_ELT(v, delta_field, delta);
9542 u = build_constructor (type, v);
9543 TREE_CONSTANT (u) = TREE_CONSTANT (pfn) & TREE_CONSTANT (delta);
9544 TREE_STATIC (u) = (TREE_CONSTANT (u)
9545 && (initializer_constant_valid_p (pfn, TREE_TYPE (pfn))
9546 != NULL_TREE)
9547 && (initializer_constant_valid_p (delta, TREE_TYPE (delta))
9548 != NULL_TREE));
9549 return u;
9550 }
9551
9552 /* Build a constructor for a pointer to member function. It can be
9553 used to initialize global variables, local variable, or used
9554 as a value in expressions. TYPE is the POINTER to METHOD_TYPE we
9555 want to be.
9556
9557 If FORCE is nonzero, then force this conversion, even if
9558 we would rather not do it. Usually set when using an explicit
9559 cast. A C-style cast is being processed iff C_CAST_P is true.
9560
9561 Return error_mark_node, if something goes wrong. */
9562
9563 tree
build_ptrmemfunc(tree type,tree pfn,int force,bool c_cast_p,tsubst_flags_t complain)9564 build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p,
9565 tsubst_flags_t complain)
9566 {
9567 tree fn;
9568 tree pfn_type;
9569 tree to_type;
9570
9571 if (error_operand_p (pfn))
9572 return error_mark_node;
9573
9574 pfn_type = TREE_TYPE (pfn);
9575 to_type = build_ptrmemfunc_type (type);
9576
9577 /* Handle multiple conversions of pointer to member functions. */
9578 if (TYPE_PTRMEMFUNC_P (pfn_type))
9579 {
9580 tree delta = NULL_TREE;
9581 tree npfn = NULL_TREE;
9582 tree n;
9583
9584 if (!force
9585 && !can_convert_arg (to_type, TREE_TYPE (pfn), pfn,
9586 LOOKUP_NORMAL, complain))
9587 {
9588 if (complain & tf_error)
9589 error ("invalid conversion to type %qT from type %qT",
9590 to_type, pfn_type);
9591 else
9592 return error_mark_node;
9593 }
9594
9595 n = get_delta_difference (TYPE_PTRMEMFUNC_OBJECT_TYPE (pfn_type),
9596 TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type),
9597 force,
9598 c_cast_p, complain);
9599 if (n == error_mark_node)
9600 return error_mark_node;
9601
9602 STRIP_ANY_LOCATION_WRAPPER (pfn);
9603
9604 /* We don't have to do any conversion to convert a
9605 pointer-to-member to its own type. But, we don't want to
9606 just return a PTRMEM_CST if there's an explicit cast; that
9607 cast should make the expression an invalid template argument. */
9608 if (TREE_CODE (pfn) != PTRMEM_CST
9609 && same_type_p (to_type, pfn_type))
9610 return pfn;
9611
9612 if (TREE_SIDE_EFFECTS (pfn))
9613 pfn = save_expr (pfn);
9614
9615 /* Obtain the function pointer and the current DELTA. */
9616 if (TREE_CODE (pfn) == PTRMEM_CST)
9617 expand_ptrmemfunc_cst (pfn, &delta, &npfn);
9618 else
9619 {
9620 npfn = build_ptrmemfunc_access_expr (pfn, pfn_identifier);
9621 delta = build_ptrmemfunc_access_expr (pfn, delta_identifier);
9622 }
9623
9624 /* Just adjust the DELTA field. */
9625 gcc_assert (same_type_ignoring_top_level_qualifiers_p
9626 (TREE_TYPE (delta), ptrdiff_type_node));
9627 if (!integer_zerop (n))
9628 {
9629 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta)
9630 n = cp_build_binary_op (input_location,
9631 LSHIFT_EXPR, n, integer_one_node,
9632 complain);
9633 delta = cp_build_binary_op (input_location,
9634 PLUS_EXPR, delta, n, complain);
9635 }
9636 return build_ptrmemfunc1 (to_type, delta, npfn);
9637 }
9638
9639 /* Handle null pointer to member function conversions. */
9640 if (null_ptr_cst_p (pfn))
9641 {
9642 pfn = cp_build_c_cast (input_location,
9643 TYPE_PTRMEMFUNC_FN_TYPE_RAW (to_type),
9644 pfn, complain);
9645 return build_ptrmemfunc1 (to_type,
9646 integer_zero_node,
9647 pfn);
9648 }
9649
9650 if (type_unknown_p (pfn))
9651 return instantiate_type (type, pfn, complain);
9652
9653 fn = TREE_OPERAND (pfn, 0);
9654 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
9655 /* In a template, we will have preserved the
9656 OFFSET_REF. */
9657 || (processing_template_decl && TREE_CODE (fn) == OFFSET_REF));
9658 return make_ptrmem_cst (to_type, fn);
9659 }
9660
9661 /* Return the DELTA, IDX, PFN, and DELTA2 values for the PTRMEM_CST
9662 given by CST.
9663
9664 ??? There is no consistency as to the types returned for the above
9665 values. Some code acts as if it were a sizetype and some as if it were
9666 integer_type_node. */
9667
9668 void
expand_ptrmemfunc_cst(tree cst,tree * delta,tree * pfn)9669 expand_ptrmemfunc_cst (tree cst, tree *delta, tree *pfn)
9670 {
9671 tree type = TREE_TYPE (cst);
9672 tree fn = PTRMEM_CST_MEMBER (cst);
9673 tree ptr_class, fn_class;
9674
9675 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
9676
9677 /* The class that the function belongs to. */
9678 fn_class = DECL_CONTEXT (fn);
9679
9680 /* The class that we're creating a pointer to member of. */
9681 ptr_class = TYPE_PTRMEMFUNC_OBJECT_TYPE (type);
9682
9683 /* First, calculate the adjustment to the function's class. */
9684 *delta = get_delta_difference (fn_class, ptr_class, /*force=*/0,
9685 /*c_cast_p=*/0, tf_warning_or_error);
9686
9687 if (!DECL_VIRTUAL_P (fn))
9688 {
9689 tree t = build_addr_func (fn, tf_warning_or_error);
9690 if (TREE_CODE (t) == ADDR_EXPR)
9691 SET_EXPR_LOCATION (t, PTRMEM_CST_LOCATION (cst));
9692 *pfn = convert (TYPE_PTRMEMFUNC_FN_TYPE (type), t);
9693 }
9694 else
9695 {
9696 /* If we're dealing with a virtual function, we have to adjust 'this'
9697 again, to point to the base which provides the vtable entry for
9698 fn; the call will do the opposite adjustment. */
9699 tree orig_class = DECL_CONTEXT (fn);
9700 tree binfo = binfo_or_else (orig_class, fn_class);
9701 *delta = fold_build2 (PLUS_EXPR, TREE_TYPE (*delta),
9702 *delta, BINFO_OFFSET (binfo));
9703
9704 /* We set PFN to the vtable offset at which the function can be
9705 found, plus one (unless ptrmemfunc_vbit_in_delta, in which
9706 case delta is shifted left, and then incremented). */
9707 *pfn = DECL_VINDEX (fn);
9708 *pfn = fold_build2 (MULT_EXPR, integer_type_node, *pfn,
9709 TYPE_SIZE_UNIT (vtable_entry_type));
9710
9711 switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
9712 {
9713 case ptrmemfunc_vbit_in_pfn:
9714 *pfn = fold_build2 (PLUS_EXPR, integer_type_node, *pfn,
9715 integer_one_node);
9716 break;
9717
9718 case ptrmemfunc_vbit_in_delta:
9719 *delta = fold_build2 (LSHIFT_EXPR, TREE_TYPE (*delta),
9720 *delta, integer_one_node);
9721 *delta = fold_build2 (PLUS_EXPR, TREE_TYPE (*delta),
9722 *delta, integer_one_node);
9723 break;
9724
9725 default:
9726 gcc_unreachable ();
9727 }
9728
9729 *pfn = fold_convert (TYPE_PTRMEMFUNC_FN_TYPE (type), *pfn);
9730 }
9731 }
9732
9733 /* Return an expression for PFN from the pointer-to-member function
9734 given by T. */
9735
9736 static tree
pfn_from_ptrmemfunc(tree t)9737 pfn_from_ptrmemfunc (tree t)
9738 {
9739 if (TREE_CODE (t) == PTRMEM_CST)
9740 {
9741 tree delta;
9742 tree pfn;
9743
9744 expand_ptrmemfunc_cst (t, &delta, &pfn);
9745 if (pfn)
9746 return pfn;
9747 }
9748
9749 return build_ptrmemfunc_access_expr (t, pfn_identifier);
9750 }
9751
9752 /* Return an expression for DELTA from the pointer-to-member function
9753 given by T. */
9754
9755 static tree
delta_from_ptrmemfunc(tree t)9756 delta_from_ptrmemfunc (tree t)
9757 {
9758 if (TREE_CODE (t) == PTRMEM_CST)
9759 {
9760 tree delta;
9761 tree pfn;
9762
9763 expand_ptrmemfunc_cst (t, &delta, &pfn);
9764 if (delta)
9765 return delta;
9766 }
9767
9768 return build_ptrmemfunc_access_expr (t, delta_identifier);
9769 }
9770
9771 /* Convert value RHS to type TYPE as preparation for an assignment to
9772 an lvalue of type TYPE. ERRTYPE indicates what kind of error the
9773 implicit conversion is. If FNDECL is non-NULL, we are doing the
9774 conversion in order to pass the PARMNUMth argument of FNDECL.
9775 If FNDECL is NULL, we are doing the conversion in function pointer
9776 argument passing, conversion in initialization, etc. */
9777
9778 static tree
convert_for_assignment(tree type,tree rhs,impl_conv_rhs errtype,tree fndecl,int parmnum,tsubst_flags_t complain,int flags)9779 convert_for_assignment (tree type, tree rhs,
9780 impl_conv_rhs errtype, tree fndecl, int parmnum,
9781 tsubst_flags_t complain, int flags)
9782 {
9783 tree rhstype;
9784 enum tree_code coder;
9785
9786 location_t rhs_loc = cp_expr_loc_or_input_loc (rhs);
9787 bool has_loc = EXPR_LOCATION (rhs) != UNKNOWN_LOCATION;
9788 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue,
9789 but preserve location wrappers. */
9790 if (TREE_CODE (rhs) == NON_LVALUE_EXPR
9791 && !location_wrapper_p (rhs))
9792 rhs = TREE_OPERAND (rhs, 0);
9793
9794 /* Handle [dcl.init.list] direct-list-initialization from
9795 single element of enumeration with a fixed underlying type. */
9796 if (is_direct_enum_init (type, rhs))
9797 {
9798 tree elt = CONSTRUCTOR_ELT (rhs, 0)->value;
9799 if (check_narrowing (ENUM_UNDERLYING_TYPE (type), elt, complain))
9800 {
9801 warning_sentinel w (warn_useless_cast);
9802 warning_sentinel w2 (warn_ignored_qualifiers);
9803 rhs = cp_build_c_cast (rhs_loc, type, elt, complain);
9804 }
9805 else
9806 rhs = error_mark_node;
9807 }
9808
9809 rhstype = TREE_TYPE (rhs);
9810 coder = TREE_CODE (rhstype);
9811
9812 if (VECTOR_TYPE_P (type) && coder == VECTOR_TYPE
9813 && vector_types_convertible_p (type, rhstype, true))
9814 {
9815 rhs = mark_rvalue_use (rhs);
9816 return convert (type, rhs);
9817 }
9818
9819 if (rhs == error_mark_node || rhstype == error_mark_node)
9820 return error_mark_node;
9821 if (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node)
9822 return error_mark_node;
9823
9824 /* The RHS of an assignment cannot have void type. */
9825 if (coder == VOID_TYPE)
9826 {
9827 if (complain & tf_error)
9828 error_at (rhs_loc, "void value not ignored as it ought to be");
9829 return error_mark_node;
9830 }
9831
9832 if (c_dialect_objc ())
9833 {
9834 int parmno;
9835 tree selector;
9836 tree rname = fndecl;
9837
9838 switch (errtype)
9839 {
9840 case ICR_ASSIGN:
9841 parmno = -1;
9842 break;
9843 case ICR_INIT:
9844 parmno = -2;
9845 break;
9846 default:
9847 selector = objc_message_selector ();
9848 parmno = parmnum;
9849 if (selector && parmno > 1)
9850 {
9851 rname = selector;
9852 parmno -= 1;
9853 }
9854 }
9855
9856 if (objc_compare_types (type, rhstype, parmno, rname))
9857 {
9858 rhs = mark_rvalue_use (rhs);
9859 return convert (type, rhs);
9860 }
9861 }
9862
9863 /* [expr.ass]
9864
9865 The expression is implicitly converted (clause _conv_) to the
9866 cv-unqualified type of the left operand.
9867
9868 We allow bad conversions here because by the time we get to this point
9869 we are committed to doing the conversion. If we end up doing a bad
9870 conversion, convert_like will complain. */
9871 if (!can_convert_arg_bad (type, rhstype, rhs, flags, complain))
9872 {
9873 /* When -Wno-pmf-conversions is use, we just silently allow
9874 conversions from pointers-to-members to plain pointers. If
9875 the conversion doesn't work, cp_convert will complain. */
9876 if (!warn_pmf2ptr
9877 && TYPE_PTR_P (type)
9878 && TYPE_PTRMEMFUNC_P (rhstype))
9879 rhs = cp_convert (strip_top_quals (type), rhs, complain);
9880 else
9881 {
9882 if (complain & tf_error)
9883 {
9884 /* If the right-hand side has unknown type, then it is an
9885 overloaded function. Call instantiate_type to get error
9886 messages. */
9887 if (rhstype == unknown_type_node)
9888 {
9889 tree r = instantiate_type (type, rhs, tf_warning_or_error);
9890 /* -fpermissive might allow this; recurse. */
9891 if (!seen_error ())
9892 return convert_for_assignment (type, r, errtype, fndecl,
9893 parmnum, complain, flags);
9894 }
9895 else if (fndecl)
9896 complain_about_bad_argument (rhs_loc,
9897 rhstype, type,
9898 fndecl, parmnum);
9899 else
9900 {
9901 range_label_for_type_mismatch label (rhstype, type);
9902 gcc_rich_location richloc (rhs_loc, has_loc ? &label : NULL);
9903 switch (errtype)
9904 {
9905 case ICR_DEFAULT_ARGUMENT:
9906 error_at (&richloc,
9907 "cannot convert %qH to %qI in default argument",
9908 rhstype, type);
9909 break;
9910 case ICR_ARGPASS:
9911 error_at (&richloc,
9912 "cannot convert %qH to %qI in argument passing",
9913 rhstype, type);
9914 break;
9915 case ICR_CONVERTING:
9916 error_at (&richloc, "cannot convert %qH to %qI",
9917 rhstype, type);
9918 break;
9919 case ICR_INIT:
9920 error_at (&richloc,
9921 "cannot convert %qH to %qI in initialization",
9922 rhstype, type);
9923 break;
9924 case ICR_RETURN:
9925 error_at (&richloc, "cannot convert %qH to %qI in return",
9926 rhstype, type);
9927 break;
9928 case ICR_ASSIGN:
9929 error_at (&richloc,
9930 "cannot convert %qH to %qI in assignment",
9931 rhstype, type);
9932 break;
9933 default:
9934 gcc_unreachable();
9935 }
9936 }
9937 if (TYPE_PTR_P (rhstype)
9938 && TYPE_PTR_P (type)
9939 && CLASS_TYPE_P (TREE_TYPE (rhstype))
9940 && CLASS_TYPE_P (TREE_TYPE (type))
9941 && !COMPLETE_TYPE_P (TREE_TYPE (rhstype)))
9942 inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL
9943 (TREE_TYPE (rhstype))),
9944 "class type %qT is incomplete", TREE_TYPE (rhstype));
9945 }
9946 return error_mark_node;
9947 }
9948 }
9949 if (warn_suggest_attribute_format)
9950 {
9951 const enum tree_code codel = TREE_CODE (type);
9952 if ((codel == POINTER_TYPE || codel == REFERENCE_TYPE)
9953 && coder == codel
9954 && check_missing_format_attribute (type, rhstype)
9955 && (complain & tf_warning))
9956 switch (errtype)
9957 {
9958 case ICR_ARGPASS:
9959 case ICR_DEFAULT_ARGUMENT:
9960 if (fndecl)
9961 warning (OPT_Wsuggest_attribute_format,
9962 "parameter %qP of %qD might be a candidate "
9963 "for a format attribute", parmnum, fndecl);
9964 else
9965 warning (OPT_Wsuggest_attribute_format,
9966 "parameter might be a candidate "
9967 "for a format attribute");
9968 break;
9969 case ICR_CONVERTING:
9970 warning (OPT_Wsuggest_attribute_format,
9971 "target of conversion might be a candidate "
9972 "for a format attribute");
9973 break;
9974 case ICR_INIT:
9975 warning (OPT_Wsuggest_attribute_format,
9976 "target of initialization might be a candidate "
9977 "for a format attribute");
9978 break;
9979 case ICR_RETURN:
9980 warning (OPT_Wsuggest_attribute_format,
9981 "return type might be a candidate "
9982 "for a format attribute");
9983 break;
9984 case ICR_ASSIGN:
9985 warning (OPT_Wsuggest_attribute_format,
9986 "left-hand side of assignment might be a candidate "
9987 "for a format attribute");
9988 break;
9989 default:
9990 gcc_unreachable();
9991 }
9992 }
9993
9994 /* If -Wparentheses, warn about a = b = c when a has type bool and b
9995 does not. */
9996 if (warn_parentheses
9997 && TREE_CODE (type) == BOOLEAN_TYPE
9998 && TREE_CODE (rhs) == MODIFY_EXPR
9999 && !warning_suppressed_p (rhs, OPT_Wparentheses)
10000 && TREE_CODE (TREE_TYPE (rhs)) != BOOLEAN_TYPE
10001 && (complain & tf_warning)
10002 && warning_at (rhs_loc, OPT_Wparentheses,
10003 "suggest parentheses around assignment used as "
10004 "truth value"))
10005 suppress_warning (rhs, OPT_Wparentheses);
10006
10007 if (complain & tf_warning)
10008 warn_for_address_or_pointer_of_packed_member (type, rhs);
10009
10010 return perform_implicit_conversion_flags (strip_top_quals (type), rhs,
10011 complain, flags);
10012 }
10013
10014 /* Convert RHS to be of type TYPE.
10015 If EXP is nonzero, it is the target of the initialization.
10016 ERRTYPE indicates what kind of error the implicit conversion is.
10017
10018 Two major differences between the behavior of
10019 `convert_for_assignment' and `convert_for_initialization'
10020 are that references are bashed in the former, while
10021 copied in the latter, and aggregates are assigned in
10022 the former (operator=) while initialized in the
10023 latter (X(X&)).
10024
10025 If using constructor make sure no conversion operator exists, if one does
10026 exist, an ambiguity exists. */
10027
10028 tree
convert_for_initialization(tree exp,tree type,tree rhs,int flags,impl_conv_rhs errtype,tree fndecl,int parmnum,tsubst_flags_t complain)10029 convert_for_initialization (tree exp, tree type, tree rhs, int flags,
10030 impl_conv_rhs errtype, tree fndecl, int parmnum,
10031 tsubst_flags_t complain)
10032 {
10033 enum tree_code codel = TREE_CODE (type);
10034 tree rhstype;
10035 enum tree_code coder;
10036
10037 /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
10038 Strip such NOP_EXPRs, since RHS is used in non-lvalue context. */
10039 if (TREE_CODE (rhs) == NOP_EXPR
10040 && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))
10041 && codel != REFERENCE_TYPE)
10042 rhs = TREE_OPERAND (rhs, 0);
10043
10044 if (type == error_mark_node
10045 || rhs == error_mark_node
10046 || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node))
10047 return error_mark_node;
10048
10049 if (MAYBE_CLASS_TYPE_P (non_reference (type)))
10050 ;
10051 else if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
10052 && TREE_CODE (type) != ARRAY_TYPE
10053 && (!TYPE_REF_P (type)
10054 || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
10055 || (TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
10056 && !TYPE_REFFN_P (type))
10057 || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
10058 rhs = decay_conversion (rhs, complain);
10059
10060 rhstype = TREE_TYPE (rhs);
10061 coder = TREE_CODE (rhstype);
10062
10063 if (coder == ERROR_MARK)
10064 return error_mark_node;
10065
10066 /* We accept references to incomplete types, so we can
10067 return here before checking if RHS is of complete type. */
10068
10069 if (codel == REFERENCE_TYPE)
10070 {
10071 auto_diagnostic_group d;
10072 /* This should eventually happen in convert_arguments. */
10073 int savew = 0, savee = 0;
10074
10075 if (fndecl)
10076 savew = warningcount + werrorcount, savee = errorcount;
10077 rhs = initialize_reference (type, rhs, flags, complain);
10078
10079 if (fndecl
10080 && (warningcount + werrorcount > savew || errorcount > savee))
10081 inform (get_fndecl_argument_location (fndecl, parmnum),
10082 "in passing argument %P of %qD", parmnum, fndecl);
10083 return rhs;
10084 }
10085
10086 if (exp != 0)
10087 exp = require_complete_type_sfinae (exp, complain);
10088 if (exp == error_mark_node)
10089 return error_mark_node;
10090
10091 type = complete_type (type);
10092
10093 if (DIRECT_INIT_EXPR_P (type, rhs))
10094 /* Don't try to do copy-initialization if we already have
10095 direct-initialization. */
10096 return rhs;
10097
10098 if (MAYBE_CLASS_TYPE_P (type))
10099 return perform_implicit_conversion_flags (type, rhs, complain, flags);
10100
10101 return convert_for_assignment (type, rhs, errtype, fndecl, parmnum,
10102 complain, flags);
10103 }
10104
10105 /* If RETVAL is the address of, or a reference to, a local variable or
10106 temporary give an appropriate warning and return true. */
10107
10108 static bool
maybe_warn_about_returning_address_of_local(tree retval,location_t loc)10109 maybe_warn_about_returning_address_of_local (tree retval, location_t loc)
10110 {
10111 tree valtype = TREE_TYPE (DECL_RESULT (current_function_decl));
10112 tree whats_returned = fold_for_warn (retval);
10113 if (!loc)
10114 loc = cp_expr_loc_or_input_loc (retval);
10115
10116 for (;;)
10117 {
10118 if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
10119 whats_returned = TREE_OPERAND (whats_returned, 1);
10120 else if (CONVERT_EXPR_P (whats_returned)
10121 || TREE_CODE (whats_returned) == NON_LVALUE_EXPR)
10122 whats_returned = TREE_OPERAND (whats_returned, 0);
10123 else
10124 break;
10125 }
10126
10127 if (TREE_CODE (whats_returned) == TARGET_EXPR
10128 && is_std_init_list (TREE_TYPE (whats_returned)))
10129 {
10130 tree init = TARGET_EXPR_INITIAL (whats_returned);
10131 if (TREE_CODE (init) == CONSTRUCTOR)
10132 /* Pull out the array address. */
10133 whats_returned = CONSTRUCTOR_ELT (init, 0)->value;
10134 else if (TREE_CODE (init) == INDIRECT_REF)
10135 /* The source of a trivial copy looks like *(T*)&var. */
10136 whats_returned = TREE_OPERAND (init, 0);
10137 else
10138 return false;
10139 STRIP_NOPS (whats_returned);
10140 }
10141
10142 /* As a special case, we handle a call to std::move or std::forward. */
10143 if (TREE_CODE (whats_returned) == CALL_EXPR
10144 && (is_std_move_p (whats_returned)
10145 || is_std_forward_p (whats_returned)))
10146 {
10147 tree arg = CALL_EXPR_ARG (whats_returned, 0);
10148 return maybe_warn_about_returning_address_of_local (arg, loc);
10149 }
10150
10151 if (TREE_CODE (whats_returned) != ADDR_EXPR)
10152 return false;
10153 whats_returned = TREE_OPERAND (whats_returned, 0);
10154
10155 while (TREE_CODE (whats_returned) == COMPONENT_REF
10156 || TREE_CODE (whats_returned) == ARRAY_REF)
10157 whats_returned = TREE_OPERAND (whats_returned, 0);
10158
10159 if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
10160 || TREE_CODE (whats_returned) == TARGET_EXPR)
10161 {
10162 if (TYPE_REF_P (valtype))
10163 warning_at (loc, OPT_Wreturn_local_addr,
10164 "returning reference to temporary");
10165 else if (is_std_init_list (valtype))
10166 warning_at (loc, OPT_Winit_list_lifetime,
10167 "returning temporary %<initializer_list%> does not extend "
10168 "the lifetime of the underlying array");
10169 return true;
10170 }
10171
10172 STRIP_ANY_LOCATION_WRAPPER (whats_returned);
10173
10174 if (DECL_P (whats_returned)
10175 && DECL_NAME (whats_returned)
10176 && DECL_FUNCTION_SCOPE_P (whats_returned)
10177 && !is_capture_proxy (whats_returned)
10178 && !(TREE_STATIC (whats_returned)
10179 || TREE_PUBLIC (whats_returned)))
10180 {
10181 if (VAR_P (whats_returned)
10182 && DECL_DECOMPOSITION_P (whats_returned)
10183 && DECL_DECOMP_BASE (whats_returned)
10184 && DECL_HAS_VALUE_EXPR_P (whats_returned))
10185 {
10186 /* When returning address of a structured binding, if the structured
10187 binding is not a reference, continue normally, if it is a
10188 reference, recurse on the initializer of the structured
10189 binding. */
10190 tree base = DECL_DECOMP_BASE (whats_returned);
10191 if (TYPE_REF_P (TREE_TYPE (base)))
10192 {
10193 if (tree init = DECL_INITIAL (base))
10194 return maybe_warn_about_returning_address_of_local (init, loc);
10195 else
10196 return false;
10197 }
10198 }
10199 bool w = false;
10200 auto_diagnostic_group d;
10201 if (TYPE_REF_P (valtype))
10202 w = warning_at (loc, OPT_Wreturn_local_addr,
10203 "reference to local variable %qD returned",
10204 whats_returned);
10205 else if (is_std_init_list (valtype))
10206 w = warning_at (loc, OPT_Winit_list_lifetime,
10207 "returning local %<initializer_list%> variable %qD "
10208 "does not extend the lifetime of the underlying array",
10209 whats_returned);
10210 else if (POINTER_TYPE_P (valtype)
10211 && TREE_CODE (whats_returned) == LABEL_DECL)
10212 w = warning_at (loc, OPT_Wreturn_local_addr,
10213 "address of label %qD returned",
10214 whats_returned);
10215 else if (POINTER_TYPE_P (valtype))
10216 w = warning_at (loc, OPT_Wreturn_local_addr,
10217 "address of local variable %qD returned",
10218 whats_returned);
10219 if (w)
10220 inform (DECL_SOURCE_LOCATION (whats_returned),
10221 "declared here");
10222 return true;
10223 }
10224
10225 return false;
10226 }
10227
10228 /* Returns true if DECL is in the std namespace. */
10229
10230 bool
decl_in_std_namespace_p(tree decl)10231 decl_in_std_namespace_p (tree decl)
10232 {
10233 while (decl)
10234 {
10235 decl = decl_namespace_context (decl);
10236 if (DECL_NAMESPACE_STD_P (decl))
10237 return true;
10238 /* Allow inline namespaces inside of std namespace, e.g. with
10239 --enable-symvers=gnu-versioned-namespace std::forward would be
10240 actually std::_8::forward. */
10241 if (!DECL_NAMESPACE_INLINE_P (decl))
10242 return false;
10243 decl = CP_DECL_CONTEXT (decl);
10244 }
10245 return false;
10246 }
10247
10248 /* Returns true if FN, a CALL_EXPR, is a call to std::forward. */
10249
10250 static bool
is_std_forward_p(tree fn)10251 is_std_forward_p (tree fn)
10252 {
10253 /* std::forward only takes one argument. */
10254 if (call_expr_nargs (fn) != 1)
10255 return false;
10256
10257 tree fndecl = cp_get_callee_fndecl_nofold (fn);
10258 if (!decl_in_std_namespace_p (fndecl))
10259 return false;
10260
10261 tree name = DECL_NAME (fndecl);
10262 return name && id_equal (name, "forward");
10263 }
10264
10265 /* Returns true if FN, a CALL_EXPR, is a call to std::move. */
10266
10267 static bool
is_std_move_p(tree fn)10268 is_std_move_p (tree fn)
10269 {
10270 /* std::move only takes one argument. */
10271 if (call_expr_nargs (fn) != 1)
10272 return false;
10273
10274 tree fndecl = cp_get_callee_fndecl_nofold (fn);
10275 if (!decl_in_std_namespace_p (fndecl))
10276 return false;
10277
10278 tree name = DECL_NAME (fndecl);
10279 return name && id_equal (name, "move");
10280 }
10281
10282 /* Returns true if RETVAL is a good candidate for the NRVO as per
10283 [class.copy.elision]. FUNCTYPE is the type the function is declared
10284 to return. */
10285
10286 static bool
can_do_nrvo_p(tree retval,tree functype)10287 can_do_nrvo_p (tree retval, tree functype)
10288 {
10289 if (functype == error_mark_node)
10290 return false;
10291 if (retval)
10292 STRIP_ANY_LOCATION_WRAPPER (retval);
10293 tree result = DECL_RESULT (current_function_decl);
10294 return (retval != NULL_TREE
10295 && !processing_template_decl
10296 /* Must be a local, automatic variable. */
10297 && VAR_P (retval)
10298 && DECL_CONTEXT (retval) == current_function_decl
10299 && !TREE_STATIC (retval)
10300 /* And not a lambda or anonymous union proxy. */
10301 && !DECL_HAS_VALUE_EXPR_P (retval)
10302 && (DECL_ALIGN (retval) <= DECL_ALIGN (result))
10303 /* The cv-unqualified type of the returned value must be the
10304 same as the cv-unqualified return type of the
10305 function. */
10306 && same_type_p ((TYPE_MAIN_VARIANT (TREE_TYPE (retval))),
10307 (TYPE_MAIN_VARIANT (functype)))
10308 /* And the returned value must be non-volatile. */
10309 && !TYPE_VOLATILE (TREE_TYPE (retval)));
10310 }
10311
10312 /* If we should treat RETVAL, an expression being returned, as if it were
10313 designated by an rvalue, returns it adjusted accordingly; otherwise, returns
10314 NULL_TREE. See [class.copy.elision]. RETURN_P is true if this is a return
10315 context (rather than throw). */
10316
10317 tree
treat_lvalue_as_rvalue_p(tree expr,bool return_p)10318 treat_lvalue_as_rvalue_p (tree expr, bool return_p)
10319 {
10320 if (cxx_dialect == cxx98)
10321 return NULL_TREE;
10322
10323 tree retval = expr;
10324 STRIP_ANY_LOCATION_WRAPPER (retval);
10325 if (REFERENCE_REF_P (retval))
10326 retval = TREE_OPERAND (retval, 0);
10327
10328 /* An implicitly movable entity is a variable of automatic storage duration
10329 that is either a non-volatile object or (C++20) an rvalue reference to a
10330 non-volatile object type. */
10331 if (!(((VAR_P (retval) && !DECL_HAS_VALUE_EXPR_P (retval))
10332 || TREE_CODE (retval) == PARM_DECL)
10333 && !TREE_STATIC (retval)
10334 && !CP_TYPE_VOLATILE_P (non_reference (TREE_TYPE (retval)))
10335 && (TREE_CODE (TREE_TYPE (retval)) != REFERENCE_TYPE
10336 || (cxx_dialect >= cxx20
10337 && TYPE_REF_IS_RVALUE (TREE_TYPE (retval))))))
10338 return NULL_TREE;
10339
10340 /* If the expression in a return or co_return statement is a (possibly
10341 parenthesized) id-expression that names an implicitly movable entity
10342 declared in the body or parameter-declaration-clause of the innermost
10343 enclosing function or lambda-expression, */
10344 if (DECL_CONTEXT (retval) != current_function_decl)
10345 return NULL_TREE;
10346 if (return_p)
10347 return set_implicit_rvalue_p (move (expr));
10348
10349 /* if the operand of a throw-expression is a (possibly parenthesized)
10350 id-expression that names an implicitly movable entity whose scope does not
10351 extend beyond the compound-statement of the innermost try-block or
10352 function-try-block (if any) whose compound-statement or ctor-initializer
10353 encloses the throw-expression, */
10354
10355 /* C++20 added move on throw of parms. */
10356 if (TREE_CODE (retval) == PARM_DECL && cxx_dialect < cxx20)
10357 return NULL_TREE;
10358
10359 for (cp_binding_level *b = current_binding_level;
10360 ; b = b->level_chain)
10361 {
10362 for (tree decl = b->names; decl; decl = TREE_CHAIN (decl))
10363 if (decl == retval)
10364 return set_implicit_rvalue_p (move (expr));
10365 if (b->kind == sk_function_parms
10366 || b->kind == sk_try
10367 || b->kind == sk_namespace)
10368 return NULL_TREE;
10369 }
10370 }
10371
10372 /* Warn about wrong usage of std::move in a return statement. RETVAL
10373 is the expression we are returning; FUNCTYPE is the type the function
10374 is declared to return. */
10375
10376 static void
maybe_warn_pessimizing_move(tree retval,tree functype)10377 maybe_warn_pessimizing_move (tree retval, tree functype)
10378 {
10379 if (!(warn_pessimizing_move || warn_redundant_move))
10380 return;
10381
10382 location_t loc = cp_expr_loc_or_input_loc (retval);
10383
10384 /* C++98 doesn't know move. */
10385 if (cxx_dialect < cxx11)
10386 return;
10387
10388 /* Wait until instantiation time, since we can't gauge if we should do
10389 the NRVO until then. */
10390 if (processing_template_decl)
10391 return;
10392
10393 /* This is only interesting for class types. */
10394 if (!CLASS_TYPE_P (functype))
10395 return;
10396
10397 /* We're looking for *std::move<T&> ((T &) &arg). */
10398 if (REFERENCE_REF_P (retval)
10399 && TREE_CODE (TREE_OPERAND (retval, 0)) == CALL_EXPR)
10400 {
10401 tree fn = TREE_OPERAND (retval, 0);
10402 if (is_std_move_p (fn))
10403 {
10404 tree arg = CALL_EXPR_ARG (fn, 0);
10405 tree moved;
10406 if (TREE_CODE (arg) != NOP_EXPR)
10407 return;
10408 arg = TREE_OPERAND (arg, 0);
10409 if (TREE_CODE (arg) != ADDR_EXPR)
10410 return;
10411 arg = TREE_OPERAND (arg, 0);
10412 arg = convert_from_reference (arg);
10413 /* Warn if we could do copy elision were it not for the move. */
10414 if (can_do_nrvo_p (arg, functype))
10415 {
10416 auto_diagnostic_group d;
10417 if (warning_at (loc, OPT_Wpessimizing_move,
10418 "moving a local object in a return statement "
10419 "prevents copy elision"))
10420 inform (loc, "remove %<std::move%> call");
10421 }
10422 /* Warn if the move is redundant. It is redundant when we would
10423 do maybe-rvalue overload resolution even without std::move. */
10424 else if (warn_redundant_move
10425 && (moved = treat_lvalue_as_rvalue_p (arg, /*return*/true)))
10426 {
10427 /* Make sure that the overload resolution would actually succeed
10428 if we removed the std::move call. */
10429 tree t = convert_for_initialization (NULL_TREE, functype,
10430 moved,
10431 (LOOKUP_NORMAL
10432 | LOOKUP_ONLYCONVERTING
10433 | LOOKUP_PREFER_RVALUE),
10434 ICR_RETURN, NULL_TREE, 0,
10435 tf_none);
10436 /* If this worked, implicit rvalue would work, so the call to
10437 std::move is redundant. */
10438 if (t != error_mark_node)
10439 {
10440 auto_diagnostic_group d;
10441 if (warning_at (loc, OPT_Wredundant_move,
10442 "redundant move in return statement"))
10443 inform (loc, "remove %<std::move%> call");
10444 }
10445 }
10446 }
10447 }
10448 }
10449
10450 /* Check that returning RETVAL from the current function is valid.
10451 Return an expression explicitly showing all conversions required to
10452 change RETVAL into the function return type, and to assign it to
10453 the DECL_RESULT for the function. Set *NO_WARNING to true if
10454 code reaches end of non-void function warning shouldn't be issued
10455 on this RETURN_EXPR. */
10456
10457 tree
check_return_expr(tree retval,bool * no_warning)10458 check_return_expr (tree retval, bool *no_warning)
10459 {
10460 tree result;
10461 /* The type actually returned by the function. */
10462 tree valtype;
10463 /* The type the function is declared to return, or void if
10464 the declared type is incomplete. */
10465 tree functype;
10466 int fn_returns_value_p;
10467 location_t loc = cp_expr_loc_or_input_loc (retval);
10468
10469 *no_warning = false;
10470
10471 /* A `volatile' function is one that isn't supposed to return, ever.
10472 (This is a G++ extension, used to get better code for functions
10473 that call the `volatile' function.) */
10474 if (TREE_THIS_VOLATILE (current_function_decl))
10475 warning (0, "function declared %<noreturn%> has a %<return%> statement");
10476
10477 /* Check for various simple errors. */
10478 if (DECL_DESTRUCTOR_P (current_function_decl))
10479 {
10480 if (retval)
10481 error_at (loc, "returning a value from a destructor");
10482 return NULL_TREE;
10483 }
10484 else if (DECL_CONSTRUCTOR_P (current_function_decl))
10485 {
10486 if (in_function_try_handler)
10487 /* If a return statement appears in a handler of the
10488 function-try-block of a constructor, the program is ill-formed. */
10489 error ("cannot return from a handler of a function-try-block of a constructor");
10490 else if (retval)
10491 /* You can't return a value from a constructor. */
10492 error_at (loc, "returning a value from a constructor");
10493 return NULL_TREE;
10494 }
10495
10496 const tree saved_retval = retval;
10497
10498 if (processing_template_decl)
10499 {
10500 current_function_returns_value = 1;
10501
10502 if (check_for_bare_parameter_packs (retval))
10503 return error_mark_node;
10504
10505 /* If one of the types might be void, we can't tell whether we're
10506 returning a value. */
10507 if ((WILDCARD_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl)))
10508 && !FNDECL_USED_AUTO (current_function_decl))
10509 || (retval != NULL_TREE
10510 && (TREE_TYPE (retval) == NULL_TREE
10511 || WILDCARD_TYPE_P (TREE_TYPE (retval)))))
10512 goto dependent;
10513 }
10514
10515 functype = TREE_TYPE (TREE_TYPE (current_function_decl));
10516
10517 /* Deduce auto return type from a return statement. */
10518 if (FNDECL_USED_AUTO (current_function_decl))
10519 {
10520 tree pattern = DECL_SAVED_AUTO_RETURN_TYPE (current_function_decl);
10521 tree auto_node;
10522 tree type;
10523
10524 if (!retval && !is_auto (pattern))
10525 {
10526 /* Give a helpful error message. */
10527 error ("return-statement with no value, in function returning %qT",
10528 pattern);
10529 inform (input_location, "only plain %<auto%> return type can be "
10530 "deduced to %<void%>");
10531 type = error_mark_node;
10532 }
10533 else if (retval && BRACE_ENCLOSED_INITIALIZER_P (retval))
10534 {
10535 error ("returning initializer list");
10536 type = error_mark_node;
10537 }
10538 else
10539 {
10540 if (!retval)
10541 retval = void_node;
10542 auto_node = type_uses_auto (pattern);
10543 type = do_auto_deduction (pattern, retval, auto_node,
10544 tf_warning_or_error, adc_return_type);
10545 }
10546
10547 if (type == error_mark_node)
10548 /* Leave it. */;
10549 else if (functype == pattern)
10550 apply_deduced_return_type (current_function_decl, type);
10551 else if (!same_type_p (type, functype))
10552 {
10553 if (LAMBDA_FUNCTION_P (current_function_decl))
10554 error_at (loc, "inconsistent types %qT and %qT deduced for "
10555 "lambda return type", functype, type);
10556 else
10557 error_at (loc, "inconsistent deduction for auto return type: "
10558 "%qT and then %qT", functype, type);
10559 }
10560 functype = type;
10561 }
10562
10563 result = DECL_RESULT (current_function_decl);
10564 valtype = TREE_TYPE (result);
10565 gcc_assert (valtype != NULL_TREE);
10566 fn_returns_value_p = !VOID_TYPE_P (valtype);
10567
10568 /* Check for a return statement with no return value in a function
10569 that's supposed to return a value. */
10570 if (!retval && fn_returns_value_p)
10571 {
10572 if (functype != error_mark_node)
10573 permerror (input_location, "return-statement with no value, in "
10574 "function returning %qT", valtype);
10575 /* Remember that this function did return. */
10576 current_function_returns_value = 1;
10577 /* And signal caller that TREE_NO_WARNING should be set on the
10578 RETURN_EXPR to avoid control reaches end of non-void function
10579 warnings in tree-cfg.cc. */
10580 *no_warning = true;
10581 }
10582 /* Check for a return statement with a value in a function that
10583 isn't supposed to return a value. */
10584 else if (retval && !fn_returns_value_p)
10585 {
10586 if (VOID_TYPE_P (TREE_TYPE (retval)))
10587 /* You can return a `void' value from a function of `void'
10588 type. In that case, we have to evaluate the expression for
10589 its side-effects. */
10590 finish_expr_stmt (retval);
10591 else if (retval != error_mark_node)
10592 permerror (loc, "return-statement with a value, in function "
10593 "returning %qT", valtype);
10594 current_function_returns_null = 1;
10595
10596 /* There's really no value to return, after all. */
10597 return NULL_TREE;
10598 }
10599 else if (!retval)
10600 /* Remember that this function can sometimes return without a
10601 value. */
10602 current_function_returns_null = 1;
10603 else
10604 /* Remember that this function did return a value. */
10605 current_function_returns_value = 1;
10606
10607 /* Check for erroneous operands -- but after giving ourselves a
10608 chance to provide an error about returning a value from a void
10609 function. */
10610 if (error_operand_p (retval))
10611 {
10612 current_function_return_value = error_mark_node;
10613 return error_mark_node;
10614 }
10615
10616 /* Only operator new(...) throw(), can return NULL [expr.new/13]. */
10617 if (IDENTIFIER_NEW_OP_P (DECL_NAME (current_function_decl))
10618 && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl))
10619 && ! flag_check_new
10620 && retval && null_ptr_cst_p (retval))
10621 warning (0, "%<operator new%> must not return NULL unless it is "
10622 "declared %<throw()%> (or %<-fcheck-new%> is in effect)");
10623
10624 /* Effective C++ rule 15. See also start_function. */
10625 if (warn_ecpp
10626 && DECL_NAME (current_function_decl) == assign_op_identifier
10627 && !type_dependent_expression_p (retval))
10628 {
10629 bool warn = true;
10630
10631 /* The function return type must be a reference to the current
10632 class. */
10633 if (TYPE_REF_P (valtype)
10634 && same_type_ignoring_top_level_qualifiers_p
10635 (TREE_TYPE (valtype), TREE_TYPE (current_class_ref)))
10636 {
10637 /* Returning '*this' is obviously OK. */
10638 if (retval == current_class_ref)
10639 warn = false;
10640 /* If we are calling a function whose return type is the same of
10641 the current class reference, it is ok. */
10642 else if (INDIRECT_REF_P (retval)
10643 && TREE_CODE (TREE_OPERAND (retval, 0)) == CALL_EXPR)
10644 warn = false;
10645 }
10646
10647 if (warn)
10648 warning_at (loc, OPT_Weffc__,
10649 "%<operator=%> should return a reference to %<*this%>");
10650 }
10651
10652 if (dependent_type_p (functype)
10653 || type_dependent_expression_p (retval))
10654 {
10655 dependent:
10656 /* We should not have changed the return value. */
10657 gcc_assert (retval == saved_retval);
10658 /* We don't know if this is an lvalue or rvalue use, but
10659 either way we can mark it as read. */
10660 mark_exp_read (retval);
10661 return retval;
10662 }
10663
10664 /* The fabled Named Return Value optimization, as per [class.copy]/15:
10665
10666 [...] For a function with a class return type, if the expression
10667 in the return statement is the name of a local object, and the cv-
10668 unqualified type of the local object is the same as the function
10669 return type, an implementation is permitted to omit creating the tem-
10670 porary object to hold the function return value [...]
10671
10672 So, if this is a value-returning function that always returns the same
10673 local variable, remember it.
10674
10675 It might be nice to be more flexible, and choose the first suitable
10676 variable even if the function sometimes returns something else, but
10677 then we run the risk of clobbering the variable we chose if the other
10678 returned expression uses the chosen variable somehow. And people expect
10679 this restriction, anyway. (jason 2000-11-19)
10680
10681 See finish_function and finalize_nrv for the rest of this optimization. */
10682 tree bare_retval = NULL_TREE;
10683 if (retval)
10684 {
10685 retval = maybe_undo_parenthesized_ref (retval);
10686 bare_retval = tree_strip_any_location_wrapper (retval);
10687 }
10688
10689 bool named_return_value_okay_p = can_do_nrvo_p (bare_retval, functype);
10690 if (fn_returns_value_p && flag_elide_constructors)
10691 {
10692 if (named_return_value_okay_p
10693 /* The current NRV implementation breaks if a backward goto needs to
10694 destroy the object (PR92407). */
10695 && !cp_function_chain->backward_goto
10696 && (current_function_return_value == NULL_TREE
10697 || current_function_return_value == bare_retval))
10698 current_function_return_value = bare_retval;
10699 else
10700 current_function_return_value = error_mark_node;
10701 }
10702
10703 /* We don't need to do any conversions when there's nothing being
10704 returned. */
10705 if (!retval)
10706 return NULL_TREE;
10707
10708 if (!named_return_value_okay_p)
10709 maybe_warn_pessimizing_move (retval, functype);
10710
10711 /* Do any required conversions. */
10712 if (bare_retval == result || DECL_CONSTRUCTOR_P (current_function_decl))
10713 /* No conversions are required. */
10714 ;
10715 else
10716 {
10717 int flags = LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING;
10718
10719 /* The functype's return type will have been set to void, if it
10720 was an incomplete type. Just treat this as 'return;' */
10721 if (VOID_TYPE_P (functype))
10722 return error_mark_node;
10723
10724 if (processing_template_decl)
10725 retval = build_non_dependent_expr (retval);
10726
10727 /* Under C++11 [12.8/32 class.copy], a returned lvalue is sometimes
10728 treated as an rvalue for the purposes of overload resolution to
10729 favor move constructors over copy constructors.
10730
10731 Note that these conditions are similar to, but not as strict as,
10732 the conditions for the named return value optimization. */
10733 bool converted = false;
10734 tree moved;
10735 /* This is only interesting for class type. */
10736 if (CLASS_TYPE_P (functype)
10737 && (moved = treat_lvalue_as_rvalue_p (retval, /*return*/true)))
10738 {
10739 if (cxx_dialect < cxx20)
10740 {
10741 moved = convert_for_initialization
10742 (NULL_TREE, functype, moved, flags|LOOKUP_PREFER_RVALUE,
10743 ICR_RETURN, NULL_TREE, 0, tf_none);
10744 if (moved != error_mark_node)
10745 {
10746 retval = moved;
10747 converted = true;
10748 }
10749 }
10750 else
10751 /* In C++20 we just treat the return value as an rvalue that
10752 can bind to lvalue refs. */
10753 retval = moved;
10754 }
10755
10756 /* The call in a (lambda) thunk needs no conversions. */
10757 if (TREE_CODE (retval) == CALL_EXPR
10758 && call_from_lambda_thunk_p (retval))
10759 converted = true;
10760
10761 /* First convert the value to the function's return type, then
10762 to the type of return value's location to handle the
10763 case that functype is smaller than the valtype. */
10764 if (!converted)
10765 retval = convert_for_initialization
10766 (NULL_TREE, functype, retval, flags, ICR_RETURN, NULL_TREE, 0,
10767 tf_warning_or_error);
10768 retval = convert (valtype, retval);
10769
10770 /* If the conversion failed, treat this just like `return;'. */
10771 if (retval == error_mark_node)
10772 return retval;
10773 /* We can't initialize a register from a AGGR_INIT_EXPR. */
10774 else if (! cfun->returns_struct
10775 && TREE_CODE (retval) == TARGET_EXPR
10776 && TREE_CODE (TREE_OPERAND (retval, 1)) == AGGR_INIT_EXPR)
10777 retval = build2 (COMPOUND_EXPR, TREE_TYPE (retval), retval,
10778 TREE_OPERAND (retval, 0));
10779 else if (!processing_template_decl
10780 && maybe_warn_about_returning_address_of_local (retval, loc)
10781 && INDIRECT_TYPE_P (valtype))
10782 retval = build2 (COMPOUND_EXPR, TREE_TYPE (retval), retval,
10783 build_zero_cst (TREE_TYPE (retval)));
10784 }
10785
10786 if (processing_template_decl)
10787 return saved_retval;
10788
10789 /* Actually copy the value returned into the appropriate location. */
10790 if (retval && retval != result)
10791 retval = build2 (INIT_EXPR, TREE_TYPE (result), result, retval);
10792
10793 if (tree set = maybe_set_retval_sentinel ())
10794 retval = build2 (COMPOUND_EXPR, void_type_node, retval, set);
10795
10796 return retval;
10797 }
10798
10799
10800 /* Returns nonzero if the pointer-type FROM can be converted to the
10801 pointer-type TO via a qualification conversion. If CONSTP is -1,
10802 then we return nonzero if the pointers are similar, and the
10803 cv-qualification signature of FROM is a proper subset of that of TO.
10804
10805 If CONSTP is positive, then all outer pointers have been
10806 const-qualified. */
10807
10808 static bool
comp_ptr_ttypes_real(tree to,tree from,int constp)10809 comp_ptr_ttypes_real (tree to, tree from, int constp)
10810 {
10811 bool to_more_cv_qualified = false;
10812 bool is_opaque_pointer = false;
10813
10814 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
10815 {
10816 if (TREE_CODE (to) != TREE_CODE (from))
10817 return false;
10818
10819 if (TREE_CODE (from) == OFFSET_TYPE
10820 && !same_type_p (TYPE_OFFSET_BASETYPE (from),
10821 TYPE_OFFSET_BASETYPE (to)))
10822 return false;
10823
10824 /* Const and volatile mean something different for function and
10825 array types, so the usual checks are not appropriate. We'll
10826 check the array type elements in further iterations. */
10827 if (!FUNC_OR_METHOD_TYPE_P (to) && TREE_CODE (to) != ARRAY_TYPE)
10828 {
10829 if (!at_least_as_qualified_p (to, from))
10830 return false;
10831
10832 if (!at_least_as_qualified_p (from, to))
10833 {
10834 if (constp == 0)
10835 return false;
10836 to_more_cv_qualified = true;
10837 }
10838
10839 if (constp > 0)
10840 constp &= TYPE_READONLY (to);
10841 }
10842
10843 if (VECTOR_TYPE_P (to))
10844 is_opaque_pointer = vector_targets_convertible_p (to, from);
10845
10846 /* P0388R4 allows a conversion from int[N] to int[] but not the
10847 other way round. When both arrays have bounds but they do
10848 not match, then no conversion is possible. */
10849 if (TREE_CODE (to) == ARRAY_TYPE
10850 && !comp_array_types (to, from, bounds_first, /*strict=*/false))
10851 return false;
10852
10853 if (!TYPE_PTR_P (to)
10854 && !TYPE_PTRDATAMEM_P (to)
10855 /* CWG 330 says we need to look through arrays. */
10856 && TREE_CODE (to) != ARRAY_TYPE)
10857 return ((constp >= 0 || to_more_cv_qualified)
10858 && (is_opaque_pointer
10859 || same_type_ignoring_top_level_qualifiers_p (to, from)));
10860 }
10861 }
10862
10863 /* When comparing, say, char ** to char const **, this function takes
10864 the 'char *' and 'char const *'. Do not pass non-pointer/reference
10865 types to this function. */
10866
10867 int
comp_ptr_ttypes(tree to,tree from)10868 comp_ptr_ttypes (tree to, tree from)
10869 {
10870 return comp_ptr_ttypes_real (to, from, 1);
10871 }
10872
10873 /* Returns true iff FNTYPE is a non-class type that involves
10874 error_mark_node. We can get FUNCTION_TYPE with buried error_mark_node
10875 if a parameter type is ill-formed. */
10876
10877 bool
error_type_p(const_tree type)10878 error_type_p (const_tree type)
10879 {
10880 tree t;
10881
10882 switch (TREE_CODE (type))
10883 {
10884 case ERROR_MARK:
10885 return true;
10886
10887 case POINTER_TYPE:
10888 case REFERENCE_TYPE:
10889 case OFFSET_TYPE:
10890 return error_type_p (TREE_TYPE (type));
10891
10892 case FUNCTION_TYPE:
10893 case METHOD_TYPE:
10894 if (error_type_p (TREE_TYPE (type)))
10895 return true;
10896 for (t = TYPE_ARG_TYPES (type); t; t = TREE_CHAIN (t))
10897 if (error_type_p (TREE_VALUE (t)))
10898 return true;
10899 return false;
10900
10901 case RECORD_TYPE:
10902 if (TYPE_PTRMEMFUNC_P (type))
10903 return error_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type));
10904 return false;
10905
10906 default:
10907 return false;
10908 }
10909 }
10910
10911 /* Returns true if to and from are (possibly multi-level) pointers to the same
10912 type or inheritance-related types, regardless of cv-quals. */
10913
10914 bool
ptr_reasonably_similar(const_tree to,const_tree from)10915 ptr_reasonably_similar (const_tree to, const_tree from)
10916 {
10917 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
10918 {
10919 /* Any target type is similar enough to void. */
10920 if (VOID_TYPE_P (to))
10921 return !error_type_p (from);
10922 if (VOID_TYPE_P (from))
10923 return !error_type_p (to);
10924
10925 if (TREE_CODE (to) != TREE_CODE (from))
10926 return false;
10927
10928 if (TREE_CODE (from) == OFFSET_TYPE
10929 && comptypes (TYPE_OFFSET_BASETYPE (to),
10930 TYPE_OFFSET_BASETYPE (from),
10931 COMPARE_BASE | COMPARE_DERIVED))
10932 continue;
10933
10934 if (VECTOR_TYPE_P (to)
10935 && vector_types_convertible_p (to, from, false))
10936 return true;
10937
10938 if (TREE_CODE (to) == INTEGER_TYPE
10939 && TYPE_PRECISION (to) == TYPE_PRECISION (from))
10940 return true;
10941
10942 if (TREE_CODE (to) == FUNCTION_TYPE)
10943 return !error_type_p (to) && !error_type_p (from);
10944
10945 if (!TYPE_PTR_P (to))
10946 {
10947 /* When either type is incomplete avoid DERIVED_FROM_P,
10948 which may call complete_type (c++/57942). */
10949 bool b = !COMPLETE_TYPE_P (to) || !COMPLETE_TYPE_P (from);
10950 return comptypes
10951 (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
10952 b ? COMPARE_STRICT : COMPARE_BASE | COMPARE_DERIVED);
10953 }
10954 }
10955 }
10956
10957 /* Return true if TO and FROM (both of which are POINTER_TYPEs or
10958 pointer-to-member types) are the same, ignoring cv-qualification at
10959 all levels. CB says how we should behave when comparing array bounds. */
10960
10961 bool
comp_ptr_ttypes_const(tree to,tree from,compare_bounds_t cb)10962 comp_ptr_ttypes_const (tree to, tree from, compare_bounds_t cb)
10963 {
10964 bool is_opaque_pointer = false;
10965
10966 for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
10967 {
10968 if (TREE_CODE (to) != TREE_CODE (from))
10969 return false;
10970
10971 if (TREE_CODE (from) == OFFSET_TYPE
10972 && same_type_p (TYPE_OFFSET_BASETYPE (from),
10973 TYPE_OFFSET_BASETYPE (to)))
10974 continue;
10975
10976 if (VECTOR_TYPE_P (to))
10977 is_opaque_pointer = vector_targets_convertible_p (to, from);
10978
10979 if (TREE_CODE (to) == ARRAY_TYPE
10980 /* Ignore cv-qualification, but if we see e.g. int[3] and int[4],
10981 we must fail. */
10982 && !comp_array_types (to, from, cb, /*strict=*/false))
10983 return false;
10984
10985 /* CWG 330 says we need to look through arrays. */
10986 if (!TYPE_PTR_P (to) && TREE_CODE (to) != ARRAY_TYPE)
10987 return (is_opaque_pointer
10988 || same_type_ignoring_top_level_qualifiers_p (to, from));
10989 }
10990 }
10991
10992 /* Returns the type qualifiers for this type, including the qualifiers on the
10993 elements for an array type. */
10994
10995 int
cp_type_quals(const_tree type)10996 cp_type_quals (const_tree type)
10997 {
10998 int quals;
10999 /* This CONST_CAST is okay because strip_array_types returns its
11000 argument unmodified and we assign it to a const_tree. */
11001 type = strip_array_types (CONST_CAST_TREE (type));
11002 if (type == error_mark_node
11003 /* Quals on a FUNCTION_TYPE are memfn quals. */
11004 || TREE_CODE (type) == FUNCTION_TYPE)
11005 return TYPE_UNQUALIFIED;
11006 quals = TYPE_QUALS (type);
11007 /* METHOD and REFERENCE_TYPEs should never have quals. */
11008 gcc_assert ((TREE_CODE (type) != METHOD_TYPE
11009 && !TYPE_REF_P (type))
11010 || ((quals & (TYPE_QUAL_CONST|TYPE_QUAL_VOLATILE))
11011 == TYPE_UNQUALIFIED));
11012 return quals;
11013 }
11014
11015 /* Returns the function-ref-qualifier for TYPE */
11016
11017 cp_ref_qualifier
type_memfn_rqual(const_tree type)11018 type_memfn_rqual (const_tree type)
11019 {
11020 gcc_assert (FUNC_OR_METHOD_TYPE_P (type));
11021
11022 if (!FUNCTION_REF_QUALIFIED (type))
11023 return REF_QUAL_NONE;
11024 else if (FUNCTION_RVALUE_QUALIFIED (type))
11025 return REF_QUAL_RVALUE;
11026 else
11027 return REF_QUAL_LVALUE;
11028 }
11029
11030 /* Returns the function-cv-quals for TYPE, which must be a FUNCTION_TYPE or
11031 METHOD_TYPE. */
11032
11033 int
type_memfn_quals(const_tree type)11034 type_memfn_quals (const_tree type)
11035 {
11036 if (TREE_CODE (type) == FUNCTION_TYPE)
11037 return TYPE_QUALS (type);
11038 else if (TREE_CODE (type) == METHOD_TYPE)
11039 return cp_type_quals (class_of_this_parm (type));
11040 else
11041 gcc_unreachable ();
11042 }
11043
11044 /* Returns the FUNCTION_TYPE TYPE with its function-cv-quals changed to
11045 MEMFN_QUALS and its ref-qualifier to RQUAL. */
11046
11047 tree
apply_memfn_quals(tree type,cp_cv_quals memfn_quals,cp_ref_qualifier rqual)11048 apply_memfn_quals (tree type, cp_cv_quals memfn_quals, cp_ref_qualifier rqual)
11049 {
11050 /* Could handle METHOD_TYPE here if necessary. */
11051 gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
11052 if (TYPE_QUALS (type) == memfn_quals
11053 && type_memfn_rqual (type) == rqual)
11054 return type;
11055
11056 /* This should really have a different TYPE_MAIN_VARIANT, but that gets
11057 complex. */
11058 tree result = build_qualified_type (type, memfn_quals);
11059 return build_ref_qualified_type (result, rqual);
11060 }
11061
11062 /* Returns nonzero if TYPE is const or volatile. */
11063
11064 bool
cv_qualified_p(const_tree type)11065 cv_qualified_p (const_tree type)
11066 {
11067 int quals = cp_type_quals (type);
11068 return (quals & (TYPE_QUAL_CONST|TYPE_QUAL_VOLATILE)) != 0;
11069 }
11070
11071 /* Returns nonzero if the TYPE contains a mutable member. */
11072
11073 bool
cp_has_mutable_p(const_tree type)11074 cp_has_mutable_p (const_tree type)
11075 {
11076 /* This CONST_CAST is okay because strip_array_types returns its
11077 argument unmodified and we assign it to a const_tree. */
11078 type = strip_array_types (CONST_CAST_TREE(type));
11079
11080 return CLASS_TYPE_P (type) && CLASSTYPE_HAS_MUTABLE (type);
11081 }
11082
11083 /* Set TREE_READONLY and TREE_VOLATILE on DECL as indicated by the
11084 TYPE_QUALS. For a VAR_DECL, this may be an optimistic
11085 approximation. In particular, consider:
11086
11087 int f();
11088 struct S { int i; };
11089 const S s = { f(); }
11090
11091 Here, we will make "s" as TREE_READONLY (because it is declared
11092 "const") -- only to reverse ourselves upon seeing that the
11093 initializer is non-constant. */
11094
11095 void
cp_apply_type_quals_to_decl(int type_quals,tree decl)11096 cp_apply_type_quals_to_decl (int type_quals, tree decl)
11097 {
11098 tree type = TREE_TYPE (decl);
11099
11100 if (type == error_mark_node)
11101 return;
11102
11103 if (TREE_CODE (decl) == TYPE_DECL)
11104 return;
11105
11106 gcc_assert (!(TREE_CODE (type) == FUNCTION_TYPE
11107 && type_quals != TYPE_UNQUALIFIED));
11108
11109 /* Avoid setting TREE_READONLY incorrectly. */
11110 /* We used to check TYPE_NEEDS_CONSTRUCTING here, but now a constexpr
11111 constructor can produce constant init, so rely on cp_finish_decl to
11112 clear TREE_READONLY if the variable has non-constant init. */
11113
11114 /* If the type has (or might have) a mutable component, that component
11115 might be modified. */
11116 if (TYPE_HAS_MUTABLE_P (type) || !COMPLETE_TYPE_P (type))
11117 type_quals &= ~TYPE_QUAL_CONST;
11118
11119 c_apply_type_quals_to_decl (type_quals, decl);
11120 }
11121
11122 /* Subroutine of casts_away_constness. Make T1 and T2 point at
11123 exemplar types such that casting T1 to T2 is casting away constness
11124 if and only if there is no implicit conversion from T1 to T2. */
11125
11126 static void
casts_away_constness_r(tree * t1,tree * t2,tsubst_flags_t complain)11127 casts_away_constness_r (tree *t1, tree *t2, tsubst_flags_t complain)
11128 {
11129 int quals1;
11130 int quals2;
11131
11132 /* [expr.const.cast]
11133
11134 For multi-level pointer to members and multi-level mixed pointers
11135 and pointers to members (conv.qual), the "member" aspect of a
11136 pointer to member level is ignored when determining if a const
11137 cv-qualifier has been cast away. */
11138 /* [expr.const.cast]
11139
11140 For two pointer types:
11141
11142 X1 is T1cv1,1 * ... cv1,N * where T1 is not a pointer type
11143 X2 is T2cv2,1 * ... cv2,M * where T2 is not a pointer type
11144 K is min(N,M)
11145
11146 casting from X1 to X2 casts away constness if, for a non-pointer
11147 type T there does not exist an implicit conversion (clause
11148 _conv_) from:
11149
11150 Tcv1,(N-K+1) * cv1,(N-K+2) * ... cv1,N *
11151
11152 to
11153
11154 Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *. */
11155 if ((!TYPE_PTR_P (*t1) && !TYPE_PTRDATAMEM_P (*t1))
11156 || (!TYPE_PTR_P (*t2) && !TYPE_PTRDATAMEM_P (*t2)))
11157 {
11158 *t1 = cp_build_qualified_type (void_type_node,
11159 cp_type_quals (*t1));
11160 *t2 = cp_build_qualified_type (void_type_node,
11161 cp_type_quals (*t2));
11162 return;
11163 }
11164
11165 quals1 = cp_type_quals (*t1);
11166 quals2 = cp_type_quals (*t2);
11167
11168 if (TYPE_PTRDATAMEM_P (*t1))
11169 *t1 = TYPE_PTRMEM_POINTED_TO_TYPE (*t1);
11170 else
11171 *t1 = TREE_TYPE (*t1);
11172 if (TYPE_PTRDATAMEM_P (*t2))
11173 *t2 = TYPE_PTRMEM_POINTED_TO_TYPE (*t2);
11174 else
11175 *t2 = TREE_TYPE (*t2);
11176
11177 casts_away_constness_r (t1, t2, complain);
11178 *t1 = build_pointer_type (*t1);
11179 *t2 = build_pointer_type (*t2);
11180 *t1 = cp_build_qualified_type (*t1, quals1);
11181 *t2 = cp_build_qualified_type (*t2, quals2);
11182 }
11183
11184 /* Returns nonzero if casting from TYPE1 to TYPE2 casts away
11185 constness.
11186
11187 ??? This function returns non-zero if casting away qualifiers not
11188 just const. We would like to return to the caller exactly which
11189 qualifiers are casted away to give more accurate diagnostics.
11190 */
11191
11192 static bool
casts_away_constness(tree t1,tree t2,tsubst_flags_t complain)11193 casts_away_constness (tree t1, tree t2, tsubst_flags_t complain)
11194 {
11195 if (TYPE_REF_P (t2))
11196 {
11197 /* [expr.const.cast]
11198
11199 Casting from an lvalue of type T1 to an lvalue of type T2
11200 using a reference cast casts away constness if a cast from an
11201 rvalue of type "pointer to T1" to the type "pointer to T2"
11202 casts away constness. */
11203 t1 = (TYPE_REF_P (t1) ? TREE_TYPE (t1) : t1);
11204 return casts_away_constness (build_pointer_type (t1),
11205 build_pointer_type (TREE_TYPE (t2)),
11206 complain);
11207 }
11208
11209 if (TYPE_PTRDATAMEM_P (t1) && TYPE_PTRDATAMEM_P (t2))
11210 /* [expr.const.cast]
11211
11212 Casting from an rvalue of type "pointer to data member of X
11213 of type T1" to the type "pointer to data member of Y of type
11214 T2" casts away constness if a cast from an rvalue of type
11215 "pointer to T1" to the type "pointer to T2" casts away
11216 constness. */
11217 return casts_away_constness
11218 (build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t1)),
11219 build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t2)),
11220 complain);
11221
11222 /* Casting away constness is only something that makes sense for
11223 pointer or reference types. */
11224 if (!TYPE_PTR_P (t1) || !TYPE_PTR_P (t2))
11225 return false;
11226
11227 /* Top-level qualifiers don't matter. */
11228 t1 = TYPE_MAIN_VARIANT (t1);
11229 t2 = TYPE_MAIN_VARIANT (t2);
11230 casts_away_constness_r (&t1, &t2, complain);
11231 if (!can_convert (t2, t1, complain))
11232 return true;
11233
11234 return false;
11235 }
11236
11237 /* If T is a REFERENCE_TYPE return the type to which T refers.
11238 Otherwise, return T itself. */
11239
11240 tree
non_reference(tree t)11241 non_reference (tree t)
11242 {
11243 if (t && TYPE_REF_P (t))
11244 t = TREE_TYPE (t);
11245 return t;
11246 }
11247
11248
11249 /* Return nonzero if REF is an lvalue valid for this language;
11250 otherwise, print an error message and return zero. USE says
11251 how the lvalue is being used and so selects the error message. */
11252
11253 int
lvalue_or_else(tree ref,enum lvalue_use use,tsubst_flags_t complain)11254 lvalue_or_else (tree ref, enum lvalue_use use, tsubst_flags_t complain)
11255 {
11256 cp_lvalue_kind kind = lvalue_kind (ref);
11257
11258 if (kind == clk_none)
11259 {
11260 if (complain & tf_error)
11261 lvalue_error (cp_expr_loc_or_input_loc (ref), use);
11262 return 0;
11263 }
11264 else if (kind & (clk_rvalueref|clk_class))
11265 {
11266 if (!(complain & tf_error))
11267 return 0;
11268 /* Make this a permerror because we used to accept it. */
11269 permerror (cp_expr_loc_or_input_loc (ref),
11270 "using rvalue as lvalue");
11271 }
11272 return 1;
11273 }
11274
11275 /* Return true if a user-defined literal operator is a raw operator. */
11276
11277 bool
check_raw_literal_operator(const_tree decl)11278 check_raw_literal_operator (const_tree decl)
11279 {
11280 tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
11281 tree argtype;
11282 int arity;
11283 bool maybe_raw_p = false;
11284
11285 /* Count the number and type of arguments and check for ellipsis. */
11286 for (argtype = argtypes, arity = 0;
11287 argtype && argtype != void_list_node;
11288 ++arity, argtype = TREE_CHAIN (argtype))
11289 {
11290 tree t = TREE_VALUE (argtype);
11291
11292 if (same_type_p (t, const_string_type_node))
11293 maybe_raw_p = true;
11294 }
11295 if (!argtype)
11296 return false; /* Found ellipsis. */
11297
11298 if (!maybe_raw_p || arity != 1)
11299 return false;
11300
11301 return true;
11302 }
11303
11304
11305 /* Return true if a user-defined literal operator has one of the allowed
11306 argument types. */
11307
11308 bool
check_literal_operator_args(const_tree decl,bool * long_long_unsigned_p,bool * long_double_p)11309 check_literal_operator_args (const_tree decl,
11310 bool *long_long_unsigned_p, bool *long_double_p)
11311 {
11312 tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
11313
11314 *long_long_unsigned_p = false;
11315 *long_double_p = false;
11316 if (processing_template_decl || processing_specialization)
11317 return argtypes == void_list_node;
11318 else
11319 {
11320 tree argtype;
11321 int arity;
11322 int max_arity = 2;
11323
11324 /* Count the number and type of arguments and check for ellipsis. */
11325 for (argtype = argtypes, arity = 0;
11326 argtype && argtype != void_list_node;
11327 argtype = TREE_CHAIN (argtype))
11328 {
11329 tree t = TREE_VALUE (argtype);
11330 ++arity;
11331
11332 if (TYPE_PTR_P (t))
11333 {
11334 bool maybe_raw_p = false;
11335 t = TREE_TYPE (t);
11336 if (cp_type_quals (t) != TYPE_QUAL_CONST)
11337 return false;
11338 t = TYPE_MAIN_VARIANT (t);
11339 if ((maybe_raw_p = same_type_p (t, char_type_node))
11340 || same_type_p (t, wchar_type_node)
11341 || same_type_p (t, char8_type_node)
11342 || same_type_p (t, char16_type_node)
11343 || same_type_p (t, char32_type_node))
11344 {
11345 argtype = TREE_CHAIN (argtype);
11346 if (!argtype)
11347 return false;
11348 t = TREE_VALUE (argtype);
11349 if (maybe_raw_p && argtype == void_list_node)
11350 return true;
11351 else if (same_type_p (t, size_type_node))
11352 {
11353 ++arity;
11354 continue;
11355 }
11356 else
11357 return false;
11358 }
11359 }
11360 else if (same_type_p (t, long_long_unsigned_type_node))
11361 {
11362 max_arity = 1;
11363 *long_long_unsigned_p = true;
11364 }
11365 else if (same_type_p (t, long_double_type_node))
11366 {
11367 max_arity = 1;
11368 *long_double_p = true;
11369 }
11370 else if (same_type_p (t, char_type_node))
11371 max_arity = 1;
11372 else if (same_type_p (t, wchar_type_node))
11373 max_arity = 1;
11374 else if (same_type_p (t, char8_type_node))
11375 max_arity = 1;
11376 else if (same_type_p (t, char16_type_node))
11377 max_arity = 1;
11378 else if (same_type_p (t, char32_type_node))
11379 max_arity = 1;
11380 else
11381 return false;
11382 }
11383 if (!argtype)
11384 return false; /* Found ellipsis. */
11385
11386 if (arity != max_arity)
11387 return false;
11388
11389 return true;
11390 }
11391 }
11392
11393 /* Always returns false since unlike C90, C++ has no concept of implicit
11394 function declarations. */
11395
11396 bool
c_decl_implicit(const_tree)11397 c_decl_implicit (const_tree)
11398 {
11399 return false;
11400 }
11401