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