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, &params,
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