]> gcc.gnu.org Git - gcc.git/blame - gcc/cp/constexpr.c
Fix test that gets skipped as unsupported
[gcc.git] / gcc / cp / constexpr.c
CommitLineData
13f649f6
JM
1/* Perform -*- C++ -*- constant expression evaluation, including calls to
2 constexpr functions. These routines are used both during actual parsing
2d76680f
PC
3 and during the instantiation of template functions.
4
a5544970 5 Copyright (C) 1998-2019 Free Software Foundation, Inc.
2d76680f
PC
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GCC is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
22
23#include "config.h"
24#include "system.h"
25#include "coretypes.h"
2d76680f 26#include "cp-tree.h"
2adfab87 27#include "varasm.h"
2d76680f
PC
28#include "c-family/c-objc.h"
29#include "tree-iterator.h"
30#include "gimplify.h"
31#include "builtins.h"
60813a46 32#include "tree-inline.h"
0b274c17 33#include "ubsan.h"
44a845ca 34#include "gimple-fold.h"
8108ea30 35#include "timevar.h"
d8fcab68 36#include "fold-const-call.h"
2d76680f
PC
37
38static bool verify_constant (tree, bool, bool *, bool *);
39#define VERIFY_CONSTANT(X) \
40do { \
2b3ab879 41 if (verify_constant ((X), ctx->quiet, non_constant_p, overflow_p)) \
2d76680f
PC
42 return t; \
43 } while (0)
44
582d2481
JJ
45static HOST_WIDE_INT find_array_ctor_elt (tree ary, tree dindex,
46 bool insert = false);
47
2d76680f
PC
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)
b55b02ea 66 || VECTOR_TYPE_P (t)
9f613f06 67 || TYPE_REF_P (t)
e42c407c 68 || (VOID_TYPE_P (t) && cxx_dialect >= cxx14))
2d76680f
PC
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
9638f320
PC
82 be literal. Return error_mark_node if we give an error, the
83 DECL otherwise. */
2d76680f
PC
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. */;
683be2f7
JM
98 else if (type_uses_auto (type))
99 /* We don't know the actual type yet. */;
2d76680f
PC
100 else if (!literal_type_p (type))
101 {
102 if (DECL_DECLARED_CONSTEXPR_P (decl))
f1eac182 103 {
097f82ec 104 auto_diagnostic_group d;
f2935576
PC
105 error_at (DECL_SOURCE_LOCATION (decl),
106 "the type %qT of %<constexpr%> variable %qD "
107 "is not literal", type, decl);
f1eac182 108 explain_non_literal_class (type);
9638f320 109 decl = error_mark_node;
f1eac182 110 }
2d76680f 111 else
60813a46 112 {
5d4e573b 113 if (!is_instantiation_of_constexpr (current_function_decl))
f1eac182 114 {
097f82ec 115 auto_diagnostic_group d;
f2935576
PC
116 error_at (DECL_SOURCE_LOCATION (decl),
117 "variable %qD of non-literal type %qT in "
118 "%<constexpr%> function", decl, type);
f1eac182 119 explain_non_literal_class (type);
9638f320 120 decl = error_mark_node;
f1eac182 121 }
60813a46
JM
122 cp_function_chain->invalid_constexpr = true;
123 }
2d76680f 124 }
8e9589bd
JM
125 else if (DECL_DECLARED_CONSTEXPR_P (decl)
126 && variably_modified_type_p (type, NULL_TREE))
127 {
f2935576
PC
128 error_at (DECL_SOURCE_LOCATION (decl),
129 "%<constexpr%> variable %qD has variably-modified "
130 "type %qT", decl, type);
8e9589bd
JM
131 decl = error_mark_node;
132 }
2d76680f
PC
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;
43574e4f
JJ
142 tree parms;
143 tree result;
2d76680f
PC
144};
145
ca752f39 146struct constexpr_fundef_hasher : ggc_ptr_hash<constexpr_fundef>
2d76680f
PC
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{
2d76680f
PC
181 if (constexpr_fundef_table == NULL)
182 return NULL;
183
43574e4f 184 constexpr_fundef fundef = { fun, NULL, NULL, NULL };
2d76680f
PC
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
98e5a19a 191bool
2d76680f
PC
192is_valid_constexpr_fn (tree fun, bool complain)
193{
194 bool ret = true;
195
31f7f784 196 if (DECL_INHERITED_CTOR (fun)
2d76680f
PC
197 && TREE_CODE (fun) == TEMPLATE_DECL)
198 {
199 ret = false;
200 if (complain)
84fa214d 201 error ("inherited constructor %qD is not %<constexpr%>",
31f7f784 202 DECL_INHERITED_CTOR (fun));
2d76680f
PC
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 {
097f82ec 213 auto_diagnostic_group d;
84fa214d 214 error ("invalid type for parameter %d of %<constexpr%> "
2d76680f
PC
215 "function %q+#D", DECL_PARM_INDEX (parm), fun);
216 explain_non_literal_class (TREE_TYPE (parm));
217 }
218 }
219 }
220
e1bea341
JM
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),
84fa214d 226 "lambdas are implicitly %<constexpr%> only in C++17 and later");
e1bea341
JM
227 }
228 else if (!DECL_CONSTRUCTOR_P (fun))
2d76680f
PC
229 {
230 tree rettype = TREE_TYPE (TREE_TYPE (fun));
231 if (!literal_type_p (rettype))
232 {
233 ret = false;
234 if (complain)
235 {
097f82ec 236 auto_diagnostic_group d;
84fa214d 237 error ("invalid return type %qT of %<constexpr%> function %q+D",
2d76680f
PC
238 rettype, fun);
239 explain_non_literal_class (rettype);
240 }
241 }
242
54069e59
JM
243 /* C++14 DR 1684 removed this restriction. */
244 if (cxx_dialect < cxx14
245 && DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
2d76680f
PC
246 && !CLASSTYPE_LITERAL_P (DECL_CONTEXT (fun)))
247 {
248 ret = false;
097f82ec
DM
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 }
2d76680f
PC
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
60813a46
JM
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))
2d76680f
PC
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 {
60813a46
JM
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;
2d76680f
PC
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);
2d76680f 382 else
60813a46
JM
383 /* Don't add anything else to the CONSTRUCTOR. */
384 return true;
2d76680f
PC
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);
8cb7aaa1
JM
418 if (TREE_CODE (aggr) == VAR_DECL)
419 /* Initializing a local variable, don't add anything. */
420 return true;
2d76680f
PC
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
49b5925f
JM
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);
2d76680f
PC
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
2d76680f
PC
451 for (tree var = BIND_EXPR_VARS (t); var; var = DECL_CHAIN (var))
452 if (TREE_CODE (var) == TYPE_DECL
4414e22e
PC
453 && DECL_IMPLICIT_TYPEDEF_P (var)
454 && !LAMBDA_TYPE_P (TREE_TYPE (var)))
2d76680f
PC
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:
a0008434
MP
467 if (TREE_CODE (DECL_EXPR_DECL (list)) == USING_DECL
468 || TREE_CODE (DECL_EXPR_DECL (list)) == TYPE_DECL)
2d76680f 469 return true;
2d76680f
PC
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:
96a95ac1 485 case DEBUG_BEGIN_STMT:
2d76680f
PC
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{
60813a46
JM
499 /* C++14 doesn't require a constexpr ctor to have an empty body. */
500 if (cxx_dialect >= cxx14)
501 return true;
502
2d76680f
PC
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)
84fa214d 525 error ("%<constexpr%> constructor does not have empty body");
2d76680f
PC
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;
fa837fb6
JM
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 ();
58cc255c 602 }
fa837fb6 603 found:
1259cb6d
JJ
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 }
2d76680f
PC
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 }
2d76680f
PC
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
1b6fa695
ML
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
2d76680f
PC
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
5afef8b1 678tree
2d76680f
PC
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:
0162cb3b
PC
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 }
2d76680f
PC
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:
96a95ac1 725 case DEBUG_BEGIN_STMT:
2d76680f
PC
726 return NULL_TREE;
727
1b6fa695
ML
728 case CALL_EXPR:
729 {
730 tree fun = get_function_named_in_call (body);
731 if (fun != NULL_TREE
3d78e008 732 && fndecl_built_in_p (fun, BUILT_IN_UNREACHABLE))
1b6fa695
ML
733 return NULL_TREE;
734 }
735 /* Fallthru. */
736
2d76680f
PC
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);
60813a46 752 else if (cxx_dialect < cxx14)
2d76680f
PC
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
3e4b91f2
NS
763/* CTYPE is a type constructed from BODY. Return true if some
764 bases/fields are uninitialized, and complain if COMPLAIN. */
2d76680f
PC
765
766static bool
3e4b91f2 767cx_check_missing_mem_inits (tree ctype, tree body, bool complain)
2d76680f 768{
3e4b91f2
NS
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);
2d76680f
PC
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
3e4b91f2
NS
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)
2d76680f 795 {
3e4b91f2
NS
796 tree index = NULL_TREE;
797 if (i < nelts)
2d76680f
PC
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 }
3e4b91f2 805
2d76680f
PC
806 for (; field != index; field = DECL_CHAIN (field))
807 {
808 tree ftype;
3e4b91f2
NS
809 if (TREE_CODE (field) != FIELD_DECL)
810 continue;
7c30b12a 811 if (DECL_UNNAMED_BIT_FIELD (field))
2d76680f 812 continue;
3e4b91f2
NS
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 }
2d76680f
PC
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;
097f82ec 836 auto_diagnostic_group d;
b8cd3996
JM
837 error ("member %qD must be initialized by mem-initializer "
838 "in %<constexpr%> constructor", field);
839 inform (DECL_SOURCE_LOCATION (field), "declared here");
2d76680f
PC
840 bad = true;
841 }
842 if (field == NULL_TREE)
843 break;
3e4b91f2
NS
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 }
2d76680f
PC
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
ca30abcd
JM
874 tree massaged = massage_constexpr_body (fun, body);
875 if (massaged == NULL_TREE || massaged == error_mark_node)
2d76680f
PC
876 {
877 if (!DECL_CONSTRUCTOR_P (fun))
84fa214d
ML
878 error ("body of %<constexpr%> function %qD not a return-statement",
879 fun);
2d76680f
PC
880 return NULL;
881 }
882
ca30abcd 883 if (!potential_rvalue_constant_expression (massaged))
2d76680f
PC
884 {
885 if (!DECL_GENERATED_P (fun))
ca30abcd 886 require_potential_rvalue_constant_expression (massaged);
2d76680f
PC
887 return NULL;
888 }
889
890 if (DECL_CONSTRUCTOR_P (fun)
3e4b91f2
NS
891 && cx_check_missing_mem_inits (DECL_CONTEXT (fun),
892 massaged, !DECL_GENERATED_P (fun)))
2d76680f
PC
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;
43574e4f
JJ
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;
2d76680f 911 slot = constexpr_fundef_table->find_slot (&entry, INSERT);
43574e4f
JJ
912 if (clear_ctx)
913 DECL_CONTEXT (DECL_RESULT (fun)) = NULL_TREE;
2d76680f
PC
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;
98e5a19a 932 /* Only diagnose defaulted functions, lambdas, or instantiations. */
2d76680f 933 if (!DECL_DEFAULTED_FN (fun)
98e5a19a 934 && !LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun))
2d76680f
PC
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;
98e5a19a
JM
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,
84fa214d 950 "%qD is not usable as a %<constexpr%> function because:", fun);
98e5a19a 951 }
2d76680f
PC
952 /* First check the declaration. */
953 if (is_valid_constexpr_fn (fun, true))
954 {
955 /* Then if it's OK, the body. */
98e5a19a
JM
956 if (!DECL_DECLARED_CONSTEXPR_P (fun)
957 && !LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun)))
2d76680f
PC
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))
3e4b91f2 964 cx_check_missing_mem_inits (DECL_CONTEXT (fun), body, true);
2d76680f
PC
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;
cce3ae91 992 /* Whether __builtin_is_constant_evaluated() should evaluate to true. */
13de99bc 993 bool manifestly_const_eval;
2d76680f
PC
994};
995
ca752f39 996struct constexpr_call_hasher : ggc_ptr_hash<constexpr_call>
2d76680f
PC
997{
998 static hashval_t hash (constexpr_call *);
999 static bool equal (constexpr_call *, constexpr_call *);
3e605b20
JM
1000};
1001
4b390698
JJ
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
3e605b20
JM
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 {
13f649f6 1020 /* The innermost call we're evaluating. */
3e605b20 1021 constexpr_call *call;
13f649f6
JM
1022 /* Values for any temporaries or local variables within the
1023 constant-expression. */
3e605b20 1024 hash_map<tree,tree> *values;
39dce2b7
JM
1025 /* SAVE_EXPRs that we've seen within the current LOOP_EXPR. NULL if we
1026 aren't inside a loop. */
0ee28590 1027 vec<tree> *save_exprs;
13f649f6
JM
1028 /* The CONSTRUCTOR we're currently building up for an aggregate
1029 initializer. */
3e605b20 1030 tree ctor;
13f649f6 1031 /* The object we're building the CONSTRUCTOR for. */
3e605b20 1032 tree object;
4b390698
JJ
1033 /* If inside SWITCH_EXPR. */
1034 constexpr_switch_state *css_state;
a15ffa22
JJ
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
13f649f6 1040 /* Whether we should error on a non-constant expression or fail quietly. */
2b3ab879 1041 bool quiet;
13f649f6
JM
1042 /* Whether we are strictly conforming to constant expression rules or
1043 trying harder to get a constant value. */
69eb4fde 1044 bool strict;
e4082611 1045 /* Whether __builtin_is_constant_evaluated () should be true. */
13de99bc 1046 bool manifestly_const_eval;
3e605b20 1047};
2d76680f
PC
1048
1049/* A table of all constexpr calls that have been evaluated by the
1050 compiler in this translation unit. */
1051
97f3003f 1052static GTY (()) hash_table<constexpr_call_hasher> *constexpr_call_table;
2d76680f 1053
3e605b20 1054static tree cxx_eval_constant_expression (const constexpr_ctx *, tree,
5a804683 1055 bool, bool *, bool *, tree * = NULL);
2d76680f
PC
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)
46cf7fa1
JJ
1075 return true;
1076 if (lhs->hash != rhs->hash)
1077 return false;
13de99bc 1078 if (lhs->manifestly_const_eval != rhs->manifestly_const_eval)
cce3ae91 1079 return false;
2d76680f 1080 if (!constexpr_fundef_hasher::equal (lhs->fundef, rhs->fundef))
46cf7fa1 1081 return false;
2d76680f
PC
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);
47be9509 1088 gcc_assert (same_type_p (TREE_TYPE (lhs_arg), TREE_TYPE (rhs_arg)));
2d76680f 1089 if (!cp_tree_equal (lhs_arg, rhs_arg))
46cf7fa1 1090 return false;
2d76680f
PC
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
c0daf32d
PP
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
97f3003f
JM
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.
c0daf32d 1115
97f3003f 1116 This is not GC-deletable to avoid GC affecting UID generation. */
c0daf32d 1117
97f3003f 1118static GTY(()) hash_map<tree, tree> *fundef_copies_table;
c0daf32d
PP
1119
1120/* Initialize FUNDEF_COPIES_TABLE if it's not initialized. */
1121
1122static void
1123maybe_initialize_fundef_copies_table ()
1124{
97f3003f
JM
1125 if (fundef_copies_table == NULL)
1126 fundef_copies_table = hash_map<tree,tree>::create_ggc (101);
c0daf32d
PP
1127}
1128
1129/* Reuse a copy or create a new unshared copy of the function FUN.
3c98ff9b
NS
1130 Return this copy. We use a TREE_LIST whose PURPOSE is body, VALUE
1131 is parms, TYPE is result. */
c0daf32d 1132
97f3003f 1133static tree
43574e4f 1134get_fundef_copy (constexpr_fundef *fundef)
c0daf32d
PP
1135{
1136 maybe_initialize_fundef_copies_table ();
1137
97f3003f 1138 tree copy;
3c98ff9b 1139 bool existed;
43574e4f 1140 tree *slot = &fundef_copies_table->get_or_insert (fundef->decl, &existed);
3c98ff9b
NS
1141
1142 if (!existed)
c0daf32d 1143 {
3c98ff9b
NS
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. */
43574e4f
JJ
1147 copy = build_tree_list (fundef->body, fundef->parms);
1148 TREE_TYPE (copy) = fundef->result;
3c98ff9b
NS
1149 }
1150 else if (*slot == NULL_TREE)
1151 {
1152 /* We've already used the function itself, so make a copy. */
97f3003f 1153 copy = build_tree_list (NULL, NULL);
43574e4f
JJ
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;
c0daf32d
PP
1168 }
1169 else
1170 {
3c98ff9b 1171 /* We have a cached function available. */
c0daf32d 1172 copy = *slot;
97f3003f 1173 *slot = TREE_CHAIN (copy);
c0daf32d
PP
1174 }
1175
1176 return copy;
1177}
1178
3c98ff9b
NS
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. */
c0daf32d
PP
1182
1183static void
97f3003f 1184save_fundef_copy (tree fun, tree copy)
c0daf32d 1185{
3c98ff9b 1186 tree *slot = fundef_copies_table->get (fun);
97f3003f 1187 TREE_CHAIN (copy) = *slot;
c0daf32d
PP
1188 *slot = copy;
1189}
1190
2d76680f
PC
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
2d76680f
PC
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
5756d0f9 1216cxx_eval_builtin_function_call (const constexpr_ctx *ctx, tree t, tree fun,
92a596e8 1217 bool lval,
2d76680f
PC
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;
5756d0f9
JM
1224
1225 /* Don't fold __builtin_constant_p within a constexpr function. */
e4082611 1226 bool bi_const_p = DECL_IS_BUILTIN_CONSTANT_P (fun);
b925d25d 1227
fe736ffd
JM
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. */
b925d25d 1230 if (bi_const_p
4cd3e7df 1231 && !ctx->manifestly_const_eval
5756d0f9
JM
1232 && current_function_decl
1233 && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
2d76680f 1234 {
5756d0f9
JM
1235 *non_constant_p = true;
1236 return t;
2d76680f 1237 }
5756d0f9 1238
e4082611 1239 /* For __builtin_is_constant_evaluated, defer it if not
13de99bc 1240 ctx->manifestly_const_eval, otherwise fold it to true. */
3d78e008 1241 if (fndecl_built_in_p (fun, CP_BUILT_IN_IS_CONSTANT_EVALUATED,
13de99bc 1242 BUILT_IN_FRONTEND))
e4082611 1243 {
13de99bc 1244 if (!ctx->manifestly_const_eval)
e4082611
JJ
1245 {
1246 *non_constant_p = true;
1247 return t;
1248 }
1249 return boolean_true_node;
1250 }
1251
5756d0f9
JM
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;
5756d0f9 1256 for (i = 0; i < nargs; ++i)
b925d25d 1257 {
2ff7172a
JJ
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]))
4cd3e7df
JJ
1264 {
1265 bool dummy1 = false, dummy2 = false;
1266 args[i] = cxx_eval_constant_expression (&new_ctx, args[i], false,
1267 &dummy1, &dummy2);
1268 }
1269
b925d25d 1270 if (bi_const_p)
4cd3e7df 1271 /* For __builtin_constant_p, fold all expressions with constant values
b925d25d 1272 even if they aren't C++ constant-expressions. */
4cd3e7df 1273 args[i] = cp_fold_rvalue (args[i]);
b925d25d 1274 }
5756d0f9
JM
1275
1276 bool save_ffbcp = force_folding_builtin_constant_p;
1277 force_folding_builtin_constant_p = true;
43574e4f
JJ
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;
109d2197
JJ
1284 new_call = fold_builtin_call_array (EXPR_LOCATION (t), TREE_TYPE (t),
1285 CALL_EXPR_FN (t), nargs, args);
43574e4f 1286 current_function_decl = save_cur_fn;
5756d0f9 1287 force_folding_builtin_constant_p = save_ffbcp;
109d2197
JJ
1288 if (new_call == NULL)
1289 {
1290 if (!*non_constant_p && !ctx->quiet)
1291 {
1b6fa695
ML
1292 /* Do not allow__builtin_unreachable in constexpr function.
1293 The __builtin_unreachable call with BUILTINS_LOCATION
1294 comes from cp_maybe_instrument_return. */
3d78e008 1295 if (fndecl_built_in_p (fun, BUILT_IN_UNREACHABLE)
1b6fa695 1296 && EXPR_LOCATION (t) == BUILTINS_LOCATION)
84fa214d 1297 error ("%<constexpr%> call flows off the end of the function");
1b6fa695
ML
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 }
109d2197
JJ
1304 }
1305 *non_constant_p = true;
1306 return t;
1307 }
1308
43574e4f 1309 if (!potential_constant_expression (new_call))
109d2197
JJ
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);
2d76680f
PC
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{
47be9509 1327 if (same_type_p (TREE_TYPE (temp), type))
2d76680f
PC
1328 return temp;
1329 /* Avoid wrapping an aggregate value in a NOP_EXPR. */
1330 if (TREE_CODE (temp) == CONSTRUCTOR)
b27f74e7
MP
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 }
ff8ba86f
JJ
1337 if (TREE_CODE (temp) == EMPTY_CLASS_EXPR)
1338 return build0 (EMPTY_CLASS_EXPR, type);
2d76680f
PC
1339 gcc_assert (scalarish_type_p (type));
1340 return cp_fold_convert (type, temp);
1341}
1342
0146e25f
PP
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
1f6857ba 1358tree
0146e25f
PP
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
2d76680f
PC
1367/* Subroutine of cxx_eval_call_expression.
1368 We are processing a call expression (either CALL_EXPR or
3e605b20 1369 AGGR_INIT_EXPR) in the context of CTX. Evaluate
2d76680f
PC
1370 all arguments and bind their values to correspondings
1371 parameters, making up the NEW_CALL context. */
1372
1373static void
3e605b20 1374cxx_bind_parameters_in_call (const constexpr_ctx *ctx, tree t,
2d76680f 1375 constexpr_call *new_call,
12d9ce19
JM
1376 bool *non_constant_p, bool *overflow_p,
1377 bool *non_constant_args)
2d76680f
PC
1378{
1379 const int nargs = call_expr_nargs (t);
1380 tree fun = new_call->fundef->decl;
43574e4f 1381 tree parms = new_call->fundef->parms;
2d76680f 1382 int i;
60813a46 1383 tree *p = &new_call->bindings;
2d76680f
PC
1384 for (i = 0; i < nargs; ++i)
1385 {
1386 tree x, arg;
1387 tree type = parms ? TREE_TYPE (parms) : void_type_node;
2d76680f 1388 x = get_nth_callarg (t, i);
3e605b20
JM
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
60813a46 1391 which case we get the real argument from ctx. */
3e605b20
JM
1392 if (i == 0 && DECL_CONSTRUCTOR_P (fun)
1393 && is_dummy_object (x))
1394 {
1395 x = ctx->object;
84dd815f 1396 x = build_address (x);
3e605b20 1397 }
43574e4f
JJ
1398 if (TREE_ADDRESSABLE (type))
1399 /* Undo convert_for_arg_passing work here. */
1400 x = convert_from_reference (x);
0e038601 1401 arg = cxx_eval_constant_expression (ctx, x, /*lval=*/false,
5a804683 1402 non_constant_p, overflow_p);
2d76680f 1403 /* Don't VERIFY_CONSTANT here. */
2b3ab879 1404 if (*non_constant_p && ctx->quiet)
2d76680f
PC
1405 return;
1406 /* Just discard ellipsis args after checking their constantitude. */
1407 if (!parms)
1408 continue;
4727d4c6
NS
1409
1410 if (!*non_constant_p)
1411 {
1dc23505
MP
1412 /* Don't share a CONSTRUCTOR that might be changed. */
1413 arg = unshare_constructor (arg);
4727d4c6
NS
1414 /* Make sure the binding has the same type as the parm. But
1415 only for constant args. */
9f613f06 1416 if (!TYPE_REF_P (type))
4727d4c6
NS
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 }
2d76680f
PC
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. */
7de76362 1431static vec<tree> call_stack;
2d76680f
PC
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
44a845ca
MS
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:
81fea426 1481 case IFN_FALLTHROUGH:
44a845ca
MS
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
e16f1cc7
JJ
1494 case IFN_LAUNDER:
1495 return cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 0),
1496 false, non_constant_p, overflow_p);
1497
d8fcab68
JJ
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
44a845ca
MS
1512 default:
1513 if (!ctx->quiet)
6bdfada4 1514 error_at (cp_expr_loc_or_loc (t, input_location),
44a845ca
MS
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 {
6bdfada4 1529 location_t loc = cp_expr_loc_or_loc (t, input_location);
44a845ca
MS
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
e8c48716 1547/* Clean CONSTRUCTOR_NO_CLEARING from CTOR and its sub-aggregates. */
ecc57615
JM
1548
1549static void
1550clear_no_implicit_zero (tree ctor)
1551{
e8c48716 1552 if (CONSTRUCTOR_NO_CLEARING (ctor))
ecc57615 1553 {
e8c48716 1554 CONSTRUCTOR_NO_CLEARING (ctor) = false;
ecc57615
JM
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
2d76680f
PC
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
3e605b20 1567cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
92a596e8 1568 bool lval,
2d76680f
PC
1569 bool *non_constant_p, bool *overflow_p)
1570{
6bdfada4 1571 location_t loc = cp_expr_loc_or_loc (t, input_location);
2d76680f 1572 tree fun = get_function_named_in_call (t);
cce3ae91 1573 constexpr_call new_call
13de99bc 1574 = { NULL, NULL, NULL, 0, ctx->manifestly_const_eval };
2d76680f
PC
1575 bool depth_ok;
1576
0b274c17 1577 if (fun == NULL_TREE)
44a845ca
MS
1578 return cxx_eval_internal_function (ctx, t, lval,
1579 non_constant_p, overflow_p);
0b274c17 1580
2d76680f
PC
1581 if (TREE_CODE (fun) != FUNCTION_DECL)
1582 {
1583 /* Might be a constexpr function pointer. */
2b3ab879 1584 fun = cxx_eval_constant_expression (ctx, fun,
92a596e8 1585 /*lval*/false, non_constant_p,
5a804683 1586 overflow_p);
2d76680f
PC
1587 STRIP_NOPS (fun);
1588 if (TREE_CODE (fun) == ADDR_EXPR)
1589 fun = TREE_OPERAND (fun, 0);
582d2481
JJ
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 }
2d76680f
PC
1620 }
1621 if (TREE_CODE (fun) != FUNCTION_DECL)
1622 {
2b3ab879 1623 if (!ctx->quiet && !*non_constant_p)
84fa214d 1624 error_at (loc, "expression %qE does not designate a %<constexpr%> "
2d76680f
PC
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);
0b274c17
MP
1631
1632 if (is_ubsan_builtin_p (fun))
1633 return void_node;
1634
3d78e008 1635 if (fndecl_built_in_p (fun))
5756d0f9 1636 return cxx_eval_builtin_function_call (ctx, t, fun,
92a596e8 1637 lval, non_constant_p, overflow_p);
2d76680f
PC
1638 if (!DECL_DECLARED_CONSTEXPR_P (fun))
1639 {
2b3ab879 1640 if (!ctx->quiet)
2d76680f 1641 {
11399477 1642 if (!lambda_static_thunk_p (fun))
84fa214d 1643 error_at (loc, "call to non-%<constexpr%> function %qD", fun);
2d76680f
PC
1644 explain_invalid_constexpr_fn (fun);
1645 }
1646 *non_constant_p = true;
1647 return t;
1648 }
1649
86461cad
JM
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);
e8c48716 1658 CONSTRUCTOR_NO_CLEARING (ctor) = true;
86461cad
JM
1659 ctx->values->put (new_ctx.object, ctor);
1660 ctx = &new_ctx;
1661 }
1662
2d76680f
PC
1663 /* Shortcut trivial constructor/op=. */
1664 if (trivial_fn_p (fun))
1665 {
86461cad 1666 tree init = NULL_TREE;
2d76680f 1667 if (call_expr_nargs (t) == 2)
86461cad 1668 init = convert_from_reference (get_nth_callarg (t, 1));
2d76680f
PC
1669 else if (TREE_CODE (t) == AGGR_INIT_EXPR
1670 && AGGR_INIT_ZERO_FIRST (t))
86461cad
JM
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);
c8816908
JM
1680 new_ctx.call = &new_call;
1681 return cxx_eval_constant_expression (&new_ctx, set, lval,
86461cad
JM
1682 non_constant_p, overflow_p);
1683 }
2d76680f
PC
1684 }
1685
81371eff
JM
1686 /* We can't defer instantiating the function any longer. */
1687 if (!DECL_INITIAL (fun)
1688 && DECL_TEMPLOID_INSTANTIATION (fun))
1689 {
f065303f
JM
1690 location_t save_loc = input_location;
1691 input_location = loc;
81371eff
JM
1692 ++function_depth;
1693 instantiate_decl (fun, /*defer_ok*/false, /*expl_inst*/false);
1694 --function_depth;
f065303f 1695 input_location = save_loc;
81371eff
JM
1696 }
1697
2d76680f 1698 /* If in direct recursive call, optimize definition search. */
c8816908 1699 if (ctx && ctx->call && ctx->call->fundef && ctx->call->fundef->decl == fun)
3e605b20 1700 new_call.fundef = ctx->call->fundef;
2d76680f
PC
1701 else
1702 {
1703 new_call.fundef = retrieve_constexpr_fundef (fun);
4ddcdbf9
JM
1704 if (new_call.fundef == NULL || new_call.fundef->body == NULL
1705 || fun == current_function_decl)
2d76680f 1706 {
2b3ab879 1707 if (!ctx->quiet)
2d76680f 1708 {
4ddcdbf9
JM
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)
ddd6d421
JM
1715 error_at (loc, "%qD called in a constant expression before its "
1716 "definition is complete", fun);
1717 else if (DECL_INITIAL (fun))
2d76680f 1718 {
98e5a19a
JM
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);
2d76680f
PC
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 }
60813a46 1732
12d9ce19 1733 bool non_constant_args = false;
3e605b20 1734 cxx_bind_parameters_in_call (ctx, t, &new_call,
12d9ce19 1735 non_constant_p, overflow_p, &non_constant_args);
ecdcd560
JM
1736
1737 /* We build up the bindings list before we know whether we already have this
1738 call cached. If we don't end up saving these bindings, ggc_free them when
1739 this function exits. */
1740 struct free_bindings
1741 {
1742 tree &bindings;
1743 bool do_free;
1744 free_bindings (tree &b): bindings (b), do_free(true) { }
1745 void preserve () { do_free = false; }
1746 ~free_bindings () {
1747 if (do_free)
1748 {
1749 while (bindings)
1750 {
1751 tree b = bindings;
1752 bindings = TREE_CHAIN (bindings);
1753 ggc_free (b);
1754 }
1755 }
1756 }
1757 } fb (new_call.bindings);
1758
2d76680f
PC
1759 if (*non_constant_p)
1760 return t;
1761
1762 depth_ok = push_cx_call_context (t);
1763
12d9ce19 1764 tree result = NULL_TREE;
2d76680f 1765
12d9ce19 1766 constexpr_call *entry = NULL;
4a58d2fe 1767 if (depth_ok && !non_constant_args && ctx->strict)
2d76680f 1768 {
cce3ae91
JJ
1769 new_call.hash = constexpr_fundef_hasher::hash (new_call.fundef);
1770 new_call.hash
1771 = iterative_hash_template_arg (new_call.bindings, new_call.hash);
1772 new_call.hash
13de99bc 1773 = iterative_hash_object (ctx->manifestly_const_eval, new_call.hash);
12d9ce19
JM
1774
1775 /* If we have seen this call before, we are done. */
1776 maybe_initialize_constexpr_call_table ();
1777 constexpr_call **slot
1778 = constexpr_call_table->find_slot (&new_call, INSERT);
1779 entry = *slot;
1780 if (entry == NULL)
1781 {
1782 /* We need to keep a pointer to the entry, not just the slot, as the
1783 slot can move in the call to cxx_eval_builtin_function_call. */
1784 *slot = entry = ggc_alloc<constexpr_call> ();
1785 *entry = new_call;
ecdcd560 1786 fb.preserve ();
12d9ce19 1787 }
4727d4c6 1788 /* Calls that are in progress have their result set to NULL,
12d9ce19
JM
1789 so that we can detect circular dependencies. */
1790 else if (entry->result == NULL)
1791 {
1792 if (!ctx->quiet)
1793 error ("call has circular dependency");
1794 *non_constant_p = true;
1795 entry->result = result = error_mark_node;
1796 }
1797 else
1798 result = entry->result;
2d76680f
PC
1799 }
1800
1801 if (!depth_ok)
1802 {
2b3ab879 1803 if (!ctx->quiet)
84fa214d 1804 error ("%<constexpr%> evaluation depth exceeds maximum of %d (use "
7e7a6ed7 1805 "%<-fconstexpr-depth=%> to increase the maximum)",
2d76680f
PC
1806 max_constexpr_depth);
1807 *non_constant_p = true;
12d9ce19 1808 result = error_mark_node;
2d76680f
PC
1809 }
1810 else
1811 {
de54de93
JM
1812 if (result && result != error_mark_node)
1813 /* OK */;
1814 else if (!DECL_SAVED_TREE (fun))
1815 {
1816 /* When at_eof >= 2, cgraph has started throwing away
1817 DECL_SAVED_TREE, so fail quietly. FIXME we get here because of
1818 late code generation for VEC_INIT_EXPR, which needs to be
1819 completely reconsidered. */
1820 gcc_assert (at_eof >= 2 && ctx->quiet);
1821 *non_constant_p = true;
1822 }
1823 else
3e605b20 1824 {
c0daf32d 1825 tree body, parms, res;
0567dcd2 1826
c0daf32d 1827 /* Reuse or create a new unshared copy of this function's body. */
43574e4f 1828 tree copy = get_fundef_copy (new_call.fundef);
97f3003f
JM
1829 body = TREE_PURPOSE (copy);
1830 parms = TREE_VALUE (copy);
1831 res = TREE_TYPE (copy);
0567dcd2
MP
1832
1833 /* Associate the bindings with the remapped parms. */
1834 tree bound = new_call.bindings;
1835 tree remapped = parms;
1836 while (bound)
60813a46 1837 {
0567dcd2
MP
1838 tree oparm = TREE_PURPOSE (bound);
1839 tree arg = TREE_VALUE (bound);
1840 gcc_assert (DECL_NAME (remapped) == DECL_NAME (oparm));
7f0e23e9 1841 /* Don't share a CONSTRUCTOR that might be changed. */
0146e25f 1842 arg = unshare_constructor (arg);
0567dcd2
MP
1843 ctx->values->put (remapped, arg);
1844 bound = TREE_CHAIN (bound);
1845 remapped = DECL_CHAIN (remapped);
60813a46 1846 }
0567dcd2
MP
1847 /* Add the RESULT_DECL to the values map, too. */
1848 tree slot = NULL_TREE;
1849 if (DECL_BY_REFERENCE (res))
60813a46 1850 {
0567dcd2
MP
1851 slot = AGGR_INIT_EXPR_SLOT (t);
1852 tree addr = build_address (slot);
1853 addr = build_nop (TREE_TYPE (res), addr);
1854 ctx->values->put (res, addr);
1855 ctx->values->put (slot, NULL_TREE);
1856 }
1857 else
1858 ctx->values->put (res, NULL_TREE);
60813a46 1859
c0daf32d
PP
1860 /* Track the callee's evaluated SAVE_EXPRs so that we can forget
1861 their values after the call. */
1862 constexpr_ctx ctx_with_save_exprs = *ctx;
0ee28590 1863 auto_vec<tree, 10> save_exprs;
c0daf32d 1864 ctx_with_save_exprs.save_exprs = &save_exprs;
1e163090 1865 ctx_with_save_exprs.call = &new_call;
c0daf32d 1866
0567dcd2 1867 tree jump_target = NULL_TREE;
c0daf32d 1868 cxx_eval_constant_expression (&ctx_with_save_exprs, body,
0567dcd2
MP
1869 lval, non_constant_p, overflow_p,
1870 &jump_target);
60813a46 1871
0567dcd2
MP
1872 if (DECL_CONSTRUCTOR_P (fun))
1873 /* This can be null for a subobject constructor call, in
1874 which case what we care about is the initialization
1875 side-effects rather than the value. We could get at the
1876 value by evaluating *this, but we don't bother; there's
1877 no need to put such a call in the hash table. */
1878 result = lval ? ctx->object : ctx->ctor;
1879 else if (VOID_TYPE_P (TREE_TYPE (res)))
1880 result = void_node;
1881 else
1882 {
1883 result = *ctx->values->get (slot ? slot : res);
1884 if (result == NULL_TREE && !*non_constant_p)
60813a46 1885 {
0567dcd2 1886 if (!ctx->quiet)
84fa214d 1887 error ("%<constexpr%> call flows off the end "
0567dcd2
MP
1888 "of the function");
1889 *non_constant_p = true;
60813a46 1890 }
60813a46 1891 }
0567dcd2 1892
c0daf32d 1893 /* Forget the saved values of the callee's SAVE_EXPRs. */
0ee28590
JJ
1894 unsigned int i;
1895 tree save_expr;
1896 FOR_EACH_VEC_ELT (save_exprs, i, save_expr)
1897 ctx_with_save_exprs.values->remove (save_expr);
c0daf32d 1898
0567dcd2
MP
1899 /* Remove the parms/result from the values map. Is it worth
1900 bothering to do this when the map itself is only live for
1901 one constexpr evaluation? If so, maybe also clear out
1902 other vars from call, maybe in BIND_EXPR handling? */
1903 ctx->values->remove (res);
1904 if (slot)
1905 ctx->values->remove (slot);
1906 for (tree parm = parms; parm; parm = TREE_CHAIN (parm))
1907 ctx->values->remove (parm);
c0daf32d
PP
1908
1909 /* Make the unshared function copy we used available for re-use. */
1910 save_fundef_copy (fun, copy);
3e605b20 1911 }
60813a46 1912
2d76680f
PC
1913 if (result == error_mark_node)
1914 *non_constant_p = true;
52228180 1915 if (*non_constant_p || *overflow_p)
12d9ce19 1916 result = error_mark_node;
0567dcd2 1917 else if (!result)
60813a46 1918 result = void_node;
12d9ce19
JM
1919 if (entry)
1920 entry->result = result;
2d76680f
PC
1921 }
1922
f64e0c02
JM
1923 /* The result of a constexpr function must be completely initialized. */
1924 if (TREE_CODE (result) == CONSTRUCTOR)
ecc57615 1925 clear_no_implicit_zero (result);
f64e0c02 1926
2d76680f 1927 pop_cx_call_context ();
0146e25f 1928 return unshare_constructor (result);
2d76680f
PC
1929}
1930
1931/* FIXME speed this up, it's taking 16% of compile time on sieve testcase. */
1932
1933bool
1934reduced_constant_expression_p (tree t)
1935{
4930c53e
MP
1936 if (t == NULL_TREE)
1937 return false;
1938
2d76680f
PC
1939 switch (TREE_CODE (t))
1940 {
1941 case PTRMEM_CST:
1942 /* Even if we can't lower this yet, it's constant. */
1943 return true;
1944
1945 case CONSTRUCTOR:
1946 /* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR. */
7368cfa4 1947 tree idx, val, field; unsigned HOST_WIDE_INT i;
e8c48716 1948 if (CONSTRUCTOR_NO_CLEARING (t))
6f11ddd8
JM
1949 {
1950 if (TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
1951 /* An initialized vector would have a VECTOR_CST. */
1952 return false;
1953 else
1954 field = next_initializable_field (TYPE_FIELDS (TREE_TYPE (t)));
1955 }
7368cfa4
JM
1956 else
1957 field = NULL_TREE;
1958 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, idx, val)
125db6a1 1959 {
4930c53e
MP
1960 /* If VAL is null, we're in the middle of initializing this
1961 element. */
7368cfa4 1962 if (!reduced_constant_expression_p (val))
125db6a1 1963 return false;
7368cfa4
JM
1964 if (field)
1965 {
1966 if (idx != field)
1967 return false;
1968 field = next_initializable_field (DECL_CHAIN (field));
1969 }
125db6a1 1970 }
7368cfa4
JM
1971 if (field)
1972 return false;
e8c48716 1973 else if (CONSTRUCTOR_NO_CLEARING (t))
7368cfa4 1974 /* All the fields are initialized. */
e8c48716 1975 CONSTRUCTOR_NO_CLEARING (t) = false;
2d76680f
PC
1976 return true;
1977
1978 default:
1979 /* FIXME are we calling this too much? */
1980 return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE;
1981 }
1982}
1983
1984/* Some expressions may have constant operands but are not constant
7d75ea04
JJ
1985 themselves, such as 1/0. Call this function to check for that
1986 condition.
2d76680f
PC
1987
1988 We only call this in places that require an arithmetic constant, not in
1989 places where we might have a non-constant expression that can be a
1990 component of a constant expression, such as the address of a constexpr
1991 variable that might be dereferenced later. */
1992
1993static bool
1994verify_constant (tree t, bool allow_non_constant, bool *non_constant_p,
1995 bool *overflow_p)
1996{
1997 if (!*non_constant_p && !reduced_constant_expression_p (t))
1998 {
1999 if (!allow_non_constant)
2000 error ("%q+E is not a constant expression", t);
2001 *non_constant_p = true;
2002 }
2003 if (TREE_OVERFLOW_P (t))
2004 {
2005 if (!allow_non_constant)
2006 {
2007 permerror (input_location, "overflow in constant expression");
2008 /* If we're being permissive (and are in an enforcing
2009 context), ignore the overflow. */
2010 if (flag_permissive)
2011 return *non_constant_p;
2012 }
2013 *overflow_p = true;
2014 }
2015 return *non_constant_p;
2016}
2017
253a921b
MP
2018/* Check whether the shift operation with code CODE and type TYPE on LHS
2019 and RHS is undefined. If it is, give an error with an explanation,
2020 and return true; return false otherwise. */
2021
2022static bool
2023cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
2024 enum tree_code code, tree type, tree lhs, tree rhs)
2025{
2026 if ((code != LSHIFT_EXPR && code != RSHIFT_EXPR)
2027 || TREE_CODE (lhs) != INTEGER_CST
2028 || TREE_CODE (rhs) != INTEGER_CST)
2029 return false;
2030
2031 tree lhstype = TREE_TYPE (lhs);
2032 unsigned HOST_WIDE_INT uprec = TYPE_PRECISION (TREE_TYPE (lhs));
2033
2034 /* [expr.shift] The behavior is undefined if the right operand
2035 is negative, or greater than or equal to the length in bits
2036 of the promoted left operand. */
2037 if (tree_int_cst_sgn (rhs) == -1)
2038 {
2039 if (!ctx->quiet)
5342156c
MP
2040 permerror (loc, "right operand of shift expression %q+E is negative",
2041 build2_loc (loc, code, type, lhs, rhs));
2042 return (!flag_permissive || ctx->quiet);
253a921b
MP
2043 }
2044 if (compare_tree_int (rhs, uprec) >= 0)
2045 {
2046 if (!ctx->quiet)
a9c697b8
MS
2047 permerror (loc, "right operand of shift expression %q+E is greater "
2048 "than or equal to the precision %wu of the left operand",
2049 build2_loc (loc, code, type, lhs, rhs), uprec);
5342156c 2050 return (!flag_permissive || ctx->quiet);
253a921b
MP
2051 }
2052
2053 /* The value of E1 << E2 is E1 left-shifted E2 bit positions; [...]
2054 if E1 has a signed type and non-negative value, and E1x2^E2 is
2055 representable in the corresponding unsigned type of the result type,
2056 then that value, converted to the result type, is the resulting value;
8ee09943
JJ
2057 otherwise, the behavior is undefined.
2058 For C++2a:
2059 The value of E1 << E2 is the unique value congruent to E1 x 2^E2 modulo
2060 2^N, where N is the range exponent of the type of the result. */
2061 if (code == LSHIFT_EXPR
2062 && !TYPE_UNSIGNED (lhstype)
2063 && cxx_dialect >= cxx11
2064 && cxx_dialect < cxx2a)
253a921b
MP
2065 {
2066 if (tree_int_cst_sgn (lhs) == -1)
2067 {
2068 if (!ctx->quiet)
5342156c
MP
2069 permerror (loc,
2070 "left operand of shift expression %q+E is negative",
2071 build2_loc (loc, code, type, lhs, rhs));
2072 return (!flag_permissive || ctx->quiet);
253a921b
MP
2073 }
2074 /* For signed x << y the following:
2075 (unsigned) x >> ((prec (lhs) - 1) - y)
2076 if > 1, is undefined. The right-hand side of this formula
2077 is the highest bit of the LHS that can be set (starting from 0),
2078 so that the shift doesn't overflow. We then right-shift the LHS
2079 to see whether any other bit is set making the original shift
2080 undefined -- the result is not representable in the corresponding
2081 unsigned type. */
2082 tree t = build_int_cst (unsigned_type_node, uprec - 1);
2083 t = fold_build2 (MINUS_EXPR, unsigned_type_node, t, rhs);
2084 tree ulhs = fold_convert (unsigned_type_for (lhstype), lhs);
2085 t = fold_build2 (RSHIFT_EXPR, TREE_TYPE (ulhs), ulhs, t);
2086 if (tree_int_cst_lt (integer_one_node, t))
2087 {
2088 if (!ctx->quiet)
5342156c
MP
2089 permerror (loc, "shift expression %q+E overflows",
2090 build2_loc (loc, code, type, lhs, rhs));
2091 return (!flag_permissive || ctx->quiet);
253a921b
MP
2092 }
2093 }
2094 return false;
2095}
2096
2d76680f
PC
2097/* Subroutine of cxx_eval_constant_expression.
2098 Attempt to reduce the unary expression tree T to a compile time value.
2099 If successful, return the value. Otherwise issue a diagnostic
2100 and return error_mark_node. */
2101
2102static tree
3e605b20 2103cxx_eval_unary_expression (const constexpr_ctx *ctx, tree t,
12d9ce19 2104 bool /*lval*/,
2d76680f
PC
2105 bool *non_constant_p, bool *overflow_p)
2106{
2107 tree r;
2108 tree orig_arg = TREE_OPERAND (t, 0);
12d9ce19
JM
2109 tree arg = cxx_eval_constant_expression (ctx, orig_arg, /*lval*/false,
2110 non_constant_p, overflow_p);
2d76680f 2111 VERIFY_CONSTANT (arg);
f899317e
JM
2112 location_t loc = EXPR_LOCATION (t);
2113 enum tree_code code = TREE_CODE (t);
2114 tree type = TREE_TYPE (t);
2115 r = fold_unary_loc (loc, code, type, arg);
2116 if (r == NULL_TREE)
2117 {
2118 if (arg == orig_arg)
2119 r = t;
2120 else
2121 r = build1_loc (loc, code, type, arg);
2122 }
2d76680f
PC
2123 VERIFY_CONSTANT (r);
2124 return r;
2125}
2126
ea8661cd
JJ
2127/* Helper function for cxx_eval_binary_expression. Try to optimize
2128 original POINTER_PLUS_EXPR T, LHS p+ RHS, return NULL_TREE if the
2129 generic folding should be used. */
2130
2131static tree
2132cxx_fold_pointer_plus_expression (const constexpr_ctx *ctx, tree t,
2133 tree lhs, tree rhs, bool *non_constant_p,
2134 bool *overflow_p)
2135{
2136 STRIP_NOPS (lhs);
2137 if (TREE_CODE (lhs) != ADDR_EXPR)
2138 return NULL_TREE;
2139
2140 lhs = TREE_OPERAND (lhs, 0);
2141
2142 /* &A[i] p+ j => &A[i + j] */
2143 if (TREE_CODE (lhs) == ARRAY_REF
2144 && TREE_CODE (TREE_OPERAND (lhs, 1)) == INTEGER_CST
2145 && TREE_CODE (rhs) == INTEGER_CST
2146 && TYPE_SIZE_UNIT (TREE_TYPE (lhs))
2147 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST)
2148 {
2149 tree orig_type = TREE_TYPE (t);
2150 location_t loc = EXPR_LOCATION (t);
2151 tree type = TREE_TYPE (lhs);
2152
2153 t = fold_convert_loc (loc, ssizetype, TREE_OPERAND (lhs, 1));
2154 tree nelts = array_type_nelts_top (TREE_TYPE (TREE_OPERAND (lhs, 0)));
2155 nelts = cxx_eval_constant_expression (ctx, nelts, false, non_constant_p,
2156 overflow_p);
2157 if (*non_constant_p)
2158 return NULL_TREE;
2159 /* Don't fold an out-of-bound access. */
2160 if (!tree_int_cst_le (t, nelts))
2161 return NULL_TREE;
2162 rhs = cp_fold_convert (ssizetype, rhs);
2163 /* Don't fold if rhs can't be divided exactly by TYPE_SIZE_UNIT.
2164 constexpr int A[1]; ... (char *)&A[0] + 1 */
2165 if (!integer_zerop (fold_build2_loc (loc, TRUNC_MOD_EXPR, sizetype,
2166 rhs, TYPE_SIZE_UNIT (type))))
2167 return NULL_TREE;
2168 /* Make sure to treat the second operand of POINTER_PLUS_EXPR
2169 as signed. */
2170 rhs = fold_build2_loc (loc, EXACT_DIV_EXPR, ssizetype, rhs,
2171 TYPE_SIZE_UNIT (type));
2172 t = size_binop_loc (loc, PLUS_EXPR, rhs, t);
2173 t = build4_loc (loc, ARRAY_REF, type, TREE_OPERAND (lhs, 0),
2174 t, NULL_TREE, NULL_TREE);
2175 t = cp_build_addr_expr (t, tf_warning_or_error);
2176 t = cp_fold_convert (orig_type, t);
2177 return cxx_eval_constant_expression (ctx, t, /*lval*/false,
2178 non_constant_p, overflow_p);
2179 }
2180
2181 return NULL_TREE;
2182}
2183
2d76680f
PC
2184/* Subroutine of cxx_eval_constant_expression.
2185 Like cxx_eval_unary_expression, except for binary expressions. */
2186
2187static tree
3e605b20 2188cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t,
12d9ce19 2189 bool /*lval*/,
2d76680f
PC
2190 bool *non_constant_p, bool *overflow_p)
2191{
618d6c1c 2192 tree r = NULL_TREE;
2d76680f
PC
2193 tree orig_lhs = TREE_OPERAND (t, 0);
2194 tree orig_rhs = TREE_OPERAND (t, 1);
2195 tree lhs, rhs;
12d9ce19 2196 lhs = cxx_eval_constant_expression (ctx, orig_lhs, /*lval*/false,
5a804683 2197 non_constant_p, overflow_p);
c8a66fc9
JM
2198 /* Don't VERIFY_CONSTANT here, it's unnecessary and will break pointer
2199 subtraction. */
2200 if (*non_constant_p)
2201 return t;
12d9ce19 2202 rhs = cxx_eval_constant_expression (ctx, orig_rhs, /*lval*/false,
5a804683 2203 non_constant_p, overflow_p);
c8a66fc9
JM
2204 if (*non_constant_p)
2205 return t;
f899317e
JM
2206
2207 location_t loc = EXPR_LOCATION (t);
2208 enum tree_code code = TREE_CODE (t);
2209 tree type = TREE_TYPE (t);
618d6c1c
PP
2210
2211 if (code == EQ_EXPR || code == NE_EXPR)
2212 {
2213 bool is_code_eq = (code == EQ_EXPR);
2214
2215 if (TREE_CODE (lhs) == PTRMEM_CST
2216 && TREE_CODE (rhs) == PTRMEM_CST)
9b0607de
JM
2217 {
2218 tree lmem = PTRMEM_CST_MEMBER (lhs);
2219 tree rmem = PTRMEM_CST_MEMBER (rhs);
2220 bool eq;
2221 if (TREE_CODE (lmem) == TREE_CODE (rmem)
2222 && TREE_CODE (lmem) == FIELD_DECL
2223 && TREE_CODE (DECL_CONTEXT (lmem)) == UNION_TYPE
2224 && same_type_p (DECL_CONTEXT (lmem),
2225 DECL_CONTEXT (rmem)))
2226 /* If both refer to (possibly different) members of the same union
2227 (12.3), they compare equal. */
2228 eq = true;
2229 else
2230 eq = cp_tree_equal (lhs, rhs);
2231 r = constant_boolean_node (eq == is_code_eq, type);
2232 }
618d6c1c
PP
2233 else if ((TREE_CODE (lhs) == PTRMEM_CST
2234 || TREE_CODE (rhs) == PTRMEM_CST)
2235 && (null_member_pointer_value_p (lhs)
2236 || null_member_pointer_value_p (rhs)))
2237 r = constant_boolean_node (!is_code_eq, type);
dd5dda56
JM
2238 else if (TREE_CODE (lhs) == PTRMEM_CST)
2239 lhs = cplus_expand_constant (lhs);
2240 else if (TREE_CODE (rhs) == PTRMEM_CST)
2241 rhs = cplus_expand_constant (rhs);
618d6c1c 2242 }
8bada5cd
MS
2243 if (code == POINTER_PLUS_EXPR && !*non_constant_p
2244 && integer_zerop (lhs) && !integer_zerop (rhs))
2245 {
2246 if (!ctx->quiet)
2247 error ("arithmetic involving a null pointer in %qE", lhs);
bf533db8 2248 *non_constant_p = true;
8bada5cd
MS
2249 return t;
2250 }
ea8661cd
JJ
2251 else if (code == POINTER_PLUS_EXPR)
2252 r = cxx_fold_pointer_plus_expression (ctx, t, lhs, rhs, non_constant_p,
2253 overflow_p);
618d6c1c
PP
2254
2255 if (r == NULL_TREE)
2256 r = fold_binary_loc (loc, code, type, lhs, rhs);
2257
f899317e
JM
2258 if (r == NULL_TREE)
2259 {
2260 if (lhs == orig_lhs && rhs == orig_rhs)
2261 r = t;
2262 else
2263 r = build2_loc (loc, code, type, lhs, rhs);
2264 }
253a921b
MP
2265 else if (cxx_eval_check_shift_p (loc, ctx, code, type, lhs, rhs))
2266 *non_constant_p = true;
c8a66fc9
JM
2267 /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
2268 a local array in a constexpr function. */
71a93b08 2269 bool ptr = INDIRECT_TYPE_P (TREE_TYPE (lhs));
caee690e 2270 if (!ptr)
134efa82 2271 VERIFY_CONSTANT (r);
2d76680f
PC
2272 return r;
2273}
2274
2275/* Subroutine of cxx_eval_constant_expression.
2276 Attempt to evaluate condition expressions. Dead branches are not
2277 looked into. */
2278
2279static tree
3e605b20 2280cxx_eval_conditional_expression (const constexpr_ctx *ctx, tree t,
92a596e8 2281 bool lval,
56632b27
JM
2282 bool *non_constant_p, bool *overflow_p,
2283 tree *jump_target)
2d76680f 2284{
3e605b20 2285 tree val = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
12d9ce19 2286 /*lval*/false,
5a804683 2287 non_constant_p, overflow_p);
2d76680f
PC
2288 VERIFY_CONSTANT (val);
2289 /* Don't VERIFY_CONSTANT the other operands. */
2290 if (integer_zerop (val))
43574e4f
JJ
2291 val = TREE_OPERAND (t, 2);
2292 else
2293 val = TREE_OPERAND (t, 1);
2294 if (TREE_CODE (t) == IF_STMT && !val)
2295 val = void_node;
2296 return cxx_eval_constant_expression (ctx, val, lval, non_constant_p,
2297 overflow_p, jump_target);
2d76680f
PC
2298}
2299
f370e36d
JJ
2300/* Subroutine of cxx_eval_constant_expression.
2301 Attempt to evaluate vector condition expressions. Unlike
2302 cxx_eval_conditional_expression, VEC_COND_EXPR acts like a normal
2303 ternary arithmetics operation, where all 3 arguments have to be
2304 evaluated as constants and then folding computes the result from
2305 them. */
2306
2307static tree
2308cxx_eval_vector_conditional_expression (const constexpr_ctx *ctx, tree t,
2309 bool *non_constant_p, bool *overflow_p)
2310{
2311 tree arg1 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
2312 /*lval*/false,
2313 non_constant_p, overflow_p);
2314 VERIFY_CONSTANT (arg1);
2315 tree arg2 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
2316 /*lval*/false,
2317 non_constant_p, overflow_p);
2318 VERIFY_CONSTANT (arg2);
2319 tree arg3 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 2),
2320 /*lval*/false,
2321 non_constant_p, overflow_p);
2322 VERIFY_CONSTANT (arg3);
2323 location_t loc = EXPR_LOCATION (t);
2324 tree type = TREE_TYPE (t);
2325 tree r = fold_ternary_loc (loc, VEC_COND_EXPR, type, arg1, arg2, arg3);
2326 if (r == NULL_TREE)
2327 {
2328 if (arg1 == TREE_OPERAND (t, 0)
2329 && arg2 == TREE_OPERAND (t, 1)
2330 && arg3 == TREE_OPERAND (t, 2))
2331 r = t;
2332 else
2333 r = build3_loc (loc, VEC_COND_EXPR, type, arg1, arg2, arg3);
2334 }
2335 VERIFY_CONSTANT (r);
2336 return r;
2337}
2338
ceaaf873
JM
2339/* Returns less than, equal to, or greater than zero if KEY is found to be
2340 less than, to match, or to be greater than the constructor_elt's INDEX. */
2341
2342static int
2343array_index_cmp (tree key, tree index)
2344{
2345 gcc_assert (TREE_CODE (key) == INTEGER_CST);
2346
2347 switch (TREE_CODE (index))
2348 {
2349 case INTEGER_CST:
2350 return tree_int_cst_compare (key, index);
2351 case RANGE_EXPR:
2352 {
2353 tree lo = TREE_OPERAND (index, 0);
2354 tree hi = TREE_OPERAND (index, 1);
2355 if (tree_int_cst_lt (key, lo))
2356 return -1;
2357 else if (tree_int_cst_lt (hi, key))
2358 return 1;
2359 else
2360 return 0;
2361 }
2362 default:
2363 gcc_unreachable ();
2364 }
2365}
2366
2367/* Returns the index of the constructor_elt of ARY which matches DINDEX, or -1
2368 if none. If INSERT is true, insert a matching element rather than fail. */
2369
2370static HOST_WIDE_INT
582d2481 2371find_array_ctor_elt (tree ary, tree dindex, bool insert)
ceaaf873
JM
2372{
2373 if (tree_int_cst_sgn (dindex) < 0)
2374 return -1;
2375
2376 unsigned HOST_WIDE_INT i = tree_to_uhwi (dindex);
2377 vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (ary);
2378 unsigned HOST_WIDE_INT len = vec_safe_length (elts);
2379
2380 unsigned HOST_WIDE_INT end = len;
2381 unsigned HOST_WIDE_INT begin = 0;
2382
2383 /* If the last element of the CONSTRUCTOR has its own index, we can assume
2384 that the same is true of the other elements and index directly. */
2385 if (end > 0)
2386 {
fe217ba0 2387 tree cindex = (*elts)[end - 1].index;
ceaaf873 2388 if (TREE_CODE (cindex) == INTEGER_CST
fe217ba0 2389 && compare_tree_int (cindex, end - 1) == 0)
ceaaf873
JM
2390 {
2391 if (i < end)
2392 return i;
2393 else
2394 begin = end;
2395 }
2396 }
2397
2398 /* Otherwise, find a matching index by means of a binary search. */
2399 while (begin != end)
2400 {
2401 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
a7ccb9e7
JM
2402 constructor_elt &elt = (*elts)[middle];
2403 tree idx = elt.index;
ceaaf873 2404
a7ccb9e7 2405 int cmp = array_index_cmp (dindex, idx);
ceaaf873
JM
2406 if (cmp < 0)
2407 end = middle;
2408 else if (cmp > 0)
2409 begin = middle + 1;
2410 else
a7ccb9e7
JM
2411 {
2412 if (insert && TREE_CODE (idx) == RANGE_EXPR)
2413 {
2414 /* We need to split the range. */
2415 constructor_elt e;
2416 tree lo = TREE_OPERAND (idx, 0);
2417 tree hi = TREE_OPERAND (idx, 1);
fe217ba0
JJ
2418 tree value = elt.value;
2419 dindex = fold_convert (sizetype, dindex);
a7ccb9e7
JM
2420 if (tree_int_cst_lt (lo, dindex))
2421 {
2422 /* There are still some lower elts; shorten the range. */
2423 tree new_hi = int_const_binop (MINUS_EXPR, dindex,
2424 size_one_node);
2425 if (tree_int_cst_equal (lo, new_hi))
2426 /* Only one element left, no longer a range. */
2427 elt.index = lo;
2428 else
2429 TREE_OPERAND (idx, 1) = new_hi;
2430 /* Append the element we want to insert. */
2431 ++middle;
2432 e.index = dindex;
fe217ba0 2433 e.value = unshare_constructor (value);
a7ccb9e7
JM
2434 vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle, e);
2435 }
2436 else
2437 /* No lower elts, the range elt is now ours. */
2438 elt.index = dindex;
2439
2440 if (tree_int_cst_lt (dindex, hi))
2441 {
2442 /* There are still some higher elts; append a range. */
2443 tree new_lo = int_const_binop (PLUS_EXPR, dindex,
2444 size_one_node);
2445 if (tree_int_cst_equal (new_lo, hi))
2446 e.index = hi;
2447 else
2448 e.index = build2 (RANGE_EXPR, sizetype, new_lo, hi);
fe217ba0
JJ
2449 e.value = unshare_constructor (value);
2450 vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle + 1, e);
a7ccb9e7
JM
2451 }
2452 }
2453 return middle;
2454 }
ceaaf873
JM
2455 }
2456
2457 if (insert)
2458 {
2459 constructor_elt e = { dindex, NULL_TREE };
2460 vec_safe_insert (CONSTRUCTOR_ELTS (ary), end, e);
2461 return end;
2462 }
2463
2464 return -1;
2465}
2466
abdc16c8
MS
2467/* Under the control of CTX, issue a detailed diagnostic for
2468 an out-of-bounds subscript INDEX into the expression ARRAY. */
2469
2470static void
2471diag_array_subscript (const constexpr_ctx *ctx, tree array, tree index)
2472{
2473 if (!ctx->quiet)
2474 {
2475 tree arraytype = TREE_TYPE (array);
2476
2477 /* Convert the unsigned array subscript to a signed integer to avoid
2478 printing huge numbers for small negative values. */
2479 tree sidx = fold_convert (ssizetype, index);
2480 if (DECL_P (array))
2481 {
08b3748c
JJ
2482 if (TYPE_DOMAIN (arraytype))
2483 error ("array subscript value %qE is outside the bounds "
2484 "of array %qD of type %qT", sidx, array, arraytype);
2485 else
0ecf545c 2486 error ("nonzero array subscript %qE is used with array %qD of "
08b3748c 2487 "type %qT with unknown bounds", sidx, array, arraytype);
abdc16c8
MS
2488 inform (DECL_SOURCE_LOCATION (array), "declared here");
2489 }
08b3748c 2490 else if (TYPE_DOMAIN (arraytype))
abdc16c8
MS
2491 error ("array subscript value %qE is outside the bounds "
2492 "of array type %qT", sidx, arraytype);
08b3748c 2493 else
0ecf545c 2494 error ("nonzero array subscript %qE is used with array of type %qT "
08b3748c 2495 "with unknown bounds", sidx, arraytype);
abdc16c8
MS
2496 }
2497}
ceaaf873 2498
74f8705e
MP
2499/* Return the number of elements for TYPE (which is an ARRAY_TYPE or
2500 a VECTOR_TYPE). */
2501
2502static tree
2503get_array_or_vector_nelts (const constexpr_ctx *ctx, tree type,
2504 bool *non_constant_p, bool *overflow_p)
2505{
2506 tree nelts;
2507 if (TREE_CODE (type) == ARRAY_TYPE)
2508 {
2509 if (TYPE_DOMAIN (type))
2510 nelts = array_type_nelts_top (type);
2511 else
2512 nelts = size_zero_node;
2513 }
2514 else if (VECTOR_TYPE_P (type))
2515 nelts = size_int (TYPE_VECTOR_SUBPARTS (type));
2516 else
2517 gcc_unreachable ();
2518
2519 /* For VLAs, the number of elements won't be an integer constant. */
2520 nelts = cxx_eval_constant_expression (ctx, nelts, false,
2521 non_constant_p, overflow_p);
2522 return nelts;
2523}
2524
d6b46fca
NS
2525/* Extract element INDEX consisting of CHARS_PER_ELT chars from
2526 STRING_CST STRING. */
2527
2528static tree
2529extract_string_elt (tree string, unsigned chars_per_elt, unsigned index)
2530{
2531 tree type = cv_unqualified (TREE_TYPE (TREE_TYPE (string)));
2532 tree r;
2533
2534 if (chars_per_elt == 1)
2535 r = build_int_cst (type, TREE_STRING_POINTER (string)[index]);
2536 else
2537 {
2538 const unsigned char *ptr
2539 = ((const unsigned char *)TREE_STRING_POINTER (string)
2540 + index * chars_per_elt);
2541 r = native_interpret_expr (type, ptr, chars_per_elt);
2542 }
2543 return r;
2544}
2545
2d76680f
PC
2546/* Subroutine of cxx_eval_constant_expression.
2547 Attempt to reduce a reference to an array slot. */
2548
2549static tree
3e605b20 2550cxx_eval_array_reference (const constexpr_ctx *ctx, tree t,
92a596e8 2551 bool lval,
2d76680f
PC
2552 bool *non_constant_p, bool *overflow_p)
2553{
2554 tree oldary = TREE_OPERAND (t, 0);
3e605b20 2555 tree ary = cxx_eval_constant_expression (ctx, oldary,
92a596e8 2556 lval,
5a804683 2557 non_constant_p, overflow_p);
2d76680f 2558 tree index, oldidx;
bc2a38df
JJ
2559 HOST_WIDE_INT i = 0;
2560 tree elem_type = NULL_TREE;
2561 unsigned len = 0, elem_nchars = 1;
2d76680f
PC
2562 if (*non_constant_p)
2563 return t;
2564 oldidx = TREE_OPERAND (t, 1);
3e605b20 2565 index = cxx_eval_constant_expression (ctx, oldidx,
2b3ab879 2566 false,
5a804683 2567 non_constant_p, overflow_p);
2d76680f 2568 VERIFY_CONSTANT (index);
bc2a38df 2569 if (!lval)
2d76680f 2570 {
bc2a38df
JJ
2571 elem_type = TREE_TYPE (TREE_TYPE (ary));
2572 if (TREE_CODE (ary) == VIEW_CONVERT_EXPR
2573 && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (ary, 0)))
2574 && TREE_TYPE (t) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (ary, 0))))
2575 ary = TREE_OPERAND (ary, 0);
2576 if (TREE_CODE (ary) == CONSTRUCTOR)
2577 len = CONSTRUCTOR_NELTS (ary);
2578 else if (TREE_CODE (ary) == STRING_CST)
2579 {
2580 elem_nchars = (TYPE_PRECISION (elem_type)
2581 / TYPE_PRECISION (char_type_node));
2582 len = (unsigned) TREE_STRING_LENGTH (ary) / elem_nchars;
2583 }
2584 else if (TREE_CODE (ary) == VECTOR_CST)
928686b1
RS
2585 /* We don't create variable-length VECTOR_CSTs. */
2586 len = VECTOR_CST_NELTS (ary).to_constant ();
bc2a38df
JJ
2587 else
2588 {
2589 /* We can't do anything with other tree codes, so use
2590 VERIFY_CONSTANT to complain and fail. */
2591 VERIFY_CONSTANT (ary);
2592 gcc_unreachable ();
2593 }
3b9997bb 2594
bc2a38df
JJ
2595 if (!tree_fits_shwi_p (index)
2596 || (i = tree_to_shwi (index)) < 0)
2597 {
2598 diag_array_subscript (ctx, ary, index);
2599 *non_constant_p = true;
2600 return t;
2601 }
ceaaf873
JM
2602 }
2603
74f8705e
MP
2604 tree nelts = get_array_or_vector_nelts (ctx, TREE_TYPE (ary), non_constant_p,
2605 overflow_p);
5453bfed 2606 VERIFY_CONSTANT (nelts);
3bb43119
JJ
2607 if ((lval
2608 ? !tree_int_cst_le (index, nelts)
2609 : !tree_int_cst_lt (index, nelts))
2610 || tree_int_cst_sgn (index) < 0)
5453bfed 2611 {
abdc16c8 2612 diag_array_subscript (ctx, ary, index);
5453bfed
MP
2613 *non_constant_p = true;
2614 return t;
2615 }
2616
bc2a38df
JJ
2617 if (lval && ary == oldary && index == oldidx)
2618 return t;
2619 else if (lval)
2620 return build4 (ARRAY_REF, TREE_TYPE (t), ary, index, NULL, NULL);
2621
ceaaf873
JM
2622 bool found;
2623 if (TREE_CODE (ary) == CONSTRUCTOR)
2624 {
2625 HOST_WIDE_INT ix = find_array_ctor_elt (ary, index);
2626 found = (ix >= 0);
2627 if (found)
2628 i = ix;
3b9997bb 2629 }
ceaaf873
JM
2630 else
2631 found = (i < len);
3b9997bb 2632
fd2bfee5
JM
2633 if (found)
2634 {
2635 tree r;
2636 if (TREE_CODE (ary) == CONSTRUCTOR)
2637 r = (*CONSTRUCTOR_ELTS (ary))[i].value;
2638 else if (TREE_CODE (ary) == VECTOR_CST)
2639 r = VECTOR_CST_ELT (ary, i);
fd2bfee5 2640 else
d6b46fca
NS
2641 r = extract_string_elt (ary, elem_nchars, i);
2642
fd2bfee5
JM
2643 if (r)
2644 /* Don't VERIFY_CONSTANT here. */
2645 return r;
2d76680f 2646
fd2bfee5 2647 /* Otherwise the element doesn't have a value yet. */
2d76680f 2648 }
3b9997bb 2649
fd2bfee5
JM
2650 /* Not found. */
2651
2652 if (TREE_CODE (ary) == CONSTRUCTOR
e8c48716 2653 && CONSTRUCTOR_NO_CLEARING (ary))
2d76680f 2654 {
fd2bfee5
JM
2655 /* 'ary' is part of the aggregate initializer we're currently
2656 building; if there's no initializer for this element yet,
2657 that's an error. */
2658 if (!ctx->quiet)
2659 error ("accessing uninitialized array element");
2660 *non_constant_p = true;
2661 return t;
2d76680f 2662 }
fd2bfee5
JM
2663
2664 /* If it's within the array bounds but doesn't have an explicit
2665 initializer, it's value-initialized. */
2666 tree val = build_value_init (elem_type, tf_warning_or_error);
2667 return cxx_eval_constant_expression (ctx, val, lval, non_constant_p,
2668 overflow_p);
2d76680f
PC
2669}
2670
2671/* Subroutine of cxx_eval_constant_expression.
2672 Attempt to reduce a field access of a value of class type. */
2673
2674static tree
3e605b20 2675cxx_eval_component_reference (const constexpr_ctx *ctx, tree t,
92a596e8 2676 bool lval,
2d76680f
PC
2677 bool *non_constant_p, bool *overflow_p)
2678{
2679 unsigned HOST_WIDE_INT i;
2680 tree field;
2681 tree value;
2682 tree part = TREE_OPERAND (t, 1);
2683 tree orig_whole = TREE_OPERAND (t, 0);
3e605b20 2684 tree whole = cxx_eval_constant_expression (ctx, orig_whole,
92a596e8 2685 lval,
5a804683 2686 non_constant_p, overflow_p);
a7f8415c 2687 if (INDIRECT_REF_P (whole)
bf533db8
JJ
2688 && integer_zerop (TREE_OPERAND (whole, 0)))
2689 {
2690 if (!ctx->quiet)
2691 error ("dereferencing a null pointer in %qE", orig_whole);
2692 *non_constant_p = true;
2693 return t;
2694 }
8bada5cd 2695
dcdbc004
JM
2696 if (TREE_CODE (whole) == PTRMEM_CST)
2697 whole = cplus_expand_constant (whole);
2d76680f
PC
2698 if (whole == orig_whole)
2699 return t;
92a596e8 2700 if (lval)
2d76680f
PC
2701 return fold_build3 (COMPONENT_REF, TREE_TYPE (t),
2702 whole, part, NULL_TREE);
2703 /* Don't VERIFY_CONSTANT here; we only want to check that we got a
2704 CONSTRUCTOR. */
2705 if (!*non_constant_p && TREE_CODE (whole) != CONSTRUCTOR)
2706 {
2b3ab879 2707 if (!ctx->quiet)
2d76680f
PC
2708 error ("%qE is not a constant expression", orig_whole);
2709 *non_constant_p = true;
2710 }
2711 if (DECL_MUTABLE_P (part))
2712 {
2b3ab879 2713 if (!ctx->quiet)
2d76680f
PC
2714 error ("mutable %qD is not usable in a constant expression", part);
2715 *non_constant_p = true;
2716 }
2717 if (*non_constant_p)
2718 return t;
2db613e5 2719 bool pmf = TYPE_PTRMEMFUNC_P (TREE_TYPE (whole));
2d76680f
PC
2720 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
2721 {
2db613e5
JM
2722 /* Use name match for PMF fields, as a variant will have a
2723 different FIELD_DECL with a different type. */
2724 if (pmf ? DECL_NAME (field) == DECL_NAME (part)
2725 : field == part)
60813a46
JM
2726 {
2727 if (value)
2728 return value;
2729 else
2730 /* We're in the middle of initializing it. */
2731 break;
2732 }
2d76680f
PC
2733 }
2734 if (TREE_CODE (TREE_TYPE (whole)) == UNION_TYPE
2735 && CONSTRUCTOR_NELTS (whole) > 0)
2736 {
2737 /* DR 1188 says we don't have to deal with this. */
2b3ab879 2738 if (!ctx->quiet)
2d76680f
PC
2739 error ("accessing %qD member instead of initialized %qD member in "
2740 "constant expression", part, CONSTRUCTOR_ELT (whole, 0)->index);
2741 *non_constant_p = true;
2742 return t;
2743 }
2744
188e53bd
JM
2745 /* We only create a CONSTRUCTOR for a subobject when we modify it, so empty
2746 classes never get represented; throw together a value now. */
dbcd32f8 2747 if (is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
188e53bd
JM
2748 return build_constructor (TREE_TYPE (t), NULL);
2749
2db613e5
JM
2750 gcc_assert (DECL_CONTEXT (part) == TYPE_MAIN_VARIANT (TREE_TYPE (whole)));
2751
e8c48716 2752 if (CONSTRUCTOR_NO_CLEARING (whole))
3e605b20
JM
2753 {
2754 /* 'whole' is part of the aggregate initializer we're currently
2755 building; if there's no initializer for this member yet, that's an
188e53bd 2756 error. */
2b3ab879 2757 if (!ctx->quiet)
3e605b20
JM
2758 error ("accessing uninitialized member %qD", part);
2759 *non_constant_p = true;
2760 return t;
2761 }
2762
2d76680f
PC
2763 /* If there's no explicit init for this field, it's value-initialized. */
2764 value = build_value_init (TREE_TYPE (t), tf_warning_or_error);
3e605b20 2765 return cxx_eval_constant_expression (ctx, value,
92a596e8 2766 lval,
5a804683 2767 non_constant_p, overflow_p);
2d76680f
PC
2768}
2769
2770/* Subroutine of cxx_eval_constant_expression.
2771 Attempt to reduce a field access of a value of class type that is
2772 expressed as a BIT_FIELD_REF. */
2773
2774static tree
3e605b20 2775cxx_eval_bit_field_ref (const constexpr_ctx *ctx, tree t,
92a596e8 2776 bool lval,
2d76680f
PC
2777 bool *non_constant_p, bool *overflow_p)
2778{
2779 tree orig_whole = TREE_OPERAND (t, 0);
2780 tree retval, fldval, utype, mask;
2781 bool fld_seen = false;
2782 HOST_WIDE_INT istart, isize;
3e605b20 2783 tree whole = cxx_eval_constant_expression (ctx, orig_whole,
92a596e8 2784 lval,
5a804683 2785 non_constant_p, overflow_p);
2d76680f
PC
2786 tree start, field, value;
2787 unsigned HOST_WIDE_INT i;
2788
2789 if (whole == orig_whole)
2790 return t;
2791 /* Don't VERIFY_CONSTANT here; we only want to check that we got a
2792 CONSTRUCTOR. */
2793 if (!*non_constant_p
2794 && TREE_CODE (whole) != VECTOR_CST
2795 && TREE_CODE (whole) != CONSTRUCTOR)
2796 {
2b3ab879 2797 if (!ctx->quiet)
2d76680f
PC
2798 error ("%qE is not a constant expression", orig_whole);
2799 *non_constant_p = true;
2800 }
2801 if (*non_constant_p)
2802 return t;
2803
2804 if (TREE_CODE (whole) == VECTOR_CST)
2805 return fold_ternary (BIT_FIELD_REF, TREE_TYPE (t), whole,
2806 TREE_OPERAND (t, 1), TREE_OPERAND (t, 2));
2807
2808 start = TREE_OPERAND (t, 2);
2809 istart = tree_to_shwi (start);
2810 isize = tree_to_shwi (TREE_OPERAND (t, 1));
2811 utype = TREE_TYPE (t);
2812 if (!TYPE_UNSIGNED (utype))
2813 utype = build_nonstandard_integer_type (TYPE_PRECISION (utype), 1);
2814 retval = build_int_cst (utype, 0);
2815 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
2816 {
2817 tree bitpos = bit_position (field);
2818 if (bitpos == start && DECL_SIZE (field) == TREE_OPERAND (t, 1))
2819 return value;
2820 if (TREE_CODE (TREE_TYPE (field)) == INTEGER_TYPE
2821 && TREE_CODE (value) == INTEGER_CST
2822 && tree_fits_shwi_p (bitpos)
2823 && tree_fits_shwi_p (DECL_SIZE (field)))
2824 {
2825 HOST_WIDE_INT bit = tree_to_shwi (bitpos);
2826 HOST_WIDE_INT sz = tree_to_shwi (DECL_SIZE (field));
2827 HOST_WIDE_INT shift;
2828 if (bit >= istart && bit + sz <= istart + isize)
2829 {
2830 fldval = fold_convert (utype, value);
2831 mask = build_int_cst_type (utype, -1);
2832 mask = fold_build2 (LSHIFT_EXPR, utype, mask,
2833 size_int (TYPE_PRECISION (utype) - sz));
2834 mask = fold_build2 (RSHIFT_EXPR, utype, mask,
2835 size_int (TYPE_PRECISION (utype) - sz));
2836 fldval = fold_build2 (BIT_AND_EXPR, utype, fldval, mask);
2837 shift = bit - istart;
2838 if (BYTES_BIG_ENDIAN)
2839 shift = TYPE_PRECISION (utype) - shift - sz;
2840 fldval = fold_build2 (LSHIFT_EXPR, utype, fldval,
2841 size_int (shift));
2842 retval = fold_build2 (BIT_IOR_EXPR, utype, retval, fldval);
2843 fld_seen = true;
2844 }
2845 }
2846 }
2847 if (fld_seen)
2848 return fold_convert (TREE_TYPE (t), retval);
2849 gcc_unreachable ();
2850 return error_mark_node;
2851}
2852
2853/* Subroutine of cxx_eval_constant_expression.
2854 Evaluate a short-circuited logical expression T in the context
2855 of a given constexpr CALL. BAILOUT_VALUE is the value for
2856 early return. CONTINUE_VALUE is used here purely for
2857 sanity check purposes. */
2858
2859static tree
3e605b20 2860cxx_eval_logical_expression (const constexpr_ctx *ctx, tree t,
2d76680f 2861 tree bailout_value, tree continue_value,
92a596e8 2862 bool lval,
2d76680f
PC
2863 bool *non_constant_p, bool *overflow_p)
2864{
2865 tree r;
3e605b20 2866 tree lhs = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
92a596e8 2867 lval,
5a804683 2868 non_constant_p, overflow_p);
2d76680f
PC
2869 VERIFY_CONSTANT (lhs);
2870 if (tree_int_cst_equal (lhs, bailout_value))
2871 return lhs;
2872 gcc_assert (tree_int_cst_equal (lhs, continue_value));
3e605b20 2873 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
92a596e8 2874 lval, non_constant_p,
5a804683 2875 overflow_p);
2d76680f
PC
2876 VERIFY_CONSTANT (r);
2877 return r;
2878}
2879
2880/* REF is a COMPONENT_REF designating a particular field. V is a vector of
2881 CONSTRUCTOR elements to initialize (part of) an object containing that
2882 field. Return a pointer to the constructor_elt corresponding to the
2883 initialization of the field. */
2884
2885static constructor_elt *
2886base_field_constructor_elt (vec<constructor_elt, va_gc> *v, tree ref)
2887{
2888 tree aggr = TREE_OPERAND (ref, 0);
2889 tree field = TREE_OPERAND (ref, 1);
2890 HOST_WIDE_INT i;
2891 constructor_elt *ce;
2892
2893 gcc_assert (TREE_CODE (ref) == COMPONENT_REF);
2894
2895 if (TREE_CODE (aggr) == COMPONENT_REF)
2896 {
2897 constructor_elt *base_ce
2898 = base_field_constructor_elt (v, aggr);
2899 v = CONSTRUCTOR_ELTS (base_ce->value);
2900 }
2901
2902 for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
2903 if (ce->index == field)
2904 return ce;
2905
2906 gcc_unreachable ();
2907 return NULL;
2908}
2909
3e605b20
JM
2910/* Some of the expressions fed to the constexpr mechanism are calls to
2911 constructors, which have type void. In that case, return the type being
2912 initialized by the constructor. */
2913
2914static tree
2915initialized_type (tree t)
2916{
2917 if (TYPE_P (t))
2918 return t;
5dab8b11 2919 tree type = TREE_TYPE (t);
4d0c18c6 2920 if (TREE_CODE (t) == CALL_EXPR)
3e605b20
JM
2921 {
2922 /* A constructor call has void type, so we need to look deeper. */
2923 tree fn = get_function_named_in_call (t);
2924 if (fn && TREE_CODE (fn) == FUNCTION_DECL
2925 && DECL_CXX_CONSTRUCTOR_P (fn))
2926 type = DECL_CONTEXT (fn);
2927 }
4d0c18c6
JM
2928 else if (TREE_CODE (t) == COMPOUND_EXPR)
2929 return initialized_type (TREE_OPERAND (t, 1));
5dab8b11
JM
2930 else if (TREE_CODE (t) == AGGR_INIT_EXPR)
2931 type = TREE_TYPE (AGGR_INIT_EXPR_SLOT (t));
2932 return cv_unqualified (type);
3e605b20
JM
2933}
2934
2935/* We're about to initialize element INDEX of an array or class from VALUE.
2936 Set up NEW_CTX appropriately by adjusting .object to refer to the
2937 subobject and creating a new CONSTRUCTOR if the element is itself
2938 a class or array. */
2939
2940static void
2941init_subob_ctx (const constexpr_ctx *ctx, constexpr_ctx &new_ctx,
2942 tree index, tree &value)
2943{
2944 new_ctx = *ctx;
2945
2946 if (index && TREE_CODE (index) != INTEGER_CST
2947 && TREE_CODE (index) != FIELD_DECL)
2948 /* This won't have an element in the new CONSTRUCTOR. */
2949 return;
2950
2951 tree type = initialized_type (value);
2952 if (!AGGREGATE_TYPE_P (type) && !VECTOR_TYPE_P (type))
2953 /* A non-aggregate member doesn't get its own CONSTRUCTOR. */
2954 return;
2955
2956 /* The sub-aggregate initializer might contain a placeholder;
2957 update object to refer to the subobject and ctor to refer to
2958 the (newly created) sub-initializer. */
2959 if (ctx->object)
2960 new_ctx.object = build_ctor_subob_ref (index, type, ctx->object);
2961 tree elt = build_constructor (type, NULL);
e8c48716 2962 CONSTRUCTOR_NO_CLEARING (elt) = true;
3e605b20
JM
2963 new_ctx.ctor = elt;
2964
2965 if (TREE_CODE (value) == TARGET_EXPR)
2966 /* Avoid creating another CONSTRUCTOR when we expand the TARGET_EXPR. */
2967 value = TARGET_EXPR_INITIAL (value);
2968}
2969
2970/* We're about to process an initializer for a class or array TYPE. Make
2971 sure that CTX is set up appropriately. */
2972
2973static void
2974verify_ctor_sanity (const constexpr_ctx *ctx, tree type)
2975{
2976 /* We don't bother building a ctor for an empty base subobject. */
2977 if (is_empty_class (type))
2978 return;
2979
2980 /* We're in the middle of an initializer that might involve placeholders;
2981 our caller should have created a CONSTRUCTOR for us to put the
2982 initializer into. We will either return that constructor or T. */
2983 gcc_assert (ctx->ctor);
2984 gcc_assert (same_type_ignoring_top_level_qualifiers_p
2985 (type, TREE_TYPE (ctx->ctor)));
fe69277d
JM
2986 /* We used to check that ctx->ctor was empty, but that isn't the case when
2987 the object is zero-initialized before calling the constructor. */
3e605b20 2988 if (ctx->object)
176e79b5
JM
2989 {
2990 tree otype = TREE_TYPE (ctx->object);
2991 gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, otype)
2992 /* Handle flexible array members. */
2993 || (TREE_CODE (otype) == ARRAY_TYPE
2994 && TYPE_DOMAIN (otype) == NULL_TREE
2995 && TREE_CODE (type) == ARRAY_TYPE
2996 && (same_type_ignoring_top_level_qualifiers_p
2997 (TREE_TYPE (type), TREE_TYPE (otype)))));
2998 }
3e605b20
JM
2999 gcc_assert (!ctx->object || !DECL_P (ctx->object)
3000 || *(ctx->values->get (ctx->object)) == ctx->ctor);
3001}
3002
2d76680f
PC
3003/* Subroutine of cxx_eval_constant_expression.
3004 The expression tree T denotes a C-style array or a C-style
3005 aggregate. Reduce it to a constant expression. */
3006
3007static tree
3e605b20 3008cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
92a596e8 3009 bool lval,
2d76680f
PC
3010 bool *non_constant_p, bool *overflow_p)
3011{
3012 vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
2d76680f
PC
3013 bool changed = false;
3014 gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (t));
8a29084d 3015 tree type = TREE_TYPE (t);
3e605b20 3016
8a29084d 3017 constexpr_ctx new_ctx;
d4619dc1 3018 if (TYPE_PTRMEMFUNC_P (type) || VECTOR_TYPE_P (type))
8a29084d 3019 {
d4619dc1
NS
3020 /* We don't really need the ctx->ctor business for a PMF or
3021 vector, but it's simpler to use the same code. */
8a29084d
JM
3022 new_ctx = *ctx;
3023 new_ctx.ctor = build_constructor (type, NULL);
3024 new_ctx.object = NULL_TREE;
3025 ctx = &new_ctx;
3026 };
3027 verify_ctor_sanity (ctx, type);
3e605b20
JM
3028 vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
3029 vec_alloc (*p, vec_safe_length (v));
3030
2d63bc39
JM
3031 unsigned i;
3032 tree index, value;
3033 bool constant_p = true;
3034 bool side_effects_p = false;
3e605b20 3035 FOR_EACH_CONSTRUCTOR_ELT (v, i, index, value)
2d76680f 3036 {
bcb5f3c9 3037 tree orig_value = value;
3e605b20
JM
3038 init_subob_ctx (ctx, new_ctx, index, value);
3039 if (new_ctx.ctor != ctx->ctor)
3040 /* If we built a new CONSTRUCTOR, attach it now so that other
3041 initializers can refer to it. */
3042 CONSTRUCTOR_APPEND_ELT (*p, index, new_ctx.ctor);
3043 tree elt = cxx_eval_constant_expression (&new_ctx, value,
92a596e8 3044 lval,
5a804683 3045 non_constant_p, overflow_p);
2d76680f 3046 /* Don't VERIFY_CONSTANT here. */
2b3ab879 3047 if (ctx->quiet && *non_constant_p)
3e605b20 3048 break;
bcb5f3c9 3049 if (elt != orig_value)
2d76680f 3050 changed = true;
2d63bc39
JM
3051
3052 if (!TREE_CONSTANT (elt))
3053 constant_p = false;
3054 if (TREE_SIDE_EFFECTS (elt))
3055 side_effects_p = true;
3e605b20 3056 if (index && TREE_CODE (index) == COMPONENT_REF)
2d76680f
PC
3057 {
3058 /* This is an initialization of a vfield inside a base
3059 subaggregate that we already initialized; push this
3060 initialization into the previous initialization. */
3e605b20 3061 constructor_elt *inner = base_field_constructor_elt (*p, index);
2d76680f 3062 inner->value = elt;
3e605b20 3063 changed = true;
2d76680f 3064 }
3e605b20
JM
3065 else if (index
3066 && (TREE_CODE (index) == NOP_EXPR
3067 || TREE_CODE (index) == POINTER_PLUS_EXPR))
2d76680f
PC
3068 {
3069 /* This is an initializer for an empty base; now that we've
3070 checked that it's constant, we can ignore it. */
3e605b20
JM
3071 gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (index))));
3072 changed = true;
3073 }
2d76680f 3074 else
ac9ec198 3075 {
1bdbef09
MP
3076 if (new_ctx.ctor != ctx->ctor)
3077 {
3078 /* We appended this element above; update the value. */
3079 gcc_assert ((*p)->last().index == index);
3080 (*p)->last().value = elt;
3081 }
3082 else
3083 CONSTRUCTOR_APPEND_ELT (*p, index, elt);
3084 /* Adding or replacing an element might change the ctor's flags. */
ac9ec198
MP
3085 TREE_CONSTANT (ctx->ctor) = constant_p;
3086 TREE_SIDE_EFFECTS (ctx->ctor) = side_effects_p;
3087 }
2d76680f
PC
3088 }
3089 if (*non_constant_p || !changed)
3e605b20
JM
3090 return t;
3091 t = ctx->ctor;
3092 /* We're done building this CONSTRUCTOR, so now we can interpret an
3093 element without an explicit initializer as value-initialized. */
e8c48716 3094 CONSTRUCTOR_NO_CLEARING (t) = false;
2d63bc39
JM
3095 TREE_CONSTANT (t) = constant_p;
3096 TREE_SIDE_EFFECTS (t) = side_effects_p;
8a29084d 3097 if (VECTOR_TYPE_P (type))
2d76680f
PC
3098 t = fold (t);
3099 return t;
3100}
3101
3102/* Subroutine of cxx_eval_constant_expression.
3103 The expression tree T is a VEC_INIT_EXPR which denotes the desired
3104 initialization of a non-static data member of array type. Reduce it to a
3105 CONSTRUCTOR.
3106
3107 Note that apart from value-initialization (when VALUE_INIT is true),
3108 this is only intended to support value-initialization and the
3109 initializations done by defaulted constructors for classes with
3110 non-static data members of array type. In this case, VEC_INIT_EXPR_INIT
3111 will either be NULL_TREE for the default constructor, or a COMPONENT_REF
3112 for the copy/move constructor. */
3113
3114static tree
3e605b20 3115cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
92a596e8 3116 bool value_init, bool lval,
2d76680f
PC
3117 bool *non_constant_p, bool *overflow_p)
3118{
3119 tree elttype = TREE_TYPE (atype);
3e605b20
JM
3120 verify_ctor_sanity (ctx, atype);
3121 vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
2d76680f 3122 bool pre_init = false;
4784470a 3123 unsigned HOST_WIDE_INT i;
dc5ca6c8 3124 tsubst_flags_t complain = ctx->quiet ? tf_none : tf_warning_or_error;
2d76680f
PC
3125
3126 /* For the default constructor, build up a call to the default
3127 constructor of the element type. We only need to handle class types
3128 here, as for a constructor to be constexpr, all members must be
3129 initialized, which for a defaulted default constructor means they must
3130 be of a class type with a constexpr default constructor. */
3131 if (TREE_CODE (elttype) == ARRAY_TYPE)
3132 /* We only do this at the lowest level. */;
3133 else if (value_init)
3134 {
dc5ca6c8 3135 init = build_value_init (elttype, complain);
2d76680f
PC
3136 pre_init = true;
3137 }
3138 else if (!init)
3139 {
cd9cf97b 3140 releasing_vec argvec;
2d76680f
PC
3141 init = build_special_member_call (NULL_TREE, complete_ctor_identifier,
3142 &argvec, elttype, LOOKUP_NORMAL,
dc5ca6c8 3143 complain);
5dab8b11 3144 init = build_aggr_init_expr (elttype, init);
2d76680f
PC
3145 pre_init = true;
3146 }
3147
74f8705e
MP
3148 tree nelts = get_array_or_vector_nelts (ctx, atype, non_constant_p,
3149 overflow_p);
3150 unsigned HOST_WIDE_INT max = tree_to_uhwi (nelts);
4784470a 3151 for (i = 0; i < max; ++i)
2d76680f
PC
3152 {
3153 tree idx = build_int_cst (size_type_node, i);
3154 tree eltinit;
928af3bf 3155 bool reuse = false;
3e605b20
JM
3156 constexpr_ctx new_ctx;
3157 init_subob_ctx (ctx, new_ctx, idx, pre_init ? init : elttype);
3158 if (new_ctx.ctor != ctx->ctor)
3159 CONSTRUCTOR_APPEND_ELT (*p, idx, new_ctx.ctor);
2d76680f
PC
3160 if (TREE_CODE (elttype) == ARRAY_TYPE)
3161 {
3162 /* A multidimensional array; recurse. */
3163 if (value_init || init == NULL_TREE)
928af3bf
JJ
3164 {
3165 eltinit = NULL_TREE;
3166 reuse = i == 0;
3167 }
2d76680f 3168 else
dc5ca6c8 3169 eltinit = cp_build_array_ref (input_location, init, idx, complain);
3e605b20 3170 eltinit = cxx_eval_vec_init_1 (&new_ctx, elttype, eltinit, value_init,
92a596e8 3171 lval,
2d76680f
PC
3172 non_constant_p, overflow_p);
3173 }
3174 else if (pre_init)
3175 {
3176 /* Initializing an element using value or default initialization
3177 we just pre-built above. */
3ee378fb
JM
3178 if (init == void_node)
3179 /* Trivial default-init, don't do anything to the CONSTRUCTOR. */
3180 return ctx->ctor;
928af3bf
JJ
3181 eltinit = cxx_eval_constant_expression (&new_ctx, init, lval,
3182 non_constant_p, overflow_p);
3183 reuse = i == 0;
2d76680f
PC
3184 }
3185 else
3186 {
3187 /* Copying an element. */
3188 gcc_assert (same_type_ignoring_top_level_qualifiers_p
3189 (atype, TREE_TYPE (init)));
dc5ca6c8 3190 eltinit = cp_build_array_ref (input_location, init, idx, complain);
72b3e203 3191 if (!lvalue_p (init))
2d76680f 3192 eltinit = move (eltinit);
dc5ca6c8 3193 eltinit = force_rvalue (eltinit, complain);
c2236b9b
JJ
3194 eltinit = cxx_eval_constant_expression (&new_ctx, eltinit, lval,
3195 non_constant_p, overflow_p);
2d76680f 3196 }
2b3ab879 3197 if (*non_constant_p && !ctx->quiet)
3e605b20
JM
3198 break;
3199 if (new_ctx.ctor != ctx->ctor)
3200 {
3201 /* We appended this element above; update the value. */
3202 gcc_assert ((*p)->last().index == idx);
3203 (*p)->last().value = eltinit;
3204 }
3205 else
3206 CONSTRUCTOR_APPEND_ELT (*p, idx, eltinit);
928af3bf 3207 /* Reuse the result of cxx_eval_constant_expression call
c2236b9b
JJ
3208 from the first iteration to all others if it is a constant
3209 initializer that doesn't require relocations. */
928af3bf
JJ
3210 if (reuse
3211 && max > 1
c2236b9b
JJ
3212 && (eltinit == NULL_TREE
3213 || (initializer_constant_valid_p (eltinit, TREE_TYPE (eltinit))
3214 == null_pointer_node)))
928af3bf
JJ
3215 {
3216 if (new_ctx.ctor != ctx->ctor)
3217 eltinit = new_ctx.ctor;
1e027956
RB
3218 tree range = build2 (RANGE_EXPR, size_type_node,
3219 build_int_cst (size_type_node, 1),
3220 build_int_cst (size_type_node, max - 1));
3221 CONSTRUCTOR_APPEND_ELT (*p, range, unshare_constructor (eltinit));
928af3bf
JJ
3222 break;
3223 }
1e027956
RB
3224 else if (i == 0)
3225 vec_safe_reserve (*p, max);
2d76680f
PC
3226 }
3227
3228 if (!*non_constant_p)
3229 {
3e605b20 3230 init = ctx->ctor;
e8c48716 3231 CONSTRUCTOR_NO_CLEARING (init) = false;
2d76680f 3232 }
2d76680f
PC
3233 return init;
3234}
3235
3236static tree
3e605b20 3237cxx_eval_vec_init (const constexpr_ctx *ctx, tree t,
92a596e8 3238 bool lval,
2d76680f
PC
3239 bool *non_constant_p, bool *overflow_p)
3240{
3241 tree atype = TREE_TYPE (t);
3242 tree init = VEC_INIT_EXPR_INIT (t);
3e605b20 3243 tree r = cxx_eval_vec_init_1 (ctx, atype, init,
2d76680f 3244 VEC_INIT_EXPR_VALUE_INIT (t),
92a596e8 3245 lval, non_constant_p, overflow_p);
2d76680f
PC
3246 if (*non_constant_p)
3247 return t;
3248 else
3249 return r;
3250}
3251
e4511ca2
JM
3252/* Like same_type_ignoring_top_level_qualifiers_p, but also handle the case
3253 where the desired type is an array of unknown bounds because the variable
3254 has had its bounds deduced since the wrapping expression was created. */
3255
3256static bool
3257same_type_ignoring_tlq_and_bounds_p (tree type1, tree type2)
3258{
3259 while (TREE_CODE (type1) == ARRAY_TYPE
3260 && TREE_CODE (type2) == ARRAY_TYPE
3261 && (!TYPE_DOMAIN (type1) || !TYPE_DOMAIN (type2)))
3262 {
3263 type1 = TREE_TYPE (type1);
3264 type2 = TREE_TYPE (type2);
3265 }
3266 return same_type_ignoring_top_level_qualifiers_p (type1, type2);
3267}
3268
2d76680f
PC
3269/* A less strict version of fold_indirect_ref_1, which requires cv-quals to
3270 match. We want to be less strict for simple *& folding; if we have a
3271 non-const temporary that we access through a const pointer, that should
3272 work. We handle this here rather than change fold_indirect_ref_1
3273 because we're dealing with things like ADDR_EXPR of INTEGER_CST which
3274 don't really make sense outside of constant expression evaluation. Also
3275 we want to allow folding to COMPONENT_REF, which could cause trouble
3276 with TBAA in fold_indirect_ref_1.
3277
3278 Try to keep this function synced with fold_indirect_ref_1. */
3279
3280static tree
3281cxx_fold_indirect_ref (location_t loc, tree type, tree op0, bool *empty_base)
3282{
ebe4bf41
MP
3283 tree sub = op0;
3284 tree subtype;
3285 poly_uint64 const_op01;
2d76680f 3286
2d76680f
PC
3287 STRIP_NOPS (sub);
3288 subtype = TREE_TYPE (sub);
71a93b08 3289 if (!INDIRECT_TYPE_P (subtype))
2d76680f
PC
3290 return NULL_TREE;
3291
3292 if (TREE_CODE (sub) == ADDR_EXPR)
3293 {
3294 tree op = TREE_OPERAND (sub, 0);
3295 tree optype = TREE_TYPE (op);
3296
3297 /* *&CONST_DECL -> to the value of the const decl. */
3298 if (TREE_CODE (op) == CONST_DECL)
3299 return DECL_INITIAL (op);
3300 /* *&p => p; make sure to handle *&"str"[cst] here. */
e4511ca2 3301 if (same_type_ignoring_tlq_and_bounds_p (optype, type))
2d76680f
PC
3302 {
3303 tree fop = fold_read_from_constant_string (op);
3304 if (fop)
3305 return fop;
3306 else
3307 return op;
3308 }
3309 /* *(foo *)&fooarray => fooarray[0] */
3310 else if (TREE_CODE (optype) == ARRAY_TYPE
3311 && (same_type_ignoring_top_level_qualifiers_p
3312 (type, TREE_TYPE (optype))))
3313 {
3314 tree type_domain = TYPE_DOMAIN (optype);
3315 tree min_val = size_zero_node;
3316 if (type_domain && TYPE_MIN_VALUE (type_domain))
3317 min_val = TYPE_MIN_VALUE (type_domain);
3318 return build4_loc (loc, ARRAY_REF, type, op, min_val,
3319 NULL_TREE, NULL_TREE);
3320 }
3321 /* *(foo *)&complexfoo => __real__ complexfoo */
3322 else if (TREE_CODE (optype) == COMPLEX_TYPE
3323 && (same_type_ignoring_top_level_qualifiers_p
3324 (type, TREE_TYPE (optype))))
3325 return fold_build1_loc (loc, REALPART_EXPR, type, op);
3326 /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
b55b02ea 3327 else if (VECTOR_TYPE_P (optype)
2d76680f
PC
3328 && (same_type_ignoring_top_level_qualifiers_p
3329 (type, TREE_TYPE (optype))))
3330 {
3331 tree part_width = TYPE_SIZE (type);
3332 tree index = bitsize_int (0);
ebe4bf41
MP
3333 return fold_build3_loc (loc, BIT_FIELD_REF, type, op, part_width,
3334 index);
2d76680f
PC
3335 }
3336 /* Also handle conversion to an empty base class, which
3337 is represented with a NOP_EXPR. */
3338 else if (is_empty_class (type)
3339 && CLASS_TYPE_P (optype)
3340 && DERIVED_FROM_P (type, optype))
3341 {
3342 *empty_base = true;
3343 return op;
3344 }
3345 /* *(foo *)&struct_with_foo_field => COMPONENT_REF */
3346 else if (RECORD_OR_UNION_TYPE_P (optype))
3347 {
3348 tree field = TYPE_FIELDS (optype);
3349 for (; field; field = DECL_CHAIN (field))
3350 if (TREE_CODE (field) == FIELD_DECL
b912f962 3351 && TREE_TYPE (field) != error_mark_node
2d76680f
PC
3352 && integer_zerop (byte_position (field))
3353 && (same_type_ignoring_top_level_qualifiers_p
3354 (TREE_TYPE (field), type)))
b912f962 3355 return fold_build3 (COMPONENT_REF, type, op, field, NULL_TREE);
2d76680f
PC
3356 }
3357 }
3358 else if (TREE_CODE (sub) == POINTER_PLUS_EXPR
ebe4bf41 3359 && poly_int_tree_p (TREE_OPERAND (sub, 1), &const_op01))
2d76680f
PC
3360 {
3361 tree op00 = TREE_OPERAND (sub, 0);
3362 tree op01 = TREE_OPERAND (sub, 1);
3363
3364 STRIP_NOPS (op00);
3365 if (TREE_CODE (op00) == ADDR_EXPR)
3366 {
3367 tree op00type;
3368 op00 = TREE_OPERAND (op00, 0);
3369 op00type = TREE_TYPE (op00);
3370
3371 /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
b55b02ea 3372 if (VECTOR_TYPE_P (op00type)
ebe4bf41
MP
3373 && same_type_ignoring_top_level_qualifiers_p
3374 (type, TREE_TYPE (op00type))
3375 /* POINTER_PLUS_EXPR second operand is sizetype, unsigned,
3376 but we want to treat offsets with MSB set as negative.
3377 For the code below negative offsets are invalid and
3378 TYPE_SIZE of the element is something unsigned, so
3379 check whether op01 fits into poly_int64, which implies
3380 it is from 0 to INTTYPE_MAXIMUM (HOST_WIDE_INT), and
3381 then just use poly_uint64 because we want to treat the
3382 value as unsigned. */
3383 && tree_fits_poly_int64_p (op01))
2d76680f 3384 {
2d76680f 3385 tree part_width = TYPE_SIZE (type);
ebe4bf41
MP
3386 poly_uint64 max_offset
3387 = (tree_to_uhwi (part_width) / BITS_PER_UNIT
3388 * TYPE_VECTOR_SUBPARTS (op00type));
3389 if (known_lt (const_op01, max_offset))
3390 {
3391 tree index = bitsize_int (const_op01 * BITS_PER_UNIT);
3392 return fold_build3_loc (loc,
3393 BIT_FIELD_REF, type, op00,
3394 part_width, index);
3395 }
2d76680f
PC
3396 }
3397 /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
3398 else if (TREE_CODE (op00type) == COMPLEX_TYPE
3399 && (same_type_ignoring_top_level_qualifiers_p
3400 (type, TREE_TYPE (op00type))))
3401 {
ebe4bf41
MP
3402 if (known_eq (wi::to_poly_offset (TYPE_SIZE_UNIT (type)),
3403 const_op01))
2d76680f
PC
3404 return fold_build1_loc (loc, IMAGPART_EXPR, type, op00);
3405 }
3406 /* ((foo *)&fooarray)[1] => fooarray[1] */
3407 else if (TREE_CODE (op00type) == ARRAY_TYPE
3408 && (same_type_ignoring_top_level_qualifiers_p
3409 (type, TREE_TYPE (op00type))))
3410 {
3411 tree type_domain = TYPE_DOMAIN (op00type);
3412 tree min_val = size_zero_node;
3413 if (type_domain && TYPE_MIN_VALUE (type_domain))
3414 min_val = TYPE_MIN_VALUE (type_domain);
b07c3651
MP
3415 offset_int off = wi::to_offset (op01);
3416 offset_int el_sz = wi::to_offset (TYPE_SIZE_UNIT (type));
3417 offset_int remainder;
3418 off = wi::divmod_trunc (off, el_sz, SIGNED, &remainder);
3419 if (remainder == 0 && TREE_CODE (min_val) == INTEGER_CST)
3420 {
3421 off = off + wi::to_offset (min_val);
3422 op01 = wide_int_to_tree (sizetype, off);
3423 return build4_loc (loc, ARRAY_REF, type, op00, op01,
3424 NULL_TREE, NULL_TREE);
3425 }
2d76680f
PC
3426 }
3427 /* Also handle conversion to an empty base class, which
3428 is represented with a NOP_EXPR. */
3429 else if (is_empty_class (type)
3430 && CLASS_TYPE_P (op00type)
3431 && DERIVED_FROM_P (type, op00type))
3432 {
3433 *empty_base = true;
3434 return op00;
3435 }
3436 /* ((foo *)&struct_with_foo_field)[1] => COMPONENT_REF */
3437 else if (RECORD_OR_UNION_TYPE_P (op00type))
3438 {
3439 tree field = TYPE_FIELDS (op00type);
3440 for (; field; field = DECL_CHAIN (field))
3441 if (TREE_CODE (field) == FIELD_DECL
b912f962 3442 && TREE_TYPE (field) != error_mark_node
2d76680f
PC
3443 && tree_int_cst_equal (byte_position (field), op01)
3444 && (same_type_ignoring_top_level_qualifiers_p
3445 (TREE_TYPE (field), type)))
b912f962
JJ
3446 return fold_build3 (COMPONENT_REF, type, op00,
3447 field, NULL_TREE);
2d76680f
PC
3448 }
3449 }
3450 }
3451 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
3452 else if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
3453 && (same_type_ignoring_top_level_qualifiers_p
3454 (type, TREE_TYPE (TREE_TYPE (subtype)))))
3455 {
3456 tree type_domain;
3457 tree min_val = size_zero_node;
ebe4bf41
MP
3458 tree newsub
3459 = cxx_fold_indirect_ref (loc, TREE_TYPE (subtype), sub, NULL);
2d76680f
PC
3460 if (newsub)
3461 sub = newsub;
3462 else
3463 sub = build1_loc (loc, INDIRECT_REF, TREE_TYPE (subtype), sub);
3464 type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
3465 if (type_domain && TYPE_MIN_VALUE (type_domain))
3466 min_val = TYPE_MIN_VALUE (type_domain);
3467 return build4_loc (loc, ARRAY_REF, type, sub, min_val, NULL_TREE,
3468 NULL_TREE);
3469 }
3470
3471 return NULL_TREE;
3472}
3473
3474static tree
3e605b20 3475cxx_eval_indirect_ref (const constexpr_ctx *ctx, tree t,
92a596e8 3476 bool lval,
2d76680f
PC
3477 bool *non_constant_p, bool *overflow_p)
3478{
3479 tree orig_op0 = TREE_OPERAND (t, 0);
2d76680f 3480 bool empty_base = false;
2d76680f 3481
cda0a029
JM
3482 /* We can handle a MEM_REF like an INDIRECT_REF, if MEM_REF's second
3483 operand is an integer-zero. Otherwise reject the MEM_REF for now. */
3484
3485 if (TREE_CODE (t) == MEM_REF
3486 && (!TREE_OPERAND (t, 1) || !integer_zerop (TREE_OPERAND (t, 1))))
3487 {
3488 gcc_assert (ctx->quiet);
3489 *non_constant_p = true;
3490 return t;
3491 }
3492
255a48d6
JM
3493 /* First try to simplify it directly. */
3494 tree r = cxx_fold_indirect_ref (EXPR_LOCATION (t), TREE_TYPE (t), orig_op0,
3495 &empty_base);
3496 if (!r)
2d76680f 3497 {
255a48d6
JM
3498 /* If that didn't work, evaluate the operand first. */
3499 tree op0 = cxx_eval_constant_expression (ctx, orig_op0,
3500 /*lval*/false, non_constant_p,
3501 overflow_p);
3502 /* Don't VERIFY_CONSTANT here. */
3503 if (*non_constant_p)
3504 return t;
3505
8bada5cd
MS
3506 if (!lval && integer_zerop (op0))
3507 {
3508 if (!ctx->quiet)
3509 error ("dereferencing a null pointer");
3510 *non_constant_p = true;
3511 return t;
3512 }
3513
255a48d6
JM
3514 r = cxx_fold_indirect_ref (EXPR_LOCATION (t), TREE_TYPE (t), op0,
3515 &empty_base);
3516 if (r == NULL_TREE)
2d76680f
PC
3517 {
3518 /* We couldn't fold to a constant value. Make sure it's not
3519 something we should have been able to fold. */
255a48d6
JM
3520 tree sub = op0;
3521 STRIP_NOPS (sub);
3522 if (TREE_CODE (sub) == ADDR_EXPR)
3523 {
3524 gcc_assert (!same_type_ignoring_top_level_qualifiers_p
3525 (TREE_TYPE (TREE_TYPE (sub)), TREE_TYPE (t)));
3526 /* DR 1188 says we don't have to deal with this. */
3527 if (!ctx->quiet)
3528 error ("accessing value of %qE through a %qT glvalue in a "
3529 "constant expression", build_fold_indirect_ref (sub),
3530 TREE_TYPE (t));
3531 *non_constant_p = true;
3532 return t;
3533 }
3534
3535 if (lval && op0 != orig_op0)
3536 return build1 (INDIRECT_REF, TREE_TYPE (t), op0);
3537 if (!lval)
3538 VERIFY_CONSTANT (t);
2d76680f
PC
3539 return t;
3540 }
3541 }
3542
255a48d6
JM
3543 r = cxx_eval_constant_expression (ctx, r,
3544 lval, non_constant_p, overflow_p);
3545 if (*non_constant_p)
3546 return t;
3547
125db6a1 3548 /* If we're pulling out the value of an empty base, just return an empty
2d76680f 3549 CONSTRUCTOR. */
92a596e8 3550 if (empty_base && !lval)
2d76680f 3551 {
2d76680f
PC
3552 r = build_constructor (TREE_TYPE (t), NULL);
3553 TREE_CONSTANT (r) = true;
3554 }
3555
2d76680f
PC
3556 return r;
3557}
3558
3559/* Complain about R, a VAR_DECL, not being usable in a constant expression.
3560 Shared between potential_constant_expression and
3561 cxx_eval_constant_expression. */
3562
3563static void
3564non_const_var_error (tree r)
3565{
3566 tree type = TREE_TYPE (r);
3567 error ("the value of %qD is not usable in a constant "
3568 "expression", r);
3569 /* Avoid error cascade. */
3570 if (DECL_INITIAL (r) == error_mark_node)
3571 return;
3572 if (DECL_DECLARED_CONSTEXPR_P (r))
3573 inform (DECL_SOURCE_LOCATION (r),
3574 "%qD used in its own initializer", r);
3575 else if (INTEGRAL_OR_ENUMERATION_TYPE_P (type))
3576 {
3577 if (!CP_TYPE_CONST_P (type))
3578 inform (DECL_SOURCE_LOCATION (r),
3579 "%q#D is not const", r);
3580 else if (CP_TYPE_VOLATILE_P (type))
3581 inform (DECL_SOURCE_LOCATION (r),
3582 "%q#D is volatile", r);
3583 else if (!DECL_INITIAL (r)
a3e2b438
PP
3584 || !TREE_CONSTANT (DECL_INITIAL (r))
3585 || !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (r))
2d76680f
PC
3586 inform (DECL_SOURCE_LOCATION (r),
3587 "%qD was not initialized with a constant "
3588 "expression", r);
3589 else
3590 gcc_unreachable ();
3591 }
9f613f06 3592 else if (TYPE_REF_P (type))
fd338b13
JM
3593 inform (DECL_SOURCE_LOCATION (r),
3594 "%qD was not initialized with a constant "
3595 "expression", r);
2d76680f
PC
3596 else
3597 {
3598 if (cxx_dialect >= cxx11 && !DECL_DECLARED_CONSTEXPR_P (r))
3599 inform (DECL_SOURCE_LOCATION (r),
3600 "%qD was not declared %<constexpr%>", r);
3601 else
3602 inform (DECL_SOURCE_LOCATION (r),
3603 "%qD does not have integral or enumeration type",
3604 r);
3605 }
3606}
3607
3608/* Subroutine of cxx_eval_constant_expression.
3609 Like cxx_eval_unary_expression, except for trinary expressions. */
3610
3611static tree
3e605b20 3612cxx_eval_trinary_expression (const constexpr_ctx *ctx, tree t,
92a596e8 3613 bool lval,
2d76680f
PC
3614 bool *non_constant_p, bool *overflow_p)
3615{
3616 int i;
3617 tree args[3];
3618 tree val;
3619
3620 for (i = 0; i < 3; i++)
3621 {
3e605b20 3622 args[i] = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, i),
92a596e8 3623 lval,
5a804683 3624 non_constant_p, overflow_p);
2d76680f
PC
3625 VERIFY_CONSTANT (args[i]);
3626 }
3627
3628 val = fold_ternary_loc (EXPR_LOCATION (t), TREE_CODE (t), TREE_TYPE (t),
3629 args[0], args[1], args[2]);
3630 if (val == NULL_TREE)
3631 return t;
3632 VERIFY_CONSTANT (val);
3633 return val;
3634}
3635
98e5a19a
JM
3636/* True if T was declared in a function declared to be constexpr, and
3637 therefore potentially constant in C++14. */
3638
2d76680f
PC
3639bool
3640var_in_constexpr_fn (tree t)
3641{
3642 tree ctx = DECL_CONTEXT (t);
98e5a19a 3643 return (ctx && TREE_CODE (ctx) == FUNCTION_DECL
2d76680f
PC
3644 && DECL_DECLARED_CONSTEXPR_P (ctx));
3645}
3646
98e5a19a
JM
3647/* True if T was declared in a function that might be constexpr: either a
3648 function that was declared constexpr, or a C++17 lambda op(). */
3649
3650bool
3651var_in_maybe_constexpr_fn (tree t)
3652{
7b936140 3653 if (cxx_dialect >= cxx17
98e5a19a
JM
3654 && DECL_FUNCTION_SCOPE_P (t)
3655 && LAMBDA_FUNCTION_P (DECL_CONTEXT (t)))
3656 return true;
3657 return var_in_constexpr_fn (t);
3658}
3659
68d01920
JM
3660/* We're assigning INIT to TARGET. In do_build_copy_constructor and
3661 build_over_call we implement trivial copy of a class with tail padding using
3662 assignment of character arrays, which is valid in normal code, but not in
3663 constexpr evaluation. We don't need to worry about clobbering tail padding
3664 in constexpr evaluation, so strip the type punning. */
3665
3666static void
3667maybe_simplify_trivial_copy (tree &target, tree &init)
3668{
3669 if (TREE_CODE (target) == MEM_REF
3670 && TREE_CODE (init) == MEM_REF
3671 && TREE_TYPE (target) == TREE_TYPE (init)
3672 && TREE_CODE (TREE_TYPE (target)) == ARRAY_TYPE
3673 && TREE_TYPE (TREE_TYPE (target)) == unsigned_char_type_node)
3674 {
3675 target = build_fold_indirect_ref (TREE_OPERAND (target, 0));
3676 init = build_fold_indirect_ref (TREE_OPERAND (init, 0));
3677 }
3678}
3679
60813a46
JM
3680/* Evaluate an INIT_EXPR or MODIFY_EXPR. */
3681
3682static tree
3683cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
92a596e8 3684 bool lval,
60813a46
JM
3685 bool *non_constant_p, bool *overflow_p)
3686{
3687 constexpr_ctx new_ctx = *ctx;
3688
58cc255c
JM
3689 tree init = TREE_OPERAND (t, 1);
3690 if (TREE_CLOBBER_P (init))
3691 /* Just ignore clobbers. */
3692 return void_node;
3693
60813a46
JM
3694 /* First we figure out where we're storing to. */
3695 tree target = TREE_OPERAND (t, 0);
68d01920
JM
3696
3697 maybe_simplify_trivial_copy (target, init);
3698
3f8e2835 3699 tree type = TREE_TYPE (target);
e8b3c1bc
JM
3700 bool preeval = SCALAR_TYPE_P (type) || TREE_CODE (t) == MODIFY_EXPR;
3701 if (preeval)
3702 {
3703 /* Evaluate the value to be stored without knowing what object it will be
3704 stored in, so that any side-effects happen first. */
3705 if (!SCALAR_TYPE_P (type))
3706 new_ctx.ctor = new_ctx.object = NULL_TREE;
3707 init = cxx_eval_constant_expression (&new_ctx, init, false,
3708 non_constant_p, overflow_p);
3709 if (*non_constant_p)
3710 return t;
3711 }
60813a46 3712 target = cxx_eval_constant_expression (ctx, target,
2b3ab879 3713 true,
5a804683 3714 non_constant_p, overflow_p);
60813a46
JM
3715 if (*non_constant_p)
3716 return t;
3717
bc2a38df
JJ
3718 /* cxx_eval_array_reference for lval = true allows references one past
3719 end of array, because it does not know if it is just taking address
3720 (which is valid), or actual dereference. Here we know it is
3721 a dereference, so diagnose it here. */
3722 for (tree probe = target; probe; )
3723 {
3724 switch (TREE_CODE (probe))
3725 {
3726 case ARRAY_REF:
3727 tree nelts, ary;
3728 ary = TREE_OPERAND (probe, 0);
74f8705e
MP
3729 nelts = get_array_or_vector_nelts (ctx, TREE_TYPE (ary),
3730 non_constant_p, overflow_p);
bc2a38df
JJ
3731 VERIFY_CONSTANT (nelts);
3732 gcc_assert (TREE_CODE (nelts) == INTEGER_CST
3733 && TREE_CODE (TREE_OPERAND (probe, 1)) == INTEGER_CST);
a1488398 3734 if (wi::to_widest (TREE_OPERAND (probe, 1)) == wi::to_widest (nelts))
bc2a38df
JJ
3735 {
3736 diag_array_subscript (ctx, ary, TREE_OPERAND (probe, 1));
3737 *non_constant_p = true;
3738 return t;
3739 }
3740 /* FALLTHRU */
3741
3742 case BIT_FIELD_REF:
3743 case COMPONENT_REF:
3744 probe = TREE_OPERAND (probe, 0);
3745 continue;
3746
3747 default:
3748 probe = NULL_TREE;
3749 continue;
3750 }
3751 }
3752
3f8e2835
JM
3753 if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (target), type))
3754 {
3755 /* For initialization of an empty base, the original target will be
3756 *(base*)this, which the above evaluation resolves to the object
3757 argument, which has the derived type rather than the base type. In
3758 this situation, just evaluate the initializer and return, since
3759 there's no actual data to store. */
3760 gcc_assert (is_empty_class (type));
3761 return cxx_eval_constant_expression (ctx, init, false,
3762 non_constant_p, overflow_p);
3763 }
3764
60813a46 3765 /* And then find the underlying variable. */
cd9cf97b 3766 releasing_vec refs;
60813a46
JM
3767 tree object = NULL_TREE;
3768 for (tree probe = target; object == NULL_TREE; )
3769 {
3770 switch (TREE_CODE (probe))
3771 {
3772 case BIT_FIELD_REF:
3773 case COMPONENT_REF:
3774 case ARRAY_REF:
3775 vec_safe_push (refs, TREE_OPERAND (probe, 1));
3776 vec_safe_push (refs, TREE_TYPE (probe));
3777 probe = TREE_OPERAND (probe, 0);
3778 break;
3779
3780 default:
3781 object = probe;
60813a46
JM
3782 }
3783 }
3784
3785 /* And then find/build up our initializer for the path to the subobject
3786 we're initializing. */
a1408b7e 3787 tree *valp;
1e163090
JM
3788 if (object == ctx->object && VAR_P (object)
3789 && DECL_NAME (object) && ctx->call == NULL)
3790 /* The variable we're building up an aggregate initializer for is outside
3791 the constant-expression, so don't evaluate the store. We check
3792 DECL_NAME to handle TARGET_EXPR temporaries, which are fair game. */
3793 valp = NULL;
3794 else if (DECL_P (object))
a1408b7e
JM
3795 valp = ctx->values->get (object);
3796 else
3797 valp = NULL;
60813a46
JM
3798 if (!valp)
3799 {
3800 /* A constant-expression cannot modify objects from outside the
3801 constant-expression. */
2b3ab879 3802 if (!ctx->quiet)
64d6d399 3803 error ("modification of %qE is not a constant expression", object);
60813a46
JM
3804 *non_constant_p = true;
3805 return t;
3806 }
3f8e2835 3807 type = TREE_TYPE (object);
c75ce530 3808 bool no_zero_init = true;
2d63bc39 3809
cd9cf97b 3810 releasing_vec ctors;
60813a46
JM
3811 while (!refs->is_empty())
3812 {
3813 if (*valp == NULL_TREE)
3814 {
3815 *valp = build_constructor (type, NULL);
e8c48716 3816 CONSTRUCTOR_NO_CLEARING (*valp) = no_zero_init;
60813a46 3817 }
d6b46fca
NS
3818 else if (TREE_CODE (*valp) == STRING_CST)
3819 {
3820 /* An array was initialized with a string constant, and now
3821 we're writing into one of its elements. Explode the
3822 single initialization into a set of element
3823 initializations. */
3824 gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
3825
3826 tree string = *valp;
3827 tree elt_type = TREE_TYPE (type);
3828 unsigned chars_per_elt = (TYPE_PRECISION (elt_type)
3829 / TYPE_PRECISION (char_type_node));
3830 unsigned num_elts = TREE_STRING_LENGTH (string) / chars_per_elt;
3831 tree ary_ctor = build_constructor (type, NULL);
3832
3833 vec_safe_reserve (CONSTRUCTOR_ELTS (ary_ctor), num_elts);
3834 for (unsigned ix = 0; ix != num_elts; ix++)
3835 {
3836 constructor_elt elt =
3837 {
3838 build_int_cst (size_type_node, ix),
3839 extract_string_elt (string, chars_per_elt, ix)
3840 };
3841 CONSTRUCTOR_ELTS (ary_ctor)->quick_push (elt);
3842 }
3843
3844 *valp = ary_ctor;
3845 }
3846
c75ce530
JM
3847 /* If the value of object is already zero-initialized, any new ctors for
3848 subobjects will also be zero-initialized. */
e8c48716 3849 no_zero_init = CONSTRUCTOR_NO_CLEARING (*valp);
60813a46 3850
2d63bc39
JM
3851 vec_safe_push (ctors, *valp);
3852
ceaaf873 3853 enum tree_code code = TREE_CODE (type);
60813a46 3854 type = refs->pop();
ceaaf873 3855 tree index = refs->pop();
60813a46 3856
60813a46 3857 constructor_elt *cep = NULL;
ceaaf873
JM
3858 if (code == ARRAY_TYPE)
3859 {
3860 HOST_WIDE_INT i
3861 = find_array_ctor_elt (*valp, index, /*insert*/true);
3862 gcc_assert (i >= 0);
3863 cep = CONSTRUCTOR_ELT (*valp, i);
3864 gcc_assert (TREE_CODE (cep->index) != RANGE_EXPR);
3865 }
3866 else
3867 {
3868 gcc_assert (TREE_CODE (index) == FIELD_DECL);
88504f34
NS
3869
3870 /* We must keep the CONSTRUCTOR's ELTS in FIELD order.
3871 Usually we meet initializers in that order, but it is
3872 possible for base types to be placed not in program
3873 order. */
3874 tree fields = TYPE_FIELDS (DECL_CONTEXT (index));
3875 unsigned HOST_WIDE_INT idx;
3876
5c97093b
JM
3877 if (code == UNION_TYPE && CONSTRUCTOR_NELTS (*valp)
3878 && CONSTRUCTOR_ELT (*valp, 0)->index != index)
ed4ec9ce
JJ
3879 {
3880 if (cxx_dialect < cxx2a)
3881 {
3882 if (!ctx->quiet)
3883 error_at (cp_expr_loc_or_loc (t, input_location),
3884 "change of the active member of a union "
3885 "from %qD to %qD",
3886 CONSTRUCTOR_ELT (*valp, 0)->index,
3887 index);
3888 *non_constant_p = true;
3889 }
3890 /* Changing active member. */
3891 vec_safe_truncate (CONSTRUCTOR_ELTS (*valp), 0);
c7f7c313 3892 no_zero_init = true;
ed4ec9ce 3893 }
5c97093b 3894
88504f34 3895 for (idx = 0;
ceaaf873 3896 vec_safe_iterate (CONSTRUCTOR_ELTS (*valp), idx, &cep);
88504f34 3897 idx++, fields = DECL_CHAIN (fields))
ceaaf873 3898 {
88504f34
NS
3899 if (index == cep->index)
3900 goto found;
3901
3902 /* The field we're initializing must be on the field
3903 list. Look to see if it is present before the
3904 field the current ELT initializes. */
3905 for (; fields != cep->index; fields = DECL_CHAIN (fields))
3906 if (index == fields)
3907 goto insert;
ceaaf873 3908 }
88504f34
NS
3909
3910 /* We fell off the end of the CONSTRUCTOR, so insert a new
3911 entry at the end. */
3912 insert:
3913 {
3914 constructor_elt ce = { index, NULL_TREE };
3915
3916 vec_safe_insert (CONSTRUCTOR_ELTS (*valp), idx, ce);
3917 cep = CONSTRUCTOR_ELT (*valp, idx);
3918 }
3919 found:;
ceaaf873 3920 }
60813a46
JM
3921 valp = &cep->value;
3922 }
60813a46 3923
e8b3c1bc 3924 if (!preeval)
60813a46
JM
3925 {
3926 /* Create a new CONSTRUCTOR in case evaluation of the initializer
3927 wants to modify it. */
acb2970c 3928 if (*valp == NULL_TREE)
73a84269 3929 {
664beaf2 3930 *valp = build_constructor (type, NULL);
e8c48716 3931 CONSTRUCTOR_NO_CLEARING (*valp) = no_zero_init;
73a84269 3932 }
664beaf2 3933 new_ctx.ctor = *valp;
60813a46 3934 new_ctx.object = target;
e8b3c1bc
JM
3935 init = cxx_eval_constant_expression (&new_ctx, init, false,
3936 non_constant_p, overflow_p);
3937 if (target == object)
3938 /* The hash table might have moved since the get earlier. */
3939 valp = ctx->values->get (object);
60813a46
JM
3940 }
3941
7574c916 3942 /* Don't share a CONSTRUCTOR that might be changed later. */
0146e25f 3943 init = unshare_constructor (init);
d96e8407 3944
e8b3c1bc
JM
3945 if (*valp && TREE_CODE (*valp) == CONSTRUCTOR
3946 && TREE_CODE (init) == CONSTRUCTOR)
acb2970c 3947 {
d96e8407
JM
3948 /* An outer ctx->ctor might be pointing to *valp, so replace
3949 its contents. */
3950 CONSTRUCTOR_ELTS (*valp) = CONSTRUCTOR_ELTS (init);
3951 TREE_CONSTANT (*valp) = TREE_CONSTANT (init);
3952 TREE_SIDE_EFFECTS (*valp) = TREE_SIDE_EFFECTS (init);
e8c48716
JM
3953 CONSTRUCTOR_NO_CLEARING (*valp)
3954 = CONSTRUCTOR_NO_CLEARING (init);
acb2970c 3955 }
60813a46 3956 else
d96e8407 3957 *valp = init;
2d63bc39 3958
d96e8407
JM
3959 /* Update TREE_CONSTANT and TREE_SIDE_EFFECTS on enclosing
3960 CONSTRUCTORs, if any. */
3961 tree elt;
3962 unsigned i;
3963 bool c = TREE_CONSTANT (init);
3964 bool s = TREE_SIDE_EFFECTS (init);
3965 if (!c || s)
cd9cf97b 3966 FOR_EACH_VEC_ELT (*ctors, i, elt)
d96e8407
JM
3967 {
3968 if (!c)
3969 TREE_CONSTANT (elt) = false;
3970 if (s)
3971 TREE_SIDE_EFFECTS (elt) = true;
3972 }
60813a46
JM
3973
3974 if (*non_constant_p)
3975 return t;
92a596e8 3976 else if (lval)
60813a46
JM
3977 return target;
3978 else
3bdf0a9b 3979 return init;
60813a46
JM
3980}
3981
3982/* Evaluate a ++ or -- expression. */
3983
3984static tree
3985cxx_eval_increment_expression (const constexpr_ctx *ctx, tree t,
92a596e8 3986 bool lval,
60813a46
JM
3987 bool *non_constant_p, bool *overflow_p)
3988{
3989 enum tree_code code = TREE_CODE (t);
3990 tree type = TREE_TYPE (t);
3991 tree op = TREE_OPERAND (t, 0);
3992 tree offset = TREE_OPERAND (t, 1);
3993 gcc_assert (TREE_CONSTANT (offset));
3994
3995 /* The operand as an lvalue. */
2b3ab879 3996 op = cxx_eval_constant_expression (ctx, op, true,
5a804683 3997 non_constant_p, overflow_p);
60813a46
JM
3998
3999 /* The operand as an rvalue. */
84dd815f
JM
4000 tree val
4001 = cxx_eval_constant_expression (ctx, op, false,
4002 non_constant_p, overflow_p);
caee690e
JM
4003 /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
4004 a local array in a constexpr function. */
71a93b08 4005 bool ptr = INDIRECT_TYPE_P (TREE_TYPE (val));
caee690e
JM
4006 if (!ptr)
4007 VERIFY_CONSTANT (val);
60813a46
JM
4008
4009 /* The modified value. */
4010 bool inc = (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR);
ac2f8d26 4011 tree mod;
71a93b08 4012 if (INDIRECT_TYPE_P (type))
ac2f8d26
JM
4013 {
4014 /* The middle end requires pointers to use POINTER_PLUS_EXPR. */
4015 offset = convert_to_ptrofftype (offset);
4016 if (!inc)
4017 offset = fold_build1 (NEGATE_EXPR, TREE_TYPE (offset), offset);
4018 mod = fold_build2 (POINTER_PLUS_EXPR, type, val, offset);
4019 }
4020 else
4021 mod = fold_build2 (inc ? PLUS_EXPR : MINUS_EXPR, type, val, offset);
caee690e
JM
4022 if (!ptr)
4023 VERIFY_CONSTANT (mod);
60813a46
JM
4024
4025 /* Storing the modified value. */
4026 tree store = build2 (MODIFY_EXPR, type, op, mod);
2b3ab879 4027 cxx_eval_constant_expression (ctx, store,
5a804683 4028 true, non_constant_p, overflow_p);
ecdcd560 4029 ggc_free (store);
60813a46
JM
4030
4031 /* And the value of the expression. */
4032 if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
4033 {
4034 /* Prefix ops are lvalues. */
92a596e8 4035 if (lval)
60813a46
JM
4036 return op;
4037 else
4038 /* But we optimize when the caller wants an rvalue. */
4039 return mod;
4040 }
4041 else
4042 /* Postfix ops are rvalues. */
4043 return val;
4044}
4045
56632b27
JM
4046/* Predicates for the meaning of *jump_target. */
4047
4048static bool
4049returns (tree *jump_target)
4050{
4051 return *jump_target
d49318d9
PC
4052 && (TREE_CODE (*jump_target) == RETURN_EXPR
4053 || (TREE_CODE (*jump_target) == LABEL_DECL
4054 && LABEL_DECL_CDTOR (*jump_target)));
56632b27
JM
4055}
4056
4057static bool
4058breaks (tree *jump_target)
4059{
4060 return *jump_target
06ec22b7
JM
4061 && ((TREE_CODE (*jump_target) == LABEL_DECL
4062 && LABEL_DECL_BREAK (*jump_target))
3075affd 4063 || TREE_CODE (*jump_target) == BREAK_STMT
06ec22b7 4064 || TREE_CODE (*jump_target) == EXIT_EXPR);
56632b27
JM
4065}
4066
4067static bool
4068continues (tree *jump_target)
4069{
4070 return *jump_target
3075affd
JM
4071 && ((TREE_CODE (*jump_target) == LABEL_DECL
4072 && LABEL_DECL_CONTINUE (*jump_target))
4073 || TREE_CODE (*jump_target) == CONTINUE_STMT);
4074
56632b27
JM
4075}
4076
4077static bool
4078switches (tree *jump_target)
4079{
4080 return *jump_target
4081 && TREE_CODE (*jump_target) == INTEGER_CST;
4082}
4083
4084/* Subroutine of cxx_eval_statement_list. Determine whether the statement
4b390698
JJ
4085 STMT matches *jump_target. If we're looking for a case label and we see
4086 the default label, note it in ctx->css_state. */
56632b27
JM
4087
4088static bool
4b390698 4089label_matches (const constexpr_ctx *ctx, tree *jump_target, tree stmt)
56632b27 4090{
56632b27
JM
4091 switch (TREE_CODE (*jump_target))
4092 {
4093 case LABEL_DECL:
4094 if (TREE_CODE (stmt) == LABEL_EXPR
4095 && LABEL_EXPR_LABEL (stmt) == *jump_target)
4096 return true;
4097 break;
4098
4099 case INTEGER_CST:
4100 if (TREE_CODE (stmt) == CASE_LABEL_EXPR)
4101 {
4b390698 4102 gcc_assert (ctx->css_state != NULL);
56632b27 4103 if (!CASE_LOW (stmt))
4b390698
JJ
4104 {
4105 /* default: should appear just once in a SWITCH_EXPR
4106 body (excluding nested SWITCH_EXPR). */
4107 gcc_assert (*ctx->css_state != css_default_seen);
4108 /* When evaluating SWITCH_EXPR body for the second time,
4109 return true for the default: label. */
4110 if (*ctx->css_state == css_default_processing)
4111 return true;
4112 *ctx->css_state = css_default_seen;
4113 }
385ed708
JJ
4114 else if (CASE_HIGH (stmt))
4115 {
4116 if (tree_int_cst_le (CASE_LOW (stmt), *jump_target)
4117 && tree_int_cst_le (*jump_target, CASE_HIGH (stmt)))
4118 return true;
4119 }
56632b27
JM
4120 else if (tree_int_cst_equal (*jump_target, CASE_LOW (stmt)))
4121 return true;
4122 }
4123 break;
4124
43574e4f
JJ
4125 case BREAK_STMT:
4126 case CONTINUE_STMT:
4127 /* These two are handled directly in cxx_eval_loop_expr by testing
4128 breaks (jump_target) or continues (jump_target). */
4129 break;
4130
56632b27
JM
4131 default:
4132 gcc_unreachable ();
4133 }
4134 return false;
4135}
4136
4137/* Evaluate a STATEMENT_LIST for side-effects. Handles various jump
4138 semantics, for switch, break, continue, and return. */
4139
4140static tree
4141cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
56632b27
JM
4142 bool *non_constant_p, bool *overflow_p,
4143 tree *jump_target)
4144{
4145 tree_stmt_iterator i;
58611fb6 4146 tree local_target;
345edb37
JJ
4147 /* In a statement-expression we want to return the last value.
4148 For empty statement expression return void_node. */
4149 tree r = void_node;
58611fb6
JM
4150 if (!jump_target)
4151 {
4152 local_target = NULL_TREE;
4153 jump_target = &local_target;
4154 }
56632b27
JM
4155 for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
4156 {
56632b27 4157 tree stmt = tsi_stmt (i);
0250ba58
MP
4158 /* We've found a continue, so skip everything until we reach
4159 the label its jumping to. */
4160 if (continues (jump_target))
4161 {
4162 if (label_matches (ctx, jump_target, stmt))
4163 /* Found it. */
4164 *jump_target = NULL_TREE;
4165 else
4166 continue;
4167 }
6ef72c36
JJ
4168 if (TREE_CODE (stmt) == DEBUG_BEGIN_STMT)
4169 continue;
58611fb6
JM
4170 r = cxx_eval_constant_expression (ctx, stmt, false,
4171 non_constant_p, overflow_p,
4172 jump_target);
56632b27
JM
4173 if (*non_constant_p)
4174 break;
4175 if (returns (jump_target) || breaks (jump_target))
4176 break;
4177 }
ce36ba09
JM
4178 if (*jump_target && jump_target == &local_target)
4179 {
4180 /* We aren't communicating the jump to our caller, so give up. We don't
4181 need to support evaluation of jumps out of statement-exprs. */
4182 if (!ctx->quiet)
4183 error_at (cp_expr_loc_or_loc (r, input_location),
4184 "statement is not a constant expression");
4185 *non_constant_p = true;
4186 }
58611fb6 4187 return r;
56632b27
JM
4188}
4189
4190/* Evaluate a LOOP_EXPR for side-effects. Handles break and return
4191 semantics; continue semantics are covered by cxx_eval_statement_list. */
4192
4193static tree
4194cxx_eval_loop_expr (const constexpr_ctx *ctx, tree t,
56632b27
JM
4195 bool *non_constant_p, bool *overflow_p,
4196 tree *jump_target)
4197{
39dce2b7
JM
4198 constexpr_ctx new_ctx = *ctx;
4199
43574e4f 4200 tree body, cond = NULL_TREE, expr = NULL_TREE;
5ec2cd9f 4201 int count = 0;
43574e4f
JJ
4202 switch (TREE_CODE (t))
4203 {
4204 case LOOP_EXPR:
4205 body = LOOP_EXPR_BODY (t);
4206 break;
4207 case DO_STMT:
4208 body = DO_BODY (t);
4209 cond = DO_COND (t);
4210 break;
4211 case WHILE_STMT:
4212 body = WHILE_BODY (t);
4213 cond = WHILE_COND (t);
4214 count = -1;
4215 break;
4216 case FOR_STMT:
4217 if (FOR_INIT_STMT (t))
4218 cxx_eval_constant_expression (ctx, FOR_INIT_STMT (t), /*lval*/false,
4219 non_constant_p, overflow_p, jump_target);
4220 if (*non_constant_p)
4221 return NULL_TREE;
4222 body = FOR_BODY (t);
4223 cond = FOR_COND (t);
4224 expr = FOR_EXPR (t);
4225 count = -1;
4226 break;
4227 default:
4228 gcc_unreachable ();
4229 }
0ee28590 4230 auto_vec<tree, 10> save_exprs;
43574e4f 4231 new_ctx.save_exprs = &save_exprs;
d259b234 4232 do
56632b27 4233 {
43574e4f
JJ
4234 if (count != -1)
4235 {
4236 if (body)
4237 cxx_eval_constant_expression (&new_ctx, body, /*lval*/false,
4238 non_constant_p, overflow_p,
4239 jump_target);
4240 if (breaks (jump_target))
4241 {
4242 *jump_target = NULL_TREE;
4243 break;
4244 }
39dce2b7 4245
43574e4f
JJ
4246 if (TREE_CODE (t) != LOOP_EXPR && continues (jump_target))
4247 *jump_target = NULL_TREE;
4248
4249 if (expr)
4250 cxx_eval_constant_expression (&new_ctx, expr, /*lval*/false,
4251 non_constant_p, overflow_p,
4252 jump_target);
4253 }
4254
4255 if (cond)
4256 {
4257 tree res
4258 = cxx_eval_constant_expression (&new_ctx, cond, /*lval*/false,
4259 non_constant_p, overflow_p,
4260 jump_target);
4261 if (res)
4262 {
4263 if (verify_constant (res, ctx->quiet, non_constant_p,
4264 overflow_p))
4265 break;
4266 if (integer_zerop (res))
4267 break;
4268 }
4269 else
4270 gcc_assert (*jump_target);
4271 }
39dce2b7
JM
4272
4273 /* Forget saved values of SAVE_EXPRs. */
0ee28590
JJ
4274 unsigned int i;
4275 tree save_expr;
4276 FOR_EACH_VEC_ELT (save_exprs, i, save_expr)
4277 new_ctx.values->remove (save_expr);
4278 save_exprs.truncate (0);
43574e4f 4279
5ec2cd9f
JM
4280 if (++count >= constexpr_loop_limit)
4281 {
4282 if (!ctx->quiet)
6bdfada4 4283 error_at (cp_expr_loc_or_loc (t, input_location),
84fa214d 4284 "%<constexpr%> loop iteration count exceeds limit of %d "
a3f9f006 4285 "(use %<-fconstexpr-loop-limit=%> to increase the limit)",
5ec2cd9f
JM
4286 constexpr_loop_limit);
4287 *non_constant_p = true;
4288 break;
4289 }
56632b27 4290 }
4b390698
JJ
4291 while (!returns (jump_target)
4292 && !breaks (jump_target)
43574e4f
JJ
4293 && !continues (jump_target)
4294 && (!switches (jump_target) || count == 0)
4b390698 4295 && !*non_constant_p);
d259b234 4296
43574e4f 4297 /* Forget saved values of SAVE_EXPRs. */
0ee28590
JJ
4298 unsigned int i;
4299 tree save_expr;
4300 FOR_EACH_VEC_ELT (save_exprs, i, save_expr)
4301 new_ctx.values->remove (save_expr);
39dce2b7 4302
56632b27
JM
4303 return NULL_TREE;
4304}
4305
4306/* Evaluate a SWITCH_EXPR for side-effects. Handles switch and break jump
4307 semantics. */
4308
4309static tree
4310cxx_eval_switch_expr (const constexpr_ctx *ctx, tree t,
56632b27
JM
4311 bool *non_constant_p, bool *overflow_p,
4312 tree *jump_target)
4313{
43574e4f
JJ
4314 tree cond
4315 = TREE_CODE (t) == SWITCH_STMT ? SWITCH_STMT_COND (t) : SWITCH_COND (t);
2b3ab879 4316 cond = cxx_eval_constant_expression (ctx, cond, false,
5a804683 4317 non_constant_p, overflow_p);
56632b27
JM
4318 VERIFY_CONSTANT (cond);
4319 *jump_target = cond;
4320
43574e4f
JJ
4321 tree body
4322 = TREE_CODE (t) == SWITCH_STMT ? SWITCH_STMT_BODY (t) : SWITCH_BODY (t);
4b390698
JJ
4323 constexpr_ctx new_ctx = *ctx;
4324 constexpr_switch_state css = css_default_not_seen;
4325 new_ctx.css_state = &css;
4326 cxx_eval_constant_expression (&new_ctx, body, false,
4327 non_constant_p, overflow_p, jump_target);
4328 if (switches (jump_target) && css == css_default_seen)
4329 {
4330 /* If the SWITCH_EXPR body has default: label, process it once again,
4331 this time instructing label_matches to return true for default:
4332 label on switches (jump_target). */
4333 css = css_default_processing;
4334 cxx_eval_constant_expression (&new_ctx, body, false,
4335 non_constant_p, overflow_p, jump_target);
4336 }
56632b27
JM
4337 if (breaks (jump_target) || switches (jump_target))
4338 *jump_target = NULL_TREE;
4339 return NULL_TREE;
4340}
4341
89262ec6
JM
4342/* Find the object of TYPE under initialization in CTX. */
4343
4344static tree
4345lookup_placeholder (const constexpr_ctx *ctx, bool lval, tree type)
4346{
fbd603c4 4347 if (!ctx)
89262ec6
JM
4348 return NULL_TREE;
4349
4350 /* We could use ctx->object unconditionally, but using ctx->ctor when we
4351 can is a minor optimization. */
fbd603c4 4352 if (!lval && ctx->ctor && same_type_p (TREE_TYPE (ctx->ctor), type))
89262ec6
JM
4353 return ctx->ctor;
4354
fbd603c4
JM
4355 if (!ctx->object)
4356 return NULL_TREE;
4357
89262ec6
JM
4358 /* Since an object cannot have a field of its own type, we can search outward
4359 from ctx->object to find the unique containing object of TYPE. */
4360 tree ob = ctx->object;
4361 while (ob)
4362 {
4363 if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (ob), type))
4364 break;
4365 if (handled_component_p (ob))
4366 ob = TREE_OPERAND (ob, 0);
4367 else
4368 ob = NULL_TREE;
4369 }
4370
4371 return ob;
4372}
4373
2d76680f
PC
4374/* Attempt to reduce the expression T to a constant value.
4375 On failure, issue diagnostic and return error_mark_node. */
4376/* FIXME unify with c_fully_fold */
60813a46 4377/* FIXME overflow_p is too global */
2d76680f
PC
4378
4379static tree
3e605b20 4380cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
92a596e8 4381 bool lval,
56632b27 4382 bool *non_constant_p, bool *overflow_p,
3075affd 4383 tree *jump_target /* = NULL */)
2d76680f 4384{
3e605b20 4385 constexpr_ctx new_ctx;
2d76680f
PC
4386 tree r = t;
4387
4b390698
JJ
4388 if (jump_target && *jump_target)
4389 {
4390 /* If we are jumping, ignore all statements/expressions except those
4391 that could have LABEL_EXPR or CASE_LABEL_EXPR in their bodies. */
4392 switch (TREE_CODE (t))
4393 {
4394 case BIND_EXPR:
4395 case STATEMENT_LIST:
4396 case LOOP_EXPR:
4397 case COND_EXPR:
43574e4f
JJ
4398 case IF_STMT:
4399 case DO_STMT:
4400 case WHILE_STMT:
4401 case FOR_STMT:
4b390698
JJ
4402 break;
4403 case LABEL_EXPR:
4404 case CASE_LABEL_EXPR:
4405 if (label_matches (ctx, jump_target, t))
4406 /* Found it. */
4407 *jump_target = NULL_TREE;
4408 return NULL_TREE;
4409 default:
4410 return NULL_TREE;
4411 }
4412 }
3075affd 4413 if (error_operand_p (t))
2d76680f
PC
4414 {
4415 *non_constant_p = true;
4416 return t;
4417 }
4418 if (CONSTANT_CLASS_P (t))
4419 {
61637db3
JJ
4420 if (TREE_OVERFLOW (t))
4421 {
4422 if (!ctx->quiet)
4423 permerror (input_location, "overflow in constant expression");
4424 if (!flag_permissive || ctx->quiet)
4425 *overflow_p = true;
4426 }
8bada5cd
MS
4427
4428 if (TREE_CODE (t) == INTEGER_CST
9f613f06 4429 && TYPE_PTR_P (TREE_TYPE (t))
8bada5cd
MS
4430 && !integer_zerop (t))
4431 {
4432 if (!ctx->quiet)
4433 error ("value %qE of type %qT is not a constant expression",
4434 t, TREE_TYPE (t));
4435 *non_constant_p = true;
4436 }
4437
2d76680f
PC
4438 return t;
4439 }
2d76680f 4440
a15ffa22
JJ
4441 /* Avoid excessively long constexpr evaluations. */
4442 if (!location_wrapper_p (t)
4443 && ++*ctx->constexpr_ops_count >= constexpr_ops_limit)
4444 {
4445 if (!ctx->quiet)
4446 error_at (cp_expr_loc_or_loc (t, input_location),
4447 "%<constexpr%> evaluation operation count exceeds limit of "
a9c697b8 4448 "%wd (use %<-fconstexpr-ops-limit=%> to increase the limit)",
a15ffa22
JJ
4449 constexpr_ops_limit);
4450 *ctx->constexpr_ops_count = INTTYPE_MINIMUM (HOST_WIDE_INT);
4451 *non_constant_p = true;
4452 return t;
4453 }
4454
8bada5cd
MS
4455 tree_code tcode = TREE_CODE (t);
4456 switch (tcode)
2d76680f 4457 {
60813a46 4458 case RESULT_DECL:
92a596e8 4459 if (lval)
60813a46
JM
4460 return t;
4461 /* We ask for an rvalue for the RESULT_DECL when indirecting
bf66b9b4
AH
4462 through an invisible reference, or in named return value
4463 optimization. */
1efb1dc2
MP
4464 if (tree *p = ctx->values->get (t))
4465 return *p;
4466 else
4467 {
4468 if (!ctx->quiet)
4469 error ("%qE is not a constant expression", t);
4470 *non_constant_p = true;
4471 }
4472 break;
60813a46 4473
2d76680f 4474 case VAR_DECL:
70f40fea 4475 if (DECL_HAS_VALUE_EXPR_P (t))
c59fa7ea
JM
4476 {
4477 if (is_normal_capture_proxy (t)
4478 && current_function_decl == DECL_CONTEXT (t))
4479 {
4480 /* Function parms aren't constexpr within the function
4481 definition, so don't try to look at the closure. But if the
4482 captured variable is constant, try to evaluate it directly. */
4483 r = DECL_CAPTURED_VARIABLE (t);
4484 tree type = TREE_TYPE (t);
4485 if (TYPE_REF_P (type) != TYPE_REF_P (TREE_TYPE (r)))
4486 {
4487 /* Adjust r to match the reference-ness of t. */
4488 if (TYPE_REF_P (type))
4489 r = build_address (r);
4490 else
4491 r = convert_from_reference (r);
4492 }
4493 }
4494 else
4495 r = DECL_VALUE_EXPR (t);
4496 return cxx_eval_constant_expression (ctx, r, lval, non_constant_p,
4497 overflow_p);
4498 }
191816a3 4499 /* fall through */
7c83622c
JM
4500 case CONST_DECL:
4501 /* We used to not check lval for CONST_DECL, but darwin.c uses
4502 CONST_DECL for aggregate constants. */
92a596e8 4503 if (lval)
2d76680f 4504 return t;
f4fce183 4505 if (COMPLETE_TYPE_P (TREE_TYPE (t))
dbcd32f8 4506 && is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
7dc2b4a2
JM
4507 {
4508 /* If the class is empty, we aren't actually loading anything. */
4509 r = build_constructor (TREE_TYPE (t), NULL);
4510 TREE_CONSTANT (r) = true;
4511 }
4512 else if (ctx->strict)
69eb4fde
JM
4513 r = decl_really_constant_value (t);
4514 else
4515 r = decl_constant_value (t);
2d76680f
PC
4516 if (TREE_CODE (r) == TARGET_EXPR
4517 && TREE_CODE (TARGET_EXPR_INITIAL (r)) == CONSTRUCTOR)
4518 r = TARGET_EXPR_INITIAL (r);
56a6f1d3 4519 if (VAR_P (r))
3e605b20 4520 if (tree *p = ctx->values->get (r))
bd8f5bb2
MP
4521 if (*p != NULL_TREE)
4522 r = *p;
2d76680f
PC
4523 if (DECL_P (r))
4524 {
2b3ab879 4525 if (!ctx->quiet)
2d76680f
PC
4526 non_const_var_error (r);
4527 *non_constant_p = true;
4528 }
4529 break;
4530
96a95ac1
AO
4531 case DEBUG_BEGIN_STMT:
4532 /* ??? It might be nice to retain this information somehow, so
4533 as to be able to step into a constexpr function call. */
4534 /* Fall through. */
4535
2d76680f
PC
4536 case FUNCTION_DECL:
4537 case TEMPLATE_DECL:
4538 case LABEL_DECL:
56632b27
JM
4539 case LABEL_EXPR:
4540 case CASE_LABEL_EXPR:
4b390698 4541 case PREDICT_EXPR:
2d76680f
PC
4542 return t;
4543
4544 case PARM_DECL:
9f613f06 4545 if (lval && !TYPE_REF_P (TREE_TYPE (t)))
60813a46
JM
4546 /* glvalue use. */;
4547 else if (tree *p = ctx->values->get (r))
4548 r = *p;
92a596e8 4549 else if (lval)
2d76680f 4550 /* Defer in case this is only used for its type. */;
9f613f06 4551 else if (TYPE_REF_P (TREE_TYPE (t)))
f2acb8ad 4552 /* Defer, there's no lvalue->rvalue conversion. */;
1c2f613f 4553 else if (COMPLETE_TYPE_P (TREE_TYPE (t))
dbcd32f8 4554 && is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
052beba4
JM
4555 {
4556 /* If the class is empty, we aren't actually loading anything. */
4557 r = build_constructor (TREE_TYPE (t), NULL);
4558 TREE_CONSTANT (r) = true;
4559 }
2d76680f
PC
4560 else
4561 {
2b3ab879 4562 if (!ctx->quiet)
2d76680f
PC
4563 error ("%qE is not a constant expression", t);
4564 *non_constant_p = true;
4565 }
4566 break;
4567
4568 case CALL_EXPR:
4569 case AGGR_INIT_EXPR:
92a596e8 4570 r = cxx_eval_call_expression (ctx, t, lval,
2d76680f
PC
4571 non_constant_p, overflow_p);
4572 break;
4573
60813a46
JM
4574 case DECL_EXPR:
4575 {
4576 r = DECL_EXPR_DECL (t);
43574e4f
JJ
4577 if (TREE_CODE (r) == USING_DECL)
4578 {
4579 r = void_node;
4580 break;
4581 }
60813a46
JM
4582 if (AGGREGATE_TYPE_P (TREE_TYPE (r))
4583 || VECTOR_TYPE_P (TREE_TYPE (r)))
4584 {
4585 new_ctx = *ctx;
4586 new_ctx.object = r;
4587 new_ctx.ctor = build_constructor (TREE_TYPE (r), NULL);
e8c48716 4588 CONSTRUCTOR_NO_CLEARING (new_ctx.ctor) = true;
60813a46
JM
4589 new_ctx.values->put (r, new_ctx.ctor);
4590 ctx = &new_ctx;
4591 }
4592
4593 if (tree init = DECL_INITIAL (r))
4594 {
4595 init = cxx_eval_constant_expression (ctx, init,
2b3ab879 4596 false,
5a804683 4597 non_constant_p, overflow_p);
7f0e23e9 4598 /* Don't share a CONSTRUCTOR that might be changed. */
0146e25f 4599 init = unshare_constructor (init);
60813a46
JM
4600 ctx->values->put (r, init);
4601 }
4602 else if (ctx == &new_ctx)
4603 /* We gave it a CONSTRUCTOR above. */;
4604 else
4605 ctx->values->put (r, NULL_TREE);
4606 }
4607 break;
4608
2d76680f
PC
4609 case TARGET_EXPR:
4610 if (!literal_type_p (TREE_TYPE (t)))
4611 {
2b3ab879 4612 if (!ctx->quiet)
2d76680f 4613 {
097f82ec 4614 auto_diagnostic_group d;
2d76680f
PC
4615 error ("temporary of non-literal type %qT in a "
4616 "constant expression", TREE_TYPE (t));
4617 explain_non_literal_class (TREE_TYPE (t));
4618 }
4619 *non_constant_p = true;
4620 break;
4621 }
3e605b20
JM
4622 if ((AGGREGATE_TYPE_P (TREE_TYPE (t)) || VECTOR_TYPE_P (TREE_TYPE (t))))
4623 {
4624 /* We're being expanded without an explicit target, so start
4625 initializing a new object; expansion with an explicit target
4626 strips the TARGET_EXPR before we get here. */
4627 new_ctx = *ctx;
4628 new_ctx.ctor = build_constructor (TREE_TYPE (t), NULL);
e8c48716 4629 CONSTRUCTOR_NO_CLEARING (new_ctx.ctor) = true;
3e605b20
JM
4630 new_ctx.object = TARGET_EXPR_SLOT (t);
4631 ctx->values->put (new_ctx.object, new_ctx.ctor);
4632 ctx = &new_ctx;
4633 }
92a596e8 4634 /* Pass false for 'lval' because this indicates
2d76680f 4635 initialization of a temporary. */
3e605b20 4636 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
2b3ab879 4637 false,
5a804683 4638 non_constant_p, overflow_p);
2d76680f
PC
4639 if (!*non_constant_p)
4640 /* Adjust the type of the result to the type of the temporary. */
4641 r = adjust_temp_type (TREE_TYPE (t), r);
92a596e8 4642 if (lval)
f2acb8ad
JM
4643 {
4644 tree slot = TARGET_EXPR_SLOT (t);
0146e25f 4645 r = unshare_constructor (r);
f2acb8ad
JM
4646 ctx->values->put (slot, r);
4647 return slot;
4648 }
2d76680f
PC
4649 break;
4650
60813a46 4651 case INIT_EXPR:
60813a46 4652 case MODIFY_EXPR:
4b390698 4653 gcc_assert (jump_target == NULL || *jump_target == NULL_TREE);
92a596e8 4654 r = cxx_eval_store_expression (ctx, t, lval,
60813a46
JM
4655 non_constant_p, overflow_p);
4656 break;
4657
2d76680f 4658 case SCOPE_REF:
3e605b20 4659 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
92a596e8 4660 lval,
5a804683 4661 non_constant_p, overflow_p);
2d76680f
PC
4662 break;
4663
4664 case RETURN_EXPR:
75e0295b
MP
4665 if (TREE_OPERAND (t, 0) != NULL_TREE)
4666 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
4667 lval,
4668 non_constant_p, overflow_p);
43574e4f
JJ
4669 /* FALLTHRU */
4670 case BREAK_STMT:
4671 case CONTINUE_STMT:
019e0ae8
MP
4672 if (jump_target)
4673 *jump_target = t;
4674 else
4675 {
4676 /* Can happen with ({ return true; }) && false; passed to
4677 maybe_constant_value. There is nothing to jump over in this
4678 case, and the bug will be diagnosed later. */
4679 gcc_assert (ctx->quiet);
4680 *non_constant_p = true;
4681 }
56632b27
JM
4682 break;
4683
cabaf50a
JM
4684 case SAVE_EXPR:
4685 /* Avoid evaluating a SAVE_EXPR more than once. */
4686 if (tree *p = ctx->values->get (t))
4687 r = *p;
4688 else
4689 {
12d9ce19 4690 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), false,
cabaf50a
JM
4691 non_constant_p, overflow_p);
4692 ctx->values->put (t, r);
39dce2b7 4693 if (ctx->save_exprs)
0ee28590 4694 ctx->save_exprs->safe_push (t);
cabaf50a
JM
4695 }
4696 break;
4697
2d76680f
PC
4698 case NON_LVALUE_EXPR:
4699 case TRY_CATCH_EXPR:
769430b2 4700 case TRY_BLOCK:
2d76680f
PC
4701 case CLEANUP_POINT_EXPR:
4702 case MUST_NOT_THROW_EXPR:
60813a46
JM
4703 case EXPR_STMT:
4704 case EH_SPEC_BLOCK:
3e605b20 4705 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
92a596e8 4706 lval,
56632b27
JM
4707 non_constant_p, overflow_p,
4708 jump_target);
2d76680f
PC
4709 break;
4710
769430b2
JM
4711 case TRY_FINALLY_EXPR:
4712 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
4713 non_constant_p, overflow_p,
4714 jump_target);
4715 if (!*non_constant_p)
4716 /* Also evaluate the cleanup. */
4717 cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1), true,
4718 non_constant_p, overflow_p,
4719 jump_target);
4720 break;
4721
43574e4f
JJ
4722 case CLEANUP_STMT:
4723 r = cxx_eval_constant_expression (ctx, CLEANUP_BODY (t), lval,
4724 non_constant_p, overflow_p,
4725 jump_target);
4726 if (!CLEANUP_EH_ONLY (t) && !*non_constant_p)
4727 /* Also evaluate the cleanup. */
4728 cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), true,
4729 non_constant_p, overflow_p,
4730 jump_target);
4731 break;
4732
2d76680f
PC
4733 /* These differ from cxx_eval_unary_expression in that this doesn't
4734 check for a constant operand or result; an address can be
4735 constant without its operand being, and vice versa. */
cda0a029 4736 case MEM_REF:
2d76680f 4737 case INDIRECT_REF:
92a596e8 4738 r = cxx_eval_indirect_ref (ctx, t, lval,
2d76680f
PC
4739 non_constant_p, overflow_p);
4740 break;
4741
4742 case ADDR_EXPR:
4743 {
4744 tree oldop = TREE_OPERAND (t, 0);
3e605b20 4745 tree op = cxx_eval_constant_expression (ctx, oldop,
92a596e8 4746 /*lval*/true,
5a804683 4747 non_constant_p, overflow_p);
2d76680f
PC
4748 /* Don't VERIFY_CONSTANT here. */
4749 if (*non_constant_p)
4750 return t;
f2acb8ad 4751 gcc_checking_assert (TREE_CODE (op) != CONSTRUCTOR);
2d76680f
PC
4752 /* This function does more aggressive folding than fold itself. */
4753 r = build_fold_addr_expr_with_type (op, TREE_TYPE (t));
4754 if (TREE_CODE (r) == ADDR_EXPR && TREE_OPERAND (r, 0) == oldop)
4755 return t;
4756 break;
4757 }
4758
4759 case REALPART_EXPR:
4760 case IMAGPART_EXPR:
87713c6a
JJ
4761 if (lval)
4762 {
4763 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
4764 non_constant_p, overflow_p);
4765 if (r == error_mark_node)
4766 ;
4767 else if (r == TREE_OPERAND (t, 0))
4768 r = t;
4769 else
4770 r = fold_build1 (TREE_CODE (t), TREE_TYPE (t), r);
4771 break;
4772 }
4773 /* FALLTHRU */
2d76680f
PC
4774 case CONJ_EXPR:
4775 case FIX_TRUNC_EXPR:
4776 case FLOAT_EXPR:
4777 case NEGATE_EXPR:
4778 case ABS_EXPR:
e28fadbc 4779 case ABSU_EXPR:
2d76680f
PC
4780 case BIT_NOT_EXPR:
4781 case TRUTH_NOT_EXPR:
4782 case FIXED_CONVERT_EXPR:
92a596e8 4783 r = cxx_eval_unary_expression (ctx, t, lval,
2d76680f
PC
4784 non_constant_p, overflow_p);
4785 break;
4786
4787 case SIZEOF_EXPR:
43574e4f
JJ
4788 r = cxx_eval_constant_expression (ctx, fold_sizeof_expr (t), lval,
4789 non_constant_p, overflow_p,
4790 jump_target);
2d76680f
PC
4791 break;
4792
4793 case COMPOUND_EXPR:
4794 {
4795 /* check_return_expr sometimes wraps a TARGET_EXPR in a
4796 COMPOUND_EXPR; don't get confused. Also handle EMPTY_CLASS_EXPR
4797 introduced by build_call_a. */
4798 tree op0 = TREE_OPERAND (t, 0);
4799 tree op1 = TREE_OPERAND (t, 1);
4800 STRIP_NOPS (op1);
4801 if ((TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
4802 || TREE_CODE (op1) == EMPTY_CLASS_EXPR)
2b3ab879 4803 r = cxx_eval_constant_expression (ctx, op0,
92a596e8 4804 lval, non_constant_p, overflow_p,
56632b27 4805 jump_target);
2d76680f
PC
4806 else
4807 {
4808 /* Check that the LHS is constant and then discard it. */
2b3ab879 4809 cxx_eval_constant_expression (ctx, op0,
12d9ce19 4810 true, non_constant_p, overflow_p,
56632b27 4811 jump_target);
06ec22b7
JM
4812 if (*non_constant_p)
4813 return t;
2d76680f 4814 op1 = TREE_OPERAND (t, 1);
2b3ab879 4815 r = cxx_eval_constant_expression (ctx, op1,
92a596e8 4816 lval, non_constant_p, overflow_p,
56632b27 4817 jump_target);
2d76680f
PC
4818 }
4819 }
4820 break;
4821
4822 case POINTER_PLUS_EXPR:
1af4ebf5 4823 case POINTER_DIFF_EXPR:
2d76680f
PC
4824 case PLUS_EXPR:
4825 case MINUS_EXPR:
4826 case MULT_EXPR:
4827 case TRUNC_DIV_EXPR:
4828 case CEIL_DIV_EXPR:
4829 case FLOOR_DIV_EXPR:
4830 case ROUND_DIV_EXPR:
4831 case TRUNC_MOD_EXPR:
4832 case CEIL_MOD_EXPR:
4833 case ROUND_MOD_EXPR:
4834 case RDIV_EXPR:
4835 case EXACT_DIV_EXPR:
4836 case MIN_EXPR:
4837 case MAX_EXPR:
4838 case LSHIFT_EXPR:
4839 case RSHIFT_EXPR:
4840 case LROTATE_EXPR:
4841 case RROTATE_EXPR:
4842 case BIT_IOR_EXPR:
4843 case BIT_XOR_EXPR:
4844 case BIT_AND_EXPR:
4845 case TRUTH_XOR_EXPR:
4846 case LT_EXPR:
4847 case LE_EXPR:
4848 case GT_EXPR:
4849 case GE_EXPR:
4850 case EQ_EXPR:
4851 case NE_EXPR:
4852 case UNORDERED_EXPR:
4853 case ORDERED_EXPR:
4854 case UNLT_EXPR:
4855 case UNLE_EXPR:
4856 case UNGT_EXPR:
4857 case UNGE_EXPR:
4858 case UNEQ_EXPR:
4859 case LTGT_EXPR:
4860 case RANGE_EXPR:
4861 case COMPLEX_EXPR:
92a596e8 4862 r = cxx_eval_binary_expression (ctx, t, lval,
2d76680f
PC
4863 non_constant_p, overflow_p);
4864 break;
4865
4866 /* fold can introduce non-IF versions of these; still treat them as
4867 short-circuiting. */
4868 case TRUTH_AND_EXPR:
4869 case TRUTH_ANDIF_EXPR:
3e605b20 4870 r = cxx_eval_logical_expression (ctx, t, boolean_false_node,
2d76680f 4871 boolean_true_node,
92a596e8 4872 lval,
2d76680f
PC
4873 non_constant_p, overflow_p);
4874 break;
4875
4876 case TRUTH_OR_EXPR:
4877 case TRUTH_ORIF_EXPR:
3e605b20 4878 r = cxx_eval_logical_expression (ctx, t, boolean_true_node,
2d76680f 4879 boolean_false_node,
92a596e8 4880 lval,
2d76680f
PC
4881 non_constant_p, overflow_p);
4882 break;
4883
4884 case ARRAY_REF:
92a596e8 4885 r = cxx_eval_array_reference (ctx, t, lval,
2d76680f
PC
4886 non_constant_p, overflow_p);
4887 break;
4888
4889 case COMPONENT_REF:
4890 if (is_overloaded_fn (t))
4891 {
4892 /* We can only get here in checking mode via
4893 build_non_dependent_expr, because any expression that
4894 calls or takes the address of the function will have
4895 pulled a FUNCTION_DECL out of the COMPONENT_REF. */
2b3ab879 4896 gcc_checking_assert (ctx->quiet || errorcount);
2d76680f
PC
4897 *non_constant_p = true;
4898 return t;
4899 }
92a596e8 4900 r = cxx_eval_component_reference (ctx, t, lval,
2d76680f
PC
4901 non_constant_p, overflow_p);
4902 break;
4903
4904 case BIT_FIELD_REF:
92a596e8 4905 r = cxx_eval_bit_field_ref (ctx, t, lval,
2d76680f
PC
4906 non_constant_p, overflow_p);
4907 break;
4908
4909 case COND_EXPR:
43574e4f 4910 case IF_STMT:
4b390698
JJ
4911 if (jump_target && *jump_target)
4912 {
e9fa2f6d 4913 tree orig_jump = *jump_target;
43574e4f
JJ
4914 tree arg = ((TREE_CODE (t) != IF_STMT || TREE_OPERAND (t, 1))
4915 ? TREE_OPERAND (t, 1) : void_node);
4b390698
JJ
4916 /* When jumping to a label, the label might be either in the
4917 then or else blocks, so process then block first in skipping
4918 mode first, and if we are still in the skipping mode at its end,
4919 process the else block too. */
43574e4f
JJ
4920 r = cxx_eval_constant_expression (ctx, arg, lval, non_constant_p,
4921 overflow_p, jump_target);
e9fa2f6d
MP
4922 /* It's possible that we found the label in the then block. But
4923 it could have been followed by another jumping statement, e.g.
4924 say we're looking for case 1:
4925 if (cond)
4926 {
4927 // skipped statements
4928 case 1:; // clears up *jump_target
4929 return 1; // and sets it to a RETURN_EXPR
4930 }
4931 else { ... }
4932 in which case we need not go looking to the else block.
4933 (goto is not allowed in a constexpr function.) */
4934 if (*jump_target == orig_jump)
43574e4f
JJ
4935 {
4936 arg = ((TREE_CODE (t) != IF_STMT || TREE_OPERAND (t, 2))
4937 ? TREE_OPERAND (t, 2) : void_node);
4938 r = cxx_eval_constant_expression (ctx, arg, lval, non_constant_p,
4939 overflow_p, jump_target);
4940 }
4b390698
JJ
4941 break;
4942 }
92a596e8 4943 r = cxx_eval_conditional_expression (ctx, t, lval,
56632b27
JM
4944 non_constant_p, overflow_p,
4945 jump_target);
2d76680f 4946 break;
f370e36d
JJ
4947 case VEC_COND_EXPR:
4948 r = cxx_eval_vector_conditional_expression (ctx, t, non_constant_p,
4949 overflow_p);
4950 break;
2d76680f
PC
4951
4952 case CONSTRUCTOR:
35d87f01 4953 if (TREE_CONSTANT (t) && reduced_constant_expression_p (t))
2d63bc39
JM
4954 {
4955 /* Don't re-process a constant CONSTRUCTOR, but do fold it to
4956 VECTOR_CST if applicable. */
ac9ec198 4957 verify_constructor_flags (t);
2d63bc39
JM
4958 if (TREE_CONSTANT (t))
4959 return fold (t);
4960 }
92a596e8 4961 r = cxx_eval_bare_aggregate (ctx, t, lval,
2d76680f
PC
4962 non_constant_p, overflow_p);
4963 break;
4964
4965 case VEC_INIT_EXPR:
4966 /* We can get this in a defaulted constructor for a class with a
4967 non-static data member of array type. Either the initializer will
4968 be NULL, meaning default-initialization, or it will be an lvalue
4969 or xvalue of the same type, meaning direct-initialization from the
4970 corresponding member. */
92a596e8 4971 r = cxx_eval_vec_init (ctx, t, lval,
2d76680f
PC
4972 non_constant_p, overflow_p);
4973 break;
4974
2d76680f 4975 case VEC_PERM_EXPR:
92a596e8 4976 r = cxx_eval_trinary_expression (ctx, t, lval,
2d76680f
PC
4977 non_constant_p, overflow_p);
4978 break;
4979
7d75ea04
JJ
4980 case NOP_EXPR:
4981 if (REINTERPRET_CAST_P (t))
4982 {
4983 if (!ctx->quiet)
6bdfada4 4984 error_at (cp_expr_loc_or_loc (t, input_location),
a9c697b8 4985 "%<reinterpret_cast%> is not a constant expression");
7d75ea04
JJ
4986 *non_constant_p = true;
4987 return t;
4988 }
4989 /* FALLTHROUGH. */
2d76680f
PC
4990 case CONVERT_EXPR:
4991 case VIEW_CONVERT_EXPR:
cda0a029 4992 case UNARY_PLUS_EXPR:
2d76680f
PC
4993 {
4994 tree oldop = TREE_OPERAND (t, 0);
cda0a029 4995
3e605b20 4996 tree op = cxx_eval_constant_expression (ctx, oldop,
92a596e8 4997 lval,
5a804683 4998 non_constant_p, overflow_p);
2d76680f
PC
4999 if (*non_constant_p)
5000 return t;
dcdbc004
JM
5001 tree type = TREE_TYPE (t);
5002 if (TREE_CODE (op) == PTRMEM_CST
5003 && !TYPE_PTRMEM_P (type))
5004 op = cplus_expand_constant (op);
7d75ea04 5005
05bf54c3
MP
5006 if (TREE_CODE (op) == PTRMEM_CST && tcode == NOP_EXPR)
5007 {
7d75ea04
JJ
5008 if (!same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (op))
5009 && !can_convert_qual (type, op))
5010 op = cplus_expand_constant (op);
5011 return cp_fold_convert (type, op);
05bf54c3 5012 }
8bada5cd 5013
71a93b08 5014 if (INDIRECT_TYPE_P (type) && TREE_CODE (op) == INTEGER_CST)
2d76680f 5015 {
8bada5cd
MS
5016 if (integer_zerop (op))
5017 {
9f613f06 5018 if (TYPE_REF_P (type))
8bada5cd
MS
5019 {
5020 if (!ctx->quiet)
6bdfada4 5021 error_at (cp_expr_loc_or_loc (t, input_location),
8bada5cd
MS
5022 "dereferencing a null pointer");
5023 *non_constant_p = true;
5024 return t;
5025 }
9f613f06 5026 else if (TYPE_PTR_P (TREE_TYPE (op)))
8bada5cd
MS
5027 {
5028 tree from = TREE_TYPE (op);
5029
5030 if (!can_convert (type, from, tf_none))
5031 {
5032 if (!ctx->quiet)
6bdfada4 5033 error_at (cp_expr_loc_or_loc (t, input_location),
8bada5cd
MS
5034 "conversion of %qT null pointer to %qT "
5035 "is not a constant expression",
5036 from, type);
5037 *non_constant_p = true;
5038 return t;
5039 }
5040 }
5041 }
5042 else
5043 {
5044 /* This detects for example:
5045 reinterpret_cast<void*>(sizeof 0)
5046 */
5047 if (!ctx->quiet)
6bdfada4 5048 error_at (cp_expr_loc_or_loc (t, input_location),
8bada5cd 5049 "%<reinterpret_cast<%T>(%E)%> is not "
64d6d399 5050 "a constant expression",
8bada5cd
MS
5051 type, op);
5052 *non_constant_p = true;
5053 return t;
5054 }
2d76680f 5055 }
7d75ea04 5056
cda0a029 5057 if (op == oldop && tcode != UNARY_PLUS_EXPR)
2d76680f
PC
5058 /* We didn't fold at the top so we could check for ptr-int
5059 conversion. */
5060 return fold (t);
7d75ea04 5061
e4511ca2
JM
5062 /* Handle an array's bounds having been deduced after we built
5063 the wrapping expression. */
5064 if (same_type_ignoring_tlq_and_bounds_p (type, TREE_TYPE (op)))
5065 r = op;
5066 else if (tcode == UNARY_PLUS_EXPR)
cda0a029
JM
5067 r = fold_convert (TREE_TYPE (t), op);
5068 else
5069 r = fold_build1 (tcode, type, op);
7d75ea04 5070
2d76680f
PC
5071 /* Conversion of an out-of-range value has implementation-defined
5072 behavior; the language considers it different from arithmetic
5073 overflow, which is undefined. */
5074 if (TREE_OVERFLOW_P (r) && !TREE_OVERFLOW_P (op))
5075 TREE_OVERFLOW (r) = false;
5076 }
5077 break;
5078
5079 case EMPTY_CLASS_EXPR:
5080 /* This is good enough for a function argument that might not get
5081 used, and they can't do anything with it, so just return it. */
5082 return t;
5083
60813a46 5084 case STATEMENT_LIST:
56632b27
JM
5085 new_ctx = *ctx;
5086 new_ctx.ctor = new_ctx.object = NULL_TREE;
2b3ab879 5087 return cxx_eval_statement_list (&new_ctx, t,
56632b27 5088 non_constant_p, overflow_p, jump_target);
60813a46
JM
5089
5090 case BIND_EXPR:
5091 return cxx_eval_constant_expression (ctx, BIND_EXPR_BODY (t),
92a596e8 5092 lval,
56632b27
JM
5093 non_constant_p, overflow_p,
5094 jump_target);
60813a46 5095
2d76680f
PC
5096 case PREINCREMENT_EXPR:
5097 case POSTINCREMENT_EXPR:
5098 case PREDECREMENT_EXPR:
5099 case POSTDECREMENT_EXPR:
2b3ab879 5100 return cxx_eval_increment_expression (ctx, t,
92a596e8 5101 lval, non_constant_p, overflow_p);
60813a46
JM
5102
5103 case LAMBDA_EXPR:
2d76680f
PC
5104 case NEW_EXPR:
5105 case VEC_NEW_EXPR:
5106 case DELETE_EXPR:
5107 case VEC_DELETE_EXPR:
5108 case THROW_EXPR:
2d76680f
PC
5109 case MODOP_EXPR:
5110 /* GCC internal stuff. */
5111 case VA_ARG_EXPR:
2d76680f
PC
5112 case NON_DEPENDENT_EXPR:
5113 case BASELINK:
2d76680f 5114 case OFFSET_REF:
2b3ab879 5115 if (!ctx->quiet)
6bdfada4 5116 error_at (cp_expr_loc_or_loc (t, input_location),
64d6d399 5117 "expression %qE is not a constant expression", t);
2d76680f
PC
5118 *non_constant_p = true;
5119 break;
5120
bf8d8309
MP
5121 case OBJ_TYPE_REF:
5122 {
5123 /* Virtual function call. Let the constexpr machinery figure out
5124 the dynamic type. */
5125 int token = tree_to_shwi (OBJ_TYPE_REF_TOKEN (t));
5126 tree obj = OBJ_TYPE_REF_OBJECT (t);
5127 obj = cxx_eval_constant_expression (ctx, obj, lval, non_constant_p,
5128 overflow_p);
5129 /* We expect something in the form of &x.D.2103.D.2094; get x. */
6a3ebcc6
JJ
5130 if (TREE_CODE (obj) != ADDR_EXPR
5131 || !DECL_P (get_base_address (TREE_OPERAND (obj, 0))))
bf8d8309
MP
5132 {
5133 if (!ctx->quiet)
5134 error_at (cp_expr_loc_or_loc (t, input_location),
5135 "expression %qE is not a constant expression", t);
5136 *non_constant_p = true;
5137 return t;
5138 }
5139 obj = TREE_OPERAND (obj, 0);
69deaf14
JJ
5140 while (TREE_CODE (obj) == COMPONENT_REF
5141 && DECL_FIELD_IS_BASE (TREE_OPERAND (obj, 1)))
bf8d8309
MP
5142 obj = TREE_OPERAND (obj, 0);
5143 tree objtype = TREE_TYPE (obj);
5144 /* Find the function decl in the virtual functions list. TOKEN is
5145 the DECL_VINDEX that says which function we're looking for. */
5146 tree virtuals = BINFO_VIRTUALS (TYPE_BINFO (objtype));
582d2481
JJ
5147 if (TARGET_VTABLE_USES_DESCRIPTORS)
5148 token /= MAX (TARGET_VTABLE_USES_DESCRIPTORS, 1);
bf8d8309
MP
5149 r = TREE_VALUE (chain_index (token, virtuals));
5150 break;
5151 }
5152
3e605b20 5153 case PLACEHOLDER_EXPR:
89262ec6
JM
5154 /* Use of the value or address of the current object. */
5155 if (tree ctor = lookup_placeholder (ctx, lval, TREE_TYPE (t)))
5156 return cxx_eval_constant_expression (ctx, ctor, lval,
5157 non_constant_p, overflow_p);
5158 /* A placeholder without a referent. We can get here when
5159 checking whether NSDMIs are noexcept, or in massage_init_elt;
5160 just say it's non-constant for now. */
5161 gcc_assert (ctx->quiet);
5162 *non_constant_p = true;
3e605b20
JM
5163 break;
5164
06ec22b7
JM
5165 case EXIT_EXPR:
5166 {
5167 tree cond = TREE_OPERAND (t, 0);
5168 cond = cxx_eval_constant_expression (ctx, cond, /*lval*/false,
5169 non_constant_p, overflow_p);
5170 VERIFY_CONSTANT (cond);
5171 if (integer_nonzerop (cond))
5172 *jump_target = t;
5173 }
5174 break;
5175
60813a46 5176 case GOTO_EXPR:
56632b27 5177 *jump_target = TREE_OPERAND (t, 0);
d49318d9
PC
5178 gcc_assert (breaks (jump_target) || continues (jump_target)
5179 /* Allow for jumping to a cdtor_label. */
5180 || returns (jump_target));
56632b27
JM
5181 break;
5182
60813a46 5183 case LOOP_EXPR:
43574e4f
JJ
5184 case DO_STMT:
5185 case WHILE_STMT:
5186 case FOR_STMT:
2b3ab879 5187 cxx_eval_loop_expr (ctx, t,
56632b27
JM
5188 non_constant_p, overflow_p, jump_target);
5189 break;
5190
60813a46 5191 case SWITCH_EXPR:
43574e4f 5192 case SWITCH_STMT:
2b3ab879 5193 cxx_eval_switch_expr (ctx, t,
56632b27 5194 non_constant_p, overflow_p, jump_target);
60813a46
JM
5195 break;
5196
971e17ff
AS
5197 case REQUIRES_EXPR:
5198 /* It's possible to get a requires-expression in a constant
5199 expression. For example:
5200
5201 template<typename T> concept bool C() {
5202 return requires (T t) { t; };
5203 }
5204
5205 template<typename T> requires !C<T>() void f(T);
5206
5207 Normalization leaves f with the associated constraint
5208 '!requires (T t) { ... }' which is not transformed into
5209 a constraint. */
5210 if (!processing_template_decl)
5211 return evaluate_constraint_expression (t, NULL_TREE);
5212 else
5213 *non_constant_p = true;
5214 return t;
5215
98e09245 5216 case ANNOTATE_EXPR:
98e09245
JJ
5217 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
5218 lval,
5219 non_constant_p, overflow_p,
5220 jump_target);
5221 break;
5222
3664e317
JM
5223 case USING_STMT:
5224 r = void_node;
5225 break;
5226
2d76680f 5227 default:
c6e7c499
JM
5228 if (STATEMENT_CODE_P (TREE_CODE (t)))
5229 {
5230 /* This function doesn't know how to deal with pre-genericize
5231 statements; this can only happen with statement-expressions,
5232 so for now just fail. */
5233 if (!ctx->quiet)
5234 error_at (EXPR_LOCATION (t),
64d6d399 5235 "statement is not a constant expression");
c6e7c499
JM
5236 }
5237 else
5238 internal_error ("unexpected expression %qE of kind %s", t,
5239 get_tree_code_name (TREE_CODE (t)));
2d76680f
PC
5240 *non_constant_p = true;
5241 break;
5242 }
5243
5244 if (r == error_mark_node)
5245 *non_constant_p = true;
5246
5247 if (*non_constant_p)
5248 return t;
5249 else
5250 return r;
5251}
5252
e079dced
JM
5253/* P0859: A function is needed for constant evaluation if it is a constexpr
5254 function that is named by an expression ([basic.def.odr]) that is
5255 potentially constant evaluated.
5256
5257 So we need to instantiate any constexpr functions mentioned by the
5258 expression even if the definition isn't needed for evaluating the
5259 expression. */
5260
5261static tree
5262instantiate_cx_fn_r (tree *tp, int *walk_subtrees, void */*data*/)
5263{
5264 if (TREE_CODE (*tp) == FUNCTION_DECL
5265 && DECL_DECLARED_CONSTEXPR_P (*tp)
5266 && !DECL_INITIAL (*tp)
4fdda3ce 5267 && !trivial_fn_p (*tp)
e079dced
JM
5268 && DECL_TEMPLOID_INSTANTIATION (*tp))
5269 {
5270 ++function_depth;
5271 instantiate_decl (*tp, /*defer_ok*/false, /*expl_inst*/false);
5272 --function_depth;
5273 }
5274 else if (TREE_CODE (*tp) == CALL_EXPR
5275 || TREE_CODE (*tp) == AGGR_INIT_EXPR)
5276 {
5277 if (EXPR_HAS_LOCATION (*tp))
5278 input_location = EXPR_LOCATION (*tp);
5279 }
5280
5281 if (!EXPR_P (*tp))
5282 *walk_subtrees = 0;
5283
5284 return NULL_TREE;
5285}
5286static void
5287instantiate_constexpr_fns (tree t)
5288{
5289 location_t loc = input_location;
5290 cp_walk_tree_without_duplicates (&t, instantiate_cx_fn_r, NULL);
5291 input_location = loc;
5292}
5293
e4082611 5294/* ALLOW_NON_CONSTANT is false if T is required to be a constant expression.
d4accef3
JM
5295 STRICT has the same sense as for constant_value_1: true if we only allow
5296 conforming C++ constant expressions, or false if we want a constant value
5297 even if it doesn't conform.
13de99bc 5298 MANIFESTLY_CONST_EVAL is true if T is manifestly const-evaluated as
e4082611
JJ
5299 per P0595 even when ALLOW_NON_CONSTANT is true. */
5300
2d76680f 5301static tree
3e605b20 5302cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
e4082611 5303 bool strict = true,
13de99bc 5304 bool manifestly_const_eval = false,
e4082611 5305 tree object = NULL_TREE)
2d76680f 5306{
8108ea30
JM
5307 auto_timevar time (TV_CONSTEXPR);
5308
2d76680f
PC
5309 bool non_constant_p = false;
5310 bool overflow_p = false;
3e605b20 5311 hash_map<tree,tree> map;
a15ffa22 5312 HOST_WIDE_INT constexpr_ctx_count = 0;
39dce2b7 5313
4b390698 5314 constexpr_ctx ctx = { NULL, &map, NULL, NULL, NULL, NULL,
a15ffa22 5315 &constexpr_ctx_count, allow_non_constant, strict,
13de99bc 5316 manifestly_const_eval || !allow_non_constant };
39dce2b7 5317
3e605b20 5318 tree type = initialized_type (t);
3e605b20 5319 tree r = t;
4d0c18c6
JM
5320 if (VOID_TYPE_P (type))
5321 return t;
3e605b20
JM
5322 if (AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type))
5323 {
5324 /* In C++14 an NSDMI can participate in aggregate initialization,
5325 and can refer to the address of the object being initialized, so
5326 we need to pass in the relevant VAR_DECL if we want to do the
5327 evaluation in a single pass. The evaluation will dynamically
5328 update ctx.values for the VAR_DECL. We use the same strategy
5329 for C++11 constexpr constructors that refer to the object being
5330 initialized. */
5331 ctx.ctor = build_constructor (type, NULL);
e8c48716 5332 CONSTRUCTOR_NO_CLEARING (ctx.ctor) = true;
60813a46
JM
5333 if (!object)
5334 {
5335 if (TREE_CODE (t) == TARGET_EXPR)
5336 object = TARGET_EXPR_SLOT (t);
5337 else if (TREE_CODE (t) == AGGR_INIT_EXPR)
5338 object = AGGR_INIT_EXPR_SLOT (t);
5339 }
3e605b20
JM
5340 ctx.object = object;
5341 if (object)
5342 gcc_assert (same_type_ignoring_top_level_qualifiers_p
5343 (type, TREE_TYPE (object)));
5344 if (object && DECL_P (object))
5345 map.put (object, ctx.ctor);
5346 if (TREE_CODE (r) == TARGET_EXPR)
5347 /* Avoid creating another CONSTRUCTOR when we expand the
5348 TARGET_EXPR. */
5349 r = TARGET_EXPR_INITIAL (r);
5350 }
5351
e079dced 5352 instantiate_constexpr_fns (r);
2b3ab879 5353 r = cxx_eval_constant_expression (&ctx, r,
5a804683 5354 false, &non_constant_p, &overflow_p);
2d76680f
PC
5355
5356 verify_constant (r, allow_non_constant, &non_constant_p, &overflow_p);
5357
023d89c7
JM
5358 /* Mutable logic is a bit tricky: we want to allow initialization of
5359 constexpr variables with mutable members, but we can't copy those
5360 members to another constexpr variable. */
5361 if (TREE_CODE (r) == CONSTRUCTOR
5362 && CONSTRUCTOR_MUTABLE_POISON (r))
2d76680f 5363 {
2d76680f 5364 if (!allow_non_constant)
023d89c7
JM
5365 error ("%qE is not a constant expression because it refers to "
5366 "mutable subobjects of %qT", t, type);
2d76680f
PC
5367 non_constant_p = true;
5368 }
5369
f64e0c02 5370 if (TREE_CODE (r) == CONSTRUCTOR
e8c48716 5371 && CONSTRUCTOR_NO_CLEARING (r))
f64e0c02
JM
5372 {
5373 if (!allow_non_constant)
5374 error ("%qE is not a constant expression because it refers to "
5375 "an incompletely initialized variable", t);
5376 TREE_CONSTANT (r) = false;
5377 non_constant_p = true;
5378 }
5379
2d76680f
PC
5380 /* Technically we should check this for all subexpressions, but that
5381 runs into problems with our internal representation of pointer
5382 subtraction and the 5.19 rules are still in flux. */
5383 if (CONVERT_EXPR_CODE_P (TREE_CODE (r))
5384 && ARITHMETIC_TYPE_P (TREE_TYPE (r))
5385 && TREE_CODE (TREE_OPERAND (r, 0)) == ADDR_EXPR)
5386 {
5387 if (!allow_non_constant)
5388 error ("conversion from pointer type %qT "
64d6d399 5389 "to arithmetic type %qT in a constant expression",
2d76680f
PC
5390 TREE_TYPE (TREE_OPERAND (r, 0)), TREE_TYPE (r));
5391 non_constant_p = true;
5392 }
5393
5394 if (!non_constant_p && overflow_p)
5395 non_constant_p = true;
5396
56cfb596
PP
5397 /* Unshare the result unless it's a CONSTRUCTOR in which case it's already
5398 unshared. */
5399 bool should_unshare = true;
5400 if (r == t || TREE_CODE (r) == CONSTRUCTOR)
5401 should_unshare = false;
5402
2d76680f
PC
5403 if (non_constant_p && !allow_non_constant)
5404 return error_mark_node;
5405 else if (non_constant_p && TREE_CONSTANT (r))
5406 {
e4082611
JJ
5407 /* If __builtin_is_constant_evaluated () was evaluated to true
5408 and the result is not a valid constant expression, we need to
5409 punt. */
13de99bc 5410 if (manifestly_const_eval)
e4082611
JJ
5411 return cxx_eval_outermost_constant_expr (t, true, strict,
5412 false, object);
eddd715c
JM
5413 /* This isn't actually constant, so unset TREE_CONSTANT.
5414 Don't clear TREE_CONSTANT on ADDR_EXPR, as the middle-end requires
5415 it to be set if it is invariant address, even when it is not
5416 a valid C++ constant expression. Wrap it with a NOP_EXPR
5417 instead. */
5418 if (EXPR_P (r) && TREE_CODE (r) != ADDR_EXPR)
2d76680f
PC
5419 r = copy_node (r);
5420 else if (TREE_CODE (r) == CONSTRUCTOR)
5421 r = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (r), r);
5422 else
5423 r = build_nop (TREE_TYPE (r), r);
5424 TREE_CONSTANT (r) = false;
5425 }
5dab8b11 5426 else if (non_constant_p)
2d76680f
PC
5427 return t;
5428
56cfb596
PP
5429 if (should_unshare)
5430 r = unshare_expr (r);
5431
2d76680f
PC
5432 if (TREE_CODE (r) == CONSTRUCTOR && CLASS_TYPE_P (TREE_TYPE (r)))
5433 {
5dab8b11 5434 r = adjust_temp_type (type, r);
2d76680f
PC
5435 if (TREE_CODE (t) == TARGET_EXPR
5436 && TARGET_EXPR_INITIAL (t) == r)
5437 return t;
5dab8b11 5438 else if (TREE_CODE (t) != CONSTRUCTOR)
2d76680f
PC
5439 {
5440 r = get_target_expr (r);
5441 TREE_CONSTANT (r) = true;
2d76680f
PC
5442 }
5443 }
5dab8b11
JM
5444
5445 return r;
2d76680f
PC
5446}
5447
2d76680f
PC
5448/* If T represents a constant expression returns its reduced value.
5449 Otherwise return error_mark_node. If T is dependent, then
5450 return NULL. */
5451
5452tree
3e605b20 5453cxx_constant_value (tree t, tree decl)
2d76680f 5454{
e4082611 5455 return cxx_eval_outermost_constant_expr (t, false, true, true, decl);
2d76680f
PC
5456}
5457
cda0a029
JM
5458/* Helper routine for fold_simple function. Either return simplified
5459 expression T, otherwise NULL_TREE.
5460 In contrast to cp_fully_fold, and to maybe_constant_value, we try to fold
5461 even if we are within template-declaration. So be careful on call, as in
5462 such case types can be undefined. */
5463
5464static tree
5465fold_simple_1 (tree t)
5466{
5467 tree op1;
5468 enum tree_code code = TREE_CODE (t);
5469
5470 switch (code)
5471 {
5472 case INTEGER_CST:
5473 case REAL_CST:
5474 case VECTOR_CST:
5475 case FIXED_CST:
5476 case COMPLEX_CST:
5477 return t;
5478
5479 case SIZEOF_EXPR:
5480 return fold_sizeof_expr (t);
5481
5482 case ABS_EXPR:
e28fadbc 5483 case ABSU_EXPR:
cda0a029
JM
5484 case CONJ_EXPR:
5485 case REALPART_EXPR:
5486 case IMAGPART_EXPR:
5487 case NEGATE_EXPR:
5488 case BIT_NOT_EXPR:
5489 case TRUTH_NOT_EXPR:
5490 case NOP_EXPR:
5491 case VIEW_CONVERT_EXPR:
5492 case CONVERT_EXPR:
5493 case FLOAT_EXPR:
5494 case FIX_TRUNC_EXPR:
5495 case FIXED_CONVERT_EXPR:
5496 case ADDR_SPACE_CONVERT_EXPR:
5497
5498 op1 = TREE_OPERAND (t, 0);
5499
5500 t = const_unop (code, TREE_TYPE (t), op1);
5501 if (!t)
5502 return NULL_TREE;
5503
5504 if (CONVERT_EXPR_CODE_P (code)
5505 && TREE_OVERFLOW_P (t) && !TREE_OVERFLOW_P (op1))
5506 TREE_OVERFLOW (t) = false;
5507 return t;
5508
5509 default:
5510 return NULL_TREE;
5511 }
5512}
5513
5514/* If T is a simple constant expression, returns its simplified value.
dba99244 5515 Otherwise returns T. In contrast to maybe_constant_value we
cda0a029
JM
5516 simplify only few operations on constant-expressions, and we don't
5517 try to simplify constexpressions. */
5518
5519tree
5520fold_simple (tree t)
5521{
cda0a029
JM
5522 if (processing_template_decl)
5523 return t;
5524
dba99244
MP
5525 tree r = fold_simple_1 (t);
5526 if (r)
5527 return r;
cda0a029 5528
dba99244 5529 return t;
cda0a029
JM
5530}
5531
2d76680f
PC
5532/* If T is a constant expression, returns its reduced value.
5533 Otherwise, if T does not have TREE_CONSTANT set, returns T.
13de99bc
JJ
5534 Otherwise, returns a version of T without TREE_CONSTANT.
5535 MANIFESTLY_CONST_EVAL is true if T is manifestly const-evaluated
5536 as per P0595. */
2d76680f 5537
8a87daca
JM
5538static GTY((deletable)) hash_map<tree, tree> *cv_cache;
5539
5540tree
13de99bc 5541maybe_constant_value (tree t, tree decl, bool manifestly_const_eval)
2d76680f
PC
5542{
5543 tree r;
5544
a0ab7ccd 5545 if (!is_nondependent_constant_expression (t))
2d76680f
PC
5546 {
5547 if (TREE_OVERFLOW_P (t))
5548 {
5549 t = build_nop (TREE_TYPE (t), t);
5550 TREE_CONSTANT (t) = false;
5551 }
5552 return t;
5553 }
8a87daca
JM
5554 else if (CONSTANT_CLASS_P (t))
5555 /* No caching or evaluation needed. */
5556 return t;
5557
13de99bc
JJ
5558 if (manifestly_const_eval)
5559 return cxx_eval_outermost_constant_expr (t, true, true, true, decl);
5560
8a87daca
JM
5561 if (cv_cache == NULL)
5562 cv_cache = hash_map<tree, tree>::create_ggc (101);
5563 if (tree *cached = cv_cache->get (t))
5564 return *cached;
2d76680f 5565
e4082611 5566 r = cxx_eval_outermost_constant_expr (t, true, true, false, decl);
595278be
MM
5567 gcc_checking_assert (r == t
5568 || CONVERT_EXPR_P (t)
5569 || TREE_CODE (t) == VIEW_CONVERT_EXPR
5570 || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
5571 || !cp_tree_equal (r, t));
8a87daca 5572 cv_cache->put (t, r);
2d76680f
PC
5573 return r;
5574}
5575
7a7ac32a
PP
5576/* Dispose of the whole CV_CACHE. */
5577
5578static void
5579clear_cv_cache (void)
5580{
5581 if (cv_cache != NULL)
5582 cv_cache->empty ();
5583}
5584
eba9e839 5585/* Dispose of the whole CV_CACHE and FOLD_CACHE. */
1e297006
MP
5586
5587void
eba9e839 5588clear_cv_and_fold_caches (void)
1e297006 5589{
7a7ac32a 5590 clear_cv_cache ();
eba9e839 5591 clear_fold_cache ();
1e297006
MP
5592}
5593
a81c8e8c
MP
5594/* Internal function handling expressions in templates for
5595 fold_non_dependent_expr and fold_non_dependent_init.
5596
5597 If we're in a template, but T isn't value dependent, simplify
5598 it. We're supposed to treat:
5599
5600 template <typename T> void f(T[1 + 1]);
5601 template <typename T> void f(T[2]);
5602
5603 as two declarations of the same function, for example. */
5604
5605static tree
5606fold_non_dependent_expr_template (tree t, tsubst_flags_t complain,
5607 bool manifestly_const_eval)
5608{
5609 gcc_assert (processing_template_decl);
5610
5611 if (is_nondependent_constant_expression (t))
5612 {
5613 processing_template_decl_sentinel s;
5614 t = instantiate_non_dependent_expr_internal (t, complain);
5615
5616 if (type_unknown_p (t) || BRACE_ENCLOSED_INITIALIZER_P (t))
5617 {
5618 if (TREE_OVERFLOW_P (t))
5619 {
5620 t = build_nop (TREE_TYPE (t), t);
5621 TREE_CONSTANT (t) = false;
5622 }
5623 return t;
5624 }
5625
5626 tree r = cxx_eval_outermost_constant_expr (t, true, true,
5627 manifestly_const_eval,
5628 NULL_TREE);
5629 /* cp_tree_equal looks through NOPs, so allow them. */
5630 gcc_checking_assert (r == t
5631 || CONVERT_EXPR_P (t)
5632 || TREE_CODE (t) == VIEW_CONVERT_EXPR
5633 || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
5634 || !cp_tree_equal (r, t));
5635 return r;
5636 }
5637 else if (TREE_OVERFLOW_P (t))
5638 {
5639 t = build_nop (TREE_TYPE (t), t);
5640 TREE_CONSTANT (t) = false;
5641 }
5642
5643 return t;
5644}
5645
234bef96
PC
5646/* Like maybe_constant_value but first fully instantiate the argument.
5647
5648 Note: this is equivalent to instantiate_non_dependent_expr_sfinae
e56f6629
JM
5649 (t, complain) followed by maybe_constant_value but is more efficient,
5650 because it calls instantiation_dependent_expression_p and
5651 potential_constant_expression at most once.
4cd3e7df 5652 The manifestly_const_eval argument is passed to maybe_constant_value.
e56f6629
JM
5653
5654 Callers should generally pass their active complain, or if they are in a
5655 non-template, diagnosing context, they can use the default of
5656 tf_warning_or_error. Callers that might be within a template context, don't
5657 have a complain parameter, and aren't going to remember the result for long
5658 (e.g. null_ptr_cst_p), can pass tf_none and deal with error_mark_node
5659 appropriately. */
234bef96
PC
5660
5661tree
e56f6629 5662fold_non_dependent_expr (tree t,
4cd3e7df
JJ
5663 tsubst_flags_t complain /* = tf_warning_or_error */,
5664 bool manifestly_const_eval /* = false */)
234bef96
PC
5665{
5666 if (t == NULL_TREE)
5667 return NULL_TREE;
5668
a81c8e8c
MP
5669 if (processing_template_decl)
5670 return fold_non_dependent_expr_template (t, complain,
5671 manifestly_const_eval);
234bef96 5672
a81c8e8c
MP
5673 return maybe_constant_value (t, NULL_TREE, manifestly_const_eval);
5674}
234bef96 5675
234bef96 5676
a81c8e8c 5677/* Like maybe_constant_init but first fully instantiate the argument. */
234bef96 5678
a81c8e8c
MP
5679tree
5680fold_non_dependent_init (tree t,
5681 tsubst_flags_t complain /*=tf_warning_or_error*/,
5682 bool manifestly_const_eval /*=false*/)
5683{
5684 if (t == NULL_TREE)
5685 return NULL_TREE;
5686
5687 if (processing_template_decl)
5688 {
5689 t = fold_non_dependent_expr_template (t, complain,
5690 manifestly_const_eval);
5691 /* maybe_constant_init does this stripping, so do it here too. */
5692 if (TREE_CODE (t) == TARGET_EXPR)
234bef96 5693 {
a81c8e8c
MP
5694 tree init = TARGET_EXPR_INITIAL (t);
5695 if (TREE_CODE (init) == CONSTRUCTOR)
5696 t = init;
234bef96
PC
5697 }
5698 return t;
5699 }
5700
a81c8e8c 5701 return maybe_constant_init (t, NULL_TREE, manifestly_const_eval);
234bef96
PC
5702}
5703
2d76680f 5704/* Like maybe_constant_value, but returns a CONSTRUCTOR directly, rather
e4082611
JJ
5705 than wrapped in a TARGET_EXPR.
5706 ALLOW_NON_CONSTANT is false if T is required to be a constant expression.
13de99bc 5707 MANIFESTLY_CONST_EVAL is true if T is manifestly const-evaluated as
e4082611 5708 per P0595 even when ALLOW_NON_CONSTANT is true. */
2d76680f 5709
118cd6ba 5710static tree
e4082611 5711maybe_constant_init_1 (tree t, tree decl, bool allow_non_constant,
13de99bc 5712 bool manifestly_const_eval)
2d76680f 5713{
cda0a029
JM
5714 if (!t)
5715 return t;
2d76680f
PC
5716 if (TREE_CODE (t) == EXPR_STMT)
5717 t = TREE_OPERAND (t, 0);
5718 if (TREE_CODE (t) == CONVERT_EXPR
5719 && VOID_TYPE_P (TREE_TYPE (t)))
5720 t = TREE_OPERAND (t, 0);
60813a46
JM
5721 if (TREE_CODE (t) == INIT_EXPR)
5722 t = TREE_OPERAND (t, 1);
f64e0c02
JM
5723 if (TREE_CODE (t) == TARGET_EXPR)
5724 t = TARGET_EXPR_INITIAL (t);
a0ab7ccd 5725 if (!is_nondependent_static_init_expression (t))
69eb4fde 5726 /* Don't try to evaluate it. */;
118cd6ba 5727 else if (CONSTANT_CLASS_P (t) && allow_non_constant)
8a87daca 5728 /* No evaluation needed. */;
69eb4fde 5729 else
e4082611 5730 t = cxx_eval_outermost_constant_expr (t, allow_non_constant,
38295573 5731 /*strict*/false,
13de99bc 5732 manifestly_const_eval, decl);
2d76680f
PC
5733 if (TREE_CODE (t) == TARGET_EXPR)
5734 {
5735 tree init = TARGET_EXPR_INITIAL (t);
5736 if (TREE_CODE (init) == CONSTRUCTOR)
5737 t = init;
5738 }
5739 return t;
5740}
5741
118cd6ba
MP
5742/* Wrapper for maybe_constant_init_1 which permits non constants. */
5743
5744tree
13de99bc 5745maybe_constant_init (tree t, tree decl, bool manifestly_const_eval)
118cd6ba 5746{
13de99bc 5747 return maybe_constant_init_1 (t, decl, true, manifestly_const_eval);
118cd6ba
MP
5748}
5749
5750/* Wrapper for maybe_constant_init_1 which does not permit non constants. */
5751
5752tree
5753cxx_constant_init (tree t, tree decl)
5754{
e4082611 5755 return maybe_constant_init_1 (t, decl, false, true);
118cd6ba
MP
5756}
5757
2d76680f
PC
5758#if 0
5759/* FIXME see ADDR_EXPR section in potential_constant_expression_1. */
5760/* Return true if the object referred to by REF has automatic or thread
5761 local storage. */
5762
5763enum { ck_ok, ck_bad, ck_unknown };
5764static int
5765check_automatic_or_tls (tree ref)
5766{
ef4bddc2 5767 machine_mode mode;
f37fac2b 5768 poly_int64 bitsize, bitpos;
2d76680f
PC
5769 tree offset;
5770 int volatilep = 0, unsignedp = 0;
5771 tree decl = get_inner_reference (ref, &bitsize, &bitpos, &offset,
5772 &mode, &unsignedp, &volatilep, false);
5773 duration_kind dk;
5774
5775 /* If there isn't a decl in the middle, we don't know the linkage here,
5776 and this isn't a constant expression anyway. */
5777 if (!DECL_P (decl))
5778 return ck_unknown;
5779 dk = decl_storage_duration (decl);
5780 return (dk == dk_auto || dk == dk_thread) ? ck_bad : ck_ok;
5781}
5782#endif
5783
c7a53bdb
JJ
5784/* Data structure for passing data from potential_constant_expression_1
5785 to check_for_return_continue via cp_walk_tree. */
5786struct check_for_return_continue_data {
5787 hash_set<tree> *pset;
5788 tree continue_stmt;
5789};
5790
5791/* Helper function for potential_constant_expression_1 SWITCH_STMT handling,
5792 called through cp_walk_tree. Return the first RETURN_EXPR found, or note
5793 the first CONTINUE_STMT if RETURN_EXPR is not found. */
5794static tree
5795check_for_return_continue (tree *tp, int *walk_subtrees, void *data)
5796{
5797 tree t = *tp, s;
5798 check_for_return_continue_data *d = (check_for_return_continue_data *) data;
5799 switch (TREE_CODE (t))
5800 {
5801 case RETURN_EXPR:
5802 return t;
5803
5804 case CONTINUE_STMT:
5805 if (d->continue_stmt == NULL_TREE)
5806 d->continue_stmt = t;
5807 break;
5808
5809#define RECUR(x) \
5810 if (tree r = cp_walk_tree (&x, check_for_return_continue, data, \
5811 d->pset)) \
5812 return r
5813
5814 /* For loops, walk subtrees manually, so that continue stmts found
5815 inside of the bodies of the loops are ignored. */
5816 case DO_STMT:
5817 *walk_subtrees = 0;
5818 RECUR (DO_COND (t));
5819 s = d->continue_stmt;
5820 RECUR (DO_BODY (t));
5821 d->continue_stmt = s;
5822 break;
5823
5824 case WHILE_STMT:
5825 *walk_subtrees = 0;
5826 RECUR (WHILE_COND (t));
5827 s = d->continue_stmt;
5828 RECUR (WHILE_BODY (t));
5829 d->continue_stmt = s;
5830 break;
5831
5832 case FOR_STMT:
5833 *walk_subtrees = 0;
5834 RECUR (FOR_INIT_STMT (t));
5835 RECUR (FOR_COND (t));
5836 RECUR (FOR_EXPR (t));
5837 s = d->continue_stmt;
5838 RECUR (FOR_BODY (t));
5839 d->continue_stmt = s;
5840 break;
5841
5842 case RANGE_FOR_STMT:
5843 *walk_subtrees = 0;
5844 RECUR (RANGE_FOR_EXPR (t));
5845 s = d->continue_stmt;
5846 RECUR (RANGE_FOR_BODY (t));
5847 d->continue_stmt = s;
5848 break;
5849#undef RECUR
5850
5851 case STATEMENT_LIST:
5852 case CONSTRUCTOR:
5853 break;
5854
5855 default:
5856 if (!EXPR_P (t))
5857 *walk_subtrees = 0;
5858 break;
5859 }
5860
5861 return NULL_TREE;
5862}
5863
2d76680f
PC
5864/* Return true if T denotes a potentially constant expression. Issue
5865 diagnostic as appropriate under control of FLAGS. If WANT_RVAL is true,
a0ab7ccd
JM
5866 an lvalue-rvalue conversion is implied. If NOW is true, we want to
5867 consider the expression in the current context, independent of constexpr
5868 substitution.
2d76680f
PC
5869
5870 C++0x [expr.const] used to say
5871
5872 6 An expression is a potential constant expression if it is
5873 a constant expression where all occurrences of function
5874 parameters are replaced by arbitrary constant expressions
5875 of the appropriate type.
5876
5877 2 A conditional expression is a constant expression unless it
5878 involves one of the following as a potentially evaluated
5879 subexpression (3.2), but subexpressions of logical AND (5.14),
5880 logical OR (5.15), and conditional (5.16) operations that are
5881 not evaluated are not considered. */
5882
5883static bool
a0ab7ccd 5884potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
3075affd 5885 tsubst_flags_t flags, tree *jump_target)
2d76680f 5886{
a0ab7ccd 5887#define RECUR(T,RV) \
3075affd 5888 potential_constant_expression_1 ((T), (RV), strict, now, flags, jump_target)
a0ab7ccd 5889
2d76680f
PC
5890 enum { any = false, rval = true };
5891 int i;
5892 tree tmp;
5893
5894 if (t == error_mark_node)
5895 return false;
5896 if (t == NULL_TREE)
5897 return true;
6bdfada4 5898 location_t loc = cp_expr_loc_or_loc (t, input_location);
3075affd
JM
5899
5900 if (*jump_target)
5901 /* If we are jumping, ignore everything. This is simpler than the
5902 cxx_eval_constant_expression handling because we only need to be
5903 conservatively correct, and we don't necessarily have a constant value
5904 available, so we don't bother with switch tracking. */
5905 return true;
5906
3c393a2c 5907 if (TREE_THIS_VOLATILE (t) && want_rval)
2d76680f
PC
5908 {
5909 if (flags & tf_error)
3c393a2c
MP
5910 error_at (loc, "lvalue-to-rvalue conversion of a volatile lvalue "
5911 "%qE with type %qT", t, TREE_TYPE (t));
2d76680f
PC
5912 return false;
5913 }
5914 if (CONSTANT_CLASS_P (t))
5915 return true;
7dc2b4a2
JM
5916 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPED)
5917 && TREE_TYPE (t) == error_mark_node)
5918 return false;
2d76680f
PC
5919
5920 switch (TREE_CODE (t))
5921 {
5922 case FUNCTION_DECL:
5923 case BASELINK:
5924 case TEMPLATE_DECL:
5925 case OVERLOAD:
5926 case TEMPLATE_ID_EXPR:
5927 case LABEL_DECL:
5928 case LABEL_EXPR:
60813a46 5929 case CASE_LABEL_EXPR:
2d76680f
PC
5930 case CONST_DECL:
5931 case SIZEOF_EXPR:
5932 case ALIGNOF_EXPR:
5933 case OFFSETOF_EXPR:
5934 case NOEXCEPT_EXPR:
5935 case TEMPLATE_PARM_INDEX:
5936 case TRAIT_EXPR:
5937 case IDENTIFIER_NODE:
5938 case USERDEF_LITERAL:
5939 /* We can see a FIELD_DECL in a pointer-to-member expression. */
5940 case FIELD_DECL:
cda0a029 5941 case RESULT_DECL:
2d76680f 5942 case USING_DECL:
60813a46 5943 case USING_STMT:
3e605b20 5944 case PLACEHOLDER_EXPR:
971e17ff 5945 case REQUIRES_EXPR:
98e5a19a 5946 case STATIC_ASSERT:
96a95ac1 5947 case DEBUG_BEGIN_STMT:
2d76680f
PC
5948 return true;
5949
3075affd
JM
5950 case RETURN_EXPR:
5951 if (!RECUR (TREE_OPERAND (t, 0), any))
5952 return false;
5953 /* FALLTHROUGH */
5954
5955 case BREAK_STMT:
5956 case CONTINUE_STMT:
5957 *jump_target = t;
5958 return true;
5959
a0ab7ccd
JM
5960 case PARM_DECL:
5961 if (now)
5962 {
5963 if (flags & tf_error)
5964 error ("%qE is not a constant expression", t);
5965 return false;
5966 }
5967 return true;
5968
2d76680f
PC
5969 case AGGR_INIT_EXPR:
5970 case CALL_EXPR:
5971 /* -- an invocation of a function other than a constexpr function
5972 or a constexpr constructor. */
5973 {
5974 tree fun = get_function_named_in_call (t);
5975 const int nargs = call_expr_nargs (t);
5976 i = 0;
5977
60813a46
JM
5978 if (fun == NULL_TREE)
5979 {
44a845ca
MS
5980 /* Reset to allow the function to continue past the end
5981 of the block below. Otherwise return early. */
5982 bool bail = true;
5983
35228ac7
JJ
5984 if (TREE_CODE (t) == CALL_EXPR
5985 && CALL_EXPR_FN (t) == NULL_TREE)
5986 switch (CALL_EXPR_IFN (t))
5987 {
5988 /* These should be ignored, they are optimized away from
5989 constexpr functions. */
5990 case IFN_UBSAN_NULL:
5991 case IFN_UBSAN_BOUNDS:
5992 case IFN_UBSAN_VPTR:
81fea426 5993 case IFN_FALLTHROUGH:
35228ac7 5994 return true;
44a845ca
MS
5995
5996 case IFN_ADD_OVERFLOW:
5997 case IFN_SUB_OVERFLOW:
5998 case IFN_MUL_OVERFLOW:
e16f1cc7 5999 case IFN_LAUNDER:
d8fcab68 6000 case IFN_VEC_CONVERT:
44a845ca 6001 bail = false;
d8fcab68 6002 break;
44a845ca 6003
35228ac7
JJ
6004 default:
6005 break;
6006 }
44a845ca
MS
6007
6008 if (bail)
6009 {
6010 /* fold_call_expr can't do anything with IFN calls. */
6011 if (flags & tf_error)
e40b6fc7 6012 error_at (loc, "call to internal function %qE", t);
44a845ca
MS
6013 return false;
6014 }
60813a46 6015 }
44a845ca
MS
6016
6017 if (fun && is_overloaded_fn (fun))
2d76680f
PC
6018 {
6019 if (TREE_CODE (fun) == FUNCTION_DECL)
6020 {
6021 if (builtin_valid_in_constant_expr_p (fun))
6022 return true;
6023 if (!DECL_DECLARED_CONSTEXPR_P (fun)
6024 /* Allow any built-in function; if the expansion
6025 isn't constant, we'll deal with that then. */
3d78e008 6026 && !fndecl_built_in_p (fun))
2d76680f
PC
6027 {
6028 if (flags & tf_error)
6029 {
84fa214d 6030 error_at (loc, "call to non-%<constexpr%> function %qD",
e40b6fc7 6031 fun);
2d76680f
PC
6032 explain_invalid_constexpr_fn (fun);
6033 }
6034 return false;
6035 }
6036 /* A call to a non-static member function takes the address
6037 of the object as the first argument. But in a constant
6038 expression the address will be folded away, so look
6039 through it now. */
6040 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
6041 && !DECL_CONSTRUCTOR_P (fun))
6042 {
6043 tree x = get_nth_callarg (t, 0);
6044 if (is_this_parameter (x))
3e605b20 6045 return true;
a0ab7ccd
JM
6046 /* Don't require an immediately constant value, as
6047 constexpr substitution might not use the value. */
6048 bool sub_now = false;
6049 if (!potential_constant_expression_1 (x, rval, strict,
3075affd
JM
6050 sub_now, flags,
6051 jump_target))
2d76680f
PC
6052 return false;
6053 i = 1;
6054 }
6055 }
6056 else
6057 {
69eb4fde 6058 if (!RECUR (fun, true))
2d76680f
PC
6059 return false;
6060 fun = get_first_fn (fun);
6061 }
6062 /* Skip initial arguments to base constructors. */
6063 if (DECL_BASE_CONSTRUCTOR_P (fun))
6064 i = num_artificial_parms_for (fun);
6065 fun = DECL_ORIGIN (fun);
6066 }
44a845ca 6067 else if (fun)
2d76680f 6068 {
69eb4fde 6069 if (RECUR (fun, rval))
2d76680f
PC
6070 /* Might end up being a constant function pointer. */;
6071 else
6072 return false;
6073 }
6074 for (; i < nargs; ++i)
6075 {
6076 tree x = get_nth_callarg (t, i);
c3c29ba5
JM
6077 /* In a template, reference arguments haven't been converted to
6078 REFERENCE_TYPE and we might not even know if the parameter
6079 is a reference, so accept lvalue constants too. */
6080 bool rv = processing_template_decl ? any : rval;
a0ab7ccd
JM
6081 /* Don't require an immediately constant value, as constexpr
6082 substitution might not use the value of the argument. */
6083 bool sub_now = false;
6084 if (!potential_constant_expression_1 (x, rv, strict,
3075affd 6085 sub_now, flags, jump_target))
2d76680f
PC
6086 return false;
6087 }
6088 return true;
6089 }
6090
6091 case NON_LVALUE_EXPR:
6092 /* -- an lvalue-to-rvalue conversion (4.1) unless it is applied to
6093 -- an lvalue of integral type that refers to a non-volatile
6094 const variable or static data member initialized with
6095 constant expressions, or
6096
6097 -- an lvalue of literal type that refers to non-volatile
6098 object defined with constexpr, or that refers to a
6099 sub-object of such an object; */
69eb4fde 6100 return RECUR (TREE_OPERAND (t, 0), rval);
2d76680f
PC
6101
6102 case VAR_DECL:
70f40fea 6103 if (DECL_HAS_VALUE_EXPR_P (t))
c1051bf7 6104 {
68ad1bf7 6105 if (now && is_normal_capture_proxy (t))
c1051bf7
JM
6106 {
6107 /* -- in a lambda-expression, a reference to this or to a
6108 variable with automatic storage duration defined outside that
6109 lambda-expression, where the reference would be an
6110 odr-use. */
6111 if (flags & tf_error)
6112 {
6113 tree cap = DECL_CAPTURED_VARIABLE (t);
6114 error ("lambda capture of %qE is not a constant expression",
6115 cap);
6116 if (!want_rval && decl_constant_var_p (cap))
6117 inform (input_location, "because it is used as a glvalue");
6118 }
6119 return false;
6120 }
6121 return RECUR (DECL_VALUE_EXPR (t), rval);
6122 }
69eb4fde 6123 if (want_rval
98e5a19a 6124 && !var_in_maybe_constexpr_fn (t)
7dc2b4a2 6125 && !type_dependent_expression_p (t)
4b691b13 6126 && !decl_maybe_constant_var_p (t)
69eb4fde
JM
6127 && (strict
6128 || !CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (t))
4b691b13
JM
6129 || (DECL_INITIAL (t)
6130 && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (t)))
7dc2b4a2 6131 && COMPLETE_TYPE_P (TREE_TYPE (t))
dbcd32f8 6132 && !is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
2d76680f
PC
6133 {
6134 if (flags & tf_error)
6135 non_const_var_error (t);
6136 return false;
6137 }
6138 return true;
6139
6140 case NOP_EXPR:
ed3ea9f2
JJ
6141 if (REINTERPRET_CAST_P (t))
6142 {
6143 if (flags & tf_error)
a9c697b8 6144 error_at (loc, "%<reinterpret_cast%> is not a constant expression");
ed3ea9f2
JJ
6145 return false;
6146 }
6147 /* FALLTHRU */
2d76680f
PC
6148 case CONVERT_EXPR:
6149 case VIEW_CONVERT_EXPR:
6150 /* -- a reinterpret_cast. FIXME not implemented, and this rule
6151 may change to something more specific to type-punning (DR 1312). */
6152 {
6153 tree from = TREE_OPERAND (t, 0);
dfd7fdca
DM
6154 if (location_wrapper_p (t))
6155 return (RECUR (from, want_rval));
6156 if (INDIRECT_TYPE_P (TREE_TYPE (t)))
2d76680f 6157 {
dfd7fdca
DM
6158 STRIP_ANY_LOCATION_WRAPPER (from);
6159 if (TREE_CODE (from) == INTEGER_CST
6160 && !integer_zerop (from))
6161 {
6162 if (flags & tf_error)
a9c697b8
MS
6163 error_at (loc,
6164 "%<reinterpret_cast%> from integer to pointer");
dfd7fdca
DM
6165 return false;
6166 }
2d76680f 6167 }
69eb4fde 6168 return (RECUR (from, TREE_CODE (t) != VIEW_CONVERT_EXPR));
2d76680f
PC
6169 }
6170
be845b04
JJ
6171 case ADDRESSOF_EXPR:
6172 /* This is like ADDR_EXPR, except it won't form pointer-to-member. */
6173 t = TREE_OPERAND (t, 0);
6174 goto handle_addr_expr;
6175
2d76680f
PC
6176 case ADDR_EXPR:
6177 /* -- a unary operator & that is applied to an lvalue that
6178 designates an object with thread or automatic storage
6179 duration; */
6180 t = TREE_OPERAND (t, 0);
6181
6182 if (TREE_CODE (t) == OFFSET_REF && PTRMEM_OK_P (t))
6183 /* A pointer-to-member constant. */
6184 return true;
6185
be845b04 6186 handle_addr_expr:
2d76680f
PC
6187#if 0
6188 /* FIXME adjust when issue 1197 is fully resolved. For now don't do
6189 any checking here, as we might dereference the pointer later. If
6190 we remove this code, also remove check_automatic_or_tls. */
6191 i = check_automatic_or_tls (t);
6192 if (i == ck_ok)
6193 return true;
6194 if (i == ck_bad)
6195 {
6196 if (flags & tf_error)
6197 error ("address-of an object %qE with thread local or "
6198 "automatic storage is not a constant expression", t);
6199 return false;
6200 }
6201#endif
69eb4fde 6202 return RECUR (t, any);
2d76680f 6203
dc8d2d00
JM
6204 case REALPART_EXPR:
6205 case IMAGPART_EXPR:
2d76680f
PC
6206 case COMPONENT_REF:
6207 case BIT_FIELD_REF:
6208 case ARROW_EXPR:
6209 case OFFSET_REF:
6210 /* -- a class member access unless its postfix-expression is
6211 of literal type or of pointer to literal type. */
6212 /* This test would be redundant, as it follows from the
6213 postfix-expression being a potential constant expression. */
19dedccf
JM
6214 if (type_unknown_p (t))
6215 return true;
69eb4fde 6216 return RECUR (TREE_OPERAND (t, 0), want_rval);
2d76680f
PC
6217
6218 case EXPR_PACK_EXPANSION:
69eb4fde 6219 return RECUR (PACK_EXPANSION_PATTERN (t), want_rval);
2d76680f
PC
6220
6221 case INDIRECT_REF:
6222 {
6223 tree x = TREE_OPERAND (t, 0);
6224 STRIP_NOPS (x);
948d0d91 6225 if (is_this_parameter (x) && !is_capture_proxy (x))
2d76680f 6226 {
5d4e573b 6227 if (!var_in_maybe_constexpr_fn (x))
2d76680f
PC
6228 {
6229 if (flags & tf_error)
e40b6fc7 6230 error_at (loc, "use of %<this%> in a constant expression");
2d76680f
PC
6231 return false;
6232 }
2d76680f
PC
6233 return true;
6234 }
69eb4fde 6235 return RECUR (x, rval);
2d76680f
PC
6236 }
6237
60813a46
JM
6238 case STATEMENT_LIST:
6239 {
6240 tree_stmt_iterator i;
6241 for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
6242 {
69eb4fde 6243 if (!RECUR (tsi_stmt (i), any))
60813a46
JM
6244 return false;
6245 }
6246 return true;
6247 }
6248 break;
6249
6250 case MODIFY_EXPR:
6251 if (cxx_dialect < cxx14)
6252 goto fail;
69eb4fde 6253 if (!RECUR (TREE_OPERAND (t, 0), any))
60813a46 6254 return false;
69eb4fde 6255 if (!RECUR (TREE_OPERAND (t, 1), rval))
60813a46
JM
6256 return false;
6257 return true;
6258
6259 case MODOP_EXPR:
6260 if (cxx_dialect < cxx14)
6261 goto fail;
69eb4fde 6262 if (!RECUR (TREE_OPERAND (t, 0), rval))
60813a46 6263 return false;
69eb4fde 6264 if (!RECUR (TREE_OPERAND (t, 2), rval))
60813a46
JM
6265 return false;
6266 return true;
6267
60813a46 6268 case DO_STMT:
69eb4fde 6269 if (!RECUR (DO_COND (t), rval))
60813a46 6270 return false;
69eb4fde 6271 if (!RECUR (DO_BODY (t), any))
60813a46 6272 return false;
3075affd
JM
6273 if (breaks (jump_target) || continues (jump_target))
6274 *jump_target = NULL_TREE;
60813a46
JM
6275 return true;
6276
6277 case FOR_STMT:
69eb4fde 6278 if (!RECUR (FOR_INIT_STMT (t), any))
60813a46 6279 return false;
8e9558f0
MP
6280 tmp = FOR_COND (t);
6281 if (!RECUR (tmp, rval))
60813a46 6282 return false;
8e9558f0
MP
6283 if (tmp)
6284 {
6285 if (!processing_template_decl)
6286 tmp = cxx_eval_outermost_constant_expr (tmp, true);
a385474c
MP
6287 /* If we couldn't evaluate the condition, it might not ever be
6288 true. */
6289 if (!integer_onep (tmp))
8e9558f0
MP
6290 return true;
6291 }
69eb4fde 6292 if (!RECUR (FOR_EXPR (t), any))
60813a46 6293 return false;
69eb4fde 6294 if (!RECUR (FOR_BODY (t), any))
60813a46 6295 return false;
3075affd
JM
6296 if (breaks (jump_target) || continues (jump_target))
6297 *jump_target = NULL_TREE;
60813a46
JM
6298 return true;
6299
98e5a19a 6300 case RANGE_FOR_STMT:
8112667c
MP
6301 if (!RECUR (RANGE_FOR_INIT_STMT (t), any))
6302 return false;
98e5a19a
JM
6303 if (!RECUR (RANGE_FOR_EXPR (t), any))
6304 return false;
6305 if (!RECUR (RANGE_FOR_BODY (t), any))
6306 return false;
3075affd
JM
6307 if (breaks (jump_target) || continues (jump_target))
6308 *jump_target = NULL_TREE;
98e5a19a
JM
6309 return true;
6310
60813a46 6311 case WHILE_STMT:
8e9558f0
MP
6312 tmp = WHILE_COND (t);
6313 if (!RECUR (tmp, rval))
60813a46 6314 return false;
8e9558f0
MP
6315 if (!processing_template_decl)
6316 tmp = cxx_eval_outermost_constant_expr (tmp, true);
a385474c
MP
6317 /* If we couldn't evaluate the condition, it might not ever be true. */
6318 if (!integer_onep (tmp))
8e9558f0 6319 return true;
69eb4fde 6320 if (!RECUR (WHILE_BODY (t), any))
60813a46 6321 return false;
3075affd
JM
6322 if (breaks (jump_target) || continues (jump_target))
6323 *jump_target = NULL_TREE;
60813a46
JM
6324 return true;
6325
6326 case SWITCH_STMT:
69eb4fde 6327 if (!RECUR (SWITCH_STMT_COND (t), rval))
60813a46 6328 return false;
ce965730 6329 /* FIXME we don't check SWITCH_STMT_BODY currently, because even
c7a53bdb
JJ
6330 unreachable labels would be checked and it is enough if there is
6331 a single switch cond value for which it is a valid constant
6332 expression. We need to check if there are any RETURN_EXPRs
6333 or CONTINUE_STMTs inside of the body though, as in that case
6334 we need to set *jump_target. */
6335 else
6336 {
6337 hash_set<tree> pset;
6338 check_for_return_continue_data data = { &pset, NULL_TREE };
6339 if (tree ret_expr
6340 = cp_walk_tree (&SWITCH_STMT_BODY (t), check_for_return_continue,
6341 &data, &pset))
6342 /* The switch might return. */
6343 *jump_target = ret_expr;
6344 else if (data.continue_stmt)
6345 /* The switch can't return, but might continue. */
6346 *jump_target = data.continue_stmt;
6347 }
60813a46
JM
6348 return true;
6349
58611fb6 6350 case STMT_EXPR:
69eb4fde 6351 return RECUR (STMT_EXPR_STMT (t), rval);
58611fb6 6352
2d76680f 6353 case LAMBDA_EXPR:
899ac3b8
JM
6354 if (cxx_dialect >= cxx17)
6355 /* In C++17 lambdas can be constexpr, don't give up yet. */
6356 return true;
6357 else if (flags & tf_error)
6358 error_at (loc, "lambda-expression is not a constant expression "
6359 "before C++17");
6360 return false;
6361
2d76680f
PC
6362 case DYNAMIC_CAST_EXPR:
6363 case PSEUDO_DTOR_EXPR:
2d76680f
PC
6364 case NEW_EXPR:
6365 case VEC_NEW_EXPR:
6366 case DELETE_EXPR:
6367 case VEC_DELETE_EXPR:
6368 case THROW_EXPR:
e40b6fc7
JJ
6369 case OMP_PARALLEL:
6370 case OMP_TASK:
6371 case OMP_FOR:
897064e2 6372 case OMP_SIMD:
e40b6fc7
JJ
6373 case OMP_DISTRIBUTE:
6374 case OMP_TASKLOOP:
6375 case OMP_TEAMS:
6376 case OMP_TARGET_DATA:
6377 case OMP_TARGET:
6378 case OMP_SECTIONS:
6379 case OMP_ORDERED:
6380 case OMP_CRITICAL:
6381 case OMP_SINGLE:
6382 case OMP_SECTION:
6383 case OMP_MASTER:
6384 case OMP_TASKGROUP:
6385 case OMP_TARGET_UPDATE:
6386 case OMP_TARGET_ENTER_DATA:
6387 case OMP_TARGET_EXIT_DATA:
2d76680f
PC
6388 case OMP_ATOMIC:
6389 case OMP_ATOMIC_READ:
6390 case OMP_ATOMIC_CAPTURE_OLD:
6391 case OMP_ATOMIC_CAPTURE_NEW:
28567c40 6392 case OMP_DEPOBJ:
e40b6fc7
JJ
6393 case OACC_PARALLEL:
6394 case OACC_KERNELS:
6395 case OACC_DATA:
6396 case OACC_HOST_DATA:
6397 case OACC_LOOP:
6398 case OACC_CACHE:
6399 case OACC_DECLARE:
6400 case OACC_ENTER_DATA:
6401 case OACC_EXIT_DATA:
6402 case OACC_UPDATE:
2d76680f
PC
6403 /* GCC internal stuff. */
6404 case VA_ARG_EXPR:
2d76680f 6405 case TRANSACTION_EXPR:
60813a46 6406 case ASM_EXPR:
81b6a6c5 6407 case AT_ENCODE_EXPR:
60813a46 6408 fail:
2d76680f 6409 if (flags & tf_error)
e40b6fc7 6410 error_at (loc, "expression %qE is not a constant expression", t);
2d76680f
PC
6411 return false;
6412
bf8d8309
MP
6413 case OBJ_TYPE_REF:
6414 if (cxx_dialect >= cxx2a)
6415 /* In C++2a virtual calls can be constexpr, don't give up yet. */
6416 return true;
6417 else if (flags & tf_error)
a9c697b8
MS
6418 error_at (loc,
6419 "virtual functions cannot be %<constexpr%> before C++2a");
bf8d8309
MP
6420 return false;
6421
2d76680f
PC
6422 case TYPEID_EXPR:
6423 /* -- a typeid expression whose operand is of polymorphic
6424 class type; */
6425 {
6426 tree e = TREE_OPERAND (t, 0);
6427 if (!TYPE_P (e) && !type_dependent_expression_p (e)
6428 && TYPE_POLYMORPHIC_P (TREE_TYPE (e)))
6429 {
6430 if (flags & tf_error)
a9c697b8 6431 error_at (loc, "%<typeid%> is not a constant expression "
e40b6fc7 6432 "because %qE is of polymorphic type", e);
2d76680f
PC
6433 return false;
6434 }
6435 return true;
6436 }
6437
1af4ebf5 6438 case POINTER_DIFF_EXPR:
2d76680f 6439 case MINUS_EXPR:
2d76680f
PC
6440 want_rval = true;
6441 goto binary;
6442
6443 case LT_EXPR:
6444 case LE_EXPR:
6445 case GT_EXPR:
6446 case GE_EXPR:
6447 case EQ_EXPR:
6448 case NE_EXPR:
2d76680f
PC
6449 want_rval = true;
6450 goto binary;
6451
60813a46
JM
6452 case PREINCREMENT_EXPR:
6453 case POSTINCREMENT_EXPR:
6454 case PREDECREMENT_EXPR:
6455 case POSTDECREMENT_EXPR:
6456 if (cxx_dialect < cxx14)
6457 goto fail;
6458 goto unary;
6459
2d76680f
PC
6460 case BIT_NOT_EXPR:
6461 /* A destructor. */
6462 if (TYPE_P (TREE_OPERAND (t, 0)))
6463 return true;
191816a3 6464 /* fall through. */
2d76680f 6465
2d76680f
PC
6466 case CONJ_EXPR:
6467 case SAVE_EXPR:
6468 case FIX_TRUNC_EXPR:
6469 case FLOAT_EXPR:
6470 case NEGATE_EXPR:
6471 case ABS_EXPR:
e197e64e 6472 case ABSU_EXPR:
2d76680f
PC
6473 case TRUTH_NOT_EXPR:
6474 case FIXED_CONVERT_EXPR:
6475 case UNARY_PLUS_EXPR:
4856a1f0
PC
6476 case UNARY_LEFT_FOLD_EXPR:
6477 case UNARY_RIGHT_FOLD_EXPR:
60813a46 6478 unary:
69eb4fde 6479 return RECUR (TREE_OPERAND (t, 0), rval);
2d76680f
PC
6480
6481 case CAST_EXPR:
6482 case CONST_CAST_EXPR:
6483 case STATIC_CAST_EXPR:
6484 case REINTERPRET_CAST_EXPR:
6485 case IMPLICIT_CONV_EXPR:
6486 if (cxx_dialect < cxx11
6487 && !dependent_type_p (TREE_TYPE (t))
6488 && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (t)))
6489 /* In C++98, a conversion to non-integral type can't be part of a
6490 constant expression. */
6491 {
6492 if (flags & tf_error)
e40b6fc7
JJ
6493 error_at (loc,
6494 "cast to non-integral type %qT in a constant expression",
6495 TREE_TYPE (t));
2d76680f
PC
6496 return false;
6497 }
fe0604d3
MP
6498 /* This might be a conversion from a class to a (potentially) literal
6499 type. Let's consider it potentially constant since the conversion
6500 might be a constexpr user-defined conversion. */
6501 else if (cxx_dialect >= cxx11
6502 && (dependent_type_p (TREE_TYPE (t))
6503 || !COMPLETE_TYPE_P (TREE_TYPE (t))
6504 || literal_type_p (TREE_TYPE (t)))
6505 && TREE_OPERAND (t, 0))
6506 {
6507 tree type = TREE_TYPE (TREE_OPERAND (t, 0));
6508 /* If this is a dependent type, it could end up being a class
6509 with conversions. */
6510 if (type == NULL_TREE || WILDCARD_TYPE_P (type))
6511 return true;
6512 /* Or a non-dependent class which has conversions. */
6513 else if (CLASS_TYPE_P (type)
6514 && (TYPE_HAS_CONVERSION (type) || dependent_scope_p (type)))
6515 return true;
6516 }
2d76680f 6517
69eb4fde 6518 return (RECUR (TREE_OPERAND (t, 0),
9f613f06 6519 !TYPE_REF_P (TREE_TYPE (t))));
2d76680f 6520
60813a46 6521 case BIND_EXPR:
69eb4fde 6522 return RECUR (BIND_EXPR_BODY (t), want_rval);
60813a46 6523
60813a46
JM
6524 case CLEANUP_POINT_EXPR:
6525 case MUST_NOT_THROW_EXPR:
6526 case TRY_CATCH_EXPR:
769430b2 6527 case TRY_BLOCK:
60813a46
JM
6528 case EH_SPEC_BLOCK:
6529 case EXPR_STMT:
2d76680f
PC
6530 case PAREN_EXPR:
6531 case NON_DEPENDENT_EXPR:
6532 /* For convenience. */
f937929e
JM
6533 case LOOP_EXPR:
6534 case EXIT_EXPR:
69eb4fde 6535 return RECUR (TREE_OPERAND (t, 0), want_rval);
2d76680f 6536
98e5a19a
JM
6537 case DECL_EXPR:
6538 tmp = DECL_EXPR_DECL (t);
6539 if (VAR_P (tmp) && !DECL_ARTIFICIAL (tmp))
6540 {
6541 if (TREE_STATIC (tmp))
6542 {
6543 if (flags & tf_error)
6544 error_at (DECL_SOURCE_LOCATION (tmp), "%qD declared "
4b691b13 6545 "%<static%> in %<constexpr%> context", tmp);
98e5a19a
JM
6546 return false;
6547 }
6548 else if (CP_DECL_THREAD_LOCAL_P (tmp))
6549 {
6550 if (flags & tf_error)
6551 error_at (DECL_SOURCE_LOCATION (tmp), "%qD declared "
4b691b13 6552 "%<thread_local%> in %<constexpr%> context", tmp);
98e5a19a
JM
6553 return false;
6554 }
3885527d
PC
6555 else if (!check_for_uninitialized_const_var
6556 (tmp, /*constexpr_context_p=*/true, flags))
6557 return false;
98e5a19a
JM
6558 }
6559 return RECUR (tmp, want_rval);
6560
769430b2
JM
6561 case TRY_FINALLY_EXPR:
6562 return (RECUR (TREE_OPERAND (t, 0), want_rval)
6563 && RECUR (TREE_OPERAND (t, 1), any));
6564
2d76680f 6565 case SCOPE_REF:
69eb4fde 6566 return RECUR (TREE_OPERAND (t, 1), want_rval);
2d76680f
PC
6567
6568 case TARGET_EXPR:
d3a9902e
JM
6569 if (!TARGET_EXPR_DIRECT_INIT_P (t)
6570 && !literal_type_p (TREE_TYPE (t)))
2d76680f
PC
6571 {
6572 if (flags & tf_error)
6573 {
097f82ec 6574 auto_diagnostic_group d;
e40b6fc7
JJ
6575 error_at (loc, "temporary of non-literal type %qT in a "
6576 "constant expression", TREE_TYPE (t));
2d76680f
PC
6577 explain_non_literal_class (TREE_TYPE (t));
6578 }
6579 return false;
6580 }
191816a3 6581 /* FALLTHRU */
2d76680f 6582 case INIT_EXPR:
69eb4fde 6583 return RECUR (TREE_OPERAND (t, 1), rval);
2d76680f
PC
6584
6585 case CONSTRUCTOR:
6586 {
6587 vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
6588 constructor_elt *ce;
6589 for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
69eb4fde 6590 if (!RECUR (ce->value, want_rval))
2d76680f
PC
6591 return false;
6592 return true;
6593 }
6594
6595 case TREE_LIST:
6596 {
6597 gcc_assert (TREE_PURPOSE (t) == NULL_TREE
6598 || DECL_P (TREE_PURPOSE (t)));
69eb4fde 6599 if (!RECUR (TREE_VALUE (t), want_rval))
2d76680f
PC
6600 return false;
6601 if (TREE_CHAIN (t) == NULL_TREE)
6602 return true;
69eb4fde 6603 return RECUR (TREE_CHAIN (t), want_rval);
2d76680f
PC
6604 }
6605
6606 case TRUNC_DIV_EXPR:
6607 case CEIL_DIV_EXPR:
6608 case FLOOR_DIV_EXPR:
6609 case ROUND_DIV_EXPR:
6610 case TRUNC_MOD_EXPR:
6611 case CEIL_MOD_EXPR:
6612 case ROUND_MOD_EXPR:
6613 {
6614 tree denom = TREE_OPERAND (t, 1);
69eb4fde 6615 if (!RECUR (denom, rval))
2d76680f
PC
6616 return false;
6617 /* We can't call cxx_eval_outermost_constant_expr on an expression
234bef96 6618 that hasn't been through instantiate_non_dependent_expr yet. */
2d76680f
PC
6619 if (!processing_template_decl)
6620 denom = cxx_eval_outermost_constant_expr (denom, true);
6621 if (integer_zerop (denom))
6622 {
6623 if (flags & tf_error)
64d6d399 6624 error ("division by zero is not a constant expression");
2d76680f
PC
6625 return false;
6626 }
6627 else
6628 {
6629 want_rval = true;
69eb4fde 6630 return RECUR (TREE_OPERAND (t, 0), want_rval);
2d76680f
PC
6631 }
6632 }
6633
6634 case COMPOUND_EXPR:
6635 {
6636 /* check_return_expr sometimes wraps a TARGET_EXPR in a
6637 COMPOUND_EXPR; don't get confused. Also handle EMPTY_CLASS_EXPR
6638 introduced by build_call_a. */
6639 tree op0 = TREE_OPERAND (t, 0);
6640 tree op1 = TREE_OPERAND (t, 1);
6641 STRIP_NOPS (op1);
6642 if ((TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
6643 || TREE_CODE (op1) == EMPTY_CLASS_EXPR)
69eb4fde 6644 return RECUR (op0, want_rval);
2d76680f
PC
6645 else
6646 goto binary;
6647 }
6648
6649 /* If the first operand is the non-short-circuit constant, look at
6650 the second operand; otherwise we only care about the first one for
6651 potentiality. */
6652 case TRUTH_AND_EXPR:
6653 case TRUTH_ANDIF_EXPR:
6654 tmp = boolean_true_node;
6655 goto truth;
6656 case TRUTH_OR_EXPR:
6657 case TRUTH_ORIF_EXPR:
6658 tmp = boolean_false_node;
6659 truth:
6660 {
6661 tree op = TREE_OPERAND (t, 0);
69eb4fde 6662 if (!RECUR (op, rval))
2d76680f
PC
6663 return false;
6664 if (!processing_template_decl)
6665 op = cxx_eval_outermost_constant_expr (op, true);
6666 if (tree_int_cst_equal (op, tmp))
69eb4fde 6667 return RECUR (TREE_OPERAND (t, 1), rval);
2d76680f
PC
6668 else
6669 return true;
6670 }
6671
6672 case PLUS_EXPR:
6673 case MULT_EXPR:
6674 case POINTER_PLUS_EXPR:
6675 case RDIV_EXPR:
6676 case EXACT_DIV_EXPR:
6677 case MIN_EXPR:
6678 case MAX_EXPR:
6679 case LSHIFT_EXPR:
6680 case RSHIFT_EXPR:
6681 case LROTATE_EXPR:
6682 case RROTATE_EXPR:
6683 case BIT_IOR_EXPR:
6684 case BIT_XOR_EXPR:
6685 case BIT_AND_EXPR:
6686 case TRUTH_XOR_EXPR:
6687 case UNORDERED_EXPR:
6688 case ORDERED_EXPR:
6689 case UNLT_EXPR:
6690 case UNLE_EXPR:
6691 case UNGT_EXPR:
6692 case UNGE_EXPR:
6693 case UNEQ_EXPR:
6694 case LTGT_EXPR:
6695 case RANGE_EXPR:
6696 case COMPLEX_EXPR:
6697 want_rval = true;
6698 /* Fall through. */
6699 case ARRAY_REF:
6700 case ARRAY_RANGE_REF:
6701 case MEMBER_REF:
6702 case DOTSTAR_EXPR:
41b38772 6703 case MEM_REF:
4856a1f0
PC
6704 case BINARY_LEFT_FOLD_EXPR:
6705 case BINARY_RIGHT_FOLD_EXPR:
2d76680f
PC
6706 binary:
6707 for (i = 0; i < 2; ++i)
69eb4fde 6708 if (!RECUR (TREE_OPERAND (t, i), want_rval))
2d76680f
PC
6709 return false;
6710 return true;
6711
2d76680f
PC
6712 case VEC_PERM_EXPR:
6713 for (i = 0; i < 3; ++i)
69eb4fde 6714 if (!RECUR (TREE_OPERAND (t, i), true))
2d76680f
PC
6715 return false;
6716 return true;
6717
6718 case COND_EXPR:
d5bcd6d4
JM
6719 if (COND_EXPR_IS_VEC_DELETE (t))
6720 {
6721 if (flags & tf_error)
e40b6fc7 6722 error_at (loc, "%<delete[]%> is not a constant expression");
d5bcd6d4
JM
6723 return false;
6724 }
6725 /* Fall through. */
6726 case IF_STMT:
2d76680f
PC
6727 case VEC_COND_EXPR:
6728 /* If the condition is a known constant, we know which of the legs we
6729 care about; otherwise we only require that the condition and
6730 either of the legs be potentially constant. */
6731 tmp = TREE_OPERAND (t, 0);
69eb4fde 6732 if (!RECUR (tmp, rval))
2d76680f
PC
6733 return false;
6734 if (!processing_template_decl)
6735 tmp = cxx_eval_outermost_constant_expr (tmp, true);
6736 if (integer_zerop (tmp))
69eb4fde 6737 return RECUR (TREE_OPERAND (t, 2), want_rval);
2d76680f 6738 else if (TREE_CODE (tmp) == INTEGER_CST)
69eb4fde 6739 return RECUR (TREE_OPERAND (t, 1), want_rval);
2d76680f
PC
6740 for (i = 1; i < 3; ++i)
6741 if (potential_constant_expression_1 (TREE_OPERAND (t, i),
3075affd
JM
6742 want_rval, strict, now,
6743 tf_none, jump_target))
2d76680f
PC
6744 return true;
6745 if (flags & tf_error)
e40b6fc7 6746 error_at (loc, "expression %qE is not a constant expression", t);
2d76680f
PC
6747 return false;
6748
6749 case VEC_INIT_EXPR:
6750 if (VEC_INIT_EXPR_IS_CONSTEXPR (t))
6751 return true;
6752 if (flags & tf_error)
6753 {
e40b6fc7 6754 error_at (loc, "non-constant array initialization");
2d76680f
PC
6755 diagnose_non_constexpr_vec_init (t);
6756 }
6757 return false;
6758
133bc698
JM
6759 case TYPE_DECL:
6760 case TAG_DEFN:
6761 /* We can see these in statement-expressions. */
6762 return true;
6763
baf9ebc8 6764 case CLEANUP_STMT:
cda0a029 6765 case EMPTY_CLASS_EXPR:
7fef86d3 6766 case PREDICT_EXPR:
cda0a029
JM
6767 return false;
6768
f937929e
JM
6769 case GOTO_EXPR:
6770 {
6771 tree *target = &TREE_OPERAND (t, 0);
ab3af181
JJ
6772 /* Gotos representing break and continue are OK. */
6773 if (breaks (target) || continues (target))
3075affd
JM
6774 {
6775 *jump_target = *target;
6776 return true;
6777 }
ab3af181 6778 if (flags & tf_error)
e40b6fc7 6779 error_at (loc, "%<goto%> is not a constant expression");
ab3af181 6780 return false;
f937929e
JM
6781 }
6782
98e09245 6783 case ANNOTATE_EXPR:
98e09245
JJ
6784 return RECUR (TREE_OPERAND (t, 0), rval);
6785
2d76680f
PC
6786 default:
6787 if (objc_is_property_ref (t))
6788 return false;
6789
6790 sorry ("unexpected AST of kind %s", get_tree_code_name (TREE_CODE (t)));
ab3af181 6791 gcc_unreachable ();
2d76680f
PC
6792 return false;
6793 }
69eb4fde 6794#undef RECUR
2d76680f
PC
6795}
6796
3075affd
JM
6797bool
6798potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
6799 tsubst_flags_t flags)
6800{
6801 tree target = NULL_TREE;
6802 return potential_constant_expression_1 (t, want_rval, strict, now,
6803 flags, &target);
6804}
6805
2d76680f
PC
6806/* The main entry point to the above. */
6807
6808bool
6809potential_constant_expression (tree t)
6810{
a0ab7ccd 6811 return potential_constant_expression_1 (t, false, true, false, tf_none);
2d76680f
PC
6812}
6813
6814/* As above, but require a constant rvalue. */
6815
6816bool
6817potential_rvalue_constant_expression (tree t)
6818{
a0ab7ccd 6819 return potential_constant_expression_1 (t, true, true, false, tf_none);
2d76680f
PC
6820}
6821
6822/* Like above, but complain about non-constant expressions. */
6823
6824bool
6825require_potential_constant_expression (tree t)
6826{
d8cff23f
MP
6827 return potential_constant_expression_1 (t, false, true, false,
6828 tf_warning_or_error);
2d76680f
PC
6829}
6830
6831/* Cross product of the above. */
6832
6833bool
6834require_potential_rvalue_constant_expression (tree t)
6835{
d8cff23f
MP
6836 return potential_constant_expression_1 (t, true, true, false,
6837 tf_warning_or_error);
6838}
6839
6840/* Like above, but don't consider PARM_DECL a potential_constant_expression. */
6841
6842bool
6843require_rvalue_constant_expression (tree t)
6844{
6845 return potential_constant_expression_1 (t, true, true, true,
6846 tf_warning_or_error);
a0ab7ccd
JM
6847}
6848
6849/* Like potential_constant_expression, but don't consider possible constexpr
6850 substitution of the current function. That is, PARM_DECL qualifies under
6851 potential_constant_expression, but not here.
6852
6853 This is basically what you can check when any actual constant values might
6854 be value-dependent. */
6855
6856bool
6857is_constant_expression (tree t)
6858{
6859 return potential_constant_expression_1 (t, false, true, true, tf_none);
6860}
6861
6862/* Like above, but complain about non-constant expressions. */
6863
6864bool
6865require_constant_expression (tree t)
6866{
6867 return potential_constant_expression_1 (t, false, true, true,
6868 tf_warning_or_error);
6869}
6870
6871/* Like is_constant_expression, but allow const variables that are not allowed
6872 under constexpr rules. */
6873
6874bool
6875is_static_init_expression (tree t)
6876{
6877 return potential_constant_expression_1 (t, false, false, true, tf_none);
2d76680f
PC
6878}
6879
eb07f187
JM
6880/* Returns true if T is a potential constant expression that is not
6881 instantiation-dependent, and therefore a candidate for constant folding even
6882 in a template. */
6883
6884bool
a0ab7ccd 6885is_nondependent_constant_expression (tree t)
eb07f187
JM
6886{
6887 return (!type_unknown_p (t)
6888 && !BRACE_ENCLOSED_INITIALIZER_P (t)
a0ab7ccd 6889 && is_constant_expression (t)
eb07f187
JM
6890 && !instantiation_dependent_expression_p (t));
6891}
6892
6893/* Returns true if T is a potential static initializer expression that is not
6894 instantiation-dependent. */
6895
6896bool
a0ab7ccd 6897is_nondependent_static_init_expression (tree t)
eb07f187
JM
6898{
6899 return (!type_unknown_p (t)
6900 && !BRACE_ENCLOSED_INITIALIZER_P (t)
a0ab7ccd 6901 && is_static_init_expression (t)
eb07f187
JM
6902 && !instantiation_dependent_expression_p (t));
6903}
6904
97f3003f
JM
6905/* Finalize constexpr processing after parsing. */
6906
6907void
6908fini_constexpr (void)
6909{
6910 /* The contexpr call and fundef copies tables are no longer needed. */
6911 constexpr_call_table = NULL;
6912 fundef_copies_table = NULL;
6913}
6914
2d76680f 6915#include "gt-cp-constexpr.h"
This page took 2.795642 seconds and 5 git commands to generate.