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