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