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