xref: /dragonfly/contrib/gcc-8.0/gcc/cp/constexpr.c (revision 3d33658b)
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-2018 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 
37 static bool verify_constant (tree, bool, bool *, bool *);
38 #define VERIFY_CONSTANT(X)						\
39 do {									\
40   if (verify_constant ((X), ctx->quiet, non_constant_p, overflow_p)) \
41     return t;								\
42  } while (0)
43 
44 /* Returns true iff FUN is an instantiation of a constexpr function
45    template or a defaulted constexpr function.  */
46 
47 bool
48 is_instantiation_of_constexpr (tree fun)
49 {
50   return ((DECL_TEMPLOID_INSTANTIATION (fun)
51 	   && DECL_DECLARED_CONSTEXPR_P (DECL_TI_TEMPLATE (fun)))
52 	  || (DECL_DEFAULTED_FN (fun)
53 	      && DECL_DECLARED_CONSTEXPR_P (fun)));
54 }
55 
56 /* Return true if T is a literal type.   */
57 
58 bool
59 literal_type_p (tree t)
60 {
61   if (SCALAR_TYPE_P (t)
62       || VECTOR_TYPE_P (t)
63       || TREE_CODE (t) == REFERENCE_TYPE
64       || (VOID_TYPE_P (t) && cxx_dialect >= cxx14))
65     return true;
66   if (CLASS_TYPE_P (t))
67     {
68       t = complete_type (t);
69       gcc_assert (COMPLETE_TYPE_P (t) || errorcount);
70       return CLASSTYPE_LITERAL_P (t);
71     }
72   if (TREE_CODE (t) == ARRAY_TYPE)
73     return literal_type_p (strip_array_types (t));
74   return false;
75 }
76 
77 /* If DECL is a variable declared `constexpr', require its type
78    be literal.  Return error_mark_node if we give an error, the
79    DECL otherwise.  */
80 
81 tree
82 ensure_literal_type_for_constexpr_object (tree decl)
83 {
84   tree type = TREE_TYPE (decl);
85   if (VAR_P (decl)
86       && (DECL_DECLARED_CONSTEXPR_P (decl)
87 	  || var_in_constexpr_fn (decl))
88       && !processing_template_decl)
89     {
90       tree stype = strip_array_types (type);
91       if (CLASS_TYPE_P (stype) && !COMPLETE_TYPE_P (complete_type (stype)))
92 	/* Don't complain here, we'll complain about incompleteness
93 	   when we try to initialize the variable.  */;
94       else if (!literal_type_p (type))
95 	{
96 	  if (DECL_DECLARED_CONSTEXPR_P (decl))
97 	    {
98 	      error ("the type %qT of %<constexpr%> variable %qD "
99 		     "is not literal", type, decl);
100 	      explain_non_literal_class (type);
101 	      decl = error_mark_node;
102 	    }
103 	  else
104 	    {
105 	      if (!is_instantiation_of_constexpr (current_function_decl))
106 		{
107 		  error ("variable %qD of non-literal type %qT in %<constexpr%> "
108 			 "function", decl, type);
109 		  explain_non_literal_class (type);
110 		  decl = error_mark_node;
111 		}
112 	      cp_function_chain->invalid_constexpr = true;
113 	    }
114 	}
115       else if (DECL_DECLARED_CONSTEXPR_P (decl)
116 	       && variably_modified_type_p (type, NULL_TREE))
117 	{
118 	  error ("%<constexpr%> variable %qD has variably-modified type %qT",
119 		 decl, type);
120 	  decl = error_mark_node;
121 	}
122     }
123   return decl;
124 }
125 
126 /* Representation of entries in the constexpr function definition table.  */
127 
128 struct GTY((for_user)) constexpr_fundef {
129   tree decl;
130   tree body;
131 };
132 
133 struct constexpr_fundef_hasher : ggc_ptr_hash<constexpr_fundef>
134 {
135   static hashval_t hash (constexpr_fundef *);
136   static bool equal (constexpr_fundef *, constexpr_fundef *);
137 };
138 
139 /* This table holds all constexpr function definitions seen in
140    the current translation unit.  */
141 
142 static GTY (()) hash_table<constexpr_fundef_hasher> *constexpr_fundef_table;
143 
144 /* Utility function used for managing the constexpr function table.
145    Return true if the entries pointed to by P and Q are for the
146    same constexpr function.  */
147 
148 inline bool
149 constexpr_fundef_hasher::equal (constexpr_fundef *lhs, constexpr_fundef *rhs)
150 {
151   return lhs->decl == rhs->decl;
152 }
153 
154 /* Utility function used for managing the constexpr function table.
155    Return a hash value for the entry pointed to by Q.  */
156 
157 inline hashval_t
158 constexpr_fundef_hasher::hash (constexpr_fundef *fundef)
159 {
160   return DECL_UID (fundef->decl);
161 }
162 
163 /* Return a previously saved definition of function FUN.   */
164 
165 static constexpr_fundef *
166 retrieve_constexpr_fundef (tree fun)
167 {
168   constexpr_fundef fundef = { NULL, NULL };
169   if (constexpr_fundef_table == NULL)
170     return NULL;
171 
172   fundef.decl = fun;
173   return constexpr_fundef_table->find (&fundef);
174 }
175 
176 /* Check whether the parameter and return types of FUN are valid for a
177    constexpr function, and complain if COMPLAIN.  */
178 
179 bool
180 is_valid_constexpr_fn (tree fun, bool complain)
181 {
182   bool ret = true;
183 
184   if (DECL_INHERITED_CTOR (fun)
185       && TREE_CODE (fun) == TEMPLATE_DECL)
186     {
187       ret = false;
188       if (complain)
189 	error ("inherited constructor %qD is not %<constexpr%>",
190 	       DECL_INHERITED_CTOR (fun));
191     }
192   else
193     {
194       for (tree parm = FUNCTION_FIRST_USER_PARM (fun);
195 	   parm != NULL_TREE; parm = TREE_CHAIN (parm))
196 	if (!literal_type_p (TREE_TYPE (parm)))
197 	  {
198 	    ret = false;
199 	    if (complain)
200 	      {
201 		error ("invalid type for parameter %d of %<constexpr%> "
202 		       "function %q+#D", DECL_PARM_INDEX (parm), fun);
203 		explain_non_literal_class (TREE_TYPE (parm));
204 	      }
205 	  }
206     }
207 
208   if (LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun)) && cxx_dialect < cxx17)
209     {
210       ret = false;
211       if (complain)
212 	inform (DECL_SOURCE_LOCATION (fun),
213 		"lambdas are implicitly %<constexpr%> only in C++17 and later");
214     }
215   else if (!DECL_CONSTRUCTOR_P (fun))
216     {
217       tree rettype = TREE_TYPE (TREE_TYPE (fun));
218       if (!literal_type_p (rettype))
219 	{
220 	  ret = false;
221 	  if (complain)
222 	    {
223 	      error ("invalid return type %qT of %<constexpr%> function %q+D",
224 		     rettype, fun);
225 	      explain_non_literal_class (rettype);
226 	    }
227 	}
228 
229       /* C++14 DR 1684 removed this restriction.  */
230       if (cxx_dialect < cxx14
231 	  && DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
232 	  && !CLASSTYPE_LITERAL_P (DECL_CONTEXT (fun)))
233 	{
234 	  ret = false;
235 	  if (complain
236 	      && pedwarn (DECL_SOURCE_LOCATION (fun), OPT_Wpedantic,
237 			  "enclosing class of %<constexpr%> non-static member "
238 			  "function %q+#D is not a literal type", fun))
239 	    explain_non_literal_class (DECL_CONTEXT (fun));
240 	}
241     }
242   else if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fun)))
243     {
244       ret = false;
245       if (complain)
246 	error ("%q#T has virtual base classes", DECL_CONTEXT (fun));
247     }
248 
249   return ret;
250 }
251 
252 /* Subroutine of build_data_member_initialization.  MEMBER is a COMPONENT_REF
253    for a member of an anonymous aggregate, INIT is the initializer for that
254    member, and VEC_OUTER is the vector of constructor elements for the class
255    whose constructor we are processing.  Add the initializer to the vector
256    and return true to indicate success.  */
257 
258 static bool
259 build_anon_member_initialization (tree member, tree init,
260 				  vec<constructor_elt, va_gc> **vec_outer)
261 {
262   /* MEMBER presents the relevant fields from the inside out, but we need
263      to build up the initializer from the outside in so that we can reuse
264      previously built CONSTRUCTORs if this is, say, the second field in an
265      anonymous struct.  So we use a vec as a stack.  */
266   auto_vec<tree, 2> fields;
267   do
268     {
269       fields.safe_push (TREE_OPERAND (member, 1));
270       member = TREE_OPERAND (member, 0);
271     }
272   while (ANON_AGGR_TYPE_P (TREE_TYPE (member))
273 	 && TREE_CODE (member) == COMPONENT_REF);
274 
275   /* VEC has the constructor elements vector for the context of FIELD.
276      If FIELD is an anonymous aggregate, we will push inside it.  */
277   vec<constructor_elt, va_gc> **vec = vec_outer;
278   tree field;
279   while (field = fields.pop(),
280 	 ANON_AGGR_TYPE_P (TREE_TYPE (field)))
281     {
282       tree ctor;
283       /* If there is already an outer constructor entry for the anonymous
284 	 aggregate FIELD, use it; otherwise, insert one.  */
285       if (vec_safe_is_empty (*vec)
286 	  || (*vec)->last().index != field)
287 	{
288 	  ctor = build_constructor (TREE_TYPE (field), NULL);
289 	  CONSTRUCTOR_APPEND_ELT (*vec, field, ctor);
290 	}
291       else
292 	ctor = (*vec)->last().value;
293       vec = &CONSTRUCTOR_ELTS (ctor);
294     }
295 
296   /* Now we're at the innermost field, the one that isn't an anonymous
297      aggregate.  Add its initializer to the CONSTRUCTOR and we're done.  */
298   gcc_assert (fields.is_empty());
299   CONSTRUCTOR_APPEND_ELT (*vec, field, init);
300 
301   return true;
302 }
303 
304 /* Subroutine of  build_constexpr_constructor_member_initializers.
305    The expression tree T represents a data member initialization
306    in a (constexpr) constructor definition.  Build a pairing of
307    the data member with its initializer, and prepend that pair
308    to the existing initialization pair INITS.  */
309 
310 static bool
311 build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec)
312 {
313   tree member, init;
314   if (TREE_CODE (t) == CLEANUP_POINT_EXPR)
315     t = TREE_OPERAND (t, 0);
316   if (TREE_CODE (t) == EXPR_STMT)
317     t = TREE_OPERAND (t, 0);
318   if (t == error_mark_node)
319     return false;
320   if (TREE_CODE (t) == STATEMENT_LIST)
321     {
322       tree_stmt_iterator i;
323       for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
324 	{
325 	  if (! build_data_member_initialization (tsi_stmt (i), vec))
326 	    return false;
327 	}
328       return true;
329     }
330   if (TREE_CODE (t) == CLEANUP_STMT)
331     {
332       /* We can't see a CLEANUP_STMT in a constructor for a literal class,
333 	 but we can in a constexpr constructor for a non-literal class.  Just
334 	 ignore it; either all the initialization will be constant, in which
335 	 case the cleanup can't run, or it can't be constexpr.
336 	 Still recurse into CLEANUP_BODY.  */
337       return build_data_member_initialization (CLEANUP_BODY (t), vec);
338     }
339   if (TREE_CODE (t) == CONVERT_EXPR)
340     t = TREE_OPERAND (t, 0);
341   if (TREE_CODE (t) == INIT_EXPR
342       /* vptr initialization shows up as a MODIFY_EXPR.  In C++14 we only
343 	 use what this function builds for cx_check_missing_mem_inits, and
344 	 assignment in the ctor body doesn't count.  */
345       || (cxx_dialect < cxx14 && TREE_CODE (t) == MODIFY_EXPR))
346     {
347       member = TREE_OPERAND (t, 0);
348       init = break_out_target_exprs (TREE_OPERAND (t, 1));
349     }
350   else if (TREE_CODE (t) == CALL_EXPR)
351     {
352       tree fn = get_callee_fndecl (t);
353       if (!fn || !DECL_CONSTRUCTOR_P (fn))
354 	/* We're only interested in calls to subobject constructors.  */
355 	return true;
356       member = CALL_EXPR_ARG (t, 0);
357       /* We don't use build_cplus_new here because it complains about
358 	 abstract bases.  Leaving the call unwrapped means that it has the
359 	 wrong type, but cxx_eval_constant_expression doesn't care.  */
360       init = break_out_target_exprs (t);
361     }
362   else if (TREE_CODE (t) == BIND_EXPR)
363     return build_data_member_initialization (BIND_EXPR_BODY (t), vec);
364   else
365     /* Don't add anything else to the CONSTRUCTOR.  */
366     return true;
367   if (INDIRECT_REF_P (member))
368     member = TREE_OPERAND (member, 0);
369   if (TREE_CODE (member) == NOP_EXPR)
370     {
371       tree op = member;
372       STRIP_NOPS (op);
373       if (TREE_CODE (op) == ADDR_EXPR)
374 	{
375 	  gcc_assert (same_type_ignoring_top_level_qualifiers_p
376 		      (TREE_TYPE (TREE_TYPE (op)),
377 		       TREE_TYPE (TREE_TYPE (member))));
378 	  /* Initializing a cv-qualified member; we need to look through
379 	     the const_cast.  */
380 	  member = op;
381 	}
382       else if (op == current_class_ptr
383 	       && (same_type_ignoring_top_level_qualifiers_p
384 		   (TREE_TYPE (TREE_TYPE (member)),
385 		    current_class_type)))
386 	/* Delegating constructor.  */
387 	member = op;
388       else
389 	{
390 	  /* This is an initializer for an empty base; keep it for now so
391 	     we can check it in cxx_eval_bare_aggregate.  */
392 	  gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (member))));
393 	}
394     }
395   if (TREE_CODE (member) == ADDR_EXPR)
396     member = TREE_OPERAND (member, 0);
397   if (TREE_CODE (member) == COMPONENT_REF)
398     {
399       tree aggr = TREE_OPERAND (member, 0);
400       if (TREE_CODE (aggr) == VAR_DECL)
401 	/* Initializing a local variable, don't add anything.  */
402 	return true;
403       if (TREE_CODE (aggr) != COMPONENT_REF)
404 	/* Normal member initialization.  */
405 	member = TREE_OPERAND (member, 1);
406       else if (ANON_AGGR_TYPE_P (TREE_TYPE (aggr)))
407 	/* Initializing a member of an anonymous union.  */
408 	return build_anon_member_initialization (member, init, vec);
409       else
410 	/* We're initializing a vtable pointer in a base.  Leave it as
411 	   COMPONENT_REF so we remember the path to get to the vfield.  */
412 	gcc_assert (TREE_TYPE (member) == vtbl_ptr_type_node);
413     }
414 
415   /* Value-initialization can produce multiple initializers for the
416      same field; use the last one.  */
417   if (!vec_safe_is_empty (*vec) && (*vec)->last().index == member)
418     (*vec)->last().value = init;
419   else
420     CONSTRUCTOR_APPEND_ELT (*vec, member, init);
421   return true;
422 }
423 
424 /* Subroutine of check_constexpr_ctor_body_1 and constexpr_fn_retval.
425    In C++11 mode checks that the TYPE_DECLs in the BIND_EXPR_VARS of a
426    BIND_EXPR conform to 7.1.5/3/4 on typedef and alias declarations.  */
427 
428 static bool
429 check_constexpr_bind_expr_vars (tree t)
430 {
431   gcc_assert (TREE_CODE (t) == BIND_EXPR);
432 
433   for (tree var = BIND_EXPR_VARS (t); var; var = DECL_CHAIN (var))
434     if (TREE_CODE (var) == TYPE_DECL
435 	&& DECL_IMPLICIT_TYPEDEF_P (var)
436 	&& !LAMBDA_TYPE_P (TREE_TYPE (var)))
437       return false;
438   return true;
439 }
440 
441 /* Subroutine of check_constexpr_ctor_body.  */
442 
443 static bool
444 check_constexpr_ctor_body_1 (tree last, tree list)
445 {
446   switch (TREE_CODE (list))
447     {
448     case DECL_EXPR:
449       if (TREE_CODE (DECL_EXPR_DECL (list)) == USING_DECL
450 	  || TREE_CODE (DECL_EXPR_DECL (list)) == TYPE_DECL)
451 	return true;
452       return false;
453 
454     case CLEANUP_POINT_EXPR:
455       return check_constexpr_ctor_body (last, TREE_OPERAND (list, 0),
456 					/*complain=*/false);
457 
458     case BIND_EXPR:
459        if (!check_constexpr_bind_expr_vars (list)
460 	   || !check_constexpr_ctor_body (last, BIND_EXPR_BODY (list),
461 					  /*complain=*/false))
462 	 return false;
463        return true;
464 
465     case USING_STMT:
466     case STATIC_ASSERT:
467     case DEBUG_BEGIN_STMT:
468       return true;
469 
470     default:
471       return false;
472     }
473 }
474 
475 /* Make sure that there are no statements after LAST in the constructor
476    body represented by LIST.  */
477 
478 bool
479 check_constexpr_ctor_body (tree last, tree list, bool complain)
480 {
481   /* C++14 doesn't require a constexpr ctor to have an empty body.  */
482   if (cxx_dialect >= cxx14)
483     return true;
484 
485   bool ok = true;
486   if (TREE_CODE (list) == STATEMENT_LIST)
487     {
488       tree_stmt_iterator i = tsi_last (list);
489       for (; !tsi_end_p (i); tsi_prev (&i))
490 	{
491 	  tree t = tsi_stmt (i);
492 	  if (t == last)
493 	    break;
494 	  if (!check_constexpr_ctor_body_1 (last, t))
495 	    {
496 	      ok = false;
497 	      break;
498 	    }
499 	}
500     }
501   else if (list != last
502 	   && !check_constexpr_ctor_body_1 (last, list))
503     ok = false;
504   if (!ok)
505     {
506       if (complain)
507 	error ("%<constexpr%> constructor does not have empty body");
508       DECL_DECLARED_CONSTEXPR_P (current_function_decl) = false;
509     }
510   return ok;
511 }
512 
513 /* V is a vector of constructor elements built up for the base and member
514    initializers of a constructor for TYPE.  They need to be in increasing
515    offset order, which they might not be yet if TYPE has a primary base
516    which is not first in the base-clause or a vptr and at least one base
517    all of which are non-primary.  */
518 
519 static vec<constructor_elt, va_gc> *
520 sort_constexpr_mem_initializers (tree type, vec<constructor_elt, va_gc> *v)
521 {
522   tree pri = CLASSTYPE_PRIMARY_BINFO (type);
523   tree field_type;
524   unsigned i;
525   constructor_elt *ce;
526 
527   if (pri)
528     field_type = BINFO_TYPE (pri);
529   else if (TYPE_CONTAINS_VPTR_P (type))
530     field_type = vtbl_ptr_type_node;
531   else
532     return v;
533 
534   /* Find the element for the primary base or vptr and move it to the
535      beginning of the vec.  */
536   for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
537     if (TREE_TYPE (ce->index) == field_type)
538       break;
539 
540   if (i > 0 && i < vec_safe_length (v))
541     {
542       vec<constructor_elt, va_gc> &vref = *v;
543       constructor_elt elt = vref[i];
544       for (; i > 0; --i)
545 	vref[i] = vref[i-1];
546       vref[0] = elt;
547     }
548 
549   return v;
550 }
551 
552 /* Build compile-time evalable representations of member-initializer list
553    for a constexpr constructor.  */
554 
555 static tree
556 build_constexpr_constructor_member_initializers (tree type, tree body)
557 {
558   vec<constructor_elt, va_gc> *vec = NULL;
559   bool ok = true;
560   while (true)
561     switch (TREE_CODE (body))
562       {
563       case MUST_NOT_THROW_EXPR:
564       case EH_SPEC_BLOCK:
565 	body = TREE_OPERAND (body, 0);
566 	break;
567 
568       case STATEMENT_LIST:
569 	for (tree_stmt_iterator i = tsi_start (body);
570 	     !tsi_end_p (i); tsi_next (&i))
571 	  {
572 	    body = tsi_stmt (i);
573 	    if (TREE_CODE (body) == BIND_EXPR)
574 	      break;
575 	  }
576 	break;
577 
578       case BIND_EXPR:
579 	body = BIND_EXPR_BODY (body);
580 	goto found;
581 
582       default:
583 	gcc_unreachable ();
584     }
585  found:
586   if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
587     {
588       body = TREE_OPERAND (body, 0);
589       if (TREE_CODE (body) == EXPR_STMT)
590 	body = TREE_OPERAND (body, 0);
591       if (TREE_CODE (body) == INIT_EXPR
592 	  && (same_type_ignoring_top_level_qualifiers_p
593 	      (TREE_TYPE (TREE_OPERAND (body, 0)),
594 	       current_class_type)))
595 	{
596 	  /* Trivial copy.  */
597 	  return TREE_OPERAND (body, 1);
598 	}
599       ok = build_data_member_initialization (body, &vec);
600     }
601   else if (TREE_CODE (body) == STATEMENT_LIST)
602     {
603       tree_stmt_iterator i;
604       for (i = tsi_start (body); !tsi_end_p (i); tsi_next (&i))
605 	{
606 	  ok = build_data_member_initialization (tsi_stmt (i), &vec);
607 	  if (!ok)
608 	    break;
609 	}
610     }
611   else if (TREE_CODE (body) == TRY_BLOCK)
612     {
613       error ("body of %<constexpr%> constructor cannot be "
614 	     "a function-try-block");
615       return error_mark_node;
616     }
617   else if (EXPR_P (body))
618     ok = build_data_member_initialization (body, &vec);
619   else
620     gcc_assert (errorcount > 0);
621   if (ok)
622     {
623       if (vec_safe_length (vec) > 0)
624 	{
625 	  /* In a delegating constructor, return the target.  */
626 	  constructor_elt *ce = &(*vec)[0];
627 	  if (ce->index == current_class_ptr)
628 	    {
629 	      body = ce->value;
630 	      vec_free (vec);
631 	      return body;
632 	    }
633 	}
634       vec = sort_constexpr_mem_initializers (type, vec);
635       return build_constructor (type, vec);
636     }
637   else
638     return error_mark_node;
639 }
640 
641 /* We have an expression tree T that represents a call, either CALL_EXPR
642    or AGGR_INIT_EXPR.  If the call is lexically to a named function,
643    retrun the _DECL for that function.  */
644 
645 static tree
646 get_function_named_in_call (tree t)
647 {
648   tree fun = cp_get_callee (t);
649   if (fun && TREE_CODE (fun) == ADDR_EXPR
650       && TREE_CODE (TREE_OPERAND (fun, 0)) == FUNCTION_DECL)
651     fun = TREE_OPERAND (fun, 0);
652   return fun;
653 }
654 
655 /* Subroutine of register_constexpr_fundef.  BODY is the body of a function
656    declared to be constexpr, or a sub-statement thereof.  Returns the
657    return value if suitable, error_mark_node for a statement not allowed in
658    a constexpr function, or NULL_TREE if no return value was found.  */
659 
660 tree
661 constexpr_fn_retval (tree body)
662 {
663   switch (TREE_CODE (body))
664     {
665     case STATEMENT_LIST:
666       {
667 	tree_stmt_iterator i;
668 	tree expr = NULL_TREE;
669 	for (i = tsi_start (body); !tsi_end_p (i); tsi_next (&i))
670 	  {
671 	    tree s = constexpr_fn_retval (tsi_stmt (i));
672 	    if (s == error_mark_node)
673 	      return error_mark_node;
674 	    else if (s == NULL_TREE)
675 	      /* Keep iterating.  */;
676 	    else if (expr)
677 	      /* Multiple return statements.  */
678 	      return error_mark_node;
679 	    else
680 	      expr = s;
681 	  }
682 	return expr;
683       }
684 
685     case RETURN_EXPR:
686       return break_out_target_exprs (TREE_OPERAND (body, 0));
687 
688     case DECL_EXPR:
689       {
690 	tree decl = DECL_EXPR_DECL (body);
691 	if (TREE_CODE (decl) == USING_DECL
692 	    /* Accept __func__, __FUNCTION__, and __PRETTY_FUNCTION__.  */
693 	    || DECL_ARTIFICIAL (decl))
694 	  return NULL_TREE;
695 	return error_mark_node;
696       }
697 
698     case CLEANUP_POINT_EXPR:
699       return constexpr_fn_retval (TREE_OPERAND (body, 0));
700 
701     case BIND_EXPR:
702       if (!check_constexpr_bind_expr_vars (body))
703 	return error_mark_node;
704       return constexpr_fn_retval (BIND_EXPR_BODY (body));
705 
706     case USING_STMT:
707     case DEBUG_BEGIN_STMT:
708       return NULL_TREE;
709 
710     case CALL_EXPR:
711 	{
712 	  tree fun = get_function_named_in_call (body);
713 	  if (fun != NULL_TREE
714 	      && DECL_FUNCTION_CODE (fun) == BUILT_IN_UNREACHABLE)
715 	    return NULL_TREE;
716 	}
717       /* Fallthru.  */
718 
719     default:
720       return error_mark_node;
721     }
722 }
723 
724 /* Subroutine of register_constexpr_fundef.  BODY is the DECL_SAVED_TREE of
725    FUN; do the necessary transformations to turn it into a single expression
726    that we can store in the hash table.  */
727 
728 static tree
729 massage_constexpr_body (tree fun, tree body)
730 {
731   if (DECL_CONSTRUCTOR_P (fun))
732     body = build_constexpr_constructor_member_initializers
733       (DECL_CONTEXT (fun), body);
734   else if (cxx_dialect < cxx14)
735     {
736       if (TREE_CODE (body) == EH_SPEC_BLOCK)
737         body = EH_SPEC_STMTS (body);
738       if (TREE_CODE (body) == MUST_NOT_THROW_EXPR)
739 	body = TREE_OPERAND (body, 0);
740       body = constexpr_fn_retval (body);
741     }
742   return body;
743 }
744 
745 /* CTYPE is a type constructed from BODY.  Return true if some
746    bases/fields are uninitialized, and complain if COMPLAIN.  */
747 
748 static bool
749 cx_check_missing_mem_inits (tree ctype, tree body, bool complain)
750 {
751   unsigned nelts = 0;
752 
753   if (body)
754     {
755       if (TREE_CODE (body) != CONSTRUCTOR)
756 	return false;
757       nelts = CONSTRUCTOR_NELTS (body);
758     }
759   tree field = TYPE_FIELDS (ctype);
760 
761   if (TREE_CODE (ctype) == UNION_TYPE)
762     {
763       if (nelts == 0 && next_initializable_field (field))
764 	{
765 	  if (complain)
766 	    error ("%<constexpr%> constructor for union %qT must "
767 		   "initialize exactly one non-static data member", ctype);
768 	  return true;
769 	}
770       return false;
771     }
772 
773   /* Iterate over the CONSTRUCTOR, checking any missing fields don't
774      need an explicit initialization.  */
775   bool bad = false;
776   for (unsigned i = 0; i <= nelts; ++i)
777     {
778       tree index = NULL_TREE;
779       if (i < nelts)
780 	{
781 	  index = CONSTRUCTOR_ELT (body, i)->index;
782 	  /* Skip base and vtable inits.  */
783 	  if (TREE_CODE (index) != FIELD_DECL
784 	      || DECL_ARTIFICIAL (index))
785 	    continue;
786 	}
787 
788       for (; field != index; field = DECL_CHAIN (field))
789 	{
790 	  tree ftype;
791 	  if (TREE_CODE (field) != FIELD_DECL)
792 	    continue;
793 	  if (DECL_UNNAMED_BIT_FIELD (field))
794 	    continue;
795 	  if (DECL_ARTIFICIAL (field))
796 	    continue;
797 	  if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
798 	    {
799 	      /* Recurse to check the anonummous aggregate member.  */
800 	      bad |= cx_check_missing_mem_inits
801 		(TREE_TYPE (field), NULL_TREE, complain);
802 	      if (bad && !complain)
803 		return true;
804 	      continue;
805 	    }
806 	  ftype = strip_array_types (TREE_TYPE (field));
807 	  if (type_has_constexpr_default_constructor (ftype))
808 	    {
809 	      /* It's OK to skip a member with a trivial constexpr ctor.
810 	         A constexpr ctor that isn't trivial should have been
811 	         added in by now.  */
812 	      gcc_checking_assert (!TYPE_HAS_COMPLEX_DFLT (ftype)
813 				   || errorcount != 0);
814 	      continue;
815 	    }
816 	  if (!complain)
817 	    return true;
818 	  error ("member %qD must be initialized by mem-initializer "
819 		 "in %<constexpr%> constructor", field);
820 	  inform (DECL_SOURCE_LOCATION (field), "declared here");
821 	  bad = true;
822 	}
823       if (field == NULL_TREE)
824 	break;
825 
826       if (ANON_AGGR_TYPE_P (TREE_TYPE (index)))
827 	{
828 	  /* Check the anonymous aggregate initializer is valid.  */
829 	  bad |= cx_check_missing_mem_inits
830 	    (TREE_TYPE (index), CONSTRUCTOR_ELT (body, i)->value, complain);
831 	  if (bad && !complain)
832 	    return true;
833 	}
834       field = DECL_CHAIN (field);
835     }
836 
837   return bad;
838 }
839 
840 /* We are processing the definition of the constexpr function FUN.
841    Check that its BODY fulfills the propriate requirements and
842    enter it in the constexpr function definition table.
843    For constructor BODY is actually the TREE_LIST of the
844    member-initializer list.  */
845 
846 tree
847 register_constexpr_fundef (tree fun, tree body)
848 {
849   constexpr_fundef entry;
850   constexpr_fundef **slot;
851 
852   if (!is_valid_constexpr_fn (fun, !DECL_GENERATED_P (fun)))
853     return NULL;
854 
855   tree massaged = massage_constexpr_body (fun, body);
856   if (massaged == NULL_TREE || massaged == error_mark_node)
857     {
858       if (!DECL_CONSTRUCTOR_P (fun))
859 	error ("body of %<constexpr%> function %qD not a return-statement",
860 	       fun);
861       return NULL;
862     }
863 
864   if (!potential_rvalue_constant_expression (massaged))
865     {
866       if (!DECL_GENERATED_P (fun))
867 	require_potential_rvalue_constant_expression (massaged);
868       return NULL;
869     }
870 
871   if (DECL_CONSTRUCTOR_P (fun)
872       && cx_check_missing_mem_inits (DECL_CONTEXT (fun),
873 				     massaged, !DECL_GENERATED_P (fun)))
874     return NULL;
875 
876   /* Create the constexpr function table if necessary.  */
877   if (constexpr_fundef_table == NULL)
878     constexpr_fundef_table
879       = hash_table<constexpr_fundef_hasher>::create_ggc (101);
880 
881   entry.decl = fun;
882   entry.body = body;
883   slot = constexpr_fundef_table->find_slot (&entry, INSERT);
884 
885   gcc_assert (*slot == NULL);
886   *slot = ggc_alloc<constexpr_fundef> ();
887   **slot = entry;
888 
889   return fun;
890 }
891 
892 /* FUN is a non-constexpr function called in a context that requires a
893    constant expression.  If it comes from a constexpr template, explain why
894    the instantiation isn't constexpr.  */
895 
896 void
897 explain_invalid_constexpr_fn (tree fun)
898 {
899   static hash_set<tree> *diagnosed;
900   tree body;
901   location_t save_loc;
902   /* Only diagnose defaulted functions, lambdas, or instantiations.  */
903   if (!DECL_DEFAULTED_FN (fun)
904       && !LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun))
905       && !is_instantiation_of_constexpr (fun))
906     return;
907   if (diagnosed == NULL)
908     diagnosed = new hash_set<tree>;
909   if (diagnosed->add (fun))
910     /* Already explained.  */
911     return;
912 
913   save_loc = input_location;
914   if (!lambda_static_thunk_p (fun))
915     {
916       /* Diagnostics should completely ignore the static thunk, so leave
917 	 input_location set to our caller's location.  */
918       input_location = DECL_SOURCE_LOCATION (fun);
919       inform (input_location,
920 	      "%qD is not usable as a %<constexpr%> function because:", fun);
921     }
922   /* First check the declaration.  */
923   if (is_valid_constexpr_fn (fun, true))
924     {
925       /* Then if it's OK, the body.  */
926       if (!DECL_DECLARED_CONSTEXPR_P (fun)
927 	  && !LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun)))
928 	explain_implicit_non_constexpr (fun);
929       else
930 	{
931 	  body = massage_constexpr_body (fun, DECL_SAVED_TREE (fun));
932 	  require_potential_rvalue_constant_expression (body);
933 	  if (DECL_CONSTRUCTOR_P (fun))
934 	    cx_check_missing_mem_inits (DECL_CONTEXT (fun), body, true);
935 	}
936     }
937   input_location = save_loc;
938 }
939 
940 /* Objects of this type represent calls to constexpr functions
941    along with the bindings of parameters to their arguments, for
942    the purpose of compile time evaluation.  */
943 
944 struct GTY((for_user)) constexpr_call {
945   /* Description of the constexpr function definition.  */
946   constexpr_fundef *fundef;
947   /* Parameter bindings environment.  A TREE_LIST where each TREE_PURPOSE
948      is a parameter _DECL and the TREE_VALUE is the value of the parameter.
949      Note: This arrangement is made to accommodate the use of
950      iterative_hash_template_arg (see pt.c).  If you change this
951      representation, also change the hash calculation in
952      cxx_eval_call_expression.  */
953   tree bindings;
954   /* Result of the call.
955        NULL means the call is being evaluated.
956        error_mark_node means that the evaluation was erroneous;
957        otherwise, the actuall value of the call.  */
958   tree result;
959   /* The hash of this call; we remember it here to avoid having to
960      recalculate it when expanding the hash table.  */
961   hashval_t hash;
962 };
963 
964 struct constexpr_call_hasher : ggc_ptr_hash<constexpr_call>
965 {
966   static hashval_t hash (constexpr_call *);
967   static bool equal (constexpr_call *, constexpr_call *);
968 };
969 
970 enum constexpr_switch_state {
971   /* Used when processing a switch for the first time by cxx_eval_switch_expr
972      and default: label for that switch has not been seen yet.  */
973   css_default_not_seen,
974   /* Used when processing a switch for the first time by cxx_eval_switch_expr
975      and default: label for that switch has been seen already.  */
976   css_default_seen,
977   /* Used when processing a switch for the second time by
978      cxx_eval_switch_expr, where default: label should match.  */
979   css_default_processing
980 };
981 
982 /* The constexpr expansion context.  CALL is the current function
983    expansion, CTOR is the current aggregate initializer, OBJECT is the
984    object being initialized by CTOR, either a VAR_DECL or a _REF.  VALUES
985    is a map of values of variables initialized within the expression.  */
986 
987 struct constexpr_ctx {
988   /* The innermost call we're evaluating.  */
989   constexpr_call *call;
990   /* Values for any temporaries or local variables within the
991      constant-expression. */
992   hash_map<tree,tree> *values;
993   /* SAVE_EXPRs that we've seen within the current LOOP_EXPR.  NULL if we
994      aren't inside a loop.  */
995   hash_set<tree> *save_exprs;
996   /* The CONSTRUCTOR we're currently building up for an aggregate
997      initializer.  */
998   tree ctor;
999   /* The object we're building the CONSTRUCTOR for.  */
1000   tree object;
1001   /* If inside SWITCH_EXPR.  */
1002   constexpr_switch_state *css_state;
1003   /* Whether we should error on a non-constant expression or fail quietly.  */
1004   bool quiet;
1005   /* Whether we are strictly conforming to constant expression rules or
1006      trying harder to get a constant value.  */
1007   bool strict;
1008 };
1009 
1010 /* A table of all constexpr calls that have been evaluated by the
1011    compiler in this translation unit.  */
1012 
1013 static GTY (()) hash_table<constexpr_call_hasher> *constexpr_call_table;
1014 
1015 static tree cxx_eval_constant_expression (const constexpr_ctx *, tree,
1016 					  bool, bool *, bool *, tree * = NULL);
1017 
1018 /* Compute a hash value for a constexpr call representation.  */
1019 
1020 inline hashval_t
1021 constexpr_call_hasher::hash (constexpr_call *info)
1022 {
1023   return info->hash;
1024 }
1025 
1026 /* Return true if the objects pointed to by P and Q represent calls
1027    to the same constexpr function with the same arguments.
1028    Otherwise, return false.  */
1029 
1030 bool
1031 constexpr_call_hasher::equal (constexpr_call *lhs, constexpr_call *rhs)
1032 {
1033   tree lhs_bindings;
1034   tree rhs_bindings;
1035   if (lhs == rhs)
1036     return true;
1037   if (lhs->hash != rhs->hash)
1038     return false;
1039   if (!constexpr_fundef_hasher::equal (lhs->fundef, rhs->fundef))
1040     return false;
1041   lhs_bindings = lhs->bindings;
1042   rhs_bindings = rhs->bindings;
1043   while (lhs_bindings != NULL && rhs_bindings != NULL)
1044     {
1045       tree lhs_arg = TREE_VALUE (lhs_bindings);
1046       tree rhs_arg = TREE_VALUE (rhs_bindings);
1047       gcc_assert (TREE_TYPE (lhs_arg) == TREE_TYPE (rhs_arg));
1048       if (!cp_tree_equal (lhs_arg, rhs_arg))
1049         return false;
1050       lhs_bindings = TREE_CHAIN (lhs_bindings);
1051       rhs_bindings = TREE_CHAIN (rhs_bindings);
1052     }
1053   return lhs_bindings == rhs_bindings;
1054 }
1055 
1056 /* Initialize the constexpr call table, if needed.  */
1057 
1058 static void
1059 maybe_initialize_constexpr_call_table (void)
1060 {
1061   if (constexpr_call_table == NULL)
1062     constexpr_call_table = hash_table<constexpr_call_hasher>::create_ggc (101);
1063 }
1064 
1065 /* During constexpr CALL_EXPR evaluation, to avoid issues with sharing when
1066    a function happens to get called recursively, we unshare the callee
1067    function's body and evaluate this unshared copy instead of evaluating the
1068    original body.
1069 
1070    FUNDEF_COPIES_TABLE is a per-function freelist of these unshared function
1071    copies.  The underlying data structure of FUNDEF_COPIES_TABLE is a hash_map
1072    that's keyed off of the original FUNCTION_DECL and whose value is a
1073    TREE_LIST of this function's unused copies awaiting reuse.
1074 
1075    This is not GC-deletable to avoid GC affecting UID generation.  */
1076 
1077 static GTY(()) hash_map<tree, tree> *fundef_copies_table;
1078 
1079 /* Initialize FUNDEF_COPIES_TABLE if it's not initialized.  */
1080 
1081 static void
1082 maybe_initialize_fundef_copies_table ()
1083 {
1084   if (fundef_copies_table == NULL)
1085     fundef_copies_table = hash_map<tree,tree>::create_ggc (101);
1086 }
1087 
1088 /* Reuse a copy or create a new unshared copy of the function FUN.
1089    Return this copy.  We use a TREE_LIST whose PURPOSE is body, VALUE
1090    is parms, TYPE is result.  */
1091 
1092 static tree
1093 get_fundef_copy (tree fun)
1094 {
1095   maybe_initialize_fundef_copies_table ();
1096 
1097   tree copy;
1098   bool existed;
1099   tree *slot = &fundef_copies_table->get_or_insert (fun, &existed);
1100 
1101   if (!existed)
1102     {
1103       /* There is no cached function available, or in use.  We can use
1104 	 the function directly.  That the slot is now created records
1105 	 that this function is now in use.  */
1106       copy = build_tree_list (DECL_SAVED_TREE (fun), DECL_ARGUMENTS (fun));
1107       TREE_TYPE (copy) = DECL_RESULT (fun);
1108     }
1109   else if (*slot == NULL_TREE)
1110     {
1111       /* We've already used the function itself, so make a copy.  */
1112       copy = build_tree_list (NULL, NULL);
1113       TREE_PURPOSE (copy) = copy_fn (fun, TREE_VALUE (copy), TREE_TYPE (copy));
1114     }
1115   else
1116     {
1117       /* We have a cached function available.  */
1118       copy = *slot;
1119       *slot = TREE_CHAIN (copy);
1120     }
1121 
1122   return copy;
1123 }
1124 
1125 /* Save the copy COPY of function FUN for later reuse by
1126    get_fundef_copy().  By construction, there will always be an entry
1127    to find.  */
1128 
1129 static void
1130 save_fundef_copy (tree fun, tree copy)
1131 {
1132   tree *slot = fundef_copies_table->get (fun);
1133   TREE_CHAIN (copy) = *slot;
1134   *slot = copy;
1135 }
1136 
1137 /* We have an expression tree T that represents a call, either CALL_EXPR
1138    or AGGR_INIT_EXPR.  Return the Nth argument.  */
1139 
1140 static inline tree
1141 get_nth_callarg (tree t, int n)
1142 {
1143   switch (TREE_CODE (t))
1144     {
1145     case CALL_EXPR:
1146       return CALL_EXPR_ARG (t, n);
1147 
1148     case AGGR_INIT_EXPR:
1149       return AGGR_INIT_EXPR_ARG (t, n);
1150 
1151     default:
1152       gcc_unreachable ();
1153       return NULL;
1154     }
1155 }
1156 
1157 /* Attempt to evaluate T which represents a call to a builtin function.
1158    We assume here that all builtin functions evaluate to scalar types
1159    represented by _CST nodes.  */
1160 
1161 static tree
1162 cxx_eval_builtin_function_call (const constexpr_ctx *ctx, tree t, tree fun,
1163 				bool lval,
1164 				bool *non_constant_p, bool *overflow_p)
1165 {
1166   const int nargs = call_expr_nargs (t);
1167   tree *args = (tree *) alloca (nargs * sizeof (tree));
1168   tree new_call;
1169   int i;
1170 
1171   /* Don't fold __builtin_constant_p within a constexpr function.  */
1172   bool bi_const_p = (DECL_FUNCTION_CODE (fun) == BUILT_IN_CONSTANT_P);
1173 
1174   /* If we aren't requiring a constant expression, defer __builtin_constant_p
1175      in a constexpr function until we have values for the parameters.  */
1176   if (bi_const_p
1177       && ctx->quiet
1178       && current_function_decl
1179       && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
1180     {
1181       *non_constant_p = true;
1182       return t;
1183     }
1184 
1185   /* Be permissive for arguments to built-ins; __builtin_constant_p should
1186      return constant false for a non-constant argument.  */
1187   constexpr_ctx new_ctx = *ctx;
1188   new_ctx.quiet = true;
1189   bool dummy1 = false, dummy2 = false;
1190   for (i = 0; i < nargs; ++i)
1191     {
1192       args[i] = CALL_EXPR_ARG (t, i);
1193       /* If builtin_valid_in_constant_expr_p is true,
1194 	 potential_constant_expression_1 has not recursed into the arguments
1195 	 of the builtin, verify it here.  */
1196       if (!builtin_valid_in_constant_expr_p (fun)
1197 	  || potential_constant_expression (args[i]))
1198 	args[i] = cxx_eval_constant_expression (&new_ctx, args[i], false,
1199 						&dummy1, &dummy2);
1200       if (bi_const_p)
1201 	/* For __built_in_constant_p, fold all expressions with constant values
1202 	   even if they aren't C++ constant-expressions.  */
1203 	args[i] = cp_fully_fold (args[i]);
1204     }
1205 
1206   bool save_ffbcp = force_folding_builtin_constant_p;
1207   force_folding_builtin_constant_p = true;
1208   new_call = fold_builtin_call_array (EXPR_LOCATION (t), TREE_TYPE (t),
1209 				      CALL_EXPR_FN (t), nargs, args);
1210   force_folding_builtin_constant_p = save_ffbcp;
1211   if (new_call == NULL)
1212     {
1213       if (!*non_constant_p && !ctx->quiet)
1214 	{
1215 	  /* Do not allow__builtin_unreachable in constexpr function.
1216 	     The __builtin_unreachable call with BUILTINS_LOCATION
1217 	     comes from cp_maybe_instrument_return.  */
1218 	  if (DECL_FUNCTION_CODE (fun) == BUILT_IN_UNREACHABLE
1219 	      && EXPR_LOCATION (t) == BUILTINS_LOCATION)
1220 	    error ("%<constexpr%> call flows off the end of the function");
1221 	  else
1222 	    {
1223 	      new_call = build_call_array_loc (EXPR_LOCATION (t), TREE_TYPE (t),
1224 					       CALL_EXPR_FN (t), nargs, args);
1225 	      error ("%q+E is not a constant expression", new_call);
1226 	    }
1227 	}
1228       *non_constant_p = true;
1229       return t;
1230     }
1231 
1232   if (!is_constant_expression (new_call))
1233     {
1234       if (!*non_constant_p && !ctx->quiet)
1235 	error ("%q+E is not a constant expression", new_call);
1236       *non_constant_p = true;
1237       return t;
1238     }
1239 
1240   return cxx_eval_constant_expression (&new_ctx, new_call, lval,
1241 				       non_constant_p, overflow_p);
1242 }
1243 
1244 /* TEMP is the constant value of a temporary object of type TYPE.  Adjust
1245    the type of the value to match.  */
1246 
1247 static tree
1248 adjust_temp_type (tree type, tree temp)
1249 {
1250   if (TREE_TYPE (temp) == type)
1251     return temp;
1252   /* Avoid wrapping an aggregate value in a NOP_EXPR.  */
1253   if (TREE_CODE (temp) == CONSTRUCTOR)
1254     return build_constructor (type, CONSTRUCTOR_ELTS (temp));
1255   if (TREE_CODE (temp) == EMPTY_CLASS_EXPR)
1256     return build0 (EMPTY_CLASS_EXPR, type);
1257   gcc_assert (scalarish_type_p (type));
1258   return cp_fold_convert (type, temp);
1259 }
1260 
1261 /* Callback for walk_tree used by unshare_constructor.  */
1262 
1263 static tree
1264 find_constructor (tree *tp, int *walk_subtrees, void *)
1265 {
1266   if (TYPE_P (*tp))
1267     *walk_subtrees = 0;
1268   if (TREE_CODE (*tp) == CONSTRUCTOR)
1269     return *tp;
1270   return NULL_TREE;
1271 }
1272 
1273 /* If T is a CONSTRUCTOR or an expression that has a CONSTRUCTOR node as a
1274    subexpression, return an unshared copy of T.  Otherwise return T.  */
1275 
1276 static tree
1277 unshare_constructor (tree t)
1278 {
1279   tree ctor = walk_tree (&t, find_constructor, NULL, NULL);
1280   if (ctor != NULL_TREE)
1281     return unshare_expr (t);
1282   return t;
1283 }
1284 
1285 /* Subroutine of cxx_eval_call_expression.
1286    We are processing a call expression (either CALL_EXPR or
1287    AGGR_INIT_EXPR) in the context of CTX.  Evaluate
1288    all arguments and bind their values to correspondings
1289    parameters, making up the NEW_CALL context.  */
1290 
1291 static void
1292 cxx_bind_parameters_in_call (const constexpr_ctx *ctx, tree t,
1293                              constexpr_call *new_call,
1294 			     bool *non_constant_p, bool *overflow_p,
1295 			     bool *non_constant_args)
1296 {
1297   const int nargs = call_expr_nargs (t);
1298   tree fun = new_call->fundef->decl;
1299   tree parms = DECL_ARGUMENTS (fun);
1300   int i;
1301   tree *p = &new_call->bindings;
1302   for (i = 0; i < nargs; ++i)
1303     {
1304       tree x, arg;
1305       tree type = parms ? TREE_TYPE (parms) : void_type_node;
1306       x = get_nth_callarg (t, i);
1307       /* For member function, the first argument is a pointer to the implied
1308          object.  For a constructor, it might still be a dummy object, in
1309          which case we get the real argument from ctx. */
1310       if (i == 0 && DECL_CONSTRUCTOR_P (fun)
1311 	  && is_dummy_object (x))
1312 	{
1313 	  x = ctx->object;
1314 	  x = build_address (x);
1315 	}
1316       arg = cxx_eval_constant_expression (ctx, x, /*lval=*/false,
1317 					  non_constant_p, overflow_p);
1318       /* Don't VERIFY_CONSTANT here.  */
1319       if (*non_constant_p && ctx->quiet)
1320 	return;
1321       /* Just discard ellipsis args after checking their constantitude.  */
1322       if (!parms)
1323 	continue;
1324 
1325       if (!*non_constant_p)
1326 	{
1327 	  /* Don't share a CONSTRUCTOR that might be changed.  */
1328 	  arg = unshare_constructor (arg);
1329 	  /* Make sure the binding has the same type as the parm.  But
1330 	     only for constant args.  */
1331 	  if (TREE_CODE (type) != REFERENCE_TYPE)
1332 	    arg = adjust_temp_type (type, arg);
1333 	  if (!TREE_CONSTANT (arg))
1334 	    *non_constant_args = true;
1335 	  *p = build_tree_list (parms, arg);
1336 	  p = &TREE_CHAIN (*p);
1337 	}
1338       parms = TREE_CHAIN (parms);
1339     }
1340 }
1341 
1342 /* Variables and functions to manage constexpr call expansion context.
1343    These do not need to be marked for PCH or GC.  */
1344 
1345 /* FIXME remember and print actual constant arguments.  */
1346 static vec<tree> call_stack;
1347 static int call_stack_tick;
1348 static int last_cx_error_tick;
1349 
1350 static bool
1351 push_cx_call_context (tree call)
1352 {
1353   ++call_stack_tick;
1354   if (!EXPR_HAS_LOCATION (call))
1355     SET_EXPR_LOCATION (call, input_location);
1356   call_stack.safe_push (call);
1357   if (call_stack.length () > (unsigned) max_constexpr_depth)
1358     return false;
1359   return true;
1360 }
1361 
1362 static void
1363 pop_cx_call_context (void)
1364 {
1365   ++call_stack_tick;
1366   call_stack.pop ();
1367 }
1368 
1369 vec<tree>
1370 cx_error_context (void)
1371 {
1372   vec<tree> r = vNULL;
1373   if (call_stack_tick != last_cx_error_tick
1374       && !call_stack.is_empty ())
1375     r = call_stack;
1376   last_cx_error_tick = call_stack_tick;
1377   return r;
1378 }
1379 
1380 /* Evaluate a call T to a GCC internal function when possible and return
1381    the evaluated result or, under the control of CTX, give an error, set
1382    NON_CONSTANT_P, and return the unevaluated call T otherwise.  */
1383 
1384 static tree
1385 cxx_eval_internal_function (const constexpr_ctx *ctx, tree t,
1386 			    bool lval,
1387 			    bool *non_constant_p, bool *overflow_p)
1388 {
1389   enum tree_code opcode = ERROR_MARK;
1390 
1391   switch (CALL_EXPR_IFN (t))
1392     {
1393     case IFN_UBSAN_NULL:
1394     case IFN_UBSAN_BOUNDS:
1395     case IFN_UBSAN_VPTR:
1396     case IFN_FALLTHROUGH:
1397       return void_node;
1398 
1399     case IFN_ADD_OVERFLOW:
1400       opcode = PLUS_EXPR;
1401       break;
1402     case IFN_SUB_OVERFLOW:
1403       opcode = MINUS_EXPR;
1404       break;
1405     case IFN_MUL_OVERFLOW:
1406       opcode = MULT_EXPR;
1407       break;
1408 
1409     case IFN_LAUNDER:
1410       return cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 0),
1411 					   false, non_constant_p, overflow_p);
1412 
1413     default:
1414       if (!ctx->quiet)
1415 	error_at (EXPR_LOC_OR_LOC (t, input_location),
1416 		  "call to internal function %qE", t);
1417       *non_constant_p = true;
1418       return t;
1419     }
1420 
1421   /* Evaluate constant arguments using OPCODE and return a complex
1422      number containing the result and the overflow bit.  */
1423   tree arg0 = cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 0), lval,
1424 					    non_constant_p, overflow_p);
1425   tree arg1 = cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 1), lval,
1426 					    non_constant_p, overflow_p);
1427 
1428   if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1429     {
1430       location_t loc = EXPR_LOC_OR_LOC (t, input_location);
1431       tree type = TREE_TYPE (TREE_TYPE (t));
1432       tree result = fold_binary_loc (loc, opcode, type,
1433 				     fold_convert_loc (loc, type, arg0),
1434 				     fold_convert_loc (loc, type, arg1));
1435       tree ovf
1436 	= build_int_cst (type, arith_overflowed_p (opcode, type, arg0, arg1));
1437       /* Reset TREE_OVERFLOW to avoid warnings for the overflow.  */
1438       if (TREE_OVERFLOW (result))
1439 	TREE_OVERFLOW (result) = 0;
1440 
1441       return build_complex (TREE_TYPE (t), result, ovf);
1442     }
1443 
1444   *non_constant_p = true;
1445   return t;
1446 }
1447 
1448 /* Clean CONSTRUCTOR_NO_IMPLICIT_ZERO from CTOR and its sub-aggregates.  */
1449 
1450 static void
1451 clear_no_implicit_zero (tree ctor)
1452 {
1453   if (CONSTRUCTOR_NO_IMPLICIT_ZERO (ctor))
1454     {
1455       CONSTRUCTOR_NO_IMPLICIT_ZERO (ctor) = false;
1456       tree elt; unsigned HOST_WIDE_INT idx;
1457       FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), idx, elt)
1458 	if (TREE_CODE (elt) == CONSTRUCTOR)
1459 	  clear_no_implicit_zero (elt);
1460     }
1461 }
1462 
1463 /* Subroutine of cxx_eval_constant_expression.
1464    Evaluate the call expression tree T in the context of OLD_CALL expression
1465    evaluation.  */
1466 
1467 static tree
1468 cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
1469 			  bool lval,
1470 			  bool *non_constant_p, bool *overflow_p)
1471 {
1472   location_t loc = EXPR_LOC_OR_LOC (t, input_location);
1473   tree fun = get_function_named_in_call (t);
1474   constexpr_call new_call = { NULL, NULL, NULL, 0 };
1475   bool depth_ok;
1476 
1477   if (fun == NULL_TREE)
1478     return cxx_eval_internal_function (ctx, t, lval,
1479 				       non_constant_p, overflow_p);
1480 
1481   if (TREE_CODE (fun) != FUNCTION_DECL)
1482     {
1483       /* Might be a constexpr function pointer.  */
1484       fun = cxx_eval_constant_expression (ctx, fun,
1485 					  /*lval*/false, non_constant_p,
1486 					  overflow_p);
1487       STRIP_NOPS (fun);
1488       if (TREE_CODE (fun) == ADDR_EXPR)
1489 	fun = TREE_OPERAND (fun, 0);
1490     }
1491   if (TREE_CODE (fun) != FUNCTION_DECL)
1492     {
1493       if (!ctx->quiet && !*non_constant_p)
1494 	error_at (loc, "expression %qE does not designate a %<constexpr%> "
1495 		  "function", fun);
1496       *non_constant_p = true;
1497       return t;
1498     }
1499   if (DECL_CLONED_FUNCTION_P (fun))
1500     fun = DECL_CLONED_FUNCTION (fun);
1501 
1502   if (is_ubsan_builtin_p (fun))
1503     return void_node;
1504 
1505   if (is_builtin_fn (fun))
1506     return cxx_eval_builtin_function_call (ctx, t, fun,
1507 					   lval, non_constant_p, overflow_p);
1508   if (!DECL_DECLARED_CONSTEXPR_P (fun))
1509     {
1510       if (!ctx->quiet)
1511 	{
1512 	  if (!lambda_static_thunk_p (fun))
1513 	    error_at (loc, "call to non-%<constexpr%> function %qD", fun);
1514 	  explain_invalid_constexpr_fn (fun);
1515 	}
1516       *non_constant_p = true;
1517       return t;
1518     }
1519 
1520   constexpr_ctx new_ctx = *ctx;
1521   if (DECL_CONSTRUCTOR_P (fun) && !ctx->object
1522       && TREE_CODE (t) == AGGR_INIT_EXPR)
1523     {
1524       /* We want to have an initialization target for an AGGR_INIT_EXPR.
1525 	 If we don't already have one in CTX, use the AGGR_INIT_EXPR_SLOT.  */
1526       new_ctx.object = AGGR_INIT_EXPR_SLOT (t);
1527       tree ctor = new_ctx.ctor = build_constructor (DECL_CONTEXT (fun), NULL);
1528       CONSTRUCTOR_NO_IMPLICIT_ZERO (ctor) = true;
1529       ctx->values->put (new_ctx.object, ctor);
1530       ctx = &new_ctx;
1531     }
1532 
1533   /* Shortcut trivial constructor/op=.  */
1534   if (trivial_fn_p (fun))
1535     {
1536       tree init = NULL_TREE;
1537       if (call_expr_nargs (t) == 2)
1538 	init = convert_from_reference (get_nth_callarg (t, 1));
1539       else if (TREE_CODE (t) == AGGR_INIT_EXPR
1540 	       && AGGR_INIT_ZERO_FIRST (t))
1541 	init = build_zero_init (DECL_CONTEXT (fun), NULL_TREE, false);
1542       if (init)
1543 	{
1544 	  tree op = get_nth_callarg (t, 0);
1545 	  if (is_dummy_object (op))
1546 	    op = ctx->object;
1547 	  else
1548 	    op = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (op)), op);
1549 	  tree set = build2 (MODIFY_EXPR, TREE_TYPE (op), op, init);
1550 	  new_ctx.call = &new_call;
1551 	  return cxx_eval_constant_expression (&new_ctx, set, lval,
1552 					       non_constant_p, overflow_p);
1553 	}
1554     }
1555 
1556   /* We can't defer instantiating the function any longer.  */
1557   if (!DECL_INITIAL (fun)
1558       && DECL_TEMPLOID_INSTANTIATION (fun))
1559     {
1560       location_t save_loc = input_location;
1561       input_location = loc;
1562       ++function_depth;
1563       instantiate_decl (fun, /*defer_ok*/false, /*expl_inst*/false);
1564       --function_depth;
1565       input_location = save_loc;
1566     }
1567 
1568   /* If in direct recursive call, optimize definition search.  */
1569   if (ctx && ctx->call && ctx->call->fundef && ctx->call->fundef->decl == fun)
1570     new_call.fundef = ctx->call->fundef;
1571   else
1572     {
1573       new_call.fundef = retrieve_constexpr_fundef (fun);
1574       if (new_call.fundef == NULL || new_call.fundef->body == NULL
1575 	  || fun == current_function_decl)
1576         {
1577 	  if (!ctx->quiet)
1578 	    {
1579 	      /* We need to check for current_function_decl here in case we're
1580 		 being called during cp_fold_function, because at that point
1581 		 DECL_INITIAL is set properly and we have a fundef but we
1582 		 haven't lowered invisirefs yet (c++/70344).  */
1583 	      if (DECL_INITIAL (fun) == error_mark_node
1584 		  || fun == current_function_decl)
1585 		error_at (loc, "%qD called in a constant expression before its "
1586 			  "definition is complete", fun);
1587 	      else if (DECL_INITIAL (fun))
1588 		{
1589 		  /* The definition of fun was somehow unsuitable.  But pretend
1590 		     that lambda static thunks don't exist.  */
1591 		  if (!lambda_static_thunk_p (fun))
1592 		    error_at (loc, "%qD called in a constant expression", fun);
1593 		  explain_invalid_constexpr_fn (fun);
1594 		}
1595 	      else
1596 		error_at (loc, "%qD used before its definition", fun);
1597 	    }
1598 	  *non_constant_p = true;
1599           return t;
1600         }
1601     }
1602 
1603   bool non_constant_args = false;
1604   cxx_bind_parameters_in_call (ctx, t, &new_call,
1605 			       non_constant_p, overflow_p, &non_constant_args);
1606   if (*non_constant_p)
1607     return t;
1608 
1609   depth_ok = push_cx_call_context (t);
1610 
1611   tree result = NULL_TREE;
1612 
1613   constexpr_call *entry = NULL;
1614   if (depth_ok && !non_constant_args && ctx->strict)
1615     {
1616       new_call.hash = iterative_hash_template_arg
1617 	(new_call.bindings, constexpr_fundef_hasher::hash (new_call.fundef));
1618 
1619       /* If we have seen this call before, we are done.  */
1620       maybe_initialize_constexpr_call_table ();
1621       constexpr_call **slot
1622 	= constexpr_call_table->find_slot (&new_call, INSERT);
1623       entry = *slot;
1624       if (entry == NULL)
1625 	{
1626 	  /* We need to keep a pointer to the entry, not just the slot, as the
1627 	     slot can move in the call to cxx_eval_builtin_function_call.  */
1628 	  *slot = entry = ggc_alloc<constexpr_call> ();
1629 	  *entry = new_call;
1630 	}
1631       /* Calls that are in progress have their result set to NULL,
1632 	 so that we can detect circular dependencies.  */
1633       else if (entry->result == NULL)
1634 	{
1635 	  if (!ctx->quiet)
1636 	    error ("call has circular dependency");
1637 	  *non_constant_p = true;
1638 	  entry->result = result = error_mark_node;
1639 	}
1640       else
1641 	result = entry->result;
1642     }
1643 
1644   if (!depth_ok)
1645     {
1646       if (!ctx->quiet)
1647 	error ("%<constexpr%> evaluation depth exceeds maximum of %d (use "
1648 	       "-fconstexpr-depth= to increase the maximum)",
1649 	       max_constexpr_depth);
1650       *non_constant_p = true;
1651       result = error_mark_node;
1652     }
1653   else
1654     {
1655       if (result && result != error_mark_node)
1656 	/* OK */;
1657       else if (!DECL_SAVED_TREE (fun))
1658 	{
1659 	  /* When at_eof >= 2, cgraph has started throwing away
1660 	     DECL_SAVED_TREE, so fail quietly.  FIXME we get here because of
1661 	     late code generation for VEC_INIT_EXPR, which needs to be
1662 	     completely reconsidered.  */
1663 	  gcc_assert (at_eof >= 2 && ctx->quiet);
1664 	  *non_constant_p = true;
1665 	}
1666       else
1667 	{
1668 	  tree body, parms, res;
1669 
1670 	  /* Reuse or create a new unshared copy of this function's body.  */
1671 	  tree copy = get_fundef_copy (fun);
1672 	  body = TREE_PURPOSE (copy);
1673 	  parms = TREE_VALUE (copy);
1674 	  res = TREE_TYPE (copy);
1675 
1676 	  /* Associate the bindings with the remapped parms.  */
1677 	  tree bound = new_call.bindings;
1678 	  tree remapped = parms;
1679 	  while (bound)
1680 	    {
1681 	      tree oparm = TREE_PURPOSE (bound);
1682 	      tree arg = TREE_VALUE (bound);
1683 	      gcc_assert (DECL_NAME (remapped) == DECL_NAME (oparm));
1684 	      /* Don't share a CONSTRUCTOR that might be changed.  */
1685 	      arg = unshare_constructor (arg);
1686 	      ctx->values->put (remapped, arg);
1687 	      bound = TREE_CHAIN (bound);
1688 	      remapped = DECL_CHAIN (remapped);
1689 	    }
1690 	  /* Add the RESULT_DECL to the values map, too.  */
1691 	  tree slot = NULL_TREE;
1692 	  if (DECL_BY_REFERENCE (res))
1693 	    {
1694 	      slot = AGGR_INIT_EXPR_SLOT (t);
1695 	      tree addr = build_address (slot);
1696 	      addr = build_nop (TREE_TYPE (res), addr);
1697 	      ctx->values->put (res, addr);
1698 	      ctx->values->put (slot, NULL_TREE);
1699 	    }
1700 	  else
1701 	    ctx->values->put (res, NULL_TREE);
1702 
1703 	  /* Track the callee's evaluated SAVE_EXPRs so that we can forget
1704 	     their values after the call.  */
1705 	  constexpr_ctx ctx_with_save_exprs = *ctx;
1706 	  hash_set<tree> save_exprs;
1707 	  ctx_with_save_exprs.save_exprs = &save_exprs;
1708 	  ctx_with_save_exprs.call = &new_call;
1709 
1710 	  tree jump_target = NULL_TREE;
1711 	  cxx_eval_constant_expression (&ctx_with_save_exprs, body,
1712 					lval, non_constant_p, overflow_p,
1713 					&jump_target);
1714 
1715 	  if (DECL_CONSTRUCTOR_P (fun))
1716 	    /* This can be null for a subobject constructor call, in
1717 	       which case what we care about is the initialization
1718 	       side-effects rather than the value.  We could get at the
1719 	       value by evaluating *this, but we don't bother; there's
1720 	       no need to put such a call in the hash table.  */
1721 	    result = lval ? ctx->object : ctx->ctor;
1722 	  else if (VOID_TYPE_P (TREE_TYPE (res)))
1723 	    result = void_node;
1724 	  else
1725 	    {
1726 	      result = *ctx->values->get (slot ? slot : res);
1727 	      if (result == NULL_TREE && !*non_constant_p)
1728 		{
1729 		  if (!ctx->quiet)
1730 		    error ("%<constexpr%> call flows off the end "
1731 			   "of the function");
1732 		  *non_constant_p = true;
1733 		}
1734 	    }
1735 
1736 	  /* Forget the saved values of the callee's SAVE_EXPRs.  */
1737 	  for (hash_set<tree>::iterator iter = save_exprs.begin();
1738 	       iter != save_exprs.end(); ++iter)
1739 	    ctx_with_save_exprs.values->remove (*iter);
1740 
1741 	  /* Remove the parms/result from the values map.  Is it worth
1742 	     bothering to do this when the map itself is only live for
1743 	     one constexpr evaluation?  If so, maybe also clear out
1744 	     other vars from call, maybe in BIND_EXPR handling?  */
1745 	  ctx->values->remove (res);
1746 	  if (slot)
1747 	    ctx->values->remove (slot);
1748 	  for (tree parm = parms; parm; parm = TREE_CHAIN (parm))
1749 	    ctx->values->remove (parm);
1750 
1751 	  /* Make the unshared function copy we used available for re-use.  */
1752 	  save_fundef_copy (fun, copy);
1753 	}
1754 
1755       if (result == error_mark_node)
1756 	*non_constant_p = true;
1757       if (*non_constant_p || *overflow_p)
1758 	result = error_mark_node;
1759       else if (!result)
1760 	result = void_node;
1761       if (entry)
1762 	entry->result = result;
1763     }
1764 
1765   /* The result of a constexpr function must be completely initialized.  */
1766   if (TREE_CODE (result) == CONSTRUCTOR)
1767     clear_no_implicit_zero (result);
1768 
1769   pop_cx_call_context ();
1770   return unshare_constructor (result);
1771 }
1772 
1773 /* FIXME speed this up, it's taking 16% of compile time on sieve testcase.  */
1774 
1775 bool
1776 reduced_constant_expression_p (tree t)
1777 {
1778   if (t == NULL_TREE)
1779     return false;
1780 
1781   switch (TREE_CODE (t))
1782     {
1783     case PTRMEM_CST:
1784       /* Even if we can't lower this yet, it's constant.  */
1785       return true;
1786 
1787     case CONSTRUCTOR:
1788       /* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR.  */
1789       tree idx, val, field; unsigned HOST_WIDE_INT i;
1790       if (CONSTRUCTOR_NO_IMPLICIT_ZERO (t))
1791 	{
1792 	  if (TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
1793 	    /* An initialized vector would have a VECTOR_CST.  */
1794 	    return false;
1795 	  else
1796 	    field = next_initializable_field (TYPE_FIELDS (TREE_TYPE (t)));
1797 	}
1798       else
1799 	field = NULL_TREE;
1800       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, idx, val)
1801 	{
1802 	  /* If VAL is null, we're in the middle of initializing this
1803 	     element.  */
1804 	  if (!reduced_constant_expression_p (val))
1805 	    return false;
1806 	  if (field)
1807 	    {
1808 	      if (idx != field)
1809 		return false;
1810 	      field = next_initializable_field (DECL_CHAIN (field));
1811 	    }
1812 	}
1813       if (field)
1814 	return false;
1815       else if (CONSTRUCTOR_NO_IMPLICIT_ZERO (t))
1816 	/* All the fields are initialized.  */
1817 	CONSTRUCTOR_NO_IMPLICIT_ZERO (t) = false;
1818       return true;
1819 
1820     default:
1821       /* FIXME are we calling this too much?  */
1822       return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE;
1823     }
1824 }
1825 
1826 /* Some expressions may have constant operands but are not constant
1827    themselves, such as 1/0.  Call this function to check for that
1828    condition.
1829 
1830    We only call this in places that require an arithmetic constant, not in
1831    places where we might have a non-constant expression that can be a
1832    component of a constant expression, such as the address of a constexpr
1833    variable that might be dereferenced later.  */
1834 
1835 static bool
1836 verify_constant (tree t, bool allow_non_constant, bool *non_constant_p,
1837 		 bool *overflow_p)
1838 {
1839   if (!*non_constant_p && !reduced_constant_expression_p (t))
1840     {
1841       if (!allow_non_constant)
1842 	error ("%q+E is not a constant expression", t);
1843       *non_constant_p = true;
1844     }
1845   if (TREE_OVERFLOW_P (t))
1846     {
1847       if (!allow_non_constant)
1848 	{
1849 	  permerror (input_location, "overflow in constant expression");
1850 	  /* If we're being permissive (and are in an enforcing
1851 	     context), ignore the overflow.  */
1852 	  if (flag_permissive)
1853 	    return *non_constant_p;
1854 	}
1855       *overflow_p = true;
1856     }
1857   return *non_constant_p;
1858 }
1859 
1860 /* Check whether the shift operation with code CODE and type TYPE on LHS
1861    and RHS is undefined.  If it is, give an error with an explanation,
1862    and return true; return false otherwise.  */
1863 
1864 static bool
1865 cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
1866 			enum tree_code code, tree type, tree lhs, tree rhs)
1867 {
1868   if ((code != LSHIFT_EXPR && code != RSHIFT_EXPR)
1869       || TREE_CODE (lhs) != INTEGER_CST
1870       || TREE_CODE (rhs) != INTEGER_CST)
1871     return false;
1872 
1873   tree lhstype = TREE_TYPE (lhs);
1874   unsigned HOST_WIDE_INT uprec = TYPE_PRECISION (TREE_TYPE (lhs));
1875 
1876   /* [expr.shift] The behavior is undefined if the right operand
1877      is negative, or greater than or equal to the length in bits
1878      of the promoted left operand.  */
1879   if (tree_int_cst_sgn (rhs) == -1)
1880     {
1881       if (!ctx->quiet)
1882 	permerror (loc, "right operand of shift expression %q+E is negative",
1883 		   build2_loc (loc, code, type, lhs, rhs));
1884       return (!flag_permissive || ctx->quiet);
1885     }
1886   if (compare_tree_int (rhs, uprec) >= 0)
1887     {
1888       if (!ctx->quiet)
1889 	permerror (loc, "right operand of shift expression %q+E is >= than "
1890 		   "the precision of the left operand",
1891 		   build2_loc (loc, code, type, lhs, rhs));
1892       return (!flag_permissive || ctx->quiet);
1893     }
1894 
1895   /* The value of E1 << E2 is E1 left-shifted E2 bit positions; [...]
1896      if E1 has a signed type and non-negative value, and E1x2^E2 is
1897      representable in the corresponding unsigned type of the result type,
1898      then that value, converted to the result type, is the resulting value;
1899      otherwise, the behavior is undefined.  */
1900   if (code == LSHIFT_EXPR && !TYPE_UNSIGNED (lhstype)
1901       && (cxx_dialect >= cxx11))
1902     {
1903       if (tree_int_cst_sgn (lhs) == -1)
1904 	{
1905 	  if (!ctx->quiet)
1906 	    permerror (loc,
1907 		       "left operand of shift expression %q+E is negative",
1908 		       build2_loc (loc, code, type, lhs, rhs));
1909 	  return (!flag_permissive || ctx->quiet);
1910 	}
1911       /* For signed x << y the following:
1912 	 (unsigned) x >> ((prec (lhs) - 1) - y)
1913 	 if > 1, is undefined.  The right-hand side of this formula
1914 	 is the highest bit of the LHS that can be set (starting from 0),
1915 	 so that the shift doesn't overflow.  We then right-shift the LHS
1916 	 to see whether any other bit is set making the original shift
1917 	 undefined -- the result is not representable in the corresponding
1918 	 unsigned type.  */
1919       tree t = build_int_cst (unsigned_type_node, uprec - 1);
1920       t = fold_build2 (MINUS_EXPR, unsigned_type_node, t, rhs);
1921       tree ulhs = fold_convert (unsigned_type_for (lhstype), lhs);
1922       t = fold_build2 (RSHIFT_EXPR, TREE_TYPE (ulhs), ulhs, t);
1923       if (tree_int_cst_lt (integer_one_node, t))
1924 	{
1925 	  if (!ctx->quiet)
1926 	    permerror (loc, "shift expression %q+E overflows",
1927 		       build2_loc (loc, code, type, lhs, rhs));
1928 	  return (!flag_permissive || ctx->quiet);
1929 	}
1930     }
1931   return false;
1932 }
1933 
1934 /* Subroutine of cxx_eval_constant_expression.
1935    Attempt to reduce the unary expression tree T to a compile time value.
1936    If successful, return the value.  Otherwise issue a diagnostic
1937    and return error_mark_node.  */
1938 
1939 static tree
1940 cxx_eval_unary_expression (const constexpr_ctx *ctx, tree t,
1941 			   bool /*lval*/,
1942 			   bool *non_constant_p, bool *overflow_p)
1943 {
1944   tree r;
1945   tree orig_arg = TREE_OPERAND (t, 0);
1946   tree arg = cxx_eval_constant_expression (ctx, orig_arg, /*lval*/false,
1947 					   non_constant_p, overflow_p);
1948   VERIFY_CONSTANT (arg);
1949   location_t loc = EXPR_LOCATION (t);
1950   enum tree_code code = TREE_CODE (t);
1951   tree type = TREE_TYPE (t);
1952   r = fold_unary_loc (loc, code, type, arg);
1953   if (r == NULL_TREE)
1954     {
1955       if (arg == orig_arg)
1956 	r = t;
1957       else
1958 	r = build1_loc (loc, code, type, arg);
1959     }
1960   VERIFY_CONSTANT (r);
1961   return r;
1962 }
1963 
1964 /* Helper function for cxx_eval_binary_expression.  Try to optimize
1965    original POINTER_PLUS_EXPR T, LHS p+ RHS, return NULL_TREE if the
1966    generic folding should be used.  */
1967 
1968 static tree
1969 cxx_fold_pointer_plus_expression (const constexpr_ctx *ctx, tree t,
1970 				  tree lhs, tree rhs, bool *non_constant_p,
1971 				  bool *overflow_p)
1972 {
1973   STRIP_NOPS (lhs);
1974   if (TREE_CODE (lhs) != ADDR_EXPR)
1975     return NULL_TREE;
1976 
1977   lhs = TREE_OPERAND (lhs, 0);
1978 
1979   /* &A[i] p+ j => &A[i + j] */
1980   if (TREE_CODE (lhs) == ARRAY_REF
1981       && TREE_CODE (TREE_OPERAND (lhs, 1)) == INTEGER_CST
1982       && TREE_CODE (rhs) == INTEGER_CST
1983       && TYPE_SIZE_UNIT (TREE_TYPE (lhs))
1984       && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST)
1985     {
1986       tree orig_type = TREE_TYPE (t);
1987       location_t loc = EXPR_LOCATION (t);
1988       tree type = TREE_TYPE (lhs);
1989 
1990       t = fold_convert_loc (loc, ssizetype, TREE_OPERAND (lhs, 1));
1991       tree nelts = array_type_nelts_top (TREE_TYPE (TREE_OPERAND (lhs, 0)));
1992       nelts = cxx_eval_constant_expression (ctx, nelts, false, non_constant_p,
1993 					    overflow_p);
1994       if (*non_constant_p)
1995 	return NULL_TREE;
1996       /* Don't fold an out-of-bound access.  */
1997       if (!tree_int_cst_le (t, nelts))
1998 	return NULL_TREE;
1999       rhs = cp_fold_convert (ssizetype, rhs);
2000       /* Don't fold if rhs can't be divided exactly by TYPE_SIZE_UNIT.
2001 	 constexpr int A[1]; ... (char *)&A[0] + 1 */
2002       if (!integer_zerop (fold_build2_loc (loc, TRUNC_MOD_EXPR, sizetype,
2003 					   rhs, TYPE_SIZE_UNIT (type))))
2004 	return NULL_TREE;
2005       /* Make sure to treat the second operand of POINTER_PLUS_EXPR
2006 	 as signed.  */
2007       rhs = fold_build2_loc (loc, EXACT_DIV_EXPR, ssizetype, rhs,
2008 			     TYPE_SIZE_UNIT (type));
2009       t = size_binop_loc (loc, PLUS_EXPR, rhs, t);
2010       t = build4_loc (loc, ARRAY_REF, type, TREE_OPERAND (lhs, 0),
2011 		      t, NULL_TREE, NULL_TREE);
2012       t = cp_build_addr_expr (t, tf_warning_or_error);
2013       t = cp_fold_convert (orig_type, t);
2014       return cxx_eval_constant_expression (ctx, t, /*lval*/false,
2015 					   non_constant_p, overflow_p);
2016     }
2017 
2018   return NULL_TREE;
2019 }
2020 
2021 /* Subroutine of cxx_eval_constant_expression.
2022    Like cxx_eval_unary_expression, except for binary expressions.  */
2023 
2024 static tree
2025 cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t,
2026 			    bool /*lval*/,
2027 			    bool *non_constant_p, bool *overflow_p)
2028 {
2029   tree r = NULL_TREE;
2030   tree orig_lhs = TREE_OPERAND (t, 0);
2031   tree orig_rhs = TREE_OPERAND (t, 1);
2032   tree lhs, rhs;
2033   lhs = cxx_eval_constant_expression (ctx, orig_lhs, /*lval*/false,
2034 				      non_constant_p, overflow_p);
2035   /* Don't VERIFY_CONSTANT here, it's unnecessary and will break pointer
2036      subtraction.  */
2037   if (*non_constant_p)
2038     return t;
2039   rhs = cxx_eval_constant_expression (ctx, orig_rhs, /*lval*/false,
2040 				      non_constant_p, overflow_p);
2041   if (*non_constant_p)
2042     return t;
2043 
2044   location_t loc = EXPR_LOCATION (t);
2045   enum tree_code code = TREE_CODE (t);
2046   tree type = TREE_TYPE (t);
2047 
2048   if (code == EQ_EXPR || code == NE_EXPR)
2049     {
2050       bool is_code_eq = (code == EQ_EXPR);
2051 
2052       if (TREE_CODE (lhs) == PTRMEM_CST
2053 	  && TREE_CODE (rhs) == PTRMEM_CST)
2054 	r = constant_boolean_node (cp_tree_equal (lhs, rhs) == is_code_eq,
2055 				   type);
2056       else if ((TREE_CODE (lhs) == PTRMEM_CST
2057 		|| TREE_CODE (rhs) == PTRMEM_CST)
2058 	       && (null_member_pointer_value_p (lhs)
2059 		   || null_member_pointer_value_p (rhs)))
2060 	r = constant_boolean_node (!is_code_eq, type);
2061       else if (TREE_CODE (lhs) == PTRMEM_CST)
2062 	lhs = cplus_expand_constant (lhs);
2063       else if (TREE_CODE (rhs) == PTRMEM_CST)
2064 	rhs = cplus_expand_constant (rhs);
2065     }
2066   if (code == POINTER_PLUS_EXPR && !*non_constant_p
2067       && integer_zerop (lhs) && !integer_zerop (rhs))
2068     {
2069       if (!ctx->quiet)
2070 	error ("arithmetic involving a null pointer in %qE", lhs);
2071       *non_constant_p = true;
2072       return t;
2073     }
2074   else if (code == POINTER_PLUS_EXPR)
2075     r = cxx_fold_pointer_plus_expression (ctx, t, lhs, rhs, non_constant_p,
2076 					  overflow_p);
2077 
2078   if (r == NULL_TREE)
2079     r = fold_binary_loc (loc, code, type, lhs, rhs);
2080 
2081   if (r == NULL_TREE)
2082     {
2083       if (lhs == orig_lhs && rhs == orig_rhs)
2084 	r = t;
2085       else
2086 	r = build2_loc (loc, code, type, lhs, rhs);
2087     }
2088   else if (cxx_eval_check_shift_p (loc, ctx, code, type, lhs, rhs))
2089     *non_constant_p = true;
2090   /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
2091      a local array in a constexpr function.  */
2092   bool ptr = POINTER_TYPE_P (TREE_TYPE (lhs));
2093   if (!ptr)
2094     VERIFY_CONSTANT (r);
2095   return r;
2096 }
2097 
2098 /* Subroutine of cxx_eval_constant_expression.
2099    Attempt to evaluate condition expressions.  Dead branches are not
2100    looked into.  */
2101 
2102 static tree
2103 cxx_eval_conditional_expression (const constexpr_ctx *ctx, tree t,
2104 				 bool lval,
2105 				 bool *non_constant_p, bool *overflow_p,
2106 				 tree *jump_target)
2107 {
2108   tree val = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
2109 					   /*lval*/false,
2110 					   non_constant_p, overflow_p);
2111   VERIFY_CONSTANT (val);
2112   /* Don't VERIFY_CONSTANT the other operands.  */
2113   if (integer_zerop (val))
2114     return cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 2),
2115 					 lval,
2116 					 non_constant_p, overflow_p,
2117 					 jump_target);
2118   return cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
2119 				       lval,
2120 				       non_constant_p, overflow_p,
2121 				       jump_target);
2122 }
2123 
2124 /* Subroutine of cxx_eval_constant_expression.
2125    Attempt to evaluate vector condition expressions.  Unlike
2126    cxx_eval_conditional_expression, VEC_COND_EXPR acts like a normal
2127    ternary arithmetics operation, where all 3 arguments have to be
2128    evaluated as constants and then folding computes the result from
2129    them.  */
2130 
2131 static tree
2132 cxx_eval_vector_conditional_expression (const constexpr_ctx *ctx, tree t,
2133 					bool *non_constant_p, bool *overflow_p)
2134 {
2135   tree arg1 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
2136 					    /*lval*/false,
2137 					    non_constant_p, overflow_p);
2138   VERIFY_CONSTANT (arg1);
2139   tree arg2 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
2140 					    /*lval*/false,
2141 					    non_constant_p, overflow_p);
2142   VERIFY_CONSTANT (arg2);
2143   tree arg3 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 2),
2144 					    /*lval*/false,
2145 					    non_constant_p, overflow_p);
2146   VERIFY_CONSTANT (arg3);
2147   location_t loc = EXPR_LOCATION (t);
2148   tree type = TREE_TYPE (t);
2149   tree r = fold_ternary_loc (loc, VEC_COND_EXPR, type, arg1, arg2, arg3);
2150   if (r == NULL_TREE)
2151     {
2152       if (arg1 == TREE_OPERAND (t, 0)
2153 	  && arg2 == TREE_OPERAND (t, 1)
2154 	  && arg3 == TREE_OPERAND (t, 2))
2155 	r = t;
2156       else
2157 	r = build3_loc (loc, VEC_COND_EXPR, type, arg1, arg2, arg3);
2158     }
2159   VERIFY_CONSTANT (r);
2160   return r;
2161 }
2162 
2163 /* Returns less than, equal to, or greater than zero if KEY is found to be
2164    less than, to match, or to be greater than the constructor_elt's INDEX.  */
2165 
2166 static int
2167 array_index_cmp (tree key, tree index)
2168 {
2169   gcc_assert (TREE_CODE (key) == INTEGER_CST);
2170 
2171   switch (TREE_CODE (index))
2172     {
2173     case INTEGER_CST:
2174       return tree_int_cst_compare (key, index);
2175     case RANGE_EXPR:
2176       {
2177 	tree lo = TREE_OPERAND (index, 0);
2178 	tree hi = TREE_OPERAND (index, 1);
2179 	if (tree_int_cst_lt (key, lo))
2180 	  return -1;
2181 	else if (tree_int_cst_lt (hi, key))
2182 	  return 1;
2183 	else
2184 	  return 0;
2185       }
2186     default:
2187       gcc_unreachable ();
2188     }
2189 }
2190 
2191 /* Returns the index of the constructor_elt of ARY which matches DINDEX, or -1
2192    if none.  If INSERT is true, insert a matching element rather than fail.  */
2193 
2194 static HOST_WIDE_INT
2195 find_array_ctor_elt (tree ary, tree dindex, bool insert = false)
2196 {
2197   if (tree_int_cst_sgn (dindex) < 0)
2198     return -1;
2199 
2200   unsigned HOST_WIDE_INT i = tree_to_uhwi (dindex);
2201   vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (ary);
2202   unsigned HOST_WIDE_INT len = vec_safe_length (elts);
2203 
2204   unsigned HOST_WIDE_INT end = len;
2205   unsigned HOST_WIDE_INT begin = 0;
2206 
2207   /* If the last element of the CONSTRUCTOR has its own index, we can assume
2208      that the same is true of the other elements and index directly.  */
2209   if (end > 0)
2210     {
2211       tree cindex = (*elts)[end - 1].index;
2212       if (TREE_CODE (cindex) == INTEGER_CST
2213 	  && compare_tree_int (cindex, end - 1) == 0)
2214 	{
2215 	  if (i < end)
2216 	    return i;
2217 	  else
2218 	    begin = end;
2219 	}
2220     }
2221 
2222   /* Otherwise, find a matching index by means of a binary search.  */
2223   while (begin != end)
2224     {
2225       unsigned HOST_WIDE_INT middle = (begin + end) / 2;
2226       constructor_elt &elt = (*elts)[middle];
2227       tree idx = elt.index;
2228 
2229       int cmp = array_index_cmp (dindex, idx);
2230       if (cmp < 0)
2231 	end = middle;
2232       else if (cmp > 0)
2233 	begin = middle + 1;
2234       else
2235 	{
2236 	  if (insert && TREE_CODE (idx) == RANGE_EXPR)
2237 	    {
2238 	      /* We need to split the range.  */
2239 	      constructor_elt e;
2240 	      tree lo = TREE_OPERAND (idx, 0);
2241 	      tree hi = TREE_OPERAND (idx, 1);
2242 	      tree value = elt.value;
2243 	      dindex = fold_convert (sizetype, dindex);
2244 	      if (tree_int_cst_lt (lo, dindex))
2245 		{
2246 		  /* There are still some lower elts; shorten the range.  */
2247 		  tree new_hi = int_const_binop (MINUS_EXPR, dindex,
2248 						 size_one_node);
2249 		  if (tree_int_cst_equal (lo, new_hi))
2250 		    /* Only one element left, no longer a range.  */
2251 		    elt.index = lo;
2252 		  else
2253 		    TREE_OPERAND (idx, 1) = new_hi;
2254 		  /* Append the element we want to insert.  */
2255 		  ++middle;
2256 		  e.index = dindex;
2257 		  e.value = unshare_constructor (value);
2258 		  vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle, e);
2259 		}
2260 	      else
2261 		/* No lower elts, the range elt is now ours.  */
2262 		elt.index = dindex;
2263 
2264 	      if (tree_int_cst_lt (dindex, hi))
2265 		{
2266 		  /* There are still some higher elts; append a range.  */
2267 		  tree new_lo = int_const_binop (PLUS_EXPR, dindex,
2268 						 size_one_node);
2269 		  if (tree_int_cst_equal (new_lo, hi))
2270 		    e.index = hi;
2271 		  else
2272 		    e.index = build2 (RANGE_EXPR, sizetype, new_lo, hi);
2273 		  e.value = unshare_constructor (value);
2274 		  vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle + 1, e);
2275 		}
2276 	    }
2277 	  return middle;
2278 	}
2279     }
2280 
2281   if (insert)
2282     {
2283       constructor_elt e = { dindex, NULL_TREE };
2284       vec_safe_insert (CONSTRUCTOR_ELTS (ary), end, e);
2285       return end;
2286     }
2287 
2288   return -1;
2289 }
2290 
2291 /* Under the control of CTX, issue a detailed diagnostic for
2292    an out-of-bounds subscript INDEX into the expression ARRAY.  */
2293 
2294 static void
2295 diag_array_subscript (const constexpr_ctx *ctx, tree array, tree index)
2296 {
2297   if (!ctx->quiet)
2298     {
2299       tree arraytype = TREE_TYPE (array);
2300 
2301       /* Convert the unsigned array subscript to a signed integer to avoid
2302 	 printing huge numbers for small negative values.  */
2303       tree sidx = fold_convert (ssizetype, index);
2304       if (DECL_P (array))
2305 	{
2306 	  if (TYPE_DOMAIN (arraytype))
2307 	    error ("array subscript value %qE is outside the bounds "
2308 	           "of array %qD of type %qT", sidx, array, arraytype);
2309 	  else
2310 	    error ("non-zero array subscript %qE is used with array %qD of "
2311 		   "type %qT with unknown bounds", sidx, array, arraytype);
2312 	  inform (DECL_SOURCE_LOCATION (array), "declared here");
2313 	}
2314       else if (TYPE_DOMAIN (arraytype))
2315 	error ("array subscript value %qE is outside the bounds "
2316 	       "of array type %qT", sidx, arraytype);
2317       else
2318 	error ("non-zero array subscript %qE is used with array of type %qT "
2319 	       "with unknown bounds", sidx, arraytype);
2320     }
2321 }
2322 
2323 /* Return the number of elements for TYPE (which is an ARRAY_TYPE or
2324    a VECTOR_TYPE).  */
2325 
2326 static tree
2327 get_array_or_vector_nelts (const constexpr_ctx *ctx, tree type,
2328 			   bool *non_constant_p, bool *overflow_p)
2329 {
2330   tree nelts;
2331   if (TREE_CODE (type) == ARRAY_TYPE)
2332     {
2333       if (TYPE_DOMAIN (type))
2334 	nelts = array_type_nelts_top (type);
2335       else
2336 	nelts = size_zero_node;
2337     }
2338   else if (VECTOR_TYPE_P (type))
2339     nelts = size_int (TYPE_VECTOR_SUBPARTS (type));
2340   else
2341     gcc_unreachable ();
2342 
2343   /* For VLAs, the number of elements won't be an integer constant.  */
2344   nelts = cxx_eval_constant_expression (ctx, nelts, false,
2345 					non_constant_p, overflow_p);
2346   return nelts;
2347 }
2348 
2349 /* Extract element INDEX consisting of CHARS_PER_ELT chars from
2350    STRING_CST STRING.  */
2351 
2352 static tree
2353 extract_string_elt (tree string, unsigned chars_per_elt, unsigned index)
2354 {
2355   tree type = cv_unqualified (TREE_TYPE (TREE_TYPE (string)));
2356   tree r;
2357 
2358   if (chars_per_elt == 1)
2359     r = build_int_cst (type, TREE_STRING_POINTER (string)[index]);
2360   else
2361     {
2362       const unsigned char *ptr
2363 	= ((const unsigned char *)TREE_STRING_POINTER (string)
2364 	   + index * chars_per_elt);
2365       r = native_interpret_expr (type, ptr, chars_per_elt);
2366     }
2367   return r;
2368 }
2369 
2370 /* Subroutine of cxx_eval_constant_expression.
2371    Attempt to reduce a reference to an array slot.  */
2372 
2373 static tree
2374 cxx_eval_array_reference (const constexpr_ctx *ctx, tree t,
2375 			  bool lval,
2376 			  bool *non_constant_p, bool *overflow_p)
2377 {
2378   tree oldary = TREE_OPERAND (t, 0);
2379   tree ary = cxx_eval_constant_expression (ctx, oldary,
2380 					   lval,
2381 					   non_constant_p, overflow_p);
2382   tree index, oldidx;
2383   HOST_WIDE_INT i = 0;
2384   tree elem_type = NULL_TREE;
2385   unsigned len = 0, elem_nchars = 1;
2386   if (*non_constant_p)
2387     return t;
2388   oldidx = TREE_OPERAND (t, 1);
2389   index = cxx_eval_constant_expression (ctx, oldidx,
2390 					false,
2391 					non_constant_p, overflow_p);
2392   VERIFY_CONSTANT (index);
2393   if (!lval)
2394     {
2395       elem_type = TREE_TYPE (TREE_TYPE (ary));
2396       if (TREE_CODE (ary) == VIEW_CONVERT_EXPR
2397 	  && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (ary, 0)))
2398 	  && TREE_TYPE (t) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (ary, 0))))
2399 	ary = TREE_OPERAND (ary, 0);
2400       if (TREE_CODE (ary) == CONSTRUCTOR)
2401 	len = CONSTRUCTOR_NELTS (ary);
2402       else if (TREE_CODE (ary) == STRING_CST)
2403 	{
2404 	  elem_nchars = (TYPE_PRECISION (elem_type)
2405 			 / TYPE_PRECISION (char_type_node));
2406 	  len = (unsigned) TREE_STRING_LENGTH (ary) / elem_nchars;
2407 	}
2408       else if (TREE_CODE (ary) == VECTOR_CST)
2409 	/* We don't create variable-length VECTOR_CSTs.  */
2410 	len = VECTOR_CST_NELTS (ary).to_constant ();
2411       else
2412 	{
2413 	  /* We can't do anything with other tree codes, so use
2414 	     VERIFY_CONSTANT to complain and fail.  */
2415 	  VERIFY_CONSTANT (ary);
2416 	  gcc_unreachable ();
2417 	}
2418 
2419       if (!tree_fits_shwi_p (index)
2420 	  || (i = tree_to_shwi (index)) < 0)
2421 	{
2422 	  diag_array_subscript (ctx, ary, index);
2423 	  *non_constant_p = true;
2424 	  return t;
2425 	}
2426     }
2427 
2428   tree nelts = get_array_or_vector_nelts (ctx, TREE_TYPE (ary), non_constant_p,
2429 					  overflow_p);
2430   VERIFY_CONSTANT (nelts);
2431   if ((lval
2432        ? !tree_int_cst_le (index, nelts)
2433        : !tree_int_cst_lt (index, nelts))
2434       || tree_int_cst_sgn (index) < 0)
2435     {
2436       diag_array_subscript (ctx, ary, index);
2437       *non_constant_p = true;
2438       return t;
2439     }
2440 
2441   if (lval && ary == oldary && index == oldidx)
2442     return t;
2443   else if (lval)
2444     return build4 (ARRAY_REF, TREE_TYPE (t), ary, index, NULL, NULL);
2445 
2446   bool found;
2447   if (TREE_CODE (ary) == CONSTRUCTOR)
2448     {
2449       HOST_WIDE_INT ix = find_array_ctor_elt (ary, index);
2450       found = (ix >= 0);
2451       if (found)
2452 	i = ix;
2453     }
2454   else
2455     found = (i < len);
2456 
2457   if (found)
2458     {
2459       tree r;
2460       if (TREE_CODE (ary) == CONSTRUCTOR)
2461 	r = (*CONSTRUCTOR_ELTS (ary))[i].value;
2462       else if (TREE_CODE (ary) == VECTOR_CST)
2463 	r = VECTOR_CST_ELT (ary, i);
2464       else
2465 	r = extract_string_elt (ary, elem_nchars, i);
2466 
2467       if (r)
2468 	/* Don't VERIFY_CONSTANT here.  */
2469 	return r;
2470 
2471       /* Otherwise the element doesn't have a value yet.  */
2472     }
2473 
2474   /* Not found.  */
2475 
2476   if (TREE_CODE (ary) == CONSTRUCTOR
2477       && CONSTRUCTOR_NO_IMPLICIT_ZERO (ary))
2478     {
2479       /* 'ary' is part of the aggregate initializer we're currently
2480 	 building; if there's no initializer for this element yet,
2481 	 that's an error.  */
2482       if (!ctx->quiet)
2483 	error ("accessing uninitialized array element");
2484       *non_constant_p = true;
2485       return t;
2486     }
2487 
2488   /* If it's within the array bounds but doesn't have an explicit
2489      initializer, it's value-initialized.  */
2490   tree val = build_value_init (elem_type, tf_warning_or_error);
2491   return cxx_eval_constant_expression (ctx, val, lval, non_constant_p,
2492 				       overflow_p);
2493 }
2494 
2495 /* Subroutine of cxx_eval_constant_expression.
2496    Attempt to reduce a field access of a value of class type.  */
2497 
2498 static tree
2499 cxx_eval_component_reference (const constexpr_ctx *ctx, tree t,
2500 			      bool lval,
2501 			      bool *non_constant_p, bool *overflow_p)
2502 {
2503   unsigned HOST_WIDE_INT i;
2504   tree field;
2505   tree value;
2506   tree part = TREE_OPERAND (t, 1);
2507   tree orig_whole = TREE_OPERAND (t, 0);
2508   tree whole = cxx_eval_constant_expression (ctx, orig_whole,
2509 					     lval,
2510 					     non_constant_p, overflow_p);
2511   if (INDIRECT_REF_P (whole)
2512       && integer_zerop (TREE_OPERAND (whole, 0)))
2513     {
2514       if (!ctx->quiet)
2515 	error ("dereferencing a null pointer in %qE", orig_whole);
2516       *non_constant_p = true;
2517       return t;
2518     }
2519 
2520   if (TREE_CODE (whole) == PTRMEM_CST)
2521     whole = cplus_expand_constant (whole);
2522   if (whole == orig_whole)
2523     return t;
2524   if (lval)
2525     return fold_build3 (COMPONENT_REF, TREE_TYPE (t),
2526 			whole, part, NULL_TREE);
2527   /* Don't VERIFY_CONSTANT here; we only want to check that we got a
2528      CONSTRUCTOR.  */
2529   if (!*non_constant_p && TREE_CODE (whole) != CONSTRUCTOR)
2530     {
2531       if (!ctx->quiet)
2532 	error ("%qE is not a constant expression", orig_whole);
2533       *non_constant_p = true;
2534     }
2535   if (DECL_MUTABLE_P (part))
2536     {
2537       if (!ctx->quiet)
2538 	error ("mutable %qD is not usable in a constant expression", part);
2539       *non_constant_p = true;
2540     }
2541   if (*non_constant_p)
2542     return t;
2543   bool pmf = TYPE_PTRMEMFUNC_P (TREE_TYPE (whole));
2544   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
2545     {
2546       /* Use name match for PMF fields, as a variant will have a
2547 	 different FIELD_DECL with a different type.  */
2548       if (pmf ? DECL_NAME (field) == DECL_NAME (part)
2549 	  : field == part)
2550 	{
2551 	  if (value)
2552 	    return value;
2553 	  else
2554 	    /* We're in the middle of initializing it.  */
2555 	    break;
2556 	}
2557     }
2558   if (TREE_CODE (TREE_TYPE (whole)) == UNION_TYPE
2559       && CONSTRUCTOR_NELTS (whole) > 0)
2560     {
2561       /* DR 1188 says we don't have to deal with this.  */
2562       if (!ctx->quiet)
2563 	error ("accessing %qD member instead of initialized %qD member in "
2564 	       "constant expression", part, CONSTRUCTOR_ELT (whole, 0)->index);
2565       *non_constant_p = true;
2566       return t;
2567     }
2568 
2569   /* We only create a CONSTRUCTOR for a subobject when we modify it, so empty
2570      classes never get represented; throw together a value now.  */
2571   if (is_really_empty_class (TREE_TYPE (t)))
2572     return build_constructor (TREE_TYPE (t), NULL);
2573 
2574   gcc_assert (DECL_CONTEXT (part) == TYPE_MAIN_VARIANT (TREE_TYPE (whole)));
2575 
2576   if (CONSTRUCTOR_NO_IMPLICIT_ZERO (whole))
2577     {
2578       /* 'whole' is part of the aggregate initializer we're currently
2579 	 building; if there's no initializer for this member yet, that's an
2580 	 error.  */
2581       if (!ctx->quiet)
2582 	error ("accessing uninitialized member %qD", part);
2583       *non_constant_p = true;
2584       return t;
2585     }
2586 
2587   /* If there's no explicit init for this field, it's value-initialized.  */
2588   value = build_value_init (TREE_TYPE (t), tf_warning_or_error);
2589   return cxx_eval_constant_expression (ctx, value,
2590 				       lval,
2591 				       non_constant_p, overflow_p);
2592 }
2593 
2594 /* Subroutine of cxx_eval_constant_expression.
2595    Attempt to reduce a field access of a value of class type that is
2596    expressed as a BIT_FIELD_REF.  */
2597 
2598 static tree
2599 cxx_eval_bit_field_ref (const constexpr_ctx *ctx, tree t,
2600 			bool lval,
2601 			bool *non_constant_p, bool *overflow_p)
2602 {
2603   tree orig_whole = TREE_OPERAND (t, 0);
2604   tree retval, fldval, utype, mask;
2605   bool fld_seen = false;
2606   HOST_WIDE_INT istart, isize;
2607   tree whole = cxx_eval_constant_expression (ctx, orig_whole,
2608 					     lval,
2609 					     non_constant_p, overflow_p);
2610   tree start, field, value;
2611   unsigned HOST_WIDE_INT i;
2612 
2613   if (whole == orig_whole)
2614     return t;
2615   /* Don't VERIFY_CONSTANT here; we only want to check that we got a
2616      CONSTRUCTOR.  */
2617   if (!*non_constant_p
2618       && TREE_CODE (whole) != VECTOR_CST
2619       && TREE_CODE (whole) != CONSTRUCTOR)
2620     {
2621       if (!ctx->quiet)
2622 	error ("%qE is not a constant expression", orig_whole);
2623       *non_constant_p = true;
2624     }
2625   if (*non_constant_p)
2626     return t;
2627 
2628   if (TREE_CODE (whole) == VECTOR_CST)
2629     return fold_ternary (BIT_FIELD_REF, TREE_TYPE (t), whole,
2630 			 TREE_OPERAND (t, 1), TREE_OPERAND (t, 2));
2631 
2632   start = TREE_OPERAND (t, 2);
2633   istart = tree_to_shwi (start);
2634   isize = tree_to_shwi (TREE_OPERAND (t, 1));
2635   utype = TREE_TYPE (t);
2636   if (!TYPE_UNSIGNED (utype))
2637     utype = build_nonstandard_integer_type (TYPE_PRECISION (utype), 1);
2638   retval = build_int_cst (utype, 0);
2639   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
2640     {
2641       tree bitpos = bit_position (field);
2642       if (bitpos == start && DECL_SIZE (field) == TREE_OPERAND (t, 1))
2643 	return value;
2644       if (TREE_CODE (TREE_TYPE (field)) == INTEGER_TYPE
2645 	  && TREE_CODE (value) == INTEGER_CST
2646 	  && tree_fits_shwi_p (bitpos)
2647 	  && tree_fits_shwi_p (DECL_SIZE (field)))
2648 	{
2649 	  HOST_WIDE_INT bit = tree_to_shwi (bitpos);
2650 	  HOST_WIDE_INT sz = tree_to_shwi (DECL_SIZE (field));
2651 	  HOST_WIDE_INT shift;
2652 	  if (bit >= istart && bit + sz <= istart + isize)
2653 	    {
2654 	      fldval = fold_convert (utype, value);
2655 	      mask = build_int_cst_type (utype, -1);
2656 	      mask = fold_build2 (LSHIFT_EXPR, utype, mask,
2657 				  size_int (TYPE_PRECISION (utype) - sz));
2658 	      mask = fold_build2 (RSHIFT_EXPR, utype, mask,
2659 				  size_int (TYPE_PRECISION (utype) - sz));
2660 	      fldval = fold_build2 (BIT_AND_EXPR, utype, fldval, mask);
2661 	      shift = bit - istart;
2662 	      if (BYTES_BIG_ENDIAN)
2663 		shift = TYPE_PRECISION (utype) - shift - sz;
2664 	      fldval = fold_build2 (LSHIFT_EXPR, utype, fldval,
2665 				    size_int (shift));
2666 	      retval = fold_build2 (BIT_IOR_EXPR, utype, retval, fldval);
2667 	      fld_seen = true;
2668 	    }
2669 	}
2670     }
2671   if (fld_seen)
2672     return fold_convert (TREE_TYPE (t), retval);
2673   gcc_unreachable ();
2674   return error_mark_node;
2675 }
2676 
2677 /* Subroutine of cxx_eval_constant_expression.
2678    Evaluate a short-circuited logical expression T in the context
2679    of a given constexpr CALL.  BAILOUT_VALUE is the value for
2680    early return.  CONTINUE_VALUE is used here purely for
2681    sanity check purposes.  */
2682 
2683 static tree
2684 cxx_eval_logical_expression (const constexpr_ctx *ctx, tree t,
2685                              tree bailout_value, tree continue_value,
2686 			     bool lval,
2687 			     bool *non_constant_p, bool *overflow_p)
2688 {
2689   tree r;
2690   tree lhs = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
2691 					   lval,
2692 					   non_constant_p, overflow_p);
2693   VERIFY_CONSTANT (lhs);
2694   if (tree_int_cst_equal (lhs, bailout_value))
2695     return lhs;
2696   gcc_assert (tree_int_cst_equal (lhs, continue_value));
2697   r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
2698 				    lval, non_constant_p,
2699 				    overflow_p);
2700   VERIFY_CONSTANT (r);
2701   return r;
2702 }
2703 
2704 /* REF is a COMPONENT_REF designating a particular field.  V is a vector of
2705    CONSTRUCTOR elements to initialize (part of) an object containing that
2706    field.  Return a pointer to the constructor_elt corresponding to the
2707    initialization of the field.  */
2708 
2709 static constructor_elt *
2710 base_field_constructor_elt (vec<constructor_elt, va_gc> *v, tree ref)
2711 {
2712   tree aggr = TREE_OPERAND (ref, 0);
2713   tree field = TREE_OPERAND (ref, 1);
2714   HOST_WIDE_INT i;
2715   constructor_elt *ce;
2716 
2717   gcc_assert (TREE_CODE (ref) == COMPONENT_REF);
2718 
2719   if (TREE_CODE (aggr) == COMPONENT_REF)
2720     {
2721       constructor_elt *base_ce
2722 	= base_field_constructor_elt (v, aggr);
2723       v = CONSTRUCTOR_ELTS (base_ce->value);
2724     }
2725 
2726   for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
2727     if (ce->index == field)
2728       return ce;
2729 
2730   gcc_unreachable ();
2731   return NULL;
2732 }
2733 
2734 /* Some of the expressions fed to the constexpr mechanism are calls to
2735    constructors, which have type void.  In that case, return the type being
2736    initialized by the constructor.  */
2737 
2738 static tree
2739 initialized_type (tree t)
2740 {
2741   if (TYPE_P (t))
2742     return t;
2743   tree type = cv_unqualified (TREE_TYPE (t));
2744   if (TREE_CODE (t) == CALL_EXPR || TREE_CODE (t) == AGGR_INIT_EXPR)
2745     {
2746       /* A constructor call has void type, so we need to look deeper.  */
2747       tree fn = get_function_named_in_call (t);
2748       if (fn && TREE_CODE (fn) == FUNCTION_DECL
2749 	  && DECL_CXX_CONSTRUCTOR_P (fn))
2750 	type = DECL_CONTEXT (fn);
2751     }
2752   return type;
2753 }
2754 
2755 /* We're about to initialize element INDEX of an array or class from VALUE.
2756    Set up NEW_CTX appropriately by adjusting .object to refer to the
2757    subobject and creating a new CONSTRUCTOR if the element is itself
2758    a class or array.  */
2759 
2760 static void
2761 init_subob_ctx (const constexpr_ctx *ctx, constexpr_ctx &new_ctx,
2762 	       tree index, tree &value)
2763 {
2764   new_ctx = *ctx;
2765 
2766   if (index && TREE_CODE (index) != INTEGER_CST
2767       && TREE_CODE (index) != FIELD_DECL)
2768     /* This won't have an element in the new CONSTRUCTOR.  */
2769     return;
2770 
2771   tree type = initialized_type (value);
2772   if (!AGGREGATE_TYPE_P (type) && !VECTOR_TYPE_P (type))
2773     /* A non-aggregate member doesn't get its own CONSTRUCTOR.  */
2774     return;
2775 
2776   /* The sub-aggregate initializer might contain a placeholder;
2777      update object to refer to the subobject and ctor to refer to
2778      the (newly created) sub-initializer.  */
2779   if (ctx->object)
2780     new_ctx.object = build_ctor_subob_ref (index, type, ctx->object);
2781   tree elt = build_constructor (type, NULL);
2782   CONSTRUCTOR_NO_IMPLICIT_ZERO (elt) = true;
2783   new_ctx.ctor = elt;
2784 
2785   if (TREE_CODE (value) == TARGET_EXPR)
2786     /* Avoid creating another CONSTRUCTOR when we expand the TARGET_EXPR.  */
2787     value = TARGET_EXPR_INITIAL (value);
2788 }
2789 
2790 /* We're about to process an initializer for a class or array TYPE.  Make
2791    sure that CTX is set up appropriately.  */
2792 
2793 static void
2794 verify_ctor_sanity (const constexpr_ctx *ctx, tree type)
2795 {
2796   /* We don't bother building a ctor for an empty base subobject.  */
2797   if (is_empty_class (type))
2798     return;
2799 
2800   /* We're in the middle of an initializer that might involve placeholders;
2801      our caller should have created a CONSTRUCTOR for us to put the
2802      initializer into.  We will either return that constructor or T.  */
2803   gcc_assert (ctx->ctor);
2804   gcc_assert (same_type_ignoring_top_level_qualifiers_p
2805 	      (type, TREE_TYPE (ctx->ctor)));
2806   /* We used to check that ctx->ctor was empty, but that isn't the case when
2807      the object is zero-initialized before calling the constructor.  */
2808   if (ctx->object)
2809     {
2810       tree otype = TREE_TYPE (ctx->object);
2811       gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, otype)
2812 		  /* Handle flexible array members.  */
2813 		  || (TREE_CODE (otype) == ARRAY_TYPE
2814 		      && TYPE_DOMAIN (otype) == NULL_TREE
2815 		      && TREE_CODE (type) == ARRAY_TYPE
2816 		      && (same_type_ignoring_top_level_qualifiers_p
2817 			  (TREE_TYPE (type), TREE_TYPE (otype)))));
2818     }
2819   gcc_assert (!ctx->object || !DECL_P (ctx->object)
2820 	      || *(ctx->values->get (ctx->object)) == ctx->ctor);
2821 }
2822 
2823 /* Subroutine of cxx_eval_constant_expression.
2824    The expression tree T denotes a C-style array or a C-style
2825    aggregate.  Reduce it to a constant expression.  */
2826 
2827 static tree
2828 cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
2829 			 bool lval,
2830 			 bool *non_constant_p, bool *overflow_p)
2831 {
2832   vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
2833   bool changed = false;
2834   gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (t));
2835   tree type = TREE_TYPE (t);
2836 
2837   constexpr_ctx new_ctx;
2838   if (TYPE_PTRMEMFUNC_P (type) || VECTOR_TYPE_P (type))
2839     {
2840       /* We don't really need the ctx->ctor business for a PMF or
2841 	 vector, but it's simpler to use the same code.  */
2842       new_ctx = *ctx;
2843       new_ctx.ctor = build_constructor (type, NULL);
2844       new_ctx.object = NULL_TREE;
2845       ctx = &new_ctx;
2846     };
2847   verify_ctor_sanity (ctx, type);
2848   vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
2849   vec_alloc (*p, vec_safe_length (v));
2850 
2851   unsigned i;
2852   tree index, value;
2853   bool constant_p = true;
2854   bool side_effects_p = false;
2855   FOR_EACH_CONSTRUCTOR_ELT (v, i, index, value)
2856     {
2857       tree orig_value = value;
2858       init_subob_ctx (ctx, new_ctx, index, value);
2859       if (new_ctx.ctor != ctx->ctor)
2860 	/* If we built a new CONSTRUCTOR, attach it now so that other
2861 	   initializers can refer to it.  */
2862 	CONSTRUCTOR_APPEND_ELT (*p, index, new_ctx.ctor);
2863       tree elt = cxx_eval_constant_expression (&new_ctx, value,
2864 					       lval,
2865 					       non_constant_p, overflow_p);
2866       /* Don't VERIFY_CONSTANT here.  */
2867       if (ctx->quiet && *non_constant_p)
2868 	break;
2869       if (elt != orig_value)
2870 	changed = true;
2871 
2872       if (!TREE_CONSTANT (elt))
2873 	constant_p = false;
2874       if (TREE_SIDE_EFFECTS (elt))
2875 	side_effects_p = true;
2876       if (index && TREE_CODE (index) == COMPONENT_REF)
2877 	{
2878 	  /* This is an initialization of a vfield inside a base
2879 	     subaggregate that we already initialized; push this
2880 	     initialization into the previous initialization.  */
2881 	  constructor_elt *inner = base_field_constructor_elt (*p, index);
2882 	  inner->value = elt;
2883 	  changed = true;
2884 	}
2885       else if (index
2886 	       && (TREE_CODE (index) == NOP_EXPR
2887 		   || TREE_CODE (index) == POINTER_PLUS_EXPR))
2888 	{
2889 	  /* This is an initializer for an empty base; now that we've
2890 	     checked that it's constant, we can ignore it.  */
2891 	  gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (index))));
2892 	  changed = true;
2893 	}
2894       else
2895 	{
2896 	  if (new_ctx.ctor != ctx->ctor)
2897 	    {
2898 	      /* We appended this element above; update the value.  */
2899 	      gcc_assert ((*p)->last().index == index);
2900 	      (*p)->last().value = elt;
2901 	    }
2902 	  else
2903 	    CONSTRUCTOR_APPEND_ELT (*p, index, elt);
2904 	  /* Adding or replacing an element might change the ctor's flags.  */
2905 	  TREE_CONSTANT (ctx->ctor) = constant_p;
2906 	  TREE_SIDE_EFFECTS (ctx->ctor) = side_effects_p;
2907 	}
2908     }
2909   if (*non_constant_p || !changed)
2910     return t;
2911   t = ctx->ctor;
2912   /* We're done building this CONSTRUCTOR, so now we can interpret an
2913      element without an explicit initializer as value-initialized.  */
2914   CONSTRUCTOR_NO_IMPLICIT_ZERO (t) = false;
2915   TREE_CONSTANT (t) = constant_p;
2916   TREE_SIDE_EFFECTS (t) = side_effects_p;
2917   if (VECTOR_TYPE_P (type))
2918     t = fold (t);
2919   return t;
2920 }
2921 
2922 /* Subroutine of cxx_eval_constant_expression.
2923    The expression tree T is a VEC_INIT_EXPR which denotes the desired
2924    initialization of a non-static data member of array type.  Reduce it to a
2925    CONSTRUCTOR.
2926 
2927    Note that apart from value-initialization (when VALUE_INIT is true),
2928    this is only intended to support value-initialization and the
2929    initializations done by defaulted constructors for classes with
2930    non-static data members of array type.  In this case, VEC_INIT_EXPR_INIT
2931    will either be NULL_TREE for the default constructor, or a COMPONENT_REF
2932    for the copy/move constructor.  */
2933 
2934 static tree
2935 cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
2936 		     bool value_init, bool lval,
2937 		     bool *non_constant_p, bool *overflow_p)
2938 {
2939   tree elttype = TREE_TYPE (atype);
2940   verify_ctor_sanity (ctx, atype);
2941   vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
2942   bool pre_init = false;
2943   unsigned HOST_WIDE_INT i;
2944 
2945   /* For the default constructor, build up a call to the default
2946      constructor of the element type.  We only need to handle class types
2947      here, as for a constructor to be constexpr, all members must be
2948      initialized, which for a defaulted default constructor means they must
2949      be of a class type with a constexpr default constructor.  */
2950   if (TREE_CODE (elttype) == ARRAY_TYPE)
2951     /* We only do this at the lowest level.  */;
2952   else if (value_init)
2953     {
2954       init = build_value_init (elttype, tf_warning_or_error);
2955       pre_init = true;
2956     }
2957   else if (!init)
2958     {
2959       vec<tree, va_gc> *argvec = make_tree_vector ();
2960       init = build_special_member_call (NULL_TREE, complete_ctor_identifier,
2961 					&argvec, elttype, LOOKUP_NORMAL,
2962 					tf_warning_or_error);
2963       release_tree_vector (argvec);
2964       init = build_aggr_init_expr (TREE_TYPE (init), init);
2965       pre_init = true;
2966     }
2967 
2968   tree nelts = get_array_or_vector_nelts (ctx, atype, non_constant_p,
2969 					  overflow_p);
2970   unsigned HOST_WIDE_INT max = tree_to_uhwi (nelts);
2971   for (i = 0; i < max; ++i)
2972     {
2973       tree idx = build_int_cst (size_type_node, i);
2974       tree eltinit;
2975       bool reuse = false;
2976       constexpr_ctx new_ctx;
2977       init_subob_ctx (ctx, new_ctx, idx, pre_init ? init : elttype);
2978       if (new_ctx.ctor != ctx->ctor)
2979 	CONSTRUCTOR_APPEND_ELT (*p, idx, new_ctx.ctor);
2980       if (TREE_CODE (elttype) == ARRAY_TYPE)
2981 	{
2982 	  /* A multidimensional array; recurse.  */
2983 	  if (value_init || init == NULL_TREE)
2984 	    {
2985 	      eltinit = NULL_TREE;
2986 	      reuse = i == 0;
2987 	    }
2988 	  else
2989 	    eltinit = cp_build_array_ref (input_location, init, idx,
2990 					  tf_warning_or_error);
2991 	  eltinit = cxx_eval_vec_init_1 (&new_ctx, elttype, eltinit, value_init,
2992 					 lval,
2993 					 non_constant_p, overflow_p);
2994 	}
2995       else if (pre_init)
2996 	{
2997 	  /* Initializing an element using value or default initialization
2998 	     we just pre-built above.  */
2999 	  if (init == void_node)
3000 	    /* Trivial default-init, don't do anything to the CONSTRUCTOR.  */
3001 	    return ctx->ctor;
3002 	  eltinit = cxx_eval_constant_expression (&new_ctx, init, lval,
3003 						  non_constant_p, overflow_p);
3004 	  reuse = i == 0;
3005 	}
3006       else
3007 	{
3008 	  /* Copying an element.  */
3009 	  gcc_assert (same_type_ignoring_top_level_qualifiers_p
3010 		      (atype, TREE_TYPE (init)));
3011 	  eltinit = cp_build_array_ref (input_location, init, idx,
3012 					tf_warning_or_error);
3013 	  if (!lvalue_p (init))
3014 	    eltinit = move (eltinit);
3015 	  eltinit = force_rvalue (eltinit, tf_warning_or_error);
3016 	  eltinit = cxx_eval_constant_expression (&new_ctx, eltinit, lval,
3017 						  non_constant_p, overflow_p);
3018 	}
3019       if (*non_constant_p && !ctx->quiet)
3020 	break;
3021       if (new_ctx.ctor != ctx->ctor)
3022 	{
3023 	  /* We appended this element above; update the value.  */
3024 	  gcc_assert ((*p)->last().index == idx);
3025 	  (*p)->last().value = eltinit;
3026 	}
3027       else
3028 	CONSTRUCTOR_APPEND_ELT (*p, idx, eltinit);
3029       /* Reuse the result of cxx_eval_constant_expression call
3030 	 from the first iteration to all others if it is a constant
3031 	 initializer that doesn't require relocations.  */
3032       if (reuse
3033 	  && max > 1
3034 	  && (eltinit == NULL_TREE
3035 	      || (initializer_constant_valid_p (eltinit, TREE_TYPE (eltinit))
3036 		  == null_pointer_node)))
3037 	{
3038 	  if (new_ctx.ctor != ctx->ctor)
3039 	    eltinit = new_ctx.ctor;
3040 	  tree range = build2 (RANGE_EXPR, size_type_node,
3041 			       build_int_cst (size_type_node, 1),
3042 			       build_int_cst (size_type_node, max - 1));
3043 	  CONSTRUCTOR_APPEND_ELT (*p, range, unshare_constructor (eltinit));
3044 	  break;
3045 	}
3046       else if (i == 0)
3047 	vec_safe_reserve (*p, max);
3048     }
3049 
3050   if (!*non_constant_p)
3051     {
3052       init = ctx->ctor;
3053       CONSTRUCTOR_NO_IMPLICIT_ZERO (init) = false;
3054     }
3055   return init;
3056 }
3057 
3058 static tree
3059 cxx_eval_vec_init (const constexpr_ctx *ctx, tree t,
3060 		   bool lval,
3061 		   bool *non_constant_p, bool *overflow_p)
3062 {
3063   tree atype = TREE_TYPE (t);
3064   tree init = VEC_INIT_EXPR_INIT (t);
3065   tree r = cxx_eval_vec_init_1 (ctx, atype, init,
3066 				VEC_INIT_EXPR_VALUE_INIT (t),
3067 				lval, non_constant_p, overflow_p);
3068   if (*non_constant_p)
3069     return t;
3070   else
3071     return r;
3072 }
3073 
3074 /* A less strict version of fold_indirect_ref_1, which requires cv-quals to
3075    match.  We want to be less strict for simple *& folding; if we have a
3076    non-const temporary that we access through a const pointer, that should
3077    work.  We handle this here rather than change fold_indirect_ref_1
3078    because we're dealing with things like ADDR_EXPR of INTEGER_CST which
3079    don't really make sense outside of constant expression evaluation.  Also
3080    we want to allow folding to COMPONENT_REF, which could cause trouble
3081    with TBAA in fold_indirect_ref_1.
3082 
3083    Try to keep this function synced with fold_indirect_ref_1.  */
3084 
3085 static tree
3086 cxx_fold_indirect_ref (location_t loc, tree type, tree op0, bool *empty_base)
3087 {
3088   tree sub = op0;
3089   tree subtype;
3090   poly_uint64 const_op01;
3091 
3092   STRIP_NOPS (sub);
3093   subtype = TREE_TYPE (sub);
3094   if (!POINTER_TYPE_P (subtype))
3095     return NULL_TREE;
3096 
3097   if (TREE_CODE (sub) == ADDR_EXPR)
3098     {
3099       tree op = TREE_OPERAND (sub, 0);
3100       tree optype = TREE_TYPE (op);
3101 
3102       /* *&CONST_DECL -> to the value of the const decl.  */
3103       if (TREE_CODE (op) == CONST_DECL)
3104 	return DECL_INITIAL (op);
3105       /* *&p => p;  make sure to handle *&"str"[cst] here.  */
3106       if (same_type_ignoring_top_level_qualifiers_p (optype, type)
3107 	  /* Also handle the case where the desired type is an array of unknown
3108 	     bounds because the variable has had its bounds deduced since the
3109 	     ADDR_EXPR was created.  */
3110 	  || (TREE_CODE (type) == ARRAY_TYPE
3111 	      && TREE_CODE (optype) == ARRAY_TYPE
3112 	      && TYPE_DOMAIN (type) == NULL_TREE
3113 	      && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (optype),
3114 							    TREE_TYPE (type))))
3115 	{
3116 	  tree fop = fold_read_from_constant_string (op);
3117 	  if (fop)
3118 	    return fop;
3119 	  else
3120 	    return op;
3121 	}
3122       /* *(foo *)&fooarray => fooarray[0] */
3123       else if (TREE_CODE (optype) == ARRAY_TYPE
3124 	       && (same_type_ignoring_top_level_qualifiers_p
3125 		   (type, TREE_TYPE (optype))))
3126 	{
3127 	  tree type_domain = TYPE_DOMAIN (optype);
3128 	  tree min_val = size_zero_node;
3129 	  if (type_domain && TYPE_MIN_VALUE (type_domain))
3130 	    min_val = TYPE_MIN_VALUE (type_domain);
3131 	  return build4_loc (loc, ARRAY_REF, type, op, min_val,
3132 			     NULL_TREE, NULL_TREE);
3133 	}
3134       /* *(foo *)&complexfoo => __real__ complexfoo */
3135       else if (TREE_CODE (optype) == COMPLEX_TYPE
3136 	       && (same_type_ignoring_top_level_qualifiers_p
3137 		   (type, TREE_TYPE (optype))))
3138 	return fold_build1_loc (loc, REALPART_EXPR, type, op);
3139       /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
3140       else if (VECTOR_TYPE_P (optype)
3141 	       && (same_type_ignoring_top_level_qualifiers_p
3142 		   (type, TREE_TYPE (optype))))
3143 	{
3144 	  tree part_width = TYPE_SIZE (type);
3145 	  tree index = bitsize_int (0);
3146 	  return fold_build3_loc (loc, BIT_FIELD_REF, type, op, part_width,
3147 				  index);
3148 	}
3149       /* Also handle conversion to an empty base class, which
3150 	 is represented with a NOP_EXPR.  */
3151       else if (is_empty_class (type)
3152 	       && CLASS_TYPE_P (optype)
3153 	       && DERIVED_FROM_P (type, optype))
3154 	{
3155 	  *empty_base = true;
3156 	  return op;
3157 	}
3158       /* *(foo *)&struct_with_foo_field => COMPONENT_REF */
3159       else if (RECORD_OR_UNION_TYPE_P (optype))
3160 	{
3161 	  tree field = TYPE_FIELDS (optype);
3162 	  for (; field; field = DECL_CHAIN (field))
3163 	    if (TREE_CODE (field) == FIELD_DECL
3164 		&& TREE_TYPE (field) != error_mark_node
3165 		&& integer_zerop (byte_position (field))
3166 		&& (same_type_ignoring_top_level_qualifiers_p
3167 		    (TREE_TYPE (field), type)))
3168 	      return fold_build3 (COMPONENT_REF, type, op, field, NULL_TREE);
3169 	}
3170     }
3171   else if (TREE_CODE (sub) == POINTER_PLUS_EXPR
3172 	   && poly_int_tree_p (TREE_OPERAND (sub, 1), &const_op01))
3173     {
3174       tree op00 = TREE_OPERAND (sub, 0);
3175       tree op01 = TREE_OPERAND (sub, 1);
3176 
3177       STRIP_NOPS (op00);
3178       if (TREE_CODE (op00) == ADDR_EXPR)
3179 	{
3180 	  tree op00type;
3181 	  op00 = TREE_OPERAND (op00, 0);
3182 	  op00type = TREE_TYPE (op00);
3183 
3184 	  /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
3185 	  if (VECTOR_TYPE_P (op00type)
3186 	      && same_type_ignoring_top_level_qualifiers_p
3187 						(type, TREE_TYPE (op00type))
3188 	      /* POINTER_PLUS_EXPR second operand is sizetype, unsigned,
3189 		 but we want to treat offsets with MSB set as negative.
3190 		 For the code below negative offsets are invalid and
3191 		 TYPE_SIZE of the element is something unsigned, so
3192 		 check whether op01 fits into poly_int64, which implies
3193 		 it is from 0 to INTTYPE_MAXIMUM (HOST_WIDE_INT), and
3194 		 then just use poly_uint64 because we want to treat the
3195 		 value as unsigned.  */
3196 	      && tree_fits_poly_int64_p (op01))
3197 	    {
3198 	      tree part_width = TYPE_SIZE (type);
3199 	      poly_uint64 max_offset
3200 		= (tree_to_uhwi (part_width) / BITS_PER_UNIT
3201 		   * TYPE_VECTOR_SUBPARTS (op00type));
3202 	      if (known_lt (const_op01, max_offset))
3203 		{
3204 		  tree index = bitsize_int (const_op01 * BITS_PER_UNIT);
3205 		  return fold_build3_loc (loc,
3206 					  BIT_FIELD_REF, type, op00,
3207 					  part_width, index);
3208 		}
3209 	    }
3210 	  /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
3211 	  else if (TREE_CODE (op00type) == COMPLEX_TYPE
3212 		   && (same_type_ignoring_top_level_qualifiers_p
3213 		       (type, TREE_TYPE (op00type))))
3214 	    {
3215 	      if (known_eq (wi::to_poly_offset (TYPE_SIZE_UNIT (type)),
3216 			    const_op01))
3217 		return fold_build1_loc (loc, IMAGPART_EXPR, type, op00);
3218 	    }
3219 	  /* ((foo *)&fooarray)[1] => fooarray[1] */
3220 	  else if (TREE_CODE (op00type) == ARRAY_TYPE
3221 		   && (same_type_ignoring_top_level_qualifiers_p
3222 		       (type, TREE_TYPE (op00type))))
3223 	    {
3224 	      tree type_domain = TYPE_DOMAIN (op00type);
3225 	      tree min_val = size_zero_node;
3226 	      if (type_domain && TYPE_MIN_VALUE (type_domain))
3227 		min_val = TYPE_MIN_VALUE (type_domain);
3228 	      offset_int off = wi::to_offset (op01);
3229 	      offset_int el_sz = wi::to_offset (TYPE_SIZE_UNIT (type));
3230 	      offset_int remainder;
3231 	      off = wi::divmod_trunc (off, el_sz, SIGNED, &remainder);
3232 	      if (remainder == 0 && TREE_CODE (min_val) == INTEGER_CST)
3233 		{
3234 		  off = off + wi::to_offset (min_val);
3235 		  op01 = wide_int_to_tree (sizetype, off);
3236 		  return build4_loc (loc, ARRAY_REF, type, op00, op01,
3237 				     NULL_TREE, NULL_TREE);
3238 		}
3239 	    }
3240 	  /* Also handle conversion to an empty base class, which
3241 	     is represented with a NOP_EXPR.  */
3242 	  else if (is_empty_class (type)
3243 		   && CLASS_TYPE_P (op00type)
3244 		   && DERIVED_FROM_P (type, op00type))
3245 	    {
3246 	      *empty_base = true;
3247 	      return op00;
3248 	    }
3249 	  /* ((foo *)&struct_with_foo_field)[1] => COMPONENT_REF */
3250 	  else if (RECORD_OR_UNION_TYPE_P (op00type))
3251 	    {
3252 	      tree field = TYPE_FIELDS (op00type);
3253 	      for (; field; field = DECL_CHAIN (field))
3254 		if (TREE_CODE (field) == FIELD_DECL
3255 		    && TREE_TYPE (field) != error_mark_node
3256 		    && tree_int_cst_equal (byte_position (field), op01)
3257 		    && (same_type_ignoring_top_level_qualifiers_p
3258 			(TREE_TYPE (field), type)))
3259 		  return fold_build3 (COMPONENT_REF, type, op00,
3260 				      field, NULL_TREE);
3261 	    }
3262 	}
3263     }
3264   /* *(foo *)fooarrptr => (*fooarrptr)[0] */
3265   else if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
3266 	   && (same_type_ignoring_top_level_qualifiers_p
3267 	       (type, TREE_TYPE (TREE_TYPE (subtype)))))
3268     {
3269       tree type_domain;
3270       tree min_val = size_zero_node;
3271       tree newsub
3272 	= cxx_fold_indirect_ref (loc, TREE_TYPE (subtype), sub, NULL);
3273       if (newsub)
3274 	sub = newsub;
3275       else
3276 	sub = build1_loc (loc, INDIRECT_REF, TREE_TYPE (subtype), sub);
3277       type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
3278       if (type_domain && TYPE_MIN_VALUE (type_domain))
3279 	min_val = TYPE_MIN_VALUE (type_domain);
3280       return build4_loc (loc, ARRAY_REF, type, sub, min_val, NULL_TREE,
3281 			 NULL_TREE);
3282     }
3283 
3284   return NULL_TREE;
3285 }
3286 
3287 static tree
3288 cxx_eval_indirect_ref (const constexpr_ctx *ctx, tree t,
3289 		       bool lval,
3290 		       bool *non_constant_p, bool *overflow_p)
3291 {
3292   tree orig_op0 = TREE_OPERAND (t, 0);
3293   bool empty_base = false;
3294 
3295   /* We can handle a MEM_REF like an INDIRECT_REF, if MEM_REF's second
3296      operand is an integer-zero.  Otherwise reject the MEM_REF for now.  */
3297 
3298   if (TREE_CODE (t) == MEM_REF
3299       && (!TREE_OPERAND (t, 1) || !integer_zerop (TREE_OPERAND (t, 1))))
3300     {
3301       gcc_assert (ctx->quiet);
3302       *non_constant_p = true;
3303       return t;
3304     }
3305 
3306   /* First try to simplify it directly.  */
3307   tree r = cxx_fold_indirect_ref (EXPR_LOCATION (t), TREE_TYPE (t), orig_op0,
3308 				  &empty_base);
3309   if (!r)
3310     {
3311       /* If that didn't work, evaluate the operand first.  */
3312       tree op0 = cxx_eval_constant_expression (ctx, orig_op0,
3313 					       /*lval*/false, non_constant_p,
3314 					       overflow_p);
3315       /* Don't VERIFY_CONSTANT here.  */
3316       if (*non_constant_p)
3317 	return t;
3318 
3319       if (!lval && integer_zerop (op0))
3320 	{
3321 	  if (!ctx->quiet)
3322 	    error ("dereferencing a null pointer");
3323 	  *non_constant_p = true;
3324 	  return t;
3325 	}
3326 
3327       r = cxx_fold_indirect_ref (EXPR_LOCATION (t), TREE_TYPE (t), op0,
3328 				 &empty_base);
3329       if (r == NULL_TREE)
3330 	{
3331 	  /* We couldn't fold to a constant value.  Make sure it's not
3332 	     something we should have been able to fold.  */
3333 	  tree sub = op0;
3334 	  STRIP_NOPS (sub);
3335 	  if (TREE_CODE (sub) == ADDR_EXPR)
3336 	    {
3337 	      gcc_assert (!same_type_ignoring_top_level_qualifiers_p
3338 			  (TREE_TYPE (TREE_TYPE (sub)), TREE_TYPE (t)));
3339 	      /* DR 1188 says we don't have to deal with this.  */
3340 	      if (!ctx->quiet)
3341 		error ("accessing value of %qE through a %qT glvalue in a "
3342 		       "constant expression", build_fold_indirect_ref (sub),
3343 		       TREE_TYPE (t));
3344 	      *non_constant_p = true;
3345 	      return t;
3346 	    }
3347 
3348 	  if (lval && op0 != orig_op0)
3349 	    return build1 (INDIRECT_REF, TREE_TYPE (t), op0);
3350 	  if (!lval)
3351 	    VERIFY_CONSTANT (t);
3352 	  return t;
3353 	}
3354     }
3355 
3356   r = cxx_eval_constant_expression (ctx, r,
3357 				    lval, non_constant_p, overflow_p);
3358   if (*non_constant_p)
3359     return t;
3360 
3361   /* If we're pulling out the value of an empty base, just return an empty
3362      CONSTRUCTOR.  */
3363   if (empty_base && !lval)
3364     {
3365       r = build_constructor (TREE_TYPE (t), NULL);
3366       TREE_CONSTANT (r) = true;
3367     }
3368 
3369   return r;
3370 }
3371 
3372 /* Complain about R, a VAR_DECL, not being usable in a constant expression.
3373    Shared between potential_constant_expression and
3374    cxx_eval_constant_expression.  */
3375 
3376 static void
3377 non_const_var_error (tree r)
3378 {
3379   tree type = TREE_TYPE (r);
3380   error ("the value of %qD is not usable in a constant "
3381 	 "expression", r);
3382   /* Avoid error cascade.  */
3383   if (DECL_INITIAL (r) == error_mark_node)
3384     return;
3385   if (DECL_DECLARED_CONSTEXPR_P (r))
3386     inform (DECL_SOURCE_LOCATION (r),
3387 	    "%qD used in its own initializer", r);
3388   else if (INTEGRAL_OR_ENUMERATION_TYPE_P (type))
3389     {
3390       if (!CP_TYPE_CONST_P (type))
3391 	inform (DECL_SOURCE_LOCATION (r),
3392 		"%q#D is not const", r);
3393       else if (CP_TYPE_VOLATILE_P (type))
3394 	inform (DECL_SOURCE_LOCATION (r),
3395 		"%q#D is volatile", r);
3396       else if (!DECL_INITIAL (r)
3397 	       || !TREE_CONSTANT (DECL_INITIAL (r))
3398 	       || !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (r))
3399 	inform (DECL_SOURCE_LOCATION (r),
3400 		"%qD was not initialized with a constant "
3401 		"expression", r);
3402       else
3403 	gcc_unreachable ();
3404     }
3405   else if (TREE_CODE (type) == REFERENCE_TYPE)
3406     inform (DECL_SOURCE_LOCATION (r),
3407 	    "%qD was not initialized with a constant "
3408 	    "expression", r);
3409   else
3410     {
3411       if (cxx_dialect >= cxx11 && !DECL_DECLARED_CONSTEXPR_P (r))
3412 	inform (DECL_SOURCE_LOCATION (r),
3413 		"%qD was not declared %<constexpr%>", r);
3414       else
3415 	inform (DECL_SOURCE_LOCATION (r),
3416 		"%qD does not have integral or enumeration type",
3417 		r);
3418     }
3419 }
3420 
3421 /* Subroutine of cxx_eval_constant_expression.
3422    Like cxx_eval_unary_expression, except for trinary expressions.  */
3423 
3424 static tree
3425 cxx_eval_trinary_expression (const constexpr_ctx *ctx, tree t,
3426 			     bool lval,
3427 			     bool *non_constant_p, bool *overflow_p)
3428 {
3429   int i;
3430   tree args[3];
3431   tree val;
3432 
3433   for (i = 0; i < 3; i++)
3434     {
3435       args[i] = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, i),
3436 					      lval,
3437 					      non_constant_p, overflow_p);
3438       VERIFY_CONSTANT (args[i]);
3439     }
3440 
3441   val = fold_ternary_loc (EXPR_LOCATION (t), TREE_CODE (t), TREE_TYPE (t),
3442 			  args[0], args[1], args[2]);
3443   if (val == NULL_TREE)
3444     return t;
3445   VERIFY_CONSTANT (val);
3446   return val;
3447 }
3448 
3449 /* True if T was declared in a function declared to be constexpr, and
3450    therefore potentially constant in C++14.  */
3451 
3452 bool
3453 var_in_constexpr_fn (tree t)
3454 {
3455   tree ctx = DECL_CONTEXT (t);
3456   return (ctx && TREE_CODE (ctx) == FUNCTION_DECL
3457 	  && DECL_DECLARED_CONSTEXPR_P (ctx));
3458 }
3459 
3460 /* True if T was declared in a function that might be constexpr: either a
3461    function that was declared constexpr, or a C++17 lambda op().  */
3462 
3463 bool
3464 var_in_maybe_constexpr_fn (tree t)
3465 {
3466   if (cxx_dialect >= cxx17
3467       && DECL_FUNCTION_SCOPE_P (t)
3468       && LAMBDA_FUNCTION_P (DECL_CONTEXT (t)))
3469     return true;
3470   return var_in_constexpr_fn (t);
3471 }
3472 
3473 /* We're assigning INIT to TARGET.  In do_build_copy_constructor and
3474    build_over_call we implement trivial copy of a class with tail padding using
3475    assignment of character arrays, which is valid in normal code, but not in
3476    constexpr evaluation.  We don't need to worry about clobbering tail padding
3477    in constexpr evaluation, so strip the type punning.  */
3478 
3479 static void
3480 maybe_simplify_trivial_copy (tree &target, tree &init)
3481 {
3482   if (TREE_CODE (target) == MEM_REF
3483       && TREE_CODE (init) == MEM_REF
3484       && TREE_TYPE (target) == TREE_TYPE (init)
3485       && TREE_CODE (TREE_TYPE (target)) == ARRAY_TYPE
3486       && TREE_TYPE (TREE_TYPE (target)) == unsigned_char_type_node)
3487     {
3488       target = build_fold_indirect_ref (TREE_OPERAND (target, 0));
3489       init = build_fold_indirect_ref (TREE_OPERAND (init, 0));
3490     }
3491 }
3492 
3493 /* Evaluate an INIT_EXPR or MODIFY_EXPR.  */
3494 
3495 static tree
3496 cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
3497 			   bool lval,
3498 			   bool *non_constant_p, bool *overflow_p)
3499 {
3500   constexpr_ctx new_ctx = *ctx;
3501 
3502   tree init = TREE_OPERAND (t, 1);
3503   if (TREE_CLOBBER_P (init))
3504     /* Just ignore clobbers.  */
3505     return void_node;
3506 
3507   /* First we figure out where we're storing to.  */
3508   tree target = TREE_OPERAND (t, 0);
3509 
3510   maybe_simplify_trivial_copy (target, init);
3511 
3512   tree type = TREE_TYPE (target);
3513   target = cxx_eval_constant_expression (ctx, target,
3514 					 true,
3515 					 non_constant_p, overflow_p);
3516   if (*non_constant_p)
3517     return t;
3518 
3519   /* cxx_eval_array_reference for lval = true allows references one past
3520      end of array, because it does not know if it is just taking address
3521      (which is valid), or actual dereference.  Here we know it is
3522      a dereference, so diagnose it here.  */
3523   for (tree probe = target; probe; )
3524     {
3525       switch (TREE_CODE (probe))
3526 	{
3527 	case ARRAY_REF:
3528 	  tree nelts, ary;
3529 	  ary = TREE_OPERAND (probe, 0);
3530 	  nelts = get_array_or_vector_nelts (ctx, TREE_TYPE (ary),
3531 					     non_constant_p, overflow_p);
3532 	  VERIFY_CONSTANT (nelts);
3533 	  gcc_assert (TREE_CODE (nelts) == INTEGER_CST
3534 		      && TREE_CODE (TREE_OPERAND (probe, 1)) == INTEGER_CST);
3535 	  if (wi::to_widest (TREE_OPERAND (probe, 1)) == wi::to_widest (nelts))
3536 	    {
3537 	      diag_array_subscript (ctx, ary, TREE_OPERAND (probe, 1));
3538 	      *non_constant_p = true;
3539 	      return t;
3540 	    }
3541 	  /* FALLTHRU */
3542 
3543 	case BIT_FIELD_REF:
3544 	case COMPONENT_REF:
3545 	  probe = TREE_OPERAND (probe, 0);
3546 	  continue;
3547 
3548 	default:
3549 	  probe = NULL_TREE;
3550 	  continue;
3551 	}
3552     }
3553 
3554   if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (target), type))
3555     {
3556       /* For initialization of an empty base, the original target will be
3557          *(base*)this, which the above evaluation resolves to the object
3558 	 argument, which has the derived type rather than the base type.  In
3559 	 this situation, just evaluate the initializer and return, since
3560 	 there's no actual data to store.  */
3561       gcc_assert (is_empty_class (type));
3562       return cxx_eval_constant_expression (ctx, init, false,
3563 					   non_constant_p, overflow_p);
3564     }
3565 
3566   /* And then find the underlying variable.  */
3567   vec<tree,va_gc> *refs = make_tree_vector();
3568   tree object = NULL_TREE;
3569   for (tree probe = target; object == NULL_TREE; )
3570     {
3571       switch (TREE_CODE (probe))
3572 	{
3573 	case BIT_FIELD_REF:
3574 	case COMPONENT_REF:
3575 	case ARRAY_REF:
3576 	  vec_safe_push (refs, TREE_OPERAND (probe, 1));
3577 	  vec_safe_push (refs, TREE_TYPE (probe));
3578 	  probe = TREE_OPERAND (probe, 0);
3579 	  break;
3580 
3581 	default:
3582 	  object = probe;
3583 	}
3584     }
3585 
3586   /* And then find/build up our initializer for the path to the subobject
3587      we're initializing.  */
3588   tree *valp;
3589   if (object == ctx->object && VAR_P (object)
3590       && DECL_NAME (object) && ctx->call == NULL)
3591     /* The variable we're building up an aggregate initializer for is outside
3592        the constant-expression, so don't evaluate the store.  We check
3593        DECL_NAME to handle TARGET_EXPR temporaries, which are fair game.  */
3594     valp = NULL;
3595   else if (DECL_P (object))
3596     valp = ctx->values->get (object);
3597   else
3598     valp = NULL;
3599   if (!valp)
3600     {
3601       /* A constant-expression cannot modify objects from outside the
3602 	 constant-expression.  */
3603       if (!ctx->quiet)
3604 	error ("modification of %qE is not a constant expression", object);
3605       *non_constant_p = true;
3606       return t;
3607     }
3608   type = TREE_TYPE (object);
3609   bool no_zero_init = true;
3610 
3611   vec<tree,va_gc> *ctors = make_tree_vector ();
3612   while (!refs->is_empty())
3613     {
3614       if (*valp == NULL_TREE)
3615 	{
3616 	  *valp = build_constructor (type, NULL);
3617 	  CONSTRUCTOR_NO_IMPLICIT_ZERO (*valp) = no_zero_init;
3618 	}
3619       else if (TREE_CODE (*valp) == STRING_CST)
3620 	{
3621 	  /* An array was initialized with a string constant, and now
3622 	     we're writing into one of its elements.  Explode the
3623 	     single initialization into a set of element
3624 	     initializations.  */
3625 	  gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
3626 
3627 	  tree string = *valp;
3628 	  tree elt_type = TREE_TYPE (type);
3629 	  unsigned chars_per_elt = (TYPE_PRECISION (elt_type)
3630 				    / TYPE_PRECISION (char_type_node));
3631 	  unsigned num_elts = TREE_STRING_LENGTH (string) / chars_per_elt;
3632 	  tree ary_ctor = build_constructor (type, NULL);
3633 
3634 	  vec_safe_reserve (CONSTRUCTOR_ELTS (ary_ctor), num_elts);
3635 	  for (unsigned ix = 0; ix != num_elts; ix++)
3636 	    {
3637 	      constructor_elt elt =
3638 		{
3639 		  build_int_cst (size_type_node, ix),
3640 		  extract_string_elt (string, chars_per_elt, ix)
3641 		};
3642 	      CONSTRUCTOR_ELTS (ary_ctor)->quick_push (elt);
3643 	    }
3644 
3645 	  *valp = ary_ctor;
3646 	}
3647 
3648       /* If the value of object is already zero-initialized, any new ctors for
3649 	 subobjects will also be zero-initialized.  */
3650       no_zero_init = CONSTRUCTOR_NO_IMPLICIT_ZERO (*valp);
3651 
3652       vec_safe_push (ctors, *valp);
3653 
3654       enum tree_code code = TREE_CODE (type);
3655       type = refs->pop();
3656       tree index = refs->pop();
3657 
3658       constructor_elt *cep = NULL;
3659       if (code == ARRAY_TYPE)
3660 	{
3661 	  HOST_WIDE_INT i
3662 	    = find_array_ctor_elt (*valp, index, /*insert*/true);
3663 	  gcc_assert (i >= 0);
3664 	  cep = CONSTRUCTOR_ELT (*valp, i);
3665 	  gcc_assert (TREE_CODE (cep->index) != RANGE_EXPR);
3666 	}
3667       else
3668 	{
3669 	  gcc_assert (TREE_CODE (index) == FIELD_DECL);
3670 
3671 	  /* We must keep the CONSTRUCTOR's ELTS in FIELD order.
3672 	     Usually we meet initializers in that order, but it is
3673 	     possible for base types to be placed not in program
3674 	     order.  */
3675 	  tree fields = TYPE_FIELDS (DECL_CONTEXT (index));
3676 	  unsigned HOST_WIDE_INT idx;
3677 
3678 	  if (code == UNION_TYPE && CONSTRUCTOR_NELTS (*valp)
3679 	      && CONSTRUCTOR_ELT (*valp, 0)->index != index)
3680 	    /* Changing active member.  */
3681 	    vec_safe_truncate (CONSTRUCTOR_ELTS (*valp), 0);
3682 
3683 	  for (idx = 0;
3684 	       vec_safe_iterate (CONSTRUCTOR_ELTS (*valp), idx, &cep);
3685 	       idx++, fields = DECL_CHAIN (fields))
3686 	    {
3687 	      if (index == cep->index)
3688 		goto found;
3689 
3690 	      /* The field we're initializing must be on the field
3691 		 list.  Look to see if it is present before the
3692 		 field the current ELT initializes.  */
3693 	      for (; fields != cep->index; fields = DECL_CHAIN (fields))
3694 		if (index == fields)
3695 		  goto insert;
3696 	    }
3697 
3698 	  /* We fell off the end of the CONSTRUCTOR, so insert a new
3699 	     entry at the end.  */
3700 	insert:
3701 	  {
3702 	    constructor_elt ce = { index, NULL_TREE };
3703 
3704 	    vec_safe_insert (CONSTRUCTOR_ELTS (*valp), idx, ce);
3705 	    cep = CONSTRUCTOR_ELT (*valp, idx);
3706 	  }
3707 	found:;
3708 	}
3709       valp = &cep->value;
3710     }
3711   release_tree_vector (refs);
3712 
3713   if (AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type))
3714     {
3715       /* Create a new CONSTRUCTOR in case evaluation of the initializer
3716 	 wants to modify it.  */
3717       if (*valp == NULL_TREE)
3718 	{
3719 	  *valp = build_constructor (type, NULL);
3720 	  CONSTRUCTOR_NO_IMPLICIT_ZERO (*valp) = no_zero_init;
3721 	}
3722       else if (TREE_CODE (*valp) == PTRMEM_CST)
3723 	*valp = cplus_expand_constant (*valp);
3724       new_ctx.ctor = *valp;
3725       new_ctx.object = target;
3726     }
3727 
3728   init = cxx_eval_constant_expression (&new_ctx, init, false,
3729 				       non_constant_p, overflow_p);
3730   /* Don't share a CONSTRUCTOR that might be changed later.  */
3731   init = unshare_constructor (init);
3732   if (target == object)
3733     /* The hash table might have moved since the get earlier.  */
3734     valp = ctx->values->get (object);
3735 
3736   if (TREE_CODE (init) == CONSTRUCTOR)
3737     {
3738       /* An outer ctx->ctor might be pointing to *valp, so replace
3739 	 its contents.  */
3740       CONSTRUCTOR_ELTS (*valp) = CONSTRUCTOR_ELTS (init);
3741       TREE_CONSTANT (*valp) = TREE_CONSTANT (init);
3742       TREE_SIDE_EFFECTS (*valp) = TREE_SIDE_EFFECTS (init);
3743       CONSTRUCTOR_NO_IMPLICIT_ZERO (*valp)
3744 	= CONSTRUCTOR_NO_IMPLICIT_ZERO (init);
3745     }
3746   else
3747     *valp = init;
3748 
3749   /* Update TREE_CONSTANT and TREE_SIDE_EFFECTS on enclosing
3750      CONSTRUCTORs, if any.  */
3751   tree elt;
3752   unsigned i;
3753   bool c = TREE_CONSTANT (init);
3754   bool s = TREE_SIDE_EFFECTS (init);
3755   if (!c || s)
3756     FOR_EACH_VEC_SAFE_ELT (ctors, i, elt)
3757       {
3758 	if (!c)
3759 	  TREE_CONSTANT (elt) = false;
3760 	if (s)
3761 	  TREE_SIDE_EFFECTS (elt) = true;
3762       }
3763   release_tree_vector (ctors);
3764 
3765   if (*non_constant_p)
3766     return t;
3767   else if (lval)
3768     return target;
3769   else
3770     return init;
3771 }
3772 
3773 /* Evaluate a ++ or -- expression.  */
3774 
3775 static tree
3776 cxx_eval_increment_expression (const constexpr_ctx *ctx, tree t,
3777 			      bool lval,
3778 			      bool *non_constant_p, bool *overflow_p)
3779 {
3780   enum tree_code code = TREE_CODE (t);
3781   tree type = TREE_TYPE (t);
3782   tree op = TREE_OPERAND (t, 0);
3783   tree offset = TREE_OPERAND (t, 1);
3784   gcc_assert (TREE_CONSTANT (offset));
3785 
3786   /* The operand as an lvalue.  */
3787   op = cxx_eval_constant_expression (ctx, op, true,
3788 				     non_constant_p, overflow_p);
3789 
3790   /* The operand as an rvalue.  */
3791   tree val
3792     = cxx_eval_constant_expression (ctx, op, false,
3793 				    non_constant_p, overflow_p);
3794   /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
3795      a local array in a constexpr function.  */
3796   bool ptr = POINTER_TYPE_P (TREE_TYPE (val));
3797   if (!ptr)
3798     VERIFY_CONSTANT (val);
3799 
3800   /* The modified value.  */
3801   bool inc = (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR);
3802   tree mod;
3803   if (POINTER_TYPE_P (type))
3804     {
3805       /* The middle end requires pointers to use POINTER_PLUS_EXPR.  */
3806       offset = convert_to_ptrofftype (offset);
3807       if (!inc)
3808 	offset = fold_build1 (NEGATE_EXPR, TREE_TYPE (offset), offset);
3809       mod = fold_build2 (POINTER_PLUS_EXPR, type, val, offset);
3810     }
3811   else
3812     mod = fold_build2 (inc ? PLUS_EXPR : MINUS_EXPR, type, val, offset);
3813   if (!ptr)
3814     VERIFY_CONSTANT (mod);
3815 
3816   /* Storing the modified value.  */
3817   tree store = build2 (MODIFY_EXPR, type, op, mod);
3818   cxx_eval_constant_expression (ctx, store,
3819 				true, non_constant_p, overflow_p);
3820 
3821   /* And the value of the expression.  */
3822   if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
3823     {
3824       /* Prefix ops are lvalues.  */
3825       if (lval)
3826 	return op;
3827       else
3828 	/* But we optimize when the caller wants an rvalue.  */
3829 	return mod;
3830     }
3831   else
3832     /* Postfix ops are rvalues.  */
3833     return val;
3834 }
3835 
3836 /* Predicates for the meaning of *jump_target.  */
3837 
3838 static bool
3839 returns (tree *jump_target)
3840 {
3841   return *jump_target
3842     && (TREE_CODE (*jump_target) == RETURN_EXPR
3843 	|| (TREE_CODE (*jump_target) == LABEL_DECL
3844 	    && LABEL_DECL_CDTOR (*jump_target)));
3845 }
3846 
3847 static bool
3848 breaks (tree *jump_target)
3849 {
3850   return *jump_target
3851     && ((TREE_CODE (*jump_target) == LABEL_DECL
3852 	 && LABEL_DECL_BREAK (*jump_target))
3853 	|| TREE_CODE (*jump_target) == EXIT_EXPR);
3854 }
3855 
3856 static bool
3857 continues (tree *jump_target)
3858 {
3859   return *jump_target
3860     && TREE_CODE (*jump_target) == LABEL_DECL
3861     && LABEL_DECL_CONTINUE (*jump_target);
3862 }
3863 
3864 static bool
3865 switches (tree *jump_target)
3866 {
3867   return *jump_target
3868     && TREE_CODE (*jump_target) == INTEGER_CST;
3869 }
3870 
3871 /* Subroutine of cxx_eval_statement_list.  Determine whether the statement
3872    STMT matches *jump_target.  If we're looking for a case label and we see
3873    the default label, note it in ctx->css_state.  */
3874 
3875 static bool
3876 label_matches (const constexpr_ctx *ctx, tree *jump_target, tree stmt)
3877 {
3878   switch (TREE_CODE (*jump_target))
3879     {
3880     case LABEL_DECL:
3881       if (TREE_CODE (stmt) == LABEL_EXPR
3882 	  && LABEL_EXPR_LABEL (stmt) == *jump_target)
3883 	return true;
3884       break;
3885 
3886     case INTEGER_CST:
3887       if (TREE_CODE (stmt) == CASE_LABEL_EXPR)
3888 	{
3889 	  gcc_assert (ctx->css_state != NULL);
3890 	  if (!CASE_LOW (stmt))
3891 	    {
3892 	      /* default: should appear just once in a SWITCH_EXPR
3893 		 body (excluding nested SWITCH_EXPR).  */
3894 	      gcc_assert (*ctx->css_state != css_default_seen);
3895 	      /* When evaluating SWITCH_EXPR body for the second time,
3896 		 return true for the default: label.  */
3897 	      if (*ctx->css_state == css_default_processing)
3898 		return true;
3899 	      *ctx->css_state = css_default_seen;
3900 	    }
3901 	  else if (CASE_HIGH (stmt))
3902 	    {
3903 	      if (tree_int_cst_le (CASE_LOW (stmt), *jump_target)
3904 		  && tree_int_cst_le (*jump_target, CASE_HIGH (stmt)))
3905 		return true;
3906 	    }
3907 	  else if (tree_int_cst_equal (*jump_target, CASE_LOW (stmt)))
3908 	    return true;
3909 	}
3910       break;
3911 
3912     default:
3913       gcc_unreachable ();
3914     }
3915   return false;
3916 }
3917 
3918 /* Evaluate a STATEMENT_LIST for side-effects.  Handles various jump
3919    semantics, for switch, break, continue, and return.  */
3920 
3921 static tree
3922 cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
3923 			 bool *non_constant_p, bool *overflow_p,
3924 			 tree *jump_target)
3925 {
3926   tree_stmt_iterator i;
3927   tree local_target;
3928   /* In a statement-expression we want to return the last value.
3929      For empty statement expression return void_node.  */
3930   tree r = void_node;
3931   if (!jump_target)
3932     {
3933       local_target = NULL_TREE;
3934       jump_target = &local_target;
3935     }
3936   for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
3937     {
3938       tree stmt = tsi_stmt (i);
3939       /* We've found a continue, so skip everything until we reach
3940 	 the label its jumping to.  */
3941       if (continues (jump_target))
3942 	{
3943 	  if (label_matches (ctx, jump_target, stmt))
3944 	    /* Found it.  */
3945 	    *jump_target = NULL_TREE;
3946 	  else
3947 	    continue;
3948 	}
3949       if (TREE_CODE (stmt) == DEBUG_BEGIN_STMT)
3950 	continue;
3951       r = cxx_eval_constant_expression (ctx, stmt, false,
3952 					non_constant_p, overflow_p,
3953 					jump_target);
3954       if (*non_constant_p)
3955 	break;
3956       if (returns (jump_target) || breaks (jump_target))
3957 	break;
3958     }
3959   return r;
3960 }
3961 
3962 /* Evaluate a LOOP_EXPR for side-effects.  Handles break and return
3963    semantics; continue semantics are covered by cxx_eval_statement_list.  */
3964 
3965 static tree
3966 cxx_eval_loop_expr (const constexpr_ctx *ctx, tree t,
3967 		    bool *non_constant_p, bool *overflow_p,
3968 		    tree *jump_target)
3969 {
3970   constexpr_ctx new_ctx = *ctx;
3971 
3972   tree body = TREE_OPERAND (t, 0);
3973   int count = 0;
3974   do
3975     {
3976       hash_set<tree> save_exprs;
3977       new_ctx.save_exprs = &save_exprs;
3978 
3979       cxx_eval_constant_expression (&new_ctx, body, /*lval*/false,
3980 				    non_constant_p, overflow_p, jump_target);
3981 
3982       /* Forget saved values of SAVE_EXPRs.  */
3983       for (hash_set<tree>::iterator iter = save_exprs.begin();
3984 	   iter != save_exprs.end(); ++iter)
3985 	new_ctx.values->remove (*iter);
3986       if (++count >= constexpr_loop_limit)
3987 	{
3988 	  if (!ctx->quiet)
3989 	    error_at (EXPR_LOC_OR_LOC (t, input_location),
3990 		      "%<constexpr%> loop iteration count exceeds limit of %d "
3991 		      "(use -fconstexpr-loop-limit= to increase the limit)",
3992 		      constexpr_loop_limit);
3993 	  *non_constant_p = true;
3994 	  break;
3995 	}
3996     }
3997   while (!returns (jump_target)
3998 	 && !breaks (jump_target)
3999 	 && !switches (jump_target)
4000 	 && !*non_constant_p);
4001 
4002   if (breaks (jump_target))
4003     *jump_target = NULL_TREE;
4004 
4005   return NULL_TREE;
4006 }
4007 
4008 /* Evaluate a SWITCH_EXPR for side-effects.  Handles switch and break jump
4009    semantics.  */
4010 
4011 static tree
4012 cxx_eval_switch_expr (const constexpr_ctx *ctx, tree t,
4013 		      bool *non_constant_p, bool *overflow_p,
4014 		      tree *jump_target)
4015 {
4016   tree cond = SWITCH_COND (t);
4017   cond = cxx_eval_constant_expression (ctx, cond, false,
4018 				       non_constant_p, overflow_p);
4019   VERIFY_CONSTANT (cond);
4020   *jump_target = cond;
4021 
4022   tree body = SWITCH_BODY (t);
4023   constexpr_ctx new_ctx = *ctx;
4024   constexpr_switch_state css = css_default_not_seen;
4025   new_ctx.css_state = &css;
4026   cxx_eval_constant_expression (&new_ctx, body, false,
4027 				non_constant_p, overflow_p, jump_target);
4028   if (switches (jump_target) && css == css_default_seen)
4029     {
4030       /* If the SWITCH_EXPR body has default: label, process it once again,
4031 	 this time instructing label_matches to return true for default:
4032 	 label on switches (jump_target).  */
4033       css = css_default_processing;
4034       cxx_eval_constant_expression (&new_ctx, body, false,
4035 				    non_constant_p, overflow_p, jump_target);
4036     }
4037   if (breaks (jump_target) || switches (jump_target))
4038     *jump_target = NULL_TREE;
4039   return NULL_TREE;
4040 }
4041 
4042 /* Find the object of TYPE under initialization in CTX.  */
4043 
4044 static tree
4045 lookup_placeholder (const constexpr_ctx *ctx, bool lval, tree type)
4046 {
4047   if (!ctx)
4048     return NULL_TREE;
4049 
4050   /* We could use ctx->object unconditionally, but using ctx->ctor when we
4051      can is a minor optimization.  */
4052   if (!lval && ctx->ctor && same_type_p (TREE_TYPE (ctx->ctor), type))
4053     return ctx->ctor;
4054 
4055   if (!ctx->object)
4056     return NULL_TREE;
4057 
4058   /* Since an object cannot have a field of its own type, we can search outward
4059      from ctx->object to find the unique containing object of TYPE.  */
4060   tree ob = ctx->object;
4061   while (ob)
4062     {
4063       if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (ob), type))
4064 	break;
4065       if (handled_component_p (ob))
4066 	ob = TREE_OPERAND (ob, 0);
4067       else
4068 	ob = NULL_TREE;
4069     }
4070 
4071   return ob;
4072 }
4073 
4074 /* Attempt to reduce the expression T to a constant value.
4075    On failure, issue diagnostic and return error_mark_node.  */
4076 /* FIXME unify with c_fully_fold */
4077 /* FIXME overflow_p is too global */
4078 
4079 static tree
4080 cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
4081 			      bool lval,
4082 			      bool *non_constant_p, bool *overflow_p,
4083 			      tree *jump_target)
4084 {
4085   constexpr_ctx new_ctx;
4086   tree r = t;
4087 
4088   if (jump_target && *jump_target)
4089     {
4090       /* If we are jumping, ignore all statements/expressions except those
4091 	 that could have LABEL_EXPR or CASE_LABEL_EXPR in their bodies.  */
4092       switch (TREE_CODE (t))
4093 	{
4094 	case BIND_EXPR:
4095 	case STATEMENT_LIST:
4096 	case LOOP_EXPR:
4097 	case COND_EXPR:
4098 	  break;
4099 	case LABEL_EXPR:
4100 	case CASE_LABEL_EXPR:
4101 	  if (label_matches (ctx, jump_target, t))
4102 	    /* Found it.  */
4103 	    *jump_target = NULL_TREE;
4104 	  return NULL_TREE;
4105 	default:
4106 	  return NULL_TREE;
4107 	}
4108     }
4109   if (t == error_mark_node)
4110     {
4111       *non_constant_p = true;
4112       return t;
4113     }
4114   if (CONSTANT_CLASS_P (t))
4115     {
4116       if (TREE_OVERFLOW (t))
4117 	{
4118 	  if (!ctx->quiet)
4119 	    permerror (input_location, "overflow in constant expression");
4120 	  if (!flag_permissive || ctx->quiet)
4121 	    *overflow_p = true;
4122 	}
4123 
4124       if (TREE_CODE (t) == INTEGER_CST
4125 	  && TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
4126 	  && !integer_zerop (t))
4127 	{
4128 	  if (!ctx->quiet)
4129 	    error ("value %qE of type %qT is not a constant expression",
4130 		   t, TREE_TYPE (t));
4131 	  *non_constant_p = true;
4132 	}
4133 
4134       return t;
4135     }
4136 
4137   tree_code tcode = TREE_CODE (t);
4138   switch (tcode)
4139     {
4140     case RESULT_DECL:
4141       if (lval)
4142 	return t;
4143       /* We ask for an rvalue for the RESULT_DECL when indirecting
4144 	 through an invisible reference, or in named return value
4145 	 optimization.  */
4146       if (tree *p = ctx->values->get (t))
4147 	return *p;
4148       else
4149 	{
4150 	  if (!ctx->quiet)
4151 	    error ("%qE is not a constant expression", t);
4152 	  *non_constant_p = true;
4153 	}
4154       break;
4155 
4156     case VAR_DECL:
4157       if (DECL_HAS_VALUE_EXPR_P (t))
4158 	return cxx_eval_constant_expression (ctx, DECL_VALUE_EXPR (t),
4159 					     lval, non_constant_p, overflow_p);
4160       /* fall through */
4161     case CONST_DECL:
4162       /* We used to not check lval for CONST_DECL, but darwin.c uses
4163 	 CONST_DECL for aggregate constants.  */
4164       if (lval)
4165 	return t;
4166       if (COMPLETE_TYPE_P (TREE_TYPE (t))
4167 	  && is_really_empty_class (TREE_TYPE (t)))
4168 	{
4169 	  /* If the class is empty, we aren't actually loading anything.  */
4170 	  r = build_constructor (TREE_TYPE (t), NULL);
4171 	  TREE_CONSTANT (r) = true;
4172 	}
4173       else if (ctx->strict)
4174 	r = decl_really_constant_value (t);
4175       else
4176 	r = decl_constant_value (t);
4177       if (TREE_CODE (r) == TARGET_EXPR
4178 	  && TREE_CODE (TARGET_EXPR_INITIAL (r)) == CONSTRUCTOR)
4179 	r = TARGET_EXPR_INITIAL (r);
4180       if (VAR_P (r))
4181 	if (tree *p = ctx->values->get (r))
4182 	  if (*p != NULL_TREE)
4183 	    r = *p;
4184       if (DECL_P (r))
4185 	{
4186 	  if (!ctx->quiet)
4187 	    non_const_var_error (r);
4188 	  *non_constant_p = true;
4189 	}
4190       break;
4191 
4192     case DEBUG_BEGIN_STMT:
4193       /* ??? It might be nice to retain this information somehow, so
4194 	 as to be able to step into a constexpr function call.  */
4195       /* Fall through.  */
4196 
4197     case FUNCTION_DECL:
4198     case TEMPLATE_DECL:
4199     case LABEL_DECL:
4200     case LABEL_EXPR:
4201     case CASE_LABEL_EXPR:
4202     case PREDICT_EXPR:
4203       return t;
4204 
4205     case PARM_DECL:
4206       if (lval && TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE)
4207 	/* glvalue use.  */;
4208       else if (tree *p = ctx->values->get (r))
4209 	r = *p;
4210       else if (lval)
4211 	/* Defer in case this is only used for its type.  */;
4212       else if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
4213 	/* Defer, there's no lvalue->rvalue conversion.  */;
4214       else if (COMPLETE_TYPE_P (TREE_TYPE (t))
4215 	       && is_really_empty_class (TREE_TYPE (t)))
4216 	{
4217 	  /* If the class is empty, we aren't actually loading anything.  */
4218 	  r = build_constructor (TREE_TYPE (t), NULL);
4219 	  TREE_CONSTANT (r) = true;
4220 	}
4221       else
4222 	{
4223 	  if (!ctx->quiet)
4224 	    error ("%qE is not a constant expression", t);
4225 	  *non_constant_p = true;
4226 	}
4227       break;
4228 
4229     case CALL_EXPR:
4230     case AGGR_INIT_EXPR:
4231       r = cxx_eval_call_expression (ctx, t, lval,
4232 				    non_constant_p, overflow_p);
4233       break;
4234 
4235     case DECL_EXPR:
4236       {
4237 	r = DECL_EXPR_DECL (t);
4238 	if (AGGREGATE_TYPE_P (TREE_TYPE (r))
4239 	    || VECTOR_TYPE_P (TREE_TYPE (r)))
4240 	  {
4241 	    new_ctx = *ctx;
4242 	    new_ctx.object = r;
4243 	    new_ctx.ctor = build_constructor (TREE_TYPE (r), NULL);
4244 	    CONSTRUCTOR_NO_IMPLICIT_ZERO (new_ctx.ctor) = true;
4245 	    new_ctx.values->put (r, new_ctx.ctor);
4246 	    ctx = &new_ctx;
4247 	  }
4248 
4249 	if (tree init = DECL_INITIAL (r))
4250 	  {
4251 	    init = cxx_eval_constant_expression (ctx, init,
4252 						 false,
4253 						 non_constant_p, overflow_p);
4254 	    /* Don't share a CONSTRUCTOR that might be changed.  */
4255 	    init = unshare_constructor (init);
4256 	    ctx->values->put (r, init);
4257 	  }
4258 	else if (ctx == &new_ctx)
4259 	  /* We gave it a CONSTRUCTOR above.  */;
4260 	else
4261 	  ctx->values->put (r, NULL_TREE);
4262       }
4263       break;
4264 
4265     case TARGET_EXPR:
4266       if (!literal_type_p (TREE_TYPE (t)))
4267 	{
4268 	  if (!ctx->quiet)
4269 	    {
4270 	      error ("temporary of non-literal type %qT in a "
4271 		     "constant expression", TREE_TYPE (t));
4272 	      explain_non_literal_class (TREE_TYPE (t));
4273 	    }
4274 	  *non_constant_p = true;
4275 	  break;
4276 	}
4277       if ((AGGREGATE_TYPE_P (TREE_TYPE (t)) || VECTOR_TYPE_P (TREE_TYPE (t))))
4278 	{
4279 	  /* We're being expanded without an explicit target, so start
4280 	     initializing a new object; expansion with an explicit target
4281 	     strips the TARGET_EXPR before we get here.  */
4282 	  new_ctx = *ctx;
4283 	  new_ctx.ctor = build_constructor (TREE_TYPE (t), NULL);
4284 	  CONSTRUCTOR_NO_IMPLICIT_ZERO (new_ctx.ctor) = true;
4285 	  new_ctx.object = TARGET_EXPR_SLOT (t);
4286 	  ctx->values->put (new_ctx.object, new_ctx.ctor);
4287 	  ctx = &new_ctx;
4288 	}
4289       /* Pass false for 'lval' because this indicates
4290 	 initialization of a temporary.  */
4291       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
4292 					false,
4293 					non_constant_p, overflow_p);
4294       if (!*non_constant_p)
4295 	/* Adjust the type of the result to the type of the temporary.  */
4296 	r = adjust_temp_type (TREE_TYPE (t), r);
4297       if (lval)
4298 	{
4299 	  tree slot = TARGET_EXPR_SLOT (t);
4300 	  r = unshare_constructor (r);
4301 	  ctx->values->put (slot, r);
4302 	  return slot;
4303 	}
4304       break;
4305 
4306     case INIT_EXPR:
4307     case MODIFY_EXPR:
4308       gcc_assert (jump_target == NULL || *jump_target == NULL_TREE);
4309       r = cxx_eval_store_expression (ctx, t, lval,
4310 				     non_constant_p, overflow_p);
4311       break;
4312 
4313     case SCOPE_REF:
4314       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
4315 					lval,
4316 					non_constant_p, overflow_p);
4317       break;
4318 
4319     case RETURN_EXPR:
4320       if (TREE_OPERAND (t, 0) != NULL_TREE)
4321 	r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
4322 					  lval,
4323 					  non_constant_p, overflow_p);
4324       if (jump_target)
4325 	*jump_target = t;
4326       else
4327 	{
4328 	  /* Can happen with ({ return true; }) && false; passed to
4329 	     maybe_constant_value.  There is nothing to jump over in this
4330 	     case, and the bug will be diagnosed later.  */
4331 	  gcc_assert (ctx->quiet);
4332 	  *non_constant_p = true;
4333 	}
4334       break;
4335 
4336     case SAVE_EXPR:
4337       /* Avoid evaluating a SAVE_EXPR more than once.  */
4338       if (tree *p = ctx->values->get (t))
4339 	r = *p;
4340       else
4341 	{
4342 	  r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), false,
4343 					    non_constant_p, overflow_p);
4344 	  ctx->values->put (t, r);
4345 	  if (ctx->save_exprs)
4346 	    ctx->save_exprs->add (t);
4347 	}
4348       break;
4349 
4350     case NON_LVALUE_EXPR:
4351     case TRY_CATCH_EXPR:
4352     case TRY_BLOCK:
4353     case CLEANUP_POINT_EXPR:
4354     case MUST_NOT_THROW_EXPR:
4355     case EXPR_STMT:
4356     case EH_SPEC_BLOCK:
4357       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
4358 					lval,
4359 					non_constant_p, overflow_p,
4360 					jump_target);
4361       break;
4362 
4363     case TRY_FINALLY_EXPR:
4364       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
4365 					non_constant_p, overflow_p,
4366 					jump_target);
4367       if (!*non_constant_p)
4368 	/* Also evaluate the cleanup.  */
4369 	cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1), true,
4370 				      non_constant_p, overflow_p,
4371 				      jump_target);
4372       break;
4373 
4374       /* These differ from cxx_eval_unary_expression in that this doesn't
4375 	 check for a constant operand or result; an address can be
4376 	 constant without its operand being, and vice versa.  */
4377     case MEM_REF:
4378     case INDIRECT_REF:
4379       r = cxx_eval_indirect_ref (ctx, t, lval,
4380 				 non_constant_p, overflow_p);
4381       break;
4382 
4383     case ADDR_EXPR:
4384       {
4385 	tree oldop = TREE_OPERAND (t, 0);
4386 	tree op = cxx_eval_constant_expression (ctx, oldop,
4387 						/*lval*/true,
4388 						non_constant_p, overflow_p);
4389 	/* Don't VERIFY_CONSTANT here.  */
4390 	if (*non_constant_p)
4391 	  return t;
4392 	gcc_checking_assert (TREE_CODE (op) != CONSTRUCTOR);
4393 	/* This function does more aggressive folding than fold itself.  */
4394 	r = build_fold_addr_expr_with_type (op, TREE_TYPE (t));
4395 	if (TREE_CODE (r) == ADDR_EXPR && TREE_OPERAND (r, 0) == oldop)
4396 	  return t;
4397 	break;
4398       }
4399 
4400     case REALPART_EXPR:
4401     case IMAGPART_EXPR:
4402       if (lval)
4403 	{
4404 	  r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
4405 					    non_constant_p, overflow_p);
4406 	  if (r == error_mark_node)
4407 	    ;
4408 	  else if (r == TREE_OPERAND (t, 0))
4409 	    r = t;
4410 	  else
4411 	    r = fold_build1 (TREE_CODE (t), TREE_TYPE (t), r);
4412 	  break;
4413 	}
4414       /* FALLTHRU */
4415     case CONJ_EXPR:
4416     case FIX_TRUNC_EXPR:
4417     case FLOAT_EXPR:
4418     case NEGATE_EXPR:
4419     case ABS_EXPR:
4420     case BIT_NOT_EXPR:
4421     case TRUTH_NOT_EXPR:
4422     case FIXED_CONVERT_EXPR:
4423       r = cxx_eval_unary_expression (ctx, t, lval,
4424 				     non_constant_p, overflow_p);
4425       break;
4426 
4427     case SIZEOF_EXPR:
4428       r = fold_sizeof_expr (t);
4429       VERIFY_CONSTANT (r);
4430       break;
4431 
4432     case COMPOUND_EXPR:
4433       {
4434 	/* check_return_expr sometimes wraps a TARGET_EXPR in a
4435 	   COMPOUND_EXPR; don't get confused.  Also handle EMPTY_CLASS_EXPR
4436 	   introduced by build_call_a.  */
4437 	tree op0 = TREE_OPERAND (t, 0);
4438 	tree op1 = TREE_OPERAND (t, 1);
4439 	STRIP_NOPS (op1);
4440 	if ((TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
4441 	    || TREE_CODE (op1) == EMPTY_CLASS_EXPR)
4442 	  r = cxx_eval_constant_expression (ctx, op0,
4443 					    lval, non_constant_p, overflow_p,
4444 					    jump_target);
4445 	else
4446 	  {
4447 	    /* Check that the LHS is constant and then discard it.  */
4448 	    cxx_eval_constant_expression (ctx, op0,
4449 					  true, non_constant_p, overflow_p,
4450 					  jump_target);
4451 	    if (*non_constant_p)
4452 	      return t;
4453 	    op1 = TREE_OPERAND (t, 1);
4454 	    r = cxx_eval_constant_expression (ctx, op1,
4455 					      lval, non_constant_p, overflow_p,
4456 					      jump_target);
4457 	  }
4458       }
4459       break;
4460 
4461     case POINTER_PLUS_EXPR:
4462     case POINTER_DIFF_EXPR:
4463     case PLUS_EXPR:
4464     case MINUS_EXPR:
4465     case MULT_EXPR:
4466     case TRUNC_DIV_EXPR:
4467     case CEIL_DIV_EXPR:
4468     case FLOOR_DIV_EXPR:
4469     case ROUND_DIV_EXPR:
4470     case TRUNC_MOD_EXPR:
4471     case CEIL_MOD_EXPR:
4472     case ROUND_MOD_EXPR:
4473     case RDIV_EXPR:
4474     case EXACT_DIV_EXPR:
4475     case MIN_EXPR:
4476     case MAX_EXPR:
4477     case LSHIFT_EXPR:
4478     case RSHIFT_EXPR:
4479     case LROTATE_EXPR:
4480     case RROTATE_EXPR:
4481     case BIT_IOR_EXPR:
4482     case BIT_XOR_EXPR:
4483     case BIT_AND_EXPR:
4484     case TRUTH_XOR_EXPR:
4485     case LT_EXPR:
4486     case LE_EXPR:
4487     case GT_EXPR:
4488     case GE_EXPR:
4489     case EQ_EXPR:
4490     case NE_EXPR:
4491     case UNORDERED_EXPR:
4492     case ORDERED_EXPR:
4493     case UNLT_EXPR:
4494     case UNLE_EXPR:
4495     case UNGT_EXPR:
4496     case UNGE_EXPR:
4497     case UNEQ_EXPR:
4498     case LTGT_EXPR:
4499     case RANGE_EXPR:
4500     case COMPLEX_EXPR:
4501       r = cxx_eval_binary_expression (ctx, t, lval,
4502 				      non_constant_p, overflow_p);
4503       break;
4504 
4505       /* fold can introduce non-IF versions of these; still treat them as
4506 	 short-circuiting.  */
4507     case TRUTH_AND_EXPR:
4508     case TRUTH_ANDIF_EXPR:
4509       r = cxx_eval_logical_expression (ctx, t, boolean_false_node,
4510 				       boolean_true_node,
4511 				       lval,
4512 				       non_constant_p, overflow_p);
4513       break;
4514 
4515     case TRUTH_OR_EXPR:
4516     case TRUTH_ORIF_EXPR:
4517       r = cxx_eval_logical_expression (ctx, t, boolean_true_node,
4518 				       boolean_false_node,
4519 				       lval,
4520 				       non_constant_p, overflow_p);
4521       break;
4522 
4523     case ARRAY_REF:
4524       r = cxx_eval_array_reference (ctx, t, lval,
4525 				    non_constant_p, overflow_p);
4526       break;
4527 
4528     case COMPONENT_REF:
4529       if (is_overloaded_fn (t))
4530 	{
4531 	  /* We can only get here in checking mode via
4532 	     build_non_dependent_expr,  because any expression that
4533 	     calls or takes the address of the function will have
4534 	     pulled a FUNCTION_DECL out of the COMPONENT_REF.  */
4535 	  gcc_checking_assert (ctx->quiet || errorcount);
4536 	  *non_constant_p = true;
4537 	  return t;
4538 	}
4539       r = cxx_eval_component_reference (ctx, t, lval,
4540 					non_constant_p, overflow_p);
4541       break;
4542 
4543     case BIT_FIELD_REF:
4544       r = cxx_eval_bit_field_ref (ctx, t, lval,
4545 				  non_constant_p, overflow_p);
4546       break;
4547 
4548     case COND_EXPR:
4549       if (jump_target && *jump_target)
4550 	{
4551 	  tree orig_jump = *jump_target;
4552 	  /* When jumping to a label, the label might be either in the
4553 	     then or else blocks, so process then block first in skipping
4554 	     mode first, and if we are still in the skipping mode at its end,
4555 	     process the else block too.  */
4556 	  r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
4557 					    lval, non_constant_p, overflow_p,
4558 					    jump_target);
4559 	  /* It's possible that we found the label in the then block.  But
4560 	     it could have been followed by another jumping statement, e.g.
4561 	     say we're looking for case 1:
4562 	      if (cond)
4563 		{
4564 		  // skipped statements
4565 		  case 1:; // clears up *jump_target
4566 		  return 1; // and sets it to a RETURN_EXPR
4567 		}
4568 	      else { ... }
4569 	     in which case we need not go looking to the else block.
4570 	     (goto is not allowed in a constexpr function.)  */
4571 	  if (*jump_target == orig_jump)
4572 	    r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 2),
4573 					      lval, non_constant_p, overflow_p,
4574 					      jump_target);
4575 	  break;
4576 	}
4577       r = cxx_eval_conditional_expression (ctx, t, lval,
4578 					   non_constant_p, overflow_p,
4579 					   jump_target);
4580       break;
4581     case VEC_COND_EXPR:
4582       r = cxx_eval_vector_conditional_expression (ctx, t, non_constant_p,
4583 						  overflow_p);
4584       break;
4585 
4586     case CONSTRUCTOR:
4587       if (TREE_CONSTANT (t) && reduced_constant_expression_p (t))
4588 	{
4589 	  /* Don't re-process a constant CONSTRUCTOR, but do fold it to
4590 	     VECTOR_CST if applicable.  */
4591 	  verify_constructor_flags (t);
4592 	  if (TREE_CONSTANT (t))
4593 	    return fold (t);
4594 	}
4595       r = cxx_eval_bare_aggregate (ctx, t, lval,
4596 				   non_constant_p, overflow_p);
4597       break;
4598 
4599     case VEC_INIT_EXPR:
4600       /* We can get this in a defaulted constructor for a class with a
4601 	 non-static data member of array type.  Either the initializer will
4602 	 be NULL, meaning default-initialization, or it will be an lvalue
4603 	 or xvalue of the same type, meaning direct-initialization from the
4604 	 corresponding member.  */
4605       r = cxx_eval_vec_init (ctx, t, lval,
4606 			     non_constant_p, overflow_p);
4607       break;
4608 
4609     case FMA_EXPR:
4610     case VEC_PERM_EXPR:
4611       r = cxx_eval_trinary_expression (ctx, t, lval,
4612 				       non_constant_p, overflow_p);
4613       break;
4614 
4615     case NOP_EXPR:
4616       if (REINTERPRET_CAST_P (t))
4617 	{
4618 	  if (!ctx->quiet)
4619 	    error_at (EXPR_LOC_OR_LOC (t, input_location),
4620 		      "a reinterpret_cast is not a constant expression");
4621 	  *non_constant_p = true;
4622 	  return t;
4623 	}
4624       /* FALLTHROUGH.  */
4625     case CONVERT_EXPR:
4626     case VIEW_CONVERT_EXPR:
4627     case UNARY_PLUS_EXPR:
4628       {
4629 	tree oldop = TREE_OPERAND (t, 0);
4630 
4631 	tree op = cxx_eval_constant_expression (ctx, oldop,
4632 						lval,
4633 						non_constant_p, overflow_p);
4634 	if (*non_constant_p)
4635 	  return t;
4636 	tree type = TREE_TYPE (t);
4637 	if (TREE_CODE (op) == PTRMEM_CST
4638 	    && !TYPE_PTRMEM_P (type))
4639 	  op = cplus_expand_constant (op);
4640 
4641 	if (TREE_CODE (op) == PTRMEM_CST && tcode == NOP_EXPR)
4642 	  {
4643 	    if (!same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (op))
4644 		&& !can_convert_qual (type, op))
4645 	      op = cplus_expand_constant (op);
4646 	    return cp_fold_convert (type, op);
4647 	  }
4648 
4649 	if (POINTER_TYPE_P (type) && TREE_CODE (op) == INTEGER_CST)
4650 	  {
4651 	    if (integer_zerop (op))
4652 	      {
4653 		if (TREE_CODE (type) == REFERENCE_TYPE)
4654 		  {
4655 		    if (!ctx->quiet)
4656 		      error_at (EXPR_LOC_OR_LOC (t, input_location),
4657 				"dereferencing a null pointer");
4658 		    *non_constant_p = true;
4659 		    return t;
4660 		  }
4661 		else if (TREE_CODE (TREE_TYPE (op)) == POINTER_TYPE)
4662 		  {
4663 		    tree from = TREE_TYPE (op);
4664 
4665 		    if (!can_convert (type, from, tf_none))
4666 		      {
4667 			if (!ctx->quiet)
4668 			  error_at (EXPR_LOC_OR_LOC (t, input_location),
4669 				    "conversion of %qT null pointer to %qT "
4670 				    "is not a constant expression",
4671 				    from, type);
4672 			*non_constant_p = true;
4673 			return t;
4674 		      }
4675 		  }
4676 	      }
4677 	    else
4678 	      {
4679 		/* This detects for example:
4680 		     reinterpret_cast<void*>(sizeof 0)
4681 		*/
4682 		if (!ctx->quiet)
4683 		  error_at (EXPR_LOC_OR_LOC (t, input_location),
4684 			    "%<reinterpret_cast<%T>(%E)%> is not "
4685 			    "a constant expression",
4686 			    type, op);
4687 		*non_constant_p = true;
4688 		return t;
4689 	      }
4690 	  }
4691 
4692 	if (op == oldop && tcode != UNARY_PLUS_EXPR)
4693 	  /* We didn't fold at the top so we could check for ptr-int
4694 	     conversion.  */
4695 	  return fold (t);
4696 
4697 	if (tcode == UNARY_PLUS_EXPR)
4698 	  r = fold_convert (TREE_TYPE (t), op);
4699 	else
4700 	  r = fold_build1 (tcode, type, op);
4701 
4702 	/* Conversion of an out-of-range value has implementation-defined
4703 	   behavior; the language considers it different from arithmetic
4704 	   overflow, which is undefined.  */
4705 	if (TREE_OVERFLOW_P (r) && !TREE_OVERFLOW_P (op))
4706 	  TREE_OVERFLOW (r) = false;
4707       }
4708       break;
4709 
4710     case EMPTY_CLASS_EXPR:
4711       /* This is good enough for a function argument that might not get
4712 	 used, and they can't do anything with it, so just return it.  */
4713       return t;
4714 
4715     case STATEMENT_LIST:
4716       new_ctx = *ctx;
4717       new_ctx.ctor = new_ctx.object = NULL_TREE;
4718       return cxx_eval_statement_list (&new_ctx, t,
4719 				      non_constant_p, overflow_p, jump_target);
4720 
4721     case BIND_EXPR:
4722       return cxx_eval_constant_expression (ctx, BIND_EXPR_BODY (t),
4723 					   lval,
4724 					   non_constant_p, overflow_p,
4725 					   jump_target);
4726 
4727     case PREINCREMENT_EXPR:
4728     case POSTINCREMENT_EXPR:
4729     case PREDECREMENT_EXPR:
4730     case POSTDECREMENT_EXPR:
4731       return cxx_eval_increment_expression (ctx, t,
4732 					    lval, non_constant_p, overflow_p);
4733 
4734     case LAMBDA_EXPR:
4735     case NEW_EXPR:
4736     case VEC_NEW_EXPR:
4737     case DELETE_EXPR:
4738     case VEC_DELETE_EXPR:
4739     case THROW_EXPR:
4740     case MODOP_EXPR:
4741       /* GCC internal stuff.  */
4742     case VA_ARG_EXPR:
4743     case OBJ_TYPE_REF:
4744     case NON_DEPENDENT_EXPR:
4745     case BASELINK:
4746     case OFFSET_REF:
4747       if (!ctx->quiet)
4748         error_at (EXPR_LOC_OR_LOC (t, input_location),
4749 		  "expression %qE is not a constant expression", t);
4750       *non_constant_p = true;
4751       break;
4752 
4753     case PLACEHOLDER_EXPR:
4754       /* Use of the value or address of the current object.  */
4755       if (tree ctor = lookup_placeholder (ctx, lval, TREE_TYPE (t)))
4756 	return cxx_eval_constant_expression (ctx, ctor, lval,
4757 					     non_constant_p, overflow_p);
4758       /* A placeholder without a referent.  We can get here when
4759 	 checking whether NSDMIs are noexcept, or in massage_init_elt;
4760 	 just say it's non-constant for now.  */
4761       gcc_assert (ctx->quiet);
4762       *non_constant_p = true;
4763       break;
4764 
4765     case EXIT_EXPR:
4766       {
4767 	tree cond = TREE_OPERAND (t, 0);
4768 	cond = cxx_eval_constant_expression (ctx, cond, /*lval*/false,
4769 					     non_constant_p, overflow_p);
4770 	VERIFY_CONSTANT (cond);
4771 	if (integer_nonzerop (cond))
4772 	  *jump_target = t;
4773       }
4774       break;
4775 
4776     case GOTO_EXPR:
4777       *jump_target = TREE_OPERAND (t, 0);
4778       gcc_assert (breaks (jump_target) || continues (jump_target)
4779 		  /* Allow for jumping to a cdtor_label.  */
4780 		  || returns (jump_target));
4781       break;
4782 
4783     case LOOP_EXPR:
4784       cxx_eval_loop_expr (ctx, t,
4785 			  non_constant_p, overflow_p, jump_target);
4786       break;
4787 
4788     case SWITCH_EXPR:
4789       cxx_eval_switch_expr (ctx, t,
4790 			    non_constant_p, overflow_p, jump_target);
4791       break;
4792 
4793     case REQUIRES_EXPR:
4794       /* It's possible to get a requires-expression in a constant
4795          expression. For example:
4796 
4797              template<typename T> concept bool C() {
4798                return requires (T t) { t; };
4799              }
4800 
4801              template<typename T> requires !C<T>() void f(T);
4802 
4803          Normalization leaves f with the associated constraint
4804          '!requires (T t) { ... }' which is not transformed into
4805          a constraint.  */
4806       if (!processing_template_decl)
4807         return evaluate_constraint_expression (t, NULL_TREE);
4808       else
4809         *non_constant_p = true;
4810       return t;
4811 
4812     case ANNOTATE_EXPR:
4813       r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
4814 					lval,
4815 					non_constant_p, overflow_p,
4816 					jump_target);
4817       break;
4818 
4819     case USING_STMT:
4820       r = void_node;
4821       break;
4822 
4823     default:
4824       if (STATEMENT_CODE_P (TREE_CODE (t)))
4825 	{
4826 	  /* This function doesn't know how to deal with pre-genericize
4827 	     statements; this can only happen with statement-expressions,
4828 	     so for now just fail.  */
4829 	  if (!ctx->quiet)
4830 	    error_at (EXPR_LOCATION (t),
4831 		      "statement is not a constant expression");
4832 	}
4833       else
4834 	internal_error ("unexpected expression %qE of kind %s", t,
4835 			get_tree_code_name (TREE_CODE (t)));
4836       *non_constant_p = true;
4837       break;
4838     }
4839 
4840   if (r == error_mark_node)
4841     *non_constant_p = true;
4842 
4843   if (*non_constant_p)
4844     return t;
4845   else
4846     return r;
4847 }
4848 
4849 static tree
4850 cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
4851 				  bool strict = true, tree object = NULL_TREE)
4852 {
4853   auto_timevar time (TV_CONSTEXPR);
4854 
4855   bool non_constant_p = false;
4856   bool overflow_p = false;
4857   hash_map<tree,tree> map;
4858 
4859   constexpr_ctx ctx = { NULL, &map, NULL, NULL, NULL, NULL,
4860 			allow_non_constant, strict };
4861 
4862   tree type = initialized_type (t);
4863   tree r = t;
4864   if (AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type))
4865     {
4866       /* In C++14 an NSDMI can participate in aggregate initialization,
4867 	 and can refer to the address of the object being initialized, so
4868 	 we need to pass in the relevant VAR_DECL if we want to do the
4869 	 evaluation in a single pass.  The evaluation will dynamically
4870 	 update ctx.values for the VAR_DECL.  We use the same strategy
4871 	 for C++11 constexpr constructors that refer to the object being
4872 	 initialized.  */
4873       ctx.ctor = build_constructor (type, NULL);
4874       CONSTRUCTOR_NO_IMPLICIT_ZERO (ctx.ctor) = true;
4875       if (!object)
4876 	{
4877 	  if (TREE_CODE (t) == TARGET_EXPR)
4878 	    object = TARGET_EXPR_SLOT (t);
4879 	  else if (TREE_CODE (t) == AGGR_INIT_EXPR)
4880 	    object = AGGR_INIT_EXPR_SLOT (t);
4881 	}
4882       ctx.object = object;
4883       if (object)
4884 	gcc_assert (same_type_ignoring_top_level_qualifiers_p
4885 		    (type, TREE_TYPE (object)));
4886       if (object && DECL_P (object))
4887 	map.put (object, ctx.ctor);
4888       if (TREE_CODE (r) == TARGET_EXPR)
4889 	/* Avoid creating another CONSTRUCTOR when we expand the
4890 	   TARGET_EXPR.  */
4891 	r = TARGET_EXPR_INITIAL (r);
4892     }
4893 
4894   r = cxx_eval_constant_expression (&ctx, r,
4895 				    false, &non_constant_p, &overflow_p);
4896 
4897   verify_constant (r, allow_non_constant, &non_constant_p, &overflow_p);
4898 
4899   /* Mutable logic is a bit tricky: we want to allow initialization of
4900      constexpr variables with mutable members, but we can't copy those
4901      members to another constexpr variable.  */
4902   if (TREE_CODE (r) == CONSTRUCTOR
4903       && CONSTRUCTOR_MUTABLE_POISON (r))
4904     {
4905       if (!allow_non_constant)
4906 	error ("%qE is not a constant expression because it refers to "
4907 	       "mutable subobjects of %qT", t, type);
4908       non_constant_p = true;
4909     }
4910 
4911   if (TREE_CODE (r) == CONSTRUCTOR
4912       && CONSTRUCTOR_NO_IMPLICIT_ZERO (r))
4913     {
4914       if (!allow_non_constant)
4915 	error ("%qE is not a constant expression because it refers to "
4916 	       "an incompletely initialized variable", t);
4917       TREE_CONSTANT (r) = false;
4918       non_constant_p = true;
4919     }
4920 
4921   /* Technically we should check this for all subexpressions, but that
4922      runs into problems with our internal representation of pointer
4923      subtraction and the 5.19 rules are still in flux.  */
4924   if (CONVERT_EXPR_CODE_P (TREE_CODE (r))
4925       && ARITHMETIC_TYPE_P (TREE_TYPE (r))
4926       && TREE_CODE (TREE_OPERAND (r, 0)) == ADDR_EXPR)
4927     {
4928       if (!allow_non_constant)
4929 	error ("conversion from pointer type %qT "
4930 	       "to arithmetic type %qT in a constant expression",
4931 	       TREE_TYPE (TREE_OPERAND (r, 0)), TREE_TYPE (r));
4932       non_constant_p = true;
4933     }
4934 
4935   if (!non_constant_p && overflow_p)
4936     non_constant_p = true;
4937 
4938   /* Unshare the result unless it's a CONSTRUCTOR in which case it's already
4939      unshared.  */
4940   bool should_unshare = true;
4941   if (r == t || TREE_CODE (r) == CONSTRUCTOR)
4942     should_unshare = false;
4943 
4944   if (non_constant_p && !allow_non_constant)
4945     return error_mark_node;
4946   else if (non_constant_p && TREE_CONSTANT (r))
4947     {
4948       /* This isn't actually constant, so unset TREE_CONSTANT.
4949 	 Don't clear TREE_CONSTANT on ADDR_EXPR, as the middle-end requires
4950 	 it to be set if it is invariant address, even when it is not
4951 	 a valid C++ constant expression.  Wrap it with a NOP_EXPR
4952 	 instead.  */
4953       if (EXPR_P (r) && TREE_CODE (r) != ADDR_EXPR)
4954 	r = copy_node (r);
4955       else if (TREE_CODE (r) == CONSTRUCTOR)
4956 	r = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (r), r);
4957       else
4958 	r = build_nop (TREE_TYPE (r), r);
4959       TREE_CONSTANT (r) = false;
4960     }
4961   else if (non_constant_p || r == t)
4962     return t;
4963 
4964   if (should_unshare)
4965     r = unshare_expr (r);
4966 
4967   if (TREE_CODE (r) == CONSTRUCTOR && CLASS_TYPE_P (TREE_TYPE (r)))
4968     {
4969       if (TREE_CODE (t) == TARGET_EXPR
4970 	  && TARGET_EXPR_INITIAL (t) == r)
4971 	return t;
4972       else
4973 	{
4974 	  r = get_target_expr (r);
4975 	  TREE_CONSTANT (r) = true;
4976 	  return r;
4977 	}
4978     }
4979   else
4980     return r;
4981 }
4982 
4983 /* Returns true if T is a valid subexpression of a constant expression,
4984    even if it isn't itself a constant expression.  */
4985 
4986 bool
4987 is_sub_constant_expr (tree t)
4988 {
4989   bool non_constant_p = false;
4990   bool overflow_p = false;
4991   hash_map <tree, tree> map;
4992 
4993   constexpr_ctx ctx = { NULL, &map, NULL, NULL, NULL, NULL, true, true };
4994 
4995   cxx_eval_constant_expression (&ctx, t, false, &non_constant_p,
4996 				&overflow_p);
4997   return !non_constant_p && !overflow_p;
4998 }
4999 
5000 /* If T represents a constant expression returns its reduced value.
5001    Otherwise return error_mark_node.  If T is dependent, then
5002    return NULL.  */
5003 
5004 tree
5005 cxx_constant_value (tree t, tree decl)
5006 {
5007   return cxx_eval_outermost_constant_expr (t, false, true, decl);
5008 }
5009 
5010 /* Helper routine for fold_simple function.  Either return simplified
5011    expression T, otherwise NULL_TREE.
5012    In contrast to cp_fully_fold, and to maybe_constant_value, we try to fold
5013    even if we are within template-declaration.  So be careful on call, as in
5014    such case types can be undefined.  */
5015 
5016 static tree
5017 fold_simple_1 (tree t)
5018 {
5019   tree op1;
5020   enum tree_code code = TREE_CODE (t);
5021 
5022   switch (code)
5023     {
5024     case INTEGER_CST:
5025     case REAL_CST:
5026     case VECTOR_CST:
5027     case FIXED_CST:
5028     case COMPLEX_CST:
5029       return t;
5030 
5031     case SIZEOF_EXPR:
5032       return fold_sizeof_expr (t);
5033 
5034     case ABS_EXPR:
5035     case CONJ_EXPR:
5036     case REALPART_EXPR:
5037     case IMAGPART_EXPR:
5038     case NEGATE_EXPR:
5039     case BIT_NOT_EXPR:
5040     case TRUTH_NOT_EXPR:
5041     case NOP_EXPR:
5042     case VIEW_CONVERT_EXPR:
5043     case CONVERT_EXPR:
5044     case FLOAT_EXPR:
5045     case FIX_TRUNC_EXPR:
5046     case FIXED_CONVERT_EXPR:
5047     case ADDR_SPACE_CONVERT_EXPR:
5048 
5049       op1 = TREE_OPERAND (t, 0);
5050 
5051       t = const_unop (code, TREE_TYPE (t), op1);
5052       if (!t)
5053 	return NULL_TREE;
5054 
5055       if (CONVERT_EXPR_CODE_P (code)
5056 	  && TREE_OVERFLOW_P (t) && !TREE_OVERFLOW_P (op1))
5057 	TREE_OVERFLOW (t) = false;
5058       return t;
5059 
5060     default:
5061       return NULL_TREE;
5062     }
5063 }
5064 
5065 /* If T is a simple constant expression, returns its simplified value.
5066    Otherwise returns T.  In contrast to maybe_constant_value we
5067    simplify only few operations on constant-expressions, and we don't
5068    try to simplify constexpressions.  */
5069 
5070 tree
5071 fold_simple (tree t)
5072 {
5073   if (processing_template_decl)
5074     return t;
5075 
5076   tree r = fold_simple_1 (t);
5077   if (r)
5078     return r;
5079 
5080   return t;
5081 }
5082 
5083 /* If T is a constant expression, returns its reduced value.
5084    Otherwise, if T does not have TREE_CONSTANT set, returns T.
5085    Otherwise, returns a version of T without TREE_CONSTANT.  */
5086 
5087 static GTY((deletable)) hash_map<tree, tree> *cv_cache;
5088 
5089 tree
5090 maybe_constant_value (tree t, tree decl)
5091 {
5092   tree r;
5093 
5094   if (!is_nondependent_constant_expression (t))
5095     {
5096       if (TREE_OVERFLOW_P (t))
5097 	{
5098 	  t = build_nop (TREE_TYPE (t), t);
5099 	  TREE_CONSTANT (t) = false;
5100 	}
5101       return t;
5102     }
5103   else if (CONSTANT_CLASS_P (t))
5104     /* No caching or evaluation needed.  */
5105     return t;
5106 
5107   if (cv_cache == NULL)
5108     cv_cache = hash_map<tree, tree>::create_ggc (101);
5109   if (tree *cached = cv_cache->get (t))
5110     return *cached;
5111 
5112   r = cxx_eval_outermost_constant_expr (t, true, true, decl);
5113   gcc_checking_assert (r == t
5114 		       || CONVERT_EXPR_P (t)
5115 		       || TREE_CODE (t) == VIEW_CONVERT_EXPR
5116 		       || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
5117 		       || !cp_tree_equal (r, t));
5118   cv_cache->put (t, r);
5119   return r;
5120 }
5121 
5122 /* Dispose of the whole CV_CACHE.  */
5123 
5124 static void
5125 clear_cv_cache (void)
5126 {
5127   if (cv_cache != NULL)
5128     cv_cache->empty ();
5129 }
5130 
5131 /* Dispose of the whole CV_CACHE and FOLD_CACHE.  */
5132 
5133 void
5134 clear_cv_and_fold_caches (void)
5135 {
5136   clear_cv_cache ();
5137   clear_fold_cache ();
5138 }
5139 
5140 /* Like maybe_constant_value but first fully instantiate the argument.
5141 
5142    Note: this is equivalent to instantiate_non_dependent_expr_sfinae
5143    (t, complain) followed by maybe_constant_value but is more efficient,
5144    because calls instantiation_dependent_expression_p and
5145    potential_constant_expression at most once.  */
5146 
5147 tree
5148 fold_non_dependent_expr (tree t, tsubst_flags_t complain /* = tf_none */)
5149 {
5150   if (t == NULL_TREE)
5151     return NULL_TREE;
5152 
5153   /* If we're in a template, but T isn't value dependent, simplify
5154      it.  We're supposed to treat:
5155 
5156        template <typename T> void f(T[1 + 1]);
5157        template <typename T> void f(T[2]);
5158 
5159      as two declarations of the same function, for example.  */
5160   if (processing_template_decl)
5161     {
5162       if (is_nondependent_constant_expression (t))
5163 	{
5164 	  processing_template_decl_sentinel s;
5165 	  t = instantiate_non_dependent_expr_internal (t, complain);
5166 
5167 	  if (type_unknown_p (t)
5168 	      || BRACE_ENCLOSED_INITIALIZER_P (t))
5169 	    {
5170 	      if (TREE_OVERFLOW_P (t))
5171 		{
5172 		  t = build_nop (TREE_TYPE (t), t);
5173 		  TREE_CONSTANT (t) = false;
5174 		}
5175 	      return t;
5176 	    }
5177 
5178 	  tree r = cxx_eval_outermost_constant_expr (t, true, true, NULL_TREE);
5179 	  /* cp_tree_equal looks through NOPs, so allow them.  */
5180 	  gcc_checking_assert (r == t
5181 			       || CONVERT_EXPR_P (t)
5182 			       || TREE_CODE (t) == VIEW_CONVERT_EXPR
5183 			       || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
5184 			       || !cp_tree_equal (r, t));
5185 	  return r;
5186 	}
5187       else if (TREE_OVERFLOW_P (t))
5188 	{
5189 	  t = build_nop (TREE_TYPE (t), t);
5190 	  TREE_CONSTANT (t) = false;
5191 	}
5192       return t;
5193     }
5194 
5195   return maybe_constant_value (t);
5196 }
5197 
5198 /* Like maybe_constant_value, but returns a CONSTRUCTOR directly, rather
5199    than wrapped in a TARGET_EXPR.  */
5200 
5201 static tree
5202 maybe_constant_init_1 (tree t, tree decl, bool allow_non_constant)
5203 {
5204   if (!t)
5205     return t;
5206   if (TREE_CODE (t) == EXPR_STMT)
5207     t = TREE_OPERAND (t, 0);
5208   if (TREE_CODE (t) == CONVERT_EXPR
5209       && VOID_TYPE_P (TREE_TYPE (t)))
5210     t = TREE_OPERAND (t, 0);
5211   if (TREE_CODE (t) == INIT_EXPR)
5212     t = TREE_OPERAND (t, 1);
5213   if (TREE_CODE (t) == TARGET_EXPR)
5214     t = TARGET_EXPR_INITIAL (t);
5215   if (!is_nondependent_static_init_expression (t))
5216     /* Don't try to evaluate it.  */;
5217   else if (CONSTANT_CLASS_P (t) && allow_non_constant)
5218     /* No evaluation needed.  */;
5219   else
5220     t = cxx_eval_outermost_constant_expr (t, allow_non_constant, false, decl);
5221   if (TREE_CODE (t) == TARGET_EXPR)
5222     {
5223       tree init = TARGET_EXPR_INITIAL (t);
5224       if (TREE_CODE (init) == CONSTRUCTOR)
5225 	t = init;
5226     }
5227   return t;
5228 }
5229 
5230 /* Wrapper for maybe_constant_init_1 which permits non constants.  */
5231 
5232 tree
5233 maybe_constant_init (tree t, tree decl)
5234 {
5235   return maybe_constant_init_1 (t, decl, true);
5236 }
5237 
5238 /* Wrapper for maybe_constant_init_1 which does not permit non constants.  */
5239 
5240 tree
5241 cxx_constant_init (tree t, tree decl)
5242 {
5243   return maybe_constant_init_1 (t, decl, false);
5244 }
5245 
5246 #if 0
5247 /* FIXME see ADDR_EXPR section in potential_constant_expression_1.  */
5248 /* Return true if the object referred to by REF has automatic or thread
5249    local storage.  */
5250 
5251 enum { ck_ok, ck_bad, ck_unknown };
5252 static int
5253 check_automatic_or_tls (tree ref)
5254 {
5255   machine_mode mode;
5256   poly_int64 bitsize, bitpos;
5257   tree offset;
5258   int volatilep = 0, unsignedp = 0;
5259   tree decl = get_inner_reference (ref, &bitsize, &bitpos, &offset,
5260 				   &mode, &unsignedp, &volatilep, false);
5261   duration_kind dk;
5262 
5263   /* If there isn't a decl in the middle, we don't know the linkage here,
5264      and this isn't a constant expression anyway.  */
5265   if (!DECL_P (decl))
5266     return ck_unknown;
5267   dk = decl_storage_duration (decl);
5268   return (dk == dk_auto || dk == dk_thread) ? ck_bad : ck_ok;
5269 }
5270 #endif
5271 
5272 /* Return true if T denotes a potentially constant expression.  Issue
5273    diagnostic as appropriate under control of FLAGS.  If WANT_RVAL is true,
5274    an lvalue-rvalue conversion is implied.  If NOW is true, we want to
5275    consider the expression in the current context, independent of constexpr
5276    substitution.
5277 
5278    C++0x [expr.const] used to say
5279 
5280    6 An expression is a potential constant expression if it is
5281      a constant expression where all occurrences of function
5282      parameters are replaced by arbitrary constant expressions
5283      of the appropriate type.
5284 
5285    2  A conditional expression is a constant expression unless it
5286       involves one of the following as a potentially evaluated
5287       subexpression (3.2), but subexpressions of logical AND (5.14),
5288       logical OR (5.15), and conditional (5.16) operations that are
5289       not evaluated are not considered.   */
5290 
5291 static bool
5292 potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
5293 				 tsubst_flags_t flags)
5294 {
5295 #define RECUR(T,RV) \
5296   potential_constant_expression_1 ((T), (RV), strict, now, flags)
5297 
5298   enum { any = false, rval = true };
5299   int i;
5300   tree tmp;
5301 
5302   if (t == error_mark_node)
5303     return false;
5304   if (t == NULL_TREE)
5305     return true;
5306   location_t loc = EXPR_LOC_OR_LOC (t, input_location);
5307   if (TREE_THIS_VOLATILE (t) && !DECL_P (t))
5308     {
5309       if (flags & tf_error)
5310         error_at (loc, "expression %qE has side-effects", t);
5311       return false;
5312     }
5313   if (CONSTANT_CLASS_P (t))
5314     return true;
5315   if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPED)
5316       && TREE_TYPE (t) == error_mark_node)
5317     return false;
5318 
5319   switch (TREE_CODE (t))
5320     {
5321     case FUNCTION_DECL:
5322     case BASELINK:
5323     case TEMPLATE_DECL:
5324     case OVERLOAD:
5325     case TEMPLATE_ID_EXPR:
5326     case LABEL_DECL:
5327     case LABEL_EXPR:
5328     case CASE_LABEL_EXPR:
5329     case CONST_DECL:
5330     case SIZEOF_EXPR:
5331     case ALIGNOF_EXPR:
5332     case OFFSETOF_EXPR:
5333     case NOEXCEPT_EXPR:
5334     case TEMPLATE_PARM_INDEX:
5335     case TRAIT_EXPR:
5336     case IDENTIFIER_NODE:
5337     case USERDEF_LITERAL:
5338       /* We can see a FIELD_DECL in a pointer-to-member expression.  */
5339     case FIELD_DECL:
5340     case RESULT_DECL:
5341     case USING_DECL:
5342     case USING_STMT:
5343     case PLACEHOLDER_EXPR:
5344     case BREAK_STMT:
5345     case CONTINUE_STMT:
5346     case REQUIRES_EXPR:
5347     case STATIC_ASSERT:
5348     case DEBUG_BEGIN_STMT:
5349       return true;
5350 
5351     case PARM_DECL:
5352       if (now)
5353 	{
5354 	  if (flags & tf_error)
5355 	    error ("%qE is not a constant expression", t);
5356 	  return false;
5357 	}
5358       return true;
5359 
5360     case AGGR_INIT_EXPR:
5361     case CALL_EXPR:
5362       /* -- an invocation of a function other than a constexpr function
5363             or a constexpr constructor.  */
5364       {
5365         tree fun = get_function_named_in_call (t);
5366         const int nargs = call_expr_nargs (t);
5367 	i = 0;
5368 
5369 	if (fun == NULL_TREE)
5370 	  {
5371 	    /* Reset to allow the function to continue past the end
5372 	       of the block below.  Otherwise return early.  */
5373 	    bool bail = true;
5374 
5375 	    if (TREE_CODE (t) == CALL_EXPR
5376 		&& CALL_EXPR_FN (t) == NULL_TREE)
5377 	      switch (CALL_EXPR_IFN (t))
5378 		{
5379 		/* These should be ignored, they are optimized away from
5380 		   constexpr functions.  */
5381 		case IFN_UBSAN_NULL:
5382 		case IFN_UBSAN_BOUNDS:
5383 		case IFN_UBSAN_VPTR:
5384 		case IFN_FALLTHROUGH:
5385 		  return true;
5386 
5387 		case IFN_ADD_OVERFLOW:
5388 		case IFN_SUB_OVERFLOW:
5389 		case IFN_MUL_OVERFLOW:
5390 		case IFN_LAUNDER:
5391 		  bail = false;
5392 
5393 		default:
5394 		  break;
5395 		}
5396 
5397 	    if (bail)
5398 	      {
5399 		/* fold_call_expr can't do anything with IFN calls.  */
5400 		if (flags & tf_error)
5401 		  error_at (loc, "call to internal function %qE", t);
5402 		return false;
5403 	      }
5404 	  }
5405 
5406 	if (fun && is_overloaded_fn (fun))
5407 	  {
5408 	    if (TREE_CODE (fun) == FUNCTION_DECL)
5409 	      {
5410 		if (builtin_valid_in_constant_expr_p (fun))
5411 		  return true;
5412 		if (!DECL_DECLARED_CONSTEXPR_P (fun)
5413 		    /* Allow any built-in function; if the expansion
5414 		       isn't constant, we'll deal with that then.  */
5415 		    && !is_builtin_fn (fun))
5416 		  {
5417 		    if (flags & tf_error)
5418 		      {
5419 			error_at (loc, "call to non-%<constexpr%> function %qD",
5420 				  fun);
5421 			explain_invalid_constexpr_fn (fun);
5422 		      }
5423 		    return false;
5424 		  }
5425 		/* A call to a non-static member function takes the address
5426 		   of the object as the first argument.  But in a constant
5427 		   expression the address will be folded away, so look
5428 		   through it now.  */
5429 		if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
5430 		    && !DECL_CONSTRUCTOR_P (fun))
5431 		  {
5432 		    tree x = get_nth_callarg (t, 0);
5433 		    if (is_this_parameter (x))
5434 		      return true;
5435 		    /* Don't require an immediately constant value, as
5436 		       constexpr substitution might not use the value.  */
5437 		    bool sub_now = false;
5438 		    if (!potential_constant_expression_1 (x, rval, strict,
5439 							  sub_now, flags))
5440 		      return false;
5441 		    i = 1;
5442 		  }
5443 	      }
5444 	    else
5445 	      {
5446 		if (!RECUR (fun, true))
5447 		  return false;
5448 		fun = get_first_fn (fun);
5449 	      }
5450 	    /* Skip initial arguments to base constructors.  */
5451 	    if (DECL_BASE_CONSTRUCTOR_P (fun))
5452 	      i = num_artificial_parms_for (fun);
5453 	    fun = DECL_ORIGIN (fun);
5454 	  }
5455 	else if (fun)
5456           {
5457 	    if (RECUR (fun, rval))
5458 	      /* Might end up being a constant function pointer.  */;
5459 	    else
5460 	      return false;
5461           }
5462         for (; i < nargs; ++i)
5463           {
5464             tree x = get_nth_callarg (t, i);
5465 	    /* In a template, reference arguments haven't been converted to
5466 	       REFERENCE_TYPE and we might not even know if the parameter
5467 	       is a reference, so accept lvalue constants too.  */
5468 	    bool rv = processing_template_decl ? any : rval;
5469 	    /* Don't require an immediately constant value, as constexpr
5470 	       substitution might not use the value of the argument.  */
5471 	    bool sub_now = false;
5472 	    if (!potential_constant_expression_1 (x, rv, strict,
5473 						  sub_now, flags))
5474 	      return false;
5475           }
5476         return true;
5477       }
5478 
5479     case NON_LVALUE_EXPR:
5480       /* -- an lvalue-to-rvalue conversion (4.1) unless it is applied to
5481             -- an lvalue of integral type that refers to a non-volatile
5482                const variable or static data member initialized with
5483                constant expressions, or
5484 
5485             -- an lvalue of literal type that refers to non-volatile
5486                object defined with constexpr, or that refers to a
5487                sub-object of such an object;  */
5488       return RECUR (TREE_OPERAND (t, 0), rval);
5489 
5490     case VAR_DECL:
5491       if (DECL_HAS_VALUE_EXPR_P (t))
5492 	{
5493 	  if (now && is_normal_capture_proxy (t))
5494 	    {
5495 	      /* -- in a lambda-expression, a reference to this or to a
5496 		 variable with automatic storage duration defined outside that
5497 		 lambda-expression, where the reference would be an
5498 		 odr-use.  */
5499 	      if (flags & tf_error)
5500 		{
5501 		  tree cap = DECL_CAPTURED_VARIABLE (t);
5502 		  error ("lambda capture of %qE is not a constant expression",
5503 			 cap);
5504 		  if (!want_rval && decl_constant_var_p (cap))
5505 		    inform (input_location, "because it is used as a glvalue");
5506 		}
5507 	      return false;
5508 	    }
5509 	  return RECUR (DECL_VALUE_EXPR (t), rval);
5510 	}
5511       if (want_rval
5512 	  && !var_in_maybe_constexpr_fn (t)
5513 	  && !type_dependent_expression_p (t)
5514 	  && !decl_maybe_constant_var_p (t)
5515 	  && (strict
5516 	      || !CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (t))
5517 	      || (DECL_INITIAL (t)
5518 		  && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (t)))
5519 	  && COMPLETE_TYPE_P (TREE_TYPE (t))
5520 	  && !is_really_empty_class (TREE_TYPE (t)))
5521         {
5522           if (flags & tf_error)
5523             non_const_var_error (t);
5524           return false;
5525         }
5526       return true;
5527 
5528     case NOP_EXPR:
5529     case CONVERT_EXPR:
5530     case VIEW_CONVERT_EXPR:
5531       /* -- a reinterpret_cast.  FIXME not implemented, and this rule
5532 	 may change to something more specific to type-punning (DR 1312).  */
5533       {
5534         tree from = TREE_OPERAND (t, 0);
5535 	if (POINTER_TYPE_P (TREE_TYPE (t))
5536 	    && TREE_CODE (from) == INTEGER_CST
5537 	    && !integer_zerop (from))
5538 	  {
5539 	    if (flags & tf_error)
5540 	      error_at (loc, "reinterpret_cast from integer to pointer");
5541 	    return false;
5542 	  }
5543         return (RECUR (from, TREE_CODE (t) != VIEW_CONVERT_EXPR));
5544       }
5545 
5546     case ADDRESSOF_EXPR:
5547       /* This is like ADDR_EXPR, except it won't form pointer-to-member.  */
5548       t = TREE_OPERAND (t, 0);
5549       goto handle_addr_expr;
5550 
5551     case ADDR_EXPR:
5552       /* -- a unary operator & that is applied to an lvalue that
5553             designates an object with thread or automatic storage
5554             duration;  */
5555       t = TREE_OPERAND (t, 0);
5556 
5557       if (TREE_CODE (t) == OFFSET_REF && PTRMEM_OK_P (t))
5558 	/* A pointer-to-member constant.  */
5559 	return true;
5560 
5561     handle_addr_expr:
5562 #if 0
5563       /* FIXME adjust when issue 1197 is fully resolved.  For now don't do
5564          any checking here, as we might dereference the pointer later.  If
5565          we remove this code, also remove check_automatic_or_tls.  */
5566       i = check_automatic_or_tls (t);
5567       if (i == ck_ok)
5568 	return true;
5569       if (i == ck_bad)
5570         {
5571           if (flags & tf_error)
5572             error ("address-of an object %qE with thread local or "
5573                    "automatic storage is not a constant expression", t);
5574           return false;
5575         }
5576 #endif
5577       return RECUR (t, any);
5578 
5579     case REALPART_EXPR:
5580     case IMAGPART_EXPR:
5581     case COMPONENT_REF:
5582     case BIT_FIELD_REF:
5583     case ARROW_EXPR:
5584     case OFFSET_REF:
5585       /* -- a class member access unless its postfix-expression is
5586             of literal type or of pointer to literal type.  */
5587       /* This test would be redundant, as it follows from the
5588 	 postfix-expression being a potential constant expression.  */
5589       if (type_unknown_p (t))
5590 	return true;
5591       return RECUR (TREE_OPERAND (t, 0), want_rval);
5592 
5593     case EXPR_PACK_EXPANSION:
5594       return RECUR (PACK_EXPANSION_PATTERN (t), want_rval);
5595 
5596     case INDIRECT_REF:
5597       {
5598         tree x = TREE_OPERAND (t, 0);
5599         STRIP_NOPS (x);
5600         if (is_this_parameter (x) && !is_capture_proxy (x))
5601 	  {
5602 	    if (!var_in_maybe_constexpr_fn (x))
5603 	      {
5604 		if (flags & tf_error)
5605 		  error_at (loc, "use of %<this%> in a constant expression");
5606 		return false;
5607 	      }
5608 	    return true;
5609 	  }
5610 	return RECUR (x, rval);
5611       }
5612 
5613     case STATEMENT_LIST:
5614       {
5615 	tree_stmt_iterator i;
5616 	for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
5617 	  {
5618 	    if (!RECUR (tsi_stmt (i), any))
5619 	      return false;
5620 	  }
5621 	return true;
5622       }
5623       break;
5624 
5625     case MODIFY_EXPR:
5626       if (cxx_dialect < cxx14)
5627 	goto fail;
5628       if (!RECUR (TREE_OPERAND (t, 0), any))
5629 	return false;
5630       if (!RECUR (TREE_OPERAND (t, 1), rval))
5631 	return false;
5632       return true;
5633 
5634     case MODOP_EXPR:
5635       if (cxx_dialect < cxx14)
5636 	goto fail;
5637       if (!RECUR (TREE_OPERAND (t, 0), rval))
5638 	return false;
5639       if (!RECUR (TREE_OPERAND (t, 2), rval))
5640 	return false;
5641       return true;
5642 
5643     case DO_STMT:
5644       if (!RECUR (DO_COND (t), rval))
5645 	return false;
5646       if (!RECUR (DO_BODY (t), any))
5647 	return false;
5648       return true;
5649 
5650     case FOR_STMT:
5651       if (!RECUR (FOR_INIT_STMT (t), any))
5652 	return false;
5653       if (!RECUR (FOR_COND (t), rval))
5654 	return false;
5655       if (!RECUR (FOR_EXPR (t), any))
5656 	return false;
5657       if (!RECUR (FOR_BODY (t), any))
5658 	return false;
5659       return true;
5660 
5661     case RANGE_FOR_STMT:
5662       if (!RECUR (RANGE_FOR_EXPR (t), any))
5663 	return false;
5664       if (!RECUR (RANGE_FOR_BODY (t), any))
5665 	return false;
5666       return true;
5667 
5668     case WHILE_STMT:
5669       if (!RECUR (WHILE_COND (t), rval))
5670 	return false;
5671       if (!RECUR (WHILE_BODY (t), any))
5672 	return false;
5673       return true;
5674 
5675     case SWITCH_STMT:
5676       if (!RECUR (SWITCH_STMT_COND (t), rval))
5677 	return false;
5678       /* FIXME we don't check SWITCH_STMT_BODY currently, because even
5679 	 unreachable labels would be checked.  */
5680       return true;
5681 
5682     case STMT_EXPR:
5683       return RECUR (STMT_EXPR_STMT (t), rval);
5684 
5685     case LAMBDA_EXPR:
5686       if (cxx_dialect >= cxx17)
5687 	/* In C++17 lambdas can be constexpr, don't give up yet.  */
5688 	return true;
5689       else if (flags & tf_error)
5690 	error_at (loc, "lambda-expression is not a constant expression "
5691 		  "before C++17");
5692       return false;
5693 
5694     case DYNAMIC_CAST_EXPR:
5695     case PSEUDO_DTOR_EXPR:
5696     case NEW_EXPR:
5697     case VEC_NEW_EXPR:
5698     case DELETE_EXPR:
5699     case VEC_DELETE_EXPR:
5700     case THROW_EXPR:
5701     case OMP_PARALLEL:
5702     case OMP_TASK:
5703     case OMP_FOR:
5704     case OMP_SIMD:
5705     case OMP_DISTRIBUTE:
5706     case OMP_TASKLOOP:
5707     case OMP_TEAMS:
5708     case OMP_TARGET_DATA:
5709     case OMP_TARGET:
5710     case OMP_SECTIONS:
5711     case OMP_ORDERED:
5712     case OMP_CRITICAL:
5713     case OMP_SINGLE:
5714     case OMP_SECTION:
5715     case OMP_MASTER:
5716     case OMP_TASKGROUP:
5717     case OMP_TARGET_UPDATE:
5718     case OMP_TARGET_ENTER_DATA:
5719     case OMP_TARGET_EXIT_DATA:
5720     case OMP_ATOMIC:
5721     case OMP_ATOMIC_READ:
5722     case OMP_ATOMIC_CAPTURE_OLD:
5723     case OMP_ATOMIC_CAPTURE_NEW:
5724     case OACC_PARALLEL:
5725     case OACC_KERNELS:
5726     case OACC_DATA:
5727     case OACC_HOST_DATA:
5728     case OACC_LOOP:
5729     case OACC_CACHE:
5730     case OACC_DECLARE:
5731     case OACC_ENTER_DATA:
5732     case OACC_EXIT_DATA:
5733     case OACC_UPDATE:
5734       /* GCC internal stuff.  */
5735     case VA_ARG_EXPR:
5736     case OBJ_TYPE_REF:
5737     case TRANSACTION_EXPR:
5738     case ASM_EXPR:
5739     case AT_ENCODE_EXPR:
5740     fail:
5741       if (flags & tf_error)
5742 	error_at (loc, "expression %qE is not a constant expression", t);
5743       return false;
5744 
5745     case TYPEID_EXPR:
5746       /* -- a typeid expression whose operand is of polymorphic
5747             class type;  */
5748       {
5749         tree e = TREE_OPERAND (t, 0);
5750         if (!TYPE_P (e) && !type_dependent_expression_p (e)
5751 	    && TYPE_POLYMORPHIC_P (TREE_TYPE (e)))
5752           {
5753             if (flags & tf_error)
5754               error_at (loc, "typeid-expression is not a constant expression "
5755 			"because %qE is of polymorphic type", e);
5756             return false;
5757           }
5758         return true;
5759       }
5760 
5761     case POINTER_DIFF_EXPR:
5762     case MINUS_EXPR:
5763       want_rval = true;
5764       goto binary;
5765 
5766     case LT_EXPR:
5767     case LE_EXPR:
5768     case GT_EXPR:
5769     case GE_EXPR:
5770     case EQ_EXPR:
5771     case NE_EXPR:
5772       want_rval = true;
5773       goto binary;
5774 
5775     case PREINCREMENT_EXPR:
5776     case POSTINCREMENT_EXPR:
5777     case PREDECREMENT_EXPR:
5778     case POSTDECREMENT_EXPR:
5779       if (cxx_dialect < cxx14)
5780 	goto fail;
5781       goto unary;
5782 
5783     case BIT_NOT_EXPR:
5784       /* A destructor.  */
5785       if (TYPE_P (TREE_OPERAND (t, 0)))
5786 	return true;
5787       /* fall through.  */
5788 
5789     case CONJ_EXPR:
5790     case SAVE_EXPR:
5791     case FIX_TRUNC_EXPR:
5792     case FLOAT_EXPR:
5793     case NEGATE_EXPR:
5794     case ABS_EXPR:
5795     case TRUTH_NOT_EXPR:
5796     case FIXED_CONVERT_EXPR:
5797     case UNARY_PLUS_EXPR:
5798     case UNARY_LEFT_FOLD_EXPR:
5799     case UNARY_RIGHT_FOLD_EXPR:
5800     unary:
5801       return RECUR (TREE_OPERAND (t, 0), rval);
5802 
5803     case CAST_EXPR:
5804     case CONST_CAST_EXPR:
5805     case STATIC_CAST_EXPR:
5806     case REINTERPRET_CAST_EXPR:
5807     case IMPLICIT_CONV_EXPR:
5808       if (cxx_dialect < cxx11
5809 	  && !dependent_type_p (TREE_TYPE (t))
5810 	  && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (t)))
5811 	/* In C++98, a conversion to non-integral type can't be part of a
5812 	   constant expression.  */
5813 	{
5814 	  if (flags & tf_error)
5815 	    error_at (loc,
5816 		      "cast to non-integral type %qT in a constant expression",
5817 		      TREE_TYPE (t));
5818 	  return false;
5819 	}
5820       /* This might be a conversion from a class to a (potentially) literal
5821 	 type.  Let's consider it potentially constant since the conversion
5822 	 might be a constexpr user-defined conversion.  */
5823       else if (cxx_dialect >= cxx11
5824 	       && (dependent_type_p (TREE_TYPE (t))
5825 		   || !COMPLETE_TYPE_P (TREE_TYPE (t))
5826 		   || literal_type_p (TREE_TYPE (t)))
5827 	       && TREE_OPERAND (t, 0))
5828 	{
5829 	  tree type = TREE_TYPE (TREE_OPERAND (t, 0));
5830 	  /* If this is a dependent type, it could end up being a class
5831 	     with conversions.  */
5832 	  if (type == NULL_TREE || WILDCARD_TYPE_P (type))
5833 	    return true;
5834 	  /* Or a non-dependent class which has conversions.  */
5835 	  else if (CLASS_TYPE_P (type)
5836 		   && (TYPE_HAS_CONVERSION (type) || dependent_scope_p (type)))
5837 	    return true;
5838 	}
5839 
5840       return (RECUR (TREE_OPERAND (t, 0),
5841 		     TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE));
5842 
5843     case BIND_EXPR:
5844       return RECUR (BIND_EXPR_BODY (t), want_rval);
5845 
5846     case CLEANUP_POINT_EXPR:
5847     case MUST_NOT_THROW_EXPR:
5848     case TRY_CATCH_EXPR:
5849     case TRY_BLOCK:
5850     case EH_SPEC_BLOCK:
5851     case EXPR_STMT:
5852     case PAREN_EXPR:
5853     case NON_DEPENDENT_EXPR:
5854       /* For convenience.  */
5855     case RETURN_EXPR:
5856     case LOOP_EXPR:
5857     case EXIT_EXPR:
5858       return RECUR (TREE_OPERAND (t, 0), want_rval);
5859 
5860     case DECL_EXPR:
5861       tmp = DECL_EXPR_DECL (t);
5862       if (VAR_P (tmp) && !DECL_ARTIFICIAL (tmp))
5863 	{
5864 	  if (TREE_STATIC (tmp))
5865 	    {
5866 	      if (flags & tf_error)
5867 		error_at (DECL_SOURCE_LOCATION (tmp), "%qD declared "
5868 			  "%<static%> in %<constexpr%> context", tmp);
5869 	      return false;
5870 	    }
5871 	  else if (CP_DECL_THREAD_LOCAL_P (tmp))
5872 	    {
5873 	      if (flags & tf_error)
5874 		error_at (DECL_SOURCE_LOCATION (tmp), "%qD declared "
5875 			  "%<thread_local%> in %<constexpr%> context", tmp);
5876 	      return false;
5877 	    }
5878 	  else if (!check_for_uninitialized_const_var
5879 		   (tmp, /*constexpr_context_p=*/true, flags))
5880 	    return false;
5881 	}
5882       return RECUR (tmp, want_rval);
5883 
5884     case TRY_FINALLY_EXPR:
5885       return (RECUR (TREE_OPERAND (t, 0), want_rval)
5886 	      && RECUR (TREE_OPERAND (t, 1), any));
5887 
5888     case SCOPE_REF:
5889       return RECUR (TREE_OPERAND (t, 1), want_rval);
5890 
5891     case TARGET_EXPR:
5892       if (!TARGET_EXPR_DIRECT_INIT_P (t)
5893 	  && !literal_type_p (TREE_TYPE (t)))
5894 	{
5895 	  if (flags & tf_error)
5896 	    {
5897 	      error_at (loc, "temporary of non-literal type %qT in a "
5898 			"constant expression", TREE_TYPE (t));
5899 	      explain_non_literal_class (TREE_TYPE (t));
5900 	    }
5901 	  return false;
5902 	}
5903       /* FALLTHRU */
5904     case INIT_EXPR:
5905       return RECUR (TREE_OPERAND (t, 1), rval);
5906 
5907     case CONSTRUCTOR:
5908       {
5909         vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
5910         constructor_elt *ce;
5911         for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
5912 	  if (!RECUR (ce->value, want_rval))
5913 	    return false;
5914 	return true;
5915       }
5916 
5917     case TREE_LIST:
5918       {
5919 	gcc_assert (TREE_PURPOSE (t) == NULL_TREE
5920 		    || DECL_P (TREE_PURPOSE (t)));
5921 	if (!RECUR (TREE_VALUE (t), want_rval))
5922 	  return false;
5923 	if (TREE_CHAIN (t) == NULL_TREE)
5924 	  return true;
5925 	return RECUR (TREE_CHAIN (t), want_rval);
5926       }
5927 
5928     case TRUNC_DIV_EXPR:
5929     case CEIL_DIV_EXPR:
5930     case FLOOR_DIV_EXPR:
5931     case ROUND_DIV_EXPR:
5932     case TRUNC_MOD_EXPR:
5933     case CEIL_MOD_EXPR:
5934     case ROUND_MOD_EXPR:
5935       {
5936 	tree denom = TREE_OPERAND (t, 1);
5937 	if (!RECUR (denom, rval))
5938 	  return false;
5939 	/* We can't call cxx_eval_outermost_constant_expr on an expression
5940 	   that hasn't been through instantiate_non_dependent_expr yet.  */
5941 	if (!processing_template_decl)
5942 	  denom = cxx_eval_outermost_constant_expr (denom, true);
5943 	if (integer_zerop (denom))
5944 	  {
5945 	    if (flags & tf_error)
5946 	      error ("division by zero is not a constant expression");
5947 	    return false;
5948 	  }
5949 	else
5950 	  {
5951 	    want_rval = true;
5952 	    return RECUR (TREE_OPERAND (t, 0), want_rval);
5953 	  }
5954       }
5955 
5956     case COMPOUND_EXPR:
5957       {
5958 	/* check_return_expr sometimes wraps a TARGET_EXPR in a
5959 	   COMPOUND_EXPR; don't get confused.  Also handle EMPTY_CLASS_EXPR
5960 	   introduced by build_call_a.  */
5961 	tree op0 = TREE_OPERAND (t, 0);
5962 	tree op1 = TREE_OPERAND (t, 1);
5963 	STRIP_NOPS (op1);
5964 	if ((TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
5965 	    || TREE_CODE (op1) == EMPTY_CLASS_EXPR)
5966 	  return RECUR (op0, want_rval);
5967 	else
5968 	  goto binary;
5969       }
5970 
5971       /* If the first operand is the non-short-circuit constant, look at
5972 	 the second operand; otherwise we only care about the first one for
5973 	 potentiality.  */
5974     case TRUTH_AND_EXPR:
5975     case TRUTH_ANDIF_EXPR:
5976       tmp = boolean_true_node;
5977       goto truth;
5978     case TRUTH_OR_EXPR:
5979     case TRUTH_ORIF_EXPR:
5980       tmp = boolean_false_node;
5981     truth:
5982       {
5983 	tree op = TREE_OPERAND (t, 0);
5984 	if (!RECUR (op, rval))
5985 	  return false;
5986 	if (!processing_template_decl)
5987 	  op = cxx_eval_outermost_constant_expr (op, true);
5988 	if (tree_int_cst_equal (op, tmp))
5989 	  return RECUR (TREE_OPERAND (t, 1), rval);
5990 	else
5991 	  return true;
5992       }
5993 
5994     case PLUS_EXPR:
5995     case MULT_EXPR:
5996     case POINTER_PLUS_EXPR:
5997     case RDIV_EXPR:
5998     case EXACT_DIV_EXPR:
5999     case MIN_EXPR:
6000     case MAX_EXPR:
6001     case LSHIFT_EXPR:
6002     case RSHIFT_EXPR:
6003     case LROTATE_EXPR:
6004     case RROTATE_EXPR:
6005     case BIT_IOR_EXPR:
6006     case BIT_XOR_EXPR:
6007     case BIT_AND_EXPR:
6008     case TRUTH_XOR_EXPR:
6009     case UNORDERED_EXPR:
6010     case ORDERED_EXPR:
6011     case UNLT_EXPR:
6012     case UNLE_EXPR:
6013     case UNGT_EXPR:
6014     case UNGE_EXPR:
6015     case UNEQ_EXPR:
6016     case LTGT_EXPR:
6017     case RANGE_EXPR:
6018     case COMPLEX_EXPR:
6019       want_rval = true;
6020       /* Fall through.  */
6021     case ARRAY_REF:
6022     case ARRAY_RANGE_REF:
6023     case MEMBER_REF:
6024     case DOTSTAR_EXPR:
6025     case MEM_REF:
6026     case BINARY_LEFT_FOLD_EXPR:
6027     case BINARY_RIGHT_FOLD_EXPR:
6028     binary:
6029       for (i = 0; i < 2; ++i)
6030 	if (!RECUR (TREE_OPERAND (t, i), want_rval))
6031 	  return false;
6032       return true;
6033 
6034     case FMA_EXPR:
6035     case VEC_PERM_EXPR:
6036      for (i = 0; i < 3; ++i)
6037       if (!RECUR (TREE_OPERAND (t, i), true))
6038 	return false;
6039      return true;
6040 
6041     case COND_EXPR:
6042       if (COND_EXPR_IS_VEC_DELETE (t))
6043 	{
6044 	  if (flags & tf_error)
6045 	    error_at (loc, "%<delete[]%> is not a constant expression");
6046 	  return false;
6047 	}
6048       /* Fall through.  */
6049     case IF_STMT:
6050     case VEC_COND_EXPR:
6051       /* If the condition is a known constant, we know which of the legs we
6052 	 care about; otherwise we only require that the condition and
6053 	 either of the legs be potentially constant.  */
6054       tmp = TREE_OPERAND (t, 0);
6055       if (!RECUR (tmp, rval))
6056 	return false;
6057       if (!processing_template_decl)
6058 	tmp = cxx_eval_outermost_constant_expr (tmp, true);
6059       if (integer_zerop (tmp))
6060 	return RECUR (TREE_OPERAND (t, 2), want_rval);
6061       else if (TREE_CODE (tmp) == INTEGER_CST)
6062 	return RECUR (TREE_OPERAND (t, 1), want_rval);
6063       for (i = 1; i < 3; ++i)
6064 	if (potential_constant_expression_1 (TREE_OPERAND (t, i),
6065 					     want_rval, strict, now, tf_none))
6066 	  return true;
6067       if (flags & tf_error)
6068 	error_at (loc, "expression %qE is not a constant expression", t);
6069       return false;
6070 
6071     case VEC_INIT_EXPR:
6072       if (VEC_INIT_EXPR_IS_CONSTEXPR (t))
6073 	return true;
6074       if (flags & tf_error)
6075 	{
6076 	  error_at (loc, "non-constant array initialization");
6077 	  diagnose_non_constexpr_vec_init (t);
6078 	}
6079       return false;
6080 
6081     case TYPE_DECL:
6082     case TAG_DEFN:
6083       /* We can see these in statement-expressions.  */
6084       return true;
6085 
6086     case CLEANUP_STMT:
6087     case EMPTY_CLASS_EXPR:
6088     case PREDICT_EXPR:
6089       return false;
6090 
6091     case GOTO_EXPR:
6092       {
6093 	tree *target = &TREE_OPERAND (t, 0);
6094 	/* Gotos representing break and continue are OK.  */
6095 	if (breaks (target) || continues (target))
6096 	  return true;
6097 	if (flags & tf_error)
6098 	  error_at (loc, "%<goto%> is not a constant expression");
6099 	return false;
6100       }
6101 
6102     case ANNOTATE_EXPR:
6103       return RECUR (TREE_OPERAND (t, 0), rval);
6104 
6105     default:
6106       if (objc_is_property_ref (t))
6107 	return false;
6108 
6109       sorry ("unexpected AST of kind %s", get_tree_code_name (TREE_CODE (t)));
6110       gcc_unreachable ();
6111       return false;
6112     }
6113 #undef RECUR
6114 }
6115 
6116 /* The main entry point to the above.  */
6117 
6118 bool
6119 potential_constant_expression (tree t)
6120 {
6121   return potential_constant_expression_1 (t, false, true, false, tf_none);
6122 }
6123 
6124 /* As above, but require a constant rvalue.  */
6125 
6126 bool
6127 potential_rvalue_constant_expression (tree t)
6128 {
6129   return potential_constant_expression_1 (t, true, true, false, tf_none);
6130 }
6131 
6132 /* Like above, but complain about non-constant expressions.  */
6133 
6134 bool
6135 require_potential_constant_expression (tree t)
6136 {
6137   return potential_constant_expression_1 (t, false, true, false,
6138 					  tf_warning_or_error);
6139 }
6140 
6141 /* Cross product of the above.  */
6142 
6143 bool
6144 require_potential_rvalue_constant_expression (tree t)
6145 {
6146   return potential_constant_expression_1 (t, true, true, false,
6147 					  tf_warning_or_error);
6148 }
6149 
6150 /* Like above, but don't consider PARM_DECL a potential_constant_expression.  */
6151 
6152 bool
6153 require_rvalue_constant_expression (tree t)
6154 {
6155   return potential_constant_expression_1 (t, true, true, true,
6156 					  tf_warning_or_error);
6157 }
6158 
6159 /* Like potential_constant_expression, but don't consider possible constexpr
6160    substitution of the current function.  That is, PARM_DECL qualifies under
6161    potential_constant_expression, but not here.
6162 
6163    This is basically what you can check when any actual constant values might
6164    be value-dependent.  */
6165 
6166 bool
6167 is_constant_expression (tree t)
6168 {
6169   return potential_constant_expression_1 (t, false, true, true, tf_none);
6170 }
6171 
6172 /* Like above, but complain about non-constant expressions.  */
6173 
6174 bool
6175 require_constant_expression (tree t)
6176 {
6177   return potential_constant_expression_1 (t, false, true, true,
6178 					  tf_warning_or_error);
6179 }
6180 
6181 /* Like is_constant_expression, but allow const variables that are not allowed
6182    under constexpr rules.  */
6183 
6184 bool
6185 is_static_init_expression (tree t)
6186 {
6187   return potential_constant_expression_1 (t, false, false, true, tf_none);
6188 }
6189 
6190 /* Returns true if T is a potential constant expression that is not
6191    instantiation-dependent, and therefore a candidate for constant folding even
6192    in a template.  */
6193 
6194 bool
6195 is_nondependent_constant_expression (tree t)
6196 {
6197   return (!type_unknown_p (t)
6198 	  && !BRACE_ENCLOSED_INITIALIZER_P (t)
6199 	  && is_constant_expression (t)
6200 	  && !instantiation_dependent_expression_p (t));
6201 }
6202 
6203 /* Returns true if T is a potential static initializer expression that is not
6204    instantiation-dependent.  */
6205 
6206 bool
6207 is_nondependent_static_init_expression (tree t)
6208 {
6209   return (!type_unknown_p (t)
6210 	  && !BRACE_ENCLOSED_INITIALIZER_P (t)
6211 	  && is_static_init_expression (t)
6212 	  && !instantiation_dependent_expression_p (t));
6213 }
6214 
6215 /* Finalize constexpr processing after parsing.  */
6216 
6217 void
6218 fini_constexpr (void)
6219 {
6220   /* The contexpr call and fundef copies tables are no longer needed.  */
6221   constexpr_call_table = NULL;
6222   fundef_copies_table = NULL;
6223 }
6224 
6225 #include "gt-cp-constexpr.h"
6226