xref: /netbsd-src/external/gpl3/gcc/dist/gcc/cp/typeck.cc (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
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