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