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