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