xref: /netbsd-src/external/gpl3/gcc/dist/gcc/cp/constexpr.cc (revision 0a3071956a3a9fdebdbf7f338cf2d439b45fc728)
1 /* Perform -*- C++ -*- constant expression evaluation, including calls to
2    constexpr functions.  These routines are used both during actual parsing
3    and during the instantiation of template functions.
4 
5    Copyright (C) 1998-2022 Free Software Foundation, Inc.
6 
7    This file is part of GCC.
8 
9    GCC is free software; you can redistribute it and/or modify it
10    under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3, or (at your option)
12    any later version.
13 
14    GCC is distributed in the hope that it will be useful, but
15    WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17    General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22 
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "cp-tree.h"
27 #include "varasm.h"
28 #include "c-family/c-objc.h"
29 #include "tree-iterator.h"
30 #include "gimplify.h"
31 #include "builtins.h"
32 #include "tree-inline.h"
33 #include "ubsan.h"
34 #include "gimple-fold.h"
35 #include "timevar.h"
36 #include "fold-const-call.h"
37 #include "stor-layout.h"
38 #include "cgraph.h"
39 #include "opts.h"
40 #include "stringpool.h"
41 #include "attribs.h"
42 
43 static bool verify_constant (tree, bool, bool *, bool *);
44 #define VERIFY_CONSTANT(X)						\
45 do {									\
46   if (verify_constant ((X), ctx->quiet, non_constant_p, overflow_p)) \
47     return t;								\
48  } while (0)
49 
50 static HOST_WIDE_INT find_array_ctor_elt (tree ary, tree dindex,
51 					  bool insert = false);
52 static int array_index_cmp (tree key, tree index);
53 
54 /* Returns true iff FUN is an instantiation of a constexpr function
55    template or a defaulted constexpr function.  */
56 
57 bool
is_instantiation_of_constexpr(tree fun)58 is_instantiation_of_constexpr (tree fun)
59 {
60   return ((DECL_TEMPLOID_INSTANTIATION (fun)
61 	   && DECL_DECLARED_CONSTEXPR_P (DECL_TI_TEMPLATE (fun)))
62 	  || (DECL_DEFAULTED_FN (fun)
63 	      && DECL_DECLARED_CONSTEXPR_P (fun)));
64 }
65 
66 /* Return true if T is a literal type.   */
67 
68 bool
literal_type_p(tree t)69 literal_type_p (tree t)
70 {
71   if (SCALAR_TYPE_P (t)
72       || VECTOR_TYPE_P (t)
73       || TYPE_REF_P (t)
74       || (VOID_TYPE_P (t) && cxx_dialect >= cxx14))
75     return true;
76   if (CLASS_TYPE_P (t))
77     {
78       t = complete_type (t);
79       gcc_assert (COMPLETE_TYPE_P (t) || errorcount);
80       return CLASSTYPE_LITERAL_P (t);
81     }
82   if (TREE_CODE (t) == ARRAY_TYPE)
83     return literal_type_p (strip_array_types (t));
84   return false;
85 }
86 
87 /* If DECL is a variable declared `constexpr', require its type
88    be literal.  Return error_mark_node if we give an error, the
89    DECL otherwise.  */
90 
91 tree
ensure_literal_type_for_constexpr_object(tree decl)92 ensure_literal_type_for_constexpr_object (tree decl)
93 {
94   tree type = TREE_TYPE (decl);
95   if (VAR_P (decl)
96       && (DECL_DECLARED_CONSTEXPR_P (decl)
97 	  || var_in_constexpr_fn (decl))
98       && !processing_template_decl)
99     {
100       tree stype = strip_array_types (type);
101       if (CLASS_TYPE_P (stype) && !COMPLETE_TYPE_P (complete_type (stype)))
102 	/* Don't complain here, we'll complain about incompleteness
103 	   when we try to initialize the variable.  */;
104       else if (!literal_type_p (type))
105 	{
106 	  if (DECL_DECLARED_CONSTEXPR_P (decl))
107 	    {
108 	      auto_diagnostic_group d;
109 	      error_at (DECL_SOURCE_LOCATION (decl),
110 			"the type %qT of %<constexpr%> variable %qD "
111 			"is not literal", type, decl);
112 	      explain_non_literal_class (type);
113 	      decl = error_mark_node;
114 	    }
115 	  else if (cxx_dialect < cxx23)
116 	    {
117 	      if (!is_instantiation_of_constexpr (current_function_decl))
118 		{
119 		  auto_diagnostic_group d;
120 		  error_at (DECL_SOURCE_LOCATION (decl),
121 			    "variable %qD of non-literal type %qT in "
122 			    "%<constexpr%> function only available with "
123 			    "%<-std=c++2b%> or %<-std=gnu++2b%>", decl, type);
124 		  explain_non_literal_class (type);
125 		  decl = error_mark_node;
126 		}
127 	      cp_function_chain->invalid_constexpr = true;
128 	    }
129 	}
130       else if (DECL_DECLARED_CONSTEXPR_P (decl)
131 	       && variably_modified_type_p (type, NULL_TREE))
132 	{
133 	  error_at (DECL_SOURCE_LOCATION (decl),
134 		    "%<constexpr%> variable %qD has variably-modified "
135 		    "type %qT", decl, type);
136 	  decl = error_mark_node;
137 	}
138     }
139   return decl;
140 }
141 
142 struct constexpr_fundef_hasher : ggc_ptr_hash<constexpr_fundef>
143 {
144   static hashval_t hash (const constexpr_fundef *);
145   static bool equal (const constexpr_fundef *, const constexpr_fundef *);
146 };
147 
148 /* This table holds all constexpr function definitions seen in
149    the current translation unit.  */
150 
151 static GTY (()) hash_table<constexpr_fundef_hasher> *constexpr_fundef_table;
152 
153 /* Utility function used for managing the constexpr function table.
154    Return true if the entries pointed to by P and Q are for the
155    same constexpr function.  */
156 
157 inline bool
equal(const constexpr_fundef * lhs,const constexpr_fundef * rhs)158 constexpr_fundef_hasher::equal (const constexpr_fundef *lhs,
159 				const constexpr_fundef *rhs)
160 {
161   return lhs->decl == rhs->decl;
162 }
163 
164 /* Utility function used for managing the constexpr function table.
165    Return a hash value for the entry pointed to by Q.  */
166 
167 inline hashval_t
hash(const constexpr_fundef * fundef)168 constexpr_fundef_hasher::hash (const constexpr_fundef *fundef)
169 {
170   return DECL_UID (fundef->decl);
171 }
172 
173 /* Return a previously saved definition of function FUN.   */
174 
175 constexpr_fundef *
retrieve_constexpr_fundef(tree fun)176 retrieve_constexpr_fundef (tree fun)
177 {
178   if (constexpr_fundef_table == NULL)
179     return NULL;
180 
181   constexpr_fundef fundef = { fun, NULL_TREE, NULL_TREE, NULL_TREE };
182   return constexpr_fundef_table->find (&fundef);
183 }
184 
185 /* Check whether the parameter and return types of FUN are valid for a
186    constexpr function, and complain if COMPLAIN.  */
187 
188 bool
is_valid_constexpr_fn(tree fun,bool complain)189 is_valid_constexpr_fn (tree fun, bool complain)
190 {
191   bool ret = true;
192 
193   if (DECL_INHERITED_CTOR (fun)
194       && TREE_CODE (fun) == TEMPLATE_DECL)
195     {
196       ret = false;
197       if (complain)
198 	error ("inherited constructor %qD is not %<constexpr%>",
199 	       DECL_INHERITED_CTOR (fun));
200     }
201   else
202     {
203       for (tree parm = FUNCTION_FIRST_USER_PARM (fun);
204 	   parm != NULL_TREE; parm = TREE_CHAIN (parm))
205 	if (!literal_type_p (TREE_TYPE (parm)))
206 	  {
207 	    ret = false;
208 	    if (complain)
209 	      {
210 		auto_diagnostic_group d;
211 		error ("invalid type for parameter %d of %<constexpr%> "
212 		       "function %q+#D", DECL_PARM_INDEX (parm), fun);
213 		explain_non_literal_class (TREE_TYPE (parm));
214 	      }
215 	  }
216     }
217 
218   if (LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun)) && cxx_dialect < cxx17)
219     {
220       ret = false;
221       if (complain)
222 	inform (DECL_SOURCE_LOCATION (fun),
223 		"lambdas are implicitly %<constexpr%> only in C++17 and later");
224     }
225   else if (DECL_DESTRUCTOR_P (fun))
226     {
227       if (cxx_dialect < cxx20)
228 	{
229 	  ret = false;
230 	  if (complain)
231 	    error_at (DECL_SOURCE_LOCATION (fun),
232 		      "%<constexpr%> destructors only available"
233 		      " with %<-std=c++20%> or %<-std=gnu++20%>");
234 	}
235     }
236   else if (!DECL_CONSTRUCTOR_P (fun))
237     {
238       tree rettype = TREE_TYPE (TREE_TYPE (fun));
239       if (!literal_type_p (rettype))
240 	{
241 	  ret = false;
242 	  if (complain)
243 	    {
244 	      auto_diagnostic_group d;
245 	      error ("invalid return type %qT of %<constexpr%> function %q+D",
246 		     rettype, fun);
247 	      explain_non_literal_class (rettype);
248 	    }
249 	}
250 
251       /* C++14 DR 1684 removed this restriction.  */
252       if (cxx_dialect < cxx14
253 	  && DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
254 	  && !CLASSTYPE_LITERAL_P (DECL_CONTEXT (fun)))
255 	{
256 	  ret = false;
257 	  if (complain)
258 	    {
259 	      auto_diagnostic_group d;
260 	      if (pedwarn (DECL_SOURCE_LOCATION (fun), OPT_Wpedantic,
261 			     "enclosing class of %<constexpr%> non-static"
262 			     " member function %q+#D is not a literal type",
263 			     fun))
264 		explain_non_literal_class (DECL_CONTEXT (fun));
265 	    }
266 	}
267     }
268   else if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fun)))
269     {
270       ret = false;
271       if (complain)
272 	error ("%q#T has virtual base classes", DECL_CONTEXT (fun));
273     }
274 
275   return ret;
276 }
277 
278 /* Subroutine of build_data_member_initialization.  MEMBER is a COMPONENT_REF
279    for a member of an anonymous aggregate, INIT is the initializer for that
280    member, and VEC_OUTER is the vector of constructor elements for the class
281    whose constructor we are processing.  Add the initializer to the vector
282    and return true to indicate success.  */
283 
284 static bool
build_anon_member_initialization(tree member,tree init,vec<constructor_elt,va_gc> ** vec_outer)285 build_anon_member_initialization (tree member, tree init,
286 				  vec<constructor_elt, va_gc> **vec_outer)
287 {
288   /* MEMBER presents the relevant fields from the inside out, but we need
289      to build up the initializer from the outside in so that we can reuse
290      previously built CONSTRUCTORs if this is, say, the second field in an
291      anonymous struct.  So we use a vec as a stack.  */
292   auto_vec<tree, 2> fields;
293   do
294     {
295       fields.safe_push (TREE_OPERAND (member, 1));
296       member = TREE_OPERAND (member, 0);
297     }
298   while (ANON_AGGR_TYPE_P (TREE_TYPE (member))
299 	 && TREE_CODE (member) == COMPONENT_REF);
300 
301   /* VEC has the constructor elements vector for the context of FIELD.
302      If FIELD is an anonymous aggregate, we will push inside it.  */
303   vec<constructor_elt, va_gc> **vec = vec_outer;
304   tree field;
305   while (field = fields.pop(),
306 	 ANON_AGGR_TYPE_P (TREE_TYPE (field)))
307     {
308       tree ctor;
309       /* If there is already an outer constructor entry for the anonymous
310 	 aggregate FIELD, use it; otherwise, insert one.  */
311       if (vec_safe_is_empty (*vec)
312 	  || (*vec)->last().index != field)
313 	{
314 	  ctor = build_constructor (TREE_TYPE (field), NULL);
315 	  CONSTRUCTOR_APPEND_ELT (*vec, field, ctor);
316 	}
317       else
318 	ctor = (*vec)->last().value;
319       vec = &CONSTRUCTOR_ELTS (ctor);
320     }
321 
322   /* Now we're at the innermost field, the one that isn't an anonymous
323      aggregate.  Add its initializer to the CONSTRUCTOR and we're done.  */
324   gcc_assert (fields.is_empty());
325   CONSTRUCTOR_APPEND_ELT (*vec, field, init);
326 
327   return true;
328 }
329 
330 /* Subroutine of  build_constexpr_constructor_member_initializers.
331    The expression tree T represents a data member initialization
332    in a (constexpr) constructor definition.  Build a pairing of
333    the data member with its initializer, and prepend that pair
334    to the existing initialization pair INITS.  */
335 
336 static bool
build_data_member_initialization(tree t,vec<constructor_elt,va_gc> ** vec)337 build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec)
338 {
339   tree member, init;
340   if (TREE_CODE (t) == CLEANUP_POINT_EXPR)
341     t = TREE_OPERAND (t, 0);
342   if (TREE_CODE (t) == EXPR_STMT)
343     t = TREE_OPERAND (t, 0);
344   if (t == error_mark_node)
345     return false;
346   if (TREE_CODE (t) == STATEMENT_LIST)
347     {
348       for (tree stmt : tsi_range (t))
349 	if (! build_data_member_initialization (stmt, vec))
350 	  return false;
351       return true;
352     }
353   if (TREE_CODE (t) == CLEANUP_STMT)
354     {
355       /* We can't see a CLEANUP_STMT in a constructor for a literal class,
356 	 but we can in a constexpr constructor for a non-literal class.  Just
357 	 ignore it; either all the initialization will be constant, in which
358 	 case the cleanup can't run, or it can't be constexpr.
359 	 Still recurse into CLEANUP_BODY.  */
360       return build_data_member_initialization (CLEANUP_BODY (t), vec);
361     }
362   if (TREE_CODE (t) == CONVERT_EXPR)
363     t = TREE_OPERAND (t, 0);
364   if (TREE_CODE (t) == INIT_EXPR
365       /* vptr initialization shows up as a MODIFY_EXPR.  In C++14 we only
366 	 use what this function builds for cx_check_missing_mem_inits, and
367 	 assignment in the ctor body doesn't count.  */
368       || (cxx_dialect < cxx14 && TREE_CODE (t) == MODIFY_EXPR))
369     {
370       member = TREE_OPERAND (t, 0);
371       init = break_out_target_exprs (TREE_OPERAND (t, 1));
372     }
373   else if (TREE_CODE (t) == CALL_EXPR)
374     {
375       tree fn = get_callee_fndecl (t);
376       if (!fn || !DECL_CONSTRUCTOR_P (fn))
377 	/* We're only interested in calls to subobject constructors.  */
378 	return true;
379       member = CALL_EXPR_ARG (t, 0);
380       /* We don't use build_cplus_new here because it complains about
381 	 abstract bases.  Leaving the call unwrapped means that it has the
382 	 wrong type, but cxx_eval_constant_expression doesn't care.  */
383       init = break_out_target_exprs (t);
384     }
385   else if (TREE_CODE (t) == BIND_EXPR)
386     return build_data_member_initialization (BIND_EXPR_BODY (t), vec);
387   else
388     /* Don't add anything else to the CONSTRUCTOR.  */
389     return true;
390   if (INDIRECT_REF_P (member))
391     member = TREE_OPERAND (member, 0);
392   if (TREE_CODE (member) == NOP_EXPR)
393     {
394       tree op = member;
395       STRIP_NOPS (op);
396       if (TREE_CODE (op) == ADDR_EXPR)
397 	{
398 	  gcc_assert (same_type_ignoring_top_level_qualifiers_p
399 		      (TREE_TYPE (TREE_TYPE (op)),
400 		       TREE_TYPE (TREE_TYPE (member))));
401 	  /* Initializing a cv-qualified member; we need to look through
402 	     the const_cast.  */
403 	  member = op;
404 	}
405       else if (op == current_class_ptr
406 	       && (same_type_ignoring_top_level_qualifiers_p
407 		   (TREE_TYPE (TREE_TYPE (member)),
408 		    current_class_type)))
409 	/* Delegating constructor.  */
410 	member = op;
411       else
412 	{
413 	  /* This is an initializer for an empty base; keep it for now so
414 	     we can check it in cxx_eval_bare_aggregate.  */
415 	  gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (member))));
416 	}
417     }
418   if (TREE_CODE (member) == ADDR_EXPR)
419     member = TREE_OPERAND (member, 0);
420   if (TREE_CODE (member) == COMPONENT_REF)
421     {
422       tree aggr = TREE_OPERAND (member, 0);
423       if (TREE_CODE (aggr) == VAR_DECL)
424 	/* Initializing a local variable, don't add anything.  */
425 	return true;
426       if (TREE_CODE (aggr) != COMPONENT_REF)
427 	/* Normal member initialization.  */
428 	member = TREE_OPERAND (member, 1);
429       else if (ANON_AGGR_TYPE_P (TREE_TYPE (aggr)))
430 	/* Initializing a member of an anonymous union.  */
431 	return build_anon_member_initialization (member, init, vec);
432       else
433 	/* We're initializing a vtable pointer in a base.  Leave it as
434 	   COMPONENT_REF so we remember the path to get to the vfield.  */
435 	gcc_assert (TREE_TYPE (member) == vtbl_ptr_type_node);
436     }
437 
438   /* Value-initialization can produce multiple initializers for the
439      same field; use the last one.  */
440   if (!vec_safe_is_empty (*vec) && (*vec)->last().index == member)
441     (*vec)->last().value = init;
442   else
443     CONSTRUCTOR_APPEND_ELT (*vec, member, init);
444   return true;
445 }
446 
447 /* Subroutine of check_constexpr_ctor_body_1 and constexpr_fn_retval.
448    In C++11 mode checks that the TYPE_DECLs in the BIND_EXPR_VARS of a
449    BIND_EXPR conform to 7.1.5/3/4 on typedef and alias declarations.  */
450 
451 static bool
check_constexpr_bind_expr_vars(tree t)452 check_constexpr_bind_expr_vars (tree t)
453 {
454   gcc_assert (TREE_CODE (t) == BIND_EXPR);
455 
456   for (tree var = BIND_EXPR_VARS (t); var; var = DECL_CHAIN (var))
457     if (TREE_CODE (var) == TYPE_DECL
458 	&& DECL_IMPLICIT_TYPEDEF_P (var)
459 	&& !LAMBDA_TYPE_P (TREE_TYPE (var)))
460       return false;
461   return true;
462 }
463 
464 /* Subroutine of check_constexpr_ctor_body.  */
465 
466 static bool
check_constexpr_ctor_body_1(tree last,tree list)467 check_constexpr_ctor_body_1 (tree last, tree list)
468 {
469   switch (TREE_CODE (list))
470     {
471     case DECL_EXPR:
472       if (TREE_CODE (DECL_EXPR_DECL (list)) == USING_DECL
473 	  || TREE_CODE (DECL_EXPR_DECL (list)) == TYPE_DECL)
474 	return true;
475       return false;
476 
477     case CLEANUP_POINT_EXPR:
478       return check_constexpr_ctor_body (last, TREE_OPERAND (list, 0),
479 					/*complain=*/false);
480 
481     case BIND_EXPR:
482        if (!check_constexpr_bind_expr_vars (list)
483 	   || !check_constexpr_ctor_body (last, BIND_EXPR_BODY (list),
484 					  /*complain=*/false))
485 	 return false;
486        return true;
487 
488     case USING_STMT:
489     case STATIC_ASSERT:
490     case DEBUG_BEGIN_STMT:
491       return true;
492 
493     default:
494       return false;
495     }
496 }
497 
498 /* Make sure that there are no statements after LAST in the constructor
499    body represented by LIST.  */
500 
501 bool
check_constexpr_ctor_body(tree last,tree list,bool complain)502 check_constexpr_ctor_body (tree last, tree list, bool complain)
503 {
504   /* C++14 doesn't require a constexpr ctor to have an empty body.  */
505   if (cxx_dialect >= cxx14)
506     return true;
507 
508   bool ok = true;
509   if (TREE_CODE (list) == STATEMENT_LIST)
510     {
511       tree_stmt_iterator i = tsi_last (list);
512       for (; !tsi_end_p (i); tsi_prev (&i))
513 	{
514 	  tree t = tsi_stmt (i);
515 	  if (t == last)
516 	    break;
517 	  if (!check_constexpr_ctor_body_1 (last, t))
518 	    {
519 	      ok = false;
520 	      break;
521 	    }
522 	}
523     }
524   else if (list != last
525 	   && !check_constexpr_ctor_body_1 (last, list))
526     ok = false;
527   if (!ok)
528     {
529       if (complain)
530 	error ("%<constexpr%> constructor does not have empty body");
531       DECL_DECLARED_CONSTEXPR_P (current_function_decl) = false;
532     }
533   return ok;
534 }
535 
536 /* V is a vector of constructor elements built up for the base and member
537    initializers of a constructor for TYPE.  They need to be in increasing
538    offset order, which they might not be yet if TYPE has a primary base
539    which is not first in the base-clause or a vptr and at least one base
540    all of which are non-primary.  */
541 
542 static vec<constructor_elt, va_gc> *
sort_constexpr_mem_initializers(tree type,vec<constructor_elt,va_gc> * v)543 sort_constexpr_mem_initializers (tree type, vec<constructor_elt, va_gc> *v)
544 {
545   tree pri = CLASSTYPE_PRIMARY_BINFO (type);
546   tree field_type;
547   unsigned i;
548   constructor_elt *ce;
549 
550   if (pri)
551     field_type = BINFO_TYPE (pri);
552   else if (TYPE_CONTAINS_VPTR_P (type))
553     field_type = vtbl_ptr_type_node;
554   else
555     return v;
556 
557   /* Find the element for the primary base or vptr and move it to the
558      beginning of the vec.  */
559   for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
560     if (TREE_TYPE (ce->index) == field_type)
561       break;
562 
563   if (i > 0 && i < vec_safe_length (v))
564     {
565       vec<constructor_elt, va_gc> &vref = *v;
566       constructor_elt elt = vref[i];
567       for (; i > 0; --i)
568 	vref[i] = vref[i-1];
569       vref[0] = elt;
570     }
571 
572   return v;
573 }
574 
575 /* Build compile-time evalable representations of member-initializer list
576    for a constexpr constructor.  */
577 
578 static tree
build_constexpr_constructor_member_initializers(tree type,tree body)579 build_constexpr_constructor_member_initializers (tree type, tree body)
580 {
581   vec<constructor_elt, va_gc> *vec = NULL;
582   bool ok = true;
583   while (true)
584     switch (TREE_CODE (body))
585       {
586       case MUST_NOT_THROW_EXPR:
587       case EH_SPEC_BLOCK:
588 	body = TREE_OPERAND (body, 0);
589 	break;
590 
591       case STATEMENT_LIST:
592 	for (tree stmt : tsi_range (body))
593 	  {
594 	    body = stmt;
595 	    if (TREE_CODE (body) == BIND_EXPR)
596 	      break;
597 	  }
598 	break;
599 
600       case BIND_EXPR:
601 	body = BIND_EXPR_BODY (body);
602 	goto found;
603 
604       default:
605 	gcc_unreachable ();
606     }
607  found:
608   if (TREE_CODE (body) == TRY_BLOCK)
609     {
610       body = TREE_OPERAND (body, 0);
611       if (TREE_CODE (body) == BIND_EXPR)
612 	body = BIND_EXPR_BODY (body);
613     }
614   if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
615     {
616       body = TREE_OPERAND (body, 0);
617       if (TREE_CODE (body) == EXPR_STMT)
618 	body = TREE_OPERAND (body, 0);
619       if (TREE_CODE (body) == INIT_EXPR
620 	  && (same_type_ignoring_top_level_qualifiers_p
621 	      (TREE_TYPE (TREE_OPERAND (body, 0)),
622 	       current_class_type)))
623 	{
624 	  /* Trivial copy.  */
625 	  return TREE_OPERAND (body, 1);
626 	}
627       ok = build_data_member_initialization (body, &vec);
628     }
629   else if (TREE_CODE (body) == STATEMENT_LIST)
630     {
631       for (tree stmt : tsi_range (body))
632 	{
633 	  ok = build_data_member_initialization (stmt, &vec);
634 	  if (!ok)
635 	    break;
636 	}
637     }
638   else if (EXPR_P (body))
639     ok = build_data_member_initialization (body, &vec);
640   else
641     gcc_assert (errorcount > 0);
642   if (ok)
643     {
644       if (vec_safe_length (vec) > 0)
645 	{
646 	  /* In a delegating constructor, return the target.  */
647 	  constructor_elt *ce = &(*vec)[0];
648 	  if (ce->index == current_class_ptr)
649 	    {
650 	      body = ce->value;
651 	      vec_free (vec);
652 	      return body;
653 	    }
654 	}
655       vec = sort_constexpr_mem_initializers (type, vec);
656       return build_constructor (type, vec);
657     }
658   else
659     return error_mark_node;
660 }
661 
662 /* We have an expression tree T that represents a call, either CALL_EXPR
663    or AGGR_INIT_EXPR.  If the call is lexically to a named function,
664    retrun the _DECL for that function.  */
665 
666 static tree
get_function_named_in_call(tree t)667 get_function_named_in_call (tree t)
668 {
669   tree fun = cp_get_callee (t);
670   if (fun && TREE_CODE (fun) == ADDR_EXPR
671       && TREE_CODE (TREE_OPERAND (fun, 0)) == FUNCTION_DECL)
672     fun = TREE_OPERAND (fun, 0);
673   return fun;
674 }
675 
676 /* Subroutine of check_constexpr_fundef.  BODY is the body of a function
677    declared to be constexpr, or a sub-statement thereof.  Returns the
678    return value if suitable, error_mark_node for a statement not allowed in
679    a constexpr function, or NULL_TREE if no return value was found.  */
680 
681 tree
constexpr_fn_retval(tree body)682 constexpr_fn_retval (tree body)
683 {
684   switch (TREE_CODE (body))
685     {
686     case STATEMENT_LIST:
687       {
688 	tree expr = NULL_TREE;
689 	for (tree stmt : tsi_range (body))
690 	  {
691 	    tree s = constexpr_fn_retval (stmt);
692 	    if (s == error_mark_node)
693 	      return error_mark_node;
694 	    else if (s == NULL_TREE)
695 	      /* Keep iterating.  */;
696 	    else if (expr)
697 	      /* Multiple return statements.  */
698 	      return error_mark_node;
699 	    else
700 	      expr = s;
701 	  }
702 	return expr;
703       }
704 
705     case RETURN_EXPR:
706       return break_out_target_exprs (TREE_OPERAND (body, 0));
707 
708     case DECL_EXPR:
709       {
710 	tree decl = DECL_EXPR_DECL (body);
711 	if (TREE_CODE (decl) == USING_DECL
712 	    /* Accept __func__, __FUNCTION__, and __PRETTY_FUNCTION__.  */
713 	    || DECL_ARTIFICIAL (decl))
714 	  return NULL_TREE;
715 	return error_mark_node;
716       }
717 
718     case CLEANUP_POINT_EXPR:
719       return constexpr_fn_retval (TREE_OPERAND (body, 0));
720 
721     case BIND_EXPR:
722       if (!check_constexpr_bind_expr_vars (body))
723 	return error_mark_node;
724       return constexpr_fn_retval (BIND_EXPR_BODY (body));
725 
726     case USING_STMT:
727     case DEBUG_BEGIN_STMT:
728       return NULL_TREE;
729 
730     case CALL_EXPR:
731 	{
732 	  tree fun = get_function_named_in_call (body);
733 	  if (fun != NULL_TREE
734 	      && fndecl_built_in_p (fun, BUILT_IN_UNREACHABLE))
735 	    return NULL_TREE;
736 	}
737       /* Fallthru.  */
738 
739     default:
740       return error_mark_node;
741     }
742 }
743 
744 /* Subroutine of check_constexpr_fundef.  BODY is the DECL_SAVED_TREE of
745    FUN; do the necessary transformations to turn it into a single expression
746    that we can store in the hash table.  */
747 
748 static tree
massage_constexpr_body(tree fun,tree body)749 massage_constexpr_body (tree fun, tree body)
750 {
751   if (DECL_CONSTRUCTOR_P (fun))
752     body = build_constexpr_constructor_member_initializers
753       (DECL_CONTEXT (fun), body);
754   else if (cxx_dialect < cxx14)
755     {
756       if (TREE_CODE (body) == EH_SPEC_BLOCK)
757         body = EH_SPEC_STMTS (body);
758       if (TREE_CODE (body) == MUST_NOT_THROW_EXPR)
759 	body = TREE_OPERAND (body, 0);
760       body = constexpr_fn_retval (body);
761     }
762   return body;
763 }
764 
765 /* CTYPE is a type constructed from BODY.  Return true if some
766    bases/fields are uninitialized, and complain if COMPLAIN.  */
767 
768 static bool
cx_check_missing_mem_inits(tree ctype,tree body,bool complain)769 cx_check_missing_mem_inits (tree ctype, tree body, bool complain)
770 {
771   /* We allow uninitialized bases/fields in C++20.  */
772   if (cxx_dialect >= cxx20)
773     return false;
774 
775   unsigned nelts = 0;
776 
777   if (body)
778     {
779       if (TREE_CODE (body) != CONSTRUCTOR)
780 	return false;
781       nelts = CONSTRUCTOR_NELTS (body);
782     }
783   tree field = TYPE_FIELDS (ctype);
784 
785   if (TREE_CODE (ctype) == UNION_TYPE)
786     {
787       if (nelts == 0 && next_initializable_field (field))
788 	{
789 	  if (complain)
790 	    error ("%<constexpr%> constructor for union %qT must "
791 		   "initialize exactly one non-static data member", ctype);
792 	  return true;
793 	}
794       return false;
795     }
796 
797   /* Iterate over the CONSTRUCTOR, checking any missing fields don't
798      need an explicit initialization.  */
799   bool bad = false;
800   for (unsigned i = 0; i <= nelts; ++i)
801     {
802       tree index = NULL_TREE;
803       if (i < nelts)
804 	{
805 	  index = CONSTRUCTOR_ELT (body, i)->index;
806 	  /* Skip base and vtable inits.  */
807 	  if (TREE_CODE (index) != FIELD_DECL
808 	      || DECL_ARTIFICIAL (index))
809 	    continue;
810 	}
811 
812       for (; field != index; field = DECL_CHAIN (field))
813 	{
814 	  tree ftype;
815 	  if (TREE_CODE (field) != FIELD_DECL)
816 	    continue;
817 	  if (DECL_UNNAMED_BIT_FIELD (field))
818 	    continue;
819 	  if (DECL_ARTIFICIAL (field))
820 	    continue;
821 	  if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
822 	    {
823 	      /* Recurse to check the anonymous aggregate member.  */
824 	      bad |= cx_check_missing_mem_inits
825 		(TREE_TYPE (field), NULL_TREE, complain);
826 	      if (bad && !complain)
827 		return true;
828 	      continue;
829 	    }
830 	  ftype = TREE_TYPE (field);
831 	  if (!ftype || !TYPE_P (ftype) || !COMPLETE_TYPE_P (ftype))
832 	    /* A flexible array can't be intialized here, so don't complain
833 	       that it isn't.  */
834 	    continue;
835 	  if (is_empty_field (field))
836 	    /* An empty field doesn't need an initializer.  */
837 	    continue;
838 	  ftype = strip_array_types (ftype);
839 	  if (type_has_constexpr_default_constructor (ftype))
840 	    {
841 	      /* It's OK to skip a member with a trivial constexpr ctor.
842 	         A constexpr ctor that isn't trivial should have been
843 	         added in by now.  */
844 	      gcc_checking_assert (!TYPE_HAS_COMPLEX_DFLT (ftype)
845 				   || errorcount != 0);
846 	      continue;
847 	    }
848 	  if (!complain)
849 	    return true;
850 	  auto_diagnostic_group d;
851 	  error ("member %qD must be initialized by mem-initializer "
852 		 "in %<constexpr%> constructor", field);
853 	  inform (DECL_SOURCE_LOCATION (field), "declared here");
854 	  bad = true;
855 	}
856       if (field == NULL_TREE)
857 	break;
858 
859       if (ANON_AGGR_TYPE_P (TREE_TYPE (index)))
860 	{
861 	  /* Check the anonymous aggregate initializer is valid.  */
862 	  bad |= cx_check_missing_mem_inits
863 	    (TREE_TYPE (index), CONSTRUCTOR_ELT (body, i)->value, complain);
864 	  if (bad && !complain)
865 	    return true;
866 	}
867       field = DECL_CHAIN (field);
868     }
869 
870   return bad;
871 }
872 
873 /* We are processing the definition of the constexpr function FUN.
874    Check that its body fulfills the apropriate requirements and
875    enter it in the constexpr function definition table.  */
876 
877 void
maybe_save_constexpr_fundef(tree fun)878 maybe_save_constexpr_fundef (tree fun)
879 {
880   if (processing_template_decl
881       || cp_function_chain->invalid_constexpr
882       || (DECL_CLONED_FUNCTION_P (fun) && !DECL_DELETING_DESTRUCTOR_P (fun)))
883     return;
884 
885   /* With -fimplicit-constexpr, try to make inlines constexpr.  We'll
886      actually set DECL_DECLARED_CONSTEXPR_P below if the checks pass.  */
887   bool implicit = false;
888   if (flag_implicit_constexpr)
889     {
890       if (DECL_DELETING_DESTRUCTOR_P (fun)
891 	  && decl_implicit_constexpr_p (DECL_CLONED_FUNCTION (fun)))
892 	/* Don't inherit implicit constexpr from the non-deleting
893 	   destructor.  */
894 	DECL_DECLARED_CONSTEXPR_P (fun) = false;
895 
896       if (!DECL_DECLARED_CONSTEXPR_P (fun)
897 	  && DECL_DECLARED_INLINE_P (fun)
898 	  && !lookup_attribute ("noinline", DECL_ATTRIBUTES (fun)))
899 	implicit = true;
900     }
901 
902   if (!DECL_DECLARED_CONSTEXPR_P (fun) && !implicit)
903     return;
904 
905   bool complain = !DECL_GENERATED_P (fun) && !implicit;
906 
907   if (!is_valid_constexpr_fn (fun, complain))
908     return;
909 
910   tree massaged = massage_constexpr_body (fun, DECL_SAVED_TREE (fun));
911   if (massaged == NULL_TREE || massaged == error_mark_node)
912     {
913       if (!DECL_CONSTRUCTOR_P (fun) && complain)
914 	error ("body of %<constexpr%> function %qD not a return-statement",
915 	       fun);
916       return;
917     }
918 
919   bool potential = potential_rvalue_constant_expression (massaged);
920   if (!potential && complain)
921     require_potential_rvalue_constant_expression (massaged);
922 
923   if (DECL_CONSTRUCTOR_P (fun) && potential
924       && !DECL_DEFAULTED_FN (fun))
925     {
926       if (cx_check_missing_mem_inits (DECL_CONTEXT (fun),
927 				      massaged, complain))
928 	potential = false;
929       else if (cxx_dialect > cxx11)
930 	{
931 	  /* What we got from massage_constexpr_body is pretty much just the
932 	     ctor-initializer, also check the body.  */
933 	  massaged = DECL_SAVED_TREE (fun);
934 	  potential = potential_rvalue_constant_expression (massaged);
935 	  if (!potential && complain)
936 	    require_potential_rvalue_constant_expression (massaged);
937 	}
938     }
939 
940   if (!potential && complain)
941     return;
942 
943   if (implicit)
944     {
945       if (potential)
946 	{
947 	  DECL_DECLARED_CONSTEXPR_P (fun) = true;
948 	  DECL_LANG_SPECIFIC (fun)->u.fn.implicit_constexpr = true;
949 	  if (DECL_CONSTRUCTOR_P (fun))
950 	    TYPE_HAS_CONSTEXPR_CTOR (DECL_CONTEXT (fun)) = true;
951 	}
952       else
953 	/* Don't bother keeping the pre-generic body of unsuitable functions
954 	   not explicitly declared constexpr.  */
955 	return;
956     }
957 
958   constexpr_fundef entry = {fun, NULL_TREE, NULL_TREE, NULL_TREE};
959   bool clear_ctx = false;
960   if (DECL_RESULT (fun) && DECL_CONTEXT (DECL_RESULT (fun)) == NULL_TREE)
961     {
962       clear_ctx = true;
963       DECL_CONTEXT (DECL_RESULT (fun)) = fun;
964     }
965   tree saved_fn = current_function_decl;
966   current_function_decl = fun;
967   entry.body = copy_fn (entry.decl, entry.parms, entry.result);
968   current_function_decl = saved_fn;
969   if (clear_ctx)
970     DECL_CONTEXT (DECL_RESULT (entry.decl)) = NULL_TREE;
971   if (!potential)
972     /* For a template instantiation, we want to remember the pre-generic body
973        for explain_invalid_constexpr_fn, but do tell cxx_eval_call_expression
974        that it doesn't need to bother trying to expand the function.  */
975     entry.result = error_mark_node;
976 
977   register_constexpr_fundef (entry);
978 }
979 
980 /* BODY is a validated and massaged definition of a constexpr
981    function.  Register it in the hash table.  */
982 
983 void
register_constexpr_fundef(const constexpr_fundef & value)984 register_constexpr_fundef (const constexpr_fundef &value)
985 {
986   /* Create the constexpr function table if necessary.  */
987   if (constexpr_fundef_table == NULL)
988     constexpr_fundef_table
989       = hash_table<constexpr_fundef_hasher>::create_ggc (101);
990 
991   constexpr_fundef **slot = constexpr_fundef_table->find_slot
992     (const_cast<constexpr_fundef *> (&value), INSERT);
993 
994   gcc_assert (*slot == NULL);
995   *slot = ggc_alloc<constexpr_fundef> ();
996   **slot = value;
997 }
998 
999 /* FUN is a non-constexpr function called in a context that requires a
1000    constant expression.  If it comes from a constexpr template, explain why
1001    the instantiation isn't constexpr.  */
1002 
1003 void
explain_invalid_constexpr_fn(tree fun)1004 explain_invalid_constexpr_fn (tree fun)
1005 {
1006   static hash_set<tree> *diagnosed;
1007   tree body;
1008   /* Only diagnose defaulted functions, lambdas, or instantiations.  */
1009   if (!DECL_DEFAULTED_FN (fun)
1010       && !LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun))
1011       && !is_instantiation_of_constexpr (fun))
1012     {
1013       inform (DECL_SOURCE_LOCATION (fun), "%qD declared here", fun);
1014       return;
1015     }
1016   if (diagnosed == NULL)
1017     diagnosed = new hash_set<tree>;
1018   if (diagnosed->add (fun))
1019     /* Already explained.  */
1020     return;
1021 
1022   iloc_sentinel ils = input_location;
1023   if (!lambda_static_thunk_p (fun))
1024     {
1025       /* Diagnostics should completely ignore the static thunk, so leave
1026 	 input_location set to our caller's location.  */
1027       input_location = DECL_SOURCE_LOCATION (fun);
1028       inform (input_location,
1029 	      "%qD is not usable as a %<constexpr%> function because:", fun);
1030     }
1031   /* First check the declaration.  */
1032   if (is_valid_constexpr_fn (fun, true))
1033     {
1034       /* Then if it's OK, the body.  */
1035       if (!DECL_DECLARED_CONSTEXPR_P (fun)
1036 	  && DECL_DEFAULTED_FN (fun))
1037 	explain_implicit_non_constexpr (fun);
1038       else
1039 	{
1040 	  if (constexpr_fundef *fd = retrieve_constexpr_fundef (fun))
1041 	    body = fd->body;
1042 	  else
1043 	    body = DECL_SAVED_TREE (fun);
1044 	  body = massage_constexpr_body (fun, body);
1045 	  require_potential_rvalue_constant_expression (body);
1046 	  if (DECL_CONSTRUCTOR_P (fun))
1047 	    cx_check_missing_mem_inits (DECL_CONTEXT (fun), body, true);
1048 	}
1049     }
1050 }
1051 
1052 /* Objects of this type represent calls to constexpr functions
1053    along with the bindings of parameters to their arguments, for
1054    the purpose of compile time evaluation.  */
1055 
1056 struct GTY((for_user)) constexpr_call {
1057   /* Description of the constexpr function definition.  */
1058   constexpr_fundef *fundef;
1059   /* Parameter bindings environment.  A TREE_VEC of arguments.  */
1060   tree bindings;
1061   /* Result of the call.
1062        NULL means the call is being evaluated.
1063        error_mark_node means that the evaluation was erroneous;
1064        otherwise, the actuall value of the call.  */
1065   tree result;
1066   /* The hash of this call; we remember it here to avoid having to
1067      recalculate it when expanding the hash table.  */
1068   hashval_t hash;
1069   /* Whether __builtin_is_constant_evaluated() should evaluate to true.  */
1070   bool manifestly_const_eval;
1071 };
1072 
1073 struct constexpr_call_hasher : ggc_ptr_hash<constexpr_call>
1074 {
1075   static hashval_t hash (constexpr_call *);
1076   static bool equal (constexpr_call *, constexpr_call *);
1077 };
1078 
1079 enum constexpr_switch_state {
1080   /* Used when processing a switch for the first time by cxx_eval_switch_expr
1081      and default: label for that switch has not been seen yet.  */
1082   css_default_not_seen,
1083   /* Used when processing a switch for the first time by cxx_eval_switch_expr
1084      and default: label for that switch has been seen already.  */
1085   css_default_seen,
1086   /* Used when processing a switch for the second time by
1087      cxx_eval_switch_expr, where default: label should match.  */
1088   css_default_processing
1089 };
1090 
1091 /* The constexpr expansion context part which needs one instance per
1092    cxx_eval_outermost_constant_expr invocation.  VALUES is a map of values of
1093    variables initialized within the expression.  */
1094 
1095 struct constexpr_global_ctx {
1096   /* Values for any temporaries or local variables within the
1097      constant-expression. */
1098   hash_map<tree,tree> values;
1099   /* Number of cxx_eval_constant_expression calls (except skipped ones,
1100      on simple constants or location wrappers) encountered during current
1101      cxx_eval_outermost_constant_expr call.  */
1102   HOST_WIDE_INT constexpr_ops_count;
1103   /* Heap VAR_DECLs created during the evaluation of the outermost constant
1104      expression.  */
1105   auto_vec<tree, 16> heap_vars;
1106   /* Cleanups that need to be evaluated at the end of CLEANUP_POINT_EXPR.  */
1107   vec<tree> *cleanups;
1108   /* Number of heap VAR_DECL deallocations.  */
1109   unsigned heap_dealloc_count;
1110   /* Constructor.  */
constexpr_global_ctxconstexpr_global_ctx1111   constexpr_global_ctx ()
1112     : constexpr_ops_count (0), cleanups (NULL), heap_dealloc_count (0) {}
1113 };
1114 
1115 /* The constexpr expansion context.  CALL is the current function
1116    expansion, CTOR is the current aggregate initializer, OBJECT is the
1117    object being initialized by CTOR, either a VAR_DECL or a _REF.    */
1118 
1119 struct constexpr_ctx {
1120   /* The part of the context that needs to be unique to the whole
1121      cxx_eval_outermost_constant_expr invocation.  */
1122   constexpr_global_ctx *global;
1123   /* The innermost call we're evaluating.  */
1124   constexpr_call *call;
1125   /* SAVE_EXPRs and TARGET_EXPR_SLOT vars of TARGET_EXPRs that we've seen
1126      within the current LOOP_EXPR.  NULL if we aren't inside a loop.  */
1127   vec<tree> *save_exprs;
1128   /* The CONSTRUCTOR we're currently building up for an aggregate
1129      initializer.  */
1130   tree ctor;
1131   /* The object we're building the CONSTRUCTOR for.  */
1132   tree object;
1133   /* If inside SWITCH_EXPR.  */
1134   constexpr_switch_state *css_state;
1135   /* The aggregate initialization context inside which this one is nested.  This
1136      is used by lookup_placeholder to resolve PLACEHOLDER_EXPRs.  */
1137   const constexpr_ctx *parent;
1138 
1139   /* Whether we should error on a non-constant expression or fail quietly.
1140      This flag needs to be here, but some of the others could move to global
1141      if they get larger than a word.  */
1142   bool quiet;
1143   /* Whether we are strictly conforming to constant expression rules or
1144      trying harder to get a constant value.  */
1145   bool strict;
1146   /* Whether __builtin_is_constant_evaluated () should be true.  */
1147   bool manifestly_const_eval;
1148 };
1149 
1150 /* This internal flag controls whether we should avoid doing anything during
1151    constexpr evaluation that would cause extra DECL_UID generation, such as
1152    template instantiation and function body copying.  */
1153 
1154 static bool uid_sensitive_constexpr_evaluation_value;
1155 
1156 /* An internal counter that keeps track of the number of times
1157    uid_sensitive_constexpr_evaluation_p returned true.  */
1158 
1159 static unsigned uid_sensitive_constexpr_evaluation_true_counter;
1160 
1161 /* The accessor for uid_sensitive_constexpr_evaluation_value which also
1162    increments the corresponding counter.  */
1163 
1164 static bool
uid_sensitive_constexpr_evaluation_p()1165 uid_sensitive_constexpr_evaluation_p ()
1166 {
1167   if (uid_sensitive_constexpr_evaluation_value)
1168     {
1169       ++uid_sensitive_constexpr_evaluation_true_counter;
1170       return true;
1171     }
1172   else
1173     return false;
1174 }
1175 
1176 /* The default constructor for uid_sensitive_constexpr_evaluation_sentinel
1177    enables the internal flag for uid_sensitive_constexpr_evaluation_p
1178    during the lifetime of the sentinel object.  Upon its destruction, the
1179    previous value of uid_sensitive_constexpr_evaluation_p is restored.  */
1180 
1181 uid_sensitive_constexpr_evaluation_sentinel
uid_sensitive_constexpr_evaluation_sentinel()1182 ::uid_sensitive_constexpr_evaluation_sentinel ()
1183   : ovr (uid_sensitive_constexpr_evaluation_value, true)
1184 {
1185 }
1186 
1187 /* The default constructor for uid_sensitive_constexpr_evaluation_checker
1188    records the current number of times that uid_sensitive_constexpr_evaluation_p
1189    has been called and returned true.  */
1190 
1191 uid_sensitive_constexpr_evaluation_checker
uid_sensitive_constexpr_evaluation_checker()1192 ::uid_sensitive_constexpr_evaluation_checker ()
1193   : saved_counter (uid_sensitive_constexpr_evaluation_true_counter)
1194 {
1195 }
1196 
1197 /* Returns true iff uid_sensitive_constexpr_evaluation_p is true, and
1198    some constexpr evaluation was restricted due to u_s_c_e_p being called
1199    and returning true during the lifetime of this checker object.  */
1200 
1201 bool
evaluation_restricted_p() const1202 uid_sensitive_constexpr_evaluation_checker::evaluation_restricted_p () const
1203 {
1204   return (uid_sensitive_constexpr_evaluation_value
1205 	  && saved_counter != uid_sensitive_constexpr_evaluation_true_counter);
1206 }
1207 
1208 
1209 /* A table of all constexpr calls that have been evaluated by the
1210    compiler in this translation unit.  */
1211 
1212 static GTY (()) hash_table<constexpr_call_hasher> *constexpr_call_table;
1213 
1214 static tree cxx_eval_constant_expression (const constexpr_ctx *, tree,
1215 					  bool, bool *, bool *, tree * = NULL);
1216 
1217 /* Compute a hash value for a constexpr call representation.  */
1218 
1219 inline hashval_t
hash(constexpr_call * info)1220 constexpr_call_hasher::hash (constexpr_call *info)
1221 {
1222   return info->hash;
1223 }
1224 
1225 /* Return true if the objects pointed to by P and Q represent calls
1226    to the same constexpr function with the same arguments.
1227    Otherwise, return false.  */
1228 
1229 bool
equal(constexpr_call * lhs,constexpr_call * rhs)1230 constexpr_call_hasher::equal (constexpr_call *lhs, constexpr_call *rhs)
1231 {
1232   if (lhs == rhs)
1233     return true;
1234   if (lhs->hash != rhs->hash)
1235     return false;
1236   if (lhs->manifestly_const_eval != rhs->manifestly_const_eval)
1237     return false;
1238   if (!constexpr_fundef_hasher::equal (lhs->fundef, rhs->fundef))
1239     return false;
1240   return cp_tree_equal (lhs->bindings, rhs->bindings);
1241 }
1242 
1243 /* Initialize the constexpr call table, if needed.  */
1244 
1245 static void
maybe_initialize_constexpr_call_table(void)1246 maybe_initialize_constexpr_call_table (void)
1247 {
1248   if (constexpr_call_table == NULL)
1249     constexpr_call_table = hash_table<constexpr_call_hasher>::create_ggc (101);
1250 }
1251 
1252 /* During constexpr CALL_EXPR evaluation, to avoid issues with sharing when
1253    a function happens to get called recursively, we unshare the callee
1254    function's body and evaluate this unshared copy instead of evaluating the
1255    original body.
1256 
1257    FUNDEF_COPIES_TABLE is a per-function freelist of these unshared function
1258    copies.  The underlying data structure of FUNDEF_COPIES_TABLE is a hash_map
1259    that's keyed off of the original FUNCTION_DECL and whose value is a
1260    TREE_LIST of this function's unused copies awaiting reuse.
1261 
1262    This is not GC-deletable to avoid GC affecting UID generation.  */
1263 
1264 static GTY(()) decl_tree_map *fundef_copies_table;
1265 
1266 /* Reuse a copy or create a new unshared copy of the function FUN.
1267    Return this copy.  We use a TREE_LIST whose PURPOSE is body, VALUE
1268    is parms, TYPE is result.  */
1269 
1270 static tree
get_fundef_copy(constexpr_fundef * fundef)1271 get_fundef_copy (constexpr_fundef *fundef)
1272 {
1273   tree copy;
1274   bool existed;
1275   tree *slot = &(hash_map_safe_get_or_insert<hm_ggc>
1276 		 (fundef_copies_table, fundef->decl, &existed, 127));
1277 
1278   if (!existed)
1279     {
1280       /* There is no cached function available, or in use.  We can use
1281 	 the function directly.  That the slot is now created records
1282 	 that this function is now in use.  */
1283       copy = build_tree_list (fundef->body, fundef->parms);
1284       TREE_TYPE (copy) = fundef->result;
1285     }
1286   else if (*slot == NULL_TREE)
1287     {
1288       if (uid_sensitive_constexpr_evaluation_p ())
1289 	return NULL_TREE;
1290 
1291       /* We've already used the function itself, so make a copy.  */
1292       copy = build_tree_list (NULL, NULL);
1293       tree saved_body = DECL_SAVED_TREE (fundef->decl);
1294       tree saved_parms = DECL_ARGUMENTS (fundef->decl);
1295       tree saved_result = DECL_RESULT (fundef->decl);
1296       tree saved_fn = current_function_decl;
1297       DECL_SAVED_TREE (fundef->decl) = fundef->body;
1298       DECL_ARGUMENTS (fundef->decl) = fundef->parms;
1299       DECL_RESULT (fundef->decl) = fundef->result;
1300       current_function_decl = fundef->decl;
1301       TREE_PURPOSE (copy) = copy_fn (fundef->decl, TREE_VALUE (copy),
1302 				     TREE_TYPE (copy));
1303       current_function_decl = saved_fn;
1304       DECL_RESULT (fundef->decl) = saved_result;
1305       DECL_ARGUMENTS (fundef->decl) = saved_parms;
1306       DECL_SAVED_TREE (fundef->decl) = saved_body;
1307     }
1308   else
1309     {
1310       /* We have a cached function available.  */
1311       copy = *slot;
1312       *slot = TREE_CHAIN (copy);
1313     }
1314 
1315   return copy;
1316 }
1317 
1318 /* Save the copy COPY of function FUN for later reuse by
1319    get_fundef_copy().  By construction, there will always be an entry
1320    to find.  */
1321 
1322 static void
save_fundef_copy(tree fun,tree copy)1323 save_fundef_copy (tree fun, tree copy)
1324 {
1325   tree *slot = fundef_copies_table->get (fun);
1326   TREE_CHAIN (copy) = *slot;
1327   *slot = copy;
1328 }
1329 
1330 /* We have an expression tree T that represents a call, either CALL_EXPR
1331    or AGGR_INIT_EXPR.  Return the Nth argument.  */
1332 
1333 static inline tree
get_nth_callarg(tree t,int n)1334 get_nth_callarg (tree t, int n)
1335 {
1336   switch (TREE_CODE (t))
1337     {
1338     case CALL_EXPR:
1339       return CALL_EXPR_ARG (t, n);
1340 
1341     case AGGR_INIT_EXPR:
1342       return AGGR_INIT_EXPR_ARG (t, n);
1343 
1344     default:
1345       gcc_unreachable ();
1346       return NULL;
1347     }
1348 }
1349 
1350 /* Attempt to evaluate T which represents a call to a builtin function.
1351    We assume here that all builtin functions evaluate to scalar types
1352    represented by _CST nodes.  */
1353 
1354 static tree
cxx_eval_builtin_function_call(const constexpr_ctx * ctx,tree t,tree fun,bool lval,bool * non_constant_p,bool * overflow_p)1355 cxx_eval_builtin_function_call (const constexpr_ctx *ctx, tree t, tree fun,
1356 				bool lval,
1357 				bool *non_constant_p, bool *overflow_p)
1358 {
1359   const int nargs = call_expr_nargs (t);
1360   tree *args = (tree *) alloca (nargs * sizeof (tree));
1361   tree new_call;
1362   int i;
1363 
1364   /* Don't fold __builtin_constant_p within a constexpr function.  */
1365   bool bi_const_p = DECL_IS_BUILTIN_CONSTANT_P (fun);
1366 
1367   /* If we aren't requiring a constant expression, defer __builtin_constant_p
1368      in a constexpr function until we have values for the parameters.  */
1369   if (bi_const_p
1370       && !ctx->manifestly_const_eval
1371       && current_function_decl
1372       && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
1373     {
1374       *non_constant_p = true;
1375       return t;
1376     }
1377 
1378   /* For __builtin_is_constant_evaluated, defer it if not
1379      ctx->manifestly_const_eval (as sometimes we try to constant evaluate
1380      without manifestly_const_eval even expressions or parts thereof which
1381      will later be manifestly const_eval evaluated), otherwise fold it to
1382      true.  */
1383   if (fndecl_built_in_p (fun, CP_BUILT_IN_IS_CONSTANT_EVALUATED,
1384 			 BUILT_IN_FRONTEND))
1385     {
1386       if (!ctx->manifestly_const_eval)
1387 	{
1388 	  *non_constant_p = true;
1389 	  return t;
1390 	}
1391       return boolean_true_node;
1392     }
1393 
1394   if (fndecl_built_in_p (fun, CP_BUILT_IN_SOURCE_LOCATION, BUILT_IN_FRONTEND))
1395     {
1396       temp_override<tree> ovr (current_function_decl);
1397       if (ctx->call && ctx->call->fundef)
1398 	current_function_decl = ctx->call->fundef->decl;
1399       return fold_builtin_source_location (EXPR_LOCATION (t));
1400     }
1401 
1402   int strops = 0;
1403   int strret = 0;
1404   if (fndecl_built_in_p (fun, BUILT_IN_NORMAL))
1405     switch (DECL_FUNCTION_CODE (fun))
1406       {
1407       case BUILT_IN_STRLEN:
1408       case BUILT_IN_STRNLEN:
1409 	strops = 1;
1410 	break;
1411       case BUILT_IN_MEMCHR:
1412       case BUILT_IN_STRCHR:
1413       case BUILT_IN_STRRCHR:
1414 	strops = 1;
1415 	strret = 1;
1416 	break;
1417       case BUILT_IN_MEMCMP:
1418       case BUILT_IN_STRCMP:
1419 	strops = 2;
1420 	break;
1421       case BUILT_IN_STRSTR:
1422 	strops = 2;
1423 	strret = 1;
1424 	break;
1425       case BUILT_IN_ASAN_POINTER_COMPARE:
1426       case BUILT_IN_ASAN_POINTER_SUBTRACT:
1427 	/* These builtins shall be ignored during constant expression
1428 	   evaluation.  */
1429 	return void_node;
1430       default:
1431 	break;
1432       }
1433 
1434   /* Be permissive for arguments to built-ins; __builtin_constant_p should
1435      return constant false for a non-constant argument.  */
1436   constexpr_ctx new_ctx = *ctx;
1437   new_ctx.quiet = true;
1438   for (i = 0; i < nargs; ++i)
1439     {
1440       tree arg = CALL_EXPR_ARG (t, i);
1441       tree oarg = arg;
1442 
1443       /* To handle string built-ins we need to pass ADDR_EXPR<STRING_CST> since
1444 	 expand_builtin doesn't know how to look in the values table.  */
1445       bool strop = i < strops;
1446       if (strop)
1447 	{
1448 	  STRIP_NOPS (arg);
1449 	  if (TREE_CODE (arg) == ADDR_EXPR)
1450 	    arg = TREE_OPERAND (arg, 0);
1451 	  else
1452 	    strop = false;
1453 	}
1454 
1455       /* If builtin_valid_in_constant_expr_p is true,
1456 	 potential_constant_expression_1 has not recursed into the arguments
1457 	 of the builtin, verify it here.  */
1458       if (!builtin_valid_in_constant_expr_p (fun)
1459 	  || potential_constant_expression (arg))
1460 	{
1461 	  bool dummy1 = false, dummy2 = false;
1462 	  arg = cxx_eval_constant_expression (&new_ctx, arg, false,
1463 					      &dummy1, &dummy2);
1464 	}
1465 
1466       if (bi_const_p)
1467 	/* For __builtin_constant_p, fold all expressions with constant values
1468 	   even if they aren't C++ constant-expressions.  */
1469 	arg = cp_fold_rvalue (arg);
1470       else if (strop)
1471 	{
1472 	  if (TREE_CODE (arg) == CONSTRUCTOR)
1473 	    arg = braced_lists_to_strings (TREE_TYPE (arg), arg);
1474 	  if (TREE_CODE (arg) == STRING_CST)
1475 	    arg = build_address (arg);
1476 	  else
1477 	    arg = oarg;
1478 	}
1479 
1480       args[i] = arg;
1481     }
1482 
1483   bool save_ffbcp = force_folding_builtin_constant_p;
1484   force_folding_builtin_constant_p |= ctx->manifestly_const_eval;
1485   tree save_cur_fn = current_function_decl;
1486   /* Return name of ctx->call->fundef->decl for __builtin_FUNCTION ().  */
1487   if (fndecl_built_in_p (fun, BUILT_IN_FUNCTION)
1488       && ctx->call
1489       && ctx->call->fundef)
1490     current_function_decl = ctx->call->fundef->decl;
1491   if (fndecl_built_in_p (fun,
1492 			 CP_BUILT_IN_IS_POINTER_INTERCONVERTIBLE_WITH_CLASS,
1493 			 BUILT_IN_FRONTEND))
1494     {
1495       location_t loc = EXPR_LOCATION (t);
1496       if (nargs >= 1)
1497 	VERIFY_CONSTANT (args[0]);
1498       new_call
1499 	= fold_builtin_is_pointer_inverconvertible_with_class (loc, nargs,
1500 							       args);
1501     }
1502   else if (fndecl_built_in_p (fun,
1503 			      CP_BUILT_IN_IS_CORRESPONDING_MEMBER,
1504 			      BUILT_IN_FRONTEND))
1505     {
1506       location_t loc = EXPR_LOCATION (t);
1507       if (nargs >= 2)
1508 	{
1509 	  VERIFY_CONSTANT (args[0]);
1510 	  VERIFY_CONSTANT (args[1]);
1511 	}
1512       new_call = fold_builtin_is_corresponding_member (loc, nargs, args);
1513     }
1514   else
1515     new_call = fold_builtin_call_array (EXPR_LOCATION (t), TREE_TYPE (t),
1516 					CALL_EXPR_FN (t), nargs, args);
1517   current_function_decl = save_cur_fn;
1518   force_folding_builtin_constant_p = save_ffbcp;
1519   if (new_call == NULL)
1520     {
1521       if (!*non_constant_p && !ctx->quiet)
1522 	{
1523 	  /* Do not allow__builtin_unreachable in constexpr function.
1524 	     The __builtin_unreachable call with BUILTINS_LOCATION
1525 	     comes from cp_maybe_instrument_return.  */
1526 	  if (fndecl_built_in_p (fun, BUILT_IN_UNREACHABLE)
1527 	      && EXPR_LOCATION (t) == BUILTINS_LOCATION)
1528 	    error ("%<constexpr%> call flows off the end of the function");
1529 	  else
1530 	    {
1531 	      new_call = build_call_array_loc (EXPR_LOCATION (t), TREE_TYPE (t),
1532 					       CALL_EXPR_FN (t), nargs, args);
1533 	      error ("%q+E is not a constant expression", new_call);
1534 	    }
1535 	}
1536       *non_constant_p = true;
1537       return t;
1538     }
1539 
1540   if (!potential_constant_expression (new_call))
1541     {
1542       if (!*non_constant_p && !ctx->quiet)
1543 	error ("%q+E is not a constant expression", new_call);
1544       *non_constant_p = true;
1545       return t;
1546     }
1547 
1548   if (strret)
1549     {
1550       /* memchr returns a pointer into the first argument, but we replaced the
1551 	 argument above with a STRING_CST; put it back it now.  */
1552       tree op = CALL_EXPR_ARG (t, strret-1);
1553       STRIP_NOPS (new_call);
1554       if (TREE_CODE (new_call) == POINTER_PLUS_EXPR)
1555 	TREE_OPERAND (new_call, 0) = op;
1556       else if (TREE_CODE (new_call) == ADDR_EXPR)
1557 	new_call = op;
1558     }
1559 
1560   return cxx_eval_constant_expression (&new_ctx, new_call, lval,
1561 				       non_constant_p, overflow_p);
1562 }
1563 
1564 /* TEMP is the constant value of a temporary object of type TYPE.  Adjust
1565    the type of the value to match.  */
1566 
1567 static tree
adjust_temp_type(tree type,tree temp)1568 adjust_temp_type (tree type, tree temp)
1569 {
1570   if (same_type_p (TREE_TYPE (temp), type))
1571     return temp;
1572   /* Avoid wrapping an aggregate value in a NOP_EXPR.  */
1573   if (TREE_CODE (temp) == CONSTRUCTOR)
1574     {
1575       /* build_constructor wouldn't retain various CONSTRUCTOR flags.  */
1576       tree t = copy_node (temp);
1577       TREE_TYPE (t) = type;
1578       return t;
1579     }
1580   if (TREE_CODE (temp) == EMPTY_CLASS_EXPR)
1581     return build0 (EMPTY_CLASS_EXPR, type);
1582   gcc_assert (scalarish_type_p (type));
1583   /* Now we know we're dealing with a scalar, and a prvalue of non-class
1584      type is cv-unqualified.  */
1585   return cp_fold_convert (cv_unqualified (type), temp);
1586 }
1587 
1588 /* If T is a CONSTRUCTOR, return an unshared copy of T and any
1589    sub-CONSTRUCTORs.  Otherwise return T.
1590 
1591    We use this whenever we initialize an object as a whole, whether it's a
1592    parameter, a local variable, or a subobject, so that subsequent
1593    modifications don't affect other places where it was used.  */
1594 
1595 tree
unshare_constructor(tree t MEM_STAT_DECL)1596 unshare_constructor (tree t MEM_STAT_DECL)
1597 {
1598   if (!t || TREE_CODE (t) != CONSTRUCTOR)
1599     return t;
1600   auto_vec <tree*, 4> ptrs;
1601   ptrs.safe_push (&t);
1602   while (!ptrs.is_empty ())
1603     {
1604       tree *p = ptrs.pop ();
1605       tree n = copy_node (*p PASS_MEM_STAT);
1606       CONSTRUCTOR_ELTS (n) = vec_safe_copy (CONSTRUCTOR_ELTS (*p) PASS_MEM_STAT);
1607       *p = n;
1608       vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (n);
1609       constructor_elt *ce;
1610       for (HOST_WIDE_INT i = 0; vec_safe_iterate (v, i, &ce); ++i)
1611 	if (ce->value && TREE_CODE (ce->value) == CONSTRUCTOR)
1612 	  ptrs.safe_push (&ce->value);
1613     }
1614   return t;
1615 }
1616 
1617 /* If T is a CONSTRUCTOR, ggc_free T and any sub-CONSTRUCTORs.  */
1618 
1619 static void
free_constructor(tree t)1620 free_constructor (tree t)
1621 {
1622   if (!t || TREE_CODE (t) != CONSTRUCTOR)
1623     return;
1624   releasing_vec ctors;
1625   vec_safe_push (ctors, t);
1626   while (!ctors->is_empty ())
1627     {
1628       tree c = ctors->pop ();
1629       if (vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (c))
1630 	{
1631 	  constructor_elt *ce;
1632 	  for (HOST_WIDE_INT i = 0; vec_safe_iterate (elts, i, &ce); ++i)
1633 	    if (TREE_CODE (ce->value) == CONSTRUCTOR)
1634 	      vec_safe_push (ctors, ce->value);
1635 	  ggc_free (elts);
1636 	}
1637       ggc_free (c);
1638     }
1639 }
1640 
1641 /* Helper function of cxx_bind_parameters_in_call.  Return non-NULL
1642    if *TP is address of a static variable (or part of it) currently being
1643    constructed or of a heap artificial variable.  */
1644 
1645 static tree
addr_of_non_const_var(tree * tp,int * walk_subtrees,void * data)1646 addr_of_non_const_var (tree *tp, int *walk_subtrees, void *data)
1647 {
1648   if (TREE_CODE (*tp) == ADDR_EXPR)
1649     if (tree var = get_base_address (TREE_OPERAND (*tp, 0)))
1650       if (VAR_P (var) && TREE_STATIC (var))
1651 	{
1652 	  if (DECL_NAME (var) == heap_uninit_identifier
1653 	      || DECL_NAME (var) == heap_identifier
1654 	      || DECL_NAME (var) == heap_vec_uninit_identifier
1655 	      || DECL_NAME (var) == heap_vec_identifier)
1656 	    return var;
1657 
1658 	  constexpr_global_ctx *global = (constexpr_global_ctx *) data;
1659 	  if (global->values.get (var))
1660 	    return var;
1661 	}
1662   if (TYPE_P (*tp))
1663     *walk_subtrees = false;
1664   return NULL_TREE;
1665 }
1666 
1667 /* Subroutine of cxx_eval_call_expression.
1668    We are processing a call expression (either CALL_EXPR or
1669    AGGR_INIT_EXPR) in the context of CTX.  Evaluate
1670    all arguments and bind their values to correspondings
1671    parameters, making up the NEW_CALL context.  */
1672 
1673 static tree
cxx_bind_parameters_in_call(const constexpr_ctx * ctx,tree t,tree fun,bool * non_constant_p,bool * overflow_p,bool * non_constant_args)1674 cxx_bind_parameters_in_call (const constexpr_ctx *ctx, tree t, tree fun,
1675 			     bool *non_constant_p, bool *overflow_p,
1676 			     bool *non_constant_args)
1677 {
1678   const int nargs = call_expr_nargs (t);
1679   tree parms = DECL_ARGUMENTS (fun);
1680   int i;
1681   /* We don't record ellipsis args below.  */
1682   int nparms = list_length (parms);
1683   int nbinds = nargs < nparms ? nargs : nparms;
1684   tree binds = make_tree_vec (nbinds);
1685   for (i = 0; i < nargs; ++i)
1686     {
1687       tree x, arg;
1688       tree type = parms ? TREE_TYPE (parms) : void_type_node;
1689       if (parms && DECL_BY_REFERENCE (parms))
1690 	type = TREE_TYPE (type);
1691       x = get_nth_callarg (t, i);
1692       /* For member function, the first argument is a pointer to the implied
1693          object.  For a constructor, it might still be a dummy object, in
1694          which case we get the real argument from ctx. */
1695       if (i == 0 && DECL_CONSTRUCTOR_P (fun)
1696 	  && is_dummy_object (x))
1697 	{
1698 	  x = ctx->object;
1699 	  x = build_address (x);
1700 	}
1701       if (TREE_ADDRESSABLE (type))
1702 	/* Undo convert_for_arg_passing work here.  */
1703 	x = convert_from_reference (x);
1704       /* Normally we would strip a TARGET_EXPR in an initialization context
1705 	 such as this, but here we do the elision differently: we keep the
1706 	 TARGET_EXPR, and use its CONSTRUCTOR as the value of the parm.  */
1707       arg = cxx_eval_constant_expression (ctx, x, /*lval=*/false,
1708 					  non_constant_p, overflow_p);
1709       /* Don't VERIFY_CONSTANT here.  */
1710       if (*non_constant_p && ctx->quiet)
1711 	break;
1712       /* Just discard ellipsis args after checking their constantitude.  */
1713       if (!parms)
1714 	continue;
1715 
1716       if (!*non_constant_p)
1717 	{
1718 	  /* Make sure the binding has the same type as the parm.  But
1719 	     only for constant args.  */
1720 	  if (!TYPE_REF_P (type))
1721 	    arg = adjust_temp_type (type, arg);
1722 	  if (!TREE_CONSTANT (arg))
1723 	    *non_constant_args = true;
1724 	  else if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
1725 	    /* The destructor needs to see any modifications the callee makes
1726 	       to the argument.  */
1727 	    *non_constant_args = true;
1728 	    /* If arg is or contains address of a heap artificial variable or
1729 	       of a static variable being constructed, avoid caching the
1730 	       function call, as those variables might be modified by the
1731 	       function, or might be modified by the callers in between
1732 	       the cached function and just read by the function.  */
1733 	  else if (!*non_constant_args
1734 		   && cp_walk_tree (&arg, addr_of_non_const_var, ctx->global,
1735 				    NULL))
1736 	    *non_constant_args = true;
1737 
1738 	  /* For virtual calls, adjust the this argument, so that it is
1739 	     the object on which the method is called, rather than
1740 	     one of its bases.  */
1741 	  if (i == 0 && DECL_VIRTUAL_P (fun))
1742 	    {
1743 	      tree addr = arg;
1744 	      STRIP_NOPS (addr);
1745 	      if (TREE_CODE (addr) == ADDR_EXPR)
1746 		{
1747 		  tree obj = TREE_OPERAND (addr, 0);
1748 		  while (TREE_CODE (obj) == COMPONENT_REF
1749 			 && DECL_FIELD_IS_BASE (TREE_OPERAND (obj, 1))
1750 			 && !same_type_ignoring_top_level_qualifiers_p
1751 					(TREE_TYPE (obj), DECL_CONTEXT (fun)))
1752 		    obj = TREE_OPERAND (obj, 0);
1753 		  if (obj != TREE_OPERAND (addr, 0))
1754 		    arg = build_fold_addr_expr_with_type (obj,
1755 							  TREE_TYPE (arg));
1756 		}
1757 	    }
1758 	  TREE_VEC_ELT (binds, i) = arg;
1759 	}
1760       parms = TREE_CHAIN (parms);
1761     }
1762 
1763   return binds;
1764 }
1765 
1766 /* Variables and functions to manage constexpr call expansion context.
1767    These do not need to be marked for PCH or GC.  */
1768 
1769 /* FIXME remember and print actual constant arguments.  */
1770 static vec<tree> call_stack;
1771 static int call_stack_tick;
1772 static int last_cx_error_tick;
1773 
1774 static int
push_cx_call_context(tree call)1775 push_cx_call_context (tree call)
1776 {
1777   ++call_stack_tick;
1778   if (!EXPR_HAS_LOCATION (call))
1779     SET_EXPR_LOCATION (call, input_location);
1780   call_stack.safe_push (call);
1781   int len = call_stack.length ();
1782   if (len > max_constexpr_depth)
1783     return false;
1784   return len;
1785 }
1786 
1787 static void
pop_cx_call_context(void)1788 pop_cx_call_context (void)
1789 {
1790   ++call_stack_tick;
1791   call_stack.pop ();
1792 }
1793 
1794 vec<tree>
cx_error_context(void)1795 cx_error_context (void)
1796 {
1797   vec<tree> r = vNULL;
1798   if (call_stack_tick != last_cx_error_tick
1799       && !call_stack.is_empty ())
1800     r = call_stack;
1801   last_cx_error_tick = call_stack_tick;
1802   return r;
1803 }
1804 
1805 /* Evaluate a call T to a GCC internal function when possible and return
1806    the evaluated result or, under the control of CTX, give an error, set
1807    NON_CONSTANT_P, and return the unevaluated call T otherwise.  */
1808 
1809 static tree
cxx_eval_internal_function(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)1810 cxx_eval_internal_function (const constexpr_ctx *ctx, tree t,
1811 			    bool lval,
1812 			    bool *non_constant_p, bool *overflow_p)
1813 {
1814   enum tree_code opcode = ERROR_MARK;
1815 
1816   switch (CALL_EXPR_IFN (t))
1817     {
1818     case IFN_UBSAN_NULL:
1819     case IFN_UBSAN_BOUNDS:
1820     case IFN_UBSAN_VPTR:
1821     case IFN_FALLTHROUGH:
1822       return void_node;
1823 
1824     case IFN_ADD_OVERFLOW:
1825       opcode = PLUS_EXPR;
1826       break;
1827     case IFN_SUB_OVERFLOW:
1828       opcode = MINUS_EXPR;
1829       break;
1830     case IFN_MUL_OVERFLOW:
1831       opcode = MULT_EXPR;
1832       break;
1833 
1834     case IFN_LAUNDER:
1835       return cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 0),
1836 					   false, non_constant_p, overflow_p);
1837 
1838     case IFN_VEC_CONVERT:
1839       {
1840 	tree arg = cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 0),
1841 						 false, non_constant_p,
1842 						 overflow_p);
1843 	if (TREE_CODE (arg) == VECTOR_CST)
1844 	  if (tree r = fold_const_call (CFN_VEC_CONVERT, TREE_TYPE (t), arg))
1845 	    return r;
1846       }
1847       /* FALLTHRU */
1848 
1849     default:
1850       if (!ctx->quiet)
1851 	error_at (cp_expr_loc_or_input_loc (t),
1852 		  "call to internal function %qE", t);
1853       *non_constant_p = true;
1854       return t;
1855     }
1856 
1857   /* Evaluate constant arguments using OPCODE and return a complex
1858      number containing the result and the overflow bit.  */
1859   tree arg0 = cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 0), lval,
1860 					    non_constant_p, overflow_p);
1861   tree arg1 = cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 1), lval,
1862 					    non_constant_p, overflow_p);
1863 
1864   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1865     {
1866       location_t loc = cp_expr_loc_or_input_loc (t);
1867       tree type = TREE_TYPE (TREE_TYPE (t));
1868       tree result = fold_binary_loc (loc, opcode, type,
1869 				     fold_convert_loc (loc, type, arg0),
1870 				     fold_convert_loc (loc, type, arg1));
1871       tree ovf
1872 	= build_int_cst (type, arith_overflowed_p (opcode, type, arg0, arg1));
1873       /* Reset TREE_OVERFLOW to avoid warnings for the overflow.  */
1874       if (TREE_OVERFLOW (result))
1875 	TREE_OVERFLOW (result) = 0;
1876 
1877       return build_complex (TREE_TYPE (t), result, ovf);
1878     }
1879 
1880   *non_constant_p = true;
1881   return t;
1882 }
1883 
1884 /* Clean CONSTRUCTOR_NO_CLEARING from CTOR and its sub-aggregates.  */
1885 
1886 static void
clear_no_implicit_zero(tree ctor)1887 clear_no_implicit_zero (tree ctor)
1888 {
1889   if (CONSTRUCTOR_NO_CLEARING (ctor))
1890     {
1891       CONSTRUCTOR_NO_CLEARING (ctor) = false;
1892       for (auto &e: CONSTRUCTOR_ELTS (ctor))
1893 	if (TREE_CODE (e.value) == CONSTRUCTOR)
1894 	  clear_no_implicit_zero (e.value);
1895     }
1896 }
1897 
1898 /* Complain about a const object OBJ being modified in a constant expression.
1899    EXPR is the MODIFY_EXPR expression performing the modification.  */
1900 
1901 static void
modifying_const_object_error(tree expr,tree obj)1902 modifying_const_object_error (tree expr, tree obj)
1903 {
1904   location_t loc = cp_expr_loc_or_input_loc (expr);
1905   auto_diagnostic_group d;
1906   error_at (loc, "modifying a const object %qE is not allowed in "
1907 	    "a constant expression", TREE_OPERAND (expr, 0));
1908   inform (location_of (obj), "originally declared %<const%> here");
1909 }
1910 
1911 /* Return true if FNDECL is a replaceable global allocation function that
1912    should be useable during constant expression evaluation.  */
1913 
1914 static inline bool
cxx_replaceable_global_alloc_fn(tree fndecl)1915 cxx_replaceable_global_alloc_fn (tree fndecl)
1916 {
1917   return (cxx_dialect >= cxx20
1918 	  && IDENTIFIER_NEWDEL_OP_P (DECL_NAME (fndecl))
1919 	  && CP_DECL_CONTEXT (fndecl) == global_namespace
1920 	  && (DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
1921 	      || DECL_IS_OPERATOR_DELETE_P (fndecl)));
1922 }
1923 
1924 /* Return true if FNDECL is a placement new function that should be
1925    useable during constant expression evaluation of std::construct_at.  */
1926 
1927 static inline bool
cxx_placement_new_fn(tree fndecl)1928 cxx_placement_new_fn (tree fndecl)
1929 {
1930   if (cxx_dialect >= cxx20
1931       && IDENTIFIER_NEW_OP_P (DECL_NAME (fndecl))
1932       && CP_DECL_CONTEXT (fndecl) == global_namespace
1933       && !DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
1934       && TREE_CODE (TREE_TYPE (fndecl)) == FUNCTION_TYPE)
1935     {
1936       tree first_arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fndecl)));
1937       if (TREE_VALUE (first_arg) == ptr_type_node
1938 	  && TREE_CHAIN (first_arg) == void_list_node)
1939 	return true;
1940     }
1941   return false;
1942 }
1943 
1944 /* Return true if FNDECL is std::construct_at.  */
1945 
1946 static inline bool
is_std_construct_at(tree fndecl)1947 is_std_construct_at (tree fndecl)
1948 {
1949   if (!decl_in_std_namespace_p (fndecl))
1950     return false;
1951 
1952   tree name = DECL_NAME (fndecl);
1953   return name && id_equal (name, "construct_at");
1954 }
1955 
1956 /* Overload for the above taking constexpr_call*.  */
1957 
1958 static inline bool
is_std_construct_at(const constexpr_call * call)1959 is_std_construct_at (const constexpr_call *call)
1960 {
1961   return (call
1962 	  && call->fundef
1963 	  && is_std_construct_at (call->fundef->decl));
1964 }
1965 
1966 /* Return true if FNDECL is std::allocator<T>::{,de}allocate.  */
1967 
1968 static inline bool
is_std_allocator_allocate(tree fndecl)1969 is_std_allocator_allocate (tree fndecl)
1970 {
1971   tree name = DECL_NAME (fndecl);
1972   if (name == NULL_TREE
1973       || !(id_equal (name, "allocate") || id_equal (name, "deallocate")))
1974     return false;
1975 
1976   tree ctx = DECL_CONTEXT (fndecl);
1977   if (ctx == NULL_TREE || !CLASS_TYPE_P (ctx) || !TYPE_MAIN_DECL (ctx))
1978     return false;
1979 
1980   tree decl = TYPE_MAIN_DECL (ctx);
1981   name = DECL_NAME (decl);
1982   if (name == NULL_TREE || !id_equal (name, "allocator"))
1983     return false;
1984 
1985   return decl_in_std_namespace_p (decl);
1986 }
1987 
1988 /* Overload for the above taking constexpr_call*.  */
1989 
1990 static inline bool
is_std_allocator_allocate(const constexpr_call * call)1991 is_std_allocator_allocate (const constexpr_call *call)
1992 {
1993   return (call
1994 	  && call->fundef
1995 	  && is_std_allocator_allocate (call->fundef->decl));
1996 }
1997 
1998 /* Return true if FNDECL is __dynamic_cast.  */
1999 
2000 static inline bool
cxx_dynamic_cast_fn_p(tree fndecl)2001 cxx_dynamic_cast_fn_p (tree fndecl)
2002 {
2003   return (cxx_dialect >= cxx20
2004 	  && id_equal (DECL_NAME (fndecl), "__dynamic_cast")
2005 	  && CP_DECL_CONTEXT (fndecl) == global_namespace);
2006 }
2007 
2008 /* Often, we have an expression in the form of address + offset, e.g.
2009    "&_ZTV1A + 16".  Extract the object from it, i.e. "_ZTV1A".  */
2010 
2011 static tree
extract_obj_from_addr_offset(tree expr)2012 extract_obj_from_addr_offset (tree expr)
2013 {
2014   if (TREE_CODE (expr) == POINTER_PLUS_EXPR)
2015     expr = TREE_OPERAND (expr, 0);
2016   STRIP_NOPS (expr);
2017   if (TREE_CODE (expr) == ADDR_EXPR)
2018     expr = TREE_OPERAND (expr, 0);
2019   return expr;
2020 }
2021 
2022 /* Given a PATH like
2023 
2024      g.D.2181.D.2154.D.2102.D.2093
2025 
2026    find a component with type TYPE.  Return NULL_TREE if not found, and
2027    error_mark_node if the component is not accessible.  If STOP is non-null,
2028    this function will return NULL_TREE if STOP is found before TYPE.  */
2029 
2030 static tree
get_component_with_type(tree path,tree type,tree stop)2031 get_component_with_type (tree path, tree type, tree stop)
2032 {
2033   while (true)
2034     {
2035       if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (path), type))
2036 	/* Found it.  */
2037 	return path;
2038       else if (stop
2039 	       && (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (path),
2040 							      stop)))
2041 	return NULL_TREE;
2042       else if (TREE_CODE (path) == COMPONENT_REF
2043 	       && DECL_FIELD_IS_BASE (TREE_OPERAND (path, 1)))
2044 	{
2045 	  /* We need to check that the component we're accessing is in fact
2046 	     accessible.  */
2047 	  if (TREE_PRIVATE (TREE_OPERAND (path, 1))
2048 	      || TREE_PROTECTED (TREE_OPERAND (path, 1)))
2049 	    return error_mark_node;
2050 	  path = TREE_OPERAND (path, 0);
2051 	}
2052       else
2053 	return NULL_TREE;
2054     }
2055 }
2056 
2057 /* Evaluate a call to __dynamic_cast (permitted by P1327R1).
2058 
2059    The declaration of __dynamic_cast is:
2060 
2061    void* __dynamic_cast (const void* __src_ptr,
2062 			 const __class_type_info* __src_type,
2063 			 const __class_type_info* __dst_type,
2064 			 ptrdiff_t __src2dst);
2065 
2066    where src2dst has the following possible values
2067 
2068    >-1: src_type is a unique public non-virtual base of dst_type
2069 	dst_ptr + src2dst == src_ptr
2070    -1: unspecified relationship
2071    -2: src_type is not a public base of dst_type
2072    -3: src_type is a multiple public non-virtual base of dst_type
2073 
2074   Since literal types can't have virtual bases, we only expect hint >=0,
2075   -2, or -3.  */
2076 
2077 static tree
cxx_eval_dynamic_cast_fn(const constexpr_ctx * ctx,tree call,bool * non_constant_p,bool * overflow_p)2078 cxx_eval_dynamic_cast_fn (const constexpr_ctx *ctx, tree call,
2079 			  bool *non_constant_p, bool *overflow_p)
2080 {
2081   /* T will be something like
2082       __dynamic_cast ((B*) b, &_ZTI1B, &_ZTI1D, 8)
2083      dismantle it.  */
2084   gcc_assert (call_expr_nargs (call) == 4);
2085   tsubst_flags_t complain = ctx->quiet ? tf_none : tf_warning_or_error;
2086   tree obj = CALL_EXPR_ARG (call, 0);
2087   tree type = CALL_EXPR_ARG (call, 2);
2088   HOST_WIDE_INT hint = int_cst_value (CALL_EXPR_ARG (call, 3));
2089   location_t loc = cp_expr_loc_or_input_loc (call);
2090 
2091   /* Get the target type of the dynamic_cast.  */
2092   gcc_assert (TREE_CODE (type) == ADDR_EXPR);
2093   type = TREE_OPERAND (type, 0);
2094   type = TREE_TYPE (DECL_NAME (type));
2095 
2096   /* TYPE can only be either T* or T&.  We can't know which of these it
2097      is by looking at TYPE, but OBJ will be "(T*) x" in the first case,
2098      and something like "(T*)(T&)(T*) x" in the second case.  */
2099   bool reference_p = false;
2100   while (CONVERT_EXPR_P (obj) || TREE_CODE (obj) == SAVE_EXPR)
2101     {
2102       reference_p |= TYPE_REF_P (TREE_TYPE (obj));
2103       obj = TREE_OPERAND (obj, 0);
2104     }
2105 
2106   /* Evaluate the object so that we know its dynamic type.  */
2107   obj = cxx_eval_constant_expression (ctx, obj, /*lval*/false, non_constant_p,
2108 				      overflow_p);
2109   if (*non_constant_p)
2110     return call;
2111 
2112   /* We expect OBJ to be in form of &d.D.2102 when HINT == 0,
2113      but when HINT is > 0, it can also be something like
2114      &d.D.2102 + 18446744073709551608, which includes the BINFO_OFFSET.  */
2115   obj = extract_obj_from_addr_offset (obj);
2116   const tree objtype = TREE_TYPE (obj);
2117   /* If OBJ doesn't refer to a base field, we're done.  */
2118   if (tree t = (TREE_CODE (obj) == COMPONENT_REF
2119 		? TREE_OPERAND (obj, 1) : obj))
2120     if (TREE_CODE (t) != FIELD_DECL || !DECL_FIELD_IS_BASE (t))
2121       {
2122 	if (reference_p)
2123 	  {
2124 	    if (!ctx->quiet)
2125 	      {
2126 		error_at (loc, "reference %<dynamic_cast%> failed");
2127 		inform (loc, "dynamic type %qT of its operand does "
2128 			"not have a base class of type %qT",
2129 			objtype, type);
2130 	      }
2131 	    *non_constant_p = true;
2132 	  }
2133 	return integer_zero_node;
2134       }
2135 
2136   /* [class.cdtor] When a dynamic_cast is used in a constructor ...
2137      or in a destructor ... if the operand of the dynamic_cast refers
2138      to the object under construction or destruction, this object is
2139      considered to be a most derived object that has the type of the
2140      constructor or destructor's class.  */
2141   tree vtable = build_vfield_ref (obj, objtype);
2142   vtable = cxx_eval_constant_expression (ctx, vtable, /*lval*/false,
2143 					 non_constant_p, overflow_p);
2144   if (*non_constant_p)
2145     return call;
2146   /* With -fsanitize=vptr, we initialize all vtable pointers to null,
2147      so it's possible that we got a null pointer now.  */
2148   if (integer_zerop (vtable))
2149     {
2150       if (!ctx->quiet)
2151 	error_at (loc, "virtual table pointer is used uninitialized");
2152       *non_constant_p = true;
2153       return integer_zero_node;
2154     }
2155   /* VTABLE will be &_ZTV1A + 16 or similar, get _ZTV1A.  */
2156   vtable = extract_obj_from_addr_offset (vtable);
2157   const tree mdtype = DECL_CONTEXT (vtable);
2158 
2159   /* Given dynamic_cast<T>(v),
2160 
2161      [expr.dynamic.cast] If C is the class type to which T points or refers,
2162      the runtime check logically executes as follows:
2163 
2164      If, in the most derived object pointed (referred) to by v, v points
2165      (refers) to a public base class subobject of a C object, and if only
2166      one object of type C is derived from the subobject pointed (referred)
2167      to by v the result points (refers) to that C object.
2168 
2169      In this case, HINT >= 0 or -3.  */
2170   if (hint >= 0 || hint == -3)
2171     {
2172       /* Look for a component with type TYPE.  */
2173       tree t = get_component_with_type (obj, type, mdtype);
2174       /* If not accessible, give an error.  */
2175       if (t == error_mark_node)
2176 	{
2177 	  if (reference_p)
2178 	    {
2179 	      if (!ctx->quiet)
2180 		{
2181 		  error_at (loc, "reference %<dynamic_cast%> failed");
2182 		  inform (loc, "static type %qT of its operand is a "
2183 			  "non-public base class of dynamic type %qT",
2184 			  objtype, type);
2185 
2186 		}
2187 	      *non_constant_p = true;
2188 	    }
2189 	  return integer_zero_node;
2190 	}
2191       else if (t)
2192 	/* The result points to the TYPE object.  */
2193 	return cp_build_addr_expr (t, complain);
2194       /* Else, TYPE was not found, because the HINT turned out to be wrong.
2195 	 Fall through to the normal processing.  */
2196     }
2197 
2198   /* Otherwise, if v points (refers) to a public base class subobject of the
2199      most derived object, and the type of the most derived object has a base
2200      class, of type C, that is unambiguous and public, the result points
2201      (refers) to the C subobject of the most derived object.
2202 
2203      But it can also be an invalid case.  */
2204 
2205   /* Get the most derived object.  */
2206   obj = get_component_with_type (obj, mdtype, NULL_TREE);
2207   if (obj == error_mark_node)
2208     {
2209       if (reference_p)
2210 	{
2211 	  if (!ctx->quiet)
2212 	    {
2213 	      error_at (loc, "reference %<dynamic_cast%> failed");
2214 	      inform (loc, "static type %qT of its operand is a non-public"
2215 		      " base class of dynamic type %qT", objtype, mdtype);
2216 	    }
2217 	  *non_constant_p = true;
2218 	}
2219       return integer_zero_node;
2220     }
2221   else
2222     gcc_assert (obj);
2223 
2224   /* Check that the type of the most derived object has a base class
2225      of type TYPE that is unambiguous and public.  */
2226   base_kind b_kind;
2227   tree binfo = lookup_base (mdtype, type, ba_check, &b_kind, tf_none);
2228   if (!binfo || binfo == error_mark_node)
2229     {
2230       if (reference_p)
2231 	{
2232 	  if (!ctx->quiet)
2233 	    {
2234 	      error_at (loc, "reference %<dynamic_cast%> failed");
2235 	      if (b_kind == bk_ambig)
2236 		inform (loc, "%qT is an ambiguous base class of dynamic "
2237 			"type %qT of its operand", type, mdtype);
2238 	      else
2239 		inform (loc, "dynamic type %qT of its operand does not "
2240 			"have an unambiguous public base class %qT",
2241 			mdtype, type);
2242 	    }
2243 	  *non_constant_p = true;
2244 	}
2245       return integer_zero_node;
2246     }
2247   /* If so, return the TYPE subobject of the most derived object.  */
2248   obj = convert_to_base_statically (obj, binfo);
2249   return cp_build_addr_expr (obj, complain);
2250 }
2251 
2252 /* Data structure used by replace_decl and replace_decl_r.  */
2253 
2254 struct replace_decl_data
2255 {
2256   /* The _DECL we want to replace.  */
2257   tree decl;
2258   /* The replacement for DECL.  */
2259   tree replacement;
2260   /* Trees we've visited.  */
2261   hash_set<tree> *pset;
2262   /* Whether we've performed any replacements.  */
2263   bool changed;
2264 };
2265 
2266 /* Helper function for replace_decl, called through cp_walk_tree.  */
2267 
2268 static tree
replace_decl_r(tree * tp,int * walk_subtrees,void * data)2269 replace_decl_r (tree *tp, int *walk_subtrees, void *data)
2270 {
2271   replace_decl_data *d = (replace_decl_data *) data;
2272 
2273   if (*tp == d->decl)
2274     {
2275       *tp = unshare_expr (d->replacement);
2276       d->changed = true;
2277       *walk_subtrees = 0;
2278     }
2279   else if (TYPE_P (*tp)
2280 	   || d->pset->add (*tp))
2281     *walk_subtrees = 0;
2282 
2283   return NULL_TREE;
2284 }
2285 
2286 /* Replace every occurrence of DECL with (an unshared copy of)
2287    REPLACEMENT within the expression *TP.  Returns true iff a
2288    replacement was performed.  */
2289 
2290 bool
replace_decl(tree * tp,tree decl,tree replacement)2291 replace_decl (tree *tp, tree decl, tree replacement)
2292 {
2293   gcc_checking_assert (same_type_ignoring_top_level_qualifiers_p
2294 		       (TREE_TYPE (decl), TREE_TYPE (replacement)));
2295   hash_set<tree> pset;
2296   replace_decl_data data = { decl, replacement, &pset, false };
2297   cp_walk_tree (tp, replace_decl_r, &data, NULL);
2298   return data.changed;
2299 }
2300 
2301 /* Evaluate the call T to virtual function thunk THUNK_FNDECL.  */
2302 
2303 static tree
cxx_eval_thunk_call(const constexpr_ctx * ctx,tree t,tree thunk_fndecl,bool lval,bool * non_constant_p,bool * overflow_p)2304 cxx_eval_thunk_call (const constexpr_ctx *ctx, tree t, tree thunk_fndecl,
2305 		     bool lval,
2306 		     bool *non_constant_p, bool *overflow_p)
2307 {
2308   tree function = THUNK_TARGET (thunk_fndecl);
2309 
2310   if (THUNK_VIRTUAL_OFFSET (thunk_fndecl))
2311     {
2312       if (!ctx->quiet)
2313 	{
2314 	  if (!DECL_DECLARED_CONSTEXPR_P (function))
2315 	    {
2316 	      error ("call to non-%<constexpr%> function %qD", function);
2317 	      explain_invalid_constexpr_fn (function);
2318 	    }
2319 	  else
2320 	    /* virtual_offset is only set for virtual bases, which make the
2321 	       class non-literal, so we don't need to handle it here.  */
2322 	    error ("calling constexpr member function %qD through virtual "
2323 		   "base subobject", function);
2324 	}
2325       *non_constant_p = true;
2326       return t;
2327     }
2328 
2329   tree new_call = copy_node (t);
2330   CALL_EXPR_FN (new_call) = function;
2331   TREE_TYPE (new_call) = TREE_TYPE (TREE_TYPE (function));
2332 
2333   tree offset = size_int (THUNK_FIXED_OFFSET (thunk_fndecl));
2334 
2335   if (DECL_THIS_THUNK_P (thunk_fndecl))
2336     {
2337       /* 'this'-adjusting thunk.  */
2338       tree this_arg = CALL_EXPR_ARG (t, 0);
2339       this_arg = build2 (POINTER_PLUS_EXPR, TREE_TYPE (this_arg),
2340 			 this_arg, offset);
2341       CALL_EXPR_ARG (new_call, 0) = this_arg;
2342     }
2343   else
2344     /* Return-adjusting thunk.  */
2345     new_call = build2 (POINTER_PLUS_EXPR, TREE_TYPE (new_call),
2346 		       new_call, offset);
2347 
2348   return cxx_eval_constant_expression (ctx, new_call, lval,
2349 				       non_constant_p, overflow_p);
2350 }
2351 
2352 /* If OBJECT is of const class type, evaluate it to a CONSTRUCTOR and set
2353    its TREE_READONLY flag according to READONLY_P.  Used for constexpr
2354    'tors to detect modifying const objects in a constexpr context.  */
2355 
2356 static void
cxx_set_object_constness(const constexpr_ctx * ctx,tree object,bool readonly_p,bool * non_constant_p,bool * overflow_p)2357 cxx_set_object_constness (const constexpr_ctx *ctx, tree object,
2358 			  bool readonly_p, bool *non_constant_p,
2359 			  bool *overflow_p)
2360 {
2361   if (CLASS_TYPE_P (TREE_TYPE (object))
2362       && CP_TYPE_CONST_P (TREE_TYPE (object)))
2363     {
2364       /* Subobjects might not be stored in ctx->global->values but we
2365 	 can get its CONSTRUCTOR by evaluating *this.  */
2366       tree e = cxx_eval_constant_expression (ctx, object, /*lval*/false,
2367 					     non_constant_p, overflow_p);
2368       if (TREE_CODE (e) == CONSTRUCTOR && !*non_constant_p)
2369 	TREE_READONLY (e) = readonly_p;
2370     }
2371 }
2372 
2373 /* Subroutine of cxx_eval_constant_expression.
2374    Evaluate the call expression tree T in the context of OLD_CALL expression
2375    evaluation.  */
2376 
2377 static tree
cxx_eval_call_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)2378 cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
2379 			  bool lval,
2380 			  bool *non_constant_p, bool *overflow_p)
2381 {
2382   /* Handle concept checks separately.  */
2383   if (concept_check_p (t))
2384     return evaluate_concept_check (t);
2385 
2386   location_t loc = cp_expr_loc_or_input_loc (t);
2387   tree fun = get_function_named_in_call (t);
2388   constexpr_call new_call
2389     = { NULL, NULL, NULL, 0, ctx->manifestly_const_eval };
2390   int depth_ok;
2391 
2392   if (fun == NULL_TREE)
2393     return cxx_eval_internal_function (ctx, t, lval,
2394 				       non_constant_p, overflow_p);
2395 
2396   if (TREE_CODE (fun) != FUNCTION_DECL)
2397     {
2398       /* Might be a constexpr function pointer.  */
2399       fun = cxx_eval_constant_expression (ctx, fun,
2400 					  /*lval*/false, non_constant_p,
2401 					  overflow_p);
2402       STRIP_NOPS (fun);
2403       if (TREE_CODE (fun) == ADDR_EXPR)
2404 	fun = TREE_OPERAND (fun, 0);
2405       /* For TARGET_VTABLE_USES_DESCRIPTORS targets, there is no
2406 	 indirection, the called expression is a pointer into the
2407 	 virtual table which should contain FDESC_EXPR.  Extract the
2408 	 FUNCTION_DECL from there.  */
2409       else if (TARGET_VTABLE_USES_DESCRIPTORS
2410 	       && TREE_CODE (fun) == POINTER_PLUS_EXPR
2411 	       && TREE_CODE (TREE_OPERAND (fun, 0)) == ADDR_EXPR
2412 	       && TREE_CODE (TREE_OPERAND (fun, 1)) == INTEGER_CST)
2413 	{
2414 	  tree d = TREE_OPERAND (TREE_OPERAND (fun, 0), 0);
2415 	  if (VAR_P (d)
2416 	      && DECL_VTABLE_OR_VTT_P (d)
2417 	      && TREE_CODE (TREE_TYPE (d)) == ARRAY_TYPE
2418 	      && TREE_TYPE (TREE_TYPE (d)) == vtable_entry_type
2419 	      && DECL_INITIAL (d)
2420 	      && TREE_CODE (DECL_INITIAL (d)) == CONSTRUCTOR)
2421 	    {
2422 	      tree i = int_const_binop (TRUNC_DIV_EXPR, TREE_OPERAND (fun, 1),
2423 					TYPE_SIZE_UNIT (vtable_entry_type));
2424 	      HOST_WIDE_INT idx = find_array_ctor_elt (DECL_INITIAL (d), i);
2425 	      if (idx >= 0)
2426 		{
2427 		  tree fdesc
2428 		    = (*CONSTRUCTOR_ELTS (DECL_INITIAL (d)))[idx].value;
2429 		  if (TREE_CODE (fdesc) == FDESC_EXPR
2430 		      && integer_zerop (TREE_OPERAND (fdesc, 1)))
2431 		    fun = TREE_OPERAND (fdesc, 0);
2432 		}
2433 	    }
2434 	}
2435     }
2436   if (TREE_CODE (fun) != FUNCTION_DECL)
2437     {
2438       if (!ctx->quiet && !*non_constant_p)
2439 	error_at (loc, "expression %qE does not designate a %<constexpr%> "
2440 		  "function", fun);
2441       *non_constant_p = true;
2442       return t;
2443     }
2444   if (DECL_CLONED_FUNCTION_P (fun) && !DECL_DELETING_DESTRUCTOR_P (fun))
2445     fun = DECL_CLONED_FUNCTION (fun);
2446 
2447   if (is_ubsan_builtin_p (fun))
2448     return void_node;
2449 
2450   if (fndecl_built_in_p (fun))
2451     return cxx_eval_builtin_function_call (ctx, t, fun,
2452 					   lval, non_constant_p, overflow_p);
2453   if (DECL_THUNK_P (fun))
2454     return cxx_eval_thunk_call (ctx, t, fun, lval, non_constant_p, overflow_p);
2455   if (!maybe_constexpr_fn (fun))
2456     {
2457       if (TREE_CODE (t) == CALL_EXPR
2458 	  && cxx_replaceable_global_alloc_fn (fun)
2459 	  && (CALL_FROM_NEW_OR_DELETE_P (t)
2460 	      || is_std_allocator_allocate (ctx->call)))
2461 	{
2462 	  const int nargs = call_expr_nargs (t);
2463 	  tree arg0 = NULL_TREE;
2464 	  for (int i = 0; i < nargs; ++i)
2465 	    {
2466 	      tree arg = CALL_EXPR_ARG (t, i);
2467 	      arg = cxx_eval_constant_expression (ctx, arg, false,
2468 						  non_constant_p, overflow_p);
2469 	      VERIFY_CONSTANT (arg);
2470 	      if (i == 0)
2471 		arg0 = arg;
2472 	    }
2473 	  gcc_assert (arg0);
2474 	  if (IDENTIFIER_NEW_OP_P (DECL_NAME (fun)))
2475 	    {
2476 	      tree type = build_array_type_nelts (char_type_node,
2477 						  tree_to_uhwi (arg0));
2478 	      tree var = build_decl (loc, VAR_DECL,
2479 				     (IDENTIFIER_OVL_OP_FLAGS (DECL_NAME (fun))
2480 				      & OVL_OP_FLAG_VEC)
2481 				     ? heap_vec_uninit_identifier
2482 				     : heap_uninit_identifier,
2483 				     type);
2484 	      DECL_ARTIFICIAL (var) = 1;
2485 	      TREE_STATIC (var) = 1;
2486 	      // Temporarily register the artificial var in varpool,
2487 	      // so that comparisons of its address against NULL are folded
2488 	      // through nonzero_address even with
2489 	      // -fno-delete-null-pointer-checks or that comparison of
2490 	      // addresses of different heap artificial vars is folded too.
2491 	      // See PR98988 and PR99031.
2492 	      varpool_node::finalize_decl (var);
2493 	      ctx->global->heap_vars.safe_push (var);
2494 	      ctx->global->values.put (var, NULL_TREE);
2495 	      return fold_convert (ptr_type_node, build_address (var));
2496 	    }
2497 	  else
2498 	    {
2499 	      STRIP_NOPS (arg0);
2500 	      if (TREE_CODE (arg0) == ADDR_EXPR
2501 		  && VAR_P (TREE_OPERAND (arg0, 0)))
2502 		{
2503 		  tree var = TREE_OPERAND (arg0, 0);
2504 		  if (DECL_NAME (var) == heap_uninit_identifier
2505 		      || DECL_NAME (var) == heap_identifier)
2506 		    {
2507 		      if (IDENTIFIER_OVL_OP_FLAGS (DECL_NAME (fun))
2508 			  & OVL_OP_FLAG_VEC)
2509 			{
2510 			  if (!ctx->quiet)
2511 			    {
2512 			      error_at (loc, "array deallocation of object "
2513 					     "allocated with non-array "
2514 					     "allocation");
2515 			      inform (DECL_SOURCE_LOCATION (var),
2516 				      "allocation performed here");
2517 			    }
2518 			  *non_constant_p = true;
2519 			  return t;
2520 			}
2521 		      DECL_NAME (var) = heap_deleted_identifier;
2522 		      ctx->global->values.remove (var);
2523 		      ctx->global->heap_dealloc_count++;
2524 		      return void_node;
2525 		    }
2526 		  else if (DECL_NAME (var) == heap_vec_uninit_identifier
2527 			   || DECL_NAME (var) == heap_vec_identifier)
2528 		    {
2529 		      if ((IDENTIFIER_OVL_OP_FLAGS (DECL_NAME (fun))
2530 			   & OVL_OP_FLAG_VEC) == 0)
2531 			{
2532 			  if (!ctx->quiet)
2533 			    {
2534 			      error_at (loc, "non-array deallocation of "
2535 					     "object allocated with array "
2536 					     "allocation");
2537 			      inform (DECL_SOURCE_LOCATION (var),
2538 				      "allocation performed here");
2539 			    }
2540 			  *non_constant_p = true;
2541 			  return t;
2542 			}
2543 		      DECL_NAME (var) = heap_deleted_identifier;
2544 		      ctx->global->values.remove (var);
2545 		      ctx->global->heap_dealloc_count++;
2546 		      return void_node;
2547 		    }
2548 		  else if (DECL_NAME (var) == heap_deleted_identifier)
2549 		    {
2550 		      if (!ctx->quiet)
2551 			error_at (loc, "deallocation of already deallocated "
2552 				       "storage");
2553 		      *non_constant_p = true;
2554 		      return t;
2555 		    }
2556 		}
2557 	      if (!ctx->quiet)
2558 		error_at (loc, "deallocation of storage that was "
2559 			       "not previously allocated");
2560 	      *non_constant_p = true;
2561 	      return t;
2562 	    }
2563 	}
2564       /* Allow placement new in std::construct_at, just return the second
2565 	 argument.  */
2566       if (TREE_CODE (t) == CALL_EXPR
2567 	  && cxx_placement_new_fn (fun)
2568 	  && is_std_construct_at (ctx->call))
2569 	{
2570 	  const int nargs = call_expr_nargs (t);
2571 	  tree arg1 = NULL_TREE;
2572 	  for (int i = 0; i < nargs; ++i)
2573 	    {
2574 	      tree arg = CALL_EXPR_ARG (t, i);
2575 	      arg = cxx_eval_constant_expression (ctx, arg, false,
2576 						  non_constant_p, overflow_p);
2577 	      if (i == 1)
2578 		arg1 = arg;
2579 	      else
2580 		VERIFY_CONSTANT (arg);
2581 	    }
2582 	  gcc_assert (arg1);
2583 	  return arg1;
2584 	}
2585       else if (cxx_dynamic_cast_fn_p (fun))
2586 	return cxx_eval_dynamic_cast_fn (ctx, t, non_constant_p, overflow_p);
2587 
2588       if (!ctx->quiet)
2589 	{
2590 	  if (!lambda_static_thunk_p (fun))
2591 	    error_at (loc, "call to non-%<constexpr%> function %qD", fun);
2592 	  explain_invalid_constexpr_fn (fun);
2593 	}
2594       *non_constant_p = true;
2595       return t;
2596     }
2597 
2598   constexpr_ctx new_ctx = *ctx;
2599   if (DECL_CONSTRUCTOR_P (fun) && !ctx->object
2600       && TREE_CODE (t) == AGGR_INIT_EXPR)
2601     {
2602       /* We want to have an initialization target for an AGGR_INIT_EXPR.
2603 	 If we don't already have one in CTX, use the AGGR_INIT_EXPR_SLOT.  */
2604       new_ctx.object = AGGR_INIT_EXPR_SLOT (t);
2605       tree ctor = new_ctx.ctor = build_constructor (DECL_CONTEXT (fun), NULL);
2606       CONSTRUCTOR_NO_CLEARING (ctor) = true;
2607       ctx->global->values.put (new_ctx.object, ctor);
2608       ctx = &new_ctx;
2609     }
2610 
2611   /* Shortcut trivial constructor/op=.  */
2612   if (trivial_fn_p (fun))
2613     {
2614       tree init = NULL_TREE;
2615       if (call_expr_nargs (t) == 2)
2616 	init = convert_from_reference (get_nth_callarg (t, 1));
2617       else if (TREE_CODE (t) == AGGR_INIT_EXPR
2618 	       && AGGR_INIT_ZERO_FIRST (t))
2619 	init = build_zero_init (DECL_CONTEXT (fun), NULL_TREE, false);
2620       if (init)
2621 	{
2622 	  tree op = get_nth_callarg (t, 0);
2623 	  if (is_dummy_object (op))
2624 	    op = ctx->object;
2625 	  else
2626 	    op = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (op)), op);
2627 	  tree set = build2 (MODIFY_EXPR, TREE_TYPE (op), op, init);
2628 	  new_ctx.call = &new_call;
2629 	  return cxx_eval_constant_expression (&new_ctx, set, lval,
2630 					       non_constant_p, overflow_p);
2631 	}
2632     }
2633 
2634   bool non_constant_args = false;
2635   new_call.bindings
2636     = cxx_bind_parameters_in_call (ctx, t, fun, non_constant_p,
2637 				   overflow_p, &non_constant_args);
2638 
2639   /* We build up the bindings list before we know whether we already have this
2640      call cached.  If we don't end up saving these bindings, ggc_free them when
2641      this function exits.  */
2642   class free_bindings
2643   {
2644     tree *bindings;
2645   public:
2646     free_bindings (tree &b): bindings (&b) { }
2647     ~free_bindings () { if (bindings) ggc_free (*bindings); }
2648     void preserve () { bindings = NULL; }
2649   } fb (new_call.bindings);
2650 
2651   if (*non_constant_p)
2652     return t;
2653 
2654   /* We can't defer instantiating the function any longer.  */
2655   if (!DECL_INITIAL (fun)
2656       && DECL_TEMPLOID_INSTANTIATION (fun)
2657       && !uid_sensitive_constexpr_evaluation_p ())
2658     {
2659       location_t save_loc = input_location;
2660       input_location = loc;
2661       ++function_depth;
2662       if (ctx->manifestly_const_eval)
2663 	FNDECL_MANIFESTLY_CONST_EVALUATED (fun) = true;
2664       instantiate_decl (fun, /*defer_ok*/false, /*expl_inst*/false);
2665       --function_depth;
2666       input_location = save_loc;
2667     }
2668 
2669   /* If in direct recursive call, optimize definition search.  */
2670   if (ctx && ctx->call && ctx->call->fundef && ctx->call->fundef->decl == fun)
2671     new_call.fundef = ctx->call->fundef;
2672   else
2673     {
2674       new_call.fundef = retrieve_constexpr_fundef (fun);
2675       if (new_call.fundef == NULL || new_call.fundef->body == NULL
2676 	  || new_call.fundef->result == error_mark_node
2677 	  || fun == current_function_decl)
2678         {
2679 	  if (!ctx->quiet)
2680 	    {
2681 	      /* We need to check for current_function_decl here in case we're
2682 		 being called during cp_fold_function, because at that point
2683 		 DECL_INITIAL is set properly and we have a fundef but we
2684 		 haven't lowered invisirefs yet (c++/70344).  */
2685 	      if (DECL_INITIAL (fun) == error_mark_node
2686 		  || fun == current_function_decl)
2687 		error_at (loc, "%qD called in a constant expression before its "
2688 			  "definition is complete", fun);
2689 	      else if (DECL_INITIAL (fun))
2690 		{
2691 		  /* The definition of fun was somehow unsuitable.  But pretend
2692 		     that lambda static thunks don't exist.  */
2693 		  if (!lambda_static_thunk_p (fun))
2694 		    error_at (loc, "%qD called in a constant expression", fun);
2695 		  explain_invalid_constexpr_fn (fun);
2696 		}
2697 	      else
2698 		error_at (loc, "%qD used before its definition", fun);
2699 	    }
2700 	  *non_constant_p = true;
2701           return t;
2702         }
2703     }
2704 
2705   depth_ok = push_cx_call_context (t);
2706 
2707   /* Remember the object we are constructing or destructing.  */
2708   tree new_obj = NULL_TREE;
2709   if (DECL_CONSTRUCTOR_P (fun) || DECL_DESTRUCTOR_P (fun))
2710     {
2711       /* In a cdtor, it should be the first `this' argument.
2712 	 At this point it has already been evaluated in the call
2713 	 to cxx_bind_parameters_in_call.  */
2714       new_obj = TREE_VEC_ELT (new_call.bindings, 0);
2715       STRIP_NOPS (new_obj);
2716       if (TREE_CODE (new_obj) == ADDR_EXPR)
2717 	new_obj = TREE_OPERAND (new_obj, 0);
2718 
2719       if (ctx->call && ctx->call->fundef
2720 	  && DECL_CONSTRUCTOR_P (ctx->call->fundef->decl))
2721 	{
2722 	  tree cur_obj = TREE_VEC_ELT (ctx->call->bindings, 0);
2723 	  STRIP_NOPS (cur_obj);
2724 	  if (TREE_CODE (cur_obj) == ADDR_EXPR)
2725 	    cur_obj = TREE_OPERAND (cur_obj, 0);
2726 	  if (new_obj == cur_obj)
2727 	    /* We're calling the target constructor of a delegating
2728 	       constructor, or accessing a base subobject through a
2729 	       NOP_EXPR as part of a call to a base constructor, so
2730 	       there is no new (sub)object.  */
2731 	    new_obj = NULL_TREE;
2732 	}
2733     }
2734 
2735   tree result = NULL_TREE;
2736 
2737   constexpr_call *entry = NULL;
2738   if (depth_ok && !non_constant_args && ctx->strict)
2739     {
2740       new_call.hash = constexpr_fundef_hasher::hash (new_call.fundef);
2741       new_call.hash
2742 	= iterative_hash_template_arg (new_call.bindings, new_call.hash);
2743       new_call.hash
2744 	= iterative_hash_object (ctx->manifestly_const_eval, new_call.hash);
2745 
2746       /* If we have seen this call before, we are done.  */
2747       maybe_initialize_constexpr_call_table ();
2748       constexpr_call **slot
2749 	= constexpr_call_table->find_slot (&new_call, INSERT);
2750       entry = *slot;
2751       if (entry == NULL)
2752 	{
2753 	  /* Only cache up to constexpr_cache_depth to limit memory use.  */
2754 	  if (depth_ok < constexpr_cache_depth)
2755 	    {
2756 	      /* We need to keep a pointer to the entry, not just the slot, as
2757 		 the slot can move during evaluation of the body.  */
2758 	      *slot = entry = ggc_alloc<constexpr_call> ();
2759 	      *entry = new_call;
2760 	      fb.preserve ();
2761 	    }
2762 	}
2763       /* Calls that are in progress have their result set to NULL, so that we
2764 	 can detect circular dependencies.  Now that we only cache up to
2765 	 constexpr_cache_depth this won't catch circular dependencies that
2766 	 start deeper, but they'll hit the recursion or ops limit.  */
2767       else if (entry->result == NULL)
2768 	{
2769 	  if (!ctx->quiet)
2770 	    error ("call has circular dependency");
2771 	  *non_constant_p = true;
2772 	  entry->result = result = error_mark_node;
2773 	}
2774       else
2775 	result = entry->result;
2776     }
2777 
2778   if (!depth_ok)
2779     {
2780       if (!ctx->quiet)
2781 	error ("%<constexpr%> evaluation depth exceeds maximum of %d (use "
2782 	       "%<-fconstexpr-depth=%> to increase the maximum)",
2783 	       max_constexpr_depth);
2784       *non_constant_p = true;
2785       result = error_mark_node;
2786     }
2787   else
2788     {
2789       bool cacheable = true;
2790       if (result && result != error_mark_node)
2791 	/* OK */;
2792       else if (!DECL_SAVED_TREE (fun))
2793 	{
2794 	  /* When at_eof >= 2, cgraph has started throwing away
2795 	     DECL_SAVED_TREE, so fail quietly.  FIXME we get here because of
2796 	     late code generation for VEC_INIT_EXPR, which needs to be
2797 	     completely reconsidered.  */
2798 	  gcc_assert (at_eof >= 2 && ctx->quiet);
2799 	  *non_constant_p = true;
2800 	}
2801       else if (tree copy = get_fundef_copy (new_call.fundef))
2802 	{
2803 	  tree body, parms, res;
2804 	  releasing_vec ctors;
2805 
2806 	  /* Reuse or create a new unshared copy of this function's body.  */
2807 	  body = TREE_PURPOSE (copy);
2808 	  parms = TREE_VALUE (copy);
2809 	  res = TREE_TYPE (copy);
2810 
2811 	  /* Associate the bindings with the remapped parms.  */
2812 	  tree bound = new_call.bindings;
2813 	  tree remapped = parms;
2814 	  for (int i = 0; i < TREE_VEC_LENGTH (bound); ++i)
2815 	    {
2816 	      tree arg = TREE_VEC_ELT (bound, i);
2817 	      if (entry)
2818 		{
2819 		  /* Unshare args going into the hash table to separate them
2820 		     from the caller's context, for better GC and to avoid
2821 		     problems with verify_gimple.  */
2822 		  arg = unshare_expr_without_location (arg);
2823 		  TREE_VEC_ELT (bound, i) = arg;
2824 
2825 		  /* And then unshare again so the callee doesn't change the
2826 		     argument values in the hash table. XXX Could we unshare
2827 		     lazily in cxx_eval_store_expression?  */
2828 		  arg = unshare_constructor (arg);
2829 		  if (TREE_CODE (arg) == CONSTRUCTOR)
2830 		    vec_safe_push (ctors, arg);
2831 		}
2832 	      ctx->global->values.put (remapped, arg);
2833 	      remapped = DECL_CHAIN (remapped);
2834 	    }
2835 	  /* Add the RESULT_DECL to the values map, too.  */
2836 	  gcc_assert (!DECL_BY_REFERENCE (res));
2837 	  ctx->global->values.put (res, NULL_TREE);
2838 
2839 	  /* Track the callee's evaluated SAVE_EXPRs and TARGET_EXPRs so that
2840 	     we can forget their values after the call.  */
2841 	  constexpr_ctx ctx_with_save_exprs = *ctx;
2842 	  auto_vec<tree, 10> save_exprs;
2843 	  ctx_with_save_exprs.save_exprs = &save_exprs;
2844 	  ctx_with_save_exprs.call = &new_call;
2845 	  unsigned save_heap_alloc_count = ctx->global->heap_vars.length ();
2846 	  unsigned save_heap_dealloc_count = ctx->global->heap_dealloc_count;
2847 
2848 	  /* If this is a constexpr destructor, the object's const and volatile
2849 	     semantics are no longer in effect; see [class.dtor]p5.  */
2850 	  if (new_obj && DECL_DESTRUCTOR_P (fun))
2851 	    cxx_set_object_constness (ctx, new_obj, /*readonly_p=*/false,
2852 				      non_constant_p, overflow_p);
2853 
2854 	  tree jump_target = NULL_TREE;
2855 	  cxx_eval_constant_expression (&ctx_with_save_exprs, body,
2856 					lval, non_constant_p, overflow_p,
2857 					&jump_target);
2858 
2859 	  if (DECL_CONSTRUCTOR_P (fun))
2860 	    {
2861 	      /* This can be null for a subobject constructor call, in
2862 		 which case what we care about is the initialization
2863 		 side-effects rather than the value.  We could get at the
2864 		 value by evaluating *this, but we don't bother; there's
2865 		 no need to put such a call in the hash table.  */
2866 	      result = lval ? ctx->object : ctx->ctor;
2867 
2868 	      /* If we've just evaluated a subobject constructor call for an
2869 		 empty union member, it might not have produced a side effect
2870 		 that actually activated the union member.  So produce such a
2871 		 side effect now to ensure the union appears initialized.  */
2872 	      if (!result && new_obj
2873 		  && TREE_CODE (new_obj) == COMPONENT_REF
2874 		  && TREE_CODE (TREE_TYPE
2875 				(TREE_OPERAND (new_obj, 0))) == UNION_TYPE
2876 		  && is_really_empty_class (TREE_TYPE (new_obj),
2877 					    /*ignore_vptr*/false))
2878 		{
2879 		  tree activate = build2 (MODIFY_EXPR, TREE_TYPE (new_obj),
2880 					  new_obj,
2881 					  build_constructor (TREE_TYPE (new_obj),
2882 							     NULL));
2883 		  cxx_eval_constant_expression (ctx, activate, lval,
2884 						non_constant_p, overflow_p);
2885 		  ggc_free (activate);
2886 		}
2887 	    }
2888 	  else if (VOID_TYPE_P (TREE_TYPE (res)))
2889 	    result = void_node;
2890 	  else
2891 	    {
2892 	      result = *ctx->global->values.get (res);
2893 	      if (result == NULL_TREE && !*non_constant_p
2894 		  && !DECL_DESTRUCTOR_P (fun))
2895 		{
2896 		  if (!ctx->quiet)
2897 		    error ("%<constexpr%> call flows off the end "
2898 			   "of the function");
2899 		  *non_constant_p = true;
2900 		}
2901 	    }
2902 
2903 	  /* At this point, the object's constructor will have run, so
2904 	     the object is no longer under construction, and its possible
2905 	     'const' semantics now apply.  Make a note of this fact by
2906 	     marking the CONSTRUCTOR TREE_READONLY.  */
2907 	  if (new_obj && DECL_CONSTRUCTOR_P (fun))
2908 	    cxx_set_object_constness (ctx, new_obj, /*readonly_p=*/true,
2909 				      non_constant_p, overflow_p);
2910 
2911 	  /* Forget the saved values of the callee's SAVE_EXPRs and
2912 	     TARGET_EXPRs.  */
2913 	  for (tree save_expr : save_exprs)
2914 	    ctx->global->values.remove (save_expr);
2915 
2916 	  /* Remove the parms/result from the values map.  Is it worth
2917 	     bothering to do this when the map itself is only live for
2918 	     one constexpr evaluation?  If so, maybe also clear out
2919 	     other vars from call, maybe in BIND_EXPR handling?  */
2920 	  ctx->global->values.remove (res);
2921 	  for (tree parm = parms; parm; parm = TREE_CHAIN (parm))
2922 	    ctx->global->values.remove (parm);
2923 
2924 	  /* Free any parameter CONSTRUCTORs we aren't returning directly.  */
2925 	  while (!ctors->is_empty ())
2926 	    {
2927 	      tree c = ctors->pop ();
2928 	      if (c != result)
2929 		free_constructor (c);
2930 	    }
2931 
2932 	  /* Make the unshared function copy we used available for re-use.  */
2933 	  save_fundef_copy (fun, copy);
2934 
2935 	  /* If the call allocated some heap object that hasn't been
2936 	     deallocated during the call, or if it deallocated some heap
2937 	     object it has not allocated, the call isn't really stateless
2938 	     for the constexpr evaluation and should not be cached.
2939 	     It is fine if the call allocates something and deallocates it
2940 	     too.  */
2941 	  if (entry
2942 	      && (save_heap_alloc_count != ctx->global->heap_vars.length ()
2943 		  || (save_heap_dealloc_count
2944 		      != ctx->global->heap_dealloc_count)))
2945 	    {
2946 	      tree heap_var;
2947 	      unsigned int i;
2948 	      if ((ctx->global->heap_vars.length ()
2949 		   - ctx->global->heap_dealloc_count)
2950 		  != save_heap_alloc_count - save_heap_dealloc_count)
2951 		cacheable = false;
2952 	      else
2953 		FOR_EACH_VEC_ELT_FROM (ctx->global->heap_vars, i, heap_var,
2954 				       save_heap_alloc_count)
2955 		  if (DECL_NAME (heap_var) != heap_deleted_identifier)
2956 		    {
2957 		      cacheable = false;
2958 		      break;
2959 		    }
2960 	    }
2961 
2962 	    /* Rewrite all occurrences of the function's RESULT_DECL with the
2963 	       current object under construction.  */
2964 	    if (!*non_constant_p && ctx->object
2965 		&& CLASS_TYPE_P (TREE_TYPE (res))
2966 		&& !is_empty_class (TREE_TYPE (res)))
2967 	      if (replace_decl (&result, res, ctx->object))
2968 		cacheable = false;
2969 	}
2970       else
2971 	/* Couldn't get a function copy to evaluate.  */
2972 	*non_constant_p = true;
2973 
2974       if (result == error_mark_node)
2975 	*non_constant_p = true;
2976       if (*non_constant_p || *overflow_p)
2977 	result = error_mark_node;
2978       else if (!result)
2979 	result = void_node;
2980       if (entry)
2981 	entry->result = cacheable ? result : error_mark_node;
2982     }
2983 
2984   /* The result of a constexpr function must be completely initialized.
2985 
2986      However, in C++20, a constexpr constructor doesn't necessarily have
2987      to initialize all the fields, so we don't clear CONSTRUCTOR_NO_CLEARING
2988      in order to detect reading an unitialized object in constexpr instead
2989      of value-initializing it.  (reduced_constant_expression_p is expected to
2990      take care of clearing the flag.)  */
2991   if (TREE_CODE (result) == CONSTRUCTOR
2992       && (cxx_dialect < cxx20
2993 	  || !DECL_CONSTRUCTOR_P (fun)))
2994     clear_no_implicit_zero (result);
2995 
2996   pop_cx_call_context ();
2997   return result;
2998 }
2999 
3000 /* Return true if T is a valid constant initializer.  If a CONSTRUCTOR
3001    initializes all the members, the CONSTRUCTOR_NO_CLEARING flag will be
3002    cleared.
3003    FIXME speed this up, it's taking 16% of compile time on sieve testcase.  */
3004 
3005 bool
reduced_constant_expression_p(tree t)3006 reduced_constant_expression_p (tree t)
3007 {
3008   if (t == NULL_TREE)
3009     return false;
3010 
3011   switch (TREE_CODE (t))
3012     {
3013     case PTRMEM_CST:
3014       /* Even if we can't lower this yet, it's constant.  */
3015       return true;
3016 
3017     case CONSTRUCTOR:
3018       /* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR.  */
3019       tree field;
3020       if (CONSTRUCTOR_NO_CLEARING (t))
3021 	{
3022 	  if (TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
3023 	    /* An initialized vector would have a VECTOR_CST.  */
3024 	    return false;
3025 	  else if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
3026 	    {
3027 	      /* There must be a valid constant initializer at every array
3028 		 index.  */
3029 	      tree min = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (t)));
3030 	      tree max = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (t)));
3031 	      tree cursor = min;
3032 	      for (auto &e: CONSTRUCTOR_ELTS (t))
3033 		{
3034 		  if (!reduced_constant_expression_p (e.value))
3035 		    return false;
3036 		  if (array_index_cmp (cursor, e.index) != 0)
3037 		    return false;
3038 		  if (TREE_CODE (e.index) == RANGE_EXPR)
3039 		    cursor = TREE_OPERAND (e.index, 1);
3040 		  cursor = int_const_binop (PLUS_EXPR, cursor, size_one_node);
3041 		}
3042 	      if (find_array_ctor_elt (t, max) == -1)
3043 		return false;
3044 	      goto ok;
3045 	    }
3046 	  else if (cxx_dialect >= cxx20
3047 		   && TREE_CODE (TREE_TYPE (t)) == UNION_TYPE)
3048 	    {
3049 	      if (CONSTRUCTOR_NELTS (t) == 0)
3050 		/* An initialized union has a constructor element.  */
3051 		return false;
3052 	      /* And it only initializes one member.  */
3053 	      field = NULL_TREE;
3054 	    }
3055 	  else
3056 	    field = next_subobject_field (TYPE_FIELDS (TREE_TYPE (t)));
3057 	}
3058       else
3059 	field = NULL_TREE;
3060       for (auto &e: CONSTRUCTOR_ELTS (t))
3061 	{
3062 	  /* If VAL is null, we're in the middle of initializing this
3063 	     element.  */
3064 	  if (!reduced_constant_expression_p (e.value))
3065 	    return false;
3066 	  /* We want to remove initializers for empty fields in a struct to
3067 	     avoid confusing output_constructor.  */
3068 	  if (is_empty_field (e.index)
3069 	      && TREE_CODE (TREE_TYPE (t)) == RECORD_TYPE)
3070 	    return false;
3071 	  /* Check for non-empty fields between initialized fields when
3072 	     CONSTRUCTOR_NO_CLEARING.  */
3073 	  for (; field && e.index != field;
3074 	       field = next_subobject_field (DECL_CHAIN (field)))
3075 	    if (!is_really_empty_class (TREE_TYPE (field),
3076 					/*ignore_vptr*/false))
3077 	      return false;
3078 	  if (field)
3079 	    field = next_subobject_field (DECL_CHAIN (field));
3080 	}
3081       /* There could be a non-empty field at the end.  */
3082       for (; field; field = next_subobject_field (DECL_CHAIN (field)))
3083 	if (!is_really_empty_class (TREE_TYPE (field), /*ignore_vptr*/false))
3084 	  return false;
3085 ok:
3086       if (CONSTRUCTOR_NO_CLEARING (t))
3087 	/* All the fields are initialized.  */
3088 	CONSTRUCTOR_NO_CLEARING (t) = false;
3089       return true;
3090 
3091     default:
3092       /* FIXME are we calling this too much?  */
3093       return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE;
3094     }
3095 }
3096 
3097 /* Some expressions may have constant operands but are not constant
3098    themselves, such as 1/0.  Call this function to check for that
3099    condition.
3100 
3101    We only call this in places that require an arithmetic constant, not in
3102    places where we might have a non-constant expression that can be a
3103    component of a constant expression, such as the address of a constexpr
3104    variable that might be dereferenced later.  */
3105 
3106 static bool
verify_constant(tree t,bool allow_non_constant,bool * non_constant_p,bool * overflow_p)3107 verify_constant (tree t, bool allow_non_constant, bool *non_constant_p,
3108 		 bool *overflow_p)
3109 {
3110   if (!*non_constant_p && !reduced_constant_expression_p (t)
3111       && t != void_node)
3112     {
3113       if (!allow_non_constant)
3114 	error ("%q+E is not a constant expression", t);
3115       *non_constant_p = true;
3116     }
3117   if (TREE_OVERFLOW_P (t))
3118     {
3119       if (!allow_non_constant)
3120 	{
3121 	  permerror (input_location, "overflow in constant expression");
3122 	  /* If we're being permissive (and are in an enforcing
3123 	     context), ignore the overflow.  */
3124 	  if (flag_permissive)
3125 	    return *non_constant_p;
3126 	}
3127       *overflow_p = true;
3128     }
3129   return *non_constant_p;
3130 }
3131 
3132 /* Check whether the shift operation with code CODE and type TYPE on LHS
3133    and RHS is undefined.  If it is, give an error with an explanation,
3134    and return true; return false otherwise.  */
3135 
3136 static bool
cxx_eval_check_shift_p(location_t loc,const constexpr_ctx * ctx,enum tree_code code,tree type,tree lhs,tree rhs)3137 cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
3138 			enum tree_code code, tree type, tree lhs, tree rhs)
3139 {
3140   if ((code != LSHIFT_EXPR && code != RSHIFT_EXPR)
3141       || TREE_CODE (lhs) != INTEGER_CST
3142       || TREE_CODE (rhs) != INTEGER_CST)
3143     return false;
3144 
3145   tree lhstype = TREE_TYPE (lhs);
3146   unsigned HOST_WIDE_INT uprec = TYPE_PRECISION (TREE_TYPE (lhs));
3147 
3148   /* [expr.shift] The behavior is undefined if the right operand
3149      is negative, or greater than or equal to the length in bits
3150      of the promoted left operand.  */
3151   if (tree_int_cst_sgn (rhs) == -1)
3152     {
3153       if (!ctx->quiet)
3154 	permerror (loc, "right operand of shift expression %q+E is negative",
3155 		   build2_loc (loc, code, type, lhs, rhs));
3156       return (!flag_permissive || ctx->quiet);
3157     }
3158   if (compare_tree_int (rhs, uprec) >= 0)
3159     {
3160       if (!ctx->quiet)
3161 	permerror (loc, "right operand of shift expression %q+E is greater "
3162 		   "than or equal to the precision %wu of the left operand",
3163 		   build2_loc (loc, code, type, lhs, rhs), uprec);
3164       return (!flag_permissive || ctx->quiet);
3165     }
3166 
3167   /* The value of E1 << E2 is E1 left-shifted E2 bit positions; [...]
3168      if E1 has a signed type and non-negative value, and E1x2^E2 is
3169      representable in the corresponding unsigned type of the result type,
3170      then that value, converted to the result type, is the resulting value;
3171      otherwise, the behavior is undefined.
3172      For C++20:
3173      The value of E1 << E2 is the unique value congruent to E1 x 2^E2 modulo
3174      2^N, where N is the range exponent of the type of the result.  */
3175   if (code == LSHIFT_EXPR
3176       && !TYPE_OVERFLOW_WRAPS (lhstype)
3177       && cxx_dialect >= cxx11
3178       && cxx_dialect < cxx20)
3179     {
3180       if (tree_int_cst_sgn (lhs) == -1)
3181 	{
3182 	  if (!ctx->quiet)
3183 	    permerror (loc,
3184 		       "left operand of shift expression %q+E is negative",
3185 		       build2_loc (loc, code, type, lhs, rhs));
3186 	  return (!flag_permissive || ctx->quiet);
3187 	}
3188       /* For signed x << y the following:
3189 	 (unsigned) x >> ((prec (lhs) - 1) - y)
3190 	 if > 1, is undefined.  The right-hand side of this formula
3191 	 is the highest bit of the LHS that can be set (starting from 0),
3192 	 so that the shift doesn't overflow.  We then right-shift the LHS
3193 	 to see whether any other bit is set making the original shift
3194 	 undefined -- the result is not representable in the corresponding
3195 	 unsigned type.  */
3196       tree t = build_int_cst (unsigned_type_node, uprec - 1);
3197       t = fold_build2 (MINUS_EXPR, unsigned_type_node, t, rhs);
3198       tree ulhs = fold_convert (unsigned_type_for (lhstype), lhs);
3199       t = fold_build2 (RSHIFT_EXPR, TREE_TYPE (ulhs), ulhs, t);
3200       if (tree_int_cst_lt (integer_one_node, t))
3201 	{
3202 	  if (!ctx->quiet)
3203 	    permerror (loc, "shift expression %q+E overflows",
3204 		       build2_loc (loc, code, type, lhs, rhs));
3205 	  return (!flag_permissive || ctx->quiet);
3206 	}
3207     }
3208   return false;
3209 }
3210 
3211 /* Subroutine of cxx_eval_constant_expression.
3212    Attempt to reduce the unary expression tree T to a compile time value.
3213    If successful, return the value.  Otherwise issue a diagnostic
3214    and return error_mark_node.  */
3215 
3216 static tree
cxx_eval_unary_expression(const constexpr_ctx * ctx,tree t,bool,bool * non_constant_p,bool * overflow_p)3217 cxx_eval_unary_expression (const constexpr_ctx *ctx, tree t,
3218 			   bool /*lval*/,
3219 			   bool *non_constant_p, bool *overflow_p)
3220 {
3221   tree r;
3222   tree orig_arg = TREE_OPERAND (t, 0);
3223   tree arg = cxx_eval_constant_expression (ctx, orig_arg, /*lval*/false,
3224 					   non_constant_p, overflow_p);
3225   VERIFY_CONSTANT (arg);
3226   location_t loc = EXPR_LOCATION (t);
3227   enum tree_code code = TREE_CODE (t);
3228   tree type = TREE_TYPE (t);
3229   r = fold_unary_loc (loc, code, type, arg);
3230   if (r == NULL_TREE)
3231     {
3232       if (arg == orig_arg)
3233 	r = t;
3234       else
3235 	r = build1_loc (loc, code, type, arg);
3236     }
3237   VERIFY_CONSTANT (r);
3238   return r;
3239 }
3240 
3241 /* Helper function for cxx_eval_binary_expression.  Try to optimize
3242    original POINTER_PLUS_EXPR T, LHS p+ RHS, return NULL_TREE if the
3243    generic folding should be used.  */
3244 
3245 static tree
cxx_fold_pointer_plus_expression(const constexpr_ctx * ctx,tree t,tree lhs,tree rhs,bool * non_constant_p,bool * overflow_p)3246 cxx_fold_pointer_plus_expression (const constexpr_ctx *ctx, tree t,
3247 				  tree lhs, tree rhs, bool *non_constant_p,
3248 				  bool *overflow_p)
3249 {
3250   STRIP_NOPS (lhs);
3251   if (TREE_CODE (lhs) != ADDR_EXPR)
3252     return NULL_TREE;
3253 
3254   lhs = TREE_OPERAND (lhs, 0);
3255 
3256   /* &A[i] p+ j => &A[i + j] */
3257   if (TREE_CODE (lhs) == ARRAY_REF
3258       && TREE_CODE (TREE_OPERAND (lhs, 1)) == INTEGER_CST
3259       && TREE_CODE (rhs) == INTEGER_CST
3260       && TYPE_SIZE_UNIT (TREE_TYPE (lhs))
3261       && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST)
3262     {
3263       tree orig_type = TREE_TYPE (t);
3264       location_t loc = EXPR_LOCATION (t);
3265       tree type = TREE_TYPE (lhs);
3266 
3267       t = fold_convert_loc (loc, ssizetype, TREE_OPERAND (lhs, 1));
3268       tree nelts = array_type_nelts_top (TREE_TYPE (TREE_OPERAND (lhs, 0)));
3269       nelts = cxx_eval_constant_expression (ctx, nelts, false, non_constant_p,
3270 					    overflow_p);
3271       if (*non_constant_p)
3272 	return NULL_TREE;
3273       /* Don't fold an out-of-bound access.  */
3274       if (!tree_int_cst_le (t, nelts))
3275 	return NULL_TREE;
3276       rhs = cp_fold_convert (ssizetype, rhs);
3277       /* Don't fold if rhs can't be divided exactly by TYPE_SIZE_UNIT.
3278 	 constexpr int A[1]; ... (char *)&A[0] + 1 */
3279       if (!integer_zerop (fold_build2_loc (loc, TRUNC_MOD_EXPR, sizetype,
3280 					   rhs, TYPE_SIZE_UNIT (type))))
3281 	return NULL_TREE;
3282       /* Make sure to treat the second operand of POINTER_PLUS_EXPR
3283 	 as signed.  */
3284       rhs = fold_build2_loc (loc, EXACT_DIV_EXPR, ssizetype, rhs,
3285 			     TYPE_SIZE_UNIT (type));
3286       t = size_binop_loc (loc, PLUS_EXPR, rhs, t);
3287       t = build4_loc (loc, ARRAY_REF, type, TREE_OPERAND (lhs, 0),
3288 		      t, NULL_TREE, NULL_TREE);
3289       t = cp_build_addr_expr (t, tf_warning_or_error);
3290       t = cp_fold_convert (orig_type, t);
3291       return cxx_eval_constant_expression (ctx, t, /*lval*/false,
3292 					   non_constant_p, overflow_p);
3293     }
3294 
3295   return NULL_TREE;
3296 }
3297 
3298 /* Try to fold expressions like
3299    (struct S *) (&a[0].D.2378 + 12)
3300    into
3301    &MEM <struct T> [(void *)&a + 12B]
3302    This is something normally done by gimple_fold_stmt_to_constant_1
3303    on GIMPLE, but is undesirable on GENERIC if we are e.g. going to
3304    dereference the address because some details are lost.
3305    For pointer comparisons we want such folding though so that
3306    match.pd address_compare optimization works.  */
3307 
3308 static tree
cxx_maybe_fold_addr_pointer_plus(tree t)3309 cxx_maybe_fold_addr_pointer_plus (tree t)
3310 {
3311   while (CONVERT_EXPR_P (t)
3312 	 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
3313     t = TREE_OPERAND (t, 0);
3314   if (TREE_CODE (t) != POINTER_PLUS_EXPR)
3315     return NULL_TREE;
3316   tree op0 = TREE_OPERAND (t, 0);
3317   tree op1 = TREE_OPERAND (t, 1);
3318   if (TREE_CODE (op1) != INTEGER_CST)
3319     return NULL_TREE;
3320   while (CONVERT_EXPR_P (op0)
3321 	 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (op0, 0))))
3322     op0 = TREE_OPERAND (op0, 0);
3323   if (TREE_CODE (op0) != ADDR_EXPR)
3324     return NULL_TREE;
3325   op1 = fold_convert (ptr_type_node, op1);
3326   tree r = fold_build2 (MEM_REF, TREE_TYPE (TREE_TYPE (op0)), op0, op1);
3327   return build1_loc (EXPR_LOCATION (t), ADDR_EXPR, TREE_TYPE (op0), r);
3328 }
3329 
3330 /* Subroutine of cxx_eval_constant_expression.
3331    Like cxx_eval_unary_expression, except for binary expressions.  */
3332 
3333 static tree
cxx_eval_binary_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)3334 cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t,
3335 			    bool lval,
3336 			    bool *non_constant_p, bool *overflow_p)
3337 {
3338   tree r = NULL_TREE;
3339   tree orig_lhs = TREE_OPERAND (t, 0);
3340   tree orig_rhs = TREE_OPERAND (t, 1);
3341   tree lhs, rhs;
3342   lhs = cxx_eval_constant_expression (ctx, orig_lhs, /*lval*/false,
3343 				      non_constant_p, overflow_p);
3344   /* Don't VERIFY_CONSTANT here, it's unnecessary and will break pointer
3345      subtraction.  */
3346   if (*non_constant_p)
3347     return t;
3348   rhs = cxx_eval_constant_expression (ctx, orig_rhs, /*lval*/false,
3349 				      non_constant_p, overflow_p);
3350   if (*non_constant_p)
3351     return t;
3352 
3353   location_t loc = EXPR_LOCATION (t);
3354   enum tree_code code = TREE_CODE (t);
3355   tree type = TREE_TYPE (t);
3356 
3357   if (code == EQ_EXPR || code == NE_EXPR)
3358     {
3359       bool is_code_eq = (code == EQ_EXPR);
3360 
3361       if (TREE_CODE (lhs) == PTRMEM_CST
3362 	  && TREE_CODE (rhs) == PTRMEM_CST)
3363 	{
3364 	  tree lmem = PTRMEM_CST_MEMBER (lhs);
3365 	  tree rmem = PTRMEM_CST_MEMBER (rhs);
3366 	  bool eq;
3367 	  if (TREE_CODE (lmem) == TREE_CODE (rmem)
3368 	      && TREE_CODE (lmem) == FIELD_DECL
3369 	      && TREE_CODE (DECL_CONTEXT (lmem)) == UNION_TYPE
3370 	      && same_type_p (DECL_CONTEXT (lmem),
3371 			      DECL_CONTEXT (rmem)))
3372 	    /* If both refer to (possibly different) members of the same union
3373 	       (12.3), they compare equal. */
3374 	    eq = true;
3375 	  else
3376 	    eq = cp_tree_equal (lhs, rhs);
3377 	  r = constant_boolean_node (eq == is_code_eq, type);
3378 	}
3379       else if ((TREE_CODE (lhs) == PTRMEM_CST
3380 		|| TREE_CODE (rhs) == PTRMEM_CST)
3381 	       && (null_member_pointer_value_p (lhs)
3382 		   || null_member_pointer_value_p (rhs)))
3383 	r = constant_boolean_node (!is_code_eq, type);
3384       else if (TREE_CODE (lhs) == PTRMEM_CST)
3385 	lhs = cplus_expand_constant (lhs);
3386       else if (TREE_CODE (rhs) == PTRMEM_CST)
3387 	rhs = cplus_expand_constant (rhs);
3388     }
3389   if (r == NULL_TREE
3390       && TREE_CODE_CLASS (code) == tcc_comparison
3391       && POINTER_TYPE_P (TREE_TYPE (lhs)))
3392     {
3393       if (tree lhso = cxx_maybe_fold_addr_pointer_plus (lhs))
3394 	lhs = fold_convert (TREE_TYPE (lhs), lhso);
3395       if (tree rhso = cxx_maybe_fold_addr_pointer_plus (rhs))
3396 	rhs = fold_convert (TREE_TYPE (rhs), rhso);
3397     }
3398   if (code == POINTER_PLUS_EXPR && !*non_constant_p
3399       && integer_zerop (lhs) && !integer_zerop (rhs))
3400     {
3401       if (!ctx->quiet)
3402 	error ("arithmetic involving a null pointer in %qE", lhs);
3403       *non_constant_p = true;
3404       return t;
3405     }
3406   else if (code == POINTER_PLUS_EXPR)
3407     r = cxx_fold_pointer_plus_expression (ctx, t, lhs, rhs, non_constant_p,
3408 					  overflow_p);
3409   else if (code == SPACESHIP_EXPR)
3410     {
3411       r = genericize_spaceship (loc, type, lhs, rhs);
3412       return cxx_eval_constant_expression (ctx, r, lval, non_constant_p,
3413 					   overflow_p);
3414     }
3415 
3416   if (r == NULL_TREE)
3417     {
3418       if (ctx->manifestly_const_eval
3419 	  && (flag_constexpr_fp_except
3420 	      || TREE_CODE (type) != REAL_TYPE))
3421 	{
3422 	  auto ofcc = make_temp_override (folding_cxx_constexpr, true);
3423 	  r = fold_binary_initializer_loc (loc, code, type, lhs, rhs);
3424 	}
3425       else
3426 	r = fold_binary_loc (loc, code, type, lhs, rhs);
3427     }
3428 
3429   if (r == NULL_TREE
3430       && (code == LSHIFT_EXPR || code == RSHIFT_EXPR)
3431       && TREE_CODE (lhs) == INTEGER_CST
3432       && TREE_CODE (rhs) == INTEGER_CST
3433       && wi::neg_p (wi::to_wide (rhs)))
3434     {
3435       /* For diagnostics and -fpermissive emulate previous behavior of
3436 	 handling shifts by negative amount.  */
3437       tree nrhs = const_unop (NEGATE_EXPR, TREE_TYPE (rhs), rhs);
3438       if (nrhs)
3439 	r = fold_binary_loc (loc,
3440 			     code == LSHIFT_EXPR ? RSHIFT_EXPR : LSHIFT_EXPR,
3441 			     type, lhs, nrhs);
3442     }
3443 
3444   if (r == NULL_TREE)
3445     {
3446       if (lhs == orig_lhs && rhs == orig_rhs)
3447 	r = t;
3448       else
3449 	r = build2_loc (loc, code, type, lhs, rhs);
3450     }
3451   else if (cxx_eval_check_shift_p (loc, ctx, code, type, lhs, rhs))
3452     *non_constant_p = true;
3453   /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
3454      a local array in a constexpr function.  */
3455   bool ptr = INDIRECT_TYPE_P (TREE_TYPE (lhs));
3456   if (!ptr)
3457     VERIFY_CONSTANT (r);
3458   return r;
3459 }
3460 
3461 /* Subroutine of cxx_eval_constant_expression.
3462    Attempt to evaluate condition expressions.  Dead branches are not
3463    looked into.  */
3464 
3465 static tree
cxx_eval_conditional_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p,tree * jump_target)3466 cxx_eval_conditional_expression (const constexpr_ctx *ctx, tree t,
3467 				 bool lval,
3468 				 bool *non_constant_p, bool *overflow_p,
3469 				 tree *jump_target)
3470 {
3471   tree val = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
3472 					   /*lval*/false,
3473 					   non_constant_p, overflow_p);
3474   VERIFY_CONSTANT (val);
3475   if (TREE_CODE (t) == IF_STMT && IF_STMT_CONSTEVAL_P (t))
3476     {
3477       /* Evaluate the condition as if it was
3478 	 if (__builtin_is_constant_evaluated ()), i.e. defer it if not
3479 	 ctx->manifestly_const_eval (as sometimes we try to constant evaluate
3480 	 without manifestly_const_eval even expressions or parts thereof which
3481 	 will later be manifestly const_eval evaluated), otherwise fold it to
3482 	 true.  */
3483       if (ctx->manifestly_const_eval)
3484 	val = boolean_true_node;
3485       else
3486 	{
3487 	  *non_constant_p = true;
3488 	  return t;
3489 	}
3490     }
3491   /* Don't VERIFY_CONSTANT the other operands.  */
3492   if (integer_zerop (val))
3493     val = TREE_OPERAND (t, 2);
3494   else
3495     val = TREE_OPERAND (t, 1);
3496   if (TREE_CODE (t) == IF_STMT && !val)
3497     val = void_node;
3498   return cxx_eval_constant_expression (ctx, val, lval, non_constant_p,
3499 				       overflow_p, jump_target);
3500 }
3501 
3502 /* Subroutine of cxx_eval_constant_expression.
3503    Attempt to evaluate vector condition expressions.  Unlike
3504    cxx_eval_conditional_expression, VEC_COND_EXPR acts like a normal
3505    ternary arithmetics operation, where all 3 arguments have to be
3506    evaluated as constants and then folding computes the result from
3507    them.  */
3508 
3509 static tree
cxx_eval_vector_conditional_expression(const constexpr_ctx * ctx,tree t,bool * non_constant_p,bool * overflow_p)3510 cxx_eval_vector_conditional_expression (const constexpr_ctx *ctx, tree t,
3511 					bool *non_constant_p, bool *overflow_p)
3512 {
3513   tree arg1 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
3514 					    /*lval*/false,
3515 					    non_constant_p, overflow_p);
3516   VERIFY_CONSTANT (arg1);
3517   tree arg2 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
3518 					    /*lval*/false,
3519 					    non_constant_p, overflow_p);
3520   VERIFY_CONSTANT (arg2);
3521   tree arg3 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 2),
3522 					    /*lval*/false,
3523 					    non_constant_p, overflow_p);
3524   VERIFY_CONSTANT (arg3);
3525   location_t loc = EXPR_LOCATION (t);
3526   tree type = TREE_TYPE (t);
3527   tree r = fold_ternary_loc (loc, VEC_COND_EXPR, type, arg1, arg2, arg3);
3528   if (r == NULL_TREE)
3529     {
3530       if (arg1 == TREE_OPERAND (t, 0)
3531 	  && arg2 == TREE_OPERAND (t, 1)
3532 	  && arg3 == TREE_OPERAND (t, 2))
3533 	r = t;
3534       else
3535 	r = build3_loc (loc, VEC_COND_EXPR, type, arg1, arg2, arg3);
3536     }
3537   VERIFY_CONSTANT (r);
3538   return r;
3539 }
3540 
3541 /* Returns less than, equal to, or greater than zero if KEY is found to be
3542    less than, to match, or to be greater than the constructor_elt's INDEX.  */
3543 
3544 static int
array_index_cmp(tree key,tree index)3545 array_index_cmp (tree key, tree index)
3546 {
3547   gcc_assert (TREE_CODE (key) == INTEGER_CST);
3548 
3549   switch (TREE_CODE (index))
3550     {
3551     case INTEGER_CST:
3552       return tree_int_cst_compare (key, index);
3553     case RANGE_EXPR:
3554       {
3555 	tree lo = TREE_OPERAND (index, 0);
3556 	tree hi = TREE_OPERAND (index, 1);
3557 	if (tree_int_cst_lt (key, lo))
3558 	  return -1;
3559 	else if (tree_int_cst_lt (hi, key))
3560 	  return 1;
3561 	else
3562 	  return 0;
3563       }
3564     default:
3565       gcc_unreachable ();
3566     }
3567 }
3568 
3569 /* Returns the index of the constructor_elt of ARY which matches DINDEX, or -1
3570    if none.  If INSERT is true, insert a matching element rather than fail.  */
3571 
3572 static HOST_WIDE_INT
find_array_ctor_elt(tree ary,tree dindex,bool insert)3573 find_array_ctor_elt (tree ary, tree dindex, bool insert)
3574 {
3575   if (tree_int_cst_sgn (dindex) < 0)
3576     return -1;
3577 
3578   unsigned HOST_WIDE_INT i = tree_to_uhwi (dindex);
3579   vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (ary);
3580   unsigned HOST_WIDE_INT len = vec_safe_length (elts);
3581 
3582   unsigned HOST_WIDE_INT end = len;
3583   unsigned HOST_WIDE_INT begin = 0;
3584 
3585   /* If the last element of the CONSTRUCTOR has its own index, we can assume
3586      that the same is true of the other elements and index directly.  */
3587   if (end > 0)
3588     {
3589       tree cindex = (*elts)[end - 1].index;
3590       if (cindex == NULL_TREE)
3591 	{
3592 	  /* Verify that if the last index is missing, all indexes
3593 	     are missing.  */
3594 	  if (flag_checking)
3595 	    for (unsigned int j = 0; j < len - 1; ++j)
3596 	      gcc_assert ((*elts)[j].index == NULL_TREE);
3597 	  if (i < end)
3598 	    return i;
3599 	  else
3600 	    {
3601 	      begin = end;
3602 	      if (i == end)
3603 		/* If the element is to be added right at the end,
3604 		   make sure it is added with cleared index too.  */
3605 		dindex = NULL_TREE;
3606 	      else if (insert)
3607 		/* Otherwise, in order not to break the assumption
3608 		   that CONSTRUCTOR either has all indexes or none,
3609 		   we need to add indexes to all elements.  */
3610 		for (unsigned int j = 0; j < len; ++j)
3611 		  (*elts)[j].index = build_int_cst (TREE_TYPE (dindex), j);
3612 	    }
3613 	}
3614       else if (TREE_CODE (cindex) == INTEGER_CST
3615 	       && compare_tree_int (cindex, end - 1) == 0)
3616 	{
3617 	  if (i < end)
3618 	    return i;
3619 	  else
3620 	    begin = end;
3621 	}
3622     }
3623 
3624   /* Otherwise, find a matching index by means of a binary search.  */
3625   while (begin != end)
3626     {
3627       unsigned HOST_WIDE_INT middle = (begin + end) / 2;
3628       constructor_elt &elt = (*elts)[middle];
3629       tree idx = elt.index;
3630 
3631       int cmp = array_index_cmp (dindex, idx);
3632       if (cmp < 0)
3633 	end = middle;
3634       else if (cmp > 0)
3635 	begin = middle + 1;
3636       else
3637 	{
3638 	  if (insert && TREE_CODE (idx) == RANGE_EXPR)
3639 	    {
3640 	      /* We need to split the range.  */
3641 	      constructor_elt e;
3642 	      tree lo = TREE_OPERAND (idx, 0);
3643 	      tree hi = TREE_OPERAND (idx, 1);
3644 	      tree value = elt.value;
3645 	      dindex = fold_convert (sizetype, dindex);
3646 	      if (tree_int_cst_lt (lo, dindex))
3647 		{
3648 		  /* There are still some lower elts; shorten the range.  */
3649 		  tree new_hi = int_const_binop (MINUS_EXPR, dindex,
3650 						 size_one_node);
3651 		  if (tree_int_cst_equal (lo, new_hi))
3652 		    /* Only one element left, no longer a range.  */
3653 		    elt.index = lo;
3654 		  else
3655 		    TREE_OPERAND (idx, 1) = new_hi;
3656 		  /* Append the element we want to insert.  */
3657 		  ++middle;
3658 		  e.index = dindex;
3659 		  e.value = unshare_constructor (value);
3660 		  vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle, e);
3661 		}
3662 	      else
3663 		/* No lower elts, the range elt is now ours.  */
3664 		elt.index = dindex;
3665 
3666 	      if (tree_int_cst_lt (dindex, hi))
3667 		{
3668 		  /* There are still some higher elts; append a range.  */
3669 		  tree new_lo = int_const_binop (PLUS_EXPR, dindex,
3670 						 size_one_node);
3671 		  if (tree_int_cst_equal (new_lo, hi))
3672 		    e.index = hi;
3673 		  else
3674 		    e.index = build2 (RANGE_EXPR, sizetype, new_lo, hi);
3675 		  e.value = unshare_constructor (value);
3676 		  vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle + 1, e);
3677 		}
3678 	    }
3679 	  return middle;
3680 	}
3681     }
3682 
3683   if (insert)
3684     {
3685       constructor_elt e = { dindex, NULL_TREE };
3686       vec_safe_insert (CONSTRUCTOR_ELTS (ary), end, e);
3687       return end;
3688     }
3689 
3690   return -1;
3691 }
3692 
3693 /* Return a pointer to the constructor_elt of CTOR which matches INDEX.  If no
3694    matching constructor_elt exists, then add one to CTOR.
3695 
3696    As an optimization, if POS_HINT is non-negative then it is used as a guess
3697    for the (integer) index of the matching constructor_elt within CTOR.  */
3698 
3699 static constructor_elt *
get_or_insert_ctor_field(tree ctor,tree index,int pos_hint=-1)3700 get_or_insert_ctor_field (tree ctor, tree index, int pos_hint = -1)
3701 {
3702   /* Check the hint first.  */
3703   if (pos_hint >= 0 && (unsigned)pos_hint < CONSTRUCTOR_NELTS (ctor)
3704       && CONSTRUCTOR_ELT (ctor, pos_hint)->index == index)
3705     return CONSTRUCTOR_ELT (ctor, pos_hint);
3706 
3707   tree type = TREE_TYPE (ctor);
3708   if (TREE_CODE (type) == VECTOR_TYPE && index == NULL_TREE)
3709     {
3710       CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (ctor), index, NULL_TREE);
3711       return &CONSTRUCTOR_ELTS (ctor)->last();
3712     }
3713   else if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == VECTOR_TYPE)
3714     {
3715       if (TREE_CODE (index) == RANGE_EXPR)
3716 	{
3717 	  /* Support for RANGE_EXPR index lookups is currently limited to
3718 	     accessing an existing element via POS_HINT, or appending a new
3719 	     element to the end of CTOR.  ??? Support for other access
3720 	     patterns may also be needed.  */
3721 	  vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (ctor);
3722 	  if (vec_safe_length (elts))
3723 	    {
3724 	      tree lo = TREE_OPERAND (index, 0);
3725 	      gcc_assert (array_index_cmp (elts->last().index, lo) < 0);
3726 	    }
3727 	  CONSTRUCTOR_APPEND_ELT (elts, index, NULL_TREE);
3728 	  return &elts->last();
3729 	}
3730 
3731       HOST_WIDE_INT i = find_array_ctor_elt (ctor, index, /*insert*/true);
3732       gcc_assert (i >= 0);
3733       constructor_elt *cep = CONSTRUCTOR_ELT (ctor, i);
3734       gcc_assert (cep->index == NULL_TREE
3735 		  || TREE_CODE (cep->index) != RANGE_EXPR);
3736       return cep;
3737     }
3738   else
3739     {
3740       gcc_assert (TREE_CODE (index) == FIELD_DECL
3741 		  && (same_type_ignoring_top_level_qualifiers_p
3742 		      (DECL_CONTEXT (index), TREE_TYPE (ctor))));
3743 
3744       /* We must keep the CONSTRUCTOR's ELTS in FIELD order.
3745 	 Usually we meet initializers in that order, but it is
3746 	 possible for base types to be placed not in program
3747 	 order.  */
3748       tree fields = TYPE_FIELDS (DECL_CONTEXT (index));
3749       unsigned HOST_WIDE_INT idx = 0;
3750       constructor_elt *cep = NULL;
3751 
3752       /* Check if we're changing the active member of a union.  */
3753       if (TREE_CODE (type) == UNION_TYPE && CONSTRUCTOR_NELTS (ctor)
3754 	  && CONSTRUCTOR_ELT (ctor, 0)->index != index)
3755 	vec_safe_truncate (CONSTRUCTOR_ELTS (ctor), 0);
3756       /* If the bit offset of INDEX is larger than that of the last
3757 	 constructor_elt, then we can just immediately append a new
3758 	 constructor_elt to the end of CTOR.  */
3759       else if (CONSTRUCTOR_NELTS (ctor)
3760 	       && tree_int_cst_compare (bit_position (index),
3761 					bit_position (CONSTRUCTOR_ELTS (ctor)
3762 						      ->last().index)) > 0)
3763 	{
3764 	  idx = CONSTRUCTOR_NELTS (ctor);
3765 	  goto insert;
3766 	}
3767 
3768       /* Otherwise, we need to iterate over CTOR to find or insert INDEX
3769 	 appropriately.  */
3770 
3771       for (; vec_safe_iterate (CONSTRUCTOR_ELTS (ctor), idx, &cep);
3772 	   idx++, fields = DECL_CHAIN (fields))
3773 	{
3774 	  if (index == cep->index)
3775 	    goto found;
3776 
3777 	  /* The field we're initializing must be on the field
3778 	     list.  Look to see if it is present before the
3779 	     field the current ELT initializes.  */
3780 	  for (; fields != cep->index; fields = DECL_CHAIN (fields))
3781 	    if (index == fields)
3782 	      goto insert;
3783 	}
3784       /* We fell off the end of the CONSTRUCTOR, so insert a new
3785 	 entry at the end.  */
3786 
3787     insert:
3788       {
3789 	constructor_elt ce = { index, NULL_TREE };
3790 
3791 	vec_safe_insert (CONSTRUCTOR_ELTS (ctor), idx, ce);
3792 	cep = CONSTRUCTOR_ELT (ctor, idx);
3793       }
3794     found:;
3795 
3796       return cep;
3797     }
3798 }
3799 
3800 /* Under the control of CTX, issue a detailed diagnostic for
3801    an out-of-bounds subscript INDEX into the expression ARRAY.  */
3802 
3803 static void
diag_array_subscript(location_t loc,const constexpr_ctx * ctx,tree array,tree index)3804 diag_array_subscript (location_t loc, const constexpr_ctx *ctx, tree array, tree index)
3805 {
3806   if (!ctx->quiet)
3807     {
3808       tree arraytype = TREE_TYPE (array);
3809 
3810       /* Convert the unsigned array subscript to a signed integer to avoid
3811 	 printing huge numbers for small negative values.  */
3812       tree sidx = fold_convert (ssizetype, index);
3813       STRIP_ANY_LOCATION_WRAPPER (array);
3814       if (DECL_P (array))
3815 	{
3816 	  if (TYPE_DOMAIN (arraytype))
3817 	    error_at (loc, "array subscript value %qE is outside the bounds "
3818 		      "of array %qD of type %qT", sidx, array, arraytype);
3819 	  else
3820 	    error_at (loc, "nonzero array subscript %qE is used with array %qD of "
3821 		      "type %qT with unknown bounds", sidx, array, arraytype);
3822 	  inform (DECL_SOURCE_LOCATION (array), "declared here");
3823 	}
3824       else if (TYPE_DOMAIN (arraytype))
3825 	error_at (loc, "array subscript value %qE is outside the bounds "
3826 		  "of array type %qT", sidx, arraytype);
3827       else
3828 	error_at (loc, "nonzero array subscript %qE is used with array of type %qT "
3829 		  "with unknown bounds", sidx, arraytype);
3830     }
3831 }
3832 
3833 /* Return the number of elements for TYPE (which is an ARRAY_TYPE or
3834    a VECTOR_TYPE).  */
3835 
3836 static tree
get_array_or_vector_nelts(const constexpr_ctx * ctx,tree type,bool * non_constant_p,bool * overflow_p)3837 get_array_or_vector_nelts (const constexpr_ctx *ctx, tree type,
3838 			   bool *non_constant_p, bool *overflow_p)
3839 {
3840   tree nelts;
3841   if (TREE_CODE (type) == ARRAY_TYPE)
3842     {
3843       if (TYPE_DOMAIN (type))
3844 	nelts = array_type_nelts_top (type);
3845       else
3846 	nelts = size_zero_node;
3847     }
3848   else if (VECTOR_TYPE_P (type))
3849     nelts = size_int (TYPE_VECTOR_SUBPARTS (type));
3850   else
3851     gcc_unreachable ();
3852 
3853   /* For VLAs, the number of elements won't be an integer constant.  */
3854   nelts = cxx_eval_constant_expression (ctx, nelts, false,
3855 					non_constant_p, overflow_p);
3856   return nelts;
3857 }
3858 
3859 /* Extract element INDEX consisting of CHARS_PER_ELT chars from
3860    STRING_CST STRING.  */
3861 
3862 static tree
extract_string_elt(tree string,unsigned chars_per_elt,unsigned index)3863 extract_string_elt (tree string, unsigned chars_per_elt, unsigned index)
3864 {
3865   tree type = cv_unqualified (TREE_TYPE (TREE_TYPE (string)));
3866   tree r;
3867 
3868   if (chars_per_elt == 1)
3869     r = build_int_cst (type, TREE_STRING_POINTER (string)[index]);
3870   else
3871     {
3872       const unsigned char *ptr
3873 	= ((const unsigned char *)TREE_STRING_POINTER (string)
3874 	   + index * chars_per_elt);
3875       r = native_interpret_expr (type, ptr, chars_per_elt);
3876     }
3877   return r;
3878 }
3879 
3880 /* Subroutine of cxx_eval_array_reference.  T is an ARRAY_REF; evaluate the
3881    subscript, diagnose any problems with it, and return the result.  */
3882 
3883 static tree
eval_and_check_array_index(const constexpr_ctx * ctx,tree t,bool allow_one_past,bool * non_constant_p,bool * overflow_p)3884 eval_and_check_array_index (const constexpr_ctx *ctx,
3885 			    tree t, bool allow_one_past,
3886 			    bool *non_constant_p, bool *overflow_p)
3887 {
3888   location_t loc = cp_expr_loc_or_input_loc (t);
3889   tree ary = TREE_OPERAND (t, 0);
3890   t = TREE_OPERAND (t, 1);
3891   tree index = cxx_eval_constant_expression (ctx, t, false,
3892 					     non_constant_p, overflow_p);
3893   VERIFY_CONSTANT (index);
3894 
3895   if (!tree_fits_shwi_p (index)
3896       || tree_int_cst_sgn (index) < 0)
3897     {
3898       diag_array_subscript (loc, ctx, ary, index);
3899       *non_constant_p = true;
3900       return t;
3901     }
3902 
3903   tree nelts = get_array_or_vector_nelts (ctx, TREE_TYPE (ary), non_constant_p,
3904 					  overflow_p);
3905   VERIFY_CONSTANT (nelts);
3906   if (allow_one_past
3907       ? !tree_int_cst_le (index, nelts)
3908       : !tree_int_cst_lt (index, nelts))
3909     {
3910       diag_array_subscript (loc, ctx, ary, index);
3911       *non_constant_p = true;
3912       return t;
3913     }
3914 
3915   return index;
3916 }
3917 
3918 /* Subroutine of cxx_eval_constant_expression.
3919    Attempt to reduce a reference to an array slot.  */
3920 
3921 static tree
cxx_eval_array_reference(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)3922 cxx_eval_array_reference (const constexpr_ctx *ctx, tree t,
3923 			  bool lval,
3924 			  bool *non_constant_p, bool *overflow_p)
3925 {
3926   tree oldary = TREE_OPERAND (t, 0);
3927   tree ary = cxx_eval_constant_expression (ctx, oldary,
3928 					   lval,
3929 					   non_constant_p, overflow_p);
3930   if (*non_constant_p)
3931     return t;
3932   if (!lval
3933       && TREE_CODE (ary) == VIEW_CONVERT_EXPR
3934       && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (ary, 0)))
3935       && (TYPE_MAIN_VARIANT (TREE_TYPE (t))
3936 	  == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (TREE_OPERAND (ary, 0))))))
3937     ary = TREE_OPERAND (ary, 0);
3938 
3939   tree oldidx = TREE_OPERAND (t, 1);
3940   tree index = eval_and_check_array_index (ctx, t, lval,
3941 					   non_constant_p, overflow_p);
3942   if (*non_constant_p)
3943     return t;
3944 
3945   if (lval && ary == oldary && index == oldidx)
3946     return t;
3947   else if (lval)
3948     return build4 (ARRAY_REF, TREE_TYPE (t), ary, index, NULL, NULL);
3949 
3950   unsigned len = 0, elem_nchars = 1;
3951   tree elem_type = TREE_TYPE (TREE_TYPE (ary));
3952   if (TREE_CODE (ary) == CONSTRUCTOR)
3953     len = CONSTRUCTOR_NELTS (ary);
3954   else if (TREE_CODE (ary) == STRING_CST)
3955     {
3956       elem_nchars = (TYPE_PRECISION (elem_type)
3957 		     / TYPE_PRECISION (char_type_node));
3958       len = (unsigned) TREE_STRING_LENGTH (ary) / elem_nchars;
3959     }
3960   else if (TREE_CODE (ary) == VECTOR_CST)
3961     /* We don't create variable-length VECTOR_CSTs.  */
3962     len = VECTOR_CST_NELTS (ary).to_constant ();
3963   else
3964     {
3965       /* We can't do anything with other tree codes, so use
3966 	 VERIFY_CONSTANT to complain and fail.  */
3967       VERIFY_CONSTANT (ary);
3968       gcc_unreachable ();
3969     }
3970 
3971   bool found;
3972   HOST_WIDE_INT i = 0;
3973   if (TREE_CODE (ary) == CONSTRUCTOR)
3974     {
3975       HOST_WIDE_INT ix = find_array_ctor_elt (ary, index);
3976       found = (ix >= 0);
3977       if (found)
3978 	i = ix;
3979     }
3980   else
3981     {
3982       i = tree_to_shwi (index);
3983       found = (i < len);
3984     }
3985 
3986   if (found)
3987     {
3988       tree r;
3989       if (TREE_CODE (ary) == CONSTRUCTOR)
3990 	r = (*CONSTRUCTOR_ELTS (ary))[i].value;
3991       else if (TREE_CODE (ary) == VECTOR_CST)
3992 	r = VECTOR_CST_ELT (ary, i);
3993       else
3994 	r = extract_string_elt (ary, elem_nchars, i);
3995 
3996       if (r)
3997 	/* Don't VERIFY_CONSTANT here.  */
3998 	return r;
3999 
4000       /* Otherwise the element doesn't have a value yet.  */
4001     }
4002 
4003   /* Not found.  */
4004 
4005   if (TREE_CODE (ary) == CONSTRUCTOR
4006       && CONSTRUCTOR_NO_CLEARING (ary))
4007     {
4008       /* 'ary' is part of the aggregate initializer we're currently
4009 	 building; if there's no initializer for this element yet,
4010 	 that's an error.  */
4011       if (!ctx->quiet)
4012 	error ("accessing uninitialized array element");
4013       *non_constant_p = true;
4014       return t;
4015     }
4016 
4017   /* If it's within the array bounds but doesn't have an explicit
4018      initializer, it's initialized from {}.  But use build_value_init
4019      directly for non-aggregates to avoid creating a garbage CONSTRUCTOR.  */
4020   tree val;
4021   constexpr_ctx new_ctx;
4022   if (is_really_empty_class (elem_type, /*ignore_vptr*/false))
4023     return build_constructor (elem_type, NULL);
4024   else if (CP_AGGREGATE_TYPE_P (elem_type))
4025     {
4026       tree empty_ctor = build_constructor (init_list_type_node, NULL);
4027       val = digest_init (elem_type, empty_ctor, tf_warning_or_error);
4028     }
4029   else
4030     val = build_value_init (elem_type, tf_warning_or_error);
4031 
4032   if (!SCALAR_TYPE_P (elem_type))
4033     {
4034       new_ctx = *ctx;
4035       if (ctx->object)
4036 	/* If there was no object, don't add one: it could confuse us
4037 	   into thinking we're modifying a const object.  */
4038 	new_ctx.object = t;
4039       new_ctx.ctor = build_constructor (elem_type, NULL);
4040       ctx = &new_ctx;
4041     }
4042   t = cxx_eval_constant_expression (ctx, val, lval, non_constant_p,
4043 				    overflow_p);
4044   if (!SCALAR_TYPE_P (elem_type) && t != ctx->ctor)
4045     free_constructor (ctx->ctor);
4046   return t;
4047 }
4048 
4049 /* Subroutine of cxx_eval_constant_expression.
4050    Attempt to reduce a field access of a value of class type.  */
4051 
4052 static tree
cxx_eval_component_reference(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)4053 cxx_eval_component_reference (const constexpr_ctx *ctx, tree t,
4054 			      bool lval,
4055 			      bool *non_constant_p, bool *overflow_p)
4056 {
4057   unsigned HOST_WIDE_INT i;
4058   tree field;
4059   tree value;
4060   tree part = TREE_OPERAND (t, 1);
4061   tree orig_whole = TREE_OPERAND (t, 0);
4062   tree whole = cxx_eval_constant_expression (ctx, orig_whole,
4063 					     lval,
4064 					     non_constant_p, overflow_p);
4065   if (INDIRECT_REF_P (whole)
4066       && integer_zerop (TREE_OPERAND (whole, 0)))
4067     {
4068       if (!ctx->quiet)
4069 	error ("dereferencing a null pointer in %qE", orig_whole);
4070       *non_constant_p = true;
4071       return t;
4072     }
4073 
4074   if (TREE_CODE (whole) == PTRMEM_CST)
4075     whole = cplus_expand_constant (whole);
4076   if (whole == orig_whole)
4077     return t;
4078   if (lval)
4079     return fold_build3 (COMPONENT_REF, TREE_TYPE (t),
4080 			whole, part, NULL_TREE);
4081   /* Don't VERIFY_CONSTANT here; we only want to check that we got a
4082      CONSTRUCTOR.  */
4083   if (!*non_constant_p && TREE_CODE (whole) != CONSTRUCTOR)
4084     {
4085       if (!ctx->quiet)
4086 	error ("%qE is not a constant expression", orig_whole);
4087       *non_constant_p = true;
4088     }
4089   if (DECL_MUTABLE_P (part))
4090     {
4091       if (!ctx->quiet)
4092 	error ("mutable %qD is not usable in a constant expression", part);
4093       *non_constant_p = true;
4094     }
4095   if (*non_constant_p)
4096     return t;
4097   bool pmf = TYPE_PTRMEMFUNC_P (TREE_TYPE (whole));
4098   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
4099     {
4100       /* Use name match for PMF fields, as a variant will have a
4101 	 different FIELD_DECL with a different type.  */
4102       if (pmf ? DECL_NAME (field) == DECL_NAME (part)
4103 	  : field == part)
4104 	{
4105 	  if (value)
4106 	    {
4107 	      STRIP_ANY_LOCATION_WRAPPER (value);
4108 	      return value;
4109 	    }
4110 	  else
4111 	    /* We're in the middle of initializing it.  */
4112 	    break;
4113 	}
4114     }
4115   if (TREE_CODE (TREE_TYPE (whole)) == UNION_TYPE
4116       && CONSTRUCTOR_NELTS (whole) > 0)
4117     {
4118       /* DR 1188 says we don't have to deal with this.  */
4119       if (!ctx->quiet)
4120 	{
4121 	  constructor_elt *cep = CONSTRUCTOR_ELT (whole, 0);
4122 	  if (cep->value == NULL_TREE)
4123 	    error ("accessing uninitialized member %qD", part);
4124 	  else
4125 	    error ("accessing %qD member instead of initialized %qD member in "
4126 		   "constant expression", part, cep->index);
4127 	}
4128       *non_constant_p = true;
4129       return t;
4130     }
4131 
4132   /* We only create a CONSTRUCTOR for a subobject when we modify it, so empty
4133      classes never get represented; throw together a value now.  */
4134   if (is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
4135     return build_constructor (TREE_TYPE (t), NULL);
4136 
4137   gcc_assert (DECL_CONTEXT (part) == TYPE_MAIN_VARIANT (TREE_TYPE (whole)));
4138 
4139   if (CONSTRUCTOR_NO_CLEARING (whole))
4140     {
4141       /* 'whole' is part of the aggregate initializer we're currently
4142 	 building; if there's no initializer for this member yet, that's an
4143 	 error.  */
4144       if (!ctx->quiet)
4145 	error ("accessing uninitialized member %qD", part);
4146       *non_constant_p = true;
4147       return t;
4148     }
4149 
4150   /* If there's no explicit init for this field, it's value-initialized.  */
4151   value = build_value_init (TREE_TYPE (t), tf_warning_or_error);
4152   return cxx_eval_constant_expression (ctx, value,
4153 				       lval,
4154 				       non_constant_p, overflow_p);
4155 }
4156 
4157 /* Subroutine of cxx_eval_constant_expression.
4158    Attempt to reduce a field access of a value of class type that is
4159    expressed as a BIT_FIELD_REF.  */
4160 
4161 static tree
cxx_eval_bit_field_ref(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)4162 cxx_eval_bit_field_ref (const constexpr_ctx *ctx, tree t,
4163 			bool lval,
4164 			bool *non_constant_p, bool *overflow_p)
4165 {
4166   tree orig_whole = TREE_OPERAND (t, 0);
4167   tree retval, fldval, utype, mask;
4168   bool fld_seen = false;
4169   HOST_WIDE_INT istart, isize;
4170   tree whole = cxx_eval_constant_expression (ctx, orig_whole,
4171 					     lval,
4172 					     non_constant_p, overflow_p);
4173   tree start, field, value;
4174   unsigned HOST_WIDE_INT i;
4175 
4176   if (whole == orig_whole)
4177     return t;
4178   /* Don't VERIFY_CONSTANT here; we only want to check that we got a
4179      CONSTRUCTOR.  */
4180   if (!*non_constant_p
4181       && TREE_CODE (whole) != VECTOR_CST
4182       && TREE_CODE (whole) != CONSTRUCTOR)
4183     {
4184       if (!ctx->quiet)
4185 	error ("%qE is not a constant expression", orig_whole);
4186       *non_constant_p = true;
4187     }
4188   if (*non_constant_p)
4189     return t;
4190 
4191   if (TREE_CODE (whole) == VECTOR_CST || !INTEGRAL_TYPE_P (TREE_TYPE (t)))
4192     {
4193       if (tree r = fold_ternary (BIT_FIELD_REF, TREE_TYPE (t), whole,
4194 				 TREE_OPERAND (t, 1), TREE_OPERAND (t, 2)))
4195 	return r;
4196       if (!ctx->quiet)
4197 	error ("%qE is not a constant expression", orig_whole);
4198       *non_constant_p = true;
4199       return t;
4200     }
4201 
4202   start = TREE_OPERAND (t, 2);
4203   istart = tree_to_shwi (start);
4204   isize = tree_to_shwi (TREE_OPERAND (t, 1));
4205   utype = TREE_TYPE (t);
4206   if (!TYPE_UNSIGNED (utype))
4207     utype = build_nonstandard_integer_type (TYPE_PRECISION (utype), 1);
4208   retval = build_int_cst (utype, 0);
4209   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
4210     {
4211       tree bitpos = bit_position (field);
4212       STRIP_ANY_LOCATION_WRAPPER (value);
4213       if (bitpos == start && DECL_SIZE (field) == TREE_OPERAND (t, 1))
4214 	return value;
4215       if (TREE_CODE (TREE_TYPE (field)) == INTEGER_TYPE
4216 	  && TREE_CODE (value) == INTEGER_CST
4217 	  && tree_fits_shwi_p (bitpos)
4218 	  && tree_fits_shwi_p (DECL_SIZE (field)))
4219 	{
4220 	  HOST_WIDE_INT bit = tree_to_shwi (bitpos);
4221 	  HOST_WIDE_INT sz = tree_to_shwi (DECL_SIZE (field));
4222 	  HOST_WIDE_INT shift;
4223 	  if (bit >= istart && bit + sz <= istart + isize)
4224 	    {
4225 	      fldval = fold_convert (utype, value);
4226 	      mask = build_int_cst_type (utype, -1);
4227 	      mask = fold_build2 (LSHIFT_EXPR, utype, mask,
4228 				  size_int (TYPE_PRECISION (utype) - sz));
4229 	      mask = fold_build2 (RSHIFT_EXPR, utype, mask,
4230 				  size_int (TYPE_PRECISION (utype) - sz));
4231 	      fldval = fold_build2 (BIT_AND_EXPR, utype, fldval, mask);
4232 	      shift = bit - istart;
4233 	      if (BYTES_BIG_ENDIAN)
4234 		shift = TYPE_PRECISION (utype) - shift - sz;
4235 	      fldval = fold_build2 (LSHIFT_EXPR, utype, fldval,
4236 				    size_int (shift));
4237 	      retval = fold_build2 (BIT_IOR_EXPR, utype, retval, fldval);
4238 	      fld_seen = true;
4239 	    }
4240 	}
4241     }
4242   if (fld_seen)
4243     return fold_convert (TREE_TYPE (t), retval);
4244   gcc_unreachable ();
4245   return error_mark_node;
4246 }
4247 
4248 /* Helper for cxx_eval_bit_cast.
4249    Check [bit.cast]/3 rules, bit_cast is constexpr only if the To and From
4250    types and types of all subobjects have is_union_v<T>, is_pointer_v<T>,
4251    is_member_pointer_v<T>, is_volatile_v<T> false and has no non-static
4252    data members of reference type.  */
4253 
4254 static bool
check_bit_cast_type(const constexpr_ctx * ctx,location_t loc,tree type,tree orig_type)4255 check_bit_cast_type (const constexpr_ctx *ctx, location_t loc, tree type,
4256 		     tree orig_type)
4257 {
4258   if (TREE_CODE (type) == UNION_TYPE)
4259     {
4260       if (!ctx->quiet)
4261 	{
4262 	  if (type == orig_type)
4263 	    error_at (loc, "%qs is not a constant expression because %qT is "
4264 			   "a union type", "__builtin_bit_cast", type);
4265 	  else
4266 	    error_at (loc, "%qs is not a constant expression because %qT "
4267 			   "contains a union type", "__builtin_bit_cast",
4268 		      orig_type);
4269 	}
4270       return true;
4271     }
4272   if (TREE_CODE (type) == POINTER_TYPE)
4273     {
4274       if (!ctx->quiet)
4275 	{
4276 	  if (type == orig_type)
4277 	    error_at (loc, "%qs is not a constant expression because %qT is "
4278 			   "a pointer type", "__builtin_bit_cast", type);
4279 	  else
4280 	    error_at (loc, "%qs is not a constant expression because %qT "
4281 			   "contains a pointer type", "__builtin_bit_cast",
4282 		      orig_type);
4283 	}
4284       return true;
4285     }
4286   if (TREE_CODE (type) == REFERENCE_TYPE)
4287     {
4288       if (!ctx->quiet)
4289 	{
4290 	  if (type == orig_type)
4291 	    error_at (loc, "%qs is not a constant expression because %qT is "
4292 			   "a reference type", "__builtin_bit_cast", type);
4293 	  else
4294 	    error_at (loc, "%qs is not a constant expression because %qT "
4295 			   "contains a reference type", "__builtin_bit_cast",
4296 		      orig_type);
4297 	}
4298       return true;
4299     }
4300   if (TYPE_PTRMEM_P (type))
4301     {
4302       if (!ctx->quiet)
4303 	{
4304 	  if (type == orig_type)
4305 	    error_at (loc, "%qs is not a constant expression because %qT is "
4306 			   "a pointer to member type", "__builtin_bit_cast",
4307 		      type);
4308 	  else
4309 	    error_at (loc, "%qs is not a constant expression because %qT "
4310 			   "contains a pointer to member type",
4311 		      "__builtin_bit_cast", orig_type);
4312 	}
4313       return true;
4314     }
4315   if (TYPE_VOLATILE (type))
4316     {
4317       if (!ctx->quiet)
4318 	{
4319 	  if (type == orig_type)
4320 	    error_at (loc, "%qs is not a constant expression because %qT is "
4321 			   "volatile", "__builtin_bit_cast", type);
4322 	  else
4323 	    error_at (loc, "%qs is not a constant expression because %qT "
4324 			   "contains a volatile subobject",
4325 		      "__builtin_bit_cast", orig_type);
4326 	}
4327       return true;
4328     }
4329   if (TREE_CODE (type) == RECORD_TYPE)
4330     for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
4331       if (TREE_CODE (field) == FIELD_DECL
4332 	  && check_bit_cast_type (ctx, loc, TREE_TYPE (field), orig_type))
4333 	return true;
4334   return false;
4335 }
4336 
4337 /* Helper function for cxx_eval_bit_cast.  For unsigned char or
4338    std::byte members of CONSTRUCTOR (recursively) if they contain
4339    some indeterminate bits (as set in MASK), remove the ctor elts,
4340    mark the CONSTRUCTOR as CONSTRUCTOR_NO_CLEARING and clear the
4341    bits in MASK.  */
4342 
4343 static void
clear_uchar_or_std_byte_in_mask(location_t loc,tree t,unsigned char * mask)4344 clear_uchar_or_std_byte_in_mask (location_t loc, tree t, unsigned char *mask)
4345 {
4346   if (TREE_CODE (t) != CONSTRUCTOR)
4347     return;
4348 
4349   unsigned i, j = 0;
4350   tree index, value;
4351   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, index, value)
4352     {
4353       tree type = TREE_TYPE (value);
4354       if (TREE_CODE (TREE_TYPE (t)) != ARRAY_TYPE
4355 	  && DECL_BIT_FIELD_TYPE (index) != NULL_TREE)
4356 	{
4357 	  if (is_byte_access_type_not_plain_char (DECL_BIT_FIELD_TYPE (index)))
4358 	    {
4359 	      HOST_WIDE_INT fldsz = TYPE_PRECISION (TREE_TYPE (index));
4360 	      gcc_assert (fldsz != 0);
4361 	      HOST_WIDE_INT pos = int_byte_position (index);
4362 	      HOST_WIDE_INT bpos
4363 		= tree_to_uhwi (DECL_FIELD_BIT_OFFSET (index));
4364 	      bpos %= BITS_PER_UNIT;
4365 	      HOST_WIDE_INT end
4366 		= ROUND_UP (bpos + fldsz, BITS_PER_UNIT) / BITS_PER_UNIT;
4367 	      gcc_assert (end == 1 || end == 2);
4368 	      unsigned char *p = mask + pos;
4369 	      unsigned char mask_save[2];
4370 	      mask_save[0] = mask[pos];
4371 	      mask_save[1] = end == 2 ? mask[pos + 1] : 0;
4372 	      if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
4373 		sorry_at (loc, "PDP11 bit-field handling unsupported"
4374 			       " in %qs", "__builtin_bit_cast");
4375 	      else if (BYTES_BIG_ENDIAN)
4376 		{
4377 		  /* Big endian.  */
4378 		  if (bpos + fldsz <= BITS_PER_UNIT)
4379 		    *p &= ~(((1 << fldsz) - 1)
4380 			    << (BITS_PER_UNIT - bpos - fldsz));
4381 		  else
4382 		    {
4383 		      gcc_assert (bpos);
4384 		      *p &= ~(((1U << BITS_PER_UNIT) - 1) >> bpos);
4385 		      p++;
4386 		      fldsz -= BITS_PER_UNIT - bpos;
4387 		      gcc_assert (fldsz && fldsz < BITS_PER_UNIT);
4388 		      *p &= ((1U << BITS_PER_UNIT) - 1) >> fldsz;
4389 		    }
4390 		}
4391 	      else
4392 		{
4393 		  /* Little endian.  */
4394 		  if (bpos + fldsz <= BITS_PER_UNIT)
4395 		    *p &= ~(((1 << fldsz) - 1) << bpos);
4396 		  else
4397 		    {
4398 		      gcc_assert (bpos);
4399 		      *p &= ~(((1 << BITS_PER_UNIT) - 1) << bpos);
4400 		      p++;
4401 		      fldsz -= BITS_PER_UNIT - bpos;
4402 		      gcc_assert (fldsz && fldsz < BITS_PER_UNIT);
4403 		      *p &= ~((1 << fldsz) - 1);
4404 		    }
4405 		}
4406 	      if (mask_save[0] != mask[pos]
4407 		  || (end == 2 && mask_save[1] != mask[pos + 1]))
4408 		{
4409 		  CONSTRUCTOR_NO_CLEARING (t) = 1;
4410 		  continue;
4411 		}
4412 	    }
4413 	}
4414       else if (is_byte_access_type_not_plain_char (type))
4415 	{
4416 	  HOST_WIDE_INT pos;
4417 	  if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
4418 	    pos = tree_to_shwi (index);
4419 	  else
4420 	    pos = int_byte_position (index);
4421 	  if (mask[pos])
4422 	    {
4423 	      CONSTRUCTOR_NO_CLEARING (t) = 1;
4424 	      mask[pos] = 0;
4425 	      continue;
4426 	    }
4427 	}
4428       if (TREE_CODE (value) == CONSTRUCTOR)
4429 	{
4430 	  HOST_WIDE_INT pos;
4431 	  if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
4432 	    pos = tree_to_shwi (index)
4433 		  * tree_to_shwi (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (t))));
4434 	  else
4435 	    pos = int_byte_position (index);
4436 	  clear_uchar_or_std_byte_in_mask (loc, value, mask + pos);
4437 	}
4438       if (i != j)
4439 	{
4440 	  CONSTRUCTOR_ELT (t, j)->index = index;
4441 	  CONSTRUCTOR_ELT (t, j)->value = value;
4442 	}
4443       ++j;
4444     }
4445   if (CONSTRUCTOR_NELTS (t) != j)
4446     vec_safe_truncate (CONSTRUCTOR_ELTS (t), j);
4447 }
4448 
4449 /* Subroutine of cxx_eval_constant_expression.
4450    Attempt to evaluate a BIT_CAST_EXPR.  */
4451 
4452 static tree
cxx_eval_bit_cast(const constexpr_ctx * ctx,tree t,bool * non_constant_p,bool * overflow_p)4453 cxx_eval_bit_cast (const constexpr_ctx *ctx, tree t, bool *non_constant_p,
4454 		   bool *overflow_p)
4455 {
4456   if (check_bit_cast_type (ctx, EXPR_LOCATION (t), TREE_TYPE (t),
4457 			   TREE_TYPE (t))
4458       || check_bit_cast_type (ctx, cp_expr_loc_or_loc (TREE_OPERAND (t, 0),
4459 						       EXPR_LOCATION (t)),
4460 			      TREE_TYPE (TREE_OPERAND (t, 0)),
4461 			      TREE_TYPE (TREE_OPERAND (t, 0))))
4462     {
4463       *non_constant_p = true;
4464       return t;
4465     }
4466 
4467   tree op = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), false,
4468 					  non_constant_p, overflow_p);
4469   if (*non_constant_p)
4470     return t;
4471 
4472   location_t loc = EXPR_LOCATION (t);
4473   if (BITS_PER_UNIT != 8 || CHAR_BIT != 8)
4474     {
4475       if (!ctx->quiet)
4476 	sorry_at (loc, "%qs cannot be constant evaluated on the target",
4477 		       "__builtin_bit_cast");
4478       *non_constant_p = true;
4479       return t;
4480     }
4481 
4482   if (!tree_fits_shwi_p (TYPE_SIZE_UNIT (TREE_TYPE (t))))
4483     {
4484       if (!ctx->quiet)
4485 	sorry_at (loc, "%qs cannot be constant evaluated because the "
4486 		       "type is too large", "__builtin_bit_cast");
4487       *non_constant_p = true;
4488       return t;
4489     }
4490 
4491   HOST_WIDE_INT len = tree_to_shwi (TYPE_SIZE_UNIT (TREE_TYPE (t)));
4492   if (len < 0 || (int) len != len)
4493     {
4494       if (!ctx->quiet)
4495 	sorry_at (loc, "%qs cannot be constant evaluated because the "
4496 		       "type is too large", "__builtin_bit_cast");
4497       *non_constant_p = true;
4498       return t;
4499     }
4500 
4501   unsigned char buf[64];
4502   unsigned char *ptr, *mask;
4503   size_t alen = (size_t) len * 2;
4504   if (alen <= sizeof (buf))
4505     ptr = buf;
4506   else
4507     ptr = XNEWVEC (unsigned char, alen);
4508   mask = ptr + (size_t) len;
4509   /* At the beginning consider everything indeterminate.  */
4510   memset (mask, ~0, (size_t) len);
4511 
4512   if (native_encode_initializer (op, ptr, len, 0, mask) != len)
4513     {
4514       if (!ctx->quiet)
4515 	sorry_at (loc, "%qs cannot be constant evaluated because the "
4516 		       "argument cannot be encoded", "__builtin_bit_cast");
4517       *non_constant_p = true;
4518       if (ptr != buf)
4519 	XDELETE (ptr);
4520       return t;
4521     }
4522 
4523   tree r = NULL_TREE;
4524   if (can_native_interpret_type_p (TREE_TYPE (t)))
4525     {
4526       r = native_interpret_expr (TREE_TYPE (t), ptr, len);
4527       if (is_byte_access_type_not_plain_char (TREE_TYPE (t)))
4528 	{
4529 	  gcc_assert (len == 1);
4530 	  if (mask[0])
4531 	    {
4532 	      memset (mask, 0, len);
4533 	      r = build_constructor (TREE_TYPE (r), NULL);
4534 	      CONSTRUCTOR_NO_CLEARING (r) = 1;
4535 	    }
4536 	}
4537     }
4538   else if (TREE_CODE (TREE_TYPE (t)) == RECORD_TYPE)
4539     {
4540       r = native_interpret_aggregate (TREE_TYPE (t), ptr, 0, len);
4541       if (r != NULL_TREE)
4542 	{
4543 	  clear_type_padding_in_mask (TREE_TYPE (t), mask);
4544 	  clear_uchar_or_std_byte_in_mask (loc, r, mask);
4545 	}
4546     }
4547 
4548   if (r != NULL_TREE)
4549     {
4550       for (int i = 0; i < len; i++)
4551 	if (mask[i])
4552 	  {
4553 	    if (!ctx->quiet)
4554 	      error_at (loc, "%qs accessing uninitialized byte at offset %d",
4555 			     "__builtin_bit_cast", i);
4556 	    *non_constant_p = true;
4557 	    r = t;
4558 	    break;
4559 	  }
4560       if (ptr != buf)
4561 	XDELETE (ptr);
4562       return r;
4563     }
4564 
4565   if (!ctx->quiet)
4566     sorry_at (loc, "%qs cannot be constant evaluated because the "
4567 		   "argument cannot be interpreted", "__builtin_bit_cast");
4568   *non_constant_p = true;
4569   if (ptr != buf)
4570     XDELETE (ptr);
4571   return t;
4572 }
4573 
4574 /* Subroutine of cxx_eval_constant_expression.
4575    Evaluate a short-circuited logical expression T in the context
4576    of a given constexpr CALL.  BAILOUT_VALUE is the value for
4577    early return.  CONTINUE_VALUE is used here purely for
4578    sanity check purposes.  */
4579 
4580 static tree
cxx_eval_logical_expression(const constexpr_ctx * ctx,tree t,tree bailout_value,tree continue_value,bool * non_constant_p,bool * overflow_p)4581 cxx_eval_logical_expression (const constexpr_ctx *ctx, tree t,
4582                              tree bailout_value, tree continue_value,
4583 			     bool *non_constant_p, bool *overflow_p)
4584 {
4585   tree r;
4586   tree lhs = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
4587 					   /*lval*/false, non_constant_p,
4588 					   overflow_p);
4589   VERIFY_CONSTANT (lhs);
4590   if (tree_int_cst_equal (lhs, bailout_value))
4591     return lhs;
4592   gcc_assert (tree_int_cst_equal (lhs, continue_value));
4593   r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
4594 				    /*lval*/false, non_constant_p,
4595 				    overflow_p);
4596   VERIFY_CONSTANT (r);
4597   return r;
4598 }
4599 
4600 /* REF is a COMPONENT_REF designating a particular field.  V is a vector of
4601    CONSTRUCTOR elements to initialize (part of) an object containing that
4602    field.  Return a pointer to the constructor_elt corresponding to the
4603    initialization of the field.  */
4604 
4605 static constructor_elt *
base_field_constructor_elt(vec<constructor_elt,va_gc> * v,tree ref)4606 base_field_constructor_elt (vec<constructor_elt, va_gc> *v, tree ref)
4607 {
4608   tree aggr = TREE_OPERAND (ref, 0);
4609   tree field = TREE_OPERAND (ref, 1);
4610   HOST_WIDE_INT i;
4611   constructor_elt *ce;
4612 
4613   gcc_assert (TREE_CODE (ref) == COMPONENT_REF);
4614 
4615   if (TREE_CODE (aggr) == COMPONENT_REF)
4616     {
4617       constructor_elt *base_ce
4618 	= base_field_constructor_elt (v, aggr);
4619       v = CONSTRUCTOR_ELTS (base_ce->value);
4620     }
4621 
4622   for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
4623     if (ce->index == field)
4624       return ce;
4625 
4626   gcc_unreachable ();
4627   return NULL;
4628 }
4629 
4630 /* Some of the expressions fed to the constexpr mechanism are calls to
4631    constructors, which have type void.  In that case, return the type being
4632    initialized by the constructor.  */
4633 
4634 static tree
initialized_type(tree t)4635 initialized_type (tree t)
4636 {
4637   if (TYPE_P (t))
4638     return t;
4639   tree type = TREE_TYPE (t);
4640   if (TREE_CODE (t) == CALL_EXPR)
4641     {
4642       /* A constructor call has void type, so we need to look deeper.  */
4643       tree fn = get_function_named_in_call (t);
4644       if (fn && TREE_CODE (fn) == FUNCTION_DECL
4645 	  && DECL_CXX_CONSTRUCTOR_P (fn))
4646 	type = DECL_CONTEXT (fn);
4647     }
4648   else if (TREE_CODE (t) == COMPOUND_EXPR)
4649     return initialized_type (TREE_OPERAND (t, 1));
4650   else if (TREE_CODE (t) == AGGR_INIT_EXPR)
4651     type = TREE_TYPE (AGGR_INIT_EXPR_SLOT (t));
4652   return cv_unqualified (type);
4653 }
4654 
4655 /* We're about to initialize element INDEX of an array or class from VALUE.
4656    Set up NEW_CTX appropriately by adjusting .object to refer to the
4657    subobject and creating a new CONSTRUCTOR if the element is itself
4658    a class or array.  */
4659 
4660 static void
init_subob_ctx(const constexpr_ctx * ctx,constexpr_ctx & new_ctx,tree index,tree & value)4661 init_subob_ctx (const constexpr_ctx *ctx, constexpr_ctx &new_ctx,
4662 	       tree index, tree &value)
4663 {
4664   new_ctx = *ctx;
4665 
4666   if (index && TREE_CODE (index) != INTEGER_CST
4667       && TREE_CODE (index) != FIELD_DECL
4668       && TREE_CODE (index) != RANGE_EXPR)
4669     /* This won't have an element in the new CONSTRUCTOR.  */
4670     return;
4671 
4672   tree type = initialized_type (value);
4673   if (!AGGREGATE_TYPE_P (type) && !VECTOR_TYPE_P (type))
4674     /* A non-aggregate member doesn't get its own CONSTRUCTOR.  */
4675     return;
4676   if (VECTOR_TYPE_P (type)
4677       && VECTOR_TYPE_P (TREE_TYPE (ctx->ctor))
4678       && index == NULL_TREE)
4679     /* A vector inside of a vector CONSTRUCTOR, e.g. when a larger
4680        vector is constructed from smaller vectors, doesn't get its own
4681        CONSTRUCTOR either.  */
4682     return;
4683 
4684   /* The sub-aggregate initializer might contain a placeholder;
4685      update object to refer to the subobject and ctor to refer to
4686      the (newly created) sub-initializer.  */
4687   if (ctx->object)
4688     {
4689       if (index == NULL_TREE || TREE_CODE (index) == RANGE_EXPR)
4690 	/* There's no well-defined subobject for this index.  */
4691 	new_ctx.object = NULL_TREE;
4692       else
4693 	new_ctx.object = build_ctor_subob_ref (index, type, ctx->object);
4694     }
4695   tree elt = build_constructor (type, NULL);
4696   CONSTRUCTOR_NO_CLEARING (elt) = true;
4697   new_ctx.ctor = elt;
4698 
4699   if (TREE_CODE (value) == TARGET_EXPR)
4700     /* Avoid creating another CONSTRUCTOR when we expand the TARGET_EXPR.  */
4701     value = TARGET_EXPR_INITIAL (value);
4702 }
4703 
4704 /* We're about to process an initializer for a class or array TYPE.  Make
4705    sure that CTX is set up appropriately.  */
4706 
4707 static void
verify_ctor_sanity(const constexpr_ctx * ctx,tree type)4708 verify_ctor_sanity (const constexpr_ctx *ctx, tree type)
4709 {
4710   /* We don't bother building a ctor for an empty base subobject.  */
4711   if (is_empty_class (type))
4712     return;
4713 
4714   /* We're in the middle of an initializer that might involve placeholders;
4715      our caller should have created a CONSTRUCTOR for us to put the
4716      initializer into.  We will either return that constructor or T.  */
4717   gcc_assert (ctx->ctor);
4718   gcc_assert (same_type_ignoring_top_level_qualifiers_p
4719 	      (type, TREE_TYPE (ctx->ctor)));
4720   /* We used to check that ctx->ctor was empty, but that isn't the case when
4721      the object is zero-initialized before calling the constructor.  */
4722   if (ctx->object)
4723     {
4724       tree otype = TREE_TYPE (ctx->object);
4725       gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, otype)
4726 		  /* Handle flexible array members.  */
4727 		  || (TREE_CODE (otype) == ARRAY_TYPE
4728 		      && TYPE_DOMAIN (otype) == NULL_TREE
4729 		      && TREE_CODE (type) == ARRAY_TYPE
4730 		      && (same_type_ignoring_top_level_qualifiers_p
4731 			  (TREE_TYPE (type), TREE_TYPE (otype)))));
4732     }
4733   gcc_assert (!ctx->object || !DECL_P (ctx->object)
4734 	      || *(ctx->global->values.get (ctx->object)) == ctx->ctor);
4735 }
4736 
4737 /* Subroutine of cxx_eval_constant_expression.
4738    The expression tree T denotes a C-style array or a C-style
4739    aggregate.  Reduce it to a constant expression.  */
4740 
4741 static tree
cxx_eval_bare_aggregate(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)4742 cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
4743 			 bool lval,
4744 			 bool *non_constant_p, bool *overflow_p)
4745 {
4746   vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
4747   bool changed = false;
4748   gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (t));
4749   tree type = TREE_TYPE (t);
4750 
4751   constexpr_ctx new_ctx;
4752   if (TYPE_PTRMEMFUNC_P (type) || VECTOR_TYPE_P (type))
4753     {
4754       /* We don't really need the ctx->ctor business for a PMF or
4755 	 vector, but it's simpler to use the same code.  */
4756       new_ctx = *ctx;
4757       new_ctx.ctor = build_constructor (type, NULL);
4758       new_ctx.object = NULL_TREE;
4759       ctx = &new_ctx;
4760     };
4761   verify_ctor_sanity (ctx, type);
4762   vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
4763   vec_alloc (*p, vec_safe_length (v));
4764 
4765   if (CONSTRUCTOR_PLACEHOLDER_BOUNDARY (t))
4766     CONSTRUCTOR_PLACEHOLDER_BOUNDARY (ctx->ctor) = 1;
4767 
4768   unsigned i;
4769   tree index, value;
4770   bool constant_p = true;
4771   bool side_effects_p = false;
4772   FOR_EACH_CONSTRUCTOR_ELT (v, i, index, value)
4773     {
4774       tree orig_value = value;
4775       /* Like in cxx_eval_store_expression, omit entries for empty fields.  */
4776       bool no_slot = TREE_CODE (type) == RECORD_TYPE && is_empty_field (index);
4777       init_subob_ctx (ctx, new_ctx, index, value);
4778       int pos_hint = -1;
4779       if (new_ctx.ctor != ctx->ctor && !no_slot)
4780 	{
4781 	  /* If we built a new CONSTRUCTOR, attach it now so that other
4782 	     initializers can refer to it.  */
4783 	  constructor_elt *cep = get_or_insert_ctor_field (ctx->ctor, index);
4784 	  cep->value = new_ctx.ctor;
4785 	  pos_hint = cep - (*p)->begin();
4786 	}
4787       else if (TREE_CODE (type) == UNION_TYPE)
4788 	/* Otherwise if we're constructing a non-aggregate union member, set
4789 	   the active union member now so that we can later detect and diagnose
4790 	   if its initializer attempts to activate another member.  */
4791 	get_or_insert_ctor_field (ctx->ctor, index);
4792       tree elt = cxx_eval_constant_expression (&new_ctx, value,
4793 					       lval,
4794 					       non_constant_p, overflow_p);
4795       /* Don't VERIFY_CONSTANT here.  */
4796       if (ctx->quiet && *non_constant_p)
4797 	break;
4798       if (elt != orig_value)
4799 	changed = true;
4800 
4801       if (!TREE_CONSTANT (elt))
4802 	constant_p = false;
4803       if (TREE_SIDE_EFFECTS (elt))
4804 	side_effects_p = true;
4805       if (index && TREE_CODE (index) == COMPONENT_REF)
4806 	{
4807 	  /* This is an initialization of a vfield inside a base
4808 	     subaggregate that we already initialized; push this
4809 	     initialization into the previous initialization.  */
4810 	  constructor_elt *inner = base_field_constructor_elt (*p, index);
4811 	  inner->value = elt;
4812 	  changed = true;
4813 	}
4814       else if (index
4815 	       && (TREE_CODE (index) == NOP_EXPR
4816 		   || TREE_CODE (index) == POINTER_PLUS_EXPR))
4817 	{
4818 	  /* This is an initializer for an empty base; now that we've
4819 	     checked that it's constant, we can ignore it.  */
4820 	  gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (index))));
4821 	  changed = true;
4822 	}
4823       else if (no_slot)
4824 	changed = true;
4825       else
4826 	{
4827 	  if (TREE_CODE (type) == UNION_TYPE
4828 	      && (*p)->last().index != index)
4829 	    /* The initializer erroneously changed the active union member that
4830 	       we're initializing.  */
4831 	    gcc_assert (*non_constant_p);
4832 	  else
4833 	    {
4834 	      /* The initializer might have mutated the underlying CONSTRUCTOR,
4835 		 so recompute the location of the target constructer_elt.  */
4836 	      constructor_elt *cep
4837 		= get_or_insert_ctor_field (ctx->ctor, index, pos_hint);
4838 	      cep->value = elt;
4839 	    }
4840 
4841 	  /* Adding or replacing an element might change the ctor's flags.  */
4842 	  TREE_CONSTANT (ctx->ctor) = constant_p;
4843 	  TREE_SIDE_EFFECTS (ctx->ctor) = side_effects_p;
4844 	}
4845     }
4846   if (*non_constant_p || !changed)
4847     return t;
4848   t = ctx->ctor;
4849   /* We're done building this CONSTRUCTOR, so now we can interpret an
4850      element without an explicit initializer as value-initialized.  */
4851   CONSTRUCTOR_NO_CLEARING (t) = false;
4852   TREE_CONSTANT (t) = constant_p;
4853   TREE_SIDE_EFFECTS (t) = side_effects_p;
4854   if (VECTOR_TYPE_P (type))
4855     t = fold (t);
4856   return t;
4857 }
4858 
4859 /* Subroutine of cxx_eval_constant_expression.
4860    The expression tree T is a VEC_INIT_EXPR which denotes the desired
4861    initialization of a non-static data member of array type.  Reduce it to a
4862    CONSTRUCTOR.
4863 
4864    Note that apart from value-initialization (when VALUE_INIT is true),
4865    this is only intended to support value-initialization and the
4866    initializations done by defaulted constructors for classes with
4867    non-static data members of array type.  In this case, VEC_INIT_EXPR_INIT
4868    will either be NULL_TREE for the default constructor, or a COMPONENT_REF
4869    for the copy/move constructor.  */
4870 
4871 static tree
cxx_eval_vec_init_1(const constexpr_ctx * ctx,tree atype,tree init,bool value_init,bool lval,bool * non_constant_p,bool * overflow_p)4872 cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
4873 		     bool value_init, bool lval,
4874 		     bool *non_constant_p, bool *overflow_p)
4875 {
4876   tree elttype = TREE_TYPE (atype);
4877   verify_ctor_sanity (ctx, atype);
4878   vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
4879   bool pre_init = false;
4880   unsigned HOST_WIDE_INT i;
4881   tsubst_flags_t complain = ctx->quiet ? tf_none : tf_warning_or_error;
4882 
4883   if (init && TREE_CODE (init) == CONSTRUCTOR)
4884     return cxx_eval_bare_aggregate (ctx, init, lval,
4885 				    non_constant_p, overflow_p);
4886 
4887   /* For the default constructor, build up a call to the default
4888      constructor of the element type.  We only need to handle class types
4889      here, as for a constructor to be constexpr, all members must be
4890      initialized, which for a defaulted default constructor means they must
4891      be of a class type with a constexpr default constructor.  */
4892   if (TREE_CODE (elttype) == ARRAY_TYPE)
4893     /* We only do this at the lowest level.  */;
4894   else if (value_init)
4895     {
4896       init = build_value_init (elttype, complain);
4897       pre_init = true;
4898     }
4899   else if (!init)
4900     {
4901       releasing_vec argvec;
4902       init = build_special_member_call (NULL_TREE, complete_ctor_identifier,
4903 					&argvec, elttype, LOOKUP_NORMAL,
4904 					complain);
4905       init = build_aggr_init_expr (elttype, init);
4906       pre_init = true;
4907     }
4908 
4909   bool zeroed_out = false;
4910   if (!CONSTRUCTOR_NO_CLEARING (ctx->ctor))
4911     {
4912       /* We're initializing an array object that had been zero-initialized
4913 	 earlier.  Truncate ctx->ctor, and propagate its zeroed state by
4914 	 clearing CONSTRUCTOR_NO_CLEARING on each of the aggregate element
4915 	 initializers we append to it.  */
4916       gcc_checking_assert (initializer_zerop (ctx->ctor));
4917       zeroed_out = true;
4918       vec_safe_truncate (*p, 0);
4919     }
4920 
4921   tree nelts = get_array_or_vector_nelts (ctx, atype, non_constant_p,
4922 					  overflow_p);
4923   unsigned HOST_WIDE_INT max = tree_to_uhwi (nelts);
4924   for (i = 0; i < max; ++i)
4925     {
4926       tree idx = build_int_cst (size_type_node, i);
4927       tree eltinit;
4928       bool reuse = false;
4929       constexpr_ctx new_ctx;
4930       init_subob_ctx (ctx, new_ctx, idx, pre_init ? init : elttype);
4931       if (new_ctx.ctor != ctx->ctor)
4932 	{
4933 	  if (zeroed_out)
4934 	    CONSTRUCTOR_NO_CLEARING (new_ctx.ctor) = false;
4935 	  CONSTRUCTOR_APPEND_ELT (*p, idx, new_ctx.ctor);
4936 	}
4937       if (TREE_CODE (elttype) == ARRAY_TYPE)
4938 	{
4939 	  /* A multidimensional array; recurse.  */
4940 	  if (value_init || init == NULL_TREE)
4941 	    {
4942 	      eltinit = NULL_TREE;
4943 	      reuse = i == 0;
4944 	    }
4945 	  else
4946 	    eltinit = cp_build_array_ref (input_location, init, idx, complain);
4947 	  eltinit = cxx_eval_vec_init_1 (&new_ctx, elttype, eltinit, value_init,
4948 					 lval,
4949 					 non_constant_p, overflow_p);
4950 	}
4951       else if (pre_init)
4952 	{
4953 	  /* Initializing an element using value or default initialization
4954 	     we just pre-built above.  */
4955 	  if (init == void_node)
4956 	    /* Trivial default-init, don't do anything to the CONSTRUCTOR.  */
4957 	    return ctx->ctor;
4958 	  eltinit = cxx_eval_constant_expression (&new_ctx, init, lval,
4959 						  non_constant_p, overflow_p);
4960 	  reuse = i == 0;
4961 	}
4962       else
4963 	{
4964 	  /* Copying an element.  */
4965 	  gcc_assert (same_type_ignoring_top_level_qualifiers_p
4966 		      (atype, TREE_TYPE (init)));
4967 	  eltinit = cp_build_array_ref (input_location, init, idx, complain);
4968 	  if (!lvalue_p (init))
4969 	    eltinit = move (eltinit);
4970 	  eltinit = force_rvalue (eltinit, complain);
4971 	  eltinit = cxx_eval_constant_expression (&new_ctx, eltinit, lval,
4972 						  non_constant_p, overflow_p);
4973 	}
4974       if (*non_constant_p)
4975 	break;
4976       if (new_ctx.ctor != ctx->ctor)
4977 	{
4978 	  /* We appended this element above; update the value.  */
4979 	  gcc_assert ((*p)->last().index == idx);
4980 	  (*p)->last().value = eltinit;
4981 	}
4982       else
4983 	CONSTRUCTOR_APPEND_ELT (*p, idx, eltinit);
4984       /* Reuse the result of cxx_eval_constant_expression call
4985 	 from the first iteration to all others if it is a constant
4986 	 initializer that doesn't require relocations.  */
4987       if (reuse
4988 	  && max > 1
4989 	  && (eltinit == NULL_TREE
4990 	      || (initializer_constant_valid_p (eltinit, TREE_TYPE (eltinit))
4991 		  == null_pointer_node)))
4992 	{
4993 	  if (new_ctx.ctor != ctx->ctor)
4994 	    eltinit = new_ctx.ctor;
4995 	  tree range = build2 (RANGE_EXPR, size_type_node,
4996 			       build_int_cst (size_type_node, 1),
4997 			       build_int_cst (size_type_node, max - 1));
4998 	  CONSTRUCTOR_APPEND_ELT (*p, range, unshare_constructor (eltinit));
4999 	  break;
5000 	}
5001       else if (i == 0)
5002 	vec_safe_reserve (*p, max);
5003     }
5004 
5005   if (!*non_constant_p)
5006     {
5007       init = ctx->ctor;
5008       CONSTRUCTOR_NO_CLEARING (init) = false;
5009     }
5010   return init;
5011 }
5012 
5013 static tree
cxx_eval_vec_init(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)5014 cxx_eval_vec_init (const constexpr_ctx *ctx, tree t,
5015 		   bool lval,
5016 		   bool *non_constant_p, bool *overflow_p)
5017 {
5018   tree atype = TREE_TYPE (t);
5019   tree init = VEC_INIT_EXPR_INIT (t);
5020   bool value_init = VEC_INIT_EXPR_VALUE_INIT (t);
5021   if (!init || !BRACE_ENCLOSED_INITIALIZER_P (init))
5022     ;
5023   else if (CONSTRUCTOR_NELTS (init) == 0
5024 	   && !CP_AGGREGATE_TYPE_P (strip_array_types (atype)))
5025     {
5026       /* Handle {} as value-init.  */
5027       init = NULL_TREE;
5028       value_init = true;
5029     }
5030   else
5031     {
5032       /* This is a more complicated case, like needing to loop over trailing
5033 	 elements; call build_vec_init and evaluate the result.  */
5034       tsubst_flags_t complain = ctx->quiet ? tf_none : tf_warning_or_error;
5035       constexpr_ctx new_ctx = *ctx;
5036       if (!ctx->object)
5037 	{
5038 	  /* We want to have an initialization target for an VEC_INIT_EXPR.
5039 	     If we don't already have one in CTX, use the VEC_INIT_EXPR_SLOT.  */
5040 	  new_ctx.object = VEC_INIT_EXPR_SLOT (t);
5041 	  tree ctor = new_ctx.ctor = build_constructor (atype, NULL);
5042 	  CONSTRUCTOR_NO_CLEARING (ctor) = true;
5043 	  ctx->global->values.put (new_ctx.object, ctor);
5044 	  ctx = &new_ctx;
5045 	}
5046       init = expand_vec_init_expr (ctx->object, t, complain);
5047       return cxx_eval_constant_expression (ctx, init, lval, non_constant_p,
5048 					   overflow_p);
5049     }
5050   tree r = cxx_eval_vec_init_1 (ctx, atype, init, value_init,
5051 				lval, non_constant_p, overflow_p);
5052   if (*non_constant_p)
5053     return t;
5054   else
5055     return r;
5056 }
5057 
5058 /* Like same_type_ignoring_top_level_qualifiers_p, but also handle the case
5059    where the desired type is an array of unknown bounds because the variable
5060    has had its bounds deduced since the wrapping expression was created.  */
5061 
5062 static bool
same_type_ignoring_tlq_and_bounds_p(tree type1,tree type2)5063 same_type_ignoring_tlq_and_bounds_p (tree type1, tree type2)
5064 {
5065   while (TREE_CODE (type1) == ARRAY_TYPE
5066 	 && TREE_CODE (type2) == ARRAY_TYPE
5067 	 && (!TYPE_DOMAIN (type1) || !TYPE_DOMAIN (type2)))
5068     {
5069       type1 = TREE_TYPE (type1);
5070       type2 = TREE_TYPE (type2);
5071     }
5072   return same_type_ignoring_top_level_qualifiers_p (type1, type2);
5073 }
5074 
5075 /* Try to determine the currently active union member for an expression
5076    with UNION_TYPE.  If it can be determined, return the FIELD_DECL,
5077    otherwise return NULL_TREE.  */
5078 
5079 static tree
cxx_union_active_member(const constexpr_ctx * ctx,tree t)5080 cxx_union_active_member (const constexpr_ctx *ctx, tree t)
5081 {
5082   constexpr_ctx new_ctx = *ctx;
5083   new_ctx.quiet = true;
5084   bool non_constant_p = false, overflow_p = false;
5085   tree ctor = cxx_eval_constant_expression (&new_ctx, t, false,
5086 					    &non_constant_p,
5087 					    &overflow_p);
5088   if (TREE_CODE (ctor) == CONSTRUCTOR
5089       && CONSTRUCTOR_NELTS (ctor) == 1
5090       && CONSTRUCTOR_ELT (ctor, 0)->index
5091       && TREE_CODE (CONSTRUCTOR_ELT (ctor, 0)->index) == FIELD_DECL)
5092     return CONSTRUCTOR_ELT (ctor, 0)->index;
5093   return NULL_TREE;
5094 }
5095 
5096 /* Helper function for cxx_fold_indirect_ref_1, called recursively.  */
5097 
5098 static tree
cxx_fold_indirect_ref_1(const constexpr_ctx * ctx,location_t loc,tree type,tree op,unsigned HOST_WIDE_INT off,bool * empty_base)5099 cxx_fold_indirect_ref_1 (const constexpr_ctx *ctx, location_t loc, tree type,
5100 			 tree op, unsigned HOST_WIDE_INT off, bool *empty_base)
5101 {
5102   tree optype = TREE_TYPE (op);
5103   unsigned HOST_WIDE_INT const_nunits;
5104   if (off == 0 && similar_type_p (optype, type))
5105     return op;
5106   else if (TREE_CODE (optype) == COMPLEX_TYPE
5107 	   && similar_type_p (type, TREE_TYPE (optype)))
5108     {
5109       /* *(foo *)&complexfoo => __real__ complexfoo */
5110       if (off == 0)
5111 	return build1_loc (loc, REALPART_EXPR, type, op);
5112       /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
5113       else if (tree_to_uhwi (TYPE_SIZE_UNIT (type)) == off)
5114 	return build1_loc (loc, IMAGPART_EXPR, type, op);
5115     }
5116   /* ((foo*)&vectorfoo)[x] => BIT_FIELD_REF<vectorfoo,...> */
5117   else if (VECTOR_TYPE_P (optype)
5118 	   && similar_type_p (type, TREE_TYPE (optype))
5119 	   && TYPE_VECTOR_SUBPARTS (optype).is_constant (&const_nunits))
5120     {
5121       unsigned HOST_WIDE_INT part_width = tree_to_uhwi (TYPE_SIZE_UNIT (type));
5122       unsigned HOST_WIDE_INT max_offset = part_width * const_nunits;
5123       if (off < max_offset && off % part_width == 0)
5124 	{
5125 	  tree index = bitsize_int (off * BITS_PER_UNIT);
5126 	  return build3_loc (loc, BIT_FIELD_REF, type, op,
5127 			     TYPE_SIZE (type), index);
5128 	}
5129     }
5130   /* ((foo *)&fooarray)[x] => fooarray[x] */
5131   else if (TREE_CODE (optype) == ARRAY_TYPE
5132 	   && tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (optype)))
5133 	   && !integer_zerop (TYPE_SIZE_UNIT (TREE_TYPE (optype))))
5134     {
5135       tree type_domain = TYPE_DOMAIN (optype);
5136       tree min_val = size_zero_node;
5137       if (type_domain && TYPE_MIN_VALUE (type_domain))
5138 	min_val = TYPE_MIN_VALUE (type_domain);
5139       unsigned HOST_WIDE_INT el_sz
5140 	= tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (optype)));
5141       unsigned HOST_WIDE_INT idx = off / el_sz;
5142       unsigned HOST_WIDE_INT rem = off % el_sz;
5143       if (tree_fits_uhwi_p (min_val))
5144 	{
5145 	  tree index = size_int (idx + tree_to_uhwi (min_val));
5146 	  op = build4_loc (loc, ARRAY_REF, TREE_TYPE (optype), op, index,
5147 			   NULL_TREE, NULL_TREE);
5148 	  return cxx_fold_indirect_ref_1 (ctx, loc, type, op, rem,
5149 					  empty_base);
5150 	}
5151     }
5152   /* ((foo *)&struct_with_foo_field)[x] => COMPONENT_REF */
5153   else if (TREE_CODE (optype) == RECORD_TYPE
5154 	   || TREE_CODE (optype) == UNION_TYPE)
5155     {
5156       if (TREE_CODE (optype) == UNION_TYPE)
5157 	/* For unions prefer the currently active member.  */
5158 	if (tree field = cxx_union_active_member (ctx, op))
5159 	  {
5160 	    unsigned HOST_WIDE_INT el_sz
5161 	      = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (field)));
5162 	    if (off < el_sz)
5163 	      {
5164 		tree cop = build3 (COMPONENT_REF, TREE_TYPE (field),
5165 				   op, field, NULL_TREE);
5166 		if (tree ret = cxx_fold_indirect_ref_1 (ctx, loc, type, cop,
5167 							off, empty_base))
5168 		  return ret;
5169 	      }
5170 	  }
5171       for (tree field = TYPE_FIELDS (optype);
5172 	   field; field = DECL_CHAIN (field))
5173 	if (TREE_CODE (field) == FIELD_DECL
5174 	    && TREE_TYPE (field) != error_mark_node
5175 	    && tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (field))))
5176 	  {
5177 	    tree pos = byte_position (field);
5178 	    if (!tree_fits_uhwi_p (pos))
5179 	      continue;
5180 	    unsigned HOST_WIDE_INT upos = tree_to_uhwi (pos);
5181 	    unsigned HOST_WIDE_INT el_sz
5182 	      = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (field)));
5183 	    if (upos <= off && off < upos + el_sz)
5184 	      {
5185 		tree cop = build3 (COMPONENT_REF, TREE_TYPE (field),
5186 				   op, field, NULL_TREE);
5187 		if (tree ret = cxx_fold_indirect_ref_1 (ctx, loc, type, cop,
5188 							off - upos,
5189 							empty_base))
5190 		  return ret;
5191 	      }
5192 	  }
5193       /* Also handle conversion to an empty base class, which
5194 	 is represented with a NOP_EXPR.  */
5195       if (is_empty_class (type)
5196 	  && CLASS_TYPE_P (optype)
5197 	  && DERIVED_FROM_P (type, optype))
5198 	{
5199 	  *empty_base = true;
5200 	  return op;
5201 	}
5202     }
5203 
5204   return NULL_TREE;
5205 }
5206 
5207 /* A less strict version of fold_indirect_ref_1, which requires cv-quals to
5208    match.  We want to be less strict for simple *& folding; if we have a
5209    non-const temporary that we access through a const pointer, that should
5210    work.  We handle this here rather than change fold_indirect_ref_1
5211    because we're dealing with things like ADDR_EXPR of INTEGER_CST which
5212    don't really make sense outside of constant expression evaluation.  Also
5213    we want to allow folding to COMPONENT_REF, which could cause trouble
5214    with TBAA in fold_indirect_ref_1.  */
5215 
5216 static tree
cxx_fold_indirect_ref(const constexpr_ctx * ctx,location_t loc,tree type,tree op0,bool * empty_base)5217 cxx_fold_indirect_ref (const constexpr_ctx *ctx, location_t loc, tree type,
5218 		       tree op0, bool *empty_base)
5219 {
5220   tree sub = op0;
5221   tree subtype;
5222   poly_uint64 const_op01;
5223 
5224   /* STRIP_NOPS, but stop if REINTERPRET_CAST_P.  */
5225   while (CONVERT_EXPR_P (sub) || TREE_CODE (sub) == NON_LVALUE_EXPR
5226 	 || TREE_CODE (sub) == VIEW_CONVERT_EXPR)
5227     {
5228       if (TREE_CODE (sub) == NOP_EXPR
5229 	  && REINTERPRET_CAST_P (sub))
5230 	return NULL_TREE;
5231       sub = TREE_OPERAND (sub, 0);
5232     }
5233 
5234   subtype = TREE_TYPE (sub);
5235   if (!INDIRECT_TYPE_P (subtype))
5236     return NULL_TREE;
5237 
5238   /* Canonicalizes the given OBJ/OFF pair by iteratively absorbing
5239      the innermost component into the offset until it would make the
5240      offset positive, so that cxx_fold_indirect_ref_1 can identify
5241      more folding opportunities.  */
5242   auto canonicalize_obj_off = [] (tree& obj, tree& off) {
5243     while (TREE_CODE (obj) == COMPONENT_REF
5244 	   && (tree_int_cst_sign_bit (off) || integer_zerop (off)))
5245       {
5246 	tree field = TREE_OPERAND (obj, 1);
5247 	tree pos = byte_position (field);
5248 	if (integer_zerop (off) && integer_nonzerop (pos))
5249 	  /* If the offset is already 0, keep going as long as the
5250 	     component is at position 0.  */
5251 	  break;
5252 	off = int_const_binop (PLUS_EXPR, off, pos);
5253 	obj = TREE_OPERAND (obj, 0);
5254       }
5255   };
5256 
5257   if (TREE_CODE (sub) == ADDR_EXPR)
5258     {
5259       tree op = TREE_OPERAND (sub, 0);
5260       tree optype = TREE_TYPE (op);
5261 
5262       /* *&CONST_DECL -> to the value of the const decl.  */
5263       if (TREE_CODE (op) == CONST_DECL)
5264 	return DECL_INITIAL (op);
5265       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
5266       if (similar_type_p (optype, type))
5267 	{
5268 	  tree fop = fold_read_from_constant_string (op);
5269 	  if (fop)
5270 	    return fop;
5271 	  else
5272 	    return op;
5273 	}
5274       else
5275 	{
5276 	  tree off = integer_zero_node;
5277 	  canonicalize_obj_off (op, off);
5278 	  gcc_assert (integer_zerop (off));
5279 	  return cxx_fold_indirect_ref_1 (ctx, loc, type, op, 0, empty_base);
5280 	}
5281     }
5282   else if (TREE_CODE (sub) == POINTER_PLUS_EXPR
5283 	   && tree_fits_uhwi_p (TREE_OPERAND (sub, 1)))
5284     {
5285       tree op00 = TREE_OPERAND (sub, 0);
5286       tree off = TREE_OPERAND (sub, 1);
5287 
5288       STRIP_NOPS (op00);
5289       if (TREE_CODE (op00) == ADDR_EXPR)
5290 	{
5291 	  tree obj = TREE_OPERAND (op00, 0);
5292 	  canonicalize_obj_off (obj, off);
5293 	  return cxx_fold_indirect_ref_1 (ctx, loc, type, obj,
5294 					  tree_to_uhwi (off), empty_base);
5295 	}
5296     }
5297   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
5298   else if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
5299 	   && similar_type_p (type, TREE_TYPE (TREE_TYPE (subtype))))
5300     {
5301       tree type_domain;
5302       tree min_val = size_zero_node;
5303       tree newsub
5304 	= cxx_fold_indirect_ref (ctx, loc, TREE_TYPE (subtype), sub, NULL);
5305       if (newsub)
5306 	sub = newsub;
5307       else
5308 	sub = build1_loc (loc, INDIRECT_REF, TREE_TYPE (subtype), sub);
5309       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
5310       if (type_domain && TYPE_MIN_VALUE (type_domain))
5311 	min_val = TYPE_MIN_VALUE (type_domain);
5312       return build4_loc (loc, ARRAY_REF, type, sub, min_val, NULL_TREE,
5313 			 NULL_TREE);
5314     }
5315 
5316   return NULL_TREE;
5317 }
5318 
5319 static tree
cxx_eval_indirect_ref(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)5320 cxx_eval_indirect_ref (const constexpr_ctx *ctx, tree t,
5321 		       bool lval,
5322 		       bool *non_constant_p, bool *overflow_p)
5323 {
5324   tree orig_op0 = TREE_OPERAND (t, 0);
5325   bool empty_base = false;
5326 
5327   /* We can handle a MEM_REF like an INDIRECT_REF, if MEM_REF's second
5328      operand is an integer-zero.  Otherwise reject the MEM_REF for now.  */
5329 
5330   if (TREE_CODE (t) == MEM_REF
5331       && (!TREE_OPERAND (t, 1) || !integer_zerop (TREE_OPERAND (t, 1))))
5332     {
5333       gcc_assert (ctx->quiet);
5334       *non_constant_p = true;
5335       return t;
5336     }
5337 
5338   /* First try to simplify it directly.  */
5339   tree r = cxx_fold_indirect_ref (ctx, EXPR_LOCATION (t), TREE_TYPE (t),
5340 				  orig_op0, &empty_base);
5341   if (!r)
5342     {
5343       /* If that didn't work, evaluate the operand first.  */
5344       tree op0 = cxx_eval_constant_expression (ctx, orig_op0,
5345 					       /*lval*/false, non_constant_p,
5346 					       overflow_p);
5347       /* Don't VERIFY_CONSTANT here.  */
5348       if (*non_constant_p)
5349 	return t;
5350 
5351       if (!lval && integer_zerop (op0))
5352 	{
5353 	  if (!ctx->quiet)
5354 	    error ("dereferencing a null pointer");
5355 	  *non_constant_p = true;
5356 	  return t;
5357 	}
5358 
5359       r = cxx_fold_indirect_ref (ctx, EXPR_LOCATION (t), TREE_TYPE (t), op0,
5360 				 &empty_base);
5361       if (r == NULL_TREE)
5362 	{
5363 	  /* We couldn't fold to a constant value.  Make sure it's not
5364 	     something we should have been able to fold.  */
5365 	  tree sub = op0;
5366 	  STRIP_NOPS (sub);
5367 	  if (TREE_CODE (sub) == ADDR_EXPR)
5368 	    {
5369 	      gcc_assert (!similar_type_p
5370 			  (TREE_TYPE (TREE_TYPE (sub)), TREE_TYPE (t)));
5371 	      /* DR 1188 says we don't have to deal with this.  */
5372 	      if (!ctx->quiet)
5373 		error_at (cp_expr_loc_or_input_loc (t),
5374 			  "accessing value of %qE through a %qT glvalue in a "
5375 			  "constant expression", build_fold_indirect_ref (sub),
5376 			  TREE_TYPE (t));
5377 	      *non_constant_p = true;
5378 	      return t;
5379 	    }
5380 
5381 	  if (lval && op0 != orig_op0)
5382 	    return build1 (INDIRECT_REF, TREE_TYPE (t), op0);
5383 	  if (!lval)
5384 	    VERIFY_CONSTANT (t);
5385 	  return t;
5386 	}
5387     }
5388 
5389   r = cxx_eval_constant_expression (ctx, r,
5390 				    lval, non_constant_p, overflow_p);
5391   if (*non_constant_p)
5392     return t;
5393 
5394   /* If we're pulling out the value of an empty base, just return an empty
5395      CONSTRUCTOR.  */
5396   if (empty_base && !lval)
5397     {
5398       r = build_constructor (TREE_TYPE (t), NULL);
5399       TREE_CONSTANT (r) = true;
5400     }
5401 
5402   return r;
5403 }
5404 
5405 /* Complain about R, a VAR_DECL, not being usable in a constant expression.
5406    Shared between potential_constant_expression and
5407    cxx_eval_constant_expression.  */
5408 
5409 static void
non_const_var_error(location_t loc,tree r)5410 non_const_var_error (location_t loc, tree r)
5411 {
5412   auto_diagnostic_group d;
5413   tree type = TREE_TYPE (r);
5414   if (DECL_NAME (r) == heap_uninit_identifier
5415       || DECL_NAME (r) == heap_identifier
5416       || DECL_NAME (r) == heap_vec_uninit_identifier
5417       || DECL_NAME (r) == heap_vec_identifier)
5418     {
5419       error_at (loc, "the content of uninitialized storage is not usable "
5420 		"in a constant expression");
5421       inform (DECL_SOURCE_LOCATION (r), "allocated here");
5422       return;
5423     }
5424   if (DECL_NAME (r) == heap_deleted_identifier)
5425     {
5426       error_at (loc, "use of allocated storage after deallocation in a "
5427 		"constant expression");
5428       inform (DECL_SOURCE_LOCATION (r), "allocated here");
5429       return;
5430     }
5431   error_at (loc, "the value of %qD is not usable in a constant "
5432 	    "expression", r);
5433   /* Avoid error cascade.  */
5434   if (DECL_INITIAL (r) == error_mark_node)
5435     return;
5436   if (DECL_DECLARED_CONSTEXPR_P (r))
5437     inform (DECL_SOURCE_LOCATION (r),
5438 	    "%qD used in its own initializer", r);
5439   else if (INTEGRAL_OR_ENUMERATION_TYPE_P (type))
5440     {
5441       if (!CP_TYPE_CONST_P (type))
5442 	inform (DECL_SOURCE_LOCATION (r),
5443 		"%q#D is not const", r);
5444       else if (CP_TYPE_VOLATILE_P (type))
5445 	inform (DECL_SOURCE_LOCATION (r),
5446 		"%q#D is volatile", r);
5447       else if (!DECL_INITIAL (r)
5448 	       || !TREE_CONSTANT (DECL_INITIAL (r))
5449 	       || !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (r))
5450 	inform (DECL_SOURCE_LOCATION (r),
5451 		"%qD was not initialized with a constant "
5452 		"expression", r);
5453       else
5454 	gcc_unreachable ();
5455     }
5456   else if (TYPE_REF_P (type))
5457     inform (DECL_SOURCE_LOCATION (r),
5458 	    "%qD was not initialized with a constant "
5459 	    "expression", r);
5460   else
5461     {
5462       if (cxx_dialect >= cxx11 && !DECL_DECLARED_CONSTEXPR_P (r))
5463 	inform (DECL_SOURCE_LOCATION (r),
5464 		"%qD was not declared %<constexpr%>", r);
5465       else
5466 	inform (DECL_SOURCE_LOCATION (r),
5467 		"%qD does not have integral or enumeration type",
5468 		r);
5469     }
5470 }
5471 
5472 /* Subroutine of cxx_eval_constant_expression.
5473    Like cxx_eval_unary_expression, except for trinary expressions.  */
5474 
5475 static tree
cxx_eval_trinary_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)5476 cxx_eval_trinary_expression (const constexpr_ctx *ctx, tree t,
5477 			     bool lval,
5478 			     bool *non_constant_p, bool *overflow_p)
5479 {
5480   int i;
5481   tree args[3];
5482   tree val;
5483 
5484   for (i = 0; i < 3; i++)
5485     {
5486       args[i] = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, i),
5487 					      lval,
5488 					      non_constant_p, overflow_p);
5489       VERIFY_CONSTANT (args[i]);
5490     }
5491 
5492   val = fold_ternary_loc (EXPR_LOCATION (t), TREE_CODE (t), TREE_TYPE (t),
5493 			  args[0], args[1], args[2]);
5494   if (val == NULL_TREE)
5495     return t;
5496   VERIFY_CONSTANT (val);
5497   return val;
5498 }
5499 
5500 /* True if T was declared in a function declared to be constexpr, and
5501    therefore potentially constant in C++14.  */
5502 
5503 bool
var_in_constexpr_fn(tree t)5504 var_in_constexpr_fn (tree t)
5505 {
5506   tree ctx = DECL_CONTEXT (t);
5507   return (ctx && TREE_CODE (ctx) == FUNCTION_DECL
5508 	  && DECL_DECLARED_CONSTEXPR_P (ctx));
5509 }
5510 
5511 /* True if a function might be constexpr: either a function that was
5512    declared constexpr, or a C++17 lambda op().  */
5513 
5514 bool
maybe_constexpr_fn(tree t)5515 maybe_constexpr_fn (tree t)
5516 {
5517   return (DECL_DECLARED_CONSTEXPR_P (t)
5518 	  || (cxx_dialect >= cxx17 && LAMBDA_FUNCTION_P (t))
5519 	  || (flag_implicit_constexpr
5520 	      && DECL_DECLARED_INLINE_P (STRIP_TEMPLATE (t))));
5521 }
5522 
5523 /* True if T was declared in a function that might be constexpr: either a
5524    function that was declared constexpr, or a C++17 lambda op().  */
5525 
5526 bool
var_in_maybe_constexpr_fn(tree t)5527 var_in_maybe_constexpr_fn (tree t)
5528 {
5529   return (DECL_FUNCTION_SCOPE_P (t)
5530 	  && maybe_constexpr_fn (DECL_CONTEXT (t)));
5531 }
5532 
5533 /* We're assigning INIT to TARGET.  In do_build_copy_constructor and
5534    build_over_call we implement trivial copy of a class with tail padding using
5535    assignment of character arrays, which is valid in normal code, but not in
5536    constexpr evaluation.  We don't need to worry about clobbering tail padding
5537    in constexpr evaluation, so strip the type punning.  */
5538 
5539 static void
maybe_simplify_trivial_copy(tree & target,tree & init)5540 maybe_simplify_trivial_copy (tree &target, tree &init)
5541 {
5542   if (TREE_CODE (target) == MEM_REF
5543       && TREE_CODE (init) == MEM_REF
5544       && TREE_TYPE (target) == TREE_TYPE (init)
5545       && TREE_CODE (TREE_TYPE (target)) == ARRAY_TYPE
5546       && TREE_TYPE (TREE_TYPE (target)) == unsigned_char_type_node)
5547     {
5548       target = build_fold_indirect_ref (TREE_OPERAND (target, 0));
5549       init = build_fold_indirect_ref (TREE_OPERAND (init, 0));
5550     }
5551 }
5552 
5553 /* Returns true if REF, which is a COMPONENT_REF, has any fields
5554    of constant type.  This does not check for 'mutable', so the
5555    caller is expected to be mindful of that.  */
5556 
5557 static bool
cref_has_const_field(tree ref)5558 cref_has_const_field (tree ref)
5559 {
5560   while (TREE_CODE (ref) == COMPONENT_REF)
5561     {
5562       if (CP_TYPE_CONST_P (TREE_TYPE (TREE_OPERAND (ref, 1))))
5563        return true;
5564       ref = TREE_OPERAND (ref, 0);
5565     }
5566   return false;
5567 }
5568 
5569 /* Return true if we are modifying something that is const during constant
5570    expression evaluation.  CODE is the code of the statement, OBJ is the
5571    object in question, MUTABLE_P is true if one of the subobjects were
5572    declared mutable.  */
5573 
5574 static bool
modifying_const_object_p(tree_code code,tree obj,bool mutable_p)5575 modifying_const_object_p (tree_code code, tree obj, bool mutable_p)
5576 {
5577   /* If this is initialization, there's no problem.  */
5578   if (code != MODIFY_EXPR)
5579     return false;
5580 
5581   /* [basic.type.qualifier] "A const object is an object of type
5582      const T or a non-mutable subobject of a const object."  */
5583   if (mutable_p)
5584     return false;
5585 
5586   if (TREE_READONLY (obj))
5587     return true;
5588 
5589   if (CP_TYPE_CONST_P (TREE_TYPE (obj)))
5590     {
5591       /* Although a COMPONENT_REF may have a const type, we should
5592 	 only consider it modifying a const object when any of the
5593 	 field components is const.  This can happen when using
5594 	 constructs such as const_cast<const T &>(m), making something
5595 	 const even though it wasn't declared const.  */
5596       if (TREE_CODE (obj) == COMPONENT_REF)
5597 	return cref_has_const_field (obj);
5598       else
5599 	return true;
5600     }
5601 
5602   return false;
5603 }
5604 
5605 /* Evaluate an INIT_EXPR or MODIFY_EXPR.  */
5606 
5607 static tree
cxx_eval_store_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)5608 cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
5609 			   bool lval,
5610 			   bool *non_constant_p, bool *overflow_p)
5611 {
5612   constexpr_ctx new_ctx = *ctx;
5613 
5614   tree init = TREE_OPERAND (t, 1);
5615   if (TREE_CLOBBER_P (init))
5616     /* Just ignore clobbers.  */
5617     return void_node;
5618 
5619   /* First we figure out where we're storing to.  */
5620   tree target = TREE_OPERAND (t, 0);
5621 
5622   maybe_simplify_trivial_copy (target, init);
5623 
5624   tree type = TREE_TYPE (target);
5625   bool preeval = SCALAR_TYPE_P (type) || TREE_CODE (t) == MODIFY_EXPR;
5626   if (preeval)
5627     {
5628       /* Evaluate the value to be stored without knowing what object it will be
5629 	 stored in, so that any side-effects happen first.  */
5630       if (!SCALAR_TYPE_P (type))
5631 	new_ctx.ctor = new_ctx.object = NULL_TREE;
5632       init = cxx_eval_constant_expression (&new_ctx, init, false,
5633 					   non_constant_p, overflow_p);
5634       if (*non_constant_p)
5635 	return t;
5636     }
5637 
5638   bool evaluated = false;
5639   if (lval)
5640     {
5641       /* If we want to return a reference to the target, we need to evaluate it
5642 	 as a whole; otherwise, only evaluate the innermost piece to avoid
5643 	 building up unnecessary *_REFs.  */
5644       target = cxx_eval_constant_expression (ctx, target, true,
5645 					     non_constant_p, overflow_p);
5646       evaluated = true;
5647       if (*non_constant_p)
5648 	return t;
5649     }
5650 
5651   /* Find the underlying variable.  */
5652   releasing_vec refs;
5653   tree object = NULL_TREE;
5654   /* If we're modifying a const object, save it.  */
5655   tree const_object_being_modified = NULL_TREE;
5656   bool mutable_p = false;
5657   for (tree probe = target; object == NULL_TREE; )
5658     {
5659       switch (TREE_CODE (probe))
5660 	{
5661 	case BIT_FIELD_REF:
5662 	case COMPONENT_REF:
5663 	case ARRAY_REF:
5664 	  {
5665 	    tree ob = TREE_OPERAND (probe, 0);
5666 	    tree elt = TREE_OPERAND (probe, 1);
5667 	    if (TREE_CODE (elt) == FIELD_DECL && DECL_MUTABLE_P (elt))
5668 	      mutable_p = true;
5669 	    if (TREE_CODE (probe) == ARRAY_REF)
5670 	      {
5671 		elt = eval_and_check_array_index (ctx, probe, false,
5672 						  non_constant_p, overflow_p);
5673 		if (*non_constant_p)
5674 		  return t;
5675 	      }
5676 	    /* We don't check modifying_const_object_p for ARRAY_REFs.  Given
5677 	       "int a[10]", an ARRAY_REF "a[2]" can be "const int", even though
5678 	       the array isn't const.  Instead, check "a" in the next iteration;
5679 	       that will detect modifying "const int a[10]".  */
5680 	    else if (evaluated
5681 		     && modifying_const_object_p (TREE_CODE (t), probe,
5682 						  mutable_p)
5683 		     && const_object_being_modified == NULL_TREE)
5684 	      const_object_being_modified = probe;
5685 	    vec_safe_push (refs, elt);
5686 	    vec_safe_push (refs, TREE_TYPE (probe));
5687 	    probe = ob;
5688 	  }
5689 	  break;
5690 
5691 	default:
5692 	  if (evaluated)
5693 	    object = probe;
5694 	  else
5695 	    {
5696 	      probe = cxx_eval_constant_expression (ctx, probe, true,
5697 						    non_constant_p, overflow_p);
5698 	      evaluated = true;
5699 	      if (*non_constant_p)
5700 		return t;
5701 	    }
5702 	  break;
5703 	}
5704     }
5705 
5706   if (modifying_const_object_p (TREE_CODE (t), object, mutable_p)
5707       && const_object_being_modified == NULL_TREE)
5708     const_object_being_modified = object;
5709 
5710   /* And then find/build up our initializer for the path to the subobject
5711      we're initializing.  */
5712   tree *valp;
5713   if (DECL_P (object))
5714     valp = ctx->global->values.get (object);
5715   else
5716     valp = NULL;
5717   if (!valp)
5718     {
5719       /* A constant-expression cannot modify objects from outside the
5720 	 constant-expression.  */
5721       if (!ctx->quiet)
5722 	error ("modification of %qE is not a constant expression", object);
5723       *non_constant_p = true;
5724       return t;
5725     }
5726   type = TREE_TYPE (object);
5727   bool no_zero_init = true;
5728 
5729   releasing_vec ctors, indexes;
5730   auto_vec<int> index_pos_hints;
5731   bool activated_union_member_p = false;
5732   while (!refs->is_empty ())
5733     {
5734       if (*valp == NULL_TREE)
5735 	{
5736 	  *valp = build_constructor (type, NULL);
5737 	  CONSTRUCTOR_NO_CLEARING (*valp) = no_zero_init;
5738 	}
5739       else if (STRIP_ANY_LOCATION_WRAPPER (*valp),
5740 	       TREE_CODE (*valp) == STRING_CST)
5741 	{
5742 	  /* An array was initialized with a string constant, and now
5743 	     we're writing into one of its elements.  Explode the
5744 	     single initialization into a set of element
5745 	     initializations.  */
5746 	  gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
5747 
5748 	  tree string = *valp;
5749 	  tree elt_type = TREE_TYPE (type);
5750 	  unsigned chars_per_elt = (TYPE_PRECISION (elt_type)
5751 				    / TYPE_PRECISION (char_type_node));
5752 	  unsigned num_elts = TREE_STRING_LENGTH (string) / chars_per_elt;
5753 	  tree ary_ctor = build_constructor (type, NULL);
5754 
5755 	  vec_safe_reserve (CONSTRUCTOR_ELTS (ary_ctor), num_elts);
5756 	  for (unsigned ix = 0; ix != num_elts; ix++)
5757 	    {
5758 	      constructor_elt elt =
5759 		{
5760 		  build_int_cst (size_type_node, ix),
5761 		  extract_string_elt (string, chars_per_elt, ix)
5762 		};
5763 	      CONSTRUCTOR_ELTS (ary_ctor)->quick_push (elt);
5764 	    }
5765 
5766 	  *valp = ary_ctor;
5767 	}
5768 
5769       /* If the value of object is already zero-initialized, any new ctors for
5770 	 subobjects will also be zero-initialized.  */
5771       no_zero_init = CONSTRUCTOR_NO_CLEARING (*valp);
5772 
5773       enum tree_code code = TREE_CODE (type);
5774       type = refs->pop();
5775       tree index = refs->pop();
5776 
5777       if (code == RECORD_TYPE && is_empty_field (index))
5778 	/* Don't build a sub-CONSTRUCTOR for an empty base or field, as they
5779 	   have no data and might have an offset lower than previously declared
5780 	   fields, which confuses the middle-end.  The code below will notice
5781 	   that we don't have a CONSTRUCTOR for our inner target and just
5782 	   return init.  */
5783 	break;
5784 
5785       if (code == UNION_TYPE && CONSTRUCTOR_NELTS (*valp)
5786 	  && CONSTRUCTOR_ELT (*valp, 0)->index != index)
5787 	{
5788 	  if (cxx_dialect < cxx20)
5789 	    {
5790 	      if (!ctx->quiet)
5791 		error_at (cp_expr_loc_or_input_loc (t),
5792 			  "change of the active member of a union "
5793 			  "from %qD to %qD",
5794 			  CONSTRUCTOR_ELT (*valp, 0)->index,
5795 			  index);
5796 	      *non_constant_p = true;
5797 	    }
5798 	  else if (TREE_CODE (t) == MODIFY_EXPR
5799 		   && CONSTRUCTOR_NO_CLEARING (*valp))
5800 	    {
5801 	      /* Diagnose changing the active union member while the union
5802 		 is in the process of being initialized.  */
5803 	      if (!ctx->quiet)
5804 		error_at (cp_expr_loc_or_input_loc (t),
5805 			  "change of the active member of a union "
5806 			  "from %qD to %qD during initialization",
5807 			  CONSTRUCTOR_ELT (*valp, 0)->index,
5808 			  index);
5809 	      *non_constant_p = true;
5810 	    }
5811 	  no_zero_init = true;
5812 	}
5813 
5814       vec_safe_push (ctors, *valp);
5815       vec_safe_push (indexes, index);
5816 
5817       constructor_elt *cep
5818 	= get_or_insert_ctor_field (*valp, index);
5819       index_pos_hints.safe_push (cep - CONSTRUCTOR_ELTS (*valp)->begin());
5820 
5821       if (code == UNION_TYPE)
5822 	activated_union_member_p = true;
5823 
5824       valp = &cep->value;
5825     }
5826 
5827   /* Detect modifying a constant object in constexpr evaluation.
5828      We have found a const object that is being modified.  Figure out
5829      if we need to issue an error.  Consider
5830 
5831      struct A {
5832        int n;
5833        constexpr A() : n(1) { n = 2; } // #1
5834      };
5835      struct B {
5836        const A a;
5837        constexpr B() { a.n = 3; } // #2
5838      };
5839     constexpr B b{};
5840 
5841     #1 is OK, since we're modifying an object under construction, but
5842     #2 is wrong, since "a" is const and has been fully constructed.
5843     To track it, we use the TREE_READONLY bit in the object's CONSTRUCTOR
5844     which means that the object is read-only.  For the example above, the
5845     *ctors stack at the point of #2 will look like:
5846 
5847       ctors[0] = {.a={.n=2}}  TREE_READONLY = 0
5848       ctors[1] = {.n=2}       TREE_READONLY = 1
5849 
5850     and we're modifying "b.a", so we search the stack and see if the
5851     constructor for "b.a" has already run.  */
5852   if (const_object_being_modified)
5853     {
5854       bool fail = false;
5855       tree const_objtype
5856 	= strip_array_types (TREE_TYPE (const_object_being_modified));
5857       if (!CLASS_TYPE_P (const_objtype))
5858 	fail = true;
5859       else
5860 	{
5861 	  /* [class.ctor]p5 "A constructor can be invoked for a const,
5862 	     volatile, or const volatile object.  const and volatile
5863 	     semantics are not applied on an object under construction.
5864 	     They come into effect when the constructor for the most
5865 	     derived object ends."  */
5866 	  for (tree elt : *ctors)
5867 	    if (same_type_ignoring_top_level_qualifiers_p
5868 		(TREE_TYPE (const_object_being_modified), TREE_TYPE (elt)))
5869 	      {
5870 		fail = TREE_READONLY (elt);
5871 		break;
5872 	      }
5873 	}
5874       if (fail)
5875 	{
5876 	  if (!ctx->quiet)
5877 	    modifying_const_object_error (t, const_object_being_modified);
5878 	  *non_constant_p = true;
5879 	  return t;
5880 	}
5881     }
5882 
5883   if (!preeval)
5884     {
5885       /* We're handling an INIT_EXPR of class type, so the value of the
5886 	 initializer can depend on the object it's initializing.  */
5887 
5888       /* Create a new CONSTRUCTOR in case evaluation of the initializer
5889 	 wants to modify it.  */
5890       if (*valp == NULL_TREE)
5891 	{
5892 	  *valp = build_constructor (type, NULL);
5893 	  CONSTRUCTOR_NO_CLEARING (*valp) = no_zero_init;
5894 	}
5895       new_ctx.ctor = *valp;
5896       new_ctx.object = target;
5897       /* Avoid temporary materialization when initializing from a TARGET_EXPR.
5898 	 We don't need to mess with AGGR_EXPR_SLOT/VEC_INIT_EXPR_SLOT because
5899 	 expansion of those trees uses ctx instead.  */
5900       if (TREE_CODE (init) == TARGET_EXPR)
5901 	if (tree tinit = TARGET_EXPR_INITIAL (init))
5902 	  init = tinit;
5903       init = cxx_eval_constant_expression (&new_ctx, init, false,
5904 					   non_constant_p, overflow_p);
5905       /* The hash table might have moved since the get earlier, and the
5906 	 initializer might have mutated the underlying CONSTRUCTORs, so we must
5907 	 recompute VALP. */
5908       valp = ctx->global->values.get (object);
5909       for (unsigned i = 0; i < vec_safe_length (indexes); i++)
5910 	{
5911 	  constructor_elt *cep
5912 	    = get_or_insert_ctor_field (*valp, indexes[i], index_pos_hints[i]);
5913 	  valp = &cep->value;
5914 	}
5915     }
5916 
5917   /* Don't share a CONSTRUCTOR that might be changed later.  */
5918   init = unshare_constructor (init);
5919 
5920   if (*valp && TREE_CODE (*valp) == CONSTRUCTOR
5921       && TREE_CODE (init) == CONSTRUCTOR)
5922     {
5923       /* An outer ctx->ctor might be pointing to *valp, so replace
5924 	 its contents.  */
5925       if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init),
5926 						      TREE_TYPE (*valp)))
5927 	{
5928 	  /* For initialization of an empty base, the original target will be
5929 	   *(base*)this, evaluation of which resolves to the object
5930 	   argument, which has the derived type rather than the base type.  In
5931 	   this situation, just evaluate the initializer and return, since
5932 	   there's no actual data to store.  */
5933 	  gcc_assert (is_empty_class (TREE_TYPE (init)));
5934 	  return lval ? target : init;
5935 	}
5936       CONSTRUCTOR_ELTS (*valp) = CONSTRUCTOR_ELTS (init);
5937       TREE_CONSTANT (*valp) = TREE_CONSTANT (init);
5938       TREE_SIDE_EFFECTS (*valp) = TREE_SIDE_EFFECTS (init);
5939       CONSTRUCTOR_NO_CLEARING (*valp)
5940 	= CONSTRUCTOR_NO_CLEARING (init);
5941     }
5942   else if (TREE_CODE (init) == CONSTRUCTOR
5943 	   && !same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init),
5944 							  type))
5945     {
5946       /* See above on initialization of empty bases.  */
5947       gcc_assert (is_empty_class (TREE_TYPE (init)) && !lval);
5948       if (!*valp)
5949 	{
5950 	  /* But do make sure we have something in *valp.  */
5951 	  *valp = build_constructor (type, nullptr);
5952 	  CONSTRUCTOR_NO_CLEARING (*valp) = no_zero_init;
5953 	}
5954       return init;
5955     }
5956   else
5957     *valp = init;
5958 
5959   /* After initialization, 'const' semantics apply to the value of the
5960      object.  Make a note of this fact by marking the CONSTRUCTOR
5961      TREE_READONLY.  */
5962   if (TREE_CODE (t) == INIT_EXPR
5963       && TREE_CODE (*valp) == CONSTRUCTOR
5964       && TYPE_READONLY (type))
5965     {
5966       if (INDIRECT_REF_P (target)
5967 	  && (is_this_parameter
5968 	      (tree_strip_nop_conversions (TREE_OPERAND (target, 0)))))
5969 	/* We've just initialized '*this' (perhaps via the target
5970 	   constructor of a delegating constructor).  Leave it up to the
5971 	   caller that set 'this' to set TREE_READONLY appropriately.  */
5972 	gcc_checking_assert (same_type_ignoring_top_level_qualifiers_p
5973 			     (TREE_TYPE (target), type));
5974       else
5975 	TREE_READONLY (*valp) = true;
5976     }
5977 
5978   /* Update TREE_CONSTANT and TREE_SIDE_EFFECTS on enclosing
5979      CONSTRUCTORs, if any.  */
5980   bool c = TREE_CONSTANT (init);
5981   bool s = TREE_SIDE_EFFECTS (init);
5982   if (!c || s || activated_union_member_p)
5983     for (tree elt : *ctors)
5984       {
5985 	if (!c)
5986 	  TREE_CONSTANT (elt) = false;
5987 	if (s)
5988 	  TREE_SIDE_EFFECTS (elt) = true;
5989 	/* Clear CONSTRUCTOR_NO_CLEARING since we've activated a member of
5990 	   this union.  */
5991 	if (TREE_CODE (TREE_TYPE (elt)) == UNION_TYPE)
5992 	  CONSTRUCTOR_NO_CLEARING (elt) = false;
5993       }
5994 
5995   if (*non_constant_p)
5996     return t;
5997   else if (lval)
5998     return target;
5999   else
6000     return init;
6001 }
6002 
6003 /* Evaluate a ++ or -- expression.  */
6004 
6005 static tree
cxx_eval_increment_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)6006 cxx_eval_increment_expression (const constexpr_ctx *ctx, tree t,
6007 			      bool lval,
6008 			      bool *non_constant_p, bool *overflow_p)
6009 {
6010   enum tree_code code = TREE_CODE (t);
6011   tree type = TREE_TYPE (t);
6012   tree op = TREE_OPERAND (t, 0);
6013   tree offset = TREE_OPERAND (t, 1);
6014   gcc_assert (TREE_CONSTANT (offset));
6015 
6016   /* OFFSET is constant, but perhaps not constant enough.  We need to
6017      e.g. bash FLOAT_EXPRs to REAL_CSTs.  */
6018   offset = fold_simple (offset);
6019 
6020   /* The operand as an lvalue.  */
6021   op = cxx_eval_constant_expression (ctx, op, true,
6022 				     non_constant_p, overflow_p);
6023 
6024   /* The operand as an rvalue.  */
6025   tree val
6026     = cxx_eval_constant_expression (ctx, op, false,
6027 				    non_constant_p, overflow_p);
6028   /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
6029      a local array in a constexpr function.  */
6030   bool ptr = INDIRECT_TYPE_P (TREE_TYPE (val));
6031   if (!ptr)
6032     VERIFY_CONSTANT (val);
6033 
6034   /* The modified value.  */
6035   bool inc = (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR);
6036   tree mod;
6037   if (INDIRECT_TYPE_P (type))
6038     {
6039       /* The middle end requires pointers to use POINTER_PLUS_EXPR.  */
6040       offset = convert_to_ptrofftype (offset);
6041       if (!inc)
6042 	offset = fold_build1 (NEGATE_EXPR, TREE_TYPE (offset), offset);
6043       mod = fold_build2 (POINTER_PLUS_EXPR, type, val, offset);
6044     }
6045   else if (c_promoting_integer_type_p (type)
6046 	   && !TYPE_UNSIGNED (type)
6047 	   && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
6048     {
6049       offset = fold_convert (integer_type_node, offset);
6050       mod = fold_convert (integer_type_node, val);
6051       tree t = fold_build2 (inc ? PLUS_EXPR : MINUS_EXPR, integer_type_node,
6052 			    mod, offset);
6053       mod = fold_convert (type, t);
6054       if (TREE_OVERFLOW_P (mod) && !TREE_OVERFLOW_P (t))
6055 	TREE_OVERFLOW (mod) = false;
6056     }
6057   else
6058     mod = fold_build2 (inc ? PLUS_EXPR : MINUS_EXPR, type, val, offset);
6059   if (!ptr)
6060     VERIFY_CONSTANT (mod);
6061 
6062   /* Storing the modified value.  */
6063   tree store = build2_loc (cp_expr_loc_or_loc (t, input_location),
6064 			   MODIFY_EXPR, type, op, mod);
6065   mod = cxx_eval_constant_expression (ctx, store, lval,
6066 				      non_constant_p, overflow_p);
6067   ggc_free (store);
6068   if (*non_constant_p)
6069     return t;
6070 
6071   /* And the value of the expression.  */
6072   if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
6073     /* Prefix ops are lvalues, but the caller might want an rvalue;
6074        lval has already been taken into account in the store above.  */
6075     return mod;
6076   else
6077     /* Postfix ops are rvalues.  */
6078     return val;
6079 }
6080 
6081 /* Predicates for the meaning of *jump_target.  */
6082 
6083 static bool
returns(tree * jump_target)6084 returns (tree *jump_target)
6085 {
6086   return *jump_target
6087     && (TREE_CODE (*jump_target) == RETURN_EXPR
6088 	|| (TREE_CODE (*jump_target) == LABEL_DECL
6089 	    && LABEL_DECL_CDTOR (*jump_target)));
6090 }
6091 
6092 static bool
breaks(tree * jump_target)6093 breaks (tree *jump_target)
6094 {
6095   return *jump_target
6096     && ((TREE_CODE (*jump_target) == LABEL_DECL
6097 	 && LABEL_DECL_BREAK (*jump_target))
6098 	|| TREE_CODE (*jump_target) == BREAK_STMT
6099 	|| TREE_CODE (*jump_target) == EXIT_EXPR);
6100 }
6101 
6102 static bool
continues(tree * jump_target)6103 continues (tree *jump_target)
6104 {
6105   return *jump_target
6106     && ((TREE_CODE (*jump_target) == LABEL_DECL
6107 	 && LABEL_DECL_CONTINUE (*jump_target))
6108 	|| TREE_CODE (*jump_target) == CONTINUE_STMT);
6109 
6110 }
6111 
6112 static bool
switches(tree * jump_target)6113 switches (tree *jump_target)
6114 {
6115   return *jump_target
6116     && TREE_CODE (*jump_target) == INTEGER_CST;
6117 }
6118 
6119 /* Subroutine of cxx_eval_statement_list.  Determine whether the statement
6120    STMT matches *jump_target.  If we're looking for a case label and we see
6121    the default label, note it in ctx->css_state.  */
6122 
6123 static bool
label_matches(const constexpr_ctx * ctx,tree * jump_target,tree stmt)6124 label_matches (const constexpr_ctx *ctx, tree *jump_target, tree stmt)
6125 {
6126   switch (TREE_CODE (*jump_target))
6127     {
6128     case LABEL_DECL:
6129       if (TREE_CODE (stmt) == LABEL_EXPR
6130 	  && LABEL_EXPR_LABEL (stmt) == *jump_target)
6131 	return true;
6132       break;
6133 
6134     case INTEGER_CST:
6135       if (TREE_CODE (stmt) == CASE_LABEL_EXPR)
6136 	{
6137 	  gcc_assert (ctx->css_state != NULL);
6138 	  if (!CASE_LOW (stmt))
6139 	    {
6140 	      /* default: should appear just once in a SWITCH_EXPR
6141 		 body (excluding nested SWITCH_EXPR).  */
6142 	      gcc_assert (*ctx->css_state != css_default_seen);
6143 	      /* When evaluating SWITCH_EXPR body for the second time,
6144 		 return true for the default: label.  */
6145 	      if (*ctx->css_state == css_default_processing)
6146 		return true;
6147 	      *ctx->css_state = css_default_seen;
6148 	    }
6149 	  else if (CASE_HIGH (stmt))
6150 	    {
6151 	      if (tree_int_cst_le (CASE_LOW (stmt), *jump_target)
6152 		  && tree_int_cst_le (*jump_target, CASE_HIGH (stmt)))
6153 		return true;
6154 	    }
6155 	  else if (tree_int_cst_equal (*jump_target, CASE_LOW (stmt)))
6156 	    return true;
6157 	}
6158       break;
6159 
6160     case BREAK_STMT:
6161     case CONTINUE_STMT:
6162       /* These two are handled directly in cxx_eval_loop_expr by testing
6163 	 breaks (jump_target) or continues (jump_target).  */
6164       break;
6165 
6166     default:
6167       gcc_unreachable ();
6168     }
6169   return false;
6170 }
6171 
6172 /* Evaluate a STATEMENT_LIST for side-effects.  Handles various jump
6173    semantics, for switch, break, continue, and return.  */
6174 
6175 static tree
cxx_eval_statement_list(const constexpr_ctx * ctx,tree t,bool * non_constant_p,bool * overflow_p,tree * jump_target)6176 cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
6177 			 bool *non_constant_p, bool *overflow_p,
6178 			 tree *jump_target)
6179 {
6180   tree local_target;
6181   /* In a statement-expression we want to return the last value.
6182      For empty statement expression return void_node.  */
6183   tree r = void_node;
6184   if (!jump_target)
6185     {
6186       local_target = NULL_TREE;
6187       jump_target = &local_target;
6188     }
6189   for (tree stmt : tsi_range (t))
6190     {
6191       /* We've found a continue, so skip everything until we reach
6192 	 the label its jumping to.  */
6193       if (continues (jump_target))
6194 	{
6195 	  if (label_matches (ctx, jump_target, stmt))
6196 	    /* Found it.  */
6197 	    *jump_target = NULL_TREE;
6198 	  else
6199 	    continue;
6200 	}
6201       if (TREE_CODE (stmt) == DEBUG_BEGIN_STMT)
6202 	continue;
6203       r = cxx_eval_constant_expression (ctx, stmt, false,
6204 					non_constant_p, overflow_p,
6205 					jump_target);
6206       if (*non_constant_p)
6207 	break;
6208       if (returns (jump_target) || breaks (jump_target))
6209 	break;
6210     }
6211   if (*jump_target && jump_target == &local_target)
6212     {
6213       /* We aren't communicating the jump to our caller, so give up.  We don't
6214 	 need to support evaluation of jumps out of statement-exprs.  */
6215       if (!ctx->quiet)
6216 	error_at (cp_expr_loc_or_input_loc (r),
6217 		  "statement is not a constant expression");
6218       *non_constant_p = true;
6219     }
6220   return r;
6221 }
6222 
6223 /* Evaluate a LOOP_EXPR for side-effects.  Handles break and return
6224    semantics; continue semantics are covered by cxx_eval_statement_list.  */
6225 
6226 static tree
cxx_eval_loop_expr(const constexpr_ctx * ctx,tree t,bool * non_constant_p,bool * overflow_p,tree * jump_target)6227 cxx_eval_loop_expr (const constexpr_ctx *ctx, tree t,
6228 		    bool *non_constant_p, bool *overflow_p,
6229 		    tree *jump_target)
6230 {
6231   constexpr_ctx new_ctx = *ctx;
6232   tree local_target;
6233   if (!jump_target)
6234     {
6235       local_target = NULL_TREE;
6236       jump_target = &local_target;
6237     }
6238 
6239   tree body, cond = NULL_TREE, expr = NULL_TREE;
6240   int count = 0;
6241   switch (TREE_CODE (t))
6242     {
6243     case LOOP_EXPR:
6244       body = LOOP_EXPR_BODY (t);
6245       break;
6246     case DO_STMT:
6247       body = DO_BODY (t);
6248       cond = DO_COND (t);
6249       break;
6250     case WHILE_STMT:
6251       body = WHILE_BODY (t);
6252       cond = WHILE_COND (t);
6253       count = -1;
6254       break;
6255     case FOR_STMT:
6256       if (FOR_INIT_STMT (t))
6257 	cxx_eval_constant_expression (ctx, FOR_INIT_STMT (t), /*lval*/false,
6258 				      non_constant_p, overflow_p, jump_target);
6259       if (*non_constant_p)
6260 	return NULL_TREE;
6261       body = FOR_BODY (t);
6262       cond = FOR_COND (t);
6263       expr = FOR_EXPR (t);
6264       count = -1;
6265       break;
6266     default:
6267       gcc_unreachable ();
6268     }
6269   auto_vec<tree, 10> save_exprs;
6270   new_ctx.save_exprs = &save_exprs;
6271   do
6272     {
6273       if (count != -1)
6274 	{
6275 	  if (body)
6276 	    cxx_eval_constant_expression (&new_ctx, body, /*lval*/false,
6277 					  non_constant_p, overflow_p,
6278 					  jump_target);
6279 	  if (breaks (jump_target))
6280 	    {
6281 	      *jump_target = NULL_TREE;
6282 	      break;
6283 	    }
6284 
6285 	  if (TREE_CODE (t) != LOOP_EXPR && continues (jump_target))
6286 	    *jump_target = NULL_TREE;
6287 
6288 	  if (expr)
6289 	    cxx_eval_constant_expression (&new_ctx, expr, /*lval*/false,
6290 					  non_constant_p, overflow_p,
6291 					  jump_target);
6292 	}
6293 
6294       if (cond)
6295 	{
6296 	  tree res
6297 	    = cxx_eval_constant_expression (&new_ctx, cond, /*lval*/false,
6298 					    non_constant_p, overflow_p,
6299 					    jump_target);
6300 	  if (res)
6301 	    {
6302 	      if (verify_constant (res, ctx->quiet, non_constant_p,
6303 				   overflow_p))
6304 		break;
6305 	      if (integer_zerop (res))
6306 		break;
6307 	    }
6308 	  else
6309 	    gcc_assert (*jump_target);
6310 	}
6311 
6312       /* Forget saved values of SAVE_EXPRs and TARGET_EXPRs.  */
6313       for (tree save_expr : save_exprs)
6314 	ctx->global->values.remove (save_expr);
6315       save_exprs.truncate (0);
6316 
6317       if (++count >= constexpr_loop_limit)
6318 	{
6319 	  if (!ctx->quiet)
6320 	    error_at (cp_expr_loc_or_input_loc (t),
6321 		      "%<constexpr%> loop iteration count exceeds limit of %d "
6322 		      "(use %<-fconstexpr-loop-limit=%> to increase the limit)",
6323 		      constexpr_loop_limit);
6324 	  *non_constant_p = true;
6325 	  break;
6326 	}
6327     }
6328   while (!returns (jump_target)
6329 	 && !breaks (jump_target)
6330 	 && !continues (jump_target)
6331 	 && (!switches (jump_target) || count == 0)
6332 	 && !*non_constant_p);
6333 
6334   /* Forget saved values of SAVE_EXPRs and TARGET_EXPRs.  */
6335   for (tree save_expr : save_exprs)
6336     ctx->global->values.remove (save_expr);
6337 
6338   return NULL_TREE;
6339 }
6340 
6341 /* Evaluate a SWITCH_EXPR for side-effects.  Handles switch and break jump
6342    semantics.  */
6343 
6344 static tree
cxx_eval_switch_expr(const constexpr_ctx * ctx,tree t,bool * non_constant_p,bool * overflow_p,tree * jump_target)6345 cxx_eval_switch_expr (const constexpr_ctx *ctx, tree t,
6346 		      bool *non_constant_p, bool *overflow_p,
6347 		      tree *jump_target)
6348 {
6349   tree cond
6350     = TREE_CODE (t) == SWITCH_STMT ? SWITCH_STMT_COND (t) : SWITCH_COND (t);
6351   cond = cxx_eval_constant_expression (ctx, cond, false,
6352 				       non_constant_p, overflow_p);
6353   VERIFY_CONSTANT (cond);
6354   *jump_target = cond;
6355 
6356   tree body
6357     = TREE_CODE (t) == SWITCH_STMT ? SWITCH_STMT_BODY (t) : SWITCH_BODY (t);
6358   constexpr_ctx new_ctx = *ctx;
6359   constexpr_switch_state css = css_default_not_seen;
6360   new_ctx.css_state = &css;
6361   cxx_eval_constant_expression (&new_ctx, body, false,
6362 				non_constant_p, overflow_p, jump_target);
6363   if (switches (jump_target) && css == css_default_seen)
6364     {
6365       /* If the SWITCH_EXPR body has default: label, process it once again,
6366 	 this time instructing label_matches to return true for default:
6367 	 label on switches (jump_target).  */
6368       css = css_default_processing;
6369       cxx_eval_constant_expression (&new_ctx, body, false,
6370 				    non_constant_p, overflow_p, jump_target);
6371     }
6372   if (breaks (jump_target) || switches (jump_target))
6373     *jump_target = NULL_TREE;
6374   return NULL_TREE;
6375 }
6376 
6377 /* Find the object of TYPE under initialization in CTX.  */
6378 
6379 static tree
lookup_placeholder(const constexpr_ctx * ctx,bool lval,tree type)6380 lookup_placeholder (const constexpr_ctx *ctx, bool lval, tree type)
6381 {
6382   if (!ctx)
6383     return NULL_TREE;
6384 
6385   /* Prefer the outermost matching object, but don't cross
6386      CONSTRUCTOR_PLACEHOLDER_BOUNDARY constructors.  */
6387   if (ctx->ctor && !CONSTRUCTOR_PLACEHOLDER_BOUNDARY (ctx->ctor))
6388     if (tree outer_ob = lookup_placeholder (ctx->parent, lval, type))
6389       return outer_ob;
6390 
6391   /* We could use ctx->object unconditionally, but using ctx->ctor when we
6392      can is a minor optimization.  */
6393   if (!lval && ctx->ctor && same_type_p (TREE_TYPE (ctx->ctor), type))
6394     return ctx->ctor;
6395 
6396   if (!ctx->object)
6397     return NULL_TREE;
6398 
6399   /* Since an object cannot have a field of its own type, we can search outward
6400      from ctx->object to find the unique containing object of TYPE.  */
6401   tree ob = ctx->object;
6402   while (ob)
6403     {
6404       if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (ob), type))
6405 	break;
6406       if (handled_component_p (ob))
6407 	ob = TREE_OPERAND (ob, 0);
6408       else
6409 	ob = NULL_TREE;
6410     }
6411 
6412   return ob;
6413 }
6414 
6415 /* Complain about an attempt to evaluate inline assembly.  */
6416 
6417 static void
inline_asm_in_constexpr_error(location_t loc)6418 inline_asm_in_constexpr_error (location_t loc)
6419 {
6420   auto_diagnostic_group d;
6421   error_at (loc, "inline assembly is not a constant expression");
6422   inform (loc, "only unevaluated inline assembly is allowed in a "
6423 	  "%<constexpr%> function in C++20");
6424 }
6425 
6426 /* We're getting the constant value of DECL in a manifestly constant-evaluated
6427    context; maybe complain about that.  */
6428 
6429 static void
maybe_warn_about_constant_value(location_t loc,tree decl)6430 maybe_warn_about_constant_value (location_t loc, tree decl)
6431 {
6432   static bool explained = false;
6433   if (cxx_dialect >= cxx17
6434       && warn_interference_size
6435       && !OPTION_SET_P (param_destruct_interfere_size)
6436       && DECL_CONTEXT (decl) == std_node
6437       && id_equal (DECL_NAME (decl), "hardware_destructive_interference_size")
6438       && (LOCATION_FILE (input_location) != main_input_filename
6439 	  || module_exporting_p ())
6440       && warning_at (loc, OPT_Winterference_size, "use of %qD", decl)
6441       && !explained)
6442     {
6443       explained = true;
6444       inform (loc, "its value can vary between compiler versions or "
6445 	      "with different %<-mtune%> or %<-mcpu%> flags");
6446       inform (loc, "if this use is part of a public ABI, change it to "
6447 	      "instead use a constant variable you define");
6448       inform (loc, "the default value for the current CPU tuning "
6449 	      "is %d bytes", param_destruct_interfere_size);
6450       inform (loc, "you can stabilize this value with %<--param "
6451 	      "hardware_destructive_interference_size=%d%>, or disable "
6452 	      "this warning with %<-Wno-interference-size%>",
6453 	      param_destruct_interfere_size);
6454     }
6455 }
6456 
6457 /* For element type ELT_TYPE, return the appropriate type of the heap object
6458    containing such element(s).  COOKIE_SIZE is NULL or the size of cookie
6459    in bytes.  If COOKIE_SIZE is NULL, return array type
6460    ELT_TYPE[FULL_SIZE / sizeof(ELT_TYPE)], otherwise return
6461    struct { size_t[COOKIE_SIZE/sizeof(size_t)]; ELT_TYPE[N]; }
6462    where N is is computed such that the size of the struct fits into FULL_SIZE.
6463    If ARG_SIZE is non-NULL, it is the first argument to the new operator.
6464    It should be passed if ELT_TYPE is zero sized type in which case FULL_SIZE
6465    will be also 0 and so it is not possible to determine the actual array
6466    size.  CTX, NON_CONSTANT_P and OVERFLOW_P are used during constant
6467    expression evaluation of subexpressions of ARG_SIZE.  */
6468 
6469 static tree
build_new_constexpr_heap_type(const constexpr_ctx * ctx,tree elt_type,tree cookie_size,tree full_size,tree arg_size,bool * non_constant_p,bool * overflow_p)6470 build_new_constexpr_heap_type (const constexpr_ctx *ctx, tree elt_type,
6471 			       tree cookie_size, tree full_size, tree arg_size,
6472 			       bool *non_constant_p, bool *overflow_p)
6473 {
6474   gcc_assert (cookie_size == NULL_TREE || tree_fits_uhwi_p (cookie_size));
6475   gcc_assert (tree_fits_uhwi_p (full_size));
6476   unsigned HOST_WIDE_INT csz = cookie_size ? tree_to_uhwi (cookie_size) : 0;
6477   if (arg_size)
6478     {
6479       STRIP_NOPS (arg_size);
6480       if (cookie_size)
6481 	{
6482 	  if (TREE_CODE (arg_size) != PLUS_EXPR)
6483 	    arg_size = NULL_TREE;
6484 	  else if (TREE_CODE (TREE_OPERAND (arg_size, 0)) == INTEGER_CST
6485 		   && tree_int_cst_equal (cookie_size,
6486 					  TREE_OPERAND (arg_size, 0)))
6487 	    {
6488 	      arg_size = TREE_OPERAND (arg_size, 1);
6489 	      STRIP_NOPS (arg_size);
6490 	    }
6491 	  else if (TREE_CODE (TREE_OPERAND (arg_size, 1)) == INTEGER_CST
6492 		   && tree_int_cst_equal (cookie_size,
6493 					  TREE_OPERAND (arg_size, 1)))
6494 	    {
6495 	      arg_size = TREE_OPERAND (arg_size, 0);
6496 	      STRIP_NOPS (arg_size);
6497 	    }
6498 	  else
6499 	    arg_size = NULL_TREE;
6500 	}
6501       if (arg_size && TREE_CODE (arg_size) == MULT_EXPR)
6502 	{
6503 	  tree op0 = TREE_OPERAND (arg_size, 0);
6504 	  tree op1 = TREE_OPERAND (arg_size, 1);
6505 	  if (integer_zerop (op0))
6506 	    arg_size
6507 	      = cxx_eval_constant_expression (ctx, op1, false, non_constant_p,
6508 					      overflow_p);
6509 	  else if (integer_zerop (op1))
6510 	    arg_size
6511 	      = cxx_eval_constant_expression (ctx, op0, false, non_constant_p,
6512 					      overflow_p);
6513 	  else
6514 	    arg_size = NULL_TREE;
6515 	}
6516       else
6517 	arg_size = NULL_TREE;
6518     }
6519 
6520   unsigned HOST_WIDE_INT fsz = tree_to_uhwi (arg_size ? arg_size : full_size);
6521   if (!arg_size)
6522     {
6523       unsigned HOST_WIDE_INT esz = int_size_in_bytes (elt_type);
6524       gcc_assert (fsz >= csz);
6525       fsz -= csz;
6526       if (esz)
6527 	fsz /= esz;
6528     }
6529   tree itype2 = build_index_type (size_int (fsz - 1));
6530   if (!cookie_size)
6531     return build_cplus_array_type (elt_type, itype2);
6532   return build_new_constexpr_heap_type (elt_type, cookie_size, itype2);
6533 }
6534 
6535 /* Attempt to reduce the expression T to a constant value.
6536    On failure, issue diagnostic and return error_mark_node.  */
6537 /* FIXME unify with c_fully_fold */
6538 /* FIXME overflow_p is too global */
6539 
6540 static tree
cxx_eval_constant_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p,tree * jump_target)6541 cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
6542 			      bool lval,
6543 			      bool *non_constant_p, bool *overflow_p,
6544 			      tree *jump_target /* = NULL */)
6545 {
6546   if (jump_target && *jump_target)
6547     {
6548       /* If we are jumping, ignore all statements/expressions except those
6549 	 that could have LABEL_EXPR or CASE_LABEL_EXPR in their bodies.  */
6550       switch (TREE_CODE (t))
6551 	{
6552 	case BIND_EXPR:
6553 	case STATEMENT_LIST:
6554 	case LOOP_EXPR:
6555 	case COND_EXPR:
6556 	case IF_STMT:
6557 	case DO_STMT:
6558 	case WHILE_STMT:
6559 	case FOR_STMT:
6560 	  break;
6561 	case LABEL_EXPR:
6562 	case CASE_LABEL_EXPR:
6563 	  if (label_matches (ctx, jump_target, t))
6564 	    /* Found it.  */
6565 	    *jump_target = NULL_TREE;
6566 	  return NULL_TREE;
6567 	default:
6568 	  return NULL_TREE;
6569 	}
6570     }
6571   if (error_operand_p (t))
6572     {
6573       *non_constant_p = true;
6574       return t;
6575     }
6576 
6577   location_t loc = cp_expr_loc_or_input_loc (t);
6578 
6579   STRIP_ANY_LOCATION_WRAPPER (t);
6580 
6581   if (CONSTANT_CLASS_P (t))
6582     {
6583       if (TREE_OVERFLOW (t))
6584 	{
6585 	  if (!ctx->quiet)
6586 	    permerror (input_location, "overflow in constant expression");
6587 	  if (!flag_permissive || ctx->quiet)
6588 	    *overflow_p = true;
6589 	}
6590 
6591       if (TREE_CODE (t) == INTEGER_CST
6592 	  && TYPE_PTR_P (TREE_TYPE (t))
6593 	  /* INTEGER_CST with pointer-to-method type is only used
6594 	     for a virtual method in a pointer to member function.
6595 	     Don't reject those.  */
6596 	  && TREE_CODE (TREE_TYPE (TREE_TYPE (t))) != METHOD_TYPE
6597 	  && !integer_zerop (t))
6598 	{
6599 	  if (!ctx->quiet)
6600 	    error ("value %qE of type %qT is not a constant expression",
6601 		   t, TREE_TYPE (t));
6602 	  *non_constant_p = true;
6603 	}
6604 
6605       return t;
6606     }
6607 
6608   /* Avoid excessively long constexpr evaluations.  */
6609   if (++ctx->global->constexpr_ops_count >= constexpr_ops_limit)
6610     {
6611       if (!ctx->quiet)
6612 	error_at (loc,
6613 		  "%<constexpr%> evaluation operation count exceeds limit of "
6614 		  "%wd (use %<-fconstexpr-ops-limit=%> to increase the limit)",
6615 		  constexpr_ops_limit);
6616       ctx->global->constexpr_ops_count = INTTYPE_MINIMUM (HOST_WIDE_INT);
6617       *non_constant_p = true;
6618       return t;
6619     }
6620 
6621   constexpr_ctx new_ctx;
6622   tree r = t;
6623 
6624   tree_code tcode = TREE_CODE (t);
6625   switch (tcode)
6626     {
6627     case RESULT_DECL:
6628       if (lval)
6629 	return t;
6630       /* We ask for an rvalue for the RESULT_DECL when indirecting
6631 	 through an invisible reference, or in named return value
6632 	 optimization.  */
6633       if (tree *p = ctx->global->values.get (t))
6634 	return *p;
6635       else
6636 	{
6637 	  if (!ctx->quiet)
6638 	    error ("%qE is not a constant expression", t);
6639 	  *non_constant_p = true;
6640 	}
6641       break;
6642 
6643     case VAR_DECL:
6644       if (DECL_HAS_VALUE_EXPR_P (t))
6645 	{
6646 	  if (is_normal_capture_proxy (t)
6647 	      && current_function_decl == DECL_CONTEXT (t))
6648 	    {
6649 	      /* Function parms aren't constexpr within the function
6650 		 definition, so don't try to look at the closure.  But if the
6651 		 captured variable is constant, try to evaluate it directly. */
6652 	      r = DECL_CAPTURED_VARIABLE (t);
6653 	      tree type = TREE_TYPE (t);
6654 	      if (TYPE_REF_P (type) != TYPE_REF_P (TREE_TYPE (r)))
6655 		{
6656 		  /* Adjust r to match the reference-ness of t.  */
6657 		  if (TYPE_REF_P (type))
6658 		    r = build_address (r);
6659 		  else
6660 		    r = convert_from_reference (r);
6661 		}
6662 	    }
6663 	  else
6664 	    r = DECL_VALUE_EXPR (t);
6665 	  return cxx_eval_constant_expression (ctx, r, lval, non_constant_p,
6666 					       overflow_p);
6667 	}
6668       /* fall through */
6669     case CONST_DECL:
6670       /* We used to not check lval for CONST_DECL, but darwin.cc uses
6671 	 CONST_DECL for aggregate constants.  */
6672       if (lval)
6673 	return t;
6674       else if (t == ctx->object)
6675 	return ctx->ctor;
6676       if (VAR_P (t))
6677 	if (tree *p = ctx->global->values.get (t))
6678 	  if (*p != NULL_TREE)
6679 	    {
6680 	      r = *p;
6681 	      break;
6682 	    }
6683       if (ctx->manifestly_const_eval)
6684 	maybe_warn_about_constant_value (loc, t);
6685       if (COMPLETE_TYPE_P (TREE_TYPE (t))
6686 	  && is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
6687 	{
6688 	  /* If the class is empty, we aren't actually loading anything.  */
6689 	  r = build_constructor (TREE_TYPE (t), NULL);
6690 	  TREE_CONSTANT (r) = true;
6691 	}
6692       else if (ctx->strict)
6693 	r = decl_really_constant_value (t, /*unshare_p=*/false);
6694       else
6695 	r = decl_constant_value (t, /*unshare_p=*/false);
6696       if (TREE_CODE (r) == TARGET_EXPR
6697 	  && TREE_CODE (TARGET_EXPR_INITIAL (r)) == CONSTRUCTOR)
6698 	r = TARGET_EXPR_INITIAL (r);
6699       if (DECL_P (r))
6700 	{
6701 	  if (!ctx->quiet)
6702 	    non_const_var_error (loc, r);
6703 	  *non_constant_p = true;
6704 	}
6705       break;
6706 
6707     case DEBUG_BEGIN_STMT:
6708       /* ??? It might be nice to retain this information somehow, so
6709 	 as to be able to step into a constexpr function call.  */
6710       /* Fall through.  */
6711 
6712     case FUNCTION_DECL:
6713     case TEMPLATE_DECL:
6714     case LABEL_DECL:
6715     case LABEL_EXPR:
6716     case CASE_LABEL_EXPR:
6717     case PREDICT_EXPR:
6718       return t;
6719 
6720     case PARM_DECL:
6721       if (lval && !TYPE_REF_P (TREE_TYPE (t)))
6722 	/* glvalue use.  */;
6723       else if (tree *p = ctx->global->values.get (r))
6724 	r = *p;
6725       else if (lval)
6726 	/* Defer in case this is only used for its type.  */;
6727       else if (COMPLETE_TYPE_P (TREE_TYPE (t))
6728 	       && is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
6729 	{
6730 	  /* If the class is empty, we aren't actually loading anything.  */
6731 	  r = build_constructor (TREE_TYPE (t), NULL);
6732 	  TREE_CONSTANT (r) = true;
6733 	}
6734       else
6735 	{
6736 	  if (!ctx->quiet)
6737 	    error ("%qE is not a constant expression", t);
6738 	  *non_constant_p = true;
6739 	}
6740       break;
6741 
6742     case CALL_EXPR:
6743     case AGGR_INIT_EXPR:
6744       r = cxx_eval_call_expression (ctx, t, lval,
6745 				    non_constant_p, overflow_p);
6746       break;
6747 
6748     case DECL_EXPR:
6749       {
6750 	r = DECL_EXPR_DECL (t);
6751 	if (TREE_CODE (r) == USING_DECL)
6752 	  {
6753 	    r = void_node;
6754 	    break;
6755 	  }
6756 
6757 	if (VAR_P (r)
6758 	    && (TREE_STATIC (r)
6759 		|| (CP_DECL_THREAD_LOCAL_P (r) && !DECL_REALLY_EXTERN (r)))
6760 	    /* Allow __FUNCTION__ etc.  */
6761 	    && !DECL_ARTIFICIAL (r))
6762 	  {
6763 	    if (!ctx->quiet)
6764 	      {
6765 		if (CP_DECL_THREAD_LOCAL_P (r))
6766 		  error_at (loc, "control passes through definition of %qD "
6767 				 "with thread storage duration", r);
6768 		else
6769 		  error_at (loc, "control passes through definition of %qD "
6770 				 "with static storage duration", r);
6771 	      }
6772 	    *non_constant_p = true;
6773 	    break;
6774 	  }
6775 
6776 	if (AGGREGATE_TYPE_P (TREE_TYPE (r))
6777 	    || VECTOR_TYPE_P (TREE_TYPE (r)))
6778 	  {
6779 	    new_ctx = *ctx;
6780 	    new_ctx.object = r;
6781 	    new_ctx.ctor = build_constructor (TREE_TYPE (r), NULL);
6782 	    CONSTRUCTOR_NO_CLEARING (new_ctx.ctor) = true;
6783 	    ctx->global->values.put (r, new_ctx.ctor);
6784 	    ctx = &new_ctx;
6785 	  }
6786 
6787 	if (tree init = DECL_INITIAL (r))
6788 	  {
6789 	    init = cxx_eval_constant_expression (ctx, init,
6790 						 false,
6791 						 non_constant_p, overflow_p);
6792 	    /* Don't share a CONSTRUCTOR that might be changed.  */
6793 	    init = unshare_constructor (init);
6794 	    /* Remember that a constant object's constructor has already
6795 	       run.  */
6796 	    if (CLASS_TYPE_P (TREE_TYPE (r))
6797 		&& CP_TYPE_CONST_P (TREE_TYPE (r)))
6798 	      TREE_READONLY (init) = true;
6799 	    ctx->global->values.put (r, init);
6800 	  }
6801 	else if (ctx == &new_ctx)
6802 	  /* We gave it a CONSTRUCTOR above.  */;
6803 	else
6804 	  ctx->global->values.put (r, NULL_TREE);
6805       }
6806       break;
6807 
6808     case TARGET_EXPR:
6809       {
6810 	tree type = TREE_TYPE (t);
6811 
6812 	if (!literal_type_p (type))
6813 	  {
6814 	    if (!ctx->quiet)
6815 	      {
6816 		auto_diagnostic_group d;
6817 		error ("temporary of non-literal type %qT in a "
6818 		       "constant expression", type);
6819 		explain_non_literal_class (type);
6820 	      }
6821 	    *non_constant_p = true;
6822 	    break;
6823 	  }
6824 	gcc_checking_assert (!TARGET_EXPR_DIRECT_INIT_P (t));
6825 	/* Avoid evaluating a TARGET_EXPR more than once.  */
6826 	tree slot = TARGET_EXPR_SLOT (t);
6827 	if (tree *p = ctx->global->values.get (slot))
6828 	  {
6829 	    if (lval)
6830 	      return slot;
6831 	    r = *p;
6832 	    break;
6833 	  }
6834 	if ((AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type)))
6835 	  {
6836 	    /* We're being expanded without an explicit target, so start
6837 	       initializing a new object; expansion with an explicit target
6838 	       strips the TARGET_EXPR before we get here.  */
6839 	    new_ctx = *ctx;
6840 	    /* Link CTX to NEW_CTX so that lookup_placeholder can resolve
6841 	       any PLACEHOLDER_EXPR within the initializer that refers to the
6842 	       former object under construction.  */
6843 	    new_ctx.parent = ctx;
6844 	    new_ctx.ctor = build_constructor (type, NULL);
6845 	    CONSTRUCTOR_NO_CLEARING (new_ctx.ctor) = true;
6846 	    new_ctx.object = slot;
6847 	    ctx->global->values.put (new_ctx.object, new_ctx.ctor);
6848 	    ctx = &new_ctx;
6849 	  }
6850 	/* Pass false for 'lval' because this indicates
6851 	   initialization of a temporary.  */
6852 	r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
6853 					  false,
6854 					  non_constant_p, overflow_p);
6855 	if (*non_constant_p)
6856 	  break;
6857 	/* If the initializer is complex, evaluate it to initialize slot.  */
6858 	bool is_complex = target_expr_needs_replace (t);
6859 	if (!is_complex)
6860 	  {
6861 	    r = unshare_constructor (r);
6862 	    /* Adjust the type of the result to the type of the temporary.  */
6863 	    r = adjust_temp_type (type, r);
6864 	    ctx->global->values.put (slot, r);
6865 	  }
6866 	if (TARGET_EXPR_CLEANUP (t) && !CLEANUP_EH_ONLY (t))
6867 	  ctx->global->cleanups->safe_push (TARGET_EXPR_CLEANUP (t));
6868 	if (ctx->save_exprs)
6869 	  ctx->save_exprs->safe_push (slot);
6870 	if (lval)
6871 	  return slot;
6872 	if (is_complex)
6873 	  r = *ctx->global->values.get (slot);
6874       }
6875       break;
6876 
6877     case INIT_EXPR:
6878     case MODIFY_EXPR:
6879       gcc_assert (jump_target == NULL || *jump_target == NULL_TREE);
6880       r = cxx_eval_store_expression (ctx, t, lval,
6881 				     non_constant_p, overflow_p);
6882       break;
6883 
6884     case SCOPE_REF:
6885       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
6886 					lval,
6887 					non_constant_p, overflow_p);
6888       break;
6889 
6890     case RETURN_EXPR:
6891       if (TREE_OPERAND (t, 0) != NULL_TREE)
6892 	r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
6893 					  lval,
6894 					  non_constant_p, overflow_p);
6895       /* FALLTHRU */
6896     case BREAK_STMT:
6897     case CONTINUE_STMT:
6898       if (jump_target)
6899 	*jump_target = t;
6900       else
6901 	{
6902 	  /* Can happen with ({ return true; }) && false; passed to
6903 	     maybe_constant_value.  There is nothing to jump over in this
6904 	     case, and the bug will be diagnosed later.  */
6905 	  gcc_assert (ctx->quiet);
6906 	  *non_constant_p = true;
6907 	}
6908       break;
6909 
6910     case SAVE_EXPR:
6911       /* Avoid evaluating a SAVE_EXPR more than once.  */
6912       if (tree *p = ctx->global->values.get (t))
6913 	r = *p;
6914       else
6915 	{
6916 	  r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), false,
6917 					    non_constant_p, overflow_p);
6918 	  if (*non_constant_p)
6919 	    break;
6920 	  ctx->global->values.put (t, r);
6921 	  if (ctx->save_exprs)
6922 	    ctx->save_exprs->safe_push (t);
6923 	}
6924       break;
6925 
6926     case TRY_CATCH_EXPR:
6927       if (TREE_OPERAND (t, 0) == NULL_TREE)
6928 	{
6929 	  r = void_node;
6930 	  break;
6931 	}
6932       /* FALLTHRU */
6933     case NON_LVALUE_EXPR:
6934     case TRY_BLOCK:
6935     case MUST_NOT_THROW_EXPR:
6936     case EXPR_STMT:
6937     case EH_SPEC_BLOCK:
6938       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
6939 					lval,
6940 					non_constant_p, overflow_p,
6941 					jump_target);
6942       break;
6943 
6944     case CLEANUP_POINT_EXPR:
6945       {
6946 	auto_vec<tree, 2> cleanups;
6947 	vec<tree> *prev_cleanups = ctx->global->cleanups;
6948 	ctx->global->cleanups = &cleanups;
6949 	r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
6950 					  lval,
6951 					  non_constant_p, overflow_p,
6952 					  jump_target);
6953 	ctx->global->cleanups = prev_cleanups;
6954 	unsigned int i;
6955 	tree cleanup;
6956 	/* Evaluate the cleanups.  */
6957 	FOR_EACH_VEC_ELT_REVERSE (cleanups, i, cleanup)
6958 	  cxx_eval_constant_expression (ctx, cleanup, false,
6959 					non_constant_p, overflow_p);
6960       }
6961       break;
6962 
6963     case TRY_FINALLY_EXPR:
6964       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
6965 					non_constant_p, overflow_p,
6966 					jump_target);
6967       if (!*non_constant_p)
6968 	/* Also evaluate the cleanup.  */
6969 	cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1), true,
6970 				      non_constant_p, overflow_p);
6971       break;
6972 
6973     case CLEANUP_STMT:
6974       r = cxx_eval_constant_expression (ctx, CLEANUP_BODY (t), lval,
6975 					non_constant_p, overflow_p,
6976 					jump_target);
6977       if (!CLEANUP_EH_ONLY (t) && !*non_constant_p)
6978 	{
6979 	  iloc_sentinel ils (loc);
6980 	  /* Also evaluate the cleanup.  */
6981 	  cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), true,
6982 					non_constant_p, overflow_p);
6983 	}
6984       break;
6985 
6986       /* These differ from cxx_eval_unary_expression in that this doesn't
6987 	 check for a constant operand or result; an address can be
6988 	 constant without its operand being, and vice versa.  */
6989     case MEM_REF:
6990     case INDIRECT_REF:
6991       r = cxx_eval_indirect_ref (ctx, t, lval,
6992 				 non_constant_p, overflow_p);
6993       break;
6994 
6995     case ADDR_EXPR:
6996       {
6997 	tree oldop = TREE_OPERAND (t, 0);
6998 	tree op = cxx_eval_constant_expression (ctx, oldop,
6999 						/*lval*/true,
7000 						non_constant_p, overflow_p);
7001 	/* Don't VERIFY_CONSTANT here.  */
7002 	if (*non_constant_p)
7003 	  return t;
7004 	gcc_checking_assert (TREE_CODE (op) != CONSTRUCTOR);
7005 	/* This function does more aggressive folding than fold itself.  */
7006 	r = build_fold_addr_expr_with_type (op, TREE_TYPE (t));
7007 	if (TREE_CODE (r) == ADDR_EXPR && TREE_OPERAND (r, 0) == oldop)
7008 	  {
7009 	    ggc_free (r);
7010 	    return t;
7011 	  }
7012 	break;
7013       }
7014 
7015     case REALPART_EXPR:
7016     case IMAGPART_EXPR:
7017       if (lval)
7018 	{
7019 	  r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
7020 					    non_constant_p, overflow_p);
7021 	  if (r == error_mark_node)
7022 	    ;
7023 	  else if (r == TREE_OPERAND (t, 0))
7024 	    r = t;
7025 	  else
7026 	    r = fold_build1 (TREE_CODE (t), TREE_TYPE (t), r);
7027 	  break;
7028 	}
7029       /* FALLTHRU */
7030     case CONJ_EXPR:
7031     case FIX_TRUNC_EXPR:
7032     case FLOAT_EXPR:
7033     case NEGATE_EXPR:
7034     case ABS_EXPR:
7035     case ABSU_EXPR:
7036     case BIT_NOT_EXPR:
7037     case TRUTH_NOT_EXPR:
7038     case FIXED_CONVERT_EXPR:
7039       r = cxx_eval_unary_expression (ctx, t, lval,
7040 				     non_constant_p, overflow_p);
7041       break;
7042 
7043     case SIZEOF_EXPR:
7044       r = fold_sizeof_expr (t);
7045       /* In a template, fold_sizeof_expr may merely create a new SIZEOF_EXPR,
7046 	 which could lead to an infinite recursion.  */
7047       if (TREE_CODE (r) != SIZEOF_EXPR)
7048 	r = cxx_eval_constant_expression (ctx, r, lval,
7049 					  non_constant_p, overflow_p,
7050 					  jump_target);
7051       else
7052 	{
7053 	  *non_constant_p = true;
7054 	  gcc_assert (ctx->quiet);
7055 	}
7056 
7057       break;
7058 
7059     case COMPOUND_EXPR:
7060       {
7061 	/* check_return_expr sometimes wraps a TARGET_EXPR in a
7062 	   COMPOUND_EXPR; don't get confused.  Also handle EMPTY_CLASS_EXPR
7063 	   introduced by build_call_a.  */
7064 	tree op0 = TREE_OPERAND (t, 0);
7065 	tree op1 = TREE_OPERAND (t, 1);
7066 	STRIP_NOPS (op1);
7067 	if ((TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
7068 	    || TREE_CODE (op1) == EMPTY_CLASS_EXPR)
7069 	  r = cxx_eval_constant_expression (ctx, op0,
7070 					    lval, non_constant_p, overflow_p,
7071 					    jump_target);
7072 	else
7073 	  {
7074 	    /* Check that the LHS is constant and then discard it.  */
7075 	    cxx_eval_constant_expression (ctx, op0,
7076 					  true, non_constant_p, overflow_p,
7077 					  jump_target);
7078 	    if (*non_constant_p)
7079 	      return t;
7080 	    op1 = TREE_OPERAND (t, 1);
7081 	    r = cxx_eval_constant_expression (ctx, op1,
7082 					      lval, non_constant_p, overflow_p,
7083 					      jump_target);
7084 	  }
7085       }
7086       break;
7087 
7088     case POINTER_PLUS_EXPR:
7089     case POINTER_DIFF_EXPR:
7090     case PLUS_EXPR:
7091     case MINUS_EXPR:
7092     case MULT_EXPR:
7093     case TRUNC_DIV_EXPR:
7094     case CEIL_DIV_EXPR:
7095     case FLOOR_DIV_EXPR:
7096     case ROUND_DIV_EXPR:
7097     case TRUNC_MOD_EXPR:
7098     case CEIL_MOD_EXPR:
7099     case ROUND_MOD_EXPR:
7100     case RDIV_EXPR:
7101     case EXACT_DIV_EXPR:
7102     case MIN_EXPR:
7103     case MAX_EXPR:
7104     case LSHIFT_EXPR:
7105     case RSHIFT_EXPR:
7106     case LROTATE_EXPR:
7107     case RROTATE_EXPR:
7108     case BIT_IOR_EXPR:
7109     case BIT_XOR_EXPR:
7110     case BIT_AND_EXPR:
7111     case TRUTH_XOR_EXPR:
7112     case LT_EXPR:
7113     case LE_EXPR:
7114     case GT_EXPR:
7115     case GE_EXPR:
7116     case EQ_EXPR:
7117     case NE_EXPR:
7118     case SPACESHIP_EXPR:
7119     case UNORDERED_EXPR:
7120     case ORDERED_EXPR:
7121     case UNLT_EXPR:
7122     case UNLE_EXPR:
7123     case UNGT_EXPR:
7124     case UNGE_EXPR:
7125     case UNEQ_EXPR:
7126     case LTGT_EXPR:
7127     case RANGE_EXPR:
7128     case COMPLEX_EXPR:
7129       r = cxx_eval_binary_expression (ctx, t, lval,
7130 				      non_constant_p, overflow_p);
7131       break;
7132 
7133       /* fold can introduce non-IF versions of these; still treat them as
7134 	 short-circuiting.  */
7135     case TRUTH_AND_EXPR:
7136     case TRUTH_ANDIF_EXPR:
7137       r = cxx_eval_logical_expression (ctx, t, boolean_false_node,
7138 				       boolean_true_node,
7139 				       non_constant_p, overflow_p);
7140       break;
7141 
7142     case TRUTH_OR_EXPR:
7143     case TRUTH_ORIF_EXPR:
7144       r = cxx_eval_logical_expression (ctx, t, boolean_true_node,
7145 				       boolean_false_node,
7146 				       non_constant_p, overflow_p);
7147       break;
7148 
7149     case ARRAY_REF:
7150       r = cxx_eval_array_reference (ctx, t, lval,
7151 				    non_constant_p, overflow_p);
7152       break;
7153 
7154     case COMPONENT_REF:
7155       if (is_overloaded_fn (t))
7156 	{
7157 	  /* We can only get here in checking mode via
7158 	     build_non_dependent_expr,  because any expression that
7159 	     calls or takes the address of the function will have
7160 	     pulled a FUNCTION_DECL out of the COMPONENT_REF.  */
7161 	  gcc_checking_assert (ctx->quiet || errorcount);
7162 	  *non_constant_p = true;
7163 	  return t;
7164 	}
7165       r = cxx_eval_component_reference (ctx, t, lval,
7166 					non_constant_p, overflow_p);
7167       break;
7168 
7169     case BIT_FIELD_REF:
7170       r = cxx_eval_bit_field_ref (ctx, t, lval,
7171 				  non_constant_p, overflow_p);
7172       break;
7173 
7174     case COND_EXPR:
7175     case IF_STMT:
7176       if (jump_target && *jump_target)
7177 	{
7178 	  tree orig_jump = *jump_target;
7179 	  tree arg = ((TREE_CODE (t) != IF_STMT || TREE_OPERAND (t, 1))
7180 		      ? TREE_OPERAND (t, 1) : void_node);
7181 	  /* When jumping to a label, the label might be either in the
7182 	     then or else blocks, so process then block first in skipping
7183 	     mode first, and if we are still in the skipping mode at its end,
7184 	     process the else block too.  */
7185 	  r = cxx_eval_constant_expression (ctx, arg, lval, non_constant_p,
7186 					    overflow_p, jump_target);
7187 	  /* It's possible that we found the label in the then block.  But
7188 	     it could have been followed by another jumping statement, e.g.
7189 	     say we're looking for case 1:
7190 	      if (cond)
7191 		{
7192 		  // skipped statements
7193 		  case 1:; // clears up *jump_target
7194 		  return 1; // and sets it to a RETURN_EXPR
7195 		}
7196 	      else { ... }
7197 	     in which case we need not go looking to the else block.
7198 	     (goto is not allowed in a constexpr function.)  */
7199 	  if (*jump_target == orig_jump)
7200 	    {
7201 	      arg = ((TREE_CODE (t) != IF_STMT || TREE_OPERAND (t, 2))
7202 		     ? TREE_OPERAND (t, 2) : void_node);
7203 	      r = cxx_eval_constant_expression (ctx, arg, lval, non_constant_p,
7204 						overflow_p, jump_target);
7205 	    }
7206 	  break;
7207 	}
7208       r = cxx_eval_conditional_expression (ctx, t, lval,
7209 					   non_constant_p, overflow_p,
7210 					   jump_target);
7211       break;
7212     case VEC_COND_EXPR:
7213       r = cxx_eval_vector_conditional_expression (ctx, t, non_constant_p,
7214 						  overflow_p);
7215       break;
7216 
7217     case CONSTRUCTOR:
7218       if (TREE_CONSTANT (t) && reduced_constant_expression_p (t))
7219 	{
7220 	  /* Don't re-process a constant CONSTRUCTOR, but do fold it to
7221 	     VECTOR_CST if applicable.  */
7222 	  verify_constructor_flags (t);
7223 	  if (TREE_CONSTANT (t))
7224 	    return fold (t);
7225 	}
7226       r = cxx_eval_bare_aggregate (ctx, t, lval,
7227 				   non_constant_p, overflow_p);
7228       break;
7229 
7230     case VEC_INIT_EXPR:
7231       /* We can get this in a defaulted constructor for a class with a
7232 	 non-static data member of array type.  Either the initializer will
7233 	 be NULL, meaning default-initialization, or it will be an lvalue
7234 	 or xvalue of the same type, meaning direct-initialization from the
7235 	 corresponding member.  */
7236       r = cxx_eval_vec_init (ctx, t, lval,
7237 			     non_constant_p, overflow_p);
7238       break;
7239 
7240     case VEC_PERM_EXPR:
7241       r = cxx_eval_trinary_expression (ctx, t, lval,
7242 				       non_constant_p, overflow_p);
7243       break;
7244 
7245     case PAREN_EXPR:
7246       gcc_assert (!REF_PARENTHESIZED_P (t));
7247       /* A PAREN_EXPR resulting from __builtin_assoc_barrier has no effect in
7248          constant expressions since it's unaffected by -fassociative-math.  */
7249       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
7250 					non_constant_p, overflow_p);
7251       break;
7252 
7253     case NOP_EXPR:
7254       if (REINTERPRET_CAST_P (t))
7255 	{
7256 	  if (!ctx->quiet)
7257 	    error_at (loc,
7258 		      "%<reinterpret_cast%> is not a constant expression");
7259 	  *non_constant_p = true;
7260 	  return t;
7261 	}
7262       /* FALLTHROUGH.  */
7263     case CONVERT_EXPR:
7264     case VIEW_CONVERT_EXPR:
7265     case UNARY_PLUS_EXPR:
7266       {
7267 	tree oldop = TREE_OPERAND (t, 0);
7268 
7269 	tree op = cxx_eval_constant_expression (ctx, oldop,
7270 						lval,
7271 						non_constant_p, overflow_p);
7272 	if (*non_constant_p)
7273 	  return t;
7274 	tree type = TREE_TYPE (t);
7275 
7276 	if (VOID_TYPE_P (type))
7277 	  return void_node;
7278 
7279 	if (TREE_CODE (t) == CONVERT_EXPR
7280 	    && ARITHMETIC_TYPE_P (type)
7281 	    && INDIRECT_TYPE_P (TREE_TYPE (op))
7282 	    && ctx->manifestly_const_eval)
7283 	  {
7284 	    if (!ctx->quiet)
7285 	      error_at (loc,
7286 			"conversion from pointer type %qT to arithmetic type "
7287 			"%qT in a constant expression", TREE_TYPE (op), type);
7288 	    *non_constant_p = true;
7289 	    return t;
7290 	  }
7291 
7292 	/* [expr.const]: a conversion from type cv void* to a pointer-to-object
7293 	   type cannot be part of a core constant expression as a resolution to
7294 	   DR 1312.  */
7295 	if (TYPE_PTROB_P (type)
7296 	    && TYPE_PTR_P (TREE_TYPE (op))
7297 	    && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (op)))
7298 	    /* Inside a call to std::construct_at or to
7299 	       std::allocator<T>::{,de}allocate, we permit casting from void*
7300 	       because that is compiler-generated code.  */
7301 	    && !is_std_construct_at (ctx->call)
7302 	    && !is_std_allocator_allocate (ctx->call))
7303 	  {
7304 	    /* Likewise, don't error when casting from void* when OP is
7305 	       &heap uninit and similar.  */
7306 	    tree sop = tree_strip_nop_conversions (op);
7307 	    if (TREE_CODE (sop) == ADDR_EXPR
7308 		&& VAR_P (TREE_OPERAND (sop, 0))
7309 		&& DECL_ARTIFICIAL (TREE_OPERAND (sop, 0)))
7310 	      /* OK */;
7311 	    else
7312 	      {
7313 		if (!ctx->quiet)
7314 		  error_at (loc, "cast from %qT is not allowed",
7315 			    TREE_TYPE (op));
7316 		*non_constant_p = true;
7317 		return t;
7318 	      }
7319 	  }
7320 
7321 	if (TREE_CODE (op) == PTRMEM_CST && !TYPE_PTRMEM_P (type))
7322 	  {
7323 	    op = cplus_expand_constant (op);
7324 	    if (TREE_CODE (op) == PTRMEM_CST)
7325 	      {
7326 		if (!ctx->quiet)
7327 		  error_at (loc, "%qE is not a constant expression when the "
7328 			    "class %qT is still incomplete", op,
7329 			    PTRMEM_CST_CLASS (op));
7330 		*non_constant_p = true;
7331 		return t;
7332 	      }
7333 	  }
7334 
7335 	if (TREE_CODE (op) == PTRMEM_CST && tcode == NOP_EXPR)
7336 	  {
7337 	    if (!same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (op))
7338 		&& !can_convert_qual (type, op))
7339 	      op = cplus_expand_constant (op);
7340 	    return cp_fold_convert (type, op);
7341 	  }
7342 
7343 	if (INDIRECT_TYPE_P (type) && TREE_CODE (op) == INTEGER_CST)
7344 	  {
7345 	    if (integer_zerop (op))
7346 	      {
7347 		if (TYPE_REF_P (type))
7348 		  {
7349 		    if (!ctx->quiet)
7350 		      error_at (loc, "dereferencing a null pointer");
7351 		    *non_constant_p = true;
7352 		    return t;
7353 		  }
7354 	      }
7355 	    else
7356 	      {
7357 		/* This detects for example:
7358 		     reinterpret_cast<void*>(sizeof 0)
7359 		*/
7360 		if (!ctx->quiet)
7361 		  error_at (loc, "%<reinterpret_cast<%T>(%E)%> is not "
7362 			    "a constant expression",
7363 			    type, op);
7364 		*non_constant_p = true;
7365 		return t;
7366 	      }
7367 	  }
7368 
7369 	if (INDIRECT_TYPE_P (type)
7370 	    && TREE_CODE (op) == NOP_EXPR
7371 	    && TREE_TYPE (op) == ptr_type_node
7372 	    && TREE_CODE (TREE_OPERAND (op, 0)) == ADDR_EXPR
7373 	    && VAR_P (TREE_OPERAND (TREE_OPERAND (op, 0), 0))
7374 	    && (DECL_NAME (TREE_OPERAND (TREE_OPERAND (op, 0),
7375 					 0)) == heap_uninit_identifier
7376 		|| DECL_NAME (TREE_OPERAND (TREE_OPERAND (op, 0),
7377 					    0)) == heap_vec_uninit_identifier))
7378 	  {
7379 	    tree var = TREE_OPERAND (TREE_OPERAND (op, 0), 0);
7380 	    tree var_size = TYPE_SIZE_UNIT (TREE_TYPE (var));
7381 	    tree elt_type = TREE_TYPE (type);
7382 	    tree cookie_size = NULL_TREE;
7383 	    tree arg_size = NULL_TREE;
7384 	    if (TREE_CODE (elt_type) == RECORD_TYPE
7385 		&& TYPE_NAME (elt_type) == heap_identifier)
7386 	      {
7387 		tree fld1 = TYPE_FIELDS (elt_type);
7388 		tree fld2 = DECL_CHAIN (fld1);
7389 		elt_type = TREE_TYPE (TREE_TYPE (fld2));
7390 		cookie_size = TYPE_SIZE_UNIT (TREE_TYPE (fld1));
7391 	      }
7392 	    DECL_NAME (var)
7393 	      = (DECL_NAME (var) == heap_uninit_identifier
7394 		 ? heap_identifier : heap_vec_identifier);
7395 	    /* For zero sized elt_type, try to recover how many outer_nelts
7396 	       it should have.  */
7397 	    if ((cookie_size ? tree_int_cst_equal (var_size, cookie_size)
7398 			     : integer_zerop (var_size))
7399 		&& !int_size_in_bytes (elt_type)
7400 		&& TREE_CODE (oldop) == CALL_EXPR
7401 		&& call_expr_nargs (oldop) >= 1)
7402 	      if (tree fun = get_function_named_in_call (oldop))
7403 		if (cxx_replaceable_global_alloc_fn (fun)
7404 		    && IDENTIFIER_NEW_OP_P (DECL_NAME (fun)))
7405 		  arg_size = CALL_EXPR_ARG (oldop, 0);
7406 	    TREE_TYPE (var)
7407 	      = build_new_constexpr_heap_type (ctx, elt_type, cookie_size,
7408 					       var_size, arg_size,
7409 					       non_constant_p, overflow_p);
7410 	    TREE_TYPE (TREE_OPERAND (op, 0))
7411 	      = build_pointer_type (TREE_TYPE (var));
7412 	  }
7413 
7414 	if (op == oldop && tcode != UNARY_PLUS_EXPR)
7415 	  /* We didn't fold at the top so we could check for ptr-int
7416 	     conversion.  */
7417 	  return fold (t);
7418 
7419 	tree sop;
7420 
7421 	/* Handle an array's bounds having been deduced after we built
7422 	   the wrapping expression.  */
7423 	if (same_type_ignoring_tlq_and_bounds_p (type, TREE_TYPE (op)))
7424 	  r = op;
7425 	else if (sop = tree_strip_nop_conversions (op),
7426 		 sop != op && (same_type_ignoring_tlq_and_bounds_p
7427 			       (type, TREE_TYPE (sop))))
7428 	  r = sop;
7429 	else if (tcode == UNARY_PLUS_EXPR)
7430 	  r = fold_convert (TREE_TYPE (t), op);
7431 	else
7432 	  r = fold_build1 (tcode, type, op);
7433 
7434 	/* Conversion of an out-of-range value has implementation-defined
7435 	   behavior; the language considers it different from arithmetic
7436 	   overflow, which is undefined.  */
7437 	if (TREE_OVERFLOW_P (r) && !TREE_OVERFLOW_P (op))
7438 	  TREE_OVERFLOW (r) = false;
7439       }
7440       break;
7441 
7442     case EMPTY_CLASS_EXPR:
7443       /* Handle EMPTY_CLASS_EXPR produced by build_call_a by lowering
7444 	 it to an appropriate CONSTRUCTOR.  */
7445       return build_constructor (TREE_TYPE (t), NULL);
7446 
7447     case STATEMENT_LIST:
7448       new_ctx = *ctx;
7449       new_ctx.ctor = new_ctx.object = NULL_TREE;
7450       return cxx_eval_statement_list (&new_ctx, t,
7451 				      non_constant_p, overflow_p, jump_target);
7452 
7453     case BIND_EXPR:
7454       return cxx_eval_constant_expression (ctx, BIND_EXPR_BODY (t),
7455 					   lval,
7456 					   non_constant_p, overflow_p,
7457 					   jump_target);
7458 
7459     case PREINCREMENT_EXPR:
7460     case POSTINCREMENT_EXPR:
7461     case PREDECREMENT_EXPR:
7462     case POSTDECREMENT_EXPR:
7463       return cxx_eval_increment_expression (ctx, t,
7464 					    lval, non_constant_p, overflow_p);
7465 
7466     case LAMBDA_EXPR:
7467     case NEW_EXPR:
7468     case VEC_NEW_EXPR:
7469     case DELETE_EXPR:
7470     case VEC_DELETE_EXPR:
7471     case THROW_EXPR:
7472     case MODOP_EXPR:
7473       /* GCC internal stuff.  */
7474     case VA_ARG_EXPR:
7475     case NON_DEPENDENT_EXPR:
7476     case BASELINK:
7477     case OFFSET_REF:
7478       if (!ctx->quiet)
7479 	error_at (loc, "expression %qE is not a constant expression", t);
7480       *non_constant_p = true;
7481       break;
7482 
7483     case OBJ_TYPE_REF:
7484       /* Virtual function lookup.  We don't need to do anything fancy.  */
7485       return cxx_eval_constant_expression (ctx, OBJ_TYPE_REF_EXPR (t),
7486 					   lval, non_constant_p, overflow_p);
7487 
7488     case PLACEHOLDER_EXPR:
7489       /* Use of the value or address of the current object.  */
7490       if (tree ctor = lookup_placeholder (ctx, lval, TREE_TYPE (t)))
7491 	{
7492 	  if (TREE_CODE (ctor) == CONSTRUCTOR)
7493 	    return ctor;
7494 	  else
7495 	    return cxx_eval_constant_expression (ctx, ctor, lval,
7496 						 non_constant_p, overflow_p);
7497 	}
7498       /* A placeholder without a referent.  We can get here when
7499 	 checking whether NSDMIs are noexcept, or in massage_init_elt;
7500 	 just say it's non-constant for now.  */
7501       gcc_assert (ctx->quiet);
7502       *non_constant_p = true;
7503       break;
7504 
7505     case EXIT_EXPR:
7506       {
7507 	tree cond = TREE_OPERAND (t, 0);
7508 	cond = cxx_eval_constant_expression (ctx, cond, /*lval*/false,
7509 					     non_constant_p, overflow_p);
7510 	VERIFY_CONSTANT (cond);
7511 	if (integer_nonzerop (cond))
7512 	  *jump_target = t;
7513       }
7514       break;
7515 
7516     case GOTO_EXPR:
7517       if (breaks (&TREE_OPERAND (t, 0))
7518 	  || continues (&TREE_OPERAND (t, 0))
7519 	  /* Allow for jumping to a cdtor_label.  */
7520 	  || returns (&TREE_OPERAND (t, 0)))
7521 	*jump_target = TREE_OPERAND (t, 0);
7522       else
7523 	{
7524 	  gcc_assert (cxx_dialect >= cxx23);
7525 	  if (!ctx->quiet)
7526 	    error_at (loc, "%<goto%> is not a constant expression");
7527 	  *non_constant_p = true;
7528 	}
7529       break;
7530 
7531     case LOOP_EXPR:
7532     case DO_STMT:
7533     case WHILE_STMT:
7534     case FOR_STMT:
7535       cxx_eval_loop_expr (ctx, t,
7536 			  non_constant_p, overflow_p, jump_target);
7537       break;
7538 
7539     case SWITCH_EXPR:
7540     case SWITCH_STMT:
7541       cxx_eval_switch_expr (ctx, t,
7542 			    non_constant_p, overflow_p, jump_target);
7543       break;
7544 
7545     case REQUIRES_EXPR:
7546       /* It's possible to get a requires-expression in a constant
7547          expression. For example:
7548 
7549              template<typename T> concept bool C() {
7550                return requires (T t) { t; };
7551              }
7552 
7553              template<typename T> requires !C<T>() void f(T);
7554 
7555          Normalization leaves f with the associated constraint
7556          '!requires (T t) { ... }' which is not transformed into
7557          a constraint.  */
7558       if (!processing_template_decl)
7559 	return evaluate_requires_expr (t);
7560       else
7561         *non_constant_p = true;
7562       return t;
7563 
7564     case ANNOTATE_EXPR:
7565       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
7566 					lval,
7567 					non_constant_p, overflow_p,
7568 					jump_target);
7569       break;
7570 
7571     case USING_STMT:
7572       r = void_node;
7573       break;
7574 
7575     case TEMPLATE_ID_EXPR:
7576       {
7577         /* We can evaluate template-id that refers to a concept only if
7578 	   the template arguments are non-dependent.  */
7579 	tree id = unpack_concept_check (t);
7580 	tree tmpl = TREE_OPERAND (id, 0);
7581 	if (!concept_definition_p (tmpl))
7582 	  internal_error ("unexpected template-id %qE", t);
7583 
7584 	if (function_concept_p (tmpl))
7585 	  {
7586 	    if (!ctx->quiet)
7587 	      error_at (cp_expr_loc_or_input_loc (t),
7588 			"function concept must be called");
7589 	    r = error_mark_node;
7590 	    break;
7591 	  }
7592 
7593 	if (!value_dependent_expression_p (t)
7594 	    && !uid_sensitive_constexpr_evaluation_p ())
7595 	  r = evaluate_concept_check (t);
7596 	else
7597 	  *non_constant_p = true;
7598 
7599 	break;
7600       }
7601 
7602     case ASM_EXPR:
7603       if (!ctx->quiet)
7604 	inline_asm_in_constexpr_error (loc);
7605       *non_constant_p = true;
7606       return t;
7607 
7608     case BIT_CAST_EXPR:
7609       if (lval)
7610 	{
7611 	  if (!ctx->quiet)
7612 	    error_at (EXPR_LOCATION (t),
7613 		      "address of a call to %qs is not a constant expression",
7614 		      "__builtin_bit_cast");
7615 	  *non_constant_p = true;
7616 	  return t;
7617 	}
7618       r = cxx_eval_bit_cast (ctx, t, non_constant_p, overflow_p);
7619       break;
7620 
7621     case OMP_PARALLEL:
7622     case OMP_TASK:
7623     case OMP_FOR:
7624     case OMP_SIMD:
7625     case OMP_DISTRIBUTE:
7626     case OMP_TASKLOOP:
7627     case OMP_LOOP:
7628     case OMP_TEAMS:
7629     case OMP_TARGET_DATA:
7630     case OMP_TARGET:
7631     case OMP_SECTIONS:
7632     case OMP_ORDERED:
7633     case OMP_CRITICAL:
7634     case OMP_SINGLE:
7635     case OMP_SCAN:
7636     case OMP_SCOPE:
7637     case OMP_SECTION:
7638     case OMP_MASTER:
7639     case OMP_MASKED:
7640     case OMP_TASKGROUP:
7641     case OMP_TARGET_UPDATE:
7642     case OMP_TARGET_ENTER_DATA:
7643     case OMP_TARGET_EXIT_DATA:
7644     case OMP_ATOMIC:
7645     case OMP_ATOMIC_READ:
7646     case OMP_ATOMIC_CAPTURE_OLD:
7647     case OMP_ATOMIC_CAPTURE_NEW:
7648     case OMP_DEPOBJ:
7649     case OACC_PARALLEL:
7650     case OACC_KERNELS:
7651     case OACC_SERIAL:
7652     case OACC_DATA:
7653     case OACC_HOST_DATA:
7654     case OACC_LOOP:
7655     case OACC_CACHE:
7656     case OACC_DECLARE:
7657     case OACC_ENTER_DATA:
7658     case OACC_EXIT_DATA:
7659     case OACC_UPDATE:
7660       if (!ctx->quiet)
7661 	error_at (EXPR_LOCATION (t),
7662 		  "statement is not a constant expression");
7663       *non_constant_p = true;
7664       break;
7665 
7666     default:
7667       if (STATEMENT_CODE_P (TREE_CODE (t)))
7668 	{
7669 	  /* This function doesn't know how to deal with pre-genericize
7670 	     statements; this can only happen with statement-expressions,
7671 	     so for now just fail.  */
7672 	  if (!ctx->quiet)
7673 	    error_at (EXPR_LOCATION (t),
7674 		      "statement is not a constant expression");
7675 	}
7676       else
7677 	internal_error ("unexpected expression %qE of kind %s", t,
7678 			get_tree_code_name (TREE_CODE (t)));
7679       *non_constant_p = true;
7680       break;
7681     }
7682 
7683   if (r == error_mark_node)
7684     *non_constant_p = true;
7685 
7686   if (*non_constant_p)
7687     return t;
7688   else
7689     return r;
7690 }
7691 
7692 /* P0859: A function is needed for constant evaluation if it is a constexpr
7693    function that is named by an expression ([basic.def.odr]) that is
7694    potentially constant evaluated.
7695 
7696    So we need to instantiate any constexpr functions mentioned by the
7697    expression even if the definition isn't needed for evaluating the
7698    expression.  */
7699 
7700 static tree
instantiate_cx_fn_r(tree * tp,int * walk_subtrees,void *)7701 instantiate_cx_fn_r (tree *tp, int *walk_subtrees, void */*data*/)
7702 {
7703   if (TREE_CODE (*tp) == FUNCTION_DECL
7704       && DECL_DECLARED_CONSTEXPR_P (*tp)
7705       && !DECL_INITIAL (*tp)
7706       && !trivial_fn_p (*tp)
7707       && DECL_TEMPLOID_INSTANTIATION (*tp)
7708       && !uid_sensitive_constexpr_evaluation_p ())
7709     {
7710       ++function_depth;
7711       instantiate_decl (*tp, /*defer_ok*/false, /*expl_inst*/false);
7712       --function_depth;
7713     }
7714   else if (TREE_CODE (*tp) == CALL_EXPR
7715 	   || TREE_CODE (*tp) == AGGR_INIT_EXPR)
7716     {
7717       if (EXPR_HAS_LOCATION (*tp))
7718 	input_location = EXPR_LOCATION (*tp);
7719     }
7720 
7721   if (!EXPR_P (*tp))
7722     *walk_subtrees = 0;
7723 
7724   return NULL_TREE;
7725 }
7726 
7727 static void
instantiate_constexpr_fns(tree t)7728 instantiate_constexpr_fns (tree t)
7729 {
7730   location_t loc = input_location;
7731   cp_walk_tree_without_duplicates (&t, instantiate_cx_fn_r, NULL);
7732   input_location = loc;
7733 }
7734 
7735 /* Look for heap variables in the expression *TP.  */
7736 
7737 static tree
find_heap_var_refs(tree * tp,int * walk_subtrees,void *)7738 find_heap_var_refs (tree *tp, int *walk_subtrees, void */*data*/)
7739 {
7740   if (VAR_P (*tp)
7741       && (DECL_NAME (*tp) == heap_uninit_identifier
7742 	  || DECL_NAME (*tp) == heap_identifier
7743 	  || DECL_NAME (*tp) == heap_vec_uninit_identifier
7744 	  || DECL_NAME (*tp) == heap_vec_identifier
7745 	  || DECL_NAME (*tp) == heap_deleted_identifier))
7746     return *tp;
7747 
7748   if (TYPE_P (*tp))
7749     *walk_subtrees = 0;
7750   return NULL_TREE;
7751 }
7752 
7753 /* Find immediate function decls in *TP if any.  */
7754 
7755 static tree
find_immediate_fndecl(tree * tp,int *,void *)7756 find_immediate_fndecl (tree *tp, int */*walk_subtrees*/, void */*data*/)
7757 {
7758   if (TREE_CODE (*tp) == FUNCTION_DECL && DECL_IMMEDIATE_FUNCTION_P (*tp))
7759     return *tp;
7760   if (TREE_CODE (*tp) == PTRMEM_CST
7761       && TREE_CODE (PTRMEM_CST_MEMBER (*tp)) == FUNCTION_DECL
7762       && DECL_IMMEDIATE_FUNCTION_P (PTRMEM_CST_MEMBER (*tp)))
7763     return PTRMEM_CST_MEMBER (*tp);
7764   return NULL_TREE;
7765 }
7766 
7767 /* T has TREE_CONSTANT set but has been deemed not a valid C++ constant
7768    expression.  Return a version of T that has TREE_CONSTANT cleared.  */
7769 
7770 static tree
mark_non_constant(tree t)7771 mark_non_constant (tree t)
7772 {
7773   gcc_checking_assert (TREE_CONSTANT (t));
7774 
7775   /* This isn't actually constant, so unset TREE_CONSTANT.
7776      Don't clear TREE_CONSTANT on ADDR_EXPR, as the middle-end requires
7777      it to be set if it is invariant address, even when it is not
7778      a valid C++ constant expression.  Wrap it with a NOP_EXPR
7779      instead.  */
7780   if (EXPR_P (t) && TREE_CODE (t) != ADDR_EXPR)
7781     t = copy_node (t);
7782   else if (TREE_CODE (t) == CONSTRUCTOR)
7783     t = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (t), t);
7784   else
7785     t = build_nop (TREE_TYPE (t), t);
7786   TREE_CONSTANT (t) = false;
7787   return t;
7788 }
7789 
7790 /* ALLOW_NON_CONSTANT is false if T is required to be a constant expression.
7791    STRICT has the same sense as for constant_value_1: true if we only allow
7792    conforming C++ constant expressions, or false if we want a constant value
7793    even if it doesn't conform.
7794    MANIFESTLY_CONST_EVAL is true if T is manifestly const-evaluated as
7795    per P0595 even when ALLOW_NON_CONSTANT is true.
7796    CONSTEXPR_DTOR is true when evaluating the dtor of a constexpr variable.
7797    OBJECT must be non-NULL in that case.  */
7798 
7799 static tree
cxx_eval_outermost_constant_expr(tree t,bool allow_non_constant,bool strict=true,bool manifestly_const_eval=false,bool constexpr_dtor=false,tree object=NULL_TREE)7800 cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
7801 				  bool strict = true,
7802 				  bool manifestly_const_eval = false,
7803 				  bool constexpr_dtor = false,
7804 				  tree object = NULL_TREE)
7805 {
7806   auto_timevar time (TV_CONSTEXPR);
7807 
7808   bool non_constant_p = false;
7809   bool overflow_p = false;
7810 
7811   if (BRACE_ENCLOSED_INITIALIZER_P (t))
7812     {
7813       gcc_checking_assert (allow_non_constant);
7814       return t;
7815     }
7816 
7817   constexpr_global_ctx global_ctx;
7818   constexpr_ctx ctx = { &global_ctx, NULL, NULL, NULL, NULL, NULL, NULL,
7819 			allow_non_constant, strict,
7820 			manifestly_const_eval || !allow_non_constant };
7821 
7822   /* Turn off -frounding-math for manifestly constant evaluation.  */
7823   warning_sentinel rm (flag_rounding_math, ctx.manifestly_const_eval);
7824   tree type = initialized_type (t);
7825   tree r = t;
7826   bool is_consteval = false;
7827   if (VOID_TYPE_P (type))
7828     {
7829       if (constexpr_dtor)
7830 	/* Used for destructors of array elements.  */
7831 	type = TREE_TYPE (object);
7832       else
7833 	{
7834 	  if (cxx_dialect < cxx20)
7835 	    return t;
7836 	  if (TREE_CODE (t) != CALL_EXPR && TREE_CODE (t) != AGGR_INIT_EXPR)
7837 	    return t;
7838 	  /* Calls to immediate functions returning void need to be
7839 	     evaluated.  */
7840 	  tree fndecl = cp_get_callee_fndecl_nofold (t);
7841 	  if (fndecl == NULL_TREE || !DECL_IMMEDIATE_FUNCTION_P (fndecl))
7842 	    return t;
7843 	  else
7844 	    is_consteval = true;
7845 	}
7846     }
7847   else if (cxx_dialect >= cxx20
7848 	   && (TREE_CODE (t) == CALL_EXPR
7849 	       || TREE_CODE (t) == AGGR_INIT_EXPR
7850 	       || TREE_CODE (t) == TARGET_EXPR))
7851     {
7852       /* For non-concept checks, determine if it is consteval.  */
7853       if (!concept_check_p (t))
7854 	{
7855 	  tree x = t;
7856 	  if (TREE_CODE (x) == TARGET_EXPR)
7857 	    x = TARGET_EXPR_INITIAL (x);
7858 	  tree fndecl = cp_get_callee_fndecl_nofold (x);
7859 	  if (fndecl && DECL_IMMEDIATE_FUNCTION_P (fndecl))
7860 	    is_consteval = true;
7861 	}
7862     }
7863   if (AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type))
7864     {
7865       /* In C++14 an NSDMI can participate in aggregate initialization,
7866 	 and can refer to the address of the object being initialized, so
7867 	 we need to pass in the relevant VAR_DECL if we want to do the
7868 	 evaluation in a single pass.  The evaluation will dynamically
7869 	 update ctx.values for the VAR_DECL.  We use the same strategy
7870 	 for C++11 constexpr constructors that refer to the object being
7871 	 initialized.  */
7872       if (constexpr_dtor)
7873 	{
7874 	  gcc_assert (object && VAR_P (object));
7875 	  gcc_assert (DECL_DECLARED_CONSTEXPR_P (object));
7876 	  gcc_assert (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object));
7877 	  if (error_operand_p (DECL_INITIAL (object)))
7878 	    return t;
7879 	  ctx.ctor = unshare_expr (DECL_INITIAL (object));
7880 	  TREE_READONLY (ctx.ctor) = false;
7881 	  /* Temporarily force decl_really_constant_value to return false
7882 	     for it, we want to use ctx.ctor for the current value instead.  */
7883 	  DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object) = false;
7884 	}
7885       else
7886 	{
7887 	  ctx.ctor = build_constructor (type, NULL);
7888 	  CONSTRUCTOR_NO_CLEARING (ctx.ctor) = true;
7889 	}
7890       if (!object)
7891 	{
7892 	  if (TREE_CODE (t) == TARGET_EXPR)
7893 	    object = TARGET_EXPR_SLOT (t);
7894 	  else if (TREE_CODE (t) == AGGR_INIT_EXPR)
7895 	    object = AGGR_INIT_EXPR_SLOT (t);
7896 	}
7897       ctx.object = object;
7898       if (object)
7899 	gcc_assert (same_type_ignoring_top_level_qualifiers_p
7900 		    (type, TREE_TYPE (object)));
7901       if (object && DECL_P (object))
7902 	global_ctx.values.put (object, ctx.ctor);
7903       if (TREE_CODE (r) == TARGET_EXPR)
7904 	/* Avoid creating another CONSTRUCTOR when we expand the
7905 	   TARGET_EXPR.  */
7906 	r = TARGET_EXPR_INITIAL (r);
7907     }
7908 
7909   auto_vec<tree, 16> cleanups;
7910   global_ctx.cleanups = &cleanups;
7911 
7912   if (manifestly_const_eval)
7913     instantiate_constexpr_fns (r);
7914   r = cxx_eval_constant_expression (&ctx, r,
7915 				    false, &non_constant_p, &overflow_p);
7916 
7917   if (!constexpr_dtor)
7918     verify_constant (r, allow_non_constant, &non_constant_p, &overflow_p);
7919   else
7920     DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object) = true;
7921 
7922   unsigned int i;
7923   tree cleanup;
7924   /* Evaluate the cleanups.  */
7925   FOR_EACH_VEC_ELT_REVERSE (cleanups, i, cleanup)
7926     cxx_eval_constant_expression (&ctx, cleanup, false,
7927 				  &non_constant_p, &overflow_p);
7928 
7929   /* Mutable logic is a bit tricky: we want to allow initialization of
7930      constexpr variables with mutable members, but we can't copy those
7931      members to another constexpr variable.  */
7932   if (TREE_CODE (r) == CONSTRUCTOR && CONSTRUCTOR_MUTABLE_POISON (r))
7933     {
7934       if (!allow_non_constant)
7935 	error ("%qE is not a constant expression because it refers to "
7936 	       "mutable subobjects of %qT", t, type);
7937       non_constant_p = true;
7938     }
7939 
7940   if (TREE_CODE (r) == CONSTRUCTOR && CONSTRUCTOR_NO_CLEARING (r))
7941     {
7942       if (!allow_non_constant)
7943 	error ("%qE is not a constant expression because it refers to "
7944 	       "an incompletely initialized variable", t);
7945       TREE_CONSTANT (r) = false;
7946       non_constant_p = true;
7947     }
7948 
7949   if (!global_ctx.heap_vars.is_empty ())
7950     {
7951       tree heap_var = cp_walk_tree_without_duplicates (&r, find_heap_var_refs,
7952 						       NULL);
7953       unsigned int i;
7954       if (heap_var)
7955 	{
7956 	  if (!allow_non_constant && !non_constant_p)
7957 	    error_at (DECL_SOURCE_LOCATION (heap_var),
7958 		      "%qE is not a constant expression because it refers to "
7959 		      "a result of %<operator new%>", t);
7960 	  r = t;
7961 	  non_constant_p = true;
7962 	}
7963       FOR_EACH_VEC_ELT (global_ctx.heap_vars, i, heap_var)
7964 	{
7965 	  if (DECL_NAME (heap_var) != heap_deleted_identifier)
7966 	    {
7967 	      if (!allow_non_constant && !non_constant_p)
7968 		error_at (DECL_SOURCE_LOCATION (heap_var),
7969 			  "%qE is not a constant expression because allocated "
7970 			  "storage has not been deallocated", t);
7971 	      r = t;
7972 	      non_constant_p = true;
7973 	    }
7974 	  varpool_node::get (heap_var)->remove ();
7975 	}
7976     }
7977 
7978   /* Check that immediate invocation does not return an expression referencing
7979      any immediate function decls.  */
7980   if (is_consteval || in_immediate_context ())
7981     if (tree immediate_fndecl
7982 	= cp_walk_tree_without_duplicates (&r, find_immediate_fndecl,
7983 					   NULL))
7984     {
7985       if (!allow_non_constant && !non_constant_p)
7986 	error_at (cp_expr_loc_or_input_loc (t),
7987 		  "immediate evaluation returns address of immediate "
7988 		  "function %qD", immediate_fndecl);
7989       r = t;
7990       non_constant_p = true;
7991     }
7992 
7993   if (non_constant_p)
7994     /* If we saw something bad, go back to our argument.  The wrapping below is
7995        only for the cases of TREE_CONSTANT argument or overflow.  */
7996     r = t;
7997 
7998   if (!non_constant_p && overflow_p)
7999     non_constant_p = true;
8000 
8001   /* Unshare the result.  */
8002   bool should_unshare = true;
8003   if (r == t || (TREE_CODE (t) == TARGET_EXPR
8004 		 && TARGET_EXPR_INITIAL (t) == r))
8005     should_unshare = false;
8006 
8007   if (non_constant_p && !allow_non_constant)
8008     return error_mark_node;
8009   else if (constexpr_dtor)
8010     return r;
8011   else if (non_constant_p && TREE_CONSTANT (r))
8012     r = mark_non_constant (r);
8013   else if (non_constant_p)
8014     return t;
8015 
8016   if (should_unshare)
8017     r = unshare_expr (r);
8018 
8019   if (TREE_CODE (r) == CONSTRUCTOR && CLASS_TYPE_P (TREE_TYPE (r)))
8020     {
8021       r = adjust_temp_type (type, r);
8022       if (TREE_CODE (t) == TARGET_EXPR
8023 	  && TARGET_EXPR_INITIAL (t) == r)
8024 	return t;
8025       else if (TREE_CODE (t) == CONSTRUCTOR)
8026 	;
8027       else if (TREE_CODE (t) == TARGET_EXPR && TARGET_EXPR_CLEANUP (t))
8028 	r = get_target_expr (r);
8029       else
8030 	{
8031 	  r = get_target_expr_sfinae (r, tf_warning_or_error | tf_no_cleanup);
8032 	  TREE_CONSTANT (r) = true;
8033 	}
8034     }
8035 
8036   /* Remember the original location if that wouldn't need a wrapper.  */
8037   if (location_t loc = EXPR_LOCATION (t))
8038     protected_set_expr_location (r, loc);
8039 
8040   return r;
8041 }
8042 
8043 /* If T represents a constant expression returns its reduced value.
8044    Otherwise return error_mark_node.  If T is dependent, then
8045    return NULL.  */
8046 
8047 tree
cxx_constant_value(tree t,tree decl)8048 cxx_constant_value (tree t, tree decl)
8049 {
8050   return cxx_eval_outermost_constant_expr (t, false, true, true, false, decl);
8051 }
8052 
8053 /* As above, but respect SFINAE.  */
8054 
8055 tree
cxx_constant_value_sfinae(tree t,tree decl,tsubst_flags_t complain)8056 cxx_constant_value_sfinae (tree t, tree decl, tsubst_flags_t complain)
8057 {
8058   bool sfinae = !(complain & tf_error);
8059   tree r = cxx_eval_outermost_constant_expr (t, sfinae, true, true, false, decl);
8060   if (sfinae && !TREE_CONSTANT (r))
8061     r = error_mark_node;
8062   return r;
8063 }
8064 
8065 /* Like cxx_constant_value, but used for evaluation of constexpr destructors
8066    of constexpr variables.  The actual initializer of DECL is not modified.  */
8067 
8068 void
cxx_constant_dtor(tree t,tree decl)8069 cxx_constant_dtor (tree t, tree decl)
8070 {
8071   cxx_eval_outermost_constant_expr (t, false, true, true, true, decl);
8072 }
8073 
8074 /* Helper routine for fold_simple function.  Either return simplified
8075    expression T, otherwise NULL_TREE.
8076    In contrast to cp_fully_fold, and to maybe_constant_value, we try to fold
8077    even if we are within template-declaration.  So be careful on call, as in
8078    such case types can be undefined.  */
8079 
8080 static tree
fold_simple_1(tree t)8081 fold_simple_1 (tree t)
8082 {
8083   tree op1;
8084   enum tree_code code = TREE_CODE (t);
8085 
8086   switch (code)
8087     {
8088     case INTEGER_CST:
8089     case REAL_CST:
8090     case VECTOR_CST:
8091     case FIXED_CST:
8092     case COMPLEX_CST:
8093       return t;
8094 
8095     case SIZEOF_EXPR:
8096       return fold_sizeof_expr (t);
8097 
8098     case ABS_EXPR:
8099     case ABSU_EXPR:
8100     case CONJ_EXPR:
8101     case REALPART_EXPR:
8102     case IMAGPART_EXPR:
8103     case NEGATE_EXPR:
8104     case BIT_NOT_EXPR:
8105     case TRUTH_NOT_EXPR:
8106     case NOP_EXPR:
8107     case VIEW_CONVERT_EXPR:
8108     case CONVERT_EXPR:
8109     case FLOAT_EXPR:
8110     case FIX_TRUNC_EXPR:
8111     case FIXED_CONVERT_EXPR:
8112     case ADDR_SPACE_CONVERT_EXPR:
8113 
8114       op1 = TREE_OPERAND (t, 0);
8115 
8116       t = const_unop (code, TREE_TYPE (t), op1);
8117       if (!t)
8118 	return NULL_TREE;
8119 
8120       if (CONVERT_EXPR_CODE_P (code)
8121 	  && TREE_OVERFLOW_P (t) && !TREE_OVERFLOW_P (op1))
8122 	TREE_OVERFLOW (t) = false;
8123       return t;
8124 
8125     default:
8126       return NULL_TREE;
8127     }
8128 }
8129 
8130 /* If T is a simple constant expression, returns its simplified value.
8131    Otherwise returns T.  In contrast to maybe_constant_value we
8132    simplify only few operations on constant-expressions, and we don't
8133    try to simplify constexpressions.  */
8134 
8135 tree
fold_simple(tree t)8136 fold_simple (tree t)
8137 {
8138   if (processing_template_decl)
8139     return t;
8140 
8141   tree r = fold_simple_1 (t);
8142   if (r)
8143     return r;
8144 
8145   return t;
8146 }
8147 
8148 /* Try folding the expression T to a simple constant.
8149    Returns that constant, otherwise returns T.  */
8150 
8151 tree
fold_to_constant(tree t)8152 fold_to_constant (tree t)
8153 {
8154   tree r = fold (t);
8155   if (CONSTANT_CLASS_P (r) && !TREE_OVERFLOW (r))
8156     return r;
8157   else
8158     return t;
8159 }
8160 
8161 /* If T is a constant expression, returns its reduced value.
8162    Otherwise, if T does not have TREE_CONSTANT set, returns T.
8163    Otherwise, returns a version of T without TREE_CONSTANT.
8164    MANIFESTLY_CONST_EVAL is true if T is manifestly const-evaluated
8165    as per P0595.  */
8166 
8167 static GTY((deletable)) hash_map<tree, tree> *cv_cache;
8168 
8169 tree
maybe_constant_value(tree t,tree decl,bool manifestly_const_eval)8170 maybe_constant_value (tree t, tree decl, bool manifestly_const_eval)
8171 {
8172   tree r;
8173 
8174   if (!is_nondependent_constant_expression (t))
8175     {
8176       if (TREE_OVERFLOW_P (t)
8177 	  || (!processing_template_decl && TREE_CONSTANT (t)))
8178 	t = mark_non_constant (t);
8179       return t;
8180     }
8181   else if (CONSTANT_CLASS_P (t))
8182     /* No caching or evaluation needed.  */
8183     return t;
8184 
8185   if (manifestly_const_eval)
8186     return cxx_eval_outermost_constant_expr (t, true, true, true, false, decl);
8187 
8188   if (cv_cache == NULL)
8189     cv_cache = hash_map<tree, tree>::create_ggc (101);
8190   if (tree *cached = cv_cache->get (t))
8191     {
8192       r = *cached;
8193       if (r != t)
8194 	{
8195 	  /* Clear processing_template_decl for sake of break_out_target_exprs;
8196 	     entries in the cv_cache are non-templated.  */
8197 	  processing_template_decl_sentinel ptds;
8198 
8199 	  r = break_out_target_exprs (r, /*clear_loc*/true);
8200 	  protected_set_expr_location (r, EXPR_LOCATION (t));
8201 	}
8202       return r;
8203     }
8204 
8205   /* Don't constant evaluate an unevaluated non-manifestly-constant operand,
8206      but at least try folding it to a simple constant.  */
8207   if (cp_unevaluated_operand)
8208     return fold_to_constant (t);
8209 
8210   uid_sensitive_constexpr_evaluation_checker c;
8211   r = cxx_eval_outermost_constant_expr (t, true, true, false, false, decl);
8212   gcc_checking_assert (r == t
8213 		       || CONVERT_EXPR_P (t)
8214 		       || TREE_CODE (t) == VIEW_CONVERT_EXPR
8215 		       || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
8216 		       || !cp_tree_equal (r, t));
8217   if (!c.evaluation_restricted_p ())
8218     cv_cache->put (t, r);
8219   return r;
8220 }
8221 
8222 /* Dispose of the whole CV_CACHE.  */
8223 
8224 static void
clear_cv_cache(void)8225 clear_cv_cache (void)
8226 {
8227   if (cv_cache != NULL)
8228     cv_cache->empty ();
8229 }
8230 
8231 /* Dispose of the whole CV_CACHE and FOLD_CACHE.  */
8232 
8233 void
clear_cv_and_fold_caches()8234 clear_cv_and_fold_caches ()
8235 {
8236   clear_cv_cache ();
8237   clear_fold_cache ();
8238 }
8239 
8240 /* Internal function handling expressions in templates for
8241    fold_non_dependent_expr and fold_non_dependent_init.
8242 
8243    If we're in a template, but T isn't value dependent, simplify
8244    it.  We're supposed to treat:
8245 
8246      template <typename T> void f(T[1 + 1]);
8247      template <typename T> void f(T[2]);
8248 
8249    as two declarations of the same function, for example.  */
8250 
8251 static tree
fold_non_dependent_expr_template(tree t,tsubst_flags_t complain,bool manifestly_const_eval,tree object)8252 fold_non_dependent_expr_template (tree t, tsubst_flags_t complain,
8253 				  bool manifestly_const_eval,
8254 				  tree object)
8255 {
8256   gcc_assert (processing_template_decl);
8257 
8258   if (is_nondependent_constant_expression (t))
8259     {
8260       processing_template_decl_sentinel s;
8261       t = instantiate_non_dependent_expr_internal (t, complain);
8262 
8263       if (type_unknown_p (t) || BRACE_ENCLOSED_INITIALIZER_P (t))
8264 	{
8265 	  if (TREE_OVERFLOW_P (t))
8266 	    {
8267 	      t = build_nop (TREE_TYPE (t), t);
8268 	      TREE_CONSTANT (t) = false;
8269 	    }
8270 	  return t;
8271 	}
8272       else if (CONSTANT_CLASS_P (t))
8273 	/* No evaluation needed.  */
8274 	return t;
8275 
8276       /* Don't constant evaluate an unevaluated non-manifestly-constant operand,
8277 	 but at least try folding it to a simple constant.  */
8278       if (cp_unevaluated_operand && !manifestly_const_eval)
8279 	return fold_to_constant (t);
8280 
8281       tree r = cxx_eval_outermost_constant_expr (t, true, true,
8282 						 manifestly_const_eval,
8283 						 false, object);
8284       /* cp_tree_equal looks through NOPs, so allow them.  */
8285       gcc_checking_assert (r == t
8286 			   || CONVERT_EXPR_P (t)
8287 			   || TREE_CODE (t) == VIEW_CONVERT_EXPR
8288 			   || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
8289 			   || !cp_tree_equal (r, t));
8290       return r;
8291     }
8292   else if (TREE_OVERFLOW_P (t))
8293     {
8294       t = build_nop (TREE_TYPE (t), t);
8295       TREE_CONSTANT (t) = false;
8296     }
8297 
8298   return t;
8299 }
8300 
8301 /* Like maybe_constant_value but first fully instantiate the argument.
8302 
8303    Note: this is equivalent to instantiate_non_dependent_expr_sfinae
8304    (t, complain) followed by maybe_constant_value but is more efficient,
8305    because it calls instantiation_dependent_expression_p and
8306    potential_constant_expression at most once.
8307    The manifestly_const_eval argument is passed to maybe_constant_value.
8308 
8309    Callers should generally pass their active complain, or if they are in a
8310    non-template, diagnosing context, they can use the default of
8311    tf_warning_or_error.  Callers that might be within a template context, don't
8312    have a complain parameter, and aren't going to remember the result for long
8313    (e.g. null_ptr_cst_p), can pass tf_none and deal with error_mark_node
8314    appropriately.  */
8315 
8316 tree
fold_non_dependent_expr(tree t,tsubst_flags_t complain,bool manifestly_const_eval,tree object)8317 fold_non_dependent_expr (tree t,
8318 			 tsubst_flags_t complain /* = tf_warning_or_error */,
8319 			 bool manifestly_const_eval /* = false */,
8320 			 tree object /* = NULL_TREE */)
8321 {
8322   if (t == NULL_TREE)
8323     return NULL_TREE;
8324 
8325   if (processing_template_decl)
8326     return fold_non_dependent_expr_template (t, complain,
8327 					     manifestly_const_eval, object);
8328 
8329   return maybe_constant_value (t, object, manifestly_const_eval);
8330 }
8331 
8332 /* Like fold_non_dependent_expr, but if EXPR couldn't be folded to a constant,
8333    return the original expression.  */
8334 
8335 tree
maybe_fold_non_dependent_expr(tree expr,tsubst_flags_t complain)8336 maybe_fold_non_dependent_expr (tree expr,
8337 			       tsubst_flags_t complain/*=tf_warning_or_error*/)
8338 {
8339   tree t = fold_non_dependent_expr (expr, complain);
8340   if (t && TREE_CONSTANT (t))
8341     return t;
8342 
8343   return expr;
8344 }
8345 
8346 /* Like maybe_constant_init but first fully instantiate the argument.  */
8347 
8348 tree
fold_non_dependent_init(tree t,tsubst_flags_t complain,bool manifestly_const_eval,tree object)8349 fold_non_dependent_init (tree t,
8350 			 tsubst_flags_t complain /*=tf_warning_or_error*/,
8351 			 bool manifestly_const_eval /*=false*/,
8352 			 tree object /* = NULL_TREE */)
8353 {
8354   if (t == NULL_TREE)
8355     return NULL_TREE;
8356 
8357   if (processing_template_decl)
8358     {
8359       t = fold_non_dependent_expr_template (t, complain,
8360 					    manifestly_const_eval, object);
8361       /* maybe_constant_init does this stripping, so do it here too.  */
8362       if (TREE_CODE (t) == TARGET_EXPR)
8363 	{
8364 	  tree init = TARGET_EXPR_INITIAL (t);
8365 	  if (TREE_CODE (init) == CONSTRUCTOR)
8366 	    t = init;
8367 	}
8368       return t;
8369     }
8370 
8371   return maybe_constant_init (t, object, manifestly_const_eval);
8372 }
8373 
8374 /* Like maybe_constant_value, but returns a CONSTRUCTOR directly, rather
8375    than wrapped in a TARGET_EXPR.
8376    ALLOW_NON_CONSTANT is false if T is required to be a constant expression.
8377    MANIFESTLY_CONST_EVAL is true if T is manifestly const-evaluated as
8378    per P0595 even when ALLOW_NON_CONSTANT is true.  */
8379 
8380 static tree
maybe_constant_init_1(tree t,tree decl,bool allow_non_constant,bool manifestly_const_eval)8381 maybe_constant_init_1 (tree t, tree decl, bool allow_non_constant,
8382 		       bool manifestly_const_eval)
8383 {
8384   if (!t)
8385     return t;
8386   if (TREE_CODE (t) == EXPR_STMT)
8387     t = TREE_OPERAND (t, 0);
8388   if (TREE_CODE (t) == CONVERT_EXPR
8389       && VOID_TYPE_P (TREE_TYPE (t)))
8390     t = TREE_OPERAND (t, 0);
8391   if (TREE_CODE (t) == INIT_EXPR)
8392     t = TREE_OPERAND (t, 1);
8393   if (TREE_CODE (t) == TARGET_EXPR)
8394     t = TARGET_EXPR_INITIAL (t);
8395   if (!is_nondependent_static_init_expression (t))
8396     /* Don't try to evaluate it.  */;
8397   else if (CONSTANT_CLASS_P (t) && allow_non_constant)
8398     /* No evaluation needed.  */;
8399   else
8400     t = cxx_eval_outermost_constant_expr (t, allow_non_constant,
8401 					  /*strict*/false,
8402 					  manifestly_const_eval, false, decl);
8403   if (TREE_CODE (t) == TARGET_EXPR)
8404     {
8405       tree init = TARGET_EXPR_INITIAL (t);
8406       if (TREE_CODE (init) == CONSTRUCTOR)
8407 	t = init;
8408     }
8409   return t;
8410 }
8411 
8412 /* Wrapper for maybe_constant_init_1 which permits non constants.  */
8413 
8414 tree
maybe_constant_init(tree t,tree decl,bool manifestly_const_eval)8415 maybe_constant_init (tree t, tree decl, bool manifestly_const_eval)
8416 {
8417   return maybe_constant_init_1 (t, decl, true, manifestly_const_eval);
8418 }
8419 
8420 /* Wrapper for maybe_constant_init_1 which does not permit non constants.  */
8421 
8422 tree
cxx_constant_init(tree t,tree decl)8423 cxx_constant_init (tree t, tree decl)
8424 {
8425   return maybe_constant_init_1 (t, decl, false, true);
8426 }
8427 
8428 #if 0
8429 /* FIXME see ADDR_EXPR section in potential_constant_expression_1.  */
8430 /* Return true if the object referred to by REF has automatic or thread
8431    local storage.  */
8432 
8433 enum { ck_ok, ck_bad, ck_unknown };
8434 static int
8435 check_automatic_or_tls (tree ref)
8436 {
8437   machine_mode mode;
8438   poly_int64 bitsize, bitpos;
8439   tree offset;
8440   int volatilep = 0, unsignedp = 0;
8441   tree decl = get_inner_reference (ref, &bitsize, &bitpos, &offset,
8442 				   &mode, &unsignedp, &volatilep, false);
8443   duration_kind dk;
8444 
8445   /* If there isn't a decl in the middle, we don't know the linkage here,
8446      and this isn't a constant expression anyway.  */
8447   if (!DECL_P (decl))
8448     return ck_unknown;
8449   dk = decl_storage_duration (decl);
8450   return (dk == dk_auto || dk == dk_thread) ? ck_bad : ck_ok;
8451 }
8452 #endif
8453 
8454 /* Data structure for passing data from potential_constant_expression_1
8455    to check_for_return_continue via cp_walk_tree.  */
8456 struct check_for_return_continue_data {
8457   hash_set<tree> *pset;
8458   tree continue_stmt;
8459   tree break_stmt;
8460 };
8461 
8462 /* Helper function for potential_constant_expression_1 SWITCH_STMT handling,
8463    called through cp_walk_tree.  Return the first RETURN_EXPR found, or note
8464    the first CONTINUE_STMT and/or BREAK_STMT if RETURN_EXPR is not found.  */
8465 static tree
check_for_return_continue(tree * tp,int * walk_subtrees,void * data)8466 check_for_return_continue (tree *tp, int *walk_subtrees, void *data)
8467 {
8468   tree t = *tp, s, b;
8469   check_for_return_continue_data *d = (check_for_return_continue_data *) data;
8470   switch (TREE_CODE (t))
8471     {
8472     case RETURN_EXPR:
8473       return t;
8474 
8475     case CONTINUE_STMT:
8476       if (d->continue_stmt == NULL_TREE)
8477 	d->continue_stmt = t;
8478       break;
8479 
8480     case BREAK_STMT:
8481       if (d->break_stmt == NULL_TREE)
8482 	d->break_stmt = t;
8483       break;
8484 
8485 #define RECUR(x) \
8486       if (tree r = cp_walk_tree (&x, check_for_return_continue, data,	\
8487 				 d->pset))				\
8488 	return r
8489 
8490       /* For loops, walk subtrees manually, so that continue stmts found
8491 	 inside of the bodies of the loops are ignored.  */
8492     case DO_STMT:
8493       *walk_subtrees = 0;
8494       RECUR (DO_COND (t));
8495       s = d->continue_stmt;
8496       b = d->break_stmt;
8497       RECUR (DO_BODY (t));
8498       d->continue_stmt = s;
8499       d->break_stmt = b;
8500       break;
8501 
8502     case WHILE_STMT:
8503       *walk_subtrees = 0;
8504       RECUR (WHILE_COND (t));
8505       s = d->continue_stmt;
8506       b = d->break_stmt;
8507       RECUR (WHILE_BODY (t));
8508       d->continue_stmt = s;
8509       d->break_stmt = b;
8510       break;
8511 
8512     case FOR_STMT:
8513       *walk_subtrees = 0;
8514       RECUR (FOR_INIT_STMT (t));
8515       RECUR (FOR_COND (t));
8516       RECUR (FOR_EXPR (t));
8517       s = d->continue_stmt;
8518       b = d->break_stmt;
8519       RECUR (FOR_BODY (t));
8520       d->continue_stmt = s;
8521       d->break_stmt = b;
8522       break;
8523 
8524     case RANGE_FOR_STMT:
8525       *walk_subtrees = 0;
8526       RECUR (RANGE_FOR_EXPR (t));
8527       s = d->continue_stmt;
8528       b = d->break_stmt;
8529       RECUR (RANGE_FOR_BODY (t));
8530       d->continue_stmt = s;
8531       d->break_stmt = b;
8532       break;
8533 
8534     case SWITCH_STMT:
8535       *walk_subtrees = 0;
8536       RECUR (SWITCH_STMT_COND (t));
8537       b = d->break_stmt;
8538       RECUR (SWITCH_STMT_BODY (t));
8539       d->break_stmt = b;
8540       break;
8541 #undef RECUR
8542 
8543     case STATEMENT_LIST:
8544     case CONSTRUCTOR:
8545       break;
8546 
8547     default:
8548       if (!EXPR_P (t))
8549 	*walk_subtrees = 0;
8550       break;
8551     }
8552 
8553   return NULL_TREE;
8554 }
8555 
8556 /* Return true if T denotes a potentially constant expression.  Issue
8557    diagnostic as appropriate under control of FLAGS.  If WANT_RVAL is true,
8558    an lvalue-rvalue conversion is implied.  If NOW is true, we want to
8559    consider the expression in the current context, independent of constexpr
8560    substitution.
8561 
8562    C++0x [expr.const] used to say
8563 
8564    6 An expression is a potential constant expression if it is
8565      a constant expression where all occurrences of function
8566      parameters are replaced by arbitrary constant expressions
8567      of the appropriate type.
8568 
8569    2  A conditional expression is a constant expression unless it
8570       involves one of the following as a potentially evaluated
8571       subexpression (3.2), but subexpressions of logical AND (5.14),
8572       logical OR (5.15), and conditional (5.16) operations that are
8573       not evaluated are not considered.   */
8574 
8575 static bool
potential_constant_expression_1(tree t,bool want_rval,bool strict,bool now,tsubst_flags_t flags,tree * jump_target)8576 potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
8577 				 tsubst_flags_t flags, tree *jump_target)
8578 {
8579 #define RECUR(T,RV) \
8580   potential_constant_expression_1 ((T), (RV), strict, now, flags, jump_target)
8581 
8582   enum { any = false, rval = true };
8583   int i;
8584   tree tmp;
8585 
8586   if (t == error_mark_node)
8587     return false;
8588   if (t == NULL_TREE)
8589     return true;
8590   location_t loc = cp_expr_loc_or_input_loc (t);
8591 
8592   if (*jump_target)
8593     /* If we are jumping, ignore everything.  This is simpler than the
8594        cxx_eval_constant_expression handling because we only need to be
8595        conservatively correct, and we don't necessarily have a constant value
8596        available, so we don't bother with switch tracking.  */
8597     return true;
8598 
8599   if (TREE_THIS_VOLATILE (t) && want_rval)
8600     {
8601       if (flags & tf_error)
8602 	error_at (loc, "lvalue-to-rvalue conversion of a volatile lvalue "
8603 		  "%qE with type %qT", t, TREE_TYPE (t));
8604       return false;
8605     }
8606   if (CONSTANT_CLASS_P (t))
8607     return true;
8608   if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPED)
8609       && TREE_TYPE (t) == error_mark_node)
8610     return false;
8611 
8612   switch (TREE_CODE (t))
8613     {
8614     case FUNCTION_DECL:
8615     case BASELINK:
8616     case TEMPLATE_DECL:
8617     case OVERLOAD:
8618     case TEMPLATE_ID_EXPR:
8619     case LABEL_DECL:
8620     case CASE_LABEL_EXPR:
8621     case PREDICT_EXPR:
8622     case CONST_DECL:
8623     case SIZEOF_EXPR:
8624     case ALIGNOF_EXPR:
8625     case OFFSETOF_EXPR:
8626     case NOEXCEPT_EXPR:
8627     case TEMPLATE_PARM_INDEX:
8628     case TRAIT_EXPR:
8629     case IDENTIFIER_NODE:
8630     case USERDEF_LITERAL:
8631       /* We can see a FIELD_DECL in a pointer-to-member expression.  */
8632     case FIELD_DECL:
8633     case RESULT_DECL:
8634     case USING_DECL:
8635     case USING_STMT:
8636     case PLACEHOLDER_EXPR:
8637     case REQUIRES_EXPR:
8638     case STATIC_ASSERT:
8639     case DEBUG_BEGIN_STMT:
8640       return true;
8641 
8642     case RETURN_EXPR:
8643       if (!RECUR (TREE_OPERAND (t, 0), any))
8644 	return false;
8645       /* FALLTHROUGH */
8646 
8647     case BREAK_STMT:
8648     case CONTINUE_STMT:
8649       *jump_target = t;
8650       return true;
8651 
8652     case PARM_DECL:
8653       if (now && want_rval)
8654 	{
8655 	  tree type = TREE_TYPE (t);
8656 	  if ((processing_template_decl && !COMPLETE_TYPE_P (type))
8657 	      || dependent_type_p (type)
8658 	      || is_really_empty_class (type, /*ignore_vptr*/false))
8659 	    /* An empty class has no data to read.  */
8660 	    return true;
8661 	  if (flags & tf_error)
8662 	    error ("%qE is not a constant expression", t);
8663 	  return false;
8664 	}
8665       return true;
8666 
8667     case AGGR_INIT_EXPR:
8668     case CALL_EXPR:
8669       /* -- an invocation of a function other than a constexpr function
8670             or a constexpr constructor.  */
8671       {
8672         tree fun = get_function_named_in_call (t);
8673         const int nargs = call_expr_nargs (t);
8674 	i = 0;
8675 
8676 	if (fun == NULL_TREE)
8677 	  {
8678 	    /* Reset to allow the function to continue past the end
8679 	       of the block below.  Otherwise return early.  */
8680 	    bool bail = true;
8681 
8682 	    if (TREE_CODE (t) == CALL_EXPR
8683 		&& CALL_EXPR_FN (t) == NULL_TREE)
8684 	      switch (CALL_EXPR_IFN (t))
8685 		{
8686 		/* These should be ignored, they are optimized away from
8687 		   constexpr functions.  */
8688 		case IFN_UBSAN_NULL:
8689 		case IFN_UBSAN_BOUNDS:
8690 		case IFN_UBSAN_VPTR:
8691 		case IFN_FALLTHROUGH:
8692 		  return true;
8693 
8694 		case IFN_ADD_OVERFLOW:
8695 		case IFN_SUB_OVERFLOW:
8696 		case IFN_MUL_OVERFLOW:
8697 		case IFN_LAUNDER:
8698 		case IFN_VEC_CONVERT:
8699 		  bail = false;
8700 		  break;
8701 
8702 		default:
8703 		  break;
8704 		}
8705 
8706 	    if (bail)
8707 	      {
8708 		/* fold_call_expr can't do anything with IFN calls.  */
8709 		if (flags & tf_error)
8710 		  error_at (loc, "call to internal function %qE", t);
8711 		return false;
8712 	      }
8713 	  }
8714 
8715 	if (fun && is_overloaded_fn (fun))
8716 	  {
8717 	    if (TREE_CODE (fun) == FUNCTION_DECL)
8718 	      {
8719 		if (builtin_valid_in_constant_expr_p (fun))
8720 		  return true;
8721 		if (!maybe_constexpr_fn (fun)
8722 		    /* Allow any built-in function; if the expansion
8723 		       isn't constant, we'll deal with that then.  */
8724 		    && !fndecl_built_in_p (fun)
8725 		    /* In C++20, replaceable global allocation functions
8726 		       are constant expressions.  */
8727 		    && (!cxx_replaceable_global_alloc_fn (fun)
8728 			|| TREE_CODE (t) != CALL_EXPR
8729 			|| (!CALL_FROM_NEW_OR_DELETE_P (t)
8730 			    && (current_function_decl == NULL_TREE
8731 				|| !is_std_allocator_allocate
8732 						(current_function_decl))))
8733 		    /* Allow placement new in std::construct_at.  */
8734 		    && (!cxx_placement_new_fn (fun)
8735 			|| TREE_CODE (t) != CALL_EXPR
8736 			|| current_function_decl == NULL_TREE
8737 			|| !is_std_construct_at (current_function_decl))
8738 		    && !cxx_dynamic_cast_fn_p (fun))
8739 		  {
8740 		    if (flags & tf_error)
8741 		      {
8742 			error_at (loc, "call to non-%<constexpr%> function %qD",
8743 				  fun);
8744 			explain_invalid_constexpr_fn (fun);
8745 		      }
8746 		    return false;
8747 		  }
8748 		/* A call to a non-static member function takes the address
8749 		   of the object as the first argument.  But in a constant
8750 		   expression the address will be folded away, so look
8751 		   through it now.  */
8752 		if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
8753 		    && !DECL_CONSTRUCTOR_P (fun))
8754 		  {
8755 		    tree x = get_nth_callarg (t, 0);
8756 		    if (is_this_parameter (x))
8757 		      return true;
8758 		    /* Don't require an immediately constant value, as
8759 		       constexpr substitution might not use the value.  */
8760 		    bool sub_now = false;
8761 		    if (!potential_constant_expression_1 (x, rval, strict,
8762 							  sub_now, flags,
8763 							  jump_target))
8764 		      return false;
8765 		    i = 1;
8766 		  }
8767 	      }
8768 	    else
8769 	      {
8770 		if (!RECUR (fun, true))
8771 		  return false;
8772 		fun = get_first_fn (fun);
8773 	      }
8774 	    /* Skip initial arguments to base constructors.  */
8775 	    if (DECL_BASE_CONSTRUCTOR_P (fun))
8776 	      i = num_artificial_parms_for (fun);
8777 	    fun = DECL_ORIGIN (fun);
8778 	  }
8779 	else if (fun)
8780           {
8781 	    if (TREE_TYPE (fun)
8782 		&& FUNCTION_POINTER_TYPE_P (TREE_TYPE (fun)))
8783 	      want_rval = rval;
8784 	    else
8785 	      want_rval = any;
8786 	    if (RECUR (fun, want_rval))
8787 	      /* Might end up being a constant function pointer.  But it
8788 		 could also be a function object with constexpr op(), so
8789 		 we pass 'any' so that the underlying VAR_DECL is deemed
8790 		 as potentially-constant even though it wasn't declared
8791 		 constexpr.  */;
8792 	    else
8793 	      return false;
8794           }
8795         for (; i < nargs; ++i)
8796           {
8797             tree x = get_nth_callarg (t, i);
8798 	    /* In a template, reference arguments haven't been converted to
8799 	       REFERENCE_TYPE and we might not even know if the parameter
8800 	       is a reference, so accept lvalue constants too.  */
8801 	    bool rv = processing_template_decl ? any : rval;
8802 	    /* Don't require an immediately constant value, as constexpr
8803 	       substitution might not use the value of the argument.  */
8804 	    bool sub_now = false;
8805 	    if (!potential_constant_expression_1 (x, rv, strict,
8806 						  sub_now, flags, jump_target))
8807 	      return false;
8808           }
8809         return true;
8810       }
8811 
8812     case NON_LVALUE_EXPR:
8813       /* -- an lvalue-to-rvalue conversion (4.1) unless it is applied to
8814             -- an lvalue of integral type that refers to a non-volatile
8815                const variable or static data member initialized with
8816                constant expressions, or
8817 
8818             -- an lvalue of literal type that refers to non-volatile
8819                object defined with constexpr, or that refers to a
8820                sub-object of such an object;  */
8821       return RECUR (TREE_OPERAND (t, 0), rval);
8822 
8823     case VAR_DECL:
8824       if (DECL_HAS_VALUE_EXPR_P (t))
8825 	{
8826 	  if (now && is_normal_capture_proxy (t))
8827 	    {
8828 	      /* -- in a lambda-expression, a reference to this or to a
8829 		 variable with automatic storage duration defined outside that
8830 		 lambda-expression, where the reference would be an
8831 		 odr-use.  */
8832 
8833 	      if (want_rval)
8834 		/* Since we're doing an lvalue-rvalue conversion, this might
8835 		   not be an odr-use, so evaluate the variable directly. */
8836 		return RECUR (DECL_CAPTURED_VARIABLE (t), rval);
8837 
8838 	      if (flags & tf_error)
8839 		{
8840 		  tree cap = DECL_CAPTURED_VARIABLE (t);
8841 		  error ("lambda capture of %qE is not a constant expression",
8842 			 cap);
8843 		  if (decl_constant_var_p (cap))
8844 		    inform (input_location, "because it is used as a glvalue");
8845 		}
8846 	      return false;
8847 	    }
8848 	  /* Treat __PRETTY_FUNCTION__ inside a template function as
8849 	     potentially-constant.  */
8850 	  else if (DECL_PRETTY_FUNCTION_P (t)
8851 		   && DECL_VALUE_EXPR (t) == error_mark_node)
8852 	    return true;
8853 	  return RECUR (DECL_VALUE_EXPR (t), rval);
8854 	}
8855       if (want_rval
8856 	  && (now || !var_in_maybe_constexpr_fn (t))
8857 	  && !type_dependent_expression_p (t)
8858 	  && !decl_maybe_constant_var_p (t)
8859 	  && (strict
8860 	      || !CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (t))
8861 	      || (DECL_INITIAL (t)
8862 		  && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (t)))
8863 	  && COMPLETE_TYPE_P (TREE_TYPE (t))
8864 	  && !is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
8865         {
8866           if (flags & tf_error)
8867 	    non_const_var_error (loc, t);
8868           return false;
8869         }
8870       return true;
8871 
8872     case NOP_EXPR:
8873       if (REINTERPRET_CAST_P (t))
8874 	{
8875 	  if (flags & tf_error)
8876 	    error_at (loc, "%<reinterpret_cast%> is not a constant expression");
8877 	  return false;
8878 	}
8879       /* FALLTHRU */
8880     case CONVERT_EXPR:
8881     case VIEW_CONVERT_EXPR:
8882       /* -- a reinterpret_cast.  FIXME not implemented, and this rule
8883 	 may change to something more specific to type-punning (DR 1312).  */
8884       {
8885         tree from = TREE_OPERAND (t, 0);
8886 	if (location_wrapper_p (t))
8887 	  return (RECUR (from, want_rval));
8888 	if (INDIRECT_TYPE_P (TREE_TYPE (t)))
8889 	  {
8890 	    STRIP_ANY_LOCATION_WRAPPER (from);
8891 	    if (TREE_CODE (from) == INTEGER_CST
8892 		&& !integer_zerop (from))
8893 	      {
8894 		if (flags & tf_error)
8895 		  error_at (loc,
8896 			    "%<reinterpret_cast%> from integer to pointer");
8897 		return false;
8898 	      }
8899 	  }
8900         return (RECUR (from, TREE_CODE (t) != VIEW_CONVERT_EXPR));
8901       }
8902 
8903     case ADDRESSOF_EXPR:
8904       /* This is like ADDR_EXPR, except it won't form pointer-to-member.  */
8905       t = TREE_OPERAND (t, 0);
8906       goto handle_addr_expr;
8907 
8908     case ADDR_EXPR:
8909       /* -- a unary operator & that is applied to an lvalue that
8910             designates an object with thread or automatic storage
8911             duration;  */
8912       t = TREE_OPERAND (t, 0);
8913 
8914       if (TREE_CODE (t) == OFFSET_REF && PTRMEM_OK_P (t))
8915 	/* A pointer-to-member constant.  */
8916 	return true;
8917 
8918     handle_addr_expr:
8919 #if 0
8920       /* FIXME adjust when issue 1197 is fully resolved.  For now don't do
8921          any checking here, as we might dereference the pointer later.  If
8922          we remove this code, also remove check_automatic_or_tls.  */
8923       i = check_automatic_or_tls (t);
8924       if (i == ck_ok)
8925 	return true;
8926       if (i == ck_bad)
8927         {
8928           if (flags & tf_error)
8929             error ("address-of an object %qE with thread local or "
8930                    "automatic storage is not a constant expression", t);
8931           return false;
8932         }
8933 #endif
8934       return RECUR (t, any);
8935 
8936     case COMPONENT_REF:
8937     case ARROW_EXPR:
8938     case OFFSET_REF:
8939       /* -- a class member access unless its postfix-expression is
8940             of literal type or of pointer to literal type.  */
8941       /* This test would be redundant, as it follows from the
8942 	 postfix-expression being a potential constant expression.  */
8943       if (type_unknown_p (t))
8944 	return true;
8945       if (is_overloaded_fn (t))
8946 	/* In a template, a COMPONENT_REF of a function expresses ob.fn(),
8947 	   which uses ob as an lvalue.  */
8948 	want_rval = false;
8949       gcc_fallthrough ();
8950 
8951     case REALPART_EXPR:
8952     case IMAGPART_EXPR:
8953     case BIT_FIELD_REF:
8954       return RECUR (TREE_OPERAND (t, 0), want_rval);
8955 
8956     case EXPR_PACK_EXPANSION:
8957       return RECUR (PACK_EXPANSION_PATTERN (t), want_rval);
8958 
8959     case INDIRECT_REF:
8960       {
8961         tree x = TREE_OPERAND (t, 0);
8962         STRIP_NOPS (x);
8963         if (is_this_parameter (x) && !is_capture_proxy (x))
8964 	  {
8965 	    if (now || !var_in_maybe_constexpr_fn (x))
8966 	      {
8967 		if (flags & tf_error)
8968 		  error_at (loc, "use of %<this%> in a constant expression");
8969 		return false;
8970 	      }
8971 	    return true;
8972 	  }
8973 	return RECUR (x, rval);
8974       }
8975 
8976     case STATEMENT_LIST:
8977       for (tree stmt : tsi_range (t))
8978 	if (!RECUR (stmt, any))
8979 	  return false;
8980       return true;
8981 
8982     case MODIFY_EXPR:
8983       if (cxx_dialect < cxx14)
8984 	goto fail;
8985       if (!RECUR (TREE_OPERAND (t, 0), any))
8986 	return false;
8987       /* Just ignore clobbers.  */
8988       if (TREE_CLOBBER_P (TREE_OPERAND (t, 1)))
8989 	return true;
8990       if (!RECUR (TREE_OPERAND (t, 1), rval))
8991 	return false;
8992       return true;
8993 
8994     case MODOP_EXPR:
8995       if (cxx_dialect < cxx14)
8996 	goto fail;
8997       if (!RECUR (TREE_OPERAND (t, 0), rval))
8998 	return false;
8999       if (!RECUR (TREE_OPERAND (t, 2), rval))
9000 	return false;
9001       return true;
9002 
9003     case DO_STMT:
9004       if (!RECUR (DO_COND (t), rval))
9005 	return false;
9006       if (!RECUR (DO_BODY (t), any))
9007 	return false;
9008       if (breaks (jump_target) || continues (jump_target))
9009 	*jump_target = NULL_TREE;
9010       return true;
9011 
9012     case FOR_STMT:
9013       if (!RECUR (FOR_INIT_STMT (t), any))
9014 	return false;
9015       tmp = FOR_COND (t);
9016       if (!RECUR (tmp, rval))
9017 	return false;
9018       if (tmp)
9019 	{
9020 	  if (!processing_template_decl)
9021 	    tmp = cxx_eval_outermost_constant_expr (tmp, true);
9022 	  /* If we couldn't evaluate the condition, it might not ever be
9023 	     true.  */
9024 	  if (!integer_onep (tmp))
9025 	    {
9026 	      /* Before returning true, check if the for body can contain
9027 		 a return.  */
9028 	      hash_set<tree> pset;
9029 	      check_for_return_continue_data data = { &pset, NULL_TREE,
9030 						      NULL_TREE };
9031 	      if (tree ret_expr
9032 		  = cp_walk_tree (&FOR_BODY (t), check_for_return_continue,
9033 				  &data, &pset))
9034 		*jump_target = ret_expr;
9035 	      return true;
9036 	    }
9037 	}
9038       if (!RECUR (FOR_EXPR (t), any))
9039 	return false;
9040       if (!RECUR (FOR_BODY (t), any))
9041 	return false;
9042       if (breaks (jump_target) || continues (jump_target))
9043 	*jump_target = NULL_TREE;
9044       return true;
9045 
9046     case RANGE_FOR_STMT:
9047       if (!RECUR (RANGE_FOR_INIT_STMT (t), any))
9048 	return false;
9049       if (!RECUR (RANGE_FOR_EXPR (t), any))
9050 	return false;
9051       if (!RECUR (RANGE_FOR_BODY (t), any))
9052 	return false;
9053       if (breaks (jump_target) || continues (jump_target))
9054 	*jump_target = NULL_TREE;
9055       return true;
9056 
9057     case WHILE_STMT:
9058       tmp = WHILE_COND (t);
9059       if (!RECUR (tmp, rval))
9060 	return false;
9061       if (!processing_template_decl)
9062 	tmp = cxx_eval_outermost_constant_expr (tmp, true);
9063       /* If we couldn't evaluate the condition, it might not ever be true.  */
9064       if (!integer_onep (tmp))
9065 	{
9066 	  /* Before returning true, check if the while body can contain
9067 	     a return.  */
9068 	  hash_set<tree> pset;
9069 	  check_for_return_continue_data data = { &pset, NULL_TREE,
9070 						  NULL_TREE  };
9071 	  if (tree ret_expr
9072 	      = cp_walk_tree (&WHILE_BODY (t), check_for_return_continue,
9073 			      &data, &pset))
9074 	    *jump_target = ret_expr;
9075 	  return true;
9076 	}
9077       if (!RECUR (WHILE_BODY (t), any))
9078 	return false;
9079       if (breaks (jump_target) || continues (jump_target))
9080 	*jump_target = NULL_TREE;
9081       return true;
9082 
9083     case SWITCH_STMT:
9084       if (!RECUR (SWITCH_STMT_COND (t), rval))
9085 	return false;
9086       /* FIXME we don't check SWITCH_STMT_BODY currently, because even
9087 	 unreachable labels would be checked and it is enough if there is
9088 	 a single switch cond value for which it is a valid constant
9089 	 expression.  We need to check if there are any RETURN_EXPRs
9090 	 or CONTINUE_STMTs inside of the body though, as in that case
9091 	 we need to set *jump_target.  */
9092       else
9093 	{
9094 	  hash_set<tree> pset;
9095 	  check_for_return_continue_data data = { &pset, NULL_TREE,
9096 						  NULL_TREE };
9097 	  if (tree ret_expr
9098 	      = cp_walk_tree (&SWITCH_STMT_BODY (t), check_for_return_continue,
9099 			      &data, &pset))
9100 	    /* The switch might return.  */
9101 	    *jump_target = ret_expr;
9102 	  else if (data.continue_stmt)
9103 	    /* The switch can't return, but might continue.  */
9104 	    *jump_target = data.continue_stmt;
9105 	}
9106       return true;
9107 
9108     case STMT_EXPR:
9109       return RECUR (STMT_EXPR_STMT (t), rval);
9110 
9111     case LAMBDA_EXPR:
9112       if (cxx_dialect >= cxx17)
9113 	/* In C++17 lambdas can be constexpr, don't give up yet.  */
9114 	return true;
9115       else if (flags & tf_error)
9116 	error_at (loc, "lambda-expression is not a constant expression "
9117 		  "before C++17");
9118       return false;
9119 
9120     case DYNAMIC_CAST_EXPR:
9121     case PSEUDO_DTOR_EXPR:
9122     case NEW_EXPR:
9123     case VEC_NEW_EXPR:
9124     case DELETE_EXPR:
9125     case VEC_DELETE_EXPR:
9126     case THROW_EXPR:
9127     case OMP_PARALLEL:
9128     case OMP_TASK:
9129     case OMP_FOR:
9130     case OMP_SIMD:
9131     case OMP_DISTRIBUTE:
9132     case OMP_TASKLOOP:
9133     case OMP_LOOP:
9134     case OMP_TEAMS:
9135     case OMP_TARGET_DATA:
9136     case OMP_TARGET:
9137     case OMP_SECTIONS:
9138     case OMP_ORDERED:
9139     case OMP_CRITICAL:
9140     case OMP_SINGLE:
9141     case OMP_SCAN:
9142     case OMP_SCOPE:
9143     case OMP_SECTION:
9144     case OMP_MASTER:
9145     case OMP_MASKED:
9146     case OMP_TASKGROUP:
9147     case OMP_TARGET_UPDATE:
9148     case OMP_TARGET_ENTER_DATA:
9149     case OMP_TARGET_EXIT_DATA:
9150     case OMP_ATOMIC:
9151     case OMP_ATOMIC_READ:
9152     case OMP_ATOMIC_CAPTURE_OLD:
9153     case OMP_ATOMIC_CAPTURE_NEW:
9154     case OMP_DEPOBJ:
9155     case OACC_PARALLEL:
9156     case OACC_KERNELS:
9157     case OACC_SERIAL:
9158     case OACC_DATA:
9159     case OACC_HOST_DATA:
9160     case OACC_LOOP:
9161     case OACC_CACHE:
9162     case OACC_DECLARE:
9163     case OACC_ENTER_DATA:
9164     case OACC_EXIT_DATA:
9165     case OACC_UPDATE:
9166       /* GCC internal stuff.  */
9167     case VA_ARG_EXPR:
9168     case TRANSACTION_EXPR:
9169     case AT_ENCODE_EXPR:
9170     fail:
9171       if (flags & tf_error)
9172 	error_at (loc, "expression %qE is not a constant expression", t);
9173       return false;
9174 
9175     case ASM_EXPR:
9176       if (flags & tf_error)
9177 	inline_asm_in_constexpr_error (loc);
9178       return false;
9179 
9180     case OBJ_TYPE_REF:
9181       if (cxx_dialect >= cxx20)
9182 	/* In C++20 virtual calls can be constexpr, don't give up yet.  */
9183 	return true;
9184       else if (flags & tf_error)
9185 	error_at (loc,
9186 		  "virtual functions cannot be %<constexpr%> before C++20");
9187       return false;
9188 
9189     case TYPEID_EXPR:
9190       /* In C++20, a typeid expression whose operand is of polymorphic
9191 	 class type can be constexpr.  */
9192       {
9193         tree e = TREE_OPERAND (t, 0);
9194 	if (cxx_dialect < cxx20
9195 	    && strict
9196 	    && !TYPE_P (e)
9197 	    && !type_dependent_expression_p (e)
9198 	    && TYPE_POLYMORPHIC_P (TREE_TYPE (e)))
9199           {
9200             if (flags & tf_error)
9201 	      error_at (loc, "%<typeid%> is not a constant expression "
9202 			"because %qE is of polymorphic type", e);
9203             return false;
9204           }
9205         return true;
9206       }
9207 
9208     case POINTER_DIFF_EXPR:
9209     case MINUS_EXPR:
9210       want_rval = true;
9211       goto binary;
9212 
9213     case LT_EXPR:
9214     case LE_EXPR:
9215     case GT_EXPR:
9216     case GE_EXPR:
9217     case EQ_EXPR:
9218     case NE_EXPR:
9219     case SPACESHIP_EXPR:
9220       want_rval = true;
9221       goto binary;
9222 
9223     case PREINCREMENT_EXPR:
9224     case POSTINCREMENT_EXPR:
9225     case PREDECREMENT_EXPR:
9226     case POSTDECREMENT_EXPR:
9227       if (cxx_dialect < cxx14)
9228 	goto fail;
9229       goto unary;
9230 
9231     case BIT_NOT_EXPR:
9232       /* A destructor.  */
9233       if (TYPE_P (TREE_OPERAND (t, 0)))
9234 	return true;
9235       /* fall through.  */
9236 
9237     case CONJ_EXPR:
9238     case SAVE_EXPR:
9239     case FIX_TRUNC_EXPR:
9240     case FLOAT_EXPR:
9241     case NEGATE_EXPR:
9242     case ABS_EXPR:
9243     case ABSU_EXPR:
9244     case TRUTH_NOT_EXPR:
9245     case FIXED_CONVERT_EXPR:
9246     case UNARY_PLUS_EXPR:
9247     case UNARY_LEFT_FOLD_EXPR:
9248     case UNARY_RIGHT_FOLD_EXPR:
9249     unary:
9250       return RECUR (TREE_OPERAND (t, 0), rval);
9251 
9252     case CAST_EXPR:
9253     case CONST_CAST_EXPR:
9254     case STATIC_CAST_EXPR:
9255     case REINTERPRET_CAST_EXPR:
9256     case IMPLICIT_CONV_EXPR:
9257       if (cxx_dialect < cxx11
9258 	  && !dependent_type_p (TREE_TYPE (t))
9259 	  && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (t)))
9260 	/* In C++98, a conversion to non-integral type can't be part of a
9261 	   constant expression.  */
9262 	{
9263 	  if (flags & tf_error)
9264 	    error_at (loc,
9265 		      "cast to non-integral type %qT in a constant expression",
9266 		      TREE_TYPE (t));
9267 	  return false;
9268 	}
9269       /* This might be a conversion from a class to a (potentially) literal
9270 	 type.  Let's consider it potentially constant since the conversion
9271 	 might be a constexpr user-defined conversion.  */
9272       else if (cxx_dialect >= cxx11
9273 	       && (dependent_type_p (TREE_TYPE (t))
9274 		   || !COMPLETE_TYPE_P (TREE_TYPE (t))
9275 		   || literal_type_p (TREE_TYPE (t)))
9276 	       && TREE_OPERAND (t, 0))
9277 	{
9278 	  tree type = TREE_TYPE (TREE_OPERAND (t, 0));
9279 	  /* If this is a dependent type, it could end up being a class
9280 	     with conversions.  */
9281 	  if (type == NULL_TREE || WILDCARD_TYPE_P (type))
9282 	    return true;
9283 	  /* Or a non-dependent class which has conversions.  */
9284 	  else if (CLASS_TYPE_P (type)
9285 		   && (TYPE_HAS_CONVERSION (type) || dependent_scope_p (type)))
9286 	    return true;
9287 	}
9288 
9289       return (RECUR (TREE_OPERAND (t, 0),
9290 		     !TYPE_REF_P (TREE_TYPE (t))));
9291 
9292     case BIND_EXPR:
9293       return RECUR (BIND_EXPR_BODY (t), want_rval);
9294 
9295     case NON_DEPENDENT_EXPR:
9296       /* Treat NON_DEPENDENT_EXPR as non-constant: it's not handled by
9297 	 constexpr evaluation or tsubst, so fold_non_dependent_expr can't
9298 	 do anything useful with it.  And we shouldn't see it in a context
9299 	 where a constant expression is strictly required, hence the assert.  */
9300       gcc_checking_assert (!(flags & tf_error));
9301       return false;
9302 
9303     case CLEANUP_POINT_EXPR:
9304     case MUST_NOT_THROW_EXPR:
9305     case TRY_CATCH_EXPR:
9306     case TRY_BLOCK:
9307     case EH_SPEC_BLOCK:
9308     case EXPR_STMT:
9309     case PAREN_EXPR:
9310       /* For convenience.  */
9311     case LOOP_EXPR:
9312     case EXIT_EXPR:
9313       return RECUR (TREE_OPERAND (t, 0), want_rval);
9314 
9315     case DECL_EXPR:
9316       tmp = DECL_EXPR_DECL (t);
9317       if (VAR_P (tmp) && !DECL_ARTIFICIAL (tmp))
9318 	{
9319 	  if (CP_DECL_THREAD_LOCAL_P (tmp) && !DECL_REALLY_EXTERN (tmp))
9320 	    {
9321 	      if (flags & tf_error)
9322 		error_at (DECL_SOURCE_LOCATION (tmp), "%qD defined "
9323 			  "%<thread_local%> in %<constexpr%> context", tmp);
9324 	      return false;
9325 	    }
9326 	  else if (TREE_STATIC (tmp))
9327 	    {
9328 	      if (flags & tf_error)
9329 		error_at (DECL_SOURCE_LOCATION (tmp), "%qD defined "
9330 			  "%<static%> in %<constexpr%> context", tmp);
9331 	      return false;
9332 	    }
9333 	  else if (!check_for_uninitialized_const_var
9334 		   (tmp, /*constexpr_context_p=*/true, flags))
9335 	    return false;
9336 	}
9337       return RECUR (tmp, want_rval);
9338 
9339     case TRY_FINALLY_EXPR:
9340       return (RECUR (TREE_OPERAND (t, 0), want_rval)
9341 	      && RECUR (TREE_OPERAND (t, 1), any));
9342 
9343     case SCOPE_REF:
9344       return RECUR (TREE_OPERAND (t, 1), want_rval);
9345 
9346     case TARGET_EXPR:
9347       if (!TARGET_EXPR_DIRECT_INIT_P (t)
9348 	  && !literal_type_p (TREE_TYPE (t)))
9349 	{
9350 	  if (flags & tf_error)
9351 	    {
9352 	      auto_diagnostic_group d;
9353 	      error_at (loc, "temporary of non-literal type %qT in a "
9354 			"constant expression", TREE_TYPE (t));
9355 	      explain_non_literal_class (TREE_TYPE (t));
9356 	    }
9357 	  return false;
9358 	}
9359       /* FALLTHRU */
9360     case INIT_EXPR:
9361       return RECUR (TREE_OPERAND (t, 1), rval);
9362 
9363     case CONSTRUCTOR:
9364       {
9365         vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
9366         constructor_elt *ce;
9367         for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
9368 	  if (!RECUR (ce->value, want_rval))
9369 	    return false;
9370 	return true;
9371       }
9372 
9373     case TREE_LIST:
9374       {
9375 	gcc_assert (TREE_PURPOSE (t) == NULL_TREE
9376 		    || DECL_P (TREE_PURPOSE (t)));
9377 	if (!RECUR (TREE_VALUE (t), want_rval))
9378 	  return false;
9379 	if (TREE_CHAIN (t) == NULL_TREE)
9380 	  return true;
9381 	return RECUR (TREE_CHAIN (t), want_rval);
9382       }
9383 
9384     case TRUNC_DIV_EXPR:
9385     case CEIL_DIV_EXPR:
9386     case FLOOR_DIV_EXPR:
9387     case ROUND_DIV_EXPR:
9388     case TRUNC_MOD_EXPR:
9389     case CEIL_MOD_EXPR:
9390     case ROUND_MOD_EXPR:
9391       {
9392 	tree denom = TREE_OPERAND (t, 1);
9393 	if (!RECUR (denom, rval))
9394 	  return false;
9395 	/* We can't call cxx_eval_outermost_constant_expr on an expression
9396 	   that hasn't been through instantiate_non_dependent_expr yet.  */
9397 	if (!processing_template_decl)
9398 	  denom = cxx_eval_outermost_constant_expr (denom, true);
9399 	if (integer_zerop (denom))
9400 	  {
9401 	    if (flags & tf_error)
9402 	      error ("division by zero is not a constant expression");
9403 	    return false;
9404 	  }
9405 	else
9406 	  {
9407 	    want_rval = true;
9408 	    return RECUR (TREE_OPERAND (t, 0), want_rval);
9409 	  }
9410       }
9411 
9412     case COMPOUND_EXPR:
9413       {
9414 	/* check_return_expr sometimes wraps a TARGET_EXPR in a
9415 	   COMPOUND_EXPR; don't get confused.  */
9416 	tree op0 = TREE_OPERAND (t, 0);
9417 	tree op1 = TREE_OPERAND (t, 1);
9418 	STRIP_NOPS (op1);
9419 	if (TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
9420 	  return RECUR (op0, want_rval);
9421 	else
9422 	  goto binary;
9423       }
9424 
9425       /* If the first operand is the non-short-circuit constant, look at
9426 	 the second operand; otherwise we only care about the first one for
9427 	 potentiality.  */
9428     case TRUTH_AND_EXPR:
9429     case TRUTH_ANDIF_EXPR:
9430       tmp = boolean_true_node;
9431       goto truth;
9432     case TRUTH_OR_EXPR:
9433     case TRUTH_ORIF_EXPR:
9434       tmp = boolean_false_node;
9435     truth:
9436       {
9437 	tree op0 = TREE_OPERAND (t, 0);
9438 	tree op1 = TREE_OPERAND (t, 1);
9439 	if (!RECUR (op0, rval))
9440 	  return false;
9441 	if (!(flags & tf_error) && RECUR (op1, rval))
9442 	  /* When quiet, try to avoid expensive trial evaluation by first
9443 	     checking potentiality of the second operand.  */
9444 	  return true;
9445 	if (!processing_template_decl)
9446 	  op0 = cxx_eval_outermost_constant_expr (op0, true);
9447 	if (tree_int_cst_equal (op0, tmp))
9448 	  return (flags & tf_error) ? RECUR (op1, rval) : false;
9449 	else
9450 	  return true;
9451       }
9452 
9453     case PLUS_EXPR:
9454     case MULT_EXPR:
9455     case POINTER_PLUS_EXPR:
9456     case RDIV_EXPR:
9457     case EXACT_DIV_EXPR:
9458     case MIN_EXPR:
9459     case MAX_EXPR:
9460     case LSHIFT_EXPR:
9461     case RSHIFT_EXPR:
9462     case LROTATE_EXPR:
9463     case RROTATE_EXPR:
9464     case BIT_IOR_EXPR:
9465     case BIT_XOR_EXPR:
9466     case BIT_AND_EXPR:
9467     case TRUTH_XOR_EXPR:
9468     case UNORDERED_EXPR:
9469     case ORDERED_EXPR:
9470     case UNLT_EXPR:
9471     case UNLE_EXPR:
9472     case UNGT_EXPR:
9473     case UNGE_EXPR:
9474     case UNEQ_EXPR:
9475     case LTGT_EXPR:
9476     case RANGE_EXPR:
9477     case COMPLEX_EXPR:
9478       want_rval = true;
9479       /* Fall through.  */
9480     case ARRAY_REF:
9481     case ARRAY_RANGE_REF:
9482     case MEMBER_REF:
9483     case DOTSTAR_EXPR:
9484     case MEM_REF:
9485     case BINARY_LEFT_FOLD_EXPR:
9486     case BINARY_RIGHT_FOLD_EXPR:
9487     binary:
9488       for (i = 0; i < 2; ++i)
9489 	if (!RECUR (TREE_OPERAND (t, i), want_rval))
9490 	  return false;
9491       return true;
9492 
9493     case VEC_PERM_EXPR:
9494      for (i = 0; i < 3; ++i)
9495       if (!RECUR (TREE_OPERAND (t, i), true))
9496 	return false;
9497      return true;
9498 
9499     case COND_EXPR:
9500       if (COND_EXPR_IS_VEC_DELETE (t) && cxx_dialect < cxx20)
9501 	{
9502 	  if (flags & tf_error)
9503 	    error_at (loc, "%<delete[]%> is not a constant expression");
9504 	  return false;
9505 	}
9506       /* Fall through.  */
9507     case IF_STMT:
9508     case VEC_COND_EXPR:
9509       /* If the condition is a known constant, we know which of the legs we
9510 	 care about; otherwise we only require that the condition and
9511 	 either of the legs be potentially constant.  */
9512       tmp = TREE_OPERAND (t, 0);
9513       if (!RECUR (tmp, rval))
9514 	return false;
9515       if (!processing_template_decl)
9516 	tmp = cxx_eval_outermost_constant_expr (tmp, true);
9517       /* potential_constant_expression* isn't told if it is called for
9518 	 manifestly_const_eval or not, so for consteval if always
9519 	 process both branches as if the condition is not a known
9520 	 constant.  */
9521       if (TREE_CODE (t) != IF_STMT || !IF_STMT_CONSTEVAL_P (t))
9522 	{
9523 	  if (integer_zerop (tmp))
9524 	    return RECUR (TREE_OPERAND (t, 2), want_rval);
9525 	  else if (TREE_CODE (tmp) == INTEGER_CST)
9526 	    return RECUR (TREE_OPERAND (t, 1), want_rval);
9527 	}
9528       tmp = *jump_target;
9529       for (i = 1; i < 3; ++i)
9530 	{
9531 	  tree this_jump_target = tmp;
9532 	  if (potential_constant_expression_1 (TREE_OPERAND (t, i),
9533 					       want_rval, strict, now,
9534 					       tf_none, &this_jump_target))
9535 	    {
9536 	      if (returns (&this_jump_target))
9537 		*jump_target = this_jump_target;
9538 	      else if (!returns (jump_target))
9539 		{
9540 		  if (breaks (&this_jump_target)
9541 		      || continues (&this_jump_target))
9542 		    *jump_target = this_jump_target;
9543 		  if (i == 1)
9544 		    {
9545 		      /* If the then branch is potentially constant, but
9546 			 does not return, check if the else branch
9547 			 couldn't return, break or continue.  */
9548 		      hash_set<tree> pset;
9549 		      check_for_return_continue_data data = { &pset, NULL_TREE,
9550 							      NULL_TREE };
9551 		      if (tree ret_expr
9552 			= cp_walk_tree (&TREE_OPERAND (t, 2),
9553 					check_for_return_continue, &data,
9554 					&pset))
9555 			*jump_target = ret_expr;
9556 		      else if (*jump_target == NULL_TREE)
9557 			{
9558 			  if (data.continue_stmt)
9559 			    *jump_target = data.continue_stmt;
9560 			  else if (data.break_stmt)
9561 			    *jump_target = data.break_stmt;
9562 			}
9563 		    }
9564 		}
9565 	      return true;
9566 	    }
9567 	}
9568       if (flags & tf_error)
9569 	{
9570 	  if (TREE_CODE (t) == IF_STMT)
9571 	    error_at (loc, "neither branch of %<if%> is a constant expression");
9572 	  else
9573 	    error_at (loc, "expression %qE is not a constant expression", t);
9574 	}
9575       return false;
9576 
9577     case VEC_INIT_EXPR:
9578       if (VEC_INIT_EXPR_IS_CONSTEXPR (t))
9579 	return true;
9580       if (flags & tf_error)
9581 	{
9582 	  error_at (loc, "non-constant array initialization");
9583 	  diagnose_non_constexpr_vec_init (t);
9584 	}
9585       return false;
9586 
9587     case TYPE_DECL:
9588     case TAG_DEFN:
9589       /* We can see these in statement-expressions.  */
9590       return true;
9591 
9592     case CLEANUP_STMT:
9593       if (!RECUR (CLEANUP_BODY (t), any))
9594 	return false;
9595       if (!CLEANUP_EH_ONLY (t) && !RECUR (CLEANUP_EXPR (t), any))
9596 	return false;
9597       return true;
9598 
9599     case EMPTY_CLASS_EXPR:
9600       return true;
9601 
9602     case GOTO_EXPR:
9603       {
9604 	tree *target = &TREE_OPERAND (t, 0);
9605 	/* Gotos representing break, continue and cdtor return are OK.  */
9606 	if (breaks (target) || continues (target) || returns (target))
9607 	  {
9608 	    *jump_target = *target;
9609 	    return true;
9610 	  }
9611 	if (flags & tf_error)
9612 	  error_at (loc, "%<goto%> is not a constant expression");
9613 	return false;
9614       }
9615 
9616     case LABEL_EXPR:
9617       t = LABEL_EXPR_LABEL (t);
9618       if (DECL_ARTIFICIAL (t) || cxx_dialect >= cxx23)
9619 	return true;
9620       else if (flags & tf_error)
9621 	error_at (loc, "label definition in %<constexpr%> function only "
9622 		       "available with %<-std=c++2b%> or %<-std=gnu++2b%>");
9623       return false;
9624 
9625     case ANNOTATE_EXPR:
9626       return RECUR (TREE_OPERAND (t, 0), rval);
9627 
9628     case BIT_CAST_EXPR:
9629       return RECUR (TREE_OPERAND (t, 0), rval);
9630 
9631     /* Coroutine await, yield and return expressions are not.  */
9632     case CO_AWAIT_EXPR:
9633     case CO_YIELD_EXPR:
9634     case CO_RETURN_EXPR:
9635       return false;
9636 
9637     case NONTYPE_ARGUMENT_PACK:
9638       {
9639 	tree args = ARGUMENT_PACK_ARGS (t);
9640 	int len = TREE_VEC_LENGTH (args);
9641 	for (int i = 0; i < len; ++i)
9642 	  if (!RECUR (TREE_VEC_ELT (args, i), any))
9643 	    return false;
9644 	return true;
9645       }
9646 
9647     default:
9648       if (objc_non_constant_expr_p (t))
9649 	return false;
9650 
9651       sorry ("unexpected AST of kind %s", get_tree_code_name (TREE_CODE (t)));
9652       gcc_unreachable ();
9653       return false;
9654     }
9655 #undef RECUR
9656 }
9657 
9658 bool
potential_constant_expression_1(tree t,bool want_rval,bool strict,bool now,tsubst_flags_t flags)9659 potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
9660 				 tsubst_flags_t flags)
9661 {
9662   if (flags & tf_error)
9663     {
9664       /* Check potentiality quietly first, as that could be performed more
9665 	 efficiently in some cases (currently only for TRUTH_*_EXPR).  If
9666 	 that fails, replay the check noisily to give errors.  */
9667       flags &= ~tf_error;
9668       if (potential_constant_expression_1 (t, want_rval, strict, now, flags))
9669 	return true;
9670       flags |= tf_error;
9671     }
9672 
9673   tree target = NULL_TREE;
9674   return potential_constant_expression_1 (t, want_rval, strict, now,
9675 					  flags, &target);
9676 }
9677 
9678 /* The main entry point to the above.  */
9679 
9680 bool
potential_constant_expression(tree t)9681 potential_constant_expression (tree t)
9682 {
9683   return potential_constant_expression_1 (t, false, true, false, tf_none);
9684 }
9685 
9686 /* As above, but require a constant rvalue.  */
9687 
9688 bool
potential_rvalue_constant_expression(tree t)9689 potential_rvalue_constant_expression (tree t)
9690 {
9691   return potential_constant_expression_1 (t, true, true, false, tf_none);
9692 }
9693 
9694 /* Like above, but complain about non-constant expressions.  */
9695 
9696 bool
require_potential_constant_expression(tree t)9697 require_potential_constant_expression (tree t)
9698 {
9699   return potential_constant_expression_1 (t, false, true, false,
9700 					  tf_warning_or_error);
9701 }
9702 
9703 /* Cross product of the above.  */
9704 
9705 bool
require_potential_rvalue_constant_expression(tree t)9706 require_potential_rvalue_constant_expression (tree t)
9707 {
9708   return potential_constant_expression_1 (t, true, true, false,
9709 					  tf_warning_or_error);
9710 }
9711 
9712 /* Like above, but don't consider PARM_DECL a potential_constant_expression.  */
9713 
9714 bool
require_rvalue_constant_expression(tree t)9715 require_rvalue_constant_expression (tree t)
9716 {
9717   return potential_constant_expression_1 (t, true, true, true,
9718 					  tf_warning_or_error);
9719 }
9720 
9721 /* Like potential_constant_expression, but don't consider possible constexpr
9722    substitution of the current function.  That is, PARM_DECL qualifies under
9723    potential_constant_expression, but not here.
9724 
9725    This is basically what you can check when any actual constant values might
9726    be value-dependent.  */
9727 
9728 bool
is_constant_expression(tree t)9729 is_constant_expression (tree t)
9730 {
9731   return potential_constant_expression_1 (t, false, true, true, tf_none);
9732 }
9733 
9734 /* As above, but expect an rvalue.  */
9735 
9736 bool
is_rvalue_constant_expression(tree t)9737 is_rvalue_constant_expression (tree t)
9738 {
9739   return potential_constant_expression_1 (t, true, true, true, tf_none);
9740 }
9741 
9742 /* Like above, but complain about non-constant expressions.  */
9743 
9744 bool
require_constant_expression(tree t)9745 require_constant_expression (tree t)
9746 {
9747   return potential_constant_expression_1 (t, false, true, true,
9748 					  tf_warning_or_error);
9749 }
9750 
9751 /* Like is_constant_expression, but allow const variables that are not allowed
9752    under constexpr rules.  */
9753 
9754 bool
is_static_init_expression(tree t)9755 is_static_init_expression (tree t)
9756 {
9757   return potential_constant_expression_1 (t, false, false, true, tf_none);
9758 }
9759 
9760 /* Returns true if T is a potential constant expression that is not
9761    instantiation-dependent, and therefore a candidate for constant folding even
9762    in a template.  */
9763 
9764 bool
is_nondependent_constant_expression(tree t)9765 is_nondependent_constant_expression (tree t)
9766 {
9767   return (!type_unknown_p (t)
9768 	  && is_constant_expression (t)
9769 	  && !instantiation_dependent_expression_p (t));
9770 }
9771 
9772 /* Returns true if T is a potential static initializer expression that is not
9773    instantiation-dependent.  */
9774 
9775 bool
is_nondependent_static_init_expression(tree t)9776 is_nondependent_static_init_expression (tree t)
9777 {
9778   return (!type_unknown_p (t)
9779 	  && is_static_init_expression (t)
9780 	  && !instantiation_dependent_expression_p (t));
9781 }
9782 
9783 /* True iff FN is an implicitly constexpr function.  */
9784 
9785 bool
decl_implicit_constexpr_p(tree fn)9786 decl_implicit_constexpr_p (tree fn)
9787 {
9788   if (!(flag_implicit_constexpr
9789 	&& TREE_CODE (fn) == FUNCTION_DECL
9790 	&& DECL_DECLARED_CONSTEXPR_P (fn)))
9791     return false;
9792 
9793   if (DECL_CLONED_FUNCTION_P (fn))
9794     fn = DECL_CLONED_FUNCTION (fn);
9795 
9796   return (DECL_LANG_SPECIFIC (fn)
9797 	  && DECL_LANG_SPECIFIC (fn)->u.fn.implicit_constexpr);
9798 }
9799 
9800 /* Finalize constexpr processing after parsing.  */
9801 
9802 void
fini_constexpr(void)9803 fini_constexpr (void)
9804 {
9805   /* The contexpr call and fundef copies tables are no longer needed.  */
9806   constexpr_call_table = NULL;
9807   fundef_copies_table = NULL;
9808 }
9809 
9810 #include "gt-cp-constexpr.h"
9811