]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/constexpr.c
[Patch 1/4] Simplify the representation of CCMP patterns by using
[thirdparty/gcc.git] / gcc / cp / constexpr.c
CommitLineData
f9885b8a 1/* Perform -*- C++ -*- constant expression evaluation, including calls to
2 constexpr functions. These routines are used both during actual parsing
09b42213 3 and during the instantiation of template functions.
4
f1717362 5 Copyright (C) 1998-2016 Free Software Foundation, Inc.
09b42213 6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GCC is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
22
23#include "config.h"
24#include "system.h"
25#include "coretypes.h"
09b42213 26#include "cp-tree.h"
4cba6f60 27#include "varasm.h"
09b42213 28#include "c-family/c-objc.h"
29#include "tree-iterator.h"
30#include "gimplify.h"
31#include "builtins.h"
9c96033c 32#include "tree-inline.h"
6b71bdb4 33#include "ubsan.h"
09b42213 34
35static bool verify_constant (tree, bool, bool *, bool *);
36#define VERIFY_CONSTANT(X) \
37do { \
f83e6885 38 if (verify_constant ((X), ctx->quiet, non_constant_p, overflow_p)) \
09b42213 39 return t; \
40 } while (0)
41
42/* Returns true iff FUN is an instantiation of a constexpr function
43 template or a defaulted constexpr function. */
44
45bool
46is_instantiation_of_constexpr (tree fun)
47{
48 return ((DECL_TEMPLOID_INSTANTIATION (fun)
49 && DECL_DECLARED_CONSTEXPR_P (DECL_TI_TEMPLATE (fun)))
50 || (DECL_DEFAULTED_FN (fun)
51 && DECL_DECLARED_CONSTEXPR_P (fun)));
52}
53
54/* Return true if T is a literal type. */
55
56bool
57literal_type_p (tree t)
58{
59 if (SCALAR_TYPE_P (t)
76249021 60 || VECTOR_TYPE_P (t)
dd418b39 61 || TREE_CODE (t) == REFERENCE_TYPE
62 || (VOID_TYPE_P (t) && cxx_dialect >= cxx14))
09b42213 63 return true;
64 if (CLASS_TYPE_P (t))
65 {
66 t = complete_type (t);
67 gcc_assert (COMPLETE_TYPE_P (t) || errorcount);
68 return CLASSTYPE_LITERAL_P (t);
69 }
70 if (TREE_CODE (t) == ARRAY_TYPE)
71 return literal_type_p (strip_array_types (t));
72 return false;
73}
74
75/* If DECL is a variable declared `constexpr', require its type
76 be literal. Return the DECL if OK, otherwise NULL. */
77
78tree
79ensure_literal_type_for_constexpr_object (tree decl)
80{
81 tree type = TREE_TYPE (decl);
82 if (VAR_P (decl)
83 && (DECL_DECLARED_CONSTEXPR_P (decl)
84 || var_in_constexpr_fn (decl))
85 && !processing_template_decl)
86 {
87 tree stype = strip_array_types (type);
88 if (CLASS_TYPE_P (stype) && !COMPLETE_TYPE_P (complete_type (stype)))
89 /* Don't complain here, we'll complain about incompleteness
90 when we try to initialize the variable. */;
91 else if (!literal_type_p (type))
92 {
93 if (DECL_DECLARED_CONSTEXPR_P (decl))
e45408ff 94 {
95 error ("the type %qT of constexpr variable %qD is not literal",
96 type, decl);
97 explain_non_literal_class (type);
98 }
09b42213 99 else
9c96033c 100 {
e45408ff 101 if (!DECL_TEMPLATE_INSTANTIATION (current_function_decl))
102 {
103 error ("variable %qD of non-literal type %qT in %<constexpr%> "
104 "function", decl, type);
105 explain_non_literal_class (type);
106 }
9c96033c 107 cp_function_chain->invalid_constexpr = true;
108 }
09b42213 109 return NULL;
110 }
111 }
112 return decl;
113}
114
115/* Representation of entries in the constexpr function definition table. */
116
117struct GTY((for_user)) constexpr_fundef {
118 tree decl;
119 tree body;
120};
121
b594087e 122struct constexpr_fundef_hasher : ggc_ptr_hash<constexpr_fundef>
09b42213 123{
124 static hashval_t hash (constexpr_fundef *);
125 static bool equal (constexpr_fundef *, constexpr_fundef *);
126};
127
128/* This table holds all constexpr function definitions seen in
129 the current translation unit. */
130
131static GTY (()) hash_table<constexpr_fundef_hasher> *constexpr_fundef_table;
132
133/* Utility function used for managing the constexpr function table.
134 Return true if the entries pointed to by P and Q are for the
135 same constexpr function. */
136
137inline bool
138constexpr_fundef_hasher::equal (constexpr_fundef *lhs, constexpr_fundef *rhs)
139{
140 return lhs->decl == rhs->decl;
141}
142
143/* Utility function used for managing the constexpr function table.
144 Return a hash value for the entry pointed to by Q. */
145
146inline hashval_t
147constexpr_fundef_hasher::hash (constexpr_fundef *fundef)
148{
149 return DECL_UID (fundef->decl);
150}
151
152/* Return a previously saved definition of function FUN. */
153
154static constexpr_fundef *
155retrieve_constexpr_fundef (tree fun)
156{
157 constexpr_fundef fundef = { NULL, NULL };
158 if (constexpr_fundef_table == NULL)
159 return NULL;
160
161 fundef.decl = fun;
162 return constexpr_fundef_table->find (&fundef);
163}
164
165/* Check whether the parameter and return types of FUN are valid for a
166 constexpr function, and complain if COMPLAIN. */
167
168static bool
169is_valid_constexpr_fn (tree fun, bool complain)
170{
171 bool ret = true;
172
173 if (DECL_INHERITED_CTOR_BASE (fun)
174 && TREE_CODE (fun) == TEMPLATE_DECL)
175 {
176 ret = false;
177 if (complain)
178 error ("inherited constructor %qD is not constexpr",
179 get_inherited_ctor (fun));
180 }
181 else
182 {
183 for (tree parm = FUNCTION_FIRST_USER_PARM (fun);
184 parm != NULL_TREE; parm = TREE_CHAIN (parm))
185 if (!literal_type_p (TREE_TYPE (parm)))
186 {
187 ret = false;
188 if (complain)
189 {
190 error ("invalid type for parameter %d of constexpr "
191 "function %q+#D", DECL_PARM_INDEX (parm), fun);
192 explain_non_literal_class (TREE_TYPE (parm));
193 }
194 }
195 }
196
197 if (!DECL_CONSTRUCTOR_P (fun))
198 {
199 tree rettype = TREE_TYPE (TREE_TYPE (fun));
200 if (!literal_type_p (rettype))
201 {
202 ret = false;
203 if (complain)
204 {
205 error ("invalid return type %qT of constexpr function %q+D",
206 rettype, fun);
207 explain_non_literal_class (rettype);
208 }
209 }
210
211 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
212 && !CLASSTYPE_LITERAL_P (DECL_CONTEXT (fun)))
213 {
214 ret = false;
215 if (complain)
216 {
217 error ("enclosing class of constexpr non-static member "
218 "function %q+#D is not a literal type", fun);
219 explain_non_literal_class (DECL_CONTEXT (fun));
220 }
221 }
222 }
223 else if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fun)))
224 {
225 ret = false;
226 if (complain)
227 error ("%q#T has virtual base classes", DECL_CONTEXT (fun));
228 }
229
230 return ret;
231}
232
233/* Subroutine of build_data_member_initialization. MEMBER is a COMPONENT_REF
234 for a member of an anonymous aggregate, INIT is the initializer for that
235 member, and VEC_OUTER is the vector of constructor elements for the class
236 whose constructor we are processing. Add the initializer to the vector
237 and return true to indicate success. */
238
239static bool
240build_anon_member_initialization (tree member, tree init,
241 vec<constructor_elt, va_gc> **vec_outer)
242{
243 /* MEMBER presents the relevant fields from the inside out, but we need
244 to build up the initializer from the outside in so that we can reuse
245 previously built CONSTRUCTORs if this is, say, the second field in an
246 anonymous struct. So we use a vec as a stack. */
247 auto_vec<tree, 2> fields;
248 do
249 {
250 fields.safe_push (TREE_OPERAND (member, 1));
251 member = TREE_OPERAND (member, 0);
252 }
253 while (ANON_AGGR_TYPE_P (TREE_TYPE (member))
254 && TREE_CODE (member) == COMPONENT_REF);
255
256 /* VEC has the constructor elements vector for the context of FIELD.
257 If FIELD is an anonymous aggregate, we will push inside it. */
258 vec<constructor_elt, va_gc> **vec = vec_outer;
259 tree field;
260 while (field = fields.pop(),
261 ANON_AGGR_TYPE_P (TREE_TYPE (field)))
262 {
263 tree ctor;
264 /* If there is already an outer constructor entry for the anonymous
265 aggregate FIELD, use it; otherwise, insert one. */
266 if (vec_safe_is_empty (*vec)
267 || (*vec)->last().index != field)
268 {
269 ctor = build_constructor (TREE_TYPE (field), NULL);
270 CONSTRUCTOR_APPEND_ELT (*vec, field, ctor);
271 }
272 else
273 ctor = (*vec)->last().value;
274 vec = &CONSTRUCTOR_ELTS (ctor);
275 }
276
277 /* Now we're at the innermost field, the one that isn't an anonymous
278 aggregate. Add its initializer to the CONSTRUCTOR and we're done. */
279 gcc_assert (fields.is_empty());
280 CONSTRUCTOR_APPEND_ELT (*vec, field, init);
281
282 return true;
283}
284
285/* Subroutine of build_constexpr_constructor_member_initializers.
286 The expression tree T represents a data member initialization
287 in a (constexpr) constructor definition. Build a pairing of
288 the data member with its initializer, and prepend that pair
289 to the existing initialization pair INITS. */
290
291static bool
292build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec)
293{
294 tree member, init;
295 if (TREE_CODE (t) == CLEANUP_POINT_EXPR)
296 t = TREE_OPERAND (t, 0);
297 if (TREE_CODE (t) == EXPR_STMT)
298 t = TREE_OPERAND (t, 0);
299 if (t == error_mark_node)
300 return false;
301 if (TREE_CODE (t) == STATEMENT_LIST)
302 {
303 tree_stmt_iterator i;
304 for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
305 {
306 if (! build_data_member_initialization (tsi_stmt (i), vec))
307 return false;
308 }
309 return true;
310 }
311 if (TREE_CODE (t) == CLEANUP_STMT)
312 {
313 /* We can't see a CLEANUP_STMT in a constructor for a literal class,
314 but we can in a constexpr constructor for a non-literal class. Just
315 ignore it; either all the initialization will be constant, in which
316 case the cleanup can't run, or it can't be constexpr.
317 Still recurse into CLEANUP_BODY. */
318 return build_data_member_initialization (CLEANUP_BODY (t), vec);
319 }
320 if (TREE_CODE (t) == CONVERT_EXPR)
321 t = TREE_OPERAND (t, 0);
322 if (TREE_CODE (t) == INIT_EXPR
9c96033c 323 /* vptr initialization shows up as a MODIFY_EXPR. In C++14 we only
324 use what this function builds for cx_check_missing_mem_inits, and
325 assignment in the ctor body doesn't count. */
326 || (cxx_dialect < cxx14 && TREE_CODE (t) == MODIFY_EXPR))
09b42213 327 {
328 member = TREE_OPERAND (t, 0);
329 init = break_out_target_exprs (TREE_OPERAND (t, 1));
330 }
331 else if (TREE_CODE (t) == CALL_EXPR)
332 {
9c96033c 333 tree fn = get_callee_fndecl (t);
334 if (!fn || !DECL_CONSTRUCTOR_P (fn))
335 /* We're only interested in calls to subobject constructors. */
336 return true;
09b42213 337 member = CALL_EXPR_ARG (t, 0);
338 /* We don't use build_cplus_new here because it complains about
339 abstract bases. Leaving the call unwrapped means that it has the
340 wrong type, but cxx_eval_constant_expression doesn't care. */
341 init = break_out_target_exprs (t);
342 }
343 else if (TREE_CODE (t) == BIND_EXPR)
344 return build_data_member_initialization (BIND_EXPR_BODY (t), vec);
09b42213 345 else
9c96033c 346 /* Don't add anything else to the CONSTRUCTOR. */
347 return true;
09b42213 348 if (INDIRECT_REF_P (member))
349 member = TREE_OPERAND (member, 0);
350 if (TREE_CODE (member) == NOP_EXPR)
351 {
352 tree op = member;
353 STRIP_NOPS (op);
354 if (TREE_CODE (op) == ADDR_EXPR)
355 {
356 gcc_assert (same_type_ignoring_top_level_qualifiers_p
357 (TREE_TYPE (TREE_TYPE (op)),
358 TREE_TYPE (TREE_TYPE (member))));
359 /* Initializing a cv-qualified member; we need to look through
360 the const_cast. */
361 member = op;
362 }
363 else if (op == current_class_ptr
364 && (same_type_ignoring_top_level_qualifiers_p
365 (TREE_TYPE (TREE_TYPE (member)),
366 current_class_type)))
367 /* Delegating constructor. */
368 member = op;
369 else
370 {
371 /* This is an initializer for an empty base; keep it for now so
372 we can check it in cxx_eval_bare_aggregate. */
373 gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (member))));
374 }
375 }
376 if (TREE_CODE (member) == ADDR_EXPR)
377 member = TREE_OPERAND (member, 0);
378 if (TREE_CODE (member) == COMPONENT_REF)
379 {
380 tree aggr = TREE_OPERAND (member, 0);
381 if (TREE_CODE (aggr) != COMPONENT_REF)
382 /* Normal member initialization. */
383 member = TREE_OPERAND (member, 1);
384 else if (ANON_AGGR_TYPE_P (TREE_TYPE (aggr)))
385 /* Initializing a member of an anonymous union. */
386 return build_anon_member_initialization (member, init, vec);
387 else
388 /* We're initializing a vtable pointer in a base. Leave it as
389 COMPONENT_REF so we remember the path to get to the vfield. */
390 gcc_assert (TREE_TYPE (member) == vtbl_ptr_type_node);
391 }
392
393 CONSTRUCTOR_APPEND_ELT (*vec, member, init);
394 return true;
395}
396
397/* Subroutine of check_constexpr_ctor_body_1 and constexpr_fn_retval.
398 In C++11 mode checks that the TYPE_DECLs in the BIND_EXPR_VARS of a
399 BIND_EXPR conform to 7.1.5/3/4 on typedef and alias declarations. */
400
401static bool
402check_constexpr_bind_expr_vars (tree t)
403{
404 gcc_assert (TREE_CODE (t) == BIND_EXPR);
405
09b42213 406 for (tree var = BIND_EXPR_VARS (t); var; var = DECL_CHAIN (var))
407 if (TREE_CODE (var) == TYPE_DECL
04103c39 408 && DECL_IMPLICIT_TYPEDEF_P (var)
409 && !LAMBDA_TYPE_P (TREE_TYPE (var)))
09b42213 410 return false;
411 return true;
412}
413
414/* Subroutine of check_constexpr_ctor_body. */
415
416static bool
417check_constexpr_ctor_body_1 (tree last, tree list)
418{
419 switch (TREE_CODE (list))
420 {
421 case DECL_EXPR:
422 if (TREE_CODE (DECL_EXPR_DECL (list)) == USING_DECL)
423 return true;
09b42213 424 return false;
425
426 case CLEANUP_POINT_EXPR:
427 return check_constexpr_ctor_body (last, TREE_OPERAND (list, 0),
428 /*complain=*/false);
429
430 case BIND_EXPR:
431 if (!check_constexpr_bind_expr_vars (list)
432 || !check_constexpr_ctor_body (last, BIND_EXPR_BODY (list),
433 /*complain=*/false))
434 return false;
435 return true;
436
437 case USING_STMT:
438 case STATIC_ASSERT:
439 return true;
440
441 default:
442 return false;
443 }
444}
445
446/* Make sure that there are no statements after LAST in the constructor
447 body represented by LIST. */
448
449bool
450check_constexpr_ctor_body (tree last, tree list, bool complain)
451{
9c96033c 452 /* C++14 doesn't require a constexpr ctor to have an empty body. */
453 if (cxx_dialect >= cxx14)
454 return true;
455
09b42213 456 bool ok = true;
457 if (TREE_CODE (list) == STATEMENT_LIST)
458 {
459 tree_stmt_iterator i = tsi_last (list);
460 for (; !tsi_end_p (i); tsi_prev (&i))
461 {
462 tree t = tsi_stmt (i);
463 if (t == last)
464 break;
465 if (!check_constexpr_ctor_body_1 (last, t))
466 {
467 ok = false;
468 break;
469 }
470 }
471 }
472 else if (list != last
473 && !check_constexpr_ctor_body_1 (last, list))
474 ok = false;
475 if (!ok)
476 {
477 if (complain)
478 error ("constexpr constructor does not have empty body");
479 DECL_DECLARED_CONSTEXPR_P (current_function_decl) = false;
480 }
481 return ok;
482}
483
484/* V is a vector of constructor elements built up for the base and member
485 initializers of a constructor for TYPE. They need to be in increasing
486 offset order, which they might not be yet if TYPE has a primary base
487 which is not first in the base-clause or a vptr and at least one base
488 all of which are non-primary. */
489
490static vec<constructor_elt, va_gc> *
491sort_constexpr_mem_initializers (tree type, vec<constructor_elt, va_gc> *v)
492{
493 tree pri = CLASSTYPE_PRIMARY_BINFO (type);
494 tree field_type;
495 unsigned i;
496 constructor_elt *ce;
497
498 if (pri)
499 field_type = BINFO_TYPE (pri);
500 else if (TYPE_CONTAINS_VPTR_P (type))
501 field_type = vtbl_ptr_type_node;
502 else
503 return v;
504
505 /* Find the element for the primary base or vptr and move it to the
506 beginning of the vec. */
507 for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
508 if (TREE_TYPE (ce->index) == field_type)
509 break;
510
511 if (i > 0 && i < vec_safe_length (v))
512 {
513 vec<constructor_elt, va_gc> &vref = *v;
514 constructor_elt elt = vref[i];
515 for (; i > 0; --i)
516 vref[i] = vref[i-1];
517 vref[0] = elt;
518 }
519
520 return v;
521}
522
523/* Build compile-time evalable representations of member-initializer list
524 for a constexpr constructor. */
525
526static tree
527build_constexpr_constructor_member_initializers (tree type, tree body)
528{
529 vec<constructor_elt, va_gc> *vec = NULL;
530 bool ok = true;
531 if (TREE_CODE (body) == MUST_NOT_THROW_EXPR
532 || TREE_CODE (body) == EH_SPEC_BLOCK)
533 body = TREE_OPERAND (body, 0);
534 if (TREE_CODE (body) == STATEMENT_LIST)
8a36d0ec 535 {
dc70c770 536 for (tree_stmt_iterator i = tsi_start (body);
537 !tsi_end_p (i); tsi_next (&i))
8a36d0ec 538 {
539 body = tsi_stmt (i);
540 if (TREE_CODE (body) == BIND_EXPR)
541 break;
8a36d0ec 542 }
543 }
dc70c770 544 if (TREE_CODE (body) == BIND_EXPR)
545 body = BIND_EXPR_BODY (body);
09b42213 546 if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
547 {
548 body = TREE_OPERAND (body, 0);
549 if (TREE_CODE (body) == EXPR_STMT)
550 body = TREE_OPERAND (body, 0);
551 if (TREE_CODE (body) == INIT_EXPR
552 && (same_type_ignoring_top_level_qualifiers_p
553 (TREE_TYPE (TREE_OPERAND (body, 0)),
554 current_class_type)))
555 {
556 /* Trivial copy. */
557 return TREE_OPERAND (body, 1);
558 }
559 ok = build_data_member_initialization (body, &vec);
560 }
561 else if (TREE_CODE (body) == STATEMENT_LIST)
562 {
563 tree_stmt_iterator i;
564 for (i = tsi_start (body); !tsi_end_p (i); tsi_next (&i))
565 {
566 ok = build_data_member_initialization (tsi_stmt (i), &vec);
567 if (!ok)
568 break;
569 }
570 }
571 else if (TREE_CODE (body) == TRY_BLOCK)
572 {
573 error ("body of %<constexpr%> constructor cannot be "
574 "a function-try-block");
575 return error_mark_node;
576 }
577 else if (EXPR_P (body))
578 ok = build_data_member_initialization (body, &vec);
579 else
580 gcc_assert (errorcount > 0);
581 if (ok)
582 {
583 if (vec_safe_length (vec) > 0)
584 {
585 /* In a delegating constructor, return the target. */
586 constructor_elt *ce = &(*vec)[0];
587 if (ce->index == current_class_ptr)
588 {
589 body = ce->value;
590 vec_free (vec);
591 return body;
592 }
593 }
594 vec = sort_constexpr_mem_initializers (type, vec);
595 return build_constructor (type, vec);
596 }
597 else
598 return error_mark_node;
599}
600
601/* Subroutine of register_constexpr_fundef. BODY is the body of a function
602 declared to be constexpr, or a sub-statement thereof. Returns the
603 return value if suitable, error_mark_node for a statement not allowed in
604 a constexpr function, or NULL_TREE if no return value was found. */
605
606static tree
607constexpr_fn_retval (tree body)
608{
609 switch (TREE_CODE (body))
610 {
611 case STATEMENT_LIST:
612 {
613 tree_stmt_iterator i;
614 tree expr = NULL_TREE;
615 for (i = tsi_start (body); !tsi_end_p (i); tsi_next (&i))
616 {
617 tree s = constexpr_fn_retval (tsi_stmt (i));
618 if (s == error_mark_node)
619 return error_mark_node;
620 else if (s == NULL_TREE)
621 /* Keep iterating. */;
622 else if (expr)
623 /* Multiple return statements. */
624 return error_mark_node;
625 else
626 expr = s;
627 }
628 return expr;
629 }
630
631 case RETURN_EXPR:
632 return break_out_target_exprs (TREE_OPERAND (body, 0));
633
634 case DECL_EXPR:
394aed6a 635 {
636 tree decl = DECL_EXPR_DECL (body);
637 if (TREE_CODE (decl) == USING_DECL
638 /* Accept __func__, __FUNCTION__, and __PRETTY_FUNCTION__. */
639 || DECL_ARTIFICIAL (decl))
640 return NULL_TREE;
641 return error_mark_node;
642 }
09b42213 643
644 case CLEANUP_POINT_EXPR:
645 return constexpr_fn_retval (TREE_OPERAND (body, 0));
646
647 case BIND_EXPR:
648 if (!check_constexpr_bind_expr_vars (body))
649 return error_mark_node;
650 return constexpr_fn_retval (BIND_EXPR_BODY (body));
651
652 case USING_STMT:
653 return NULL_TREE;
654
655 default:
656 return error_mark_node;
657 }
658}
659
660/* Subroutine of register_constexpr_fundef. BODY is the DECL_SAVED_TREE of
661 FUN; do the necessary transformations to turn it into a single expression
662 that we can store in the hash table. */
663
664static tree
665massage_constexpr_body (tree fun, tree body)
666{
667 if (DECL_CONSTRUCTOR_P (fun))
668 body = build_constexpr_constructor_member_initializers
669 (DECL_CONTEXT (fun), body);
9c96033c 670 else if (cxx_dialect < cxx14)
09b42213 671 {
672 if (TREE_CODE (body) == EH_SPEC_BLOCK)
673 body = EH_SPEC_STMTS (body);
674 if (TREE_CODE (body) == MUST_NOT_THROW_EXPR)
675 body = TREE_OPERAND (body, 0);
676 body = constexpr_fn_retval (body);
677 }
678 return body;
679}
680
681/* FUN is a constexpr constructor with massaged body BODY. Return true
682 if some bases/fields are uninitialized, and complain if COMPLAIN. */
683
684static bool
685cx_check_missing_mem_inits (tree fun, tree body, bool complain)
686{
687 bool bad;
688 tree field;
689 unsigned i, nelts;
690 tree ctype;
691
692 if (TREE_CODE (body) != CONSTRUCTOR)
693 return false;
694
695 nelts = CONSTRUCTOR_NELTS (body);
696 ctype = DECL_CONTEXT (fun);
697 field = TYPE_FIELDS (ctype);
698
699 if (TREE_CODE (ctype) == UNION_TYPE)
700 {
701 if (nelts == 0 && next_initializable_field (field))
702 {
703 if (complain)
704 error ("%<constexpr%> constructor for union %qT must "
705 "initialize exactly one non-static data member", ctype);
706 return true;
707 }
708 return false;
709 }
710
711 bad = false;
712 for (i = 0; i <= nelts; ++i)
713 {
714 tree index;
715 if (i == nelts)
716 index = NULL_TREE;
717 else
718 {
719 index = CONSTRUCTOR_ELT (body, i)->index;
720 /* Skip base and vtable inits. */
721 if (TREE_CODE (index) != FIELD_DECL
722 || DECL_ARTIFICIAL (index))
723 continue;
724 }
725 for (; field != index; field = DECL_CHAIN (field))
726 {
727 tree ftype;
728 if (TREE_CODE (field) != FIELD_DECL
729 || (DECL_C_BIT_FIELD (field) && !DECL_NAME (field))
730 || DECL_ARTIFICIAL (field))
731 continue;
732 ftype = strip_array_types (TREE_TYPE (field));
733 if (type_has_constexpr_default_constructor (ftype))
734 {
735 /* It's OK to skip a member with a trivial constexpr ctor.
736 A constexpr ctor that isn't trivial should have been
737 added in by now. */
738 gcc_checking_assert (!TYPE_HAS_COMPLEX_DFLT (ftype)
739 || errorcount != 0);
740 continue;
741 }
742 if (!complain)
743 return true;
859e2c29 744 error ("member %qD must be initialized by mem-initializer "
745 "in %<constexpr%> constructor", field);
746 inform (DECL_SOURCE_LOCATION (field), "declared here");
09b42213 747 bad = true;
748 }
749 if (field == NULL_TREE)
750 break;
751 field = DECL_CHAIN (field);
752 }
753
754 return bad;
755}
756
757/* We are processing the definition of the constexpr function FUN.
758 Check that its BODY fulfills the propriate requirements and
759 enter it in the constexpr function definition table.
760 For constructor BODY is actually the TREE_LIST of the
761 member-initializer list. */
762
763tree
764register_constexpr_fundef (tree fun, tree body)
765{
766 constexpr_fundef entry;
767 constexpr_fundef **slot;
768
769 if (!is_valid_constexpr_fn (fun, !DECL_GENERATED_P (fun)))
770 return NULL;
771
772 body = massage_constexpr_body (fun, body);
773 if (body == NULL_TREE || body == error_mark_node)
774 {
775 if (!DECL_CONSTRUCTOR_P (fun))
776 error ("body of constexpr function %qD not a return-statement", fun);
777 return NULL;
778 }
779
780 if (!potential_rvalue_constant_expression (body))
781 {
782 if (!DECL_GENERATED_P (fun))
783 require_potential_rvalue_constant_expression (body);
784 return NULL;
785 }
786
787 if (DECL_CONSTRUCTOR_P (fun)
788 && cx_check_missing_mem_inits (fun, body, !DECL_GENERATED_P (fun)))
789 return NULL;
790
791 /* Create the constexpr function table if necessary. */
792 if (constexpr_fundef_table == NULL)
793 constexpr_fundef_table
794 = hash_table<constexpr_fundef_hasher>::create_ggc (101);
795
796 entry.decl = fun;
797 entry.body = body;
798 slot = constexpr_fundef_table->find_slot (&entry, INSERT);
799
800 gcc_assert (*slot == NULL);
801 *slot = ggc_alloc<constexpr_fundef> ();
802 **slot = entry;
803
804 return fun;
805}
806
807/* FUN is a non-constexpr function called in a context that requires a
808 constant expression. If it comes from a constexpr template, explain why
809 the instantiation isn't constexpr. */
810
811void
812explain_invalid_constexpr_fn (tree fun)
813{
814 static hash_set<tree> *diagnosed;
815 tree body;
816 location_t save_loc;
817 /* Only diagnose defaulted functions or instantiations. */
818 if (!DECL_DEFAULTED_FN (fun)
819 && !is_instantiation_of_constexpr (fun))
820 return;
821 if (diagnosed == NULL)
822 diagnosed = new hash_set<tree>;
823 if (diagnosed->add (fun))
824 /* Already explained. */
825 return;
826
827 save_loc = input_location;
828 input_location = DECL_SOURCE_LOCATION (fun);
66ed189d 829 inform (input_location,
830 "%qD is not usable as a constexpr function because:", fun);
09b42213 831 /* First check the declaration. */
832 if (is_valid_constexpr_fn (fun, true))
833 {
834 /* Then if it's OK, the body. */
835 if (!DECL_DECLARED_CONSTEXPR_P (fun))
836 explain_implicit_non_constexpr (fun);
837 else
838 {
839 body = massage_constexpr_body (fun, DECL_SAVED_TREE (fun));
840 require_potential_rvalue_constant_expression (body);
841 if (DECL_CONSTRUCTOR_P (fun))
842 cx_check_missing_mem_inits (fun, body, true);
843 }
844 }
845 input_location = save_loc;
846}
847
848/* Objects of this type represent calls to constexpr functions
849 along with the bindings of parameters to their arguments, for
850 the purpose of compile time evaluation. */
851
852struct GTY((for_user)) constexpr_call {
853 /* Description of the constexpr function definition. */
854 constexpr_fundef *fundef;
855 /* Parameter bindings environment. A TREE_LIST where each TREE_PURPOSE
856 is a parameter _DECL and the TREE_VALUE is the value of the parameter.
857 Note: This arrangement is made to accommodate the use of
858 iterative_hash_template_arg (see pt.c). If you change this
859 representation, also change the hash calculation in
860 cxx_eval_call_expression. */
861 tree bindings;
862 /* Result of the call.
863 NULL means the call is being evaluated.
864 error_mark_node means that the evaluation was erroneous;
865 otherwise, the actuall value of the call. */
866 tree result;
867 /* The hash of this call; we remember it here to avoid having to
868 recalculate it when expanding the hash table. */
869 hashval_t hash;
870};
871
b594087e 872struct constexpr_call_hasher : ggc_ptr_hash<constexpr_call>
09b42213 873{
874 static hashval_t hash (constexpr_call *);
875 static bool equal (constexpr_call *, constexpr_call *);
cf72f34d 876};
877
878/* The constexpr expansion context. CALL is the current function
879 expansion, CTOR is the current aggregate initializer, OBJECT is the
880 object being initialized by CTOR, either a VAR_DECL or a _REF. VALUES
881 is a map of values of variables initialized within the expression. */
882
883struct constexpr_ctx {
f9885b8a 884 /* The innermost call we're evaluating. */
cf72f34d 885 constexpr_call *call;
f9885b8a 886 /* Values for any temporaries or local variables within the
887 constant-expression. */
cf72f34d 888 hash_map<tree,tree> *values;
f9885b8a 889 /* The CONSTRUCTOR we're currently building up for an aggregate
890 initializer. */
cf72f34d 891 tree ctor;
f9885b8a 892 /* The object we're building the CONSTRUCTOR for. */
cf72f34d 893 tree object;
f9885b8a 894 /* Whether we should error on a non-constant expression or fail quietly. */
f83e6885 895 bool quiet;
f9885b8a 896 /* Whether we are strictly conforming to constant expression rules or
897 trying harder to get a constant value. */
2055d27a 898 bool strict;
cf72f34d 899};
09b42213 900
901/* A table of all constexpr calls that have been evaluated by the
902 compiler in this translation unit. */
903
904static GTY (()) hash_table<constexpr_call_hasher> *constexpr_call_table;
905
cf72f34d 906static tree cxx_eval_constant_expression (const constexpr_ctx *, tree,
b2a43197 907 bool, bool *, bool *, tree * = NULL);
09b42213 908
909/* Compute a hash value for a constexpr call representation. */
910
911inline hashval_t
912constexpr_call_hasher::hash (constexpr_call *info)
913{
914 return info->hash;
915}
916
917/* Return true if the objects pointed to by P and Q represent calls
918 to the same constexpr function with the same arguments.
919 Otherwise, return false. */
920
921bool
922constexpr_call_hasher::equal (constexpr_call *lhs, constexpr_call *rhs)
923{
924 tree lhs_bindings;
925 tree rhs_bindings;
926 if (lhs == rhs)
927 return 1;
928 if (!constexpr_fundef_hasher::equal (lhs->fundef, rhs->fundef))
929 return 0;
930 lhs_bindings = lhs->bindings;
931 rhs_bindings = rhs->bindings;
932 while (lhs_bindings != NULL && rhs_bindings != NULL)
933 {
934 tree lhs_arg = TREE_VALUE (lhs_bindings);
935 tree rhs_arg = TREE_VALUE (rhs_bindings);
936 gcc_assert (TREE_TYPE (lhs_arg) == TREE_TYPE (rhs_arg));
937 if (!cp_tree_equal (lhs_arg, rhs_arg))
938 return 0;
939 lhs_bindings = TREE_CHAIN (lhs_bindings);
940 rhs_bindings = TREE_CHAIN (rhs_bindings);
941 }
942 return lhs_bindings == rhs_bindings;
943}
944
945/* Initialize the constexpr call table, if needed. */
946
947static void
948maybe_initialize_constexpr_call_table (void)
949{
950 if (constexpr_call_table == NULL)
951 constexpr_call_table = hash_table<constexpr_call_hasher>::create_ggc (101);
952}
953
954/* We have an expression tree T that represents a call, either CALL_EXPR
955 or AGGR_INIT_EXPR. If the call is lexically to a named function,
956 retrun the _DECL for that function. */
957
958static tree
959get_function_named_in_call (tree t)
960{
961 tree fun = NULL;
962 switch (TREE_CODE (t))
963 {
964 case CALL_EXPR:
965 fun = CALL_EXPR_FN (t);
966 break;
967
968 case AGGR_INIT_EXPR:
969 fun = AGGR_INIT_EXPR_FN (t);
970 break;
971
972 default:
973 gcc_unreachable();
974 break;
975 }
9c96033c 976 if (fun && TREE_CODE (fun) == ADDR_EXPR
09b42213 977 && TREE_CODE (TREE_OPERAND (fun, 0)) == FUNCTION_DECL)
978 fun = TREE_OPERAND (fun, 0);
979 return fun;
980}
981
982/* We have an expression tree T that represents a call, either CALL_EXPR
983 or AGGR_INIT_EXPR. Return the Nth argument. */
984
985static inline tree
986get_nth_callarg (tree t, int n)
987{
988 switch (TREE_CODE (t))
989 {
990 case CALL_EXPR:
991 return CALL_EXPR_ARG (t, n);
992
993 case AGGR_INIT_EXPR:
994 return AGGR_INIT_EXPR_ARG (t, n);
995
996 default:
997 gcc_unreachable ();
998 return NULL;
999 }
1000}
1001
09b42213 1002/* Attempt to evaluate T which represents a call to a builtin function.
1003 We assume here that all builtin functions evaluate to scalar types
1004 represented by _CST nodes. */
1005
1006static tree
f1c6af10 1007cxx_eval_builtin_function_call (const constexpr_ctx *ctx, tree t, tree fun,
1227ba74 1008 bool lval,
09b42213 1009 bool *non_constant_p, bool *overflow_p)
1010{
1011 const int nargs = call_expr_nargs (t);
1012 tree *args = (tree *) alloca (nargs * sizeof (tree));
1013 tree new_call;
1014 int i;
f1c6af10 1015
1016 /* Don't fold __builtin_constant_p within a constexpr function. */
efe6a40a 1017 bool bi_const_p = (DECL_FUNCTION_CODE (fun) == BUILT_IN_CONSTANT_P);
1018
1019 if (bi_const_p
f1c6af10 1020 && current_function_decl
1021 && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
09b42213 1022 {
f1c6af10 1023 *non_constant_p = true;
1024 return t;
09b42213 1025 }
f1c6af10 1026
1027 /* Be permissive for arguments to built-ins; __builtin_constant_p should
1028 return constant false for a non-constant argument. */
1029 constexpr_ctx new_ctx = *ctx;
1030 new_ctx.quiet = true;
1031 bool dummy1 = false, dummy2 = false;
1032 for (i = 0; i < nargs; ++i)
efe6a40a 1033 {
1034 args[i] = cxx_eval_constant_expression (&new_ctx, CALL_EXPR_ARG (t, i),
1035 lval, &dummy1, &dummy2);
1036 if (bi_const_p)
1037 /* For __built_in_constant_p, fold all expressions with constant values
1038 even if they aren't C++ constant-expressions. */
1039 args[i] = cp_fully_fold (args[i]);
1040 }
f1c6af10 1041
1042 bool save_ffbcp = force_folding_builtin_constant_p;
1043 force_folding_builtin_constant_p = true;
9d884767 1044 new_call = fold_build_call_array_loc (EXPR_LOCATION (t), TREE_TYPE (t),
1045 CALL_EXPR_FN (t), nargs, args);
d2c63826 1046 /* Fold away the NOP_EXPR from fold_builtin_n. */
1047 new_call = fold (new_call);
f1c6af10 1048 force_folding_builtin_constant_p = save_ffbcp;
09b42213 1049 VERIFY_CONSTANT (new_call);
1050 return new_call;
1051}
1052
1053/* TEMP is the constant value of a temporary object of type TYPE. Adjust
1054 the type of the value to match. */
1055
1056static tree
1057adjust_temp_type (tree type, tree temp)
1058{
1059 if (TREE_TYPE (temp) == type)
1060 return temp;
1061 /* Avoid wrapping an aggregate value in a NOP_EXPR. */
1062 if (TREE_CODE (temp) == CONSTRUCTOR)
1063 return build_constructor (type, CONSTRUCTOR_ELTS (temp));
1064 gcc_assert (scalarish_type_p (type));
1065 return cp_fold_convert (type, temp);
1066}
1067
1068/* Subroutine of cxx_eval_call_expression.
1069 We are processing a call expression (either CALL_EXPR or
cf72f34d 1070 AGGR_INIT_EXPR) in the context of CTX. Evaluate
09b42213 1071 all arguments and bind their values to correspondings
1072 parameters, making up the NEW_CALL context. */
1073
1074static void
cf72f34d 1075cxx_bind_parameters_in_call (const constexpr_ctx *ctx, tree t,
09b42213 1076 constexpr_call *new_call,
c8f6aeb1 1077 bool *non_constant_p, bool *overflow_p,
1078 bool *non_constant_args)
09b42213 1079{
1080 const int nargs = call_expr_nargs (t);
1081 tree fun = new_call->fundef->decl;
1082 tree parms = DECL_ARGUMENTS (fun);
1083 int i;
9c96033c 1084 tree *p = &new_call->bindings;
09b42213 1085 for (i = 0; i < nargs; ++i)
1086 {
1087 tree x, arg;
1088 tree type = parms ? TREE_TYPE (parms) : void_type_node;
09b42213 1089 x = get_nth_callarg (t, i);
cf72f34d 1090 /* For member function, the first argument is a pointer to the implied
1091 object. For a constructor, it might still be a dummy object, in
9c96033c 1092 which case we get the real argument from ctx. */
cf72f34d 1093 if (i == 0 && DECL_CONSTRUCTOR_P (fun)
1094 && is_dummy_object (x))
1095 {
1096 x = ctx->object;
cf72f34d 1097 x = cp_build_addr_expr (x, tf_warning_or_error);
1098 }
1227ba74 1099 bool lval = false;
1227ba74 1100 arg = cxx_eval_constant_expression (ctx, x, lval,
b2a43197 1101 non_constant_p, overflow_p);
09b42213 1102 /* Don't VERIFY_CONSTANT here. */
f83e6885 1103 if (*non_constant_p && ctx->quiet)
09b42213 1104 return;
1105 /* Just discard ellipsis args after checking their constantitude. */
1106 if (!parms)
1107 continue;
1108 if (*non_constant_p)
1109 /* Don't try to adjust the type of non-constant args. */
1110 goto next;
1111
1112 /* Make sure the binding has the same type as the parm. */
1113 if (TREE_CODE (type) != REFERENCE_TYPE)
1114 arg = adjust_temp_type (type, arg);
c8f6aeb1 1115 if (!TREE_CONSTANT (arg))
1116 *non_constant_args = true;
9c96033c 1117 *p = build_tree_list (parms, arg);
1118 p = &TREE_CHAIN (*p);
09b42213 1119 next:
1120 parms = TREE_CHAIN (parms);
1121 }
1122}
1123
1124/* Variables and functions to manage constexpr call expansion context.
1125 These do not need to be marked for PCH or GC. */
1126
1127/* FIXME remember and print actual constant arguments. */
1128static vec<tree> call_stack = vNULL;
1129static int call_stack_tick;
1130static int last_cx_error_tick;
1131
1132static bool
1133push_cx_call_context (tree call)
1134{
1135 ++call_stack_tick;
1136 if (!EXPR_HAS_LOCATION (call))
1137 SET_EXPR_LOCATION (call, input_location);
1138 call_stack.safe_push (call);
1139 if (call_stack.length () > (unsigned) max_constexpr_depth)
1140 return false;
1141 return true;
1142}
1143
1144static void
1145pop_cx_call_context (void)
1146{
1147 ++call_stack_tick;
1148 call_stack.pop ();
1149}
1150
1151vec<tree>
1152cx_error_context (void)
1153{
1154 vec<tree> r = vNULL;
1155 if (call_stack_tick != last_cx_error_tick
1156 && !call_stack.is_empty ())
1157 r = call_stack;
1158 last_cx_error_tick = call_stack_tick;
1159 return r;
1160}
1161
1162/* Subroutine of cxx_eval_constant_expression.
1163 Evaluate the call expression tree T in the context of OLD_CALL expression
1164 evaluation. */
1165
1166static tree
cf72f34d 1167cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
1227ba74 1168 bool lval,
09b42213 1169 bool *non_constant_p, bool *overflow_p)
1170{
1171 location_t loc = EXPR_LOC_OR_LOC (t, input_location);
1172 tree fun = get_function_named_in_call (t);
09b42213 1173 constexpr_call new_call = { NULL, NULL, NULL, 0 };
09b42213 1174 bool depth_ok;
1175
6b71bdb4 1176 if (fun == NULL_TREE)
1177 switch (CALL_EXPR_IFN (t))
1178 {
1179 case IFN_UBSAN_NULL:
1180 case IFN_UBSAN_BOUNDS:
32cf7025 1181 case IFN_UBSAN_VPTR:
6b71bdb4 1182 return void_node;
1183 default:
1184 if (!ctx->quiet)
1185 error_at (loc, "call to internal function");
1186 *non_constant_p = true;
1187 return t;
1188 }
1189
09b42213 1190 if (TREE_CODE (fun) != FUNCTION_DECL)
1191 {
1192 /* Might be a constexpr function pointer. */
f83e6885 1193 fun = cxx_eval_constant_expression (ctx, fun,
1227ba74 1194 /*lval*/false, non_constant_p,
b2a43197 1195 overflow_p);
09b42213 1196 STRIP_NOPS (fun);
1197 if (TREE_CODE (fun) == ADDR_EXPR)
1198 fun = TREE_OPERAND (fun, 0);
1199 }
1200 if (TREE_CODE (fun) != FUNCTION_DECL)
1201 {
f83e6885 1202 if (!ctx->quiet && !*non_constant_p)
09b42213 1203 error_at (loc, "expression %qE does not designate a constexpr "
1204 "function", fun);
1205 *non_constant_p = true;
1206 return t;
1207 }
1208 if (DECL_CLONED_FUNCTION_P (fun))
1209 fun = DECL_CLONED_FUNCTION (fun);
6b71bdb4 1210
1211 if (is_ubsan_builtin_p (fun))
1212 return void_node;
1213
09b42213 1214 if (is_builtin_fn (fun))
f1c6af10 1215 return cxx_eval_builtin_function_call (ctx, t, fun,
1227ba74 1216 lval, non_constant_p, overflow_p);
09b42213 1217 if (!DECL_DECLARED_CONSTEXPR_P (fun))
1218 {
f83e6885 1219 if (!ctx->quiet)
09b42213 1220 {
1221 error_at (loc, "call to non-constexpr function %qD", fun);
1222 explain_invalid_constexpr_fn (fun);
1223 }
1224 *non_constant_p = true;
1225 return t;
1226 }
1227
1228 /* Shortcut trivial constructor/op=. */
1229 if (trivial_fn_p (fun))
1230 {
1231 if (call_expr_nargs (t) == 2)
1232 {
1233 tree arg = convert_from_reference (get_nth_callarg (t, 1));
f83e6885 1234 return cxx_eval_constant_expression (ctx, arg,
1227ba74 1235 lval, non_constant_p,
b2a43197 1236 overflow_p);
09b42213 1237 }
1238 else if (TREE_CODE (t) == AGGR_INIT_EXPR
1239 && AGGR_INIT_ZERO_FIRST (t))
1240 return build_zero_init (DECL_CONTEXT (fun), NULL_TREE, false);
1241 }
1242
8afcf831 1243 /* We can't defer instantiating the function any longer. */
1244 if (!DECL_INITIAL (fun)
1245 && DECL_TEMPLOID_INSTANTIATION (fun))
1246 {
1247 ++function_depth;
1248 instantiate_decl (fun, /*defer_ok*/false, /*expl_inst*/false);
1249 --function_depth;
1250 }
1251
09b42213 1252 /* If in direct recursive call, optimize definition search. */
cf72f34d 1253 if (ctx && ctx->call && ctx->call->fundef->decl == fun)
1254 new_call.fundef = ctx->call->fundef;
09b42213 1255 else
1256 {
1257 new_call.fundef = retrieve_constexpr_fundef (fun);
1258 if (new_call.fundef == NULL || new_call.fundef->body == NULL)
1259 {
f83e6885 1260 if (!ctx->quiet)
09b42213 1261 {
1262 if (DECL_INITIAL (fun))
1263 {
1264 /* The definition of fun was somehow unsuitable. */
1265 error_at (loc, "%qD called in a constant expression", fun);
1266 explain_invalid_constexpr_fn (fun);
1267 }
1268 else
1269 error_at (loc, "%qD used before its definition", fun);
1270 }
1271 *non_constant_p = true;
1272 return t;
1273 }
1274 }
9c96033c 1275
1276 constexpr_ctx new_ctx = *ctx;
1277 if (DECL_CONSTRUCTOR_P (fun) && !ctx->object
1278 && TREE_CODE (t) == AGGR_INIT_EXPR)
1279 {
1280 /* We want to have an initialization target for an AGGR_INIT_EXPR.
1281 If we don't already have one in CTX, use the AGGR_INIT_EXPR_SLOT. */
1282 new_ctx.object = AGGR_INIT_EXPR_SLOT (t);
1283 tree ctor = new_ctx.ctor = build_constructor (DECL_CONTEXT (fun), NULL);
1284 CONSTRUCTOR_NO_IMPLICIT_ZERO (ctor) = true;
1285 ctx->values->put (new_ctx.object, ctor);
1286 ctx = &new_ctx;
1287 }
1288
c8f6aeb1 1289 bool non_constant_args = false;
cf72f34d 1290 cxx_bind_parameters_in_call (ctx, t, &new_call,
c8f6aeb1 1291 non_constant_p, overflow_p, &non_constant_args);
09b42213 1292 if (*non_constant_p)
1293 return t;
1294
1295 depth_ok = push_cx_call_context (t);
1296
c8f6aeb1 1297 tree result = NULL_TREE;
09b42213 1298
c8f6aeb1 1299 constexpr_call *entry = NULL;
37715b0f 1300 if (depth_ok && !non_constant_args)
09b42213 1301 {
c8f6aeb1 1302 new_call.hash = iterative_hash_template_arg
1303 (new_call.bindings, constexpr_fundef_hasher::hash (new_call.fundef));
1304
1305 /* If we have seen this call before, we are done. */
1306 maybe_initialize_constexpr_call_table ();
1307 constexpr_call **slot
1308 = constexpr_call_table->find_slot (&new_call, INSERT);
1309 entry = *slot;
1310 if (entry == NULL)
1311 {
1312 /* We need to keep a pointer to the entry, not just the slot, as the
1313 slot can move in the call to cxx_eval_builtin_function_call. */
1314 *slot = entry = ggc_alloc<constexpr_call> ();
1315 *entry = new_call;
1316 }
1317 /* Calls which are in progress have their result set to NULL
1318 so that we can detect circular dependencies. */
1319 else if (entry->result == NULL)
1320 {
1321 if (!ctx->quiet)
1322 error ("call has circular dependency");
1323 *non_constant_p = true;
1324 entry->result = result = error_mark_node;
1325 }
1326 else
1327 result = entry->result;
09b42213 1328 }
1329
1330 if (!depth_ok)
1331 {
f83e6885 1332 if (!ctx->quiet)
09b42213 1333 error ("constexpr evaluation depth exceeds maximum of %d (use "
1334 "-fconstexpr-depth= to increase the maximum)",
1335 max_constexpr_depth);
1336 *non_constant_p = true;
c8f6aeb1 1337 result = error_mark_node;
09b42213 1338 }
1339 else
1340 {
09b42213 1341 if (!result || result == error_mark_node)
cf72f34d 1342 {
88a59139 1343 if (DECL_SAVED_TREE (fun) == NULL_TREE
1344 && (DECL_CONSTRUCTOR_P (fun) || DECL_DESTRUCTOR_P (fun)))
1345 /* The maybe-in-charge 'tor had its DECL_SAVED_TREE
1346 cleared, try a clone. */
1347 for (fun = DECL_CHAIN (fun);
1348 fun && DECL_CLONED_FUNCTION_P (fun);
1349 fun = DECL_CHAIN (fun))
1350 if (DECL_SAVED_TREE (fun))
1351 break;
1352 gcc_assert (DECL_SAVED_TREE (fun));
1353 tree parms, res;
1354
1355 /* Unshare the whole function body. */
1356 tree body = copy_fn (fun, parms, res);
1357
1358 /* Associate the bindings with the remapped parms. */
1359 tree bound = new_call.bindings;
1360 tree remapped = parms;
1361 while (bound)
9c96033c 1362 {
88a59139 1363 tree oparm = TREE_PURPOSE (bound);
1364 tree arg = TREE_VALUE (bound);
1365 gcc_assert (DECL_NAME (remapped) == DECL_NAME (oparm));
1366 ctx->values->put (remapped, arg);
1367 bound = TREE_CHAIN (bound);
1368 remapped = DECL_CHAIN (remapped);
9c96033c 1369 }
88a59139 1370 /* Add the RESULT_DECL to the values map, too. */
1371 tree slot = NULL_TREE;
1372 if (DECL_BY_REFERENCE (res))
9c96033c 1373 {
88a59139 1374 slot = AGGR_INIT_EXPR_SLOT (t);
1375 tree addr = build_address (slot);
1376 addr = build_nop (TREE_TYPE (res), addr);
1377 ctx->values->put (res, addr);
1378 ctx->values->put (slot, NULL_TREE);
1379 }
1380 else
1381 ctx->values->put (res, NULL_TREE);
9c96033c 1382
88a59139 1383 tree jump_target = NULL_TREE;
1384 cxx_eval_constant_expression (ctx, body,
1385 lval, non_constant_p, overflow_p,
1386 &jump_target);
9c96033c 1387
88a59139 1388 if (DECL_CONSTRUCTOR_P (fun))
1389 /* This can be null for a subobject constructor call, in
1390 which case what we care about is the initialization
1391 side-effects rather than the value. We could get at the
1392 value by evaluating *this, but we don't bother; there's
1393 no need to put such a call in the hash table. */
1394 result = lval ? ctx->object : ctx->ctor;
1395 else if (VOID_TYPE_P (TREE_TYPE (res)))
1396 result = void_node;
1397 else
1398 {
1399 result = *ctx->values->get (slot ? slot : res);
1400 if (result == NULL_TREE && !*non_constant_p)
9c96033c 1401 {
88a59139 1402 if (!ctx->quiet)
1403 error ("constexpr call flows off the end "
1404 "of the function");
1405 *non_constant_p = true;
9c96033c 1406 }
9c96033c 1407 }
88a59139 1408
1409 /* Remove the parms/result from the values map. Is it worth
1410 bothering to do this when the map itself is only live for
1411 one constexpr evaluation? If so, maybe also clear out
1412 other vars from call, maybe in BIND_EXPR handling? */
1413 ctx->values->remove (res);
1414 if (slot)
1415 ctx->values->remove (slot);
1416 for (tree parm = parms; parm; parm = TREE_CHAIN (parm))
1417 ctx->values->remove (parm);
cf72f34d 1418 }
9c96033c 1419
09b42213 1420 if (result == error_mark_node)
1421 *non_constant_p = true;
1422 if (*non_constant_p)
c8f6aeb1 1423 result = error_mark_node;
88a59139 1424 else if (!result)
9c96033c 1425 result = void_node;
c8f6aeb1 1426 if (entry)
1427 entry->result = result;
09b42213 1428 }
1429
1430 pop_cx_call_context ();
1431 return unshare_expr (result);
1432}
1433
1434/* FIXME speed this up, it's taking 16% of compile time on sieve testcase. */
1435
1436bool
1437reduced_constant_expression_p (tree t)
1438{
1439 switch (TREE_CODE (t))
1440 {
1441 case PTRMEM_CST:
1442 /* Even if we can't lower this yet, it's constant. */
1443 return true;
1444
1445 case CONSTRUCTOR:
1446 /* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR. */
1447 tree elt; unsigned HOST_WIDE_INT idx;
1448 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), idx, elt)
1449 if (!reduced_constant_expression_p (elt))
1450 return false;
1451 return true;
1452
1453 default:
1454 /* FIXME are we calling this too much? */
1455 return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE;
1456 }
1457}
1458
1459/* Some expressions may have constant operands but are not constant
1460 themselves, such as 1/0. Call this function (or rather, the macro
1461 following it) to check for that condition.
1462
1463 We only call this in places that require an arithmetic constant, not in
1464 places where we might have a non-constant expression that can be a
1465 component of a constant expression, such as the address of a constexpr
1466 variable that might be dereferenced later. */
1467
1468static bool
1469verify_constant (tree t, bool allow_non_constant, bool *non_constant_p,
1470 bool *overflow_p)
1471{
1472 if (!*non_constant_p && !reduced_constant_expression_p (t))
1473 {
1474 if (!allow_non_constant)
1475 error ("%q+E is not a constant expression", t);
1476 *non_constant_p = true;
1477 }
1478 if (TREE_OVERFLOW_P (t))
1479 {
1480 if (!allow_non_constant)
1481 {
1482 permerror (input_location, "overflow in constant expression");
1483 /* If we're being permissive (and are in an enforcing
1484 context), ignore the overflow. */
1485 if (flag_permissive)
1486 return *non_constant_p;
1487 }
1488 *overflow_p = true;
1489 }
1490 return *non_constant_p;
1491}
1492
2b035ffe 1493/* Check whether the shift operation with code CODE and type TYPE on LHS
1494 and RHS is undefined. If it is, give an error with an explanation,
1495 and return true; return false otherwise. */
1496
1497static bool
1498cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
1499 enum tree_code code, tree type, tree lhs, tree rhs)
1500{
1501 if ((code != LSHIFT_EXPR && code != RSHIFT_EXPR)
1502 || TREE_CODE (lhs) != INTEGER_CST
1503 || TREE_CODE (rhs) != INTEGER_CST)
1504 return false;
1505
1506 tree lhstype = TREE_TYPE (lhs);
1507 unsigned HOST_WIDE_INT uprec = TYPE_PRECISION (TREE_TYPE (lhs));
1508
1509 /* [expr.shift] The behavior is undefined if the right operand
1510 is negative, or greater than or equal to the length in bits
1511 of the promoted left operand. */
1512 if (tree_int_cst_sgn (rhs) == -1)
1513 {
1514 if (!ctx->quiet)
91d87e22 1515 permerror (loc, "right operand of shift expression %q+E is negative",
1516 build2_loc (loc, code, type, lhs, rhs));
1517 return (!flag_permissive || ctx->quiet);
2b035ffe 1518 }
1519 if (compare_tree_int (rhs, uprec) >= 0)
1520 {
1521 if (!ctx->quiet)
91d87e22 1522 permerror (loc, "right operand of shift expression %q+E is >= than "
1523 "the precision of the left operand",
1524 build2_loc (loc, code, type, lhs, rhs));
1525 return (!flag_permissive || ctx->quiet);
2b035ffe 1526 }
1527
1528 /* The value of E1 << E2 is E1 left-shifted E2 bit positions; [...]
1529 if E1 has a signed type and non-negative value, and E1x2^E2 is
1530 representable in the corresponding unsigned type of the result type,
1531 then that value, converted to the result type, is the resulting value;
1532 otherwise, the behavior is undefined. */
1533 if (code == LSHIFT_EXPR && !TYPE_UNSIGNED (lhstype)
1534 && (cxx_dialect >= cxx11))
1535 {
1536 if (tree_int_cst_sgn (lhs) == -1)
1537 {
1538 if (!ctx->quiet)
91d87e22 1539 permerror (loc,
1540 "left operand of shift expression %q+E is negative",
1541 build2_loc (loc, code, type, lhs, rhs));
1542 return (!flag_permissive || ctx->quiet);
2b035ffe 1543 }
1544 /* For signed x << y the following:
1545 (unsigned) x >> ((prec (lhs) - 1) - y)
1546 if > 1, is undefined. The right-hand side of this formula
1547 is the highest bit of the LHS that can be set (starting from 0),
1548 so that the shift doesn't overflow. We then right-shift the LHS
1549 to see whether any other bit is set making the original shift
1550 undefined -- the result is not representable in the corresponding
1551 unsigned type. */
1552 tree t = build_int_cst (unsigned_type_node, uprec - 1);
1553 t = fold_build2 (MINUS_EXPR, unsigned_type_node, t, rhs);
1554 tree ulhs = fold_convert (unsigned_type_for (lhstype), lhs);
1555 t = fold_build2 (RSHIFT_EXPR, TREE_TYPE (ulhs), ulhs, t);
1556 if (tree_int_cst_lt (integer_one_node, t))
1557 {
1558 if (!ctx->quiet)
91d87e22 1559 permerror (loc, "shift expression %q+E overflows",
1560 build2_loc (loc, code, type, lhs, rhs));
1561 return (!flag_permissive || ctx->quiet);
2b035ffe 1562 }
1563 }
1564 return false;
1565}
1566
09b42213 1567/* Subroutine of cxx_eval_constant_expression.
1568 Attempt to reduce the unary expression tree T to a compile time value.
1569 If successful, return the value. Otherwise issue a diagnostic
1570 and return error_mark_node. */
1571
1572static tree
cf72f34d 1573cxx_eval_unary_expression (const constexpr_ctx *ctx, tree t,
c8f6aeb1 1574 bool /*lval*/,
09b42213 1575 bool *non_constant_p, bool *overflow_p)
1576{
1577 tree r;
1578 tree orig_arg = TREE_OPERAND (t, 0);
c8f6aeb1 1579 tree arg = cxx_eval_constant_expression (ctx, orig_arg, /*lval*/false,
1580 non_constant_p, overflow_p);
09b42213 1581 VERIFY_CONSTANT (arg);
93add516 1582 location_t loc = EXPR_LOCATION (t);
1583 enum tree_code code = TREE_CODE (t);
1584 tree type = TREE_TYPE (t);
1585 r = fold_unary_loc (loc, code, type, arg);
1586 if (r == NULL_TREE)
1587 {
1588 if (arg == orig_arg)
1589 r = t;
1590 else
1591 r = build1_loc (loc, code, type, arg);
1592 }
09b42213 1593 VERIFY_CONSTANT (r);
1594 return r;
1595}
1596
1597/* Subroutine of cxx_eval_constant_expression.
1598 Like cxx_eval_unary_expression, except for binary expressions. */
1599
1600static tree
cf72f34d 1601cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t,
c8f6aeb1 1602 bool /*lval*/,
09b42213 1603 bool *non_constant_p, bool *overflow_p)
1604{
1605 tree r;
1606 tree orig_lhs = TREE_OPERAND (t, 0);
1607 tree orig_rhs = TREE_OPERAND (t, 1);
1608 tree lhs, rhs;
c8f6aeb1 1609 lhs = cxx_eval_constant_expression (ctx, orig_lhs, /*lval*/false,
b2a43197 1610 non_constant_p, overflow_p);
35f2c28f 1611 /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
1612 a local array in a constexpr function. */
1613 bool ptr = POINTER_TYPE_P (TREE_TYPE (lhs));
1614 if (!ptr)
1615 VERIFY_CONSTANT (lhs);
c8f6aeb1 1616 rhs = cxx_eval_constant_expression (ctx, orig_rhs, /*lval*/false,
b2a43197 1617 non_constant_p, overflow_p);
35f2c28f 1618 if (!ptr)
aae7465c 1619 VERIFY_CONSTANT (rhs);
93add516 1620
1621 location_t loc = EXPR_LOCATION (t);
1622 enum tree_code code = TREE_CODE (t);
1623 tree type = TREE_TYPE (t);
1624 r = fold_binary_loc (loc, code, type, lhs, rhs);
1625 if (r == NULL_TREE)
1626 {
1627 if (lhs == orig_lhs && rhs == orig_rhs)
1628 r = t;
1629 else
1630 r = build2_loc (loc, code, type, lhs, rhs);
1631 }
2b035ffe 1632 else if (cxx_eval_check_shift_p (loc, ctx, code, type, lhs, rhs))
1633 *non_constant_p = true;
35f2c28f 1634 if (!ptr)
aae7465c 1635 VERIFY_CONSTANT (r);
09b42213 1636 return r;
1637}
1638
1639/* Subroutine of cxx_eval_constant_expression.
1640 Attempt to evaluate condition expressions. Dead branches are not
1641 looked into. */
1642
1643static tree
cf72f34d 1644cxx_eval_conditional_expression (const constexpr_ctx *ctx, tree t,
1227ba74 1645 bool lval,
00f21715 1646 bool *non_constant_p, bool *overflow_p,
1647 tree *jump_target)
09b42213 1648{
cf72f34d 1649 tree val = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
c8f6aeb1 1650 /*lval*/false,
b2a43197 1651 non_constant_p, overflow_p);
09b42213 1652 VERIFY_CONSTANT (val);
1653 /* Don't VERIFY_CONSTANT the other operands. */
1654 if (integer_zerop (val))
cf72f34d 1655 return cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 2),
1227ba74 1656 lval,
00f21715 1657 non_constant_p, overflow_p,
1658 jump_target);
cf72f34d 1659 return cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
1227ba74 1660 lval,
00f21715 1661 non_constant_p, overflow_p,
1662 jump_target);
09b42213 1663}
1664
7963b19d 1665/* Returns less than, equal to, or greater than zero if KEY is found to be
1666 less than, to match, or to be greater than the constructor_elt's INDEX. */
1667
1668static int
1669array_index_cmp (tree key, tree index)
1670{
1671 gcc_assert (TREE_CODE (key) == INTEGER_CST);
1672
1673 switch (TREE_CODE (index))
1674 {
1675 case INTEGER_CST:
1676 return tree_int_cst_compare (key, index);
1677 case RANGE_EXPR:
1678 {
1679 tree lo = TREE_OPERAND (index, 0);
1680 tree hi = TREE_OPERAND (index, 1);
1681 if (tree_int_cst_lt (key, lo))
1682 return -1;
1683 else if (tree_int_cst_lt (hi, key))
1684 return 1;
1685 else
1686 return 0;
1687 }
1688 default:
1689 gcc_unreachable ();
1690 }
1691}
1692
1693/* Returns the index of the constructor_elt of ARY which matches DINDEX, or -1
1694 if none. If INSERT is true, insert a matching element rather than fail. */
1695
1696static HOST_WIDE_INT
1697find_array_ctor_elt (tree ary, tree dindex, bool insert = false)
1698{
1699 if (tree_int_cst_sgn (dindex) < 0)
1700 return -1;
1701
1702 unsigned HOST_WIDE_INT i = tree_to_uhwi (dindex);
1703 vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (ary);
1704 unsigned HOST_WIDE_INT len = vec_safe_length (elts);
1705
1706 unsigned HOST_WIDE_INT end = len;
1707 unsigned HOST_WIDE_INT begin = 0;
1708
1709 /* If the last element of the CONSTRUCTOR has its own index, we can assume
1710 that the same is true of the other elements and index directly. */
1711 if (end > 0)
1712 {
1713 tree cindex = (*elts)[end-1].index;
1714 if (TREE_CODE (cindex) == INTEGER_CST
1715 && compare_tree_int (cindex, end-1) == 0)
1716 {
1717 if (i < end)
1718 return i;
1719 else
1720 begin = end;
1721 }
1722 }
1723
1724 /* Otherwise, find a matching index by means of a binary search. */
1725 while (begin != end)
1726 {
1727 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
f0b916c7 1728 constructor_elt &elt = (*elts)[middle];
1729 tree idx = elt.index;
7963b19d 1730
f0b916c7 1731 int cmp = array_index_cmp (dindex, idx);
7963b19d 1732 if (cmp < 0)
1733 end = middle;
1734 else if (cmp > 0)
1735 begin = middle + 1;
1736 else
f0b916c7 1737 {
1738 if (insert && TREE_CODE (idx) == RANGE_EXPR)
1739 {
1740 /* We need to split the range. */
1741 constructor_elt e;
1742 tree lo = TREE_OPERAND (idx, 0);
1743 tree hi = TREE_OPERAND (idx, 1);
1744 if (tree_int_cst_lt (lo, dindex))
1745 {
1746 /* There are still some lower elts; shorten the range. */
1747 tree new_hi = int_const_binop (MINUS_EXPR, dindex,
1748 size_one_node);
1749 if (tree_int_cst_equal (lo, new_hi))
1750 /* Only one element left, no longer a range. */
1751 elt.index = lo;
1752 else
1753 TREE_OPERAND (idx, 1) = new_hi;
1754 /* Append the element we want to insert. */
1755 ++middle;
1756 e.index = dindex;
1757 e.value = unshare_expr (elt.value);
1758 vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle, e);
1759 }
1760 else
1761 /* No lower elts, the range elt is now ours. */
1762 elt.index = dindex;
1763
1764 if (tree_int_cst_lt (dindex, hi))
1765 {
1766 /* There are still some higher elts; append a range. */
1767 tree new_lo = int_const_binop (PLUS_EXPR, dindex,
1768 size_one_node);
1769 if (tree_int_cst_equal (new_lo, hi))
1770 e.index = hi;
1771 else
1772 e.index = build2 (RANGE_EXPR, sizetype, new_lo, hi);
1773 e.value = unshare_expr (elt.value);
1774 vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle+1, e);
1775 }
1776 }
1777 return middle;
1778 }
7963b19d 1779 }
1780
1781 if (insert)
1782 {
1783 constructor_elt e = { dindex, NULL_TREE };
1784 vec_safe_insert (CONSTRUCTOR_ELTS (ary), end, e);
1785 return end;
1786 }
1787
1788 return -1;
1789}
1790
1791
09b42213 1792/* Subroutine of cxx_eval_constant_expression.
1793 Attempt to reduce a reference to an array slot. */
1794
1795static tree
cf72f34d 1796cxx_eval_array_reference (const constexpr_ctx *ctx, tree t,
1227ba74 1797 bool lval,
09b42213 1798 bool *non_constant_p, bool *overflow_p)
1799{
1800 tree oldary = TREE_OPERAND (t, 0);
cf72f34d 1801 tree ary = cxx_eval_constant_expression (ctx, oldary,
1227ba74 1802 lval,
b2a43197 1803 non_constant_p, overflow_p);
09b42213 1804 tree index, oldidx;
1805 HOST_WIDE_INT i;
1806 tree elem_type;
1807 unsigned len, elem_nchars = 1;
1808 if (*non_constant_p)
1809 return t;
1810 oldidx = TREE_OPERAND (t, 1);
cf72f34d 1811 index = cxx_eval_constant_expression (ctx, oldidx,
f83e6885 1812 false,
b2a43197 1813 non_constant_p, overflow_p);
09b42213 1814 VERIFY_CONSTANT (index);
1227ba74 1815 if (lval && ary == oldary && index == oldidx)
09b42213 1816 return t;
1227ba74 1817 else if (lval)
09b42213 1818 return build4 (ARRAY_REF, TREE_TYPE (t), ary, index, NULL, NULL);
1819 elem_type = TREE_TYPE (TREE_TYPE (ary));
1820 if (TREE_CODE (ary) == CONSTRUCTOR)
1821 len = CONSTRUCTOR_NELTS (ary);
1822 else if (TREE_CODE (ary) == STRING_CST)
1823 {
1824 elem_nchars = (TYPE_PRECISION (elem_type)
1825 / TYPE_PRECISION (char_type_node));
1826 len = (unsigned) TREE_STRING_LENGTH (ary) / elem_nchars;
1827 }
1828 else
1829 {
1830 /* We can't do anything with other tree codes, so use
1831 VERIFY_CONSTANT to complain and fail. */
1832 VERIFY_CONSTANT (ary);
1833 gcc_unreachable ();
1834 }
aed8dc7f 1835
f6b30463 1836 if (!tree_fits_shwi_p (index)
1837 || (i = tree_to_shwi (index)) < 0)
7963b19d 1838 {
1839 if (!ctx->quiet)
1840 error ("negative array subscript");
1841 *non_constant_p = true;
1842 return t;
1843 }
1844
1845 bool found;
1846 if (TREE_CODE (ary) == CONSTRUCTOR)
1847 {
1848 HOST_WIDE_INT ix = find_array_ctor_elt (ary, index);
1849 found = (ix >= 0);
1850 if (found)
1851 i = ix;
aed8dc7f 1852 }
7963b19d 1853 else
1854 found = (i < len);
aed8dc7f 1855
7963b19d 1856 if (!found)
09b42213 1857 {
1858 if (tree_int_cst_lt (index, array_type_nelts_top (TREE_TYPE (ary))))
1859 {
a02b42fe 1860 if (TREE_CODE (ary) == CONSTRUCTOR
1861 && CONSTRUCTOR_NO_IMPLICIT_ZERO (ary))
1862 {
1863 /* 'ary' is part of the aggregate initializer we're currently
1864 building; if there's no initializer for this element yet,
1865 that's an error. */
1866 if (!ctx->quiet)
1867 error ("accessing uninitialized array element");
1868 *non_constant_p = true;
1869 return t;
1870 }
1871
09b42213 1872 /* If it's within the array bounds but doesn't have an explicit
1873 initializer, it's value-initialized. */
1874 tree val = build_value_init (elem_type, tf_warning_or_error);
cf72f34d 1875 return cxx_eval_constant_expression (ctx, val,
1227ba74 1876 lval,
b2a43197 1877 non_constant_p, overflow_p);
09b42213 1878 }
1879
f83e6885 1880 if (!ctx->quiet)
09b42213 1881 error ("array subscript out of bound");
1882 *non_constant_p = true;
1883 return t;
1884 }
aed8dc7f 1885
09b42213 1886 if (TREE_CODE (ary) == CONSTRUCTOR)
1887 return (*CONSTRUCTOR_ELTS (ary))[i].value;
1888 else if (elem_nchars == 1)
1889 return build_int_cst (cv_unqualified (TREE_TYPE (TREE_TYPE (ary))),
1890 TREE_STRING_POINTER (ary)[i]);
1891 else
1892 {
1893 tree type = cv_unqualified (TREE_TYPE (TREE_TYPE (ary)));
1894 return native_interpret_expr (type, (const unsigned char *)
1895 TREE_STRING_POINTER (ary)
1896 + i * elem_nchars, elem_nchars);
1897 }
1898 /* Don't VERIFY_CONSTANT here. */
1899}
1900
1901/* Subroutine of cxx_eval_constant_expression.
1902 Attempt to reduce a field access of a value of class type. */
1903
1904static tree
cf72f34d 1905cxx_eval_component_reference (const constexpr_ctx *ctx, tree t,
1227ba74 1906 bool lval,
09b42213 1907 bool *non_constant_p, bool *overflow_p)
1908{
1909 unsigned HOST_WIDE_INT i;
1910 tree field;
1911 tree value;
1912 tree part = TREE_OPERAND (t, 1);
1913 tree orig_whole = TREE_OPERAND (t, 0);
cf72f34d 1914 tree whole = cxx_eval_constant_expression (ctx, orig_whole,
1227ba74 1915 lval,
b2a43197 1916 non_constant_p, overflow_p);
f16ed232 1917 if (TREE_CODE (whole) == PTRMEM_CST)
1918 whole = cplus_expand_constant (whole);
09b42213 1919 if (whole == orig_whole)
1920 return t;
1227ba74 1921 if (lval)
09b42213 1922 return fold_build3 (COMPONENT_REF, TREE_TYPE (t),
1923 whole, part, NULL_TREE);
1924 /* Don't VERIFY_CONSTANT here; we only want to check that we got a
1925 CONSTRUCTOR. */
1926 if (!*non_constant_p && TREE_CODE (whole) != CONSTRUCTOR)
1927 {
f83e6885 1928 if (!ctx->quiet)
09b42213 1929 error ("%qE is not a constant expression", orig_whole);
1930 *non_constant_p = true;
1931 }
1932 if (DECL_MUTABLE_P (part))
1933 {
f83e6885 1934 if (!ctx->quiet)
09b42213 1935 error ("mutable %qD is not usable in a constant expression", part);
1936 *non_constant_p = true;
1937 }
1938 if (*non_constant_p)
1939 return t;
1940 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
1941 {
1942 if (field == part)
9c96033c 1943 {
1944 if (value)
1945 return value;
1946 else
1947 /* We're in the middle of initializing it. */
1948 break;
1949 }
09b42213 1950 }
1951 if (TREE_CODE (TREE_TYPE (whole)) == UNION_TYPE
1952 && CONSTRUCTOR_NELTS (whole) > 0)
1953 {
1954 /* DR 1188 says we don't have to deal with this. */
f83e6885 1955 if (!ctx->quiet)
09b42213 1956 error ("accessing %qD member instead of initialized %qD member in "
1957 "constant expression", part, CONSTRUCTOR_ELT (whole, 0)->index);
1958 *non_constant_p = true;
1959 return t;
1960 }
1961
cf72f34d 1962 if (CONSTRUCTOR_NO_IMPLICIT_ZERO (whole))
1963 {
1964 /* 'whole' is part of the aggregate initializer we're currently
1965 building; if there's no initializer for this member yet, that's an
1966 error. */
f83e6885 1967 if (!ctx->quiet)
cf72f34d 1968 error ("accessing uninitialized member %qD", part);
1969 *non_constant_p = true;
1970 return t;
1971 }
1972
09b42213 1973 /* If there's no explicit init for this field, it's value-initialized. */
1974 value = build_value_init (TREE_TYPE (t), tf_warning_or_error);
cf72f34d 1975 return cxx_eval_constant_expression (ctx, value,
1227ba74 1976 lval,
b2a43197 1977 non_constant_p, overflow_p);
09b42213 1978}
1979
1980/* Subroutine of cxx_eval_constant_expression.
1981 Attempt to reduce a field access of a value of class type that is
1982 expressed as a BIT_FIELD_REF. */
1983
1984static tree
cf72f34d 1985cxx_eval_bit_field_ref (const constexpr_ctx *ctx, tree t,
1227ba74 1986 bool lval,
09b42213 1987 bool *non_constant_p, bool *overflow_p)
1988{
1989 tree orig_whole = TREE_OPERAND (t, 0);
1990 tree retval, fldval, utype, mask;
1991 bool fld_seen = false;
1992 HOST_WIDE_INT istart, isize;
cf72f34d 1993 tree whole = cxx_eval_constant_expression (ctx, orig_whole,
1227ba74 1994 lval,
b2a43197 1995 non_constant_p, overflow_p);
09b42213 1996 tree start, field, value;
1997 unsigned HOST_WIDE_INT i;
1998
1999 if (whole == orig_whole)
2000 return t;
2001 /* Don't VERIFY_CONSTANT here; we only want to check that we got a
2002 CONSTRUCTOR. */
2003 if (!*non_constant_p
2004 && TREE_CODE (whole) != VECTOR_CST
2005 && TREE_CODE (whole) != CONSTRUCTOR)
2006 {
f83e6885 2007 if (!ctx->quiet)
09b42213 2008 error ("%qE is not a constant expression", orig_whole);
2009 *non_constant_p = true;
2010 }
2011 if (*non_constant_p)
2012 return t;
2013
2014 if (TREE_CODE (whole) == VECTOR_CST)
2015 return fold_ternary (BIT_FIELD_REF, TREE_TYPE (t), whole,
2016 TREE_OPERAND (t, 1), TREE_OPERAND (t, 2));
2017
2018 start = TREE_OPERAND (t, 2);
2019 istart = tree_to_shwi (start);
2020 isize = tree_to_shwi (TREE_OPERAND (t, 1));
2021 utype = TREE_TYPE (t);
2022 if (!TYPE_UNSIGNED (utype))
2023 utype = build_nonstandard_integer_type (TYPE_PRECISION (utype), 1);
2024 retval = build_int_cst (utype, 0);
2025 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
2026 {
2027 tree bitpos = bit_position (field);
2028 if (bitpos == start && DECL_SIZE (field) == TREE_OPERAND (t, 1))
2029 return value;
2030 if (TREE_CODE (TREE_TYPE (field)) == INTEGER_TYPE
2031 && TREE_CODE (value) == INTEGER_CST
2032 && tree_fits_shwi_p (bitpos)
2033 && tree_fits_shwi_p (DECL_SIZE (field)))
2034 {
2035 HOST_WIDE_INT bit = tree_to_shwi (bitpos);
2036 HOST_WIDE_INT sz = tree_to_shwi (DECL_SIZE (field));
2037 HOST_WIDE_INT shift;
2038 if (bit >= istart && bit + sz <= istart + isize)
2039 {
2040 fldval = fold_convert (utype, value);
2041 mask = build_int_cst_type (utype, -1);
2042 mask = fold_build2 (LSHIFT_EXPR, utype, mask,
2043 size_int (TYPE_PRECISION (utype) - sz));
2044 mask = fold_build2 (RSHIFT_EXPR, utype, mask,
2045 size_int (TYPE_PRECISION (utype) - sz));
2046 fldval = fold_build2 (BIT_AND_EXPR, utype, fldval, mask);
2047 shift = bit - istart;
2048 if (BYTES_BIG_ENDIAN)
2049 shift = TYPE_PRECISION (utype) - shift - sz;
2050 fldval = fold_build2 (LSHIFT_EXPR, utype, fldval,
2051 size_int (shift));
2052 retval = fold_build2 (BIT_IOR_EXPR, utype, retval, fldval);
2053 fld_seen = true;
2054 }
2055 }
2056 }
2057 if (fld_seen)
2058 return fold_convert (TREE_TYPE (t), retval);
2059 gcc_unreachable ();
2060 return error_mark_node;
2061}
2062
2063/* Subroutine of cxx_eval_constant_expression.
2064 Evaluate a short-circuited logical expression T in the context
2065 of a given constexpr CALL. BAILOUT_VALUE is the value for
2066 early return. CONTINUE_VALUE is used here purely for
2067 sanity check purposes. */
2068
2069static tree
cf72f34d 2070cxx_eval_logical_expression (const constexpr_ctx *ctx, tree t,
09b42213 2071 tree bailout_value, tree continue_value,
1227ba74 2072 bool lval,
09b42213 2073 bool *non_constant_p, bool *overflow_p)
2074{
2075 tree r;
cf72f34d 2076 tree lhs = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
1227ba74 2077 lval,
b2a43197 2078 non_constant_p, overflow_p);
09b42213 2079 VERIFY_CONSTANT (lhs);
2080 if (tree_int_cst_equal (lhs, bailout_value))
2081 return lhs;
2082 gcc_assert (tree_int_cst_equal (lhs, continue_value));
cf72f34d 2083 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
1227ba74 2084 lval, non_constant_p,
b2a43197 2085 overflow_p);
09b42213 2086 VERIFY_CONSTANT (r);
2087 return r;
2088}
2089
2090/* REF is a COMPONENT_REF designating a particular field. V is a vector of
2091 CONSTRUCTOR elements to initialize (part of) an object containing that
2092 field. Return a pointer to the constructor_elt corresponding to the
2093 initialization of the field. */
2094
2095static constructor_elt *
2096base_field_constructor_elt (vec<constructor_elt, va_gc> *v, tree ref)
2097{
2098 tree aggr = TREE_OPERAND (ref, 0);
2099 tree field = TREE_OPERAND (ref, 1);
2100 HOST_WIDE_INT i;
2101 constructor_elt *ce;
2102
2103 gcc_assert (TREE_CODE (ref) == COMPONENT_REF);
2104
2105 if (TREE_CODE (aggr) == COMPONENT_REF)
2106 {
2107 constructor_elt *base_ce
2108 = base_field_constructor_elt (v, aggr);
2109 v = CONSTRUCTOR_ELTS (base_ce->value);
2110 }
2111
2112 for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
2113 if (ce->index == field)
2114 return ce;
2115
2116 gcc_unreachable ();
2117 return NULL;
2118}
2119
cf72f34d 2120/* Some of the expressions fed to the constexpr mechanism are calls to
2121 constructors, which have type void. In that case, return the type being
2122 initialized by the constructor. */
2123
2124static tree
2125initialized_type (tree t)
2126{
2127 if (TYPE_P (t))
2128 return t;
2129 tree type = cv_unqualified (TREE_TYPE (t));
2130 if (TREE_CODE (t) == CALL_EXPR || TREE_CODE (t) == AGGR_INIT_EXPR)
2131 {
2132 /* A constructor call has void type, so we need to look deeper. */
2133 tree fn = get_function_named_in_call (t);
2134 if (fn && TREE_CODE (fn) == FUNCTION_DECL
2135 && DECL_CXX_CONSTRUCTOR_P (fn))
2136 type = DECL_CONTEXT (fn);
2137 }
2138 return type;
2139}
2140
2141/* We're about to initialize element INDEX of an array or class from VALUE.
2142 Set up NEW_CTX appropriately by adjusting .object to refer to the
2143 subobject and creating a new CONSTRUCTOR if the element is itself
2144 a class or array. */
2145
2146static void
2147init_subob_ctx (const constexpr_ctx *ctx, constexpr_ctx &new_ctx,
2148 tree index, tree &value)
2149{
2150 new_ctx = *ctx;
2151
2152 if (index && TREE_CODE (index) != INTEGER_CST
2153 && TREE_CODE (index) != FIELD_DECL)
2154 /* This won't have an element in the new CONSTRUCTOR. */
2155 return;
2156
2157 tree type = initialized_type (value);
2158 if (!AGGREGATE_TYPE_P (type) && !VECTOR_TYPE_P (type))
2159 /* A non-aggregate member doesn't get its own CONSTRUCTOR. */
2160 return;
2161
2162 /* The sub-aggregate initializer might contain a placeholder;
2163 update object to refer to the subobject and ctor to refer to
2164 the (newly created) sub-initializer. */
2165 if (ctx->object)
2166 new_ctx.object = build_ctor_subob_ref (index, type, ctx->object);
2167 tree elt = build_constructor (type, NULL);
2168 CONSTRUCTOR_NO_IMPLICIT_ZERO (elt) = true;
2169 new_ctx.ctor = elt;
2170
2171 if (TREE_CODE (value) == TARGET_EXPR)
2172 /* Avoid creating another CONSTRUCTOR when we expand the TARGET_EXPR. */
2173 value = TARGET_EXPR_INITIAL (value);
2174}
2175
2176/* We're about to process an initializer for a class or array TYPE. Make
2177 sure that CTX is set up appropriately. */
2178
2179static void
2180verify_ctor_sanity (const constexpr_ctx *ctx, tree type)
2181{
2182 /* We don't bother building a ctor for an empty base subobject. */
2183 if (is_empty_class (type))
2184 return;
2185
2186 /* We're in the middle of an initializer that might involve placeholders;
2187 our caller should have created a CONSTRUCTOR for us to put the
2188 initializer into. We will either return that constructor or T. */
2189 gcc_assert (ctx->ctor);
2190 gcc_assert (same_type_ignoring_top_level_qualifiers_p
2191 (type, TREE_TYPE (ctx->ctor)));
2192 gcc_assert (CONSTRUCTOR_NELTS (ctx->ctor) == 0);
2193 if (ctx->object)
2194 gcc_assert (same_type_ignoring_top_level_qualifiers_p
2195 (type, TREE_TYPE (ctx->object)));
2196 gcc_assert (!ctx->object || !DECL_P (ctx->object)
2197 || *(ctx->values->get (ctx->object)) == ctx->ctor);
2198}
2199
09b42213 2200/* Subroutine of cxx_eval_constant_expression.
2201 The expression tree T denotes a C-style array or a C-style
2202 aggregate. Reduce it to a constant expression. */
2203
2204static tree
cf72f34d 2205cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
1227ba74 2206 bool lval,
09b42213 2207 bool *non_constant_p, bool *overflow_p)
2208{
2209 vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
09b42213 2210 bool changed = false;
2211 gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (t));
cf72f34d 2212
2213 verify_ctor_sanity (ctx, TREE_TYPE (t));
2214 vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
2215 vec_alloc (*p, vec_safe_length (v));
2216
2217 unsigned i; tree index, value;
2218 FOR_EACH_CONSTRUCTOR_ELT (v, i, index, value)
09b42213 2219 {
cf72f34d 2220 constexpr_ctx new_ctx;
2221 init_subob_ctx (ctx, new_ctx, index, value);
2222 if (new_ctx.ctor != ctx->ctor)
2223 /* If we built a new CONSTRUCTOR, attach it now so that other
2224 initializers can refer to it. */
2225 CONSTRUCTOR_APPEND_ELT (*p, index, new_ctx.ctor);
2226 tree elt = cxx_eval_constant_expression (&new_ctx, value,
1227ba74 2227 lval,
b2a43197 2228 non_constant_p, overflow_p);
09b42213 2229 /* Don't VERIFY_CONSTANT here. */
f83e6885 2230 if (ctx->quiet && *non_constant_p)
cf72f34d 2231 break;
2232 if (elt != value)
09b42213 2233 changed = true;
cf72f34d 2234 if (index && TREE_CODE (index) == COMPONENT_REF)
09b42213 2235 {
2236 /* This is an initialization of a vfield inside a base
2237 subaggregate that we already initialized; push this
2238 initialization into the previous initialization. */
cf72f34d 2239 constructor_elt *inner = base_field_constructor_elt (*p, index);
09b42213 2240 inner->value = elt;
cf72f34d 2241 changed = true;
09b42213 2242 }
cf72f34d 2243 else if (index
2244 && (TREE_CODE (index) == NOP_EXPR
2245 || TREE_CODE (index) == POINTER_PLUS_EXPR))
09b42213 2246 {
2247 /* This is an initializer for an empty base; now that we've
2248 checked that it's constant, we can ignore it. */
cf72f34d 2249 gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (index))));
2250 changed = true;
2251 }
2252 else if (new_ctx.ctor != ctx->ctor)
2253 {
2254 /* We appended this element above; update the value. */
2255 gcc_assert ((*p)->last().index == index);
2256 (*p)->last().value = elt;
09b42213 2257 }
2258 else
cf72f34d 2259 CONSTRUCTOR_APPEND_ELT (*p, index, elt);
09b42213 2260 }
2261 if (*non_constant_p || !changed)
cf72f34d 2262 return t;
2263 t = ctx->ctor;
2264 /* We're done building this CONSTRUCTOR, so now we can interpret an
2265 element without an explicit initializer as value-initialized. */
2266 CONSTRUCTOR_NO_IMPLICIT_ZERO (t) = false;
76249021 2267 if (VECTOR_TYPE_P (TREE_TYPE (t)))
09b42213 2268 t = fold (t);
2269 return t;
2270}
2271
2272/* Subroutine of cxx_eval_constant_expression.
2273 The expression tree T is a VEC_INIT_EXPR which denotes the desired
2274 initialization of a non-static data member of array type. Reduce it to a
2275 CONSTRUCTOR.
2276
2277 Note that apart from value-initialization (when VALUE_INIT is true),
2278 this is only intended to support value-initialization and the
2279 initializations done by defaulted constructors for classes with
2280 non-static data members of array type. In this case, VEC_INIT_EXPR_INIT
2281 will either be NULL_TREE for the default constructor, or a COMPONENT_REF
2282 for the copy/move constructor. */
2283
2284static tree
cf72f34d 2285cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
1227ba74 2286 bool value_init, bool lval,
09b42213 2287 bool *non_constant_p, bool *overflow_p)
2288{
2289 tree elttype = TREE_TYPE (atype);
3e520b97 2290 unsigned HOST_WIDE_INT max = tree_to_uhwi (array_type_nelts_top (atype));
cf72f34d 2291 verify_ctor_sanity (ctx, atype);
2292 vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
2293 vec_alloc (*p, max + 1);
09b42213 2294 bool pre_init = false;
3e520b97 2295 unsigned HOST_WIDE_INT i;
09b42213 2296
2297 /* For the default constructor, build up a call to the default
2298 constructor of the element type. We only need to handle class types
2299 here, as for a constructor to be constexpr, all members must be
2300 initialized, which for a defaulted default constructor means they must
2301 be of a class type with a constexpr default constructor. */
2302 if (TREE_CODE (elttype) == ARRAY_TYPE)
2303 /* We only do this at the lowest level. */;
2304 else if (value_init)
2305 {
2306 init = build_value_init (elttype, tf_warning_or_error);
09b42213 2307 pre_init = true;
2308 }
2309 else if (!init)
2310 {
2311 vec<tree, va_gc> *argvec = make_tree_vector ();
2312 init = build_special_member_call (NULL_TREE, complete_ctor_identifier,
2313 &argvec, elttype, LOOKUP_NORMAL,
2314 tf_warning_or_error);
2315 release_tree_vector (argvec);
9c96033c 2316 init = build_aggr_init_expr (TREE_TYPE (init), init);
09b42213 2317 pre_init = true;
2318 }
2319
3e520b97 2320 for (i = 0; i < max; ++i)
09b42213 2321 {
2322 tree idx = build_int_cst (size_type_node, i);
2323 tree eltinit;
cf72f34d 2324 constexpr_ctx new_ctx;
2325 init_subob_ctx (ctx, new_ctx, idx, pre_init ? init : elttype);
2326 if (new_ctx.ctor != ctx->ctor)
2327 CONSTRUCTOR_APPEND_ELT (*p, idx, new_ctx.ctor);
09b42213 2328 if (TREE_CODE (elttype) == ARRAY_TYPE)
2329 {
2330 /* A multidimensional array; recurse. */
2331 if (value_init || init == NULL_TREE)
2332 eltinit = NULL_TREE;
2333 else
2334 eltinit = cp_build_array_ref (input_location, init, idx,
2335 tf_warning_or_error);
cf72f34d 2336 eltinit = cxx_eval_vec_init_1 (&new_ctx, elttype, eltinit, value_init,
1227ba74 2337 lval,
09b42213 2338 non_constant_p, overflow_p);
2339 }
2340 else if (pre_init)
2341 {
2342 /* Initializing an element using value or default initialization
2343 we just pre-built above. */
cf72f34d 2344 eltinit = (cxx_eval_constant_expression
f83e6885 2345 (&new_ctx, init,
1227ba74 2346 lval, non_constant_p, overflow_p));
09b42213 2347 }
2348 else
2349 {
2350 /* Copying an element. */
2351 gcc_assert (same_type_ignoring_top_level_qualifiers_p
2352 (atype, TREE_TYPE (init)));
2353 eltinit = cp_build_array_ref (input_location, init, idx,
2354 tf_warning_or_error);
2355 if (!real_lvalue_p (init))
2356 eltinit = move (eltinit);
2357 eltinit = force_rvalue (eltinit, tf_warning_or_error);
cf72f34d 2358 eltinit = (cxx_eval_constant_expression
1227ba74 2359 (&new_ctx, eltinit, lval,
b2a43197 2360 non_constant_p, overflow_p));
09b42213 2361 }
f83e6885 2362 if (*non_constant_p && !ctx->quiet)
cf72f34d 2363 break;
2364 if (new_ctx.ctor != ctx->ctor)
2365 {
2366 /* We appended this element above; update the value. */
2367 gcc_assert ((*p)->last().index == idx);
2368 (*p)->last().value = eltinit;
2369 }
2370 else
2371 CONSTRUCTOR_APPEND_ELT (*p, idx, eltinit);
09b42213 2372 }
2373
2374 if (!*non_constant_p)
2375 {
cf72f34d 2376 init = ctx->ctor;
2377 CONSTRUCTOR_NO_IMPLICIT_ZERO (init) = false;
09b42213 2378 }
09b42213 2379 return init;
2380}
2381
2382static tree
cf72f34d 2383cxx_eval_vec_init (const constexpr_ctx *ctx, tree t,
1227ba74 2384 bool lval,
09b42213 2385 bool *non_constant_p, bool *overflow_p)
2386{
2387 tree atype = TREE_TYPE (t);
2388 tree init = VEC_INIT_EXPR_INIT (t);
cf72f34d 2389 tree r = cxx_eval_vec_init_1 (ctx, atype, init,
09b42213 2390 VEC_INIT_EXPR_VALUE_INIT (t),
1227ba74 2391 lval, non_constant_p, overflow_p);
09b42213 2392 if (*non_constant_p)
2393 return t;
2394 else
2395 return r;
2396}
2397
2398/* A less strict version of fold_indirect_ref_1, which requires cv-quals to
2399 match. We want to be less strict for simple *& folding; if we have a
2400 non-const temporary that we access through a const pointer, that should
2401 work. We handle this here rather than change fold_indirect_ref_1
2402 because we're dealing with things like ADDR_EXPR of INTEGER_CST which
2403 don't really make sense outside of constant expression evaluation. Also
2404 we want to allow folding to COMPONENT_REF, which could cause trouble
2405 with TBAA in fold_indirect_ref_1.
2406
2407 Try to keep this function synced with fold_indirect_ref_1. */
2408
2409static tree
2410cxx_fold_indirect_ref (location_t loc, tree type, tree op0, bool *empty_base)
2411{
2412 tree sub, subtype;
2413
2414 sub = op0;
2415 STRIP_NOPS (sub);
2416 subtype = TREE_TYPE (sub);
2417 if (!POINTER_TYPE_P (subtype))
2418 return NULL_TREE;
2419
2420 if (TREE_CODE (sub) == ADDR_EXPR)
2421 {
2422 tree op = TREE_OPERAND (sub, 0);
2423 tree optype = TREE_TYPE (op);
2424
2425 /* *&CONST_DECL -> to the value of the const decl. */
2426 if (TREE_CODE (op) == CONST_DECL)
2427 return DECL_INITIAL (op);
2428 /* *&p => p; make sure to handle *&"str"[cst] here. */
c4118b0c 2429 if (same_type_ignoring_top_level_qualifiers_p (optype, type)
2430 /* Also handle the case where the desired type is an array of unknown
2431 bounds because the variable has had its bounds deduced since the
2432 ADDR_EXPR was created. */
2433 || (TREE_CODE (type) == ARRAY_TYPE
2434 && TREE_CODE (optype) == ARRAY_TYPE
2435 && TYPE_DOMAIN (type) == NULL_TREE
2436 && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (optype),
2437 TREE_TYPE (type))))
09b42213 2438 {
2439 tree fop = fold_read_from_constant_string (op);
2440 if (fop)
2441 return fop;
2442 else
2443 return op;
2444 }
2445 /* *(foo *)&fooarray => fooarray[0] */
2446 else if (TREE_CODE (optype) == ARRAY_TYPE
2447 && (same_type_ignoring_top_level_qualifiers_p
2448 (type, TREE_TYPE (optype))))
2449 {
2450 tree type_domain = TYPE_DOMAIN (optype);
2451 tree min_val = size_zero_node;
2452 if (type_domain && TYPE_MIN_VALUE (type_domain))
2453 min_val = TYPE_MIN_VALUE (type_domain);
2454 return build4_loc (loc, ARRAY_REF, type, op, min_val,
2455 NULL_TREE, NULL_TREE);
2456 }
2457 /* *(foo *)&complexfoo => __real__ complexfoo */
2458 else if (TREE_CODE (optype) == COMPLEX_TYPE
2459 && (same_type_ignoring_top_level_qualifiers_p
2460 (type, TREE_TYPE (optype))))
2461 return fold_build1_loc (loc, REALPART_EXPR, type, op);
2462 /* *(foo *)&vectorfoo => BIT_FIELD_REF<vectorfoo,...> */
76249021 2463 else if (VECTOR_TYPE_P (optype)
09b42213 2464 && (same_type_ignoring_top_level_qualifiers_p
2465 (type, TREE_TYPE (optype))))
2466 {
2467 tree part_width = TYPE_SIZE (type);
2468 tree index = bitsize_int (0);
2469 return fold_build3_loc (loc, BIT_FIELD_REF, type, op, part_width, index);
2470 }
2471 /* Also handle conversion to an empty base class, which
2472 is represented with a NOP_EXPR. */
2473 else if (is_empty_class (type)
2474 && CLASS_TYPE_P (optype)
2475 && DERIVED_FROM_P (type, optype))
2476 {
2477 *empty_base = true;
2478 return op;
2479 }
2480 /* *(foo *)&struct_with_foo_field => COMPONENT_REF */
2481 else if (RECORD_OR_UNION_TYPE_P (optype))
2482 {
2483 tree field = TYPE_FIELDS (optype);
2484 for (; field; field = DECL_CHAIN (field))
2485 if (TREE_CODE (field) == FIELD_DECL
2486 && integer_zerop (byte_position (field))
2487 && (same_type_ignoring_top_level_qualifiers_p
2488 (TREE_TYPE (field), type)))
2489 {
2490 return fold_build3 (COMPONENT_REF, type, op, field, NULL_TREE);
2491 break;
2492 }
2493 }
2494 }
2495 else if (TREE_CODE (sub) == POINTER_PLUS_EXPR
2496 && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
2497 {
2498 tree op00 = TREE_OPERAND (sub, 0);
2499 tree op01 = TREE_OPERAND (sub, 1);
2500
2501 STRIP_NOPS (op00);
2502 if (TREE_CODE (op00) == ADDR_EXPR)
2503 {
2504 tree op00type;
2505 op00 = TREE_OPERAND (op00, 0);
2506 op00type = TREE_TYPE (op00);
2507
2508 /* ((foo*)&vectorfoo)[1] => BIT_FIELD_REF<vectorfoo,...> */
76249021 2509 if (VECTOR_TYPE_P (op00type)
09b42213 2510 && (same_type_ignoring_top_level_qualifiers_p
2511 (type, TREE_TYPE (op00type))))
2512 {
2513 HOST_WIDE_INT offset = tree_to_shwi (op01);
2514 tree part_width = TYPE_SIZE (type);
2515 unsigned HOST_WIDE_INT part_widthi = tree_to_shwi (part_width)/BITS_PER_UNIT;
2516 unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
2517 tree index = bitsize_int (indexi);
2518
2519 if (offset / part_widthi < TYPE_VECTOR_SUBPARTS (op00type))
2520 return fold_build3_loc (loc,
2521 BIT_FIELD_REF, type, op00,
2522 part_width, index);
2523
2524 }
2525 /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
2526 else if (TREE_CODE (op00type) == COMPLEX_TYPE
2527 && (same_type_ignoring_top_level_qualifiers_p
2528 (type, TREE_TYPE (op00type))))
2529 {
2530 tree size = TYPE_SIZE_UNIT (type);
2531 if (tree_int_cst_equal (size, op01))
2532 return fold_build1_loc (loc, IMAGPART_EXPR, type, op00);
2533 }
2534 /* ((foo *)&fooarray)[1] => fooarray[1] */
2535 else if (TREE_CODE (op00type) == ARRAY_TYPE
2536 && (same_type_ignoring_top_level_qualifiers_p
2537 (type, TREE_TYPE (op00type))))
2538 {
2539 tree type_domain = TYPE_DOMAIN (op00type);
2540 tree min_val = size_zero_node;
2541 if (type_domain && TYPE_MIN_VALUE (type_domain))
2542 min_val = TYPE_MIN_VALUE (type_domain);
2543 op01 = size_binop_loc (loc, EXACT_DIV_EXPR, op01,
2544 TYPE_SIZE_UNIT (type));
2545 op01 = size_binop_loc (loc, PLUS_EXPR, op01, min_val);
2546 return build4_loc (loc, ARRAY_REF, type, op00, op01,
2547 NULL_TREE, NULL_TREE);
2548 }
2549 /* Also handle conversion to an empty base class, which
2550 is represented with a NOP_EXPR. */
2551 else if (is_empty_class (type)
2552 && CLASS_TYPE_P (op00type)
2553 && DERIVED_FROM_P (type, op00type))
2554 {
2555 *empty_base = true;
2556 return op00;
2557 }
2558 /* ((foo *)&struct_with_foo_field)[1] => COMPONENT_REF */
2559 else if (RECORD_OR_UNION_TYPE_P (op00type))
2560 {
2561 tree field = TYPE_FIELDS (op00type);
2562 for (; field; field = DECL_CHAIN (field))
2563 if (TREE_CODE (field) == FIELD_DECL
2564 && tree_int_cst_equal (byte_position (field), op01)
2565 && (same_type_ignoring_top_level_qualifiers_p
2566 (TREE_TYPE (field), type)))
2567 {
2568 return fold_build3 (COMPONENT_REF, type, op00,
01b280db 2569 field, NULL_TREE);
09b42213 2570 break;
2571 }
2572 }
2573 }
2574 }
2575 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
2576 else if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
2577 && (same_type_ignoring_top_level_qualifiers_p
2578 (type, TREE_TYPE (TREE_TYPE (subtype)))))
2579 {
2580 tree type_domain;
2581 tree min_val = size_zero_node;
2582 tree newsub = cxx_fold_indirect_ref (loc, TREE_TYPE (subtype), sub, NULL);
2583 if (newsub)
2584 sub = newsub;
2585 else
2586 sub = build1_loc (loc, INDIRECT_REF, TREE_TYPE (subtype), sub);
2587 type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
2588 if (type_domain && TYPE_MIN_VALUE (type_domain))
2589 min_val = TYPE_MIN_VALUE (type_domain);
2590 return build4_loc (loc, ARRAY_REF, type, sub, min_val, NULL_TREE,
2591 NULL_TREE);
2592 }
2593
2594 return NULL_TREE;
2595}
2596
2597static tree
cf72f34d 2598cxx_eval_indirect_ref (const constexpr_ctx *ctx, tree t,
1227ba74 2599 bool lval,
09b42213 2600 bool *non_constant_p, bool *overflow_p)
2601{
2602 tree orig_op0 = TREE_OPERAND (t, 0);
09b42213 2603 bool empty_base = false;
09b42213 2604
d2c63826 2605 /* We can handle a MEM_REF like an INDIRECT_REF, if MEM_REF's second
2606 operand is an integer-zero. Otherwise reject the MEM_REF for now. */
2607
2608 if (TREE_CODE (t) == MEM_REF
2609 && (!TREE_OPERAND (t, 1) || !integer_zerop (TREE_OPERAND (t, 1))))
2610 {
2611 gcc_assert (ctx->quiet);
2612 *non_constant_p = true;
2613 return t;
2614 }
2615
7e0f3388 2616 /* First try to simplify it directly. */
2617 tree r = cxx_fold_indirect_ref (EXPR_LOCATION (t), TREE_TYPE (t), orig_op0,
2618 &empty_base);
2619 if (!r)
09b42213 2620 {
7e0f3388 2621 /* If that didn't work, evaluate the operand first. */
2622 tree op0 = cxx_eval_constant_expression (ctx, orig_op0,
2623 /*lval*/false, non_constant_p,
2624 overflow_p);
2625 /* Don't VERIFY_CONSTANT here. */
2626 if (*non_constant_p)
2627 return t;
2628
2629 r = cxx_fold_indirect_ref (EXPR_LOCATION (t), TREE_TYPE (t), op0,
2630 &empty_base);
2631 if (r == NULL_TREE)
09b42213 2632 {
2633 /* We couldn't fold to a constant value. Make sure it's not
2634 something we should have been able to fold. */
7e0f3388 2635 tree sub = op0;
2636 STRIP_NOPS (sub);
2637 if (TREE_CODE (sub) == ADDR_EXPR)
2638 {
2639 gcc_assert (!same_type_ignoring_top_level_qualifiers_p
2640 (TREE_TYPE (TREE_TYPE (sub)), TREE_TYPE (t)));
2641 /* DR 1188 says we don't have to deal with this. */
2642 if (!ctx->quiet)
2643 error ("accessing value of %qE through a %qT glvalue in a "
2644 "constant expression", build_fold_indirect_ref (sub),
2645 TREE_TYPE (t));
2646 *non_constant_p = true;
2647 return t;
2648 }
2649
2650 if (lval && op0 != orig_op0)
2651 return build1 (INDIRECT_REF, TREE_TYPE (t), op0);
2652 if (!lval)
2653 VERIFY_CONSTANT (t);
09b42213 2654 return t;
2655 }
2656 }
2657
7e0f3388 2658 r = cxx_eval_constant_expression (ctx, r,
2659 lval, non_constant_p, overflow_p);
2660 if (*non_constant_p)
2661 return t;
2662
09b42213 2663 /* If we're pulling out the value of an empty base, make sure
2664 that the whole object is constant and then return an empty
2665 CONSTRUCTOR. */
1227ba74 2666 if (empty_base && !lval)
09b42213 2667 {
2668 VERIFY_CONSTANT (r);
2669 r = build_constructor (TREE_TYPE (t), NULL);
2670 TREE_CONSTANT (r) = true;
2671 }
2672
09b42213 2673 return r;
2674}
2675
2676/* Complain about R, a VAR_DECL, not being usable in a constant expression.
2677 Shared between potential_constant_expression and
2678 cxx_eval_constant_expression. */
2679
2680static void
2681non_const_var_error (tree r)
2682{
2683 tree type = TREE_TYPE (r);
2684 error ("the value of %qD is not usable in a constant "
2685 "expression", r);
2686 /* Avoid error cascade. */
2687 if (DECL_INITIAL (r) == error_mark_node)
2688 return;
2689 if (DECL_DECLARED_CONSTEXPR_P (r))
2690 inform (DECL_SOURCE_LOCATION (r),
2691 "%qD used in its own initializer", r);
2692 else if (INTEGRAL_OR_ENUMERATION_TYPE_P (type))
2693 {
2694 if (!CP_TYPE_CONST_P (type))
2695 inform (DECL_SOURCE_LOCATION (r),
2696 "%q#D is not const", r);
2697 else if (CP_TYPE_VOLATILE_P (type))
2698 inform (DECL_SOURCE_LOCATION (r),
2699 "%q#D is volatile", r);
2700 else if (!DECL_INITIAL (r)
2701 || !TREE_CONSTANT (DECL_INITIAL (r)))
2702 inform (DECL_SOURCE_LOCATION (r),
2703 "%qD was not initialized with a constant "
2704 "expression", r);
2705 else
2706 gcc_unreachable ();
2707 }
2708 else
2709 {
2710 if (cxx_dialect >= cxx11 && !DECL_DECLARED_CONSTEXPR_P (r))
2711 inform (DECL_SOURCE_LOCATION (r),
2712 "%qD was not declared %<constexpr%>", r);
2713 else
2714 inform (DECL_SOURCE_LOCATION (r),
2715 "%qD does not have integral or enumeration type",
2716 r);
2717 }
2718}
2719
2720/* Subroutine of cxx_eval_constant_expression.
2721 Like cxx_eval_unary_expression, except for trinary expressions. */
2722
2723static tree
cf72f34d 2724cxx_eval_trinary_expression (const constexpr_ctx *ctx, tree t,
1227ba74 2725 bool lval,
09b42213 2726 bool *non_constant_p, bool *overflow_p)
2727{
2728 int i;
2729 tree args[3];
2730 tree val;
2731
2732 for (i = 0; i < 3; i++)
2733 {
cf72f34d 2734 args[i] = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, i),
1227ba74 2735 lval,
b2a43197 2736 non_constant_p, overflow_p);
09b42213 2737 VERIFY_CONSTANT (args[i]);
2738 }
2739
2740 val = fold_ternary_loc (EXPR_LOCATION (t), TREE_CODE (t), TREE_TYPE (t),
2741 args[0], args[1], args[2]);
2742 if (val == NULL_TREE)
2743 return t;
2744 VERIFY_CONSTANT (val);
2745 return val;
2746}
2747
2748bool
2749var_in_constexpr_fn (tree t)
2750{
2751 tree ctx = DECL_CONTEXT (t);
2752 return (cxx_dialect >= cxx14 && ctx && TREE_CODE (ctx) == FUNCTION_DECL
2753 && DECL_DECLARED_CONSTEXPR_P (ctx));
2754}
2755
9c96033c 2756/* Evaluate an INIT_EXPR or MODIFY_EXPR. */
2757
2758static tree
2759cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
1227ba74 2760 bool lval,
9c96033c 2761 bool *non_constant_p, bool *overflow_p)
2762{
2763 constexpr_ctx new_ctx = *ctx;
2764
8a36d0ec 2765 tree init = TREE_OPERAND (t, 1);
2766 if (TREE_CLOBBER_P (init))
2767 /* Just ignore clobbers. */
2768 return void_node;
2769
9c96033c 2770 /* First we figure out where we're storing to. */
2771 tree target = TREE_OPERAND (t, 0);
9db9fc38 2772 tree type = TREE_TYPE (target);
9c96033c 2773 target = cxx_eval_constant_expression (ctx, target,
f83e6885 2774 true,
b2a43197 2775 non_constant_p, overflow_p);
9c96033c 2776 if (*non_constant_p)
2777 return t;
2778
9db9fc38 2779 if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (target), type))
2780 {
2781 /* For initialization of an empty base, the original target will be
2782 *(base*)this, which the above evaluation resolves to the object
2783 argument, which has the derived type rather than the base type. In
2784 this situation, just evaluate the initializer and return, since
2785 there's no actual data to store. */
2786 gcc_assert (is_empty_class (type));
2787 return cxx_eval_constant_expression (ctx, init, false,
2788 non_constant_p, overflow_p);
2789 }
2790
9c96033c 2791 /* And then find the underlying variable. */
2792 vec<tree,va_gc> *refs = make_tree_vector();
2793 tree object = NULL_TREE;
2794 for (tree probe = target; object == NULL_TREE; )
2795 {
2796 switch (TREE_CODE (probe))
2797 {
2798 case BIT_FIELD_REF:
2799 case COMPONENT_REF:
2800 case ARRAY_REF:
2801 vec_safe_push (refs, TREE_OPERAND (probe, 1));
2802 vec_safe_push (refs, TREE_TYPE (probe));
2803 probe = TREE_OPERAND (probe, 0);
2804 break;
2805
2806 default:
2807 object = probe;
9c96033c 2808 }
2809 }
2810
2811 /* And then find/build up our initializer for the path to the subobject
2812 we're initializing. */
6fe83e54 2813 tree *valp;
2814 if (DECL_P (object))
2815 valp = ctx->values->get (object);
2816 else
2817 valp = NULL;
9c96033c 2818 if (!valp)
2819 {
2820 /* A constant-expression cannot modify objects from outside the
2821 constant-expression. */
f83e6885 2822 if (!ctx->quiet)
6fe83e54 2823 error ("modification of %qE is not a constant-expression", object);
9c96033c 2824 *non_constant_p = true;
2825 return t;
2826 }
9db9fc38 2827 type = TREE_TYPE (object);
a02b42fe 2828 bool no_zero_init = true;
9c96033c 2829 while (!refs->is_empty())
2830 {
2831 if (*valp == NULL_TREE)
2832 {
2833 *valp = build_constructor (type, NULL);
a02b42fe 2834 CONSTRUCTOR_NO_IMPLICIT_ZERO (*valp) = no_zero_init;
9c96033c 2835 }
a02b42fe 2836 /* If the value of object is already zero-initialized, any new ctors for
2837 subobjects will also be zero-initialized. */
2838 no_zero_init = CONSTRUCTOR_NO_IMPLICIT_ZERO (*valp);
9c96033c 2839
7963b19d 2840 enum tree_code code = TREE_CODE (type);
9c96033c 2841 type = refs->pop();
7963b19d 2842 tree index = refs->pop();
9c96033c 2843
9c96033c 2844 constructor_elt *cep = NULL;
7963b19d 2845 if (code == ARRAY_TYPE)
2846 {
2847 HOST_WIDE_INT i
2848 = find_array_ctor_elt (*valp, index, /*insert*/true);
2849 gcc_assert (i >= 0);
2850 cep = CONSTRUCTOR_ELT (*valp, i);
2851 gcc_assert (TREE_CODE (cep->index) != RANGE_EXPR);
2852 }
2853 else
2854 {
2855 gcc_assert (TREE_CODE (index) == FIELD_DECL);
2856 for (unsigned HOST_WIDE_INT idx = 0;
2857 vec_safe_iterate (CONSTRUCTOR_ELTS (*valp), idx, &cep);
2858 idx++)
2859 if (index == cep->index)
2860 break;
2861 if (!cep)
2862 {
2863 constructor_elt ce = { index, NULL_TREE };
2864 cep = vec_safe_push (CONSTRUCTOR_ELTS (*valp), ce);
2865 }
2866 }
9c96033c 2867 valp = &cep->value;
2868 }
2869 release_tree_vector (refs);
2870
469dc5a6 2871 if (AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type))
9c96033c 2872 {
2873 /* Create a new CONSTRUCTOR in case evaluation of the initializer
2874 wants to modify it. */
469dc5a6 2875 if (*valp == NULL_TREE)
6cded085 2876 {
2877 *valp = new_ctx.ctor = build_constructor (type, NULL);
2878 CONSTRUCTOR_NO_IMPLICIT_ZERO (new_ctx.ctor) = no_zero_init;
2879 }
2880 else
2881 new_ctx.ctor = *valp;
9c96033c 2882 new_ctx.object = target;
2883 }
2884
8a36d0ec 2885 init = cxx_eval_constant_expression (&new_ctx, init, false,
2886 non_constant_p, overflow_p);
9c96033c 2887 if (target == object)
469dc5a6 2888 {
2889 /* The hash table might have moved since the get earlier. */
2890 valp = ctx->values->get (object);
2891 if (TREE_CODE (init) == CONSTRUCTOR)
2892 /* An outer ctx->ctor might be pointing to *valp, so just replace
2893 its contents. */
2894 CONSTRUCTOR_ELTS (*valp) = CONSTRUCTOR_ELTS (init);
2895 else
2896 *valp = init;
2897 }
9c96033c 2898 else
2899 *valp = init;
2900
2901 if (*non_constant_p)
2902 return t;
1227ba74 2903 else if (lval)
9c96033c 2904 return target;
2905 else
dfac7dd2 2906 return init;
9c96033c 2907}
2908
2909/* Evaluate a ++ or -- expression. */
2910
2911static tree
2912cxx_eval_increment_expression (const constexpr_ctx *ctx, tree t,
1227ba74 2913 bool lval,
9c96033c 2914 bool *non_constant_p, bool *overflow_p)
2915{
2916 enum tree_code code = TREE_CODE (t);
2917 tree type = TREE_TYPE (t);
2918 tree op = TREE_OPERAND (t, 0);
2919 tree offset = TREE_OPERAND (t, 1);
2920 gcc_assert (TREE_CONSTANT (offset));
2921
2922 /* The operand as an lvalue. */
f83e6885 2923 op = cxx_eval_constant_expression (ctx, op, true,
b2a43197 2924 non_constant_p, overflow_p);
9c96033c 2925
2926 /* The operand as an rvalue. */
2927 tree val = rvalue (op);
f83e6885 2928 val = cxx_eval_constant_expression (ctx, val, false,
b2a43197 2929 non_constant_p, overflow_p);
35f2c28f 2930 /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
2931 a local array in a constexpr function. */
2932 bool ptr = POINTER_TYPE_P (TREE_TYPE (val));
2933 if (!ptr)
2934 VERIFY_CONSTANT (val);
9c96033c 2935
2936 /* The modified value. */
2937 bool inc = (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR);
c8a8f7ad 2938 tree mod;
2939 if (POINTER_TYPE_P (type))
2940 {
2941 /* The middle end requires pointers to use POINTER_PLUS_EXPR. */
2942 offset = convert_to_ptrofftype (offset);
2943 if (!inc)
2944 offset = fold_build1 (NEGATE_EXPR, TREE_TYPE (offset), offset);
2945 mod = fold_build2 (POINTER_PLUS_EXPR, type, val, offset);
2946 }
2947 else
2948 mod = fold_build2 (inc ? PLUS_EXPR : MINUS_EXPR, type, val, offset);
35f2c28f 2949 if (!ptr)
2950 VERIFY_CONSTANT (mod);
9c96033c 2951
2952 /* Storing the modified value. */
2953 tree store = build2 (MODIFY_EXPR, type, op, mod);
f83e6885 2954 cxx_eval_constant_expression (ctx, store,
b2a43197 2955 true, non_constant_p, overflow_p);
9c96033c 2956
2957 /* And the value of the expression. */
2958 if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
2959 {
2960 /* Prefix ops are lvalues. */
1227ba74 2961 if (lval)
9c96033c 2962 return op;
2963 else
2964 /* But we optimize when the caller wants an rvalue. */
2965 return mod;
2966 }
2967 else
2968 /* Postfix ops are rvalues. */
2969 return val;
2970}
2971
00f21715 2972/* Predicates for the meaning of *jump_target. */
2973
2974static bool
2975returns (tree *jump_target)
2976{
2977 return *jump_target
2978 && TREE_CODE (*jump_target) == RETURN_EXPR;
2979}
2980
2981static bool
2982breaks (tree *jump_target)
2983{
2984 return *jump_target
2985 && TREE_CODE (*jump_target) == LABEL_DECL
2986 && LABEL_DECL_BREAK (*jump_target);
2987}
2988
2989static bool
2990continues (tree *jump_target)
2991{
2992 return *jump_target
2993 && TREE_CODE (*jump_target) == LABEL_DECL
2994 && LABEL_DECL_CONTINUE (*jump_target);
2995}
2996
2997static bool
2998switches (tree *jump_target)
2999{
3000 return *jump_target
3001 && TREE_CODE (*jump_target) == INTEGER_CST;
3002}
3003
3004/* Subroutine of cxx_eval_statement_list. Determine whether the statement
3005 at I matches *jump_target. If we're looking for a case label and we see
3006 the default label, copy I into DEFAULT_LABEL. */
3007
3008static bool
3009label_matches (tree *jump_target, tree_stmt_iterator i,
3010 tree_stmt_iterator& default_label)
3011{
3012 tree stmt = tsi_stmt (i);
3013 switch (TREE_CODE (*jump_target))
3014 {
3015 case LABEL_DECL:
3016 if (TREE_CODE (stmt) == LABEL_EXPR
3017 && LABEL_EXPR_LABEL (stmt) == *jump_target)
3018 return true;
3019 break;
3020
3021 case INTEGER_CST:
3022 if (TREE_CODE (stmt) == CASE_LABEL_EXPR)
3023 {
3024 if (!CASE_LOW (stmt))
3025 default_label = i;
3026 else if (tree_int_cst_equal (*jump_target, CASE_LOW (stmt)))
3027 return true;
3028 }
3029 break;
3030
3031 default:
3032 gcc_unreachable ();
3033 }
3034 return false;
3035}
3036
3037/* Evaluate a STATEMENT_LIST for side-effects. Handles various jump
3038 semantics, for switch, break, continue, and return. */
3039
3040static tree
3041cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
00f21715 3042 bool *non_constant_p, bool *overflow_p,
3043 tree *jump_target)
3044{
3045 tree_stmt_iterator i;
3046 tree_stmt_iterator default_label = tree_stmt_iterator();
da7981e0 3047 tree local_target;
3048 /* In a statement-expression we want to return the last value. */
3049 tree r = NULL_TREE;
3050 if (!jump_target)
3051 {
3052 local_target = NULL_TREE;
3053 jump_target = &local_target;
3054 }
00f21715 3055 for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
3056 {
3057 reenter:
3058 tree stmt = tsi_stmt (i);
3059 if (*jump_target)
3060 {
3061 if (TREE_CODE (stmt) == STATEMENT_LIST)
3062 /* The label we want might be inside. */;
3063 else if (label_matches (jump_target, i, default_label))
3064 /* Found it. */
3065 *jump_target = NULL_TREE;
3066 else
3067 continue;
3068 }
da7981e0 3069 r = cxx_eval_constant_expression (ctx, stmt, false,
3070 non_constant_p, overflow_p,
3071 jump_target);
00f21715 3072 if (*non_constant_p)
3073 break;
3074 if (returns (jump_target) || breaks (jump_target))
3075 break;
3076 }
3077 if (switches (jump_target) && !tsi_end_p (default_label))
3078 {
3079 i = default_label;
3080 *jump_target = NULL_TREE;
3081 goto reenter;
3082 }
da7981e0 3083 return r;
00f21715 3084}
3085
3086/* Evaluate a LOOP_EXPR for side-effects. Handles break and return
3087 semantics; continue semantics are covered by cxx_eval_statement_list. */
3088
3089static tree
3090cxx_eval_loop_expr (const constexpr_ctx *ctx, tree t,
00f21715 3091 bool *non_constant_p, bool *overflow_p,
3092 tree *jump_target)
3093{
3094 tree body = TREE_OPERAND (t, 0);
3095 while (true)
3096 {
f83e6885 3097 cxx_eval_statement_list (ctx, body,
00f21715 3098 non_constant_p, overflow_p, jump_target);
b0295f63 3099 if (returns (jump_target) || breaks (jump_target) || *non_constant_p)
00f21715 3100 break;
3101 }
3102 if (breaks (jump_target))
3103 *jump_target = NULL_TREE;
3104 return NULL_TREE;
3105}
3106
3107/* Evaluate a SWITCH_EXPR for side-effects. Handles switch and break jump
3108 semantics. */
3109
3110static tree
3111cxx_eval_switch_expr (const constexpr_ctx *ctx, tree t,
00f21715 3112 bool *non_constant_p, bool *overflow_p,
3113 tree *jump_target)
3114{
3115 tree cond = TREE_OPERAND (t, 0);
f83e6885 3116 cond = cxx_eval_constant_expression (ctx, cond, false,
b2a43197 3117 non_constant_p, overflow_p);
00f21715 3118 VERIFY_CONSTANT (cond);
3119 *jump_target = cond;
3120
3121 tree body = TREE_OPERAND (t, 1);
f83e6885 3122 cxx_eval_statement_list (ctx, body,
00f21715 3123 non_constant_p, overflow_p, jump_target);
3124 if (breaks (jump_target) || switches (jump_target))
3125 *jump_target = NULL_TREE;
3126 return NULL_TREE;
3127}
3128
35b68da8 3129/* Subroutine of cxx_eval_constant_expression.
3130 Attempt to reduce a POINTER_PLUS_EXPR expression T. */
3131
3132static tree
3133cxx_eval_pointer_plus_expression (const constexpr_ctx *ctx, tree t,
3134 bool lval, bool *non_constant_p,
3135 bool *overflow_p)
3136{
51a019c5 3137 tree orig_type = TREE_TYPE (t);
35b68da8 3138 tree op00 = TREE_OPERAND (t, 0);
3139 tree op01 = TREE_OPERAND (t, 1);
3140 location_t loc = EXPR_LOCATION (t);
3141
f070a770 3142 op00 = cxx_eval_constant_expression (ctx, op00, lval,
3143 non_constant_p, overflow_p);
3144
35b68da8 3145 STRIP_NOPS (op00);
3146 if (TREE_CODE (op00) != ADDR_EXPR)
3147 return NULL_TREE;
3148
d2c63826 3149 op01 = cxx_eval_constant_expression (ctx, op01, lval,
3150 non_constant_p, overflow_p);
35b68da8 3151 op00 = TREE_OPERAND (op00, 0);
3152
3153 /* &A[i] p+ j => &A[i + j] */
3154 if (TREE_CODE (op00) == ARRAY_REF
3155 && TREE_CODE (TREE_OPERAND (op00, 1)) == INTEGER_CST
51a019c5 3156 && TREE_CODE (op01) == INTEGER_CST
3157 && TYPE_SIZE_UNIT (TREE_TYPE (op00))
3158 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (op00))) == INTEGER_CST)
35b68da8 3159 {
3160 tree type = TREE_TYPE (op00);
3161 t = fold_convert_loc (loc, ssizetype, TREE_OPERAND (op00, 1));
3162 tree nelts = array_type_nelts_top (TREE_TYPE (TREE_OPERAND (op00, 0)));
3163 /* Don't fold an out-of-bound access. */
3164 if (!tree_int_cst_le (t, nelts))
3165 return NULL_TREE;
51a019c5 3166 op01 = cp_fold_convert (ssizetype, op01);
3167 /* Don't fold if op01 can't be divided exactly by TYPE_SIZE_UNIT.
3168 constexpr int A[1]; ... (char *)&A[0] + 1 */
3169 if (!integer_zerop (fold_build2_loc (loc, TRUNC_MOD_EXPR, sizetype,
3170 op01, TYPE_SIZE_UNIT (type))))
3171 return NULL_TREE;
35b68da8 3172 /* Make sure to treat the second operand of POINTER_PLUS_EXPR
3173 as signed. */
51a019c5 3174 op01 = fold_build2_loc (loc, EXACT_DIV_EXPR, ssizetype, op01,
35b68da8 3175 TYPE_SIZE_UNIT (type));
3176 t = size_binop_loc (loc, PLUS_EXPR, op01, t);
3177 t = build4_loc (loc, ARRAY_REF, type, TREE_OPERAND (op00, 0),
3178 t, NULL_TREE, NULL_TREE);
3179 t = cp_build_addr_expr (t, tf_warning_or_error);
51a019c5 3180 t = cp_fold_convert (orig_type, t);
35b68da8 3181 return cxx_eval_constant_expression (ctx, t, lval, non_constant_p,
3182 overflow_p);
3183 }
3184
3185 return NULL_TREE;
3186}
3187
09b42213 3188/* Attempt to reduce the expression T to a constant value.
3189 On failure, issue diagnostic and return error_mark_node. */
3190/* FIXME unify with c_fully_fold */
9c96033c 3191/* FIXME overflow_p is too global */
09b42213 3192
3193static tree
cf72f34d 3194cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
1227ba74 3195 bool lval,
00f21715 3196 bool *non_constant_p, bool *overflow_p,
3197 tree *jump_target)
09b42213 3198{
cf72f34d 3199 constexpr_ctx new_ctx;
09b42213 3200 tree r = t;
3201
3202 if (t == error_mark_node)
3203 {
3204 *non_constant_p = true;
3205 return t;
3206 }
3207 if (CONSTANT_CLASS_P (t))
3208 {
f16ed232 3209 if (TREE_OVERFLOW (t) && (!flag_permissive || ctx->quiet))
09b42213 3210 *overflow_p = true;
3211 return t;
3212 }
09b42213 3213
3214 switch (TREE_CODE (t))
3215 {
9c96033c 3216 case RESULT_DECL:
1227ba74 3217 if (lval)
9c96033c 3218 return t;
3219 /* We ask for an rvalue for the RESULT_DECL when indirecting
92a9c89e 3220 through an invisible reference, or in named return value
3221 optimization. */
9c96033c 3222 return (*ctx->values->get (t));
3223
09b42213 3224 case VAR_DECL:
8b2b2f24 3225 case CONST_DECL:
3226 /* We used to not check lval for CONST_DECL, but darwin.c uses
3227 CONST_DECL for aggregate constants. */
1227ba74 3228 if (lval)
09b42213 3229 return t;
2055d27a 3230 if (ctx->strict)
3231 r = decl_really_constant_value (t);
3232 else
3233 r = decl_constant_value (t);
09b42213 3234 if (TREE_CODE (r) == TARGET_EXPR
3235 && TREE_CODE (TARGET_EXPR_INITIAL (r)) == CONSTRUCTOR)
3236 r = TARGET_EXPR_INITIAL (r);
f4ae4202 3237 if (VAR_P (r))
cf72f34d 3238 if (tree *p = ctx->values->get (r))
a143e277 3239 if (*p != NULL_TREE)
3240 r = *p;
09b42213 3241 if (DECL_P (r))
3242 {
f83e6885 3243 if (!ctx->quiet)
09b42213 3244 non_const_var_error (r);
3245 *non_constant_p = true;
3246 }
3247 break;
3248
3249 case FUNCTION_DECL:
3250 case TEMPLATE_DECL:
3251 case LABEL_DECL:
00f21715 3252 case LABEL_EXPR:
3253 case CASE_LABEL_EXPR:
09b42213 3254 return t;
3255
3256 case PARM_DECL:
88a59139 3257 if (lval && TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE)
9c96033c 3258 /* glvalue use. */;
3259 else if (tree *p = ctx->values->get (r))
3260 r = *p;
1227ba74 3261 else if (lval)
09b42213 3262 /* Defer in case this is only used for its type. */;
1eb418cc 3263 else if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
3264 /* Defer, there's no lvalue->rvalue conversion. */;
a6613de7 3265 else if (is_empty_class (TREE_TYPE (t)))
3266 {
3267 /* If the class is empty, we aren't actually loading anything. */
3268 r = build_constructor (TREE_TYPE (t), NULL);
3269 TREE_CONSTANT (r) = true;
3270 }
09b42213 3271 else
3272 {
f83e6885 3273 if (!ctx->quiet)
09b42213 3274 error ("%qE is not a constant expression", t);
3275 *non_constant_p = true;
3276 }
3277 break;
3278
3279 case CALL_EXPR:
3280 case AGGR_INIT_EXPR:
1227ba74 3281 r = cxx_eval_call_expression (ctx, t, lval,
09b42213 3282 non_constant_p, overflow_p);
3283 break;
3284
9c96033c 3285 case DECL_EXPR:
3286 {
3287 r = DECL_EXPR_DECL (t);
3288 if (AGGREGATE_TYPE_P (TREE_TYPE (r))
3289 || VECTOR_TYPE_P (TREE_TYPE (r)))
3290 {
3291 new_ctx = *ctx;
3292 new_ctx.object = r;
3293 new_ctx.ctor = build_constructor (TREE_TYPE (r), NULL);
3294 CONSTRUCTOR_NO_IMPLICIT_ZERO (new_ctx.ctor) = true;
3295 new_ctx.values->put (r, new_ctx.ctor);
3296 ctx = &new_ctx;
3297 }
3298
3299 if (tree init = DECL_INITIAL (r))
3300 {
3301 init = cxx_eval_constant_expression (ctx, init,
f83e6885 3302 false,
b2a43197 3303 non_constant_p, overflow_p);
9c96033c 3304 ctx->values->put (r, init);
3305 }
3306 else if (ctx == &new_ctx)
3307 /* We gave it a CONSTRUCTOR above. */;
3308 else
3309 ctx->values->put (r, NULL_TREE);
3310 }
3311 break;
3312
09b42213 3313 case TARGET_EXPR:
3314 if (!literal_type_p (TREE_TYPE (t)))
3315 {
f83e6885 3316 if (!ctx->quiet)
09b42213 3317 {
3318 error ("temporary of non-literal type %qT in a "
3319 "constant expression", TREE_TYPE (t));
3320 explain_non_literal_class (TREE_TYPE (t));
3321 }
3322 *non_constant_p = true;
3323 break;
3324 }
cf72f34d 3325 if ((AGGREGATE_TYPE_P (TREE_TYPE (t)) || VECTOR_TYPE_P (TREE_TYPE (t))))
3326 {
3327 /* We're being expanded without an explicit target, so start
3328 initializing a new object; expansion with an explicit target
3329 strips the TARGET_EXPR before we get here. */
3330 new_ctx = *ctx;
3331 new_ctx.ctor = build_constructor (TREE_TYPE (t), NULL);
3332 CONSTRUCTOR_NO_IMPLICIT_ZERO (new_ctx.ctor) = true;
3333 new_ctx.object = TARGET_EXPR_SLOT (t);
3334 ctx->values->put (new_ctx.object, new_ctx.ctor);
3335 ctx = &new_ctx;
3336 }
1227ba74 3337 /* Pass false for 'lval' because this indicates
09b42213 3338 initialization of a temporary. */
cf72f34d 3339 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
f83e6885 3340 false,
b2a43197 3341 non_constant_p, overflow_p);
09b42213 3342 if (!*non_constant_p)
3343 /* Adjust the type of the result to the type of the temporary. */
3344 r = adjust_temp_type (TREE_TYPE (t), r);
1227ba74 3345 if (lval)
1eb418cc 3346 {
3347 tree slot = TARGET_EXPR_SLOT (t);
3348 ctx->values->put (slot, r);
3349 return slot;
3350 }
09b42213 3351 break;
3352
9c96033c 3353 case INIT_EXPR:
9c96033c 3354 case MODIFY_EXPR:
1227ba74 3355 r = cxx_eval_store_expression (ctx, t, lval,
9c96033c 3356 non_constant_p, overflow_p);
3357 break;
3358
09b42213 3359 case SCOPE_REF:
cf72f34d 3360 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
1227ba74 3361 lval,
b2a43197 3362 non_constant_p, overflow_p);
09b42213 3363 break;
3364
3365 case RETURN_EXPR:
10fb495c 3366 if (TREE_OPERAND (t, 0) != NULL_TREE)
3367 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
3368 lval,
3369 non_constant_p, overflow_p);
00f21715 3370 *jump_target = t;
3371 break;
3372
e0e672a0 3373 case SAVE_EXPR:
3374 /* Avoid evaluating a SAVE_EXPR more than once. */
3375 if (tree *p = ctx->values->get (t))
3376 r = *p;
3377 else
3378 {
c8f6aeb1 3379 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), false,
e0e672a0 3380 non_constant_p, overflow_p);
3381 ctx->values->put (t, r);
3382 }
3383 break;
3384
09b42213 3385 case NON_LVALUE_EXPR:
3386 case TRY_CATCH_EXPR:
7f67d68c 3387 case TRY_BLOCK:
09b42213 3388 case CLEANUP_POINT_EXPR:
3389 case MUST_NOT_THROW_EXPR:
9c96033c 3390 case EXPR_STMT:
3391 case EH_SPEC_BLOCK:
cf72f34d 3392 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
1227ba74 3393 lval,
00f21715 3394 non_constant_p, overflow_p,
3395 jump_target);
09b42213 3396 break;
3397
7f67d68c 3398 case TRY_FINALLY_EXPR:
3399 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
3400 non_constant_p, overflow_p,
3401 jump_target);
3402 if (!*non_constant_p)
3403 /* Also evaluate the cleanup. */
3404 cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1), true,
3405 non_constant_p, overflow_p,
3406 jump_target);
3407 break;
3408
09b42213 3409 /* These differ from cxx_eval_unary_expression in that this doesn't
3410 check for a constant operand or result; an address can be
3411 constant without its operand being, and vice versa. */
d2c63826 3412 case MEM_REF:
09b42213 3413 case INDIRECT_REF:
1227ba74 3414 r = cxx_eval_indirect_ref (ctx, t, lval,
09b42213 3415 non_constant_p, overflow_p);
3416 break;
3417
3418 case ADDR_EXPR:
3419 {
3420 tree oldop = TREE_OPERAND (t, 0);
cf72f34d 3421 tree op = cxx_eval_constant_expression (ctx, oldop,
1227ba74 3422 /*lval*/true,
b2a43197 3423 non_constant_p, overflow_p);
09b42213 3424 /* Don't VERIFY_CONSTANT here. */
3425 if (*non_constant_p)
3426 return t;
1eb418cc 3427 gcc_checking_assert (TREE_CODE (op) != CONSTRUCTOR);
09b42213 3428 /* This function does more aggressive folding than fold itself. */
3429 r = build_fold_addr_expr_with_type (op, TREE_TYPE (t));
3430 if (TREE_CODE (r) == ADDR_EXPR && TREE_OPERAND (r, 0) == oldop)
3431 return t;
3432 break;
3433 }
3434
3435 case REALPART_EXPR:
3436 case IMAGPART_EXPR:
3437 case CONJ_EXPR:
3438 case FIX_TRUNC_EXPR:
3439 case FLOAT_EXPR:
3440 case NEGATE_EXPR:
3441 case ABS_EXPR:
3442 case BIT_NOT_EXPR:
3443 case TRUTH_NOT_EXPR:
3444 case FIXED_CONVERT_EXPR:
1227ba74 3445 r = cxx_eval_unary_expression (ctx, t, lval,
09b42213 3446 non_constant_p, overflow_p);
3447 break;
3448
3449 case SIZEOF_EXPR:
d2c63826 3450 r = fold_sizeof_expr (t);
09b42213 3451 VERIFY_CONSTANT (r);
3452 break;
3453
3454 case COMPOUND_EXPR:
3455 {
3456 /* check_return_expr sometimes wraps a TARGET_EXPR in a
3457 COMPOUND_EXPR; don't get confused. Also handle EMPTY_CLASS_EXPR
3458 introduced by build_call_a. */
3459 tree op0 = TREE_OPERAND (t, 0);
3460 tree op1 = TREE_OPERAND (t, 1);
3461 STRIP_NOPS (op1);
3462 if ((TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
3463 || TREE_CODE (op1) == EMPTY_CLASS_EXPR)
f83e6885 3464 r = cxx_eval_constant_expression (ctx, op0,
1227ba74 3465 lval, non_constant_p, overflow_p,
00f21715 3466 jump_target);
09b42213 3467 else
3468 {
3469 /* Check that the LHS is constant and then discard it. */
f83e6885 3470 cxx_eval_constant_expression (ctx, op0,
c8f6aeb1 3471 true, non_constant_p, overflow_p,
00f21715 3472 jump_target);
09b42213 3473 op1 = TREE_OPERAND (t, 1);
f83e6885 3474 r = cxx_eval_constant_expression (ctx, op1,
1227ba74 3475 lval, non_constant_p, overflow_p,
00f21715 3476 jump_target);
09b42213 3477 }
3478 }
3479 break;
3480
3481 case POINTER_PLUS_EXPR:
35b68da8 3482 r = cxx_eval_pointer_plus_expression (ctx, t, lval, non_constant_p,
3483 overflow_p);
3484 if (r)
3485 break;
3486 /* else fall through */
3487
09b42213 3488 case PLUS_EXPR:
3489 case MINUS_EXPR:
3490 case MULT_EXPR:
3491 case TRUNC_DIV_EXPR:
3492 case CEIL_DIV_EXPR:
3493 case FLOOR_DIV_EXPR:
3494 case ROUND_DIV_EXPR:
3495 case TRUNC_MOD_EXPR:
3496 case CEIL_MOD_EXPR:
3497 case ROUND_MOD_EXPR:
3498 case RDIV_EXPR:
3499 case EXACT_DIV_EXPR:
3500 case MIN_EXPR:
3501 case MAX_EXPR:
3502 case LSHIFT_EXPR:
3503 case RSHIFT_EXPR:
3504 case LROTATE_EXPR:
3505 case RROTATE_EXPR:
3506 case BIT_IOR_EXPR:
3507 case BIT_XOR_EXPR:
3508 case BIT_AND_EXPR:
3509 case TRUTH_XOR_EXPR:
3510 case LT_EXPR:
3511 case LE_EXPR:
3512 case GT_EXPR:
3513 case GE_EXPR:
3514 case EQ_EXPR:
3515 case NE_EXPR:
3516 case UNORDERED_EXPR:
3517 case ORDERED_EXPR:
3518 case UNLT_EXPR:
3519 case UNLE_EXPR:
3520 case UNGT_EXPR:
3521 case UNGE_EXPR:
3522 case UNEQ_EXPR:
3523 case LTGT_EXPR:
3524 case RANGE_EXPR:
3525 case COMPLEX_EXPR:
1227ba74 3526 r = cxx_eval_binary_expression (ctx, t, lval,
09b42213 3527 non_constant_p, overflow_p);
3528 break;
3529
3530 /* fold can introduce non-IF versions of these; still treat them as
3531 short-circuiting. */
3532 case TRUTH_AND_EXPR:
3533 case TRUTH_ANDIF_EXPR:
cf72f34d 3534 r = cxx_eval_logical_expression (ctx, t, boolean_false_node,
09b42213 3535 boolean_true_node,
1227ba74 3536 lval,
09b42213 3537 non_constant_p, overflow_p);
3538 break;
3539
3540 case TRUTH_OR_EXPR:
3541 case TRUTH_ORIF_EXPR:
cf72f34d 3542 r = cxx_eval_logical_expression (ctx, t, boolean_true_node,
09b42213 3543 boolean_false_node,
1227ba74 3544 lval,
09b42213 3545 non_constant_p, overflow_p);
3546 break;
3547
3548 case ARRAY_REF:
1227ba74 3549 r = cxx_eval_array_reference (ctx, t, lval,
09b42213 3550 non_constant_p, overflow_p);
3551 break;
3552
3553 case COMPONENT_REF:
3554 if (is_overloaded_fn (t))
3555 {
3556 /* We can only get here in checking mode via
3557 build_non_dependent_expr, because any expression that
3558 calls or takes the address of the function will have
3559 pulled a FUNCTION_DECL out of the COMPONENT_REF. */
f83e6885 3560 gcc_checking_assert (ctx->quiet || errorcount);
09b42213 3561 *non_constant_p = true;
3562 return t;
3563 }
1227ba74 3564 r = cxx_eval_component_reference (ctx, t, lval,
09b42213 3565 non_constant_p, overflow_p);
3566 break;
3567
3568 case BIT_FIELD_REF:
1227ba74 3569 r = cxx_eval_bit_field_ref (ctx, t, lval,
09b42213 3570 non_constant_p, overflow_p);
3571 break;
3572
3573 case COND_EXPR:
3574 case VEC_COND_EXPR:
1227ba74 3575 r = cxx_eval_conditional_expression (ctx, t, lval,
00f21715 3576 non_constant_p, overflow_p,
3577 jump_target);
09b42213 3578 break;
3579
3580 case CONSTRUCTOR:
1a3631bc 3581 if (TREE_CONSTANT (t))
3582 /* Don't re-process a constant CONSTRUCTOR, but do fold it to
3583 VECTOR_CST if applicable. */
3584 return fold (t);
1227ba74 3585 r = cxx_eval_bare_aggregate (ctx, t, lval,
09b42213 3586 non_constant_p, overflow_p);
3587 break;
3588
3589 case VEC_INIT_EXPR:
3590 /* We can get this in a defaulted constructor for a class with a
3591 non-static data member of array type. Either the initializer will
3592 be NULL, meaning default-initialization, or it will be an lvalue
3593 or xvalue of the same type, meaning direct-initialization from the
3594 corresponding member. */
1227ba74 3595 r = cxx_eval_vec_init (ctx, t, lval,
09b42213 3596 non_constant_p, overflow_p);
3597 break;
3598
3599 case FMA_EXPR:
3600 case VEC_PERM_EXPR:
1227ba74 3601 r = cxx_eval_trinary_expression (ctx, t, lval,
09b42213 3602 non_constant_p, overflow_p);
3603 break;
3604
3605 case CONVERT_EXPR:
3606 case VIEW_CONVERT_EXPR:
3607 case NOP_EXPR:
d2c63826 3608 case UNARY_PLUS_EXPR:
09b42213 3609 {
d2c63826 3610 enum tree_code tcode = TREE_CODE (t);
09b42213 3611 tree oldop = TREE_OPERAND (t, 0);
d2c63826 3612
cf72f34d 3613 tree op = cxx_eval_constant_expression (ctx, oldop,
1227ba74 3614 lval,
b2a43197 3615 non_constant_p, overflow_p);
09b42213 3616 if (*non_constant_p)
3617 return t;
f16ed232 3618 tree type = TREE_TYPE (t);
3619 if (TREE_CODE (op) == PTRMEM_CST
3620 && !TYPE_PTRMEM_P (type))
3621 op = cplus_expand_constant (op);
3622 if (POINTER_TYPE_P (type)
09b42213 3623 && TREE_CODE (op) == INTEGER_CST
3624 && !integer_zerop (op))
3625 {
f83e6885 3626 if (!ctx->quiet)
09b42213 3627 error_at (EXPR_LOC_OR_LOC (t, input_location),
3628 "reinterpret_cast from integer to pointer");
3629 *non_constant_p = true;
3630 return t;
3631 }
d2c63826 3632 if (op == oldop && tcode != UNARY_PLUS_EXPR)
09b42213 3633 /* We didn't fold at the top so we could check for ptr-int
3634 conversion. */
3635 return fold (t);
d2c63826 3636 if (tcode == UNARY_PLUS_EXPR)
3637 r = fold_convert (TREE_TYPE (t), op);
3638 else
3639 r = fold_build1 (tcode, type, op);
09b42213 3640 /* Conversion of an out-of-range value has implementation-defined
3641 behavior; the language considers it different from arithmetic
3642 overflow, which is undefined. */
3643 if (TREE_OVERFLOW_P (r) && !TREE_OVERFLOW_P (op))
3644 TREE_OVERFLOW (r) = false;
3645 }
3646 break;
3647
3648 case EMPTY_CLASS_EXPR:
3649 /* This is good enough for a function argument that might not get
3650 used, and they can't do anything with it, so just return it. */
3651 return t;
3652
9c96033c 3653 case STATEMENT_LIST:
00f21715 3654 new_ctx = *ctx;
3655 new_ctx.ctor = new_ctx.object = NULL_TREE;
f83e6885 3656 return cxx_eval_statement_list (&new_ctx, t,
00f21715 3657 non_constant_p, overflow_p, jump_target);
9c96033c 3658
3659 case BIND_EXPR:
3660 return cxx_eval_constant_expression (ctx, BIND_EXPR_BODY (t),
1227ba74 3661 lval,
00f21715 3662 non_constant_p, overflow_p,
3663 jump_target);
9c96033c 3664
09b42213 3665 case PREINCREMENT_EXPR:
3666 case POSTINCREMENT_EXPR:
3667 case PREDECREMENT_EXPR:
3668 case POSTDECREMENT_EXPR:
f83e6885 3669 return cxx_eval_increment_expression (ctx, t,
1227ba74 3670 lval, non_constant_p, overflow_p);
9c96033c 3671
3672 case LAMBDA_EXPR:
09b42213 3673 case NEW_EXPR:
3674 case VEC_NEW_EXPR:
3675 case DELETE_EXPR:
3676 case VEC_DELETE_EXPR:
3677 case THROW_EXPR:
09b42213 3678 case MODOP_EXPR:
3679 /* GCC internal stuff. */
3680 case VA_ARG_EXPR:
3681 case OBJ_TYPE_REF:
3682 case WITH_CLEANUP_EXPR:
09b42213 3683 case NON_DEPENDENT_EXPR:
3684 case BASELINK:
09b42213 3685 case OFFSET_REF:
f83e6885 3686 if (!ctx->quiet)
09b42213 3687 error_at (EXPR_LOC_OR_LOC (t, input_location),
3688 "expression %qE is not a constant-expression", t);
3689 *non_constant_p = true;
3690 break;
3691
cf72f34d 3692 case PLACEHOLDER_EXPR:
fe235c02 3693 if (!ctx || !ctx->ctor || (lval && !ctx->object)
3694 || !(same_type_ignoring_top_level_qualifiers_p
3695 (TREE_TYPE (t), TREE_TYPE (ctx->ctor))))
cf72f34d 3696 {
3697 /* A placeholder without a referent. We can get here when
3698 checking whether NSDMIs are noexcept, or in massage_init_elt;
3699 just say it's non-constant for now. */
f83e6885 3700 gcc_assert (ctx->quiet);
cf72f34d 3701 *non_constant_p = true;
3702 break;
3703 }
3704 else
3705 {
3706 /* Use of the value or address of the current object. We could
3707 use ctx->object unconditionally, but using ctx->ctor when we
3708 can is a minor optimization. */
1227ba74 3709 tree ctor = lval ? ctx->object : ctx->ctor;
cf72f34d 3710 return cxx_eval_constant_expression
1227ba74 3711 (ctx, ctor, lval,
b2a43197 3712 non_constant_p, overflow_p);
cf72f34d 3713 }
3714 break;
3715
9c96033c 3716 case GOTO_EXPR:
00f21715 3717 *jump_target = TREE_OPERAND (t, 0);
3718 gcc_assert (breaks (jump_target) || continues (jump_target));
3719 break;
3720
9c96033c 3721 case LOOP_EXPR:
f83e6885 3722 cxx_eval_loop_expr (ctx, t,
00f21715 3723 non_constant_p, overflow_p, jump_target);
3724 break;
3725
9c96033c 3726 case SWITCH_EXPR:
f83e6885 3727 cxx_eval_switch_expr (ctx, t,
00f21715 3728 non_constant_p, overflow_p, jump_target);
9c96033c 3729 break;
3730
56c12fd4 3731 case REQUIRES_EXPR:
3732 /* It's possible to get a requires-expression in a constant
3733 expression. For example:
3734
3735 template<typename T> concept bool C() {
3736 return requires (T t) { t; };
3737 }
3738
3739 template<typename T> requires !C<T>() void f(T);
3740
3741 Normalization leaves f with the associated constraint
3742 '!requires (T t) { ... }' which is not transformed into
3743 a constraint. */
3744 if (!processing_template_decl)
3745 return evaluate_constraint_expression (t, NULL_TREE);
3746 else
3747 *non_constant_p = true;
3748 return t;
3749
09b42213 3750 default:
b9a3af23 3751 if (STATEMENT_CODE_P (TREE_CODE (t)))
3752 {
3753 /* This function doesn't know how to deal with pre-genericize
3754 statements; this can only happen with statement-expressions,
3755 so for now just fail. */
3756 if (!ctx->quiet)
3757 error_at (EXPR_LOCATION (t),
3758 "statement is not a constant-expression");
3759 }
3760 else
3761 internal_error ("unexpected expression %qE of kind %s", t,
3762 get_tree_code_name (TREE_CODE (t)));
09b42213 3763 *non_constant_p = true;
3764 break;
3765 }
3766
3767 if (r == error_mark_node)
3768 *non_constant_p = true;
3769
3770 if (*non_constant_p)
3771 return t;
3772 else
3773 return r;
3774}
3775
3776static tree
cf72f34d 3777cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
2055d27a 3778 bool strict = true, tree object = NULL_TREE)
09b42213 3779{
3780 bool non_constant_p = false;
3781 bool overflow_p = false;
cf72f34d 3782 hash_map<tree,tree> map;
f9885b8a 3783 constexpr_ctx ctx = { NULL, &map, NULL, NULL, allow_non_constant, strict };
cf72f34d 3784 tree type = initialized_type (t);
cf72f34d 3785 tree r = t;
3786 if (AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type))
3787 {
3788 /* In C++14 an NSDMI can participate in aggregate initialization,
3789 and can refer to the address of the object being initialized, so
3790 we need to pass in the relevant VAR_DECL if we want to do the
3791 evaluation in a single pass. The evaluation will dynamically
3792 update ctx.values for the VAR_DECL. We use the same strategy
3793 for C++11 constexpr constructors that refer to the object being
3794 initialized. */
3795 ctx.ctor = build_constructor (type, NULL);
3796 CONSTRUCTOR_NO_IMPLICIT_ZERO (ctx.ctor) = true;
9c96033c 3797 if (!object)
3798 {
3799 if (TREE_CODE (t) == TARGET_EXPR)
3800 object = TARGET_EXPR_SLOT (t);
3801 else if (TREE_CODE (t) == AGGR_INIT_EXPR)
3802 object = AGGR_INIT_EXPR_SLOT (t);
3803 }
cf72f34d 3804 ctx.object = object;
3805 if (object)
3806 gcc_assert (same_type_ignoring_top_level_qualifiers_p
3807 (type, TREE_TYPE (object)));
3808 if (object && DECL_P (object))
3809 map.put (object, ctx.ctor);
3810 if (TREE_CODE (r) == TARGET_EXPR)
3811 /* Avoid creating another CONSTRUCTOR when we expand the
3812 TARGET_EXPR. */
3813 r = TARGET_EXPR_INITIAL (r);
3814 }
3815
f83e6885 3816 r = cxx_eval_constant_expression (&ctx, r,
b2a43197 3817 false, &non_constant_p, &overflow_p);
09b42213 3818
3819 verify_constant (r, allow_non_constant, &non_constant_p, &overflow_p);
3820
bbcc9042 3821 /* Mutable logic is a bit tricky: we want to allow initialization of
3822 constexpr variables with mutable members, but we can't copy those
3823 members to another constexpr variable. */
3824 if (TREE_CODE (r) == CONSTRUCTOR
3825 && CONSTRUCTOR_MUTABLE_POISON (r))
09b42213 3826 {
09b42213 3827 if (!allow_non_constant)
bbcc9042 3828 error ("%qE is not a constant expression because it refers to "
3829 "mutable subobjects of %qT", t, type);
09b42213 3830 non_constant_p = true;
3831 }
3832
3833 /* Technically we should check this for all subexpressions, but that
3834 runs into problems with our internal representation of pointer
3835 subtraction and the 5.19 rules are still in flux. */
3836 if (CONVERT_EXPR_CODE_P (TREE_CODE (r))
3837 && ARITHMETIC_TYPE_P (TREE_TYPE (r))
3838 && TREE_CODE (TREE_OPERAND (r, 0)) == ADDR_EXPR)
3839 {
3840 if (!allow_non_constant)
3841 error ("conversion from pointer type %qT "
3842 "to arithmetic type %qT in a constant-expression",
3843 TREE_TYPE (TREE_OPERAND (r, 0)), TREE_TYPE (r));
3844 non_constant_p = true;
3845 }
3846
3847 if (!non_constant_p && overflow_p)
3848 non_constant_p = true;
3849
3850 if (non_constant_p && !allow_non_constant)
3851 return error_mark_node;
3852 else if (non_constant_p && TREE_CONSTANT (r))
3853 {
3854 /* This isn't actually constant, so unset TREE_CONSTANT. */
3855 if (EXPR_P (r))
3856 r = copy_node (r);
3857 else if (TREE_CODE (r) == CONSTRUCTOR)
3858 r = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (r), r);
3859 else
3860 r = build_nop (TREE_TYPE (r), r);
3861 TREE_CONSTANT (r) = false;
3862 }
3863 else if (non_constant_p || r == t)
3864 return t;
3865
3866 if (TREE_CODE (r) == CONSTRUCTOR && CLASS_TYPE_P (TREE_TYPE (r)))
3867 {
3868 if (TREE_CODE (t) == TARGET_EXPR
3869 && TARGET_EXPR_INITIAL (t) == r)
3870 return t;
3871 else
3872 {
3873 r = get_target_expr (r);
3874 TREE_CONSTANT (r) = true;
3875 return r;
3876 }
3877 }
3878 else
3879 return r;
3880}
3881
3882/* Returns true if T is a valid subexpression of a constant expression,
3883 even if it isn't itself a constant expression. */
3884
3885bool
3886is_sub_constant_expr (tree t)
3887{
3888 bool non_constant_p = false;
3889 bool overflow_p = false;
cf72f34d 3890 hash_map <tree, tree> map;
f9885b8a 3891 constexpr_ctx ctx = { NULL, &map, NULL, NULL, true, true };
f83e6885 3892 cxx_eval_constant_expression (&ctx, t, false, &non_constant_p,
b2a43197 3893 &overflow_p);
09b42213 3894 return !non_constant_p && !overflow_p;
3895}
3896
3897/* If T represents a constant expression returns its reduced value.
3898 Otherwise return error_mark_node. If T is dependent, then
3899 return NULL. */
3900
3901tree
cf72f34d 3902cxx_constant_value (tree t, tree decl)
09b42213 3903{
2055d27a 3904 return cxx_eval_outermost_constant_expr (t, false, true, decl);
09b42213 3905}
3906
d2c63826 3907/* Helper routine for fold_simple function. Either return simplified
3908 expression T, otherwise NULL_TREE.
3909 In contrast to cp_fully_fold, and to maybe_constant_value, we try to fold
3910 even if we are within template-declaration. So be careful on call, as in
3911 such case types can be undefined. */
3912
3913static tree
3914fold_simple_1 (tree t)
3915{
3916 tree op1;
3917 enum tree_code code = TREE_CODE (t);
3918
3919 switch (code)
3920 {
3921 case INTEGER_CST:
3922 case REAL_CST:
3923 case VECTOR_CST:
3924 case FIXED_CST:
3925 case COMPLEX_CST:
3926 return t;
3927
3928 case SIZEOF_EXPR:
3929 return fold_sizeof_expr (t);
3930
3931 case ABS_EXPR:
3932 case CONJ_EXPR:
3933 case REALPART_EXPR:
3934 case IMAGPART_EXPR:
3935 case NEGATE_EXPR:
3936 case BIT_NOT_EXPR:
3937 case TRUTH_NOT_EXPR:
3938 case NOP_EXPR:
3939 case VIEW_CONVERT_EXPR:
3940 case CONVERT_EXPR:
3941 case FLOAT_EXPR:
3942 case FIX_TRUNC_EXPR:
3943 case FIXED_CONVERT_EXPR:
3944 case ADDR_SPACE_CONVERT_EXPR:
3945
3946 op1 = TREE_OPERAND (t, 0);
3947
3948 t = const_unop (code, TREE_TYPE (t), op1);
3949 if (!t)
3950 return NULL_TREE;
3951
3952 if (CONVERT_EXPR_CODE_P (code)
3953 && TREE_OVERFLOW_P (t) && !TREE_OVERFLOW_P (op1))
3954 TREE_OVERFLOW (t) = false;
3955 return t;
3956
3957 default:
3958 return NULL_TREE;
3959 }
3960}
3961
3962/* If T is a simple constant expression, returns its simplified value.
3963 Otherwise returns T. In contrast to maybe_constant_value do we
3964 simplify only few operations on constant-expressions, and we don't
3965 try to simplify constexpressions. */
3966
3967tree
3968fold_simple (tree t)
3969{
3970 tree r = NULL_TREE;
3971 if (processing_template_decl)
3972 return t;
3973
3974 r = fold_simple_1 (t);
3975 if (!r)
3976 r = t;
3977
3978 return r;
3979}
3980
09b42213 3981/* If T is a constant expression, returns its reduced value.
3982 Otherwise, if T does not have TREE_CONSTANT set, returns T.
3983 Otherwise, returns a version of T without TREE_CONSTANT. */
3984
d2c63826 3985static tree
3986maybe_constant_value_1 (tree t, tree decl)
09b42213 3987{
3988 tree r;
3989
3990 if (instantiation_dependent_expression_p (t)
3991 || type_unknown_p (t)
3992 || BRACE_ENCLOSED_INITIALIZER_P (t)
3993 || !potential_constant_expression (t))
3994 {
3995 if (TREE_OVERFLOW_P (t))
3996 {
3997 t = build_nop (TREE_TYPE (t), t);
3998 TREE_CONSTANT (t) = false;
3999 }
4000 return t;
4001 }
4002
2055d27a 4003 r = cxx_eval_outermost_constant_expr (t, true, true, decl);
5e8689fb 4004 gcc_checking_assert (r == t
4005 || CONVERT_EXPR_P (t)
4006 || TREE_CODE (t) == VIEW_CONVERT_EXPR
4007 || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
4008 || !cp_tree_equal (r, t));
09b42213 4009 return r;
4010}
4011
d2c63826 4012static GTY((cache, deletable)) cache_map cv_cache;
4013
4014/* If T is a constant expression, returns its reduced value.
4015 Otherwise, if T does not have TREE_CONSTANT set, returns T.
4016 Otherwise, returns a version of T without TREE_CONSTANT. */
4017
4018tree
4019maybe_constant_value (tree t, tree decl)
4020{
4021 tree ret = cv_cache.get (t);
4022 if (!ret)
4023 {
4024 ret = maybe_constant_value_1 (t, decl);
4025 cv_cache.put (t, ret);
4026 }
4027 return ret;
4028}
4029
21131a05 4030/* Like maybe_constant_value but first fully instantiate the argument.
4031
4032 Note: this is equivalent to instantiate_non_dependent_expr_sfinae
4033 (t, tf_none) followed by maybe_constant_value but is more efficient,
4034 because calls instantiation_dependent_expression_p and
4035 potential_constant_expression at most once. */
4036
4037tree
4038fold_non_dependent_expr (tree t)
4039{
4040 if (t == NULL_TREE)
4041 return NULL_TREE;
4042
4043 /* If we're in a template, but T isn't value dependent, simplify
4044 it. We're supposed to treat:
4045
4046 template <typename T> void f(T[1 + 1]);
4047 template <typename T> void f(T[2]);
4048
4049 as two declarations of the same function, for example. */
4050 if (processing_template_decl)
4051 {
4052 if (!instantiation_dependent_expression_p (t)
4053 && potential_constant_expression (t))
4054 {
c8a9f04c 4055 processing_template_decl_sentinel s;
4056 t = instantiate_non_dependent_expr_internal (t, tf_none);
21131a05 4057
4058 if (type_unknown_p (t)
4059 || BRACE_ENCLOSED_INITIALIZER_P (t))
4060 {
4061 if (TREE_OVERFLOW_P (t))
4062 {
4063 t = build_nop (TREE_TYPE (t), t);
4064 TREE_CONSTANT (t) = false;
4065 }
4066 return t;
4067 }
4068
2055d27a 4069 tree r = cxx_eval_outermost_constant_expr (t, true, true, NULL_TREE);
21131a05 4070 /* cp_tree_equal looks through NOPs, so allow them. */
5e8689fb 4071 gcc_checking_assert (r == t
4072 || CONVERT_EXPR_P (t)
4073 || TREE_CODE (t) == VIEW_CONVERT_EXPR
4074 || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
4075 || !cp_tree_equal (r, t));
21131a05 4076 return r;
4077 }
4078 else if (TREE_OVERFLOW_P (t))
4079 {
4080 t = build_nop (TREE_TYPE (t), t);
4081 TREE_CONSTANT (t) = false;
4082 }
4083 return t;
4084 }
4085
4086 return maybe_constant_value (t);
4087}
4088
09b42213 4089/* Like maybe_constant_value, but returns a CONSTRUCTOR directly, rather
4090 than wrapped in a TARGET_EXPR. */
4091
4092tree
cf72f34d 4093maybe_constant_init (tree t, tree decl)
09b42213 4094{
d2c63826 4095 if (!t)
4096 return t;
09b42213 4097 if (TREE_CODE (t) == EXPR_STMT)
4098 t = TREE_OPERAND (t, 0);
4099 if (TREE_CODE (t) == CONVERT_EXPR
4100 && VOID_TYPE_P (TREE_TYPE (t)))
4101 t = TREE_OPERAND (t, 0);
9c96033c 4102 if (TREE_CODE (t) == INIT_EXPR)
4103 t = TREE_OPERAND (t, 1);
2055d27a 4104 if (instantiation_dependent_expression_p (t)
4105 || type_unknown_p (t)
4106 || BRACE_ENCLOSED_INITIALIZER_P (t)
4107 || !potential_static_init_expression (t))
4108 /* Don't try to evaluate it. */;
4109 else
4110 t = cxx_eval_outermost_constant_expr (t, true, false, decl);
09b42213 4111 if (TREE_CODE (t) == TARGET_EXPR)
4112 {
4113 tree init = TARGET_EXPR_INITIAL (t);
4114 if (TREE_CODE (init) == CONSTRUCTOR)
4115 t = init;
4116 }
4117 return t;
4118}
4119
4120#if 0
4121/* FIXME see ADDR_EXPR section in potential_constant_expression_1. */
4122/* Return true if the object referred to by REF has automatic or thread
4123 local storage. */
4124
4125enum { ck_ok, ck_bad, ck_unknown };
4126static int
4127check_automatic_or_tls (tree ref)
4128{
3754d046 4129 machine_mode mode;
09b42213 4130 HOST_WIDE_INT bitsize, bitpos;
4131 tree offset;
4132 int volatilep = 0, unsignedp = 0;
4133 tree decl = get_inner_reference (ref, &bitsize, &bitpos, &offset,
4134 &mode, &unsignedp, &volatilep, false);
4135 duration_kind dk;
4136
4137 /* If there isn't a decl in the middle, we don't know the linkage here,
4138 and this isn't a constant expression anyway. */
4139 if (!DECL_P (decl))
4140 return ck_unknown;
4141 dk = decl_storage_duration (decl);
4142 return (dk == dk_auto || dk == dk_thread) ? ck_bad : ck_ok;
4143}
4144#endif
4145
4146/* Return true if T denotes a potentially constant expression. Issue
4147 diagnostic as appropriate under control of FLAGS. If WANT_RVAL is true,
4148 an lvalue-rvalue conversion is implied.
4149
4150 C++0x [expr.const] used to say
4151
4152 6 An expression is a potential constant expression if it is
4153 a constant expression where all occurrences of function
4154 parameters are replaced by arbitrary constant expressions
4155 of the appropriate type.
4156
4157 2 A conditional expression is a constant expression unless it
4158 involves one of the following as a potentially evaluated
4159 subexpression (3.2), but subexpressions of logical AND (5.14),
4160 logical OR (5.15), and conditional (5.16) operations that are
4161 not evaluated are not considered. */
4162
4163static bool
2055d27a 4164potential_constant_expression_1 (tree t, bool want_rval, bool strict,
4165 tsubst_flags_t flags)
09b42213 4166{
2055d27a 4167#define RECUR(T,RV) potential_constant_expression_1 ((T), (RV), strict, flags)
09b42213 4168 enum { any = false, rval = true };
4169 int i;
4170 tree tmp;
4171
4172 if (t == error_mark_node)
4173 return false;
4174 if (t == NULL_TREE)
4175 return true;
eade0940 4176 if (TREE_THIS_VOLATILE (t) && !DECL_P (t))
09b42213 4177 {
4178 if (flags & tf_error)
4179 error ("expression %qE has side-effects", t);
4180 return false;
4181 }
4182 if (CONSTANT_CLASS_P (t))
4183 return true;
4184
4185 switch (TREE_CODE (t))
4186 {
4187 case FUNCTION_DECL:
4188 case BASELINK:
4189 case TEMPLATE_DECL:
4190 case OVERLOAD:
4191 case TEMPLATE_ID_EXPR:
4192 case LABEL_DECL:
4193 case LABEL_EXPR:
9c96033c 4194 case CASE_LABEL_EXPR:
09b42213 4195 case CONST_DECL:
4196 case SIZEOF_EXPR:
4197 case ALIGNOF_EXPR:
4198 case OFFSETOF_EXPR:
4199 case NOEXCEPT_EXPR:
4200 case TEMPLATE_PARM_INDEX:
4201 case TRAIT_EXPR:
4202 case IDENTIFIER_NODE:
4203 case USERDEF_LITERAL:
4204 /* We can see a FIELD_DECL in a pointer-to-member expression. */
4205 case FIELD_DECL:
4206 case PARM_DECL:
d2c63826 4207 case RESULT_DECL:
09b42213 4208 case USING_DECL:
9c96033c 4209 case USING_STMT:
cf72f34d 4210 case PLACEHOLDER_EXPR:
9c96033c 4211 case BREAK_STMT:
4212 case CONTINUE_STMT:
56c12fd4 4213 case REQUIRES_EXPR:
09b42213 4214 return true;
4215
4216 case AGGR_INIT_EXPR:
4217 case CALL_EXPR:
4218 /* -- an invocation of a function other than a constexpr function
4219 or a constexpr constructor. */
4220 {
4221 tree fun = get_function_named_in_call (t);
4222 const int nargs = call_expr_nargs (t);
4223 i = 0;
4224
9c96033c 4225 if (fun == NULL_TREE)
4226 {
32cf7025 4227 if (TREE_CODE (t) == CALL_EXPR
4228 && CALL_EXPR_FN (t) == NULL_TREE)
4229 switch (CALL_EXPR_IFN (t))
4230 {
4231 /* These should be ignored, they are optimized away from
4232 constexpr functions. */
4233 case IFN_UBSAN_NULL:
4234 case IFN_UBSAN_BOUNDS:
4235 case IFN_UBSAN_VPTR:
4236 return true;
4237 default:
4238 break;
4239 }
9c96033c 4240 /* fold_call_expr can't do anything with IFN calls. */
4241 if (flags & tf_error)
4242 error_at (EXPR_LOC_OR_LOC (t, input_location),
4243 "call to internal function");
4244 return false;
4245 }
09b42213 4246 if (is_overloaded_fn (fun))
4247 {
4248 if (TREE_CODE (fun) == FUNCTION_DECL)
4249 {
4250 if (builtin_valid_in_constant_expr_p (fun))
4251 return true;
4252 if (!DECL_DECLARED_CONSTEXPR_P (fun)
4253 /* Allow any built-in function; if the expansion
4254 isn't constant, we'll deal with that then. */
4255 && !is_builtin_fn (fun))
4256 {
4257 if (flags & tf_error)
4258 {
4259 error_at (EXPR_LOC_OR_LOC (t, input_location),
4260 "call to non-constexpr function %qD", fun);
4261 explain_invalid_constexpr_fn (fun);
4262 }
4263 return false;
4264 }
4265 /* A call to a non-static member function takes the address
4266 of the object as the first argument. But in a constant
4267 expression the address will be folded away, so look
4268 through it now. */
4269 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
4270 && !DECL_CONSTRUCTOR_P (fun))
4271 {
4272 tree x = get_nth_callarg (t, 0);
4273 if (is_this_parameter (x))
cf72f34d 4274 return true;
2055d27a 4275 else if (!RECUR (x, rval))
09b42213 4276 return false;
4277 i = 1;
4278 }
4279 }
4280 else
4281 {
2055d27a 4282 if (!RECUR (fun, true))
09b42213 4283 return false;
4284 fun = get_first_fn (fun);
4285 }
4286 /* Skip initial arguments to base constructors. */
4287 if (DECL_BASE_CONSTRUCTOR_P (fun))
4288 i = num_artificial_parms_for (fun);
4289 fun = DECL_ORIGIN (fun);
4290 }
4291 else
4292 {
2055d27a 4293 if (RECUR (fun, rval))
09b42213 4294 /* Might end up being a constant function pointer. */;
4295 else
4296 return false;
4297 }
4298 for (; i < nargs; ++i)
4299 {
4300 tree x = get_nth_callarg (t, i);
b2742b58 4301 /* In a template, reference arguments haven't been converted to
4302 REFERENCE_TYPE and we might not even know if the parameter
4303 is a reference, so accept lvalue constants too. */
4304 bool rv = processing_template_decl ? any : rval;
4305 if (!RECUR (x, rv))
09b42213 4306 return false;
4307 }
4308 return true;
4309 }
4310
4311 case NON_LVALUE_EXPR:
4312 /* -- an lvalue-to-rvalue conversion (4.1) unless it is applied to
4313 -- an lvalue of integral type that refers to a non-volatile
4314 const variable or static data member initialized with
4315 constant expressions, or
4316
4317 -- an lvalue of literal type that refers to non-volatile
4318 object defined with constexpr, or that refers to a
4319 sub-object of such an object; */
2055d27a 4320 return RECUR (TREE_OPERAND (t, 0), rval);
09b42213 4321
4322 case VAR_DECL:
2055d27a 4323 if (want_rval
4324 && !decl_constant_var_p (t)
4325 && (strict
4326 || !CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (t))
4327 || !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (t))
09b42213 4328 && !var_in_constexpr_fn (t)
dff5042c 4329 && !type_dependent_expression_p (t))
09b42213 4330 {
4331 if (flags & tf_error)
4332 non_const_var_error (t);
4333 return false;
4334 }
4335 return true;
4336
4337 case NOP_EXPR:
4338 case CONVERT_EXPR:
4339 case VIEW_CONVERT_EXPR:
4340 /* -- a reinterpret_cast. FIXME not implemented, and this rule
4341 may change to something more specific to type-punning (DR 1312). */
4342 {
4343 tree from = TREE_OPERAND (t, 0);
4344 if (POINTER_TYPE_P (TREE_TYPE (t))
4345 && TREE_CODE (from) == INTEGER_CST
4346 && !integer_zerop (from))
4347 {
4348 if (flags & tf_error)
4349 error_at (EXPR_LOC_OR_LOC (t, input_location),
4350 "reinterpret_cast from integer to pointer");
4351 return false;
4352 }
2055d27a 4353 return (RECUR (from, TREE_CODE (t) != VIEW_CONVERT_EXPR));
09b42213 4354 }
4355
4356 case ADDR_EXPR:
4357 /* -- a unary operator & that is applied to an lvalue that
4358 designates an object with thread or automatic storage
4359 duration; */
4360 t = TREE_OPERAND (t, 0);
4361
4362 if (TREE_CODE (t) == OFFSET_REF && PTRMEM_OK_P (t))
4363 /* A pointer-to-member constant. */
4364 return true;
4365
4366#if 0
4367 /* FIXME adjust when issue 1197 is fully resolved. For now don't do
4368 any checking here, as we might dereference the pointer later. If
4369 we remove this code, also remove check_automatic_or_tls. */
4370 i = check_automatic_or_tls (t);
4371 if (i == ck_ok)
4372 return true;
4373 if (i == ck_bad)
4374 {
4375 if (flags & tf_error)
4376 error ("address-of an object %qE with thread local or "
4377 "automatic storage is not a constant expression", t);
4378 return false;
4379 }
4380#endif
2055d27a 4381 return RECUR (t, any);
09b42213 4382
4383 case COMPONENT_REF:
4384 case BIT_FIELD_REF:
4385 case ARROW_EXPR:
4386 case OFFSET_REF:
4387 /* -- a class member access unless its postfix-expression is
4388 of literal type or of pointer to literal type. */
4389 /* This test would be redundant, as it follows from the
4390 postfix-expression being a potential constant expression. */
eade0940 4391 if (type_unknown_p (t))
4392 return true;
2055d27a 4393 return RECUR (TREE_OPERAND (t, 0), want_rval);
09b42213 4394
4395 case EXPR_PACK_EXPANSION:
2055d27a 4396 return RECUR (PACK_EXPANSION_PATTERN (t), want_rval);
09b42213 4397
4398 case INDIRECT_REF:
4399 {
4400 tree x = TREE_OPERAND (t, 0);
4401 STRIP_NOPS (x);
4402 if (is_this_parameter (x))
4403 {
4404 if (DECL_CONTEXT (x)
4405 && !DECL_DECLARED_CONSTEXPR_P (DECL_CONTEXT (x)))
4406 {
4407 if (flags & tf_error)
4408 error ("use of %<this%> in a constant expression");
4409 return false;
4410 }
09b42213 4411 return true;
4412 }
2055d27a 4413 return RECUR (x, rval);
09b42213 4414 }
4415
9c96033c 4416 case STATEMENT_LIST:
4417 {
4418 tree_stmt_iterator i;
4419 for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
4420 {
2055d27a 4421 if (!RECUR (tsi_stmt (i), any))
9c96033c 4422 return false;
4423 }
4424 return true;
4425 }
4426 break;
4427
4428 case MODIFY_EXPR:
4429 if (cxx_dialect < cxx14)
4430 goto fail;
2055d27a 4431 if (!RECUR (TREE_OPERAND (t, 0), any))
9c96033c 4432 return false;
2055d27a 4433 if (!RECUR (TREE_OPERAND (t, 1), rval))
9c96033c 4434 return false;
4435 return true;
4436
4437 case MODOP_EXPR:
4438 if (cxx_dialect < cxx14)
4439 goto fail;
2055d27a 4440 if (!RECUR (TREE_OPERAND (t, 0), rval))
9c96033c 4441 return false;
2055d27a 4442 if (!RECUR (TREE_OPERAND (t, 2), rval))
9c96033c 4443 return false;
4444 return true;
4445
9c96033c 4446 case DO_STMT:
2055d27a 4447 if (!RECUR (DO_COND (t), rval))
9c96033c 4448 return false;
2055d27a 4449 if (!RECUR (DO_BODY (t), any))
9c96033c 4450 return false;
4451 return true;
4452
4453 case FOR_STMT:
2055d27a 4454 if (!RECUR (FOR_INIT_STMT (t), any))
9c96033c 4455 return false;
2055d27a 4456 if (!RECUR (FOR_COND (t), rval))
9c96033c 4457 return false;
2055d27a 4458 if (!RECUR (FOR_EXPR (t), any))
9c96033c 4459 return false;
2055d27a 4460 if (!RECUR (FOR_BODY (t), any))
9c96033c 4461 return false;
4462 return true;
4463
4464 case WHILE_STMT:
2055d27a 4465 if (!RECUR (WHILE_COND (t), rval))
9c96033c 4466 return false;
2055d27a 4467 if (!RECUR (WHILE_BODY (t), any))
9c96033c 4468 return false;
4469 return true;
4470
4471 case SWITCH_STMT:
2055d27a 4472 if (!RECUR (SWITCH_STMT_COND (t), rval))
9c96033c 4473 return false;
748c426a 4474 /* FIXME we don't check SWITCH_STMT_BODY currently, because even
4475 unreachable labels would be checked. */
9c96033c 4476 return true;
4477
da7981e0 4478 case STMT_EXPR:
2055d27a 4479 return RECUR (STMT_EXPR_STMT (t), rval);
da7981e0 4480
09b42213 4481 case LAMBDA_EXPR:
4482 case DYNAMIC_CAST_EXPR:
4483 case PSEUDO_DTOR_EXPR:
09b42213 4484 case NEW_EXPR:
4485 case VEC_NEW_EXPR:
4486 case DELETE_EXPR:
4487 case VEC_DELETE_EXPR:
4488 case THROW_EXPR:
09b42213 4489 case OMP_ATOMIC:
4490 case OMP_ATOMIC_READ:
4491 case OMP_ATOMIC_CAPTURE_OLD:
4492 case OMP_ATOMIC_CAPTURE_NEW:
4493 /* GCC internal stuff. */
4494 case VA_ARG_EXPR:
4495 case OBJ_TYPE_REF:
09b42213 4496 case TRANSACTION_EXPR:
9c96033c 4497 case ASM_EXPR:
9abecca2 4498 case AT_ENCODE_EXPR:
9c96033c 4499 fail:
09b42213 4500 if (flags & tf_error)
4501 error ("expression %qE is not a constant-expression", t);
4502 return false;
4503
4504 case TYPEID_EXPR:
4505 /* -- a typeid expression whose operand is of polymorphic
4506 class type; */
4507 {
4508 tree e = TREE_OPERAND (t, 0);
4509 if (!TYPE_P (e) && !type_dependent_expression_p (e)
4510 && TYPE_POLYMORPHIC_P (TREE_TYPE (e)))
4511 {
4512 if (flags & tf_error)
4513 error ("typeid-expression is not a constant expression "
4514 "because %qE is of polymorphic type", e);
4515 return false;
4516 }
4517 return true;
4518 }
4519
4520 case MINUS_EXPR:
09b42213 4521 want_rval = true;
4522 goto binary;
4523
4524 case LT_EXPR:
4525 case LE_EXPR:
4526 case GT_EXPR:
4527 case GE_EXPR:
4528 case EQ_EXPR:
4529 case NE_EXPR:
09b42213 4530 want_rval = true;
4531 goto binary;
4532
9c96033c 4533 case PREINCREMENT_EXPR:
4534 case POSTINCREMENT_EXPR:
4535 case PREDECREMENT_EXPR:
4536 case POSTDECREMENT_EXPR:
4537 if (cxx_dialect < cxx14)
4538 goto fail;
4539 goto unary;
4540
09b42213 4541 case BIT_NOT_EXPR:
4542 /* A destructor. */
4543 if (TYPE_P (TREE_OPERAND (t, 0)))
4544 return true;
4545 /* else fall through. */
4546
4547 case REALPART_EXPR:
4548 case IMAGPART_EXPR:
4549 case CONJ_EXPR:
4550 case SAVE_EXPR:
4551 case FIX_TRUNC_EXPR:
4552 case FLOAT_EXPR:
4553 case NEGATE_EXPR:
4554 case ABS_EXPR:
4555 case TRUTH_NOT_EXPR:
4556 case FIXED_CONVERT_EXPR:
4557 case UNARY_PLUS_EXPR:
6fdf70f5 4558 case UNARY_LEFT_FOLD_EXPR:
4559 case UNARY_RIGHT_FOLD_EXPR:
9c96033c 4560 unary:
2055d27a 4561 return RECUR (TREE_OPERAND (t, 0), rval);
09b42213 4562
4563 case CAST_EXPR:
4564 case CONST_CAST_EXPR:
4565 case STATIC_CAST_EXPR:
4566 case REINTERPRET_CAST_EXPR:
4567 case IMPLICIT_CONV_EXPR:
4568 if (cxx_dialect < cxx11
4569 && !dependent_type_p (TREE_TYPE (t))
4570 && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (t)))
4571 /* In C++98, a conversion to non-integral type can't be part of a
4572 constant expression. */
4573 {
4574 if (flags & tf_error)
4575 error ("cast to non-integral type %qT in a constant expression",
4576 TREE_TYPE (t));
4577 return false;
4578 }
4579
2055d27a 4580 return (RECUR (TREE_OPERAND (t, 0),
4581 TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE));
09b42213 4582
9c96033c 4583 case BIND_EXPR:
2055d27a 4584 return RECUR (BIND_EXPR_BODY (t), want_rval);
9c96033c 4585
4586 case WITH_CLEANUP_EXPR:
4587 case CLEANUP_POINT_EXPR:
4588 case MUST_NOT_THROW_EXPR:
4589 case TRY_CATCH_EXPR:
7f67d68c 4590 case TRY_BLOCK:
9c96033c 4591 case EH_SPEC_BLOCK:
4592 case EXPR_STMT:
09b42213 4593 case PAREN_EXPR:
9c96033c 4594 case DECL_EXPR:
09b42213 4595 case NON_DEPENDENT_EXPR:
4596 /* For convenience. */
4597 case RETURN_EXPR:
2055d27a 4598 return RECUR (TREE_OPERAND (t, 0), want_rval);
09b42213 4599
7f67d68c 4600 case TRY_FINALLY_EXPR:
4601 return (RECUR (TREE_OPERAND (t, 0), want_rval)
4602 && RECUR (TREE_OPERAND (t, 1), any));
4603
09b42213 4604 case SCOPE_REF:
2055d27a 4605 return RECUR (TREE_OPERAND (t, 1), want_rval);
09b42213 4606
4607 case TARGET_EXPR:
4608 if (!literal_type_p (TREE_TYPE (t)))
4609 {
4610 if (flags & tf_error)
4611 {
4612 error ("temporary of non-literal type %qT in a "
4613 "constant expression", TREE_TYPE (t));
4614 explain_non_literal_class (TREE_TYPE (t));
4615 }
4616 return false;
4617 }
4618 case INIT_EXPR:
2055d27a 4619 return RECUR (TREE_OPERAND (t, 1), rval);
09b42213 4620
4621 case CONSTRUCTOR:
4622 {
4623 vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
4624 constructor_elt *ce;
4625 for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
2055d27a 4626 if (!RECUR (ce->value, want_rval))
09b42213 4627 return false;
4628 return true;
4629 }
4630
4631 case TREE_LIST:
4632 {
4633 gcc_assert (TREE_PURPOSE (t) == NULL_TREE
4634 || DECL_P (TREE_PURPOSE (t)));
2055d27a 4635 if (!RECUR (TREE_VALUE (t), want_rval))
09b42213 4636 return false;
4637 if (TREE_CHAIN (t) == NULL_TREE)
4638 return true;
2055d27a 4639 return RECUR (TREE_CHAIN (t), want_rval);
09b42213 4640 }
4641
4642 case TRUNC_DIV_EXPR:
4643 case CEIL_DIV_EXPR:
4644 case FLOOR_DIV_EXPR:
4645 case ROUND_DIV_EXPR:
4646 case TRUNC_MOD_EXPR:
4647 case CEIL_MOD_EXPR:
4648 case ROUND_MOD_EXPR:
4649 {
4650 tree denom = TREE_OPERAND (t, 1);
2055d27a 4651 if (!RECUR (denom, rval))
09b42213 4652 return false;
4653 /* We can't call cxx_eval_outermost_constant_expr on an expression
21131a05 4654 that hasn't been through instantiate_non_dependent_expr yet. */
09b42213 4655 if (!processing_template_decl)
4656 denom = cxx_eval_outermost_constant_expr (denom, true);
4657 if (integer_zerop (denom))
4658 {
4659 if (flags & tf_error)
4660 error ("division by zero is not a constant-expression");
4661 return false;
4662 }
4663 else
4664 {
4665 want_rval = true;
2055d27a 4666 return RECUR (TREE_OPERAND (t, 0), want_rval);
09b42213 4667 }
4668 }
4669
4670 case COMPOUND_EXPR:
4671 {
4672 /* check_return_expr sometimes wraps a TARGET_EXPR in a
4673 COMPOUND_EXPR; don't get confused. Also handle EMPTY_CLASS_EXPR
4674 introduced by build_call_a. */
4675 tree op0 = TREE_OPERAND (t, 0);
4676 tree op1 = TREE_OPERAND (t, 1);
4677 STRIP_NOPS (op1);
4678 if ((TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
4679 || TREE_CODE (op1) == EMPTY_CLASS_EXPR)
2055d27a 4680 return RECUR (op0, want_rval);
09b42213 4681 else
4682 goto binary;
4683 }
4684
4685 /* If the first operand is the non-short-circuit constant, look at
4686 the second operand; otherwise we only care about the first one for
4687 potentiality. */
4688 case TRUTH_AND_EXPR:
4689 case TRUTH_ANDIF_EXPR:
4690 tmp = boolean_true_node;
4691 goto truth;
4692 case TRUTH_OR_EXPR:
4693 case TRUTH_ORIF_EXPR:
4694 tmp = boolean_false_node;
4695 truth:
4696 {
4697 tree op = TREE_OPERAND (t, 0);
2055d27a 4698 if (!RECUR (op, rval))
09b42213 4699 return false;
4700 if (!processing_template_decl)
4701 op = cxx_eval_outermost_constant_expr (op, true);
4702 if (tree_int_cst_equal (op, tmp))
2055d27a 4703 return RECUR (TREE_OPERAND (t, 1), rval);
09b42213 4704 else
4705 return true;
4706 }
4707
4708 case PLUS_EXPR:
4709 case MULT_EXPR:
4710 case POINTER_PLUS_EXPR:
4711 case RDIV_EXPR:
4712 case EXACT_DIV_EXPR:
4713 case MIN_EXPR:
4714 case MAX_EXPR:
4715 case LSHIFT_EXPR:
4716 case RSHIFT_EXPR:
4717 case LROTATE_EXPR:
4718 case RROTATE_EXPR:
4719 case BIT_IOR_EXPR:
4720 case BIT_XOR_EXPR:
4721 case BIT_AND_EXPR:
4722 case TRUTH_XOR_EXPR:
4723 case UNORDERED_EXPR:
4724 case ORDERED_EXPR:
4725 case UNLT_EXPR:
4726 case UNLE_EXPR:
4727 case UNGT_EXPR:
4728 case UNGE_EXPR:
4729 case UNEQ_EXPR:
4730 case LTGT_EXPR:
4731 case RANGE_EXPR:
4732 case COMPLEX_EXPR:
4733 want_rval = true;
4734 /* Fall through. */
4735 case ARRAY_REF:
4736 case ARRAY_RANGE_REF:
4737 case MEMBER_REF:
4738 case DOTSTAR_EXPR:
f0abe78f 4739 case MEM_REF:
6fdf70f5 4740 case BINARY_LEFT_FOLD_EXPR:
4741 case BINARY_RIGHT_FOLD_EXPR:
09b42213 4742 binary:
4743 for (i = 0; i < 2; ++i)
2055d27a 4744 if (!RECUR (TREE_OPERAND (t, i), want_rval))
09b42213 4745 return false;
4746 return true;
4747
4748 case CILK_SYNC_STMT:
4749 case CILK_SPAWN_STMT:
4750 case ARRAY_NOTATION_REF:
4751 return false;
4752
4753 case FMA_EXPR:
4754 case VEC_PERM_EXPR:
4755 for (i = 0; i < 3; ++i)
2055d27a 4756 if (!RECUR (TREE_OPERAND (t, i), true))
09b42213 4757 return false;
4758 return true;
4759
748c426a 4760 case IF_STMT:
09b42213 4761 case COND_EXPR:
4762 case VEC_COND_EXPR:
4763 /* If the condition is a known constant, we know which of the legs we
4764 care about; otherwise we only require that the condition and
4765 either of the legs be potentially constant. */
4766 tmp = TREE_OPERAND (t, 0);
2055d27a 4767 if (!RECUR (tmp, rval))
09b42213 4768 return false;
4769 if (!processing_template_decl)
4770 tmp = cxx_eval_outermost_constant_expr (tmp, true);
4771 if (integer_zerop (tmp))
2055d27a 4772 return RECUR (TREE_OPERAND (t, 2), want_rval);
09b42213 4773 else if (TREE_CODE (tmp) == INTEGER_CST)
2055d27a 4774 return RECUR (TREE_OPERAND (t, 1), want_rval);
09b42213 4775 for (i = 1; i < 3; ++i)
4776 if (potential_constant_expression_1 (TREE_OPERAND (t, i),
2055d27a 4777 want_rval, strict, tf_none))
09b42213 4778 return true;
4779 if (flags & tf_error)
4780 error ("expression %qE is not a constant-expression", t);
4781 return false;
4782
4783 case VEC_INIT_EXPR:
4784 if (VEC_INIT_EXPR_IS_CONSTEXPR (t))
4785 return true;
4786 if (flags & tf_error)
4787 {
4788 error ("non-constant array initialization");
4789 diagnose_non_constexpr_vec_init (t);
4790 }
4791 return false;
4792
db1ae94f 4793 case TYPE_DECL:
4794 case TAG_DEFN:
4795 /* We can see these in statement-expressions. */
4796 return true;
4797
d2c63826 4798 case EMPTY_CLASS_EXPR:
4799 return false;
4800
09b42213 4801 default:
4802 if (objc_is_property_ref (t))
4803 return false;
4804
4805 sorry ("unexpected AST of kind %s", get_tree_code_name (TREE_CODE (t)));
4806 gcc_unreachable();
4807 return false;
4808 }
2055d27a 4809#undef RECUR
09b42213 4810}
4811
4812/* The main entry point to the above. */
4813
4814bool
4815potential_constant_expression (tree t)
4816{
2055d27a 4817 return potential_constant_expression_1 (t, false, true, tf_none);
4818}
4819
4820bool
4821potential_static_init_expression (tree t)
4822{
4823 return potential_constant_expression_1 (t, false, false, tf_none);
09b42213 4824}
4825
4826/* As above, but require a constant rvalue. */
4827
4828bool
4829potential_rvalue_constant_expression (tree t)
4830{
2055d27a 4831 return potential_constant_expression_1 (t, true, true, tf_none);
09b42213 4832}
4833
4834/* Like above, but complain about non-constant expressions. */
4835
4836bool
4837require_potential_constant_expression (tree t)
4838{
2055d27a 4839 return potential_constant_expression_1 (t, false, true, tf_warning_or_error);
09b42213 4840}
4841
4842/* Cross product of the above. */
4843
4844bool
4845require_potential_rvalue_constant_expression (tree t)
4846{
2055d27a 4847 return potential_constant_expression_1 (t, true, true, tf_warning_or_error);
09b42213 4848}
4849
4850#include "gt-cp-constexpr.h"