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