1 /* Perform -*- C++ -*- constant expression evaluation, including calls to
2 constexpr functions. These routines are used both during actual parsing
3 and during the instantiation of template functions.
4
5 Copyright (C) 1998-2020 Free Software Foundation, Inc.
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
19 You should have received a copy of the GNU General Public License
20 along 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"
26 #include "cp-tree.h"
27 #include "varasm.h"
28 #include "c-family/c-objc.h"
29 #include "tree-iterator.h"
30 #include "gimplify.h"
31 #include "builtins.h"
32 #include "tree-inline.h"
33 #include "ubsan.h"
34 #include "gimple-fold.h"
35 #include "timevar.h"
36 #include "fold-const-call.h"
37 #include "stor-layout.h"
38 #include "cgraph.h"
39
40 static bool verify_constant (tree, bool, bool *, bool *);
41 #define VERIFY_CONSTANT(X) \
42 do { \
43 if (verify_constant ((X), ctx->quiet, non_constant_p, overflow_p)) \
44 return t; \
45 } while (0)
46
47 static HOST_WIDE_INT find_array_ctor_elt (tree ary, tree dindex,
48 bool insert = false);
49
50 /* Returns true iff FUN is an instantiation of a constexpr function
51 template or a defaulted constexpr function. */
52
53 bool
is_instantiation_of_constexpr(tree fun)54 is_instantiation_of_constexpr (tree fun)
55 {
56 return ((DECL_TEMPLOID_INSTANTIATION (fun)
57 && DECL_DECLARED_CONSTEXPR_P (DECL_TI_TEMPLATE (fun)))
58 || (DECL_DEFAULTED_FN (fun)
59 && DECL_DECLARED_CONSTEXPR_P (fun)));
60 }
61
62 /* Return true if T is a literal type. */
63
64 bool
literal_type_p(tree t)65 literal_type_p (tree t)
66 {
67 if (SCALAR_TYPE_P (t)
68 || VECTOR_TYPE_P (t)
69 || TYPE_REF_P (t)
70 || (VOID_TYPE_P (t) && cxx_dialect >= cxx14))
71 return true;
72 if (CLASS_TYPE_P (t))
73 {
74 t = complete_type (t);
75 gcc_assert (COMPLETE_TYPE_P (t) || errorcount);
76 return CLASSTYPE_LITERAL_P (t);
77 }
78 if (TREE_CODE (t) == ARRAY_TYPE)
79 return literal_type_p (strip_array_types (t));
80 return false;
81 }
82
83 /* If DECL is a variable declared `constexpr', require its type
84 be literal. Return error_mark_node if we give an error, the
85 DECL otherwise. */
86
87 tree
ensure_literal_type_for_constexpr_object(tree decl)88 ensure_literal_type_for_constexpr_object (tree decl)
89 {
90 tree type = TREE_TYPE (decl);
91 if (VAR_P (decl)
92 && (DECL_DECLARED_CONSTEXPR_P (decl)
93 || var_in_constexpr_fn (decl))
94 && !processing_template_decl)
95 {
96 tree stype = strip_array_types (type);
97 if (CLASS_TYPE_P (stype) && !COMPLETE_TYPE_P (complete_type (stype)))
98 /* Don't complain here, we'll complain about incompleteness
99 when we try to initialize the variable. */;
100 else if (type_uses_auto (type))
101 /* We don't know the actual type yet. */;
102 else if (!literal_type_p (type))
103 {
104 if (DECL_DECLARED_CONSTEXPR_P (decl))
105 {
106 auto_diagnostic_group d;
107 error_at (DECL_SOURCE_LOCATION (decl),
108 "the type %qT of %<constexpr%> variable %qD "
109 "is not literal", type, decl);
110 explain_non_literal_class (type);
111 decl = error_mark_node;
112 }
113 else
114 {
115 if (!is_instantiation_of_constexpr (current_function_decl))
116 {
117 auto_diagnostic_group d;
118 error_at (DECL_SOURCE_LOCATION (decl),
119 "variable %qD of non-literal type %qT in "
120 "%<constexpr%> function", decl, type);
121 explain_non_literal_class (type);
122 decl = error_mark_node;
123 }
124 cp_function_chain->invalid_constexpr = true;
125 }
126 }
127 else if (DECL_DECLARED_CONSTEXPR_P (decl)
128 && variably_modified_type_p (type, NULL_TREE))
129 {
130 error_at (DECL_SOURCE_LOCATION (decl),
131 "%<constexpr%> variable %qD has variably-modified "
132 "type %qT", decl, type);
133 decl = error_mark_node;
134 }
135 }
136 return decl;
137 }
138
139 /* Representation of entries in the constexpr function definition table. */
140
141 struct GTY((for_user)) constexpr_fundef {
142 tree decl;
143 tree body;
144 tree parms;
145 tree result;
146 };
147
148 struct constexpr_fundef_hasher : ggc_ptr_hash<constexpr_fundef>
149 {
150 static hashval_t hash (constexpr_fundef *);
151 static bool equal (constexpr_fundef *, constexpr_fundef *);
152 };
153
154 /* This table holds all constexpr function definitions seen in
155 the current translation unit. */
156
157 static GTY (()) hash_table<constexpr_fundef_hasher> *constexpr_fundef_table;
158
159 /* Utility function used for managing the constexpr function table.
160 Return true if the entries pointed to by P and Q are for the
161 same constexpr function. */
162
163 inline bool
equal(constexpr_fundef * lhs,constexpr_fundef * rhs)164 constexpr_fundef_hasher::equal (constexpr_fundef *lhs, constexpr_fundef *rhs)
165 {
166 return lhs->decl == rhs->decl;
167 }
168
169 /* Utility function used for managing the constexpr function table.
170 Return a hash value for the entry pointed to by Q. */
171
172 inline hashval_t
hash(constexpr_fundef * fundef)173 constexpr_fundef_hasher::hash (constexpr_fundef *fundef)
174 {
175 return DECL_UID (fundef->decl);
176 }
177
178 /* Return a previously saved definition of function FUN. */
179
180 static constexpr_fundef *
retrieve_constexpr_fundef(tree fun)181 retrieve_constexpr_fundef (tree fun)
182 {
183 if (constexpr_fundef_table == NULL)
184 return NULL;
185
186 constexpr_fundef fundef = { fun, NULL, NULL, NULL };
187 return constexpr_fundef_table->find (&fundef);
188 }
189
190 /* Check whether the parameter and return types of FUN are valid for a
191 constexpr function, and complain if COMPLAIN. */
192
193 bool
is_valid_constexpr_fn(tree fun,bool complain)194 is_valid_constexpr_fn (tree fun, bool complain)
195 {
196 bool ret = true;
197
198 if (DECL_INHERITED_CTOR (fun)
199 && TREE_CODE (fun) == TEMPLATE_DECL)
200 {
201 ret = false;
202 if (complain)
203 error ("inherited constructor %qD is not %<constexpr%>",
204 DECL_INHERITED_CTOR (fun));
205 }
206 else
207 {
208 for (tree parm = FUNCTION_FIRST_USER_PARM (fun);
209 parm != NULL_TREE; parm = TREE_CHAIN (parm))
210 if (!literal_type_p (TREE_TYPE (parm)))
211 {
212 ret = false;
213 if (complain)
214 {
215 auto_diagnostic_group d;
216 error ("invalid type for parameter %d of %<constexpr%> "
217 "function %q+#D", DECL_PARM_INDEX (parm), fun);
218 explain_non_literal_class (TREE_TYPE (parm));
219 }
220 }
221 }
222
223 if (LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun)) && cxx_dialect < cxx17)
224 {
225 ret = false;
226 if (complain)
227 inform (DECL_SOURCE_LOCATION (fun),
228 "lambdas are implicitly %<constexpr%> only in C++17 and later");
229 }
230 else if (!DECL_CONSTRUCTOR_P (fun))
231 {
232 tree rettype = TREE_TYPE (TREE_TYPE (fun));
233 if (!literal_type_p (rettype))
234 {
235 ret = false;
236 if (complain)
237 {
238 auto_diagnostic_group d;
239 error ("invalid return type %qT of %<constexpr%> function %q+D",
240 rettype, fun);
241 explain_non_literal_class (rettype);
242 }
243 }
244
245 /* C++14 DR 1684 removed this restriction. */
246 if (cxx_dialect < cxx14
247 && DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
248 && !CLASSTYPE_LITERAL_P (DECL_CONTEXT (fun)))
249 {
250 ret = false;
251 if (complain)
252 {
253 auto_diagnostic_group d;
254 if (pedwarn (DECL_SOURCE_LOCATION (fun), OPT_Wpedantic,
255 "enclosing class of %<constexpr%> non-static"
256 " member function %q+#D is not a literal type",
257 fun))
258 explain_non_literal_class (DECL_CONTEXT (fun));
259 }
260 }
261 }
262 else if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fun)))
263 {
264 ret = false;
265 if (complain)
266 error ("%q#T has virtual base classes", DECL_CONTEXT (fun));
267 }
268
269 return ret;
270 }
271
272 /* Subroutine of build_data_member_initialization. MEMBER is a COMPONENT_REF
273 for a member of an anonymous aggregate, INIT is the initializer for that
274 member, and VEC_OUTER is the vector of constructor elements for the class
275 whose constructor we are processing. Add the initializer to the vector
276 and return true to indicate success. */
277
278 static bool
build_anon_member_initialization(tree member,tree init,vec<constructor_elt,va_gc> ** vec_outer)279 build_anon_member_initialization (tree member, tree init,
280 vec<constructor_elt, va_gc> **vec_outer)
281 {
282 /* MEMBER presents the relevant fields from the inside out, but we need
283 to build up the initializer from the outside in so that we can reuse
284 previously built CONSTRUCTORs if this is, say, the second field in an
285 anonymous struct. So we use a vec as a stack. */
286 auto_vec<tree, 2> fields;
287 do
288 {
289 fields.safe_push (TREE_OPERAND (member, 1));
290 member = TREE_OPERAND (member, 0);
291 }
292 while (ANON_AGGR_TYPE_P (TREE_TYPE (member))
293 && TREE_CODE (member) == COMPONENT_REF);
294
295 /* VEC has the constructor elements vector for the context of FIELD.
296 If FIELD is an anonymous aggregate, we will push inside it. */
297 vec<constructor_elt, va_gc> **vec = vec_outer;
298 tree field;
299 while (field = fields.pop(),
300 ANON_AGGR_TYPE_P (TREE_TYPE (field)))
301 {
302 tree ctor;
303 /* If there is already an outer constructor entry for the anonymous
304 aggregate FIELD, use it; otherwise, insert one. */
305 if (vec_safe_is_empty (*vec)
306 || (*vec)->last().index != field)
307 {
308 ctor = build_constructor (TREE_TYPE (field), NULL);
309 CONSTRUCTOR_APPEND_ELT (*vec, field, ctor);
310 }
311 else
312 ctor = (*vec)->last().value;
313 vec = &CONSTRUCTOR_ELTS (ctor);
314 }
315
316 /* Now we're at the innermost field, the one that isn't an anonymous
317 aggregate. Add its initializer to the CONSTRUCTOR and we're done. */
318 gcc_assert (fields.is_empty());
319 CONSTRUCTOR_APPEND_ELT (*vec, field, init);
320
321 return true;
322 }
323
324 /* Subroutine of build_constexpr_constructor_member_initializers.
325 The expression tree T represents a data member initialization
326 in a (constexpr) constructor definition. Build a pairing of
327 the data member with its initializer, and prepend that pair
328 to the existing initialization pair INITS. */
329
330 static bool
build_data_member_initialization(tree t,vec<constructor_elt,va_gc> ** vec)331 build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec)
332 {
333 tree member, init;
334 if (TREE_CODE (t) == CLEANUP_POINT_EXPR)
335 t = TREE_OPERAND (t, 0);
336 if (TREE_CODE (t) == EXPR_STMT)
337 t = TREE_OPERAND (t, 0);
338 if (t == error_mark_node)
339 return false;
340 if (TREE_CODE (t) == STATEMENT_LIST)
341 {
342 tree_stmt_iterator i;
343 for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
344 {
345 if (! build_data_member_initialization (tsi_stmt (i), vec))
346 return false;
347 }
348 return true;
349 }
350 if (TREE_CODE (t) == CLEANUP_STMT)
351 {
352 /* We can't see a CLEANUP_STMT in a constructor for a literal class,
353 but we can in a constexpr constructor for a non-literal class. Just
354 ignore it; either all the initialization will be constant, in which
355 case the cleanup can't run, or it can't be constexpr.
356 Still recurse into CLEANUP_BODY. */
357 return build_data_member_initialization (CLEANUP_BODY (t), vec);
358 }
359 if (TREE_CODE (t) == CONVERT_EXPR)
360 t = TREE_OPERAND (t, 0);
361 if (TREE_CODE (t) == INIT_EXPR
362 /* vptr initialization shows up as a MODIFY_EXPR. In C++14 we only
363 use what this function builds for cx_check_missing_mem_inits, and
364 assignment in the ctor body doesn't count. */
365 || (cxx_dialect < cxx14 && TREE_CODE (t) == MODIFY_EXPR))
366 {
367 member = TREE_OPERAND (t, 0);
368 init = break_out_target_exprs (TREE_OPERAND (t, 1));
369 }
370 else if (TREE_CODE (t) == CALL_EXPR)
371 {
372 tree fn = get_callee_fndecl (t);
373 if (!fn || !DECL_CONSTRUCTOR_P (fn))
374 /* We're only interested in calls to subobject constructors. */
375 return true;
376 member = CALL_EXPR_ARG (t, 0);
377 /* We don't use build_cplus_new here because it complains about
378 abstract bases. Leaving the call unwrapped means that it has the
379 wrong type, but cxx_eval_constant_expression doesn't care. */
380 init = break_out_target_exprs (t);
381 }
382 else if (TREE_CODE (t) == BIND_EXPR)
383 return build_data_member_initialization (BIND_EXPR_BODY (t), vec);
384 else
385 /* Don't add anything else to the CONSTRUCTOR. */
386 return true;
387 if (INDIRECT_REF_P (member))
388 member = TREE_OPERAND (member, 0);
389 if (TREE_CODE (member) == NOP_EXPR)
390 {
391 tree op = member;
392 STRIP_NOPS (op);
393 if (TREE_CODE (op) == ADDR_EXPR)
394 {
395 gcc_assert (same_type_ignoring_top_level_qualifiers_p
396 (TREE_TYPE (TREE_TYPE (op)),
397 TREE_TYPE (TREE_TYPE (member))));
398 /* Initializing a cv-qualified member; we need to look through
399 the const_cast. */
400 member = op;
401 }
402 else if (op == current_class_ptr
403 && (same_type_ignoring_top_level_qualifiers_p
404 (TREE_TYPE (TREE_TYPE (member)),
405 current_class_type)))
406 /* Delegating constructor. */
407 member = op;
408 else
409 {
410 /* This is an initializer for an empty base; keep it for now so
411 we can check it in cxx_eval_bare_aggregate. */
412 gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (member))));
413 }
414 }
415 if (TREE_CODE (member) == ADDR_EXPR)
416 member = TREE_OPERAND (member, 0);
417 if (TREE_CODE (member) == COMPONENT_REF)
418 {
419 tree aggr = TREE_OPERAND (member, 0);
420 if (TREE_CODE (aggr) == VAR_DECL)
421 /* Initializing a local variable, don't add anything. */
422 return true;
423 if (TREE_CODE (aggr) != COMPONENT_REF)
424 /* Normal member initialization. */
425 member = TREE_OPERAND (member, 1);
426 else if (ANON_AGGR_TYPE_P (TREE_TYPE (aggr)))
427 /* Initializing a member of an anonymous union. */
428 return build_anon_member_initialization (member, init, vec);
429 else
430 /* We're initializing a vtable pointer in a base. Leave it as
431 COMPONENT_REF so we remember the path to get to the vfield. */
432 gcc_assert (TREE_TYPE (member) == vtbl_ptr_type_node);
433 }
434
435 /* Value-initialization can produce multiple initializers for the
436 same field; use the last one. */
437 if (!vec_safe_is_empty (*vec) && (*vec)->last().index == member)
438 (*vec)->last().value = init;
439 else
440 CONSTRUCTOR_APPEND_ELT (*vec, member, init);
441 return true;
442 }
443
444 /* Subroutine of check_constexpr_ctor_body_1 and constexpr_fn_retval.
445 In C++11 mode checks that the TYPE_DECLs in the BIND_EXPR_VARS of a
446 BIND_EXPR conform to 7.1.5/3/4 on typedef and alias declarations. */
447
448 static bool
check_constexpr_bind_expr_vars(tree t)449 check_constexpr_bind_expr_vars (tree t)
450 {
451 gcc_assert (TREE_CODE (t) == BIND_EXPR);
452
453 for (tree var = BIND_EXPR_VARS (t); var; var = DECL_CHAIN (var))
454 if (TREE_CODE (var) == TYPE_DECL
455 && DECL_IMPLICIT_TYPEDEF_P (var)
456 && !LAMBDA_TYPE_P (TREE_TYPE (var)))
457 return false;
458 return true;
459 }
460
461 /* Subroutine of check_constexpr_ctor_body. */
462
463 static bool
check_constexpr_ctor_body_1(tree last,tree list)464 check_constexpr_ctor_body_1 (tree last, tree list)
465 {
466 switch (TREE_CODE (list))
467 {
468 case DECL_EXPR:
469 if (TREE_CODE (DECL_EXPR_DECL (list)) == USING_DECL
470 || TREE_CODE (DECL_EXPR_DECL (list)) == TYPE_DECL)
471 return true;
472 return false;
473
474 case CLEANUP_POINT_EXPR:
475 return check_constexpr_ctor_body (last, TREE_OPERAND (list, 0),
476 /*complain=*/false);
477
478 case BIND_EXPR:
479 if (!check_constexpr_bind_expr_vars (list)
480 || !check_constexpr_ctor_body (last, BIND_EXPR_BODY (list),
481 /*complain=*/false))
482 return false;
483 return true;
484
485 case USING_STMT:
486 case STATIC_ASSERT:
487 case DEBUG_BEGIN_STMT:
488 return true;
489
490 default:
491 return false;
492 }
493 }
494
495 /* Make sure that there are no statements after LAST in the constructor
496 body represented by LIST. */
497
498 bool
check_constexpr_ctor_body(tree last,tree list,bool complain)499 check_constexpr_ctor_body (tree last, tree list, bool complain)
500 {
501 /* C++14 doesn't require a constexpr ctor to have an empty body. */
502 if (cxx_dialect >= cxx14)
503 return true;
504
505 bool ok = true;
506 if (TREE_CODE (list) == STATEMENT_LIST)
507 {
508 tree_stmt_iterator i = tsi_last (list);
509 for (; !tsi_end_p (i); tsi_prev (&i))
510 {
511 tree t = tsi_stmt (i);
512 if (t == last)
513 break;
514 if (!check_constexpr_ctor_body_1 (last, t))
515 {
516 ok = false;
517 break;
518 }
519 }
520 }
521 else if (list != last
522 && !check_constexpr_ctor_body_1 (last, list))
523 ok = false;
524 if (!ok)
525 {
526 if (complain)
527 error ("%<constexpr%> constructor does not have empty body");
528 DECL_DECLARED_CONSTEXPR_P (current_function_decl) = false;
529 }
530 return ok;
531 }
532
533 /* V is a vector of constructor elements built up for the base and member
534 initializers of a constructor for TYPE. They need to be in increasing
535 offset order, which they might not be yet if TYPE has a primary base
536 which is not first in the base-clause or a vptr and at least one base
537 all of which are non-primary. */
538
539 static vec<constructor_elt, va_gc> *
sort_constexpr_mem_initializers(tree type,vec<constructor_elt,va_gc> * v)540 sort_constexpr_mem_initializers (tree type, vec<constructor_elt, va_gc> *v)
541 {
542 tree pri = CLASSTYPE_PRIMARY_BINFO (type);
543 tree field_type;
544 unsigned i;
545 constructor_elt *ce;
546
547 if (pri)
548 field_type = BINFO_TYPE (pri);
549 else if (TYPE_CONTAINS_VPTR_P (type))
550 field_type = vtbl_ptr_type_node;
551 else
552 return v;
553
554 /* Find the element for the primary base or vptr and move it to the
555 beginning of the vec. */
556 for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
557 if (TREE_TYPE (ce->index) == field_type)
558 break;
559
560 if (i > 0 && i < vec_safe_length (v))
561 {
562 vec<constructor_elt, va_gc> &vref = *v;
563 constructor_elt elt = vref[i];
564 for (; i > 0; --i)
565 vref[i] = vref[i-1];
566 vref[0] = elt;
567 }
568
569 return v;
570 }
571
572 /* Build compile-time evalable representations of member-initializer list
573 for a constexpr constructor. */
574
575 static tree
build_constexpr_constructor_member_initializers(tree type,tree body)576 build_constexpr_constructor_member_initializers (tree type, tree body)
577 {
578 vec<constructor_elt, va_gc> *vec = NULL;
579 bool ok = true;
580 while (true)
581 switch (TREE_CODE (body))
582 {
583 case MUST_NOT_THROW_EXPR:
584 case EH_SPEC_BLOCK:
585 body = TREE_OPERAND (body, 0);
586 break;
587
588 case STATEMENT_LIST:
589 for (tree_stmt_iterator i = tsi_start (body);
590 !tsi_end_p (i); tsi_next (&i))
591 {
592 body = tsi_stmt (i);
593 if (TREE_CODE (body) == BIND_EXPR)
594 break;
595 }
596 break;
597
598 case BIND_EXPR:
599 body = BIND_EXPR_BODY (body);
600 goto found;
601
602 default:
603 gcc_unreachable ();
604 }
605 found:
606 if (TREE_CODE (body) == TRY_BLOCK)
607 {
608 body = TREE_OPERAND (body, 0);
609 if (TREE_CODE (body) == BIND_EXPR)
610 body = BIND_EXPR_BODY (body);
611 }
612 if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
613 {
614 body = TREE_OPERAND (body, 0);
615 if (TREE_CODE (body) == EXPR_STMT)
616 body = TREE_OPERAND (body, 0);
617 if (TREE_CODE (body) == INIT_EXPR
618 && (same_type_ignoring_top_level_qualifiers_p
619 (TREE_TYPE (TREE_OPERAND (body, 0)),
620 current_class_type)))
621 {
622 /* Trivial copy. */
623 return TREE_OPERAND (body, 1);
624 }
625 ok = build_data_member_initialization (body, &vec);
626 }
627 else if (TREE_CODE (body) == STATEMENT_LIST)
628 {
629 tree_stmt_iterator i;
630 for (i = tsi_start (body); !tsi_end_p (i); tsi_next (&i))
631 {
632 ok = build_data_member_initialization (tsi_stmt (i), &vec);
633 if (!ok)
634 break;
635 }
636 }
637 else if (EXPR_P (body))
638 ok = build_data_member_initialization (body, &vec);
639 else
640 gcc_assert (errorcount > 0);
641 if (ok)
642 {
643 if (vec_safe_length (vec) > 0)
644 {
645 /* In a delegating constructor, return the target. */
646 constructor_elt *ce = &(*vec)[0];
647 if (ce->index == current_class_ptr)
648 {
649 body = ce->value;
650 vec_free (vec);
651 return body;
652 }
653 }
654 vec = sort_constexpr_mem_initializers (type, vec);
655 return build_constructor (type, vec);
656 }
657 else
658 return error_mark_node;
659 }
660
661 /* We have an expression tree T that represents a call, either CALL_EXPR
662 or AGGR_INIT_EXPR. If the call is lexically to a named function,
663 retrun the _DECL for that function. */
664
665 static tree
get_function_named_in_call(tree t)666 get_function_named_in_call (tree t)
667 {
668 tree fun = cp_get_callee (t);
669 if (fun && TREE_CODE (fun) == ADDR_EXPR
670 && TREE_CODE (TREE_OPERAND (fun, 0)) == FUNCTION_DECL)
671 fun = TREE_OPERAND (fun, 0);
672 return fun;
673 }
674
675 /* Subroutine of register_constexpr_fundef. BODY is the body of a function
676 declared to be constexpr, or a sub-statement thereof. Returns the
677 return value if suitable, error_mark_node for a statement not allowed in
678 a constexpr function, or NULL_TREE if no return value was found. */
679
680 tree
constexpr_fn_retval(tree body)681 constexpr_fn_retval (tree body)
682 {
683 switch (TREE_CODE (body))
684 {
685 case STATEMENT_LIST:
686 {
687 tree_stmt_iterator i;
688 tree expr = NULL_TREE;
689 for (i = tsi_start (body); !tsi_end_p (i); tsi_next (&i))
690 {
691 tree s = constexpr_fn_retval (tsi_stmt (i));
692 if (s == error_mark_node)
693 return error_mark_node;
694 else if (s == NULL_TREE)
695 /* Keep iterating. */;
696 else if (expr)
697 /* Multiple return statements. */
698 return error_mark_node;
699 else
700 expr = s;
701 }
702 return expr;
703 }
704
705 case RETURN_EXPR:
706 return break_out_target_exprs (TREE_OPERAND (body, 0));
707
708 case DECL_EXPR:
709 {
710 tree decl = DECL_EXPR_DECL (body);
711 if (TREE_CODE (decl) == USING_DECL
712 /* Accept __func__, __FUNCTION__, and __PRETTY_FUNCTION__. */
713 || DECL_ARTIFICIAL (decl))
714 return NULL_TREE;
715 return error_mark_node;
716 }
717
718 case CLEANUP_POINT_EXPR:
719 return constexpr_fn_retval (TREE_OPERAND (body, 0));
720
721 case BIND_EXPR:
722 if (!check_constexpr_bind_expr_vars (body))
723 return error_mark_node;
724 return constexpr_fn_retval (BIND_EXPR_BODY (body));
725
726 case USING_STMT:
727 case DEBUG_BEGIN_STMT:
728 return NULL_TREE;
729
730 case CALL_EXPR:
731 {
732 tree fun = get_function_named_in_call (body);
733 if (fun != NULL_TREE
734 && fndecl_built_in_p (fun, BUILT_IN_UNREACHABLE))
735 return NULL_TREE;
736 }
737 /* Fallthru. */
738
739 default:
740 return error_mark_node;
741 }
742 }
743
744 /* Subroutine of register_constexpr_fundef. BODY is the DECL_SAVED_TREE of
745 FUN; do the necessary transformations to turn it into a single expression
746 that we can store in the hash table. */
747
748 static tree
massage_constexpr_body(tree fun,tree body)749 massage_constexpr_body (tree fun, tree body)
750 {
751 if (DECL_CONSTRUCTOR_P (fun))
752 body = build_constexpr_constructor_member_initializers
753 (DECL_CONTEXT (fun), body);
754 else if (cxx_dialect < cxx14)
755 {
756 if (TREE_CODE (body) == EH_SPEC_BLOCK)
757 body = EH_SPEC_STMTS (body);
758 if (TREE_CODE (body) == MUST_NOT_THROW_EXPR)
759 body = TREE_OPERAND (body, 0);
760 body = constexpr_fn_retval (body);
761 }
762 return body;
763 }
764
765 /* CTYPE is a type constructed from BODY. Return true if some
766 bases/fields are uninitialized, and complain if COMPLAIN. */
767
768 static bool
cx_check_missing_mem_inits(tree ctype,tree body,bool complain)769 cx_check_missing_mem_inits (tree ctype, tree body, bool complain)
770 {
771 /* We allow uninitialized bases/fields in C++20. */
772 if (cxx_dialect >= cxx2a)
773 return false;
774
775 unsigned nelts = 0;
776
777 if (body)
778 {
779 if (TREE_CODE (body) != CONSTRUCTOR)
780 return false;
781 nelts = CONSTRUCTOR_NELTS (body);
782 }
783 tree field = TYPE_FIELDS (ctype);
784
785 if (TREE_CODE (ctype) == UNION_TYPE)
786 {
787 if (nelts == 0 && next_initializable_field (field))
788 {
789 if (complain)
790 error ("%<constexpr%> constructor for union %qT must "
791 "initialize exactly one non-static data member", ctype);
792 return true;
793 }
794 return false;
795 }
796
797 /* Iterate over the CONSTRUCTOR, checking any missing fields don't
798 need an explicit initialization. */
799 bool bad = false;
800 for (unsigned i = 0; i <= nelts; ++i)
801 {
802 tree index = NULL_TREE;
803 if (i < nelts)
804 {
805 index = CONSTRUCTOR_ELT (body, i)->index;
806 /* Skip base and vtable inits. */
807 if (TREE_CODE (index) != FIELD_DECL
808 || DECL_ARTIFICIAL (index))
809 continue;
810 }
811
812 for (; field != index; field = DECL_CHAIN (field))
813 {
814 tree ftype;
815 if (TREE_CODE (field) != FIELD_DECL)
816 continue;
817 if (DECL_UNNAMED_BIT_FIELD (field))
818 continue;
819 if (DECL_ARTIFICIAL (field))
820 continue;
821 if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
822 {
823 /* Recurse to check the anonymous aggregate member. */
824 bad |= cx_check_missing_mem_inits
825 (TREE_TYPE (field), NULL_TREE, complain);
826 if (bad && !complain)
827 return true;
828 continue;
829 }
830 ftype = TREE_TYPE (field);
831 if (!ftype || !TYPE_P (ftype) || !COMPLETE_TYPE_P (ftype))
832 /* A flexible array can't be intialized here, so don't complain
833 that it isn't. */
834 continue;
835 if (DECL_SIZE (field) && integer_zerop (DECL_SIZE (field)))
836 /* An empty field doesn't need an initializer. */
837 continue;
838 ftype = strip_array_types (ftype);
839 if (type_has_constexpr_default_constructor (ftype))
840 {
841 /* It's OK to skip a member with a trivial constexpr ctor.
842 A constexpr ctor that isn't trivial should have been
843 added in by now. */
844 gcc_checking_assert (!TYPE_HAS_COMPLEX_DFLT (ftype)
845 || errorcount != 0);
846 continue;
847 }
848 if (!complain)
849 return true;
850 auto_diagnostic_group d;
851 error ("member %qD must be initialized by mem-initializer "
852 "in %<constexpr%> constructor", field);
853 inform (DECL_SOURCE_LOCATION (field), "declared here");
854 bad = true;
855 }
856 if (field == NULL_TREE)
857 break;
858
859 if (ANON_AGGR_TYPE_P (TREE_TYPE (index)))
860 {
861 /* Check the anonymous aggregate initializer is valid. */
862 bad |= cx_check_missing_mem_inits
863 (TREE_TYPE (index), CONSTRUCTOR_ELT (body, i)->value, complain);
864 if (bad && !complain)
865 return true;
866 }
867 field = DECL_CHAIN (field);
868 }
869
870 return bad;
871 }
872
873 /* We are processing the definition of the constexpr function FUN.
874 Check that its BODY fulfills the propriate requirements and
875 enter it in the constexpr function definition table.
876 For constructor BODY is actually the TREE_LIST of the
877 member-initializer list. */
878
879 tree
register_constexpr_fundef(tree fun,tree body)880 register_constexpr_fundef (tree fun, tree body)
881 {
882 constexpr_fundef entry;
883 constexpr_fundef **slot;
884
885 if (!is_valid_constexpr_fn (fun, !DECL_GENERATED_P (fun)))
886 return NULL;
887
888 tree massaged = massage_constexpr_body (fun, body);
889 if (massaged == NULL_TREE || massaged == error_mark_node)
890 {
891 if (!DECL_CONSTRUCTOR_P (fun))
892 error ("body of %<constexpr%> function %qD not a return-statement",
893 fun);
894 return NULL;
895 }
896
897 bool potential = potential_rvalue_constant_expression (massaged);
898 if (!potential && !DECL_GENERATED_P (fun))
899 require_potential_rvalue_constant_expression (massaged);
900
901 if (DECL_CONSTRUCTOR_P (fun) && !DECL_DEFAULTED_FN (fun)
902 && cx_check_missing_mem_inits (DECL_CONTEXT (fun),
903 massaged, !DECL_GENERATED_P (fun)))
904 potential = false;
905
906 if (!potential && !DECL_GENERATED_P (fun))
907 return NULL;
908
909 /* Create the constexpr function table if necessary. */
910 if (constexpr_fundef_table == NULL)
911 constexpr_fundef_table
912 = hash_table<constexpr_fundef_hasher>::create_ggc (101);
913
914 entry.decl = fun;
915 tree saved_fn = current_function_decl;
916 bool clear_ctx = false;
917 current_function_decl = fun;
918 if (DECL_RESULT (fun) && DECL_CONTEXT (DECL_RESULT (fun)) == NULL_TREE)
919 {
920 clear_ctx = true;
921 DECL_CONTEXT (DECL_RESULT (fun)) = fun;
922 }
923 entry.body = copy_fn (fun, entry.parms, entry.result);
924 current_function_decl = saved_fn;
925 slot = constexpr_fundef_table->find_slot (&entry, INSERT);
926 if (clear_ctx)
927 DECL_CONTEXT (DECL_RESULT (fun)) = NULL_TREE;
928
929 if (!potential)
930 /* For a template instantiation, we want to remember the pre-generic body
931 for explain_invalid_constexpr_fn, but do tell cxx_eval_call_expression
932 that it doesn't need to bother trying to expand the function. */
933 entry.result = error_mark_node;
934
935 gcc_assert (*slot == NULL);
936 *slot = ggc_alloc<constexpr_fundef> ();
937 **slot = entry;
938
939 return fun;
940 }
941
942 /* FUN is a non-constexpr function called in a context that requires a
943 constant expression. If it comes from a constexpr template, explain why
944 the instantiation isn't constexpr. */
945
946 void
explain_invalid_constexpr_fn(tree fun)947 explain_invalid_constexpr_fn (tree fun)
948 {
949 static hash_set<tree> *diagnosed;
950 tree body;
951 location_t save_loc;
952 /* Only diagnose defaulted functions, lambdas, or instantiations. */
953 if (!DECL_DEFAULTED_FN (fun)
954 && !LAMBDA_TYPE_P (CP_DECL_CONTEXT (fun))
955 && !is_instantiation_of_constexpr (fun))
956 {
957 inform (DECL_SOURCE_LOCATION (fun), "%qD declared here", fun);
958 return;
959 }
960 if (diagnosed == NULL)
961 diagnosed = new hash_set<tree>;
962 if (diagnosed->add (fun))
963 /* Already explained. */
964 return;
965
966 save_loc = input_location;
967 if (!lambda_static_thunk_p (fun))
968 {
969 /* Diagnostics should completely ignore the static thunk, so leave
970 input_location set to our caller's location. */
971 input_location = DECL_SOURCE_LOCATION (fun);
972 inform (input_location,
973 "%qD is not usable as a %<constexpr%> function because:", fun);
974 }
975 /* First check the declaration. */
976 if (is_valid_constexpr_fn (fun, true))
977 {
978 /* Then if it's OK, the body. */
979 if (!DECL_DECLARED_CONSTEXPR_P (fun)
980 && DECL_DEFAULTED_FN (fun))
981 explain_implicit_non_constexpr (fun);
982 else
983 {
984 if (constexpr_fundef *fd = retrieve_constexpr_fundef (fun))
985 body = fd->body;
986 else
987 body = DECL_SAVED_TREE (fun);
988 body = massage_constexpr_body (fun, body);
989 require_potential_rvalue_constant_expression (body);
990 if (DECL_CONSTRUCTOR_P (fun))
991 cx_check_missing_mem_inits (DECL_CONTEXT (fun), body, true);
992 }
993 }
994 input_location = save_loc;
995 }
996
997 /* Objects of this type represent calls to constexpr functions
998 along with the bindings of parameters to their arguments, for
999 the purpose of compile time evaluation. */
1000
1001 struct GTY((for_user)) constexpr_call {
1002 /* Description of the constexpr function definition. */
1003 constexpr_fundef *fundef;
1004 /* Parameter bindings environment. A TREE_VEC of arguments. */
1005 tree bindings;
1006 /* Result of the call.
1007 NULL means the call is being evaluated.
1008 error_mark_node means that the evaluation was erroneous;
1009 otherwise, the actuall value of the call. */
1010 tree result;
1011 /* The hash of this call; we remember it here to avoid having to
1012 recalculate it when expanding the hash table. */
1013 hashval_t hash;
1014 /* Whether __builtin_is_constant_evaluated() should evaluate to true. */
1015 bool manifestly_const_eval;
1016 };
1017
1018 struct constexpr_call_hasher : ggc_ptr_hash<constexpr_call>
1019 {
1020 static hashval_t hash (constexpr_call *);
1021 static bool equal (constexpr_call *, constexpr_call *);
1022 };
1023
1024 enum constexpr_switch_state {
1025 /* Used when processing a switch for the first time by cxx_eval_switch_expr
1026 and default: label for that switch has not been seen yet. */
1027 css_default_not_seen,
1028 /* Used when processing a switch for the first time by cxx_eval_switch_expr
1029 and default: label for that switch has been seen already. */
1030 css_default_seen,
1031 /* Used when processing a switch for the second time by
1032 cxx_eval_switch_expr, where default: label should match. */
1033 css_default_processing
1034 };
1035
1036 /* The constexpr expansion context part which needs one instance per
1037 cxx_eval_outermost_constant_expr invocation. VALUES is a map of values of
1038 variables initialized within the expression. */
1039
1040 struct constexpr_global_ctx {
1041 /* Values for any temporaries or local variables within the
1042 constant-expression. */
1043 hash_map<tree,tree> values;
1044 /* Number of cxx_eval_constant_expression calls (except skipped ones,
1045 on simple constants or location wrappers) encountered during current
1046 cxx_eval_outermost_constant_expr call. */
1047 HOST_WIDE_INT constexpr_ops_count;
1048 /* Heap VAR_DECLs created during the evaluation of the outermost constant
1049 expression. */
1050 auto_vec<tree, 16> heap_vars;
1051 /* Cleanups that need to be evaluated at the end of CLEANUP_POINT_EXPR. */
1052 vec<tree> *cleanups;
1053 /* Number of heap VAR_DECL deallocations. */
1054 unsigned heap_dealloc_count;
1055 /* Constructor. */
constexpr_global_ctxconstexpr_global_ctx1056 constexpr_global_ctx ()
1057 : constexpr_ops_count (0), cleanups (NULL), heap_dealloc_count (0) {}
1058 };
1059
1060 /* The constexpr expansion context. CALL is the current function
1061 expansion, CTOR is the current aggregate initializer, OBJECT is the
1062 object being initialized by CTOR, either a VAR_DECL or a _REF. */
1063
1064 struct constexpr_ctx {
1065 /* The part of the context that needs to be unique to the whole
1066 cxx_eval_outermost_constant_expr invocation. */
1067 constexpr_global_ctx *global;
1068 /* The innermost call we're evaluating. */
1069 constexpr_call *call;
1070 /* SAVE_EXPRs and TARGET_EXPR_SLOT vars of TARGET_EXPRs that we've seen
1071 within the current LOOP_EXPR. NULL if we aren't inside a loop. */
1072 vec<tree> *save_exprs;
1073 /* The CONSTRUCTOR we're currently building up for an aggregate
1074 initializer. */
1075 tree ctor;
1076 /* The object we're building the CONSTRUCTOR for. */
1077 tree object;
1078 /* If inside SWITCH_EXPR. */
1079 constexpr_switch_state *css_state;
1080 /* The aggregate initialization context inside which this one is nested. This
1081 is used by lookup_placeholder to resolve PLACEHOLDER_EXPRs. */
1082 const constexpr_ctx *parent;
1083
1084 /* Whether we should error on a non-constant expression or fail quietly.
1085 This flag needs to be here, but some of the others could move to global
1086 if they get larger than a word. */
1087 bool quiet;
1088 /* Whether we are strictly conforming to constant expression rules or
1089 trying harder to get a constant value. */
1090 bool strict;
1091 /* Whether __builtin_is_constant_evaluated () should be true. */
1092 bool manifestly_const_eval;
1093 /* Whether we want to avoid doing anything that will cause extra DECL_UID
1094 generation. */
1095 bool uid_sensitive;
1096 };
1097
1098 /* A table of all constexpr calls that have been evaluated by the
1099 compiler in this translation unit. */
1100
1101 static GTY (()) hash_table<constexpr_call_hasher> *constexpr_call_table;
1102
1103 static tree cxx_eval_constant_expression (const constexpr_ctx *, tree,
1104 bool, bool *, bool *, tree * = NULL);
1105
1106 /* Compute a hash value for a constexpr call representation. */
1107
1108 inline hashval_t
hash(constexpr_call * info)1109 constexpr_call_hasher::hash (constexpr_call *info)
1110 {
1111 return info->hash;
1112 }
1113
1114 /* Return true if the objects pointed to by P and Q represent calls
1115 to the same constexpr function with the same arguments.
1116 Otherwise, return false. */
1117
1118 bool
equal(constexpr_call * lhs,constexpr_call * rhs)1119 constexpr_call_hasher::equal (constexpr_call *lhs, constexpr_call *rhs)
1120 {
1121 if (lhs == rhs)
1122 return true;
1123 if (lhs->hash != rhs->hash)
1124 return false;
1125 if (lhs->manifestly_const_eval != rhs->manifestly_const_eval)
1126 return false;
1127 if (!constexpr_fundef_hasher::equal (lhs->fundef, rhs->fundef))
1128 return false;
1129 return cp_tree_equal (lhs->bindings, rhs->bindings);
1130 }
1131
1132 /* Initialize the constexpr call table, if needed. */
1133
1134 static void
maybe_initialize_constexpr_call_table(void)1135 maybe_initialize_constexpr_call_table (void)
1136 {
1137 if (constexpr_call_table == NULL)
1138 constexpr_call_table = hash_table<constexpr_call_hasher>::create_ggc (101);
1139 }
1140
1141 /* During constexpr CALL_EXPR evaluation, to avoid issues with sharing when
1142 a function happens to get called recursively, we unshare the callee
1143 function's body and evaluate this unshared copy instead of evaluating the
1144 original body.
1145
1146 FUNDEF_COPIES_TABLE is a per-function freelist of these unshared function
1147 copies. The underlying data structure of FUNDEF_COPIES_TABLE is a hash_map
1148 that's keyed off of the original FUNCTION_DECL and whose value is a
1149 TREE_LIST of this function's unused copies awaiting reuse.
1150
1151 This is not GC-deletable to avoid GC affecting UID generation. */
1152
1153 static GTY(()) decl_tree_map *fundef_copies_table;
1154
1155 /* Reuse a copy or create a new unshared copy of the function FUN.
1156 Return this copy. We use a TREE_LIST whose PURPOSE is body, VALUE
1157 is parms, TYPE is result. */
1158
1159 static tree
get_fundef_copy(const constexpr_ctx * ctx,constexpr_fundef * fundef)1160 get_fundef_copy (const constexpr_ctx *ctx, constexpr_fundef *fundef)
1161 {
1162 tree copy;
1163 bool existed;
1164 tree *slot = &(hash_map_safe_get_or_insert<hm_ggc>
1165 (fundef_copies_table, fundef->decl, &existed, 127));
1166
1167 if (!existed)
1168 {
1169 /* There is no cached function available, or in use. We can use
1170 the function directly. That the slot is now created records
1171 that this function is now in use. */
1172 copy = build_tree_list (fundef->body, fundef->parms);
1173 TREE_TYPE (copy) = fundef->result;
1174 }
1175 else if (*slot == NULL_TREE)
1176 {
1177 if (ctx->uid_sensitive)
1178 return NULL_TREE;
1179
1180 /* We've already used the function itself, so make a copy. */
1181 copy = build_tree_list (NULL, NULL);
1182 tree saved_body = DECL_SAVED_TREE (fundef->decl);
1183 tree saved_parms = DECL_ARGUMENTS (fundef->decl);
1184 tree saved_result = DECL_RESULT (fundef->decl);
1185 tree saved_fn = current_function_decl;
1186 DECL_SAVED_TREE (fundef->decl) = fundef->body;
1187 DECL_ARGUMENTS (fundef->decl) = fundef->parms;
1188 DECL_RESULT (fundef->decl) = fundef->result;
1189 current_function_decl = fundef->decl;
1190 TREE_PURPOSE (copy) = copy_fn (fundef->decl, TREE_VALUE (copy),
1191 TREE_TYPE (copy));
1192 current_function_decl = saved_fn;
1193 DECL_RESULT (fundef->decl) = saved_result;
1194 DECL_ARGUMENTS (fundef->decl) = saved_parms;
1195 DECL_SAVED_TREE (fundef->decl) = saved_body;
1196 }
1197 else
1198 {
1199 /* We have a cached function available. */
1200 copy = *slot;
1201 *slot = TREE_CHAIN (copy);
1202 }
1203
1204 return copy;
1205 }
1206
1207 /* Save the copy COPY of function FUN for later reuse by
1208 get_fundef_copy(). By construction, there will always be an entry
1209 to find. */
1210
1211 static void
save_fundef_copy(tree fun,tree copy)1212 save_fundef_copy (tree fun, tree copy)
1213 {
1214 tree *slot = fundef_copies_table->get (fun);
1215 TREE_CHAIN (copy) = *slot;
1216 *slot = copy;
1217 }
1218
1219 /* We have an expression tree T that represents a call, either CALL_EXPR
1220 or AGGR_INIT_EXPR. Return the Nth argument. */
1221
1222 static inline tree
get_nth_callarg(tree t,int n)1223 get_nth_callarg (tree t, int n)
1224 {
1225 switch (TREE_CODE (t))
1226 {
1227 case CALL_EXPR:
1228 return CALL_EXPR_ARG (t, n);
1229
1230 case AGGR_INIT_EXPR:
1231 return AGGR_INIT_EXPR_ARG (t, n);
1232
1233 default:
1234 gcc_unreachable ();
1235 return NULL;
1236 }
1237 }
1238
1239 /* Attempt to evaluate T which represents a call to a builtin function.
1240 We assume here that all builtin functions evaluate to scalar types
1241 represented by _CST nodes. */
1242
1243 static tree
cxx_eval_builtin_function_call(const constexpr_ctx * ctx,tree t,tree fun,bool lval,bool * non_constant_p,bool * overflow_p)1244 cxx_eval_builtin_function_call (const constexpr_ctx *ctx, tree t, tree fun,
1245 bool lval,
1246 bool *non_constant_p, bool *overflow_p)
1247 {
1248 const int nargs = call_expr_nargs (t);
1249 tree *args = (tree *) alloca (nargs * sizeof (tree));
1250 tree new_call;
1251 int i;
1252
1253 /* Don't fold __builtin_constant_p within a constexpr function. */
1254 bool bi_const_p = DECL_IS_BUILTIN_CONSTANT_P (fun);
1255
1256 /* If we aren't requiring a constant expression, defer __builtin_constant_p
1257 in a constexpr function until we have values for the parameters. */
1258 if (bi_const_p
1259 && !ctx->manifestly_const_eval
1260 && current_function_decl
1261 && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
1262 {
1263 *non_constant_p = true;
1264 return t;
1265 }
1266
1267 /* For __builtin_is_constant_evaluated, defer it if not
1268 ctx->manifestly_const_eval, otherwise fold it to true. */
1269 if (fndecl_built_in_p (fun, CP_BUILT_IN_IS_CONSTANT_EVALUATED,
1270 BUILT_IN_FRONTEND))
1271 {
1272 if (!ctx->manifestly_const_eval)
1273 {
1274 *non_constant_p = true;
1275 return t;
1276 }
1277 return boolean_true_node;
1278 }
1279
1280 if (fndecl_built_in_p (fun, CP_BUILT_IN_SOURCE_LOCATION, BUILT_IN_FRONTEND))
1281 return fold_builtin_source_location (EXPR_LOCATION (t));
1282
1283 int strops = 0;
1284 int strret = 0;
1285 if (fndecl_built_in_p (fun, BUILT_IN_NORMAL))
1286 switch (DECL_FUNCTION_CODE (fun))
1287 {
1288 case BUILT_IN_STRLEN:
1289 case BUILT_IN_STRNLEN:
1290 strops = 1;
1291 break;
1292 case BUILT_IN_MEMCHR:
1293 case BUILT_IN_STRCHR:
1294 case BUILT_IN_STRRCHR:
1295 strops = 1;
1296 strret = 1;
1297 break;
1298 case BUILT_IN_MEMCMP:
1299 case BUILT_IN_STRCMP:
1300 strops = 2;
1301 break;
1302 case BUILT_IN_STRSTR:
1303 strops = 2;
1304 strret = 1;
1305 break;
1306 case BUILT_IN_ASAN_POINTER_COMPARE:
1307 case BUILT_IN_ASAN_POINTER_SUBTRACT:
1308 /* These builtins shall be ignored during constant expression
1309 evaluation. */
1310 return void_node;
1311 default:
1312 break;
1313 }
1314
1315 /* Be permissive for arguments to built-ins; __builtin_constant_p should
1316 return constant false for a non-constant argument. */
1317 constexpr_ctx new_ctx = *ctx;
1318 new_ctx.quiet = true;
1319 for (i = 0; i < nargs; ++i)
1320 {
1321 tree arg = CALL_EXPR_ARG (t, i);
1322 tree oarg = arg;
1323
1324 /* To handle string built-ins we need to pass ADDR_EXPR<STRING_CST> since
1325 expand_builtin doesn't know how to look in the values table. */
1326 bool strop = i < strops;
1327 if (strop)
1328 {
1329 STRIP_NOPS (arg);
1330 if (TREE_CODE (arg) == ADDR_EXPR)
1331 arg = TREE_OPERAND (arg, 0);
1332 else
1333 strop = false;
1334 }
1335
1336 /* If builtin_valid_in_constant_expr_p is true,
1337 potential_constant_expression_1 has not recursed into the arguments
1338 of the builtin, verify it here. */
1339 if (!builtin_valid_in_constant_expr_p (fun)
1340 || potential_constant_expression (arg))
1341 {
1342 bool dummy1 = false, dummy2 = false;
1343 arg = cxx_eval_constant_expression (&new_ctx, arg, false,
1344 &dummy1, &dummy2);
1345 }
1346
1347 if (bi_const_p)
1348 /* For __builtin_constant_p, fold all expressions with constant values
1349 even if they aren't C++ constant-expressions. */
1350 arg = cp_fold_rvalue (arg);
1351 else if (strop)
1352 {
1353 if (TREE_CODE (arg) == CONSTRUCTOR)
1354 arg = braced_lists_to_strings (TREE_TYPE (arg), arg);
1355 if (TREE_CODE (arg) == STRING_CST)
1356 arg = build_address (arg);
1357 else
1358 arg = oarg;
1359 }
1360
1361 args[i] = arg;
1362 }
1363
1364 bool save_ffbcp = force_folding_builtin_constant_p;
1365 force_folding_builtin_constant_p |= ctx->manifestly_const_eval;
1366 tree save_cur_fn = current_function_decl;
1367 /* Return name of ctx->call->fundef->decl for __builtin_FUNCTION (). */
1368 if (fndecl_built_in_p (fun, BUILT_IN_FUNCTION)
1369 && ctx->call
1370 && ctx->call->fundef)
1371 current_function_decl = ctx->call->fundef->decl;
1372 new_call = fold_builtin_call_array (EXPR_LOCATION (t), TREE_TYPE (t),
1373 CALL_EXPR_FN (t), nargs, args);
1374 current_function_decl = save_cur_fn;
1375 force_folding_builtin_constant_p = save_ffbcp;
1376 if (new_call == NULL)
1377 {
1378 if (!*non_constant_p && !ctx->quiet)
1379 {
1380 /* Do not allow__builtin_unreachable in constexpr function.
1381 The __builtin_unreachable call with BUILTINS_LOCATION
1382 comes from cp_maybe_instrument_return. */
1383 if (fndecl_built_in_p (fun, BUILT_IN_UNREACHABLE)
1384 && EXPR_LOCATION (t) == BUILTINS_LOCATION)
1385 error ("%<constexpr%> call flows off the end of the function");
1386 else
1387 {
1388 new_call = build_call_array_loc (EXPR_LOCATION (t), TREE_TYPE (t),
1389 CALL_EXPR_FN (t), nargs, args);
1390 error ("%q+E is not a constant expression", new_call);
1391 }
1392 }
1393 *non_constant_p = true;
1394 return t;
1395 }
1396
1397 if (!potential_constant_expression (new_call))
1398 {
1399 if (!*non_constant_p && !ctx->quiet)
1400 error ("%q+E is not a constant expression", new_call);
1401 *non_constant_p = true;
1402 return t;
1403 }
1404
1405 if (strret)
1406 {
1407 /* memchr returns a pointer into the first argument, but we replaced the
1408 argument above with a STRING_CST; put it back it now. */
1409 tree op = CALL_EXPR_ARG (t, strret-1);
1410 STRIP_NOPS (new_call);
1411 if (TREE_CODE (new_call) == POINTER_PLUS_EXPR)
1412 TREE_OPERAND (new_call, 0) = op;
1413 else if (TREE_CODE (new_call) == ADDR_EXPR)
1414 new_call = op;
1415 }
1416
1417 return cxx_eval_constant_expression (&new_ctx, new_call, lval,
1418 non_constant_p, overflow_p);
1419 }
1420
1421 /* TEMP is the constant value of a temporary object of type TYPE. Adjust
1422 the type of the value to match. */
1423
1424 static tree
adjust_temp_type(tree type,tree temp)1425 adjust_temp_type (tree type, tree temp)
1426 {
1427 if (same_type_p (TREE_TYPE (temp), type))
1428 return temp;
1429 /* Avoid wrapping an aggregate value in a NOP_EXPR. */
1430 if (TREE_CODE (temp) == CONSTRUCTOR)
1431 {
1432 /* build_constructor wouldn't retain various CONSTRUCTOR flags. */
1433 tree t = copy_node (temp);
1434 TREE_TYPE (t) = type;
1435 return t;
1436 }
1437 if (TREE_CODE (temp) == EMPTY_CLASS_EXPR)
1438 return build0 (EMPTY_CLASS_EXPR, type);
1439 gcc_assert (scalarish_type_p (type));
1440 /* Now we know we're dealing with a scalar, and a prvalue of non-class
1441 type is cv-unqualified. */
1442 return cp_fold_convert (cv_unqualified (type), temp);
1443 }
1444
1445 /* If T is a CONSTRUCTOR, return an unshared copy of T and any
1446 sub-CONSTRUCTORs. Otherwise return T.
1447
1448 We use this whenever we initialize an object as a whole, whether it's a
1449 parameter, a local variable, or a subobject, so that subsequent
1450 modifications don't affect other places where it was used. */
1451
1452 tree
unshare_constructor(tree t MEM_STAT_DECL)1453 unshare_constructor (tree t MEM_STAT_DECL)
1454 {
1455 if (!t || TREE_CODE (t) != CONSTRUCTOR)
1456 return t;
1457 auto_vec <tree*, 4> ptrs;
1458 ptrs.safe_push (&t);
1459 while (!ptrs.is_empty ())
1460 {
1461 tree *p = ptrs.pop ();
1462 tree n = copy_node (*p PASS_MEM_STAT);
1463 CONSTRUCTOR_ELTS (n) = vec_safe_copy (CONSTRUCTOR_ELTS (*p) PASS_MEM_STAT);
1464 *p = n;
1465 vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (n);
1466 constructor_elt *ce;
1467 for (HOST_WIDE_INT i = 0; vec_safe_iterate (v, i, &ce); ++i)
1468 if (ce->value && TREE_CODE (ce->value) == CONSTRUCTOR)
1469 ptrs.safe_push (&ce->value);
1470 }
1471 return t;
1472 }
1473
1474 /* If T is a CONSTRUCTOR, ggc_free T and any sub-CONSTRUCTORs. */
1475
1476 static void
free_constructor(tree t)1477 free_constructor (tree t)
1478 {
1479 if (!t || TREE_CODE (t) != CONSTRUCTOR)
1480 return;
1481 releasing_vec ctors;
1482 vec_safe_push (ctors, t);
1483 while (!ctors->is_empty ())
1484 {
1485 tree c = ctors->pop ();
1486 if (vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (c))
1487 {
1488 constructor_elt *ce;
1489 for (HOST_WIDE_INT i = 0; vec_safe_iterate (elts, i, &ce); ++i)
1490 if (TREE_CODE (ce->value) == CONSTRUCTOR)
1491 vec_safe_push (ctors, ce->value);
1492 ggc_free (elts);
1493 }
1494 ggc_free (c);
1495 }
1496 }
1497
1498 /* Helper function of cxx_bind_parameters_in_call. Return non-NULL
1499 if *TP is address of a static variable (or part of it) currently being
1500 constructed or of a heap artificial variable. */
1501
1502 static tree
addr_of_non_const_var(tree * tp,int * walk_subtrees,void * data)1503 addr_of_non_const_var (tree *tp, int *walk_subtrees, void *data)
1504 {
1505 if (TREE_CODE (*tp) == ADDR_EXPR)
1506 if (tree var = get_base_address (TREE_OPERAND (*tp, 0)))
1507 if (VAR_P (var) && TREE_STATIC (var))
1508 {
1509 if (DECL_NAME (var) == heap_uninit_identifier
1510 || DECL_NAME (var) == heap_identifier)
1511 return var;
1512
1513 constexpr_global_ctx *global = (constexpr_global_ctx *) data;
1514 if (global->values.get (var))
1515 return var;
1516 }
1517 if (TYPE_P (*tp))
1518 *walk_subtrees = false;
1519 return NULL_TREE;
1520 }
1521
1522 /* Subroutine of cxx_eval_call_expression.
1523 We are processing a call expression (either CALL_EXPR or
1524 AGGR_INIT_EXPR) in the context of CTX. Evaluate
1525 all arguments and bind their values to correspondings
1526 parameters, making up the NEW_CALL context. */
1527
1528 static void
cxx_bind_parameters_in_call(const constexpr_ctx * ctx,tree t,constexpr_call * new_call,bool * non_constant_p,bool * overflow_p,bool * non_constant_args)1529 cxx_bind_parameters_in_call (const constexpr_ctx *ctx, tree t,
1530 constexpr_call *new_call,
1531 bool *non_constant_p, bool *overflow_p,
1532 bool *non_constant_args)
1533 {
1534 const int nargs = call_expr_nargs (t);
1535 tree fun = new_call->fundef->decl;
1536 tree parms = new_call->fundef->parms;
1537 int i;
1538 /* We don't record ellipsis args below. */
1539 int nparms = list_length (parms);
1540 int nbinds = nargs < nparms ? nargs : nparms;
1541 tree binds = new_call->bindings = make_tree_vec (nbinds);
1542 for (i = 0; i < nargs; ++i)
1543 {
1544 tree x, arg;
1545 tree type = parms ? TREE_TYPE (parms) : void_type_node;
1546 x = get_nth_callarg (t, i);
1547 /* For member function, the first argument is a pointer to the implied
1548 object. For a constructor, it might still be a dummy object, in
1549 which case we get the real argument from ctx. */
1550 if (i == 0 && DECL_CONSTRUCTOR_P (fun)
1551 && is_dummy_object (x))
1552 {
1553 x = ctx->object;
1554 x = build_address (x);
1555 }
1556 if (TREE_ADDRESSABLE (type))
1557 /* Undo convert_for_arg_passing work here. */
1558 x = convert_from_reference (x);
1559 arg = cxx_eval_constant_expression (ctx, x, /*lval=*/false,
1560 non_constant_p, overflow_p);
1561 /* Don't VERIFY_CONSTANT here. */
1562 if (*non_constant_p && ctx->quiet)
1563 return;
1564 /* Just discard ellipsis args after checking their constantitude. */
1565 if (!parms)
1566 continue;
1567
1568 if (!*non_constant_p)
1569 {
1570 /* Make sure the binding has the same type as the parm. But
1571 only for constant args. */
1572 if (!TYPE_REF_P (type))
1573 arg = adjust_temp_type (type, arg);
1574 if (!TREE_CONSTANT (arg))
1575 *non_constant_args = true;
1576 /* If arg is or contains address of a heap artificial variable or
1577 of a static variable being constructed, avoid caching the
1578 function call, as those variables might be modified by the
1579 function, or might be modified by the callers in between
1580 the cached function and just read by the function. */
1581 else if (!*non_constant_args
1582 && cp_walk_tree (&arg, addr_of_non_const_var, ctx->global,
1583 NULL))
1584 *non_constant_args = true;
1585
1586 /* For virtual calls, adjust the this argument, so that it is
1587 the object on which the method is called, rather than
1588 one of its bases. */
1589 if (i == 0 && DECL_VIRTUAL_P (fun))
1590 {
1591 tree addr = arg;
1592 STRIP_NOPS (addr);
1593 if (TREE_CODE (addr) == ADDR_EXPR)
1594 {
1595 tree obj = TREE_OPERAND (addr, 0);
1596 while (TREE_CODE (obj) == COMPONENT_REF
1597 && DECL_FIELD_IS_BASE (TREE_OPERAND (obj, 1))
1598 && !same_type_ignoring_top_level_qualifiers_p
1599 (TREE_TYPE (obj), DECL_CONTEXT (fun)))
1600 obj = TREE_OPERAND (obj, 0);
1601 if (obj != TREE_OPERAND (addr, 0))
1602 arg = build_fold_addr_expr_with_type (obj,
1603 TREE_TYPE (arg));
1604 }
1605 }
1606 TREE_VEC_ELT (binds, i) = arg;
1607 }
1608 parms = TREE_CHAIN (parms);
1609 }
1610 }
1611
1612 /* Variables and functions to manage constexpr call expansion context.
1613 These do not need to be marked for PCH or GC. */
1614
1615 /* FIXME remember and print actual constant arguments. */
1616 static vec<tree> call_stack;
1617 static int call_stack_tick;
1618 static int last_cx_error_tick;
1619
1620 static int
push_cx_call_context(tree call)1621 push_cx_call_context (tree call)
1622 {
1623 ++call_stack_tick;
1624 if (!EXPR_HAS_LOCATION (call))
1625 SET_EXPR_LOCATION (call, input_location);
1626 call_stack.safe_push (call);
1627 int len = call_stack.length ();
1628 if (len > max_constexpr_depth)
1629 return false;
1630 return len;
1631 }
1632
1633 static void
pop_cx_call_context(void)1634 pop_cx_call_context (void)
1635 {
1636 ++call_stack_tick;
1637 call_stack.pop ();
1638 }
1639
1640 vec<tree>
cx_error_context(void)1641 cx_error_context (void)
1642 {
1643 vec<tree> r = vNULL;
1644 if (call_stack_tick != last_cx_error_tick
1645 && !call_stack.is_empty ())
1646 r = call_stack;
1647 last_cx_error_tick = call_stack_tick;
1648 return r;
1649 }
1650
1651 /* Evaluate a call T to a GCC internal function when possible and return
1652 the evaluated result or, under the control of CTX, give an error, set
1653 NON_CONSTANT_P, and return the unevaluated call T otherwise. */
1654
1655 static tree
cxx_eval_internal_function(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)1656 cxx_eval_internal_function (const constexpr_ctx *ctx, tree t,
1657 bool lval,
1658 bool *non_constant_p, bool *overflow_p)
1659 {
1660 enum tree_code opcode = ERROR_MARK;
1661
1662 switch (CALL_EXPR_IFN (t))
1663 {
1664 case IFN_UBSAN_NULL:
1665 case IFN_UBSAN_BOUNDS:
1666 case IFN_UBSAN_VPTR:
1667 case IFN_FALLTHROUGH:
1668 return void_node;
1669
1670 case IFN_ADD_OVERFLOW:
1671 opcode = PLUS_EXPR;
1672 break;
1673 case IFN_SUB_OVERFLOW:
1674 opcode = MINUS_EXPR;
1675 break;
1676 case IFN_MUL_OVERFLOW:
1677 opcode = MULT_EXPR;
1678 break;
1679
1680 case IFN_LAUNDER:
1681 return cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 0),
1682 false, non_constant_p, overflow_p);
1683
1684 case IFN_VEC_CONVERT:
1685 {
1686 tree arg = cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 0),
1687 false, non_constant_p,
1688 overflow_p);
1689 if (TREE_CODE (arg) == VECTOR_CST)
1690 if (tree r = fold_const_call (CFN_VEC_CONVERT, TREE_TYPE (t), arg))
1691 return r;
1692 }
1693 /* FALLTHRU */
1694
1695 default:
1696 if (!ctx->quiet)
1697 error_at (cp_expr_loc_or_input_loc (t),
1698 "call to internal function %qE", t);
1699 *non_constant_p = true;
1700 return t;
1701 }
1702
1703 /* Evaluate constant arguments using OPCODE and return a complex
1704 number containing the result and the overflow bit. */
1705 tree arg0 = cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 0), lval,
1706 non_constant_p, overflow_p);
1707 tree arg1 = cxx_eval_constant_expression (ctx, CALL_EXPR_ARG (t, 1), lval,
1708 non_constant_p, overflow_p);
1709
1710 if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
1711 {
1712 location_t loc = cp_expr_loc_or_input_loc (t);
1713 tree type = TREE_TYPE (TREE_TYPE (t));
1714 tree result = fold_binary_loc (loc, opcode, type,
1715 fold_convert_loc (loc, type, arg0),
1716 fold_convert_loc (loc, type, arg1));
1717 tree ovf
1718 = build_int_cst (type, arith_overflowed_p (opcode, type, arg0, arg1));
1719 /* Reset TREE_OVERFLOW to avoid warnings for the overflow. */
1720 if (TREE_OVERFLOW (result))
1721 TREE_OVERFLOW (result) = 0;
1722
1723 return build_complex (TREE_TYPE (t), result, ovf);
1724 }
1725
1726 *non_constant_p = true;
1727 return t;
1728 }
1729
1730 /* Clean CONSTRUCTOR_NO_CLEARING from CTOR and its sub-aggregates. */
1731
1732 static void
clear_no_implicit_zero(tree ctor)1733 clear_no_implicit_zero (tree ctor)
1734 {
1735 if (CONSTRUCTOR_NO_CLEARING (ctor))
1736 {
1737 CONSTRUCTOR_NO_CLEARING (ctor) = false;
1738 tree elt; unsigned HOST_WIDE_INT idx;
1739 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), idx, elt)
1740 if (TREE_CODE (elt) == CONSTRUCTOR)
1741 clear_no_implicit_zero (elt);
1742 }
1743 }
1744
1745 /* Complain about a const object OBJ being modified in a constant expression.
1746 EXPR is the MODIFY_EXPR expression performing the modification. */
1747
1748 static void
modifying_const_object_error(tree expr,tree obj)1749 modifying_const_object_error (tree expr, tree obj)
1750 {
1751 location_t loc = cp_expr_loc_or_input_loc (expr);
1752 auto_diagnostic_group d;
1753 error_at (loc, "modifying a const object %qE is not allowed in "
1754 "a constant expression", TREE_OPERAND (expr, 0));
1755 inform (location_of (obj), "originally declared %<const%> here");
1756 }
1757
1758 /* Return true if FNDECL is a replaceable global allocation function that
1759 should be useable during constant expression evaluation. */
1760
1761 static inline bool
cxx_replaceable_global_alloc_fn(tree fndecl)1762 cxx_replaceable_global_alloc_fn (tree fndecl)
1763 {
1764 return (cxx_dialect >= cxx2a
1765 && IDENTIFIER_NEWDEL_OP_P (DECL_NAME (fndecl))
1766 && CP_DECL_CONTEXT (fndecl) == global_namespace
1767 && (DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
1768 || DECL_IS_OPERATOR_DELETE_P (fndecl)));
1769 }
1770
1771 /* Return true if FNDECL is a placement new function that should be
1772 useable during constant expression evaluation of std::construct_at. */
1773
1774 static inline bool
cxx_placement_new_fn(tree fndecl)1775 cxx_placement_new_fn (tree fndecl)
1776 {
1777 if (cxx_dialect >= cxx2a
1778 && IDENTIFIER_NEW_OP_P (DECL_NAME (fndecl))
1779 && CP_DECL_CONTEXT (fndecl) == global_namespace
1780 && !DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
1781 && TREE_CODE (TREE_TYPE (fndecl)) == FUNCTION_TYPE)
1782 {
1783 tree first_arg = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fndecl)));
1784 if (TREE_VALUE (first_arg) == ptr_type_node
1785 && TREE_CHAIN (first_arg) == void_list_node)
1786 return true;
1787 }
1788 return false;
1789 }
1790
1791 /* Return true if FNDECL is std::construct_at. */
1792
1793 static inline bool
is_std_construct_at(tree fndecl)1794 is_std_construct_at (tree fndecl)
1795 {
1796 if (!decl_in_std_namespace_p (fndecl))
1797 return false;
1798
1799 tree name = DECL_NAME (fndecl);
1800 return name && id_equal (name, "construct_at");
1801 }
1802
1803 /* Overload for the above taking constexpr_call*. */
1804
1805 static inline bool
is_std_construct_at(const constexpr_call * call)1806 is_std_construct_at (const constexpr_call *call)
1807 {
1808 return (call
1809 && call->fundef
1810 && is_std_construct_at (call->fundef->decl));
1811 }
1812
1813 /* Return true if FNDECL is std::allocator<T>::{,de}allocate. */
1814
1815 static inline bool
is_std_allocator_allocate(tree fndecl)1816 is_std_allocator_allocate (tree fndecl)
1817 {
1818 tree name = DECL_NAME (fndecl);
1819 if (name == NULL_TREE
1820 || !(id_equal (name, "allocate") || id_equal (name, "deallocate")))
1821 return false;
1822
1823 tree ctx = DECL_CONTEXT (fndecl);
1824 if (ctx == NULL_TREE || !CLASS_TYPE_P (ctx) || !TYPE_MAIN_DECL (ctx))
1825 return false;
1826
1827 tree decl = TYPE_MAIN_DECL (ctx);
1828 name = DECL_NAME (decl);
1829 if (name == NULL_TREE || !id_equal (name, "allocator"))
1830 return false;
1831
1832 return decl_in_std_namespace_p (decl);
1833 }
1834
1835 /* Overload for the above taking constexpr_call*. */
1836
1837 static inline bool
is_std_allocator_allocate(const constexpr_call * call)1838 is_std_allocator_allocate (const constexpr_call *call)
1839 {
1840 return (call
1841 && call->fundef
1842 && is_std_allocator_allocate (call->fundef->decl));
1843 }
1844
1845 /* Return true if FNDECL is __dynamic_cast. */
1846
1847 static inline bool
cxx_dynamic_cast_fn_p(tree fndecl)1848 cxx_dynamic_cast_fn_p (tree fndecl)
1849 {
1850 return (cxx_dialect >= cxx2a
1851 && id_equal (DECL_NAME (fndecl), "__dynamic_cast")
1852 && CP_DECL_CONTEXT (fndecl) == global_namespace);
1853 }
1854
1855 /* Often, we have an expression in the form of address + offset, e.g.
1856 "&_ZTV1A + 16". Extract the object from it, i.e. "_ZTV1A". */
1857
1858 static tree
extract_obj_from_addr_offset(tree expr)1859 extract_obj_from_addr_offset (tree expr)
1860 {
1861 if (TREE_CODE (expr) == POINTER_PLUS_EXPR)
1862 expr = TREE_OPERAND (expr, 0);
1863 STRIP_NOPS (expr);
1864 if (TREE_CODE (expr) == ADDR_EXPR)
1865 expr = TREE_OPERAND (expr, 0);
1866 return expr;
1867 }
1868
1869 /* Given a PATH like
1870
1871 g.D.2181.D.2154.D.2102.D.2093
1872
1873 find a component with type TYPE. Return NULL_TREE if not found, and
1874 error_mark_node if the component is not accessible. If STOP is non-null,
1875 this function will return NULL_TREE if STOP is found before TYPE. */
1876
1877 static tree
get_component_with_type(tree path,tree type,tree stop)1878 get_component_with_type (tree path, tree type, tree stop)
1879 {
1880 while (true)
1881 {
1882 if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (path), type))
1883 /* Found it. */
1884 return path;
1885 else if (stop
1886 && (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (path),
1887 stop)))
1888 return NULL_TREE;
1889 else if (TREE_CODE (path) == COMPONENT_REF
1890 && DECL_FIELD_IS_BASE (TREE_OPERAND (path, 1)))
1891 {
1892 /* We need to check that the component we're accessing is in fact
1893 accessible. */
1894 if (TREE_PRIVATE (TREE_OPERAND (path, 1))
1895 || TREE_PROTECTED (TREE_OPERAND (path, 1)))
1896 return error_mark_node;
1897 path = TREE_OPERAND (path, 0);
1898 }
1899 else
1900 return NULL_TREE;
1901 }
1902 }
1903
1904 /* Evaluate a call to __dynamic_cast (permitted by P1327R1).
1905
1906 The declaration of __dynamic_cast is:
1907
1908 void* __dynamic_cast (const void* __src_ptr,
1909 const __class_type_info* __src_type,
1910 const __class_type_info* __dst_type,
1911 ptrdiff_t __src2dst);
1912
1913 where src2dst has the following possible values
1914
1915 >-1: src_type is a unique public non-virtual base of dst_type
1916 dst_ptr + src2dst == src_ptr
1917 -1: unspecified relationship
1918 -2: src_type is not a public base of dst_type
1919 -3: src_type is a multiple public non-virtual base of dst_type
1920
1921 Since literal types can't have virtual bases, we only expect hint >=0,
1922 -2, or -3. */
1923
1924 static tree
cxx_eval_dynamic_cast_fn(const constexpr_ctx * ctx,tree call,bool * non_constant_p,bool * overflow_p)1925 cxx_eval_dynamic_cast_fn (const constexpr_ctx *ctx, tree call,
1926 bool *non_constant_p, bool *overflow_p)
1927 {
1928 /* T will be something like
1929 __dynamic_cast ((B*) b, &_ZTI1B, &_ZTI1D, 8)
1930 dismantle it. */
1931 gcc_assert (call_expr_nargs (call) == 4);
1932 tsubst_flags_t complain = ctx->quiet ? tf_none : tf_warning_or_error;
1933 tree obj = CALL_EXPR_ARG (call, 0);
1934 tree type = CALL_EXPR_ARG (call, 2);
1935 HOST_WIDE_INT hint = int_cst_value (CALL_EXPR_ARG (call, 3));
1936 location_t loc = cp_expr_loc_or_input_loc (call);
1937
1938 /* Get the target type of the dynamic_cast. */
1939 gcc_assert (TREE_CODE (type) == ADDR_EXPR);
1940 type = TREE_OPERAND (type, 0);
1941 type = TREE_TYPE (DECL_NAME (type));
1942
1943 /* TYPE can only be either T* or T&. We can't know which of these it
1944 is by looking at TYPE, but OBJ will be "(T*) x" in the first case,
1945 and something like "(T*)(T&)(T*) x" in the second case. */
1946 bool reference_p = false;
1947 while (CONVERT_EXPR_P (obj) || TREE_CODE (obj) == SAVE_EXPR)
1948 {
1949 reference_p |= TYPE_REF_P (TREE_TYPE (obj));
1950 obj = TREE_OPERAND (obj, 0);
1951 }
1952
1953 /* Evaluate the object so that we know its dynamic type. */
1954 obj = cxx_eval_constant_expression (ctx, obj, /*lval*/false, non_constant_p,
1955 overflow_p);
1956 if (*non_constant_p)
1957 return call;
1958
1959 /* We expect OBJ to be in form of &d.D.2102 when HINT == 0,
1960 but when HINT is > 0, it can also be something like
1961 &d.D.2102 + 18446744073709551608, which includes the BINFO_OFFSET. */
1962 obj = extract_obj_from_addr_offset (obj);
1963 const tree objtype = TREE_TYPE (obj);
1964 /* If OBJ doesn't refer to a base field, we're done. */
1965 if (tree t = (TREE_CODE (obj) == COMPONENT_REF
1966 ? TREE_OPERAND (obj, 1) : obj))
1967 if (TREE_CODE (t) != FIELD_DECL || !DECL_FIELD_IS_BASE (t))
1968 {
1969 if (reference_p)
1970 {
1971 if (!ctx->quiet)
1972 {
1973 error_at (loc, "reference %<dynamic_cast%> failed");
1974 inform (loc, "dynamic type %qT of its operand does "
1975 "not have a base class of type %qT",
1976 objtype, type);
1977 }
1978 *non_constant_p = true;
1979 }
1980 return integer_zero_node;
1981 }
1982
1983 /* [class.cdtor] When a dynamic_cast is used in a constructor ...
1984 or in a destructor ... if the operand of the dynamic_cast refers
1985 to the object under construction or destruction, this object is
1986 considered to be a most derived object that has the type of the
1987 constructor or destructor's class. */
1988 tree vtable = build_vfield_ref (obj, objtype);
1989 vtable = cxx_eval_constant_expression (ctx, vtable, /*lval*/false,
1990 non_constant_p, overflow_p);
1991 if (*non_constant_p)
1992 return call;
1993 /* With -fsanitize=vptr, we initialize all vtable pointers to null,
1994 so it's possible that we got a null pointer now. */
1995 if (integer_zerop (vtable))
1996 {
1997 if (!ctx->quiet)
1998 error_at (loc, "virtual table pointer is used uninitialized");
1999 *non_constant_p = true;
2000 return integer_zero_node;
2001 }
2002 /* VTABLE will be &_ZTV1A + 16 or similar, get _ZTV1A. */
2003 vtable = extract_obj_from_addr_offset (vtable);
2004 const tree mdtype = DECL_CONTEXT (vtable);
2005
2006 /* Given dynamic_cast<T>(v),
2007
2008 [expr.dynamic.cast] If C is the class type to which T points or refers,
2009 the runtime check logically executes as follows:
2010
2011 If, in the most derived object pointed (referred) to by v, v points
2012 (refers) to a public base class subobject of a C object, and if only
2013 one object of type C is derived from the subobject pointed (referred)
2014 to by v the result points (refers) to that C object.
2015
2016 In this case, HINT >= 0 or -3. */
2017 if (hint >= 0 || hint == -3)
2018 {
2019 /* Look for a component with type TYPE. */
2020 tree t = get_component_with_type (obj, type, mdtype);
2021 /* If not accessible, give an error. */
2022 if (t == error_mark_node)
2023 {
2024 if (reference_p)
2025 {
2026 if (!ctx->quiet)
2027 {
2028 error_at (loc, "reference %<dynamic_cast%> failed");
2029 inform (loc, "static type %qT of its operand is a "
2030 "non-public base class of dynamic type %qT",
2031 objtype, type);
2032
2033 }
2034 *non_constant_p = true;
2035 }
2036 return integer_zero_node;
2037 }
2038 else if (t)
2039 /* The result points to the TYPE object. */
2040 return cp_build_addr_expr (t, complain);
2041 /* Else, TYPE was not found, because the HINT turned out to be wrong.
2042 Fall through to the normal processing. */
2043 }
2044
2045 /* Otherwise, if v points (refers) to a public base class subobject of the
2046 most derived object, and the type of the most derived object has a base
2047 class, of type C, that is unambiguous and public, the result points
2048 (refers) to the C subobject of the most derived object.
2049
2050 But it can also be an invalid case. */
2051
2052 /* Get the most derived object. */
2053 obj = get_component_with_type (obj, mdtype, NULL_TREE);
2054 if (obj == error_mark_node)
2055 {
2056 if (reference_p)
2057 {
2058 if (!ctx->quiet)
2059 {
2060 error_at (loc, "reference %<dynamic_cast%> failed");
2061 inform (loc, "static type %qT of its operand is a non-public"
2062 " base class of dynamic type %qT", objtype, mdtype);
2063 }
2064 *non_constant_p = true;
2065 }
2066 return integer_zero_node;
2067 }
2068 else
2069 gcc_assert (obj);
2070
2071 /* Check that the type of the most derived object has a base class
2072 of type TYPE that is unambiguous and public. */
2073 base_kind b_kind;
2074 tree binfo = lookup_base (mdtype, type, ba_check, &b_kind, tf_none);
2075 if (!binfo || binfo == error_mark_node)
2076 {
2077 if (reference_p)
2078 {
2079 if (!ctx->quiet)
2080 {
2081 error_at (loc, "reference %<dynamic_cast%> failed");
2082 if (b_kind == bk_ambig)
2083 inform (loc, "%qT is an ambiguous base class of dynamic "
2084 "type %qT of its operand", type, mdtype);
2085 else
2086 inform (loc, "dynamic type %qT of its operand does not "
2087 "have an unambiguous public base class %qT",
2088 mdtype, type);
2089 }
2090 *non_constant_p = true;
2091 }
2092 return integer_zero_node;
2093 }
2094 /* If so, return the TYPE subobject of the most derived object. */
2095 obj = convert_to_base_statically (obj, binfo);
2096 return cp_build_addr_expr (obj, complain);
2097 }
2098
2099 /* Data structure used by replace_result_decl and replace_result_decl_r. */
2100
2101 struct replace_result_decl_data
2102 {
2103 /* The RESULT_DECL we want to replace. */
2104 tree decl;
2105 /* The replacement for DECL. */
2106 tree replacement;
2107 /* Whether we've performed any replacements. */
2108 bool changed;
2109 };
2110
2111 /* Helper function for replace_result_decl, called through cp_walk_tree. */
2112
2113 static tree
replace_result_decl_r(tree * tp,int * walk_subtrees,void * data)2114 replace_result_decl_r (tree *tp, int *walk_subtrees, void *data)
2115 {
2116 replace_result_decl_data *d = (replace_result_decl_data *) data;
2117
2118 if (*tp == d->decl)
2119 {
2120 *tp = unshare_expr (d->replacement);
2121 d->changed = true;
2122 *walk_subtrees = 0;
2123 }
2124 else if (TYPE_P (*tp))
2125 *walk_subtrees = 0;
2126
2127 return NULL_TREE;
2128 }
2129
2130 /* Replace every occurrence of DECL, a RESULT_DECL, with (an unshared copy of)
2131 REPLACEMENT within the reduced constant expression *TP. Returns true iff a
2132 replacement was performed. */
2133
2134 static bool
replace_result_decl(tree * tp,tree decl,tree replacement)2135 replace_result_decl (tree *tp, tree decl, tree replacement)
2136 {
2137 gcc_checking_assert (TREE_CODE (decl) == RESULT_DECL
2138 && (same_type_ignoring_top_level_qualifiers_p
2139 (TREE_TYPE (decl), TREE_TYPE (replacement))));
2140 replace_result_decl_data data = { decl, replacement, false };
2141 cp_walk_tree_without_duplicates (tp, replace_result_decl_r, &data);
2142 return data.changed;
2143 }
2144
2145 /* If OBJECT is of const class type, evaluate it to a CONSTRUCTOR and set
2146 its TREE_READONLY flag according to READONLY_P. Used for constexpr
2147 'tors to detect modifying const objects in a constexpr context. */
2148
2149 static void
cxx_set_object_constness(const constexpr_ctx * ctx,tree object,bool readonly_p,bool * non_constant_p,bool * overflow_p)2150 cxx_set_object_constness (const constexpr_ctx *ctx, tree object,
2151 bool readonly_p, bool *non_constant_p,
2152 bool *overflow_p)
2153 {
2154 if (CLASS_TYPE_P (TREE_TYPE (object))
2155 && CP_TYPE_CONST_P (TREE_TYPE (object)))
2156 {
2157 /* Subobjects might not be stored in ctx->global->values but we
2158 can get its CONSTRUCTOR by evaluating *this. */
2159 tree e = cxx_eval_constant_expression (ctx, object, /*lval*/false,
2160 non_constant_p, overflow_p);
2161 if (TREE_CODE (e) == CONSTRUCTOR && !*non_constant_p)
2162 TREE_READONLY (e) = readonly_p;
2163 }
2164 }
2165
2166 /* Subroutine of cxx_eval_constant_expression.
2167 Evaluate the call expression tree T in the context of OLD_CALL expression
2168 evaluation. */
2169
2170 static tree
cxx_eval_call_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)2171 cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
2172 bool lval,
2173 bool *non_constant_p, bool *overflow_p)
2174 {
2175 /* Handle concept checks separately. */
2176 if (concept_check_p (t))
2177 return evaluate_concept_check (t, tf_warning_or_error);
2178
2179 location_t loc = cp_expr_loc_or_input_loc (t);
2180 tree fun = get_function_named_in_call (t);
2181 constexpr_call new_call
2182 = { NULL, NULL, NULL, 0, ctx->manifestly_const_eval };
2183 int depth_ok;
2184
2185 if (fun == NULL_TREE)
2186 return cxx_eval_internal_function (ctx, t, lval,
2187 non_constant_p, overflow_p);
2188
2189 if (TREE_CODE (fun) != FUNCTION_DECL)
2190 {
2191 /* Might be a constexpr function pointer. */
2192 fun = cxx_eval_constant_expression (ctx, fun,
2193 /*lval*/false, non_constant_p,
2194 overflow_p);
2195 STRIP_NOPS (fun);
2196 if (TREE_CODE (fun) == ADDR_EXPR)
2197 fun = TREE_OPERAND (fun, 0);
2198 /* For TARGET_VTABLE_USES_DESCRIPTORS targets, there is no
2199 indirection, the called expression is a pointer into the
2200 virtual table which should contain FDESC_EXPR. Extract the
2201 FUNCTION_DECL from there. */
2202 else if (TARGET_VTABLE_USES_DESCRIPTORS
2203 && TREE_CODE (fun) == POINTER_PLUS_EXPR
2204 && TREE_CODE (TREE_OPERAND (fun, 0)) == ADDR_EXPR
2205 && TREE_CODE (TREE_OPERAND (fun, 1)) == INTEGER_CST)
2206 {
2207 tree d = TREE_OPERAND (TREE_OPERAND (fun, 0), 0);
2208 if (VAR_P (d)
2209 && DECL_VTABLE_OR_VTT_P (d)
2210 && TREE_CODE (TREE_TYPE (d)) == ARRAY_TYPE
2211 && TREE_TYPE (TREE_TYPE (d)) == vtable_entry_type
2212 && DECL_INITIAL (d)
2213 && TREE_CODE (DECL_INITIAL (d)) == CONSTRUCTOR)
2214 {
2215 tree i = int_const_binop (TRUNC_DIV_EXPR, TREE_OPERAND (fun, 1),
2216 TYPE_SIZE_UNIT (vtable_entry_type));
2217 HOST_WIDE_INT idx = find_array_ctor_elt (DECL_INITIAL (d), i);
2218 if (idx >= 0)
2219 {
2220 tree fdesc
2221 = (*CONSTRUCTOR_ELTS (DECL_INITIAL (d)))[idx].value;
2222 if (TREE_CODE (fdesc) == FDESC_EXPR
2223 && integer_zerop (TREE_OPERAND (fdesc, 1)))
2224 fun = TREE_OPERAND (fdesc, 0);
2225 }
2226 }
2227 }
2228 }
2229 if (TREE_CODE (fun) != FUNCTION_DECL)
2230 {
2231 if (!ctx->quiet && !*non_constant_p)
2232 error_at (loc, "expression %qE does not designate a %<constexpr%> "
2233 "function", fun);
2234 *non_constant_p = true;
2235 return t;
2236 }
2237 if (DECL_CLONED_FUNCTION_P (fun))
2238 fun = DECL_CLONED_FUNCTION (fun);
2239
2240 if (is_ubsan_builtin_p (fun))
2241 return void_node;
2242
2243 if (fndecl_built_in_p (fun))
2244 return cxx_eval_builtin_function_call (ctx, t, fun,
2245 lval, non_constant_p, overflow_p);
2246 if (!DECL_DECLARED_CONSTEXPR_P (fun))
2247 {
2248 if (TREE_CODE (t) == CALL_EXPR
2249 && cxx_replaceable_global_alloc_fn (fun)
2250 && (CALL_FROM_NEW_OR_DELETE_P (t)
2251 || is_std_allocator_allocate (ctx->call)))
2252 {
2253 const int nargs = call_expr_nargs (t);
2254 tree arg0 = NULL_TREE;
2255 for (int i = 0; i < nargs; ++i)
2256 {
2257 tree arg = CALL_EXPR_ARG (t, i);
2258 arg = cxx_eval_constant_expression (ctx, arg, false,
2259 non_constant_p, overflow_p);
2260 VERIFY_CONSTANT (arg);
2261 if (i == 0)
2262 arg0 = arg;
2263 }
2264 gcc_assert (arg0);
2265 if (IDENTIFIER_NEW_OP_P (DECL_NAME (fun)))
2266 {
2267 tree type = build_array_type_nelts (char_type_node,
2268 tree_to_uhwi (arg0));
2269 tree var = build_decl (loc, VAR_DECL, heap_uninit_identifier,
2270 type);
2271 DECL_ARTIFICIAL (var) = 1;
2272 TREE_STATIC (var) = 1;
2273 // Temporarily register the artificial var in varpool,
2274 // so that comparisons of its address against NULL are folded
2275 // through nonzero_address even with
2276 // -fno-delete-null-pointer-checks or that comparison of
2277 // addresses of different heap artificial vars is folded too.
2278 // See PR98988 and PR99031.
2279 varpool_node::finalize_decl (var);
2280 ctx->global->heap_vars.safe_push (var);
2281 ctx->global->values.put (var, NULL_TREE);
2282 return fold_convert (ptr_type_node, build_address (var));
2283 }
2284 else
2285 {
2286 STRIP_NOPS (arg0);
2287 if (TREE_CODE (arg0) == ADDR_EXPR
2288 && VAR_P (TREE_OPERAND (arg0, 0)))
2289 {
2290 tree var = TREE_OPERAND (arg0, 0);
2291 if (DECL_NAME (var) == heap_uninit_identifier
2292 || DECL_NAME (var) == heap_identifier)
2293 {
2294 DECL_NAME (var) = heap_deleted_identifier;
2295 ctx->global->values.remove (var);
2296 ctx->global->heap_dealloc_count++;
2297 return void_node;
2298 }
2299 else if (DECL_NAME (var) == heap_deleted_identifier)
2300 {
2301 if (!ctx->quiet)
2302 error_at (loc, "deallocation of already deallocated "
2303 "storage");
2304 *non_constant_p = true;
2305 return t;
2306 }
2307 }
2308 if (!ctx->quiet)
2309 error_at (loc, "deallocation of storage that was "
2310 "not previously allocated");
2311 *non_constant_p = true;
2312 return t;
2313 }
2314 }
2315 /* Allow placement new in std::construct_at, just return the second
2316 argument. */
2317 if (TREE_CODE (t) == CALL_EXPR
2318 && cxx_placement_new_fn (fun)
2319 && is_std_construct_at (ctx->call))
2320 {
2321 const int nargs = call_expr_nargs (t);
2322 tree arg1 = NULL_TREE;
2323 for (int i = 0; i < nargs; ++i)
2324 {
2325 tree arg = CALL_EXPR_ARG (t, i);
2326 arg = cxx_eval_constant_expression (ctx, arg, false,
2327 non_constant_p, overflow_p);
2328 if (i == 1)
2329 arg1 = arg;
2330 else
2331 VERIFY_CONSTANT (arg);
2332 }
2333 gcc_assert (arg1);
2334 return arg1;
2335 }
2336 else if (cxx_dynamic_cast_fn_p (fun))
2337 return cxx_eval_dynamic_cast_fn (ctx, t, non_constant_p, overflow_p);
2338
2339 if (!ctx->quiet)
2340 {
2341 if (!lambda_static_thunk_p (fun))
2342 error_at (loc, "call to non-%<constexpr%> function %qD", fun);
2343 explain_invalid_constexpr_fn (fun);
2344 }
2345 *non_constant_p = true;
2346 return t;
2347 }
2348
2349 constexpr_ctx new_ctx = *ctx;
2350 if (DECL_CONSTRUCTOR_P (fun) && !ctx->object
2351 && TREE_CODE (t) == AGGR_INIT_EXPR)
2352 {
2353 /* We want to have an initialization target for an AGGR_INIT_EXPR.
2354 If we don't already have one in CTX, use the AGGR_INIT_EXPR_SLOT. */
2355 new_ctx.object = AGGR_INIT_EXPR_SLOT (t);
2356 tree ctor = new_ctx.ctor = build_constructor (DECL_CONTEXT (fun), NULL);
2357 CONSTRUCTOR_NO_CLEARING (ctor) = true;
2358 ctx->global->values.put (new_ctx.object, ctor);
2359 ctx = &new_ctx;
2360 }
2361
2362 /* Shortcut trivial constructor/op=. */
2363 if (trivial_fn_p (fun))
2364 {
2365 tree init = NULL_TREE;
2366 if (call_expr_nargs (t) == 2)
2367 init = convert_from_reference (get_nth_callarg (t, 1));
2368 else if (TREE_CODE (t) == AGGR_INIT_EXPR
2369 && AGGR_INIT_ZERO_FIRST (t))
2370 init = build_zero_init (DECL_CONTEXT (fun), NULL_TREE, false);
2371 if (init)
2372 {
2373 tree op = get_nth_callarg (t, 0);
2374 if (is_dummy_object (op))
2375 op = ctx->object;
2376 else
2377 op = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (op)), op);
2378 tree set = build2 (MODIFY_EXPR, TREE_TYPE (op), op, init);
2379 new_ctx.call = &new_call;
2380 return cxx_eval_constant_expression (&new_ctx, set, lval,
2381 non_constant_p, overflow_p);
2382 }
2383 }
2384
2385 /* We can't defer instantiating the function any longer. */
2386 if (!DECL_INITIAL (fun)
2387 && !ctx->uid_sensitive
2388 && DECL_TEMPLOID_INSTANTIATION (fun))
2389 {
2390 location_t save_loc = input_location;
2391 input_location = loc;
2392 ++function_depth;
2393 instantiate_decl (fun, /*defer_ok*/false, /*expl_inst*/false);
2394 --function_depth;
2395 input_location = save_loc;
2396 }
2397
2398 /* If in direct recursive call, optimize definition search. */
2399 if (ctx && ctx->call && ctx->call->fundef && ctx->call->fundef->decl == fun)
2400 new_call.fundef = ctx->call->fundef;
2401 else
2402 {
2403 new_call.fundef = retrieve_constexpr_fundef (fun);
2404 if (new_call.fundef == NULL || new_call.fundef->body == NULL
2405 || new_call.fundef->result == error_mark_node
2406 || fun == current_function_decl)
2407 {
2408 if (!ctx->quiet)
2409 {
2410 /* We need to check for current_function_decl here in case we're
2411 being called during cp_fold_function, because at that point
2412 DECL_INITIAL is set properly and we have a fundef but we
2413 haven't lowered invisirefs yet (c++/70344). */
2414 if (DECL_INITIAL (fun) == error_mark_node
2415 || fun == current_function_decl)
2416 error_at (loc, "%qD called in a constant expression before its "
2417 "definition is complete", fun);
2418 else if (DECL_INITIAL (fun))
2419 {
2420 /* The definition of fun was somehow unsuitable. But pretend
2421 that lambda static thunks don't exist. */
2422 if (!lambda_static_thunk_p (fun))
2423 error_at (loc, "%qD called in a constant expression", fun);
2424 explain_invalid_constexpr_fn (fun);
2425 }
2426 else
2427 error_at (loc, "%qD used before its definition", fun);
2428 }
2429 *non_constant_p = true;
2430 return t;
2431 }
2432 }
2433
2434 bool non_constant_args = false;
2435 cxx_bind_parameters_in_call (ctx, t, &new_call,
2436 non_constant_p, overflow_p, &non_constant_args);
2437
2438 /* We build up the bindings list before we know whether we already have this
2439 call cached. If we don't end up saving these bindings, ggc_free them when
2440 this function exits. */
2441 class free_bindings
2442 {
2443 tree *bindings;
2444 public:
2445 free_bindings (tree &b): bindings (&b) { }
2446 ~free_bindings () { if (bindings) ggc_free (*bindings); }
2447 void preserve () { bindings = NULL; }
2448 } fb (new_call.bindings);
2449
2450 if (*non_constant_p)
2451 return t;
2452
2453 depth_ok = push_cx_call_context (t);
2454
2455 /* Remember the object we are constructing or destructing. */
2456 tree new_obj = NULL_TREE;
2457 if (DECL_CONSTRUCTOR_P (fun) || DECL_DESTRUCTOR_P (fun))
2458 {
2459 /* In a cdtor, it should be the first `this' argument.
2460 At this point it has already been evaluated in the call
2461 to cxx_bind_parameters_in_call. */
2462 new_obj = TREE_VEC_ELT (new_call.bindings, 0);
2463 STRIP_NOPS (new_obj);
2464 if (TREE_CODE (new_obj) == ADDR_EXPR)
2465 new_obj = TREE_OPERAND (new_obj, 0);
2466
2467 if (ctx->call && ctx->call->fundef
2468 && DECL_CONSTRUCTOR_P (ctx->call->fundef->decl))
2469 {
2470 tree cur_obj = TREE_VEC_ELT (ctx->call->bindings, 0);
2471 STRIP_NOPS (cur_obj);
2472 if (TREE_CODE (cur_obj) == ADDR_EXPR)
2473 cur_obj = TREE_OPERAND (cur_obj, 0);
2474 if (new_obj == cur_obj)
2475 /* We're calling the target constructor of a delegating
2476 constructor, or accessing a base subobject through a
2477 NOP_EXPR as part of a call to a base constructor, so
2478 there is no new (sub)object. */
2479 new_obj = NULL_TREE;
2480 }
2481 }
2482
2483 tree result = NULL_TREE;
2484
2485 constexpr_call *entry = NULL;
2486 if (depth_ok && !non_constant_args && ctx->strict)
2487 {
2488 new_call.hash = constexpr_fundef_hasher::hash (new_call.fundef);
2489 new_call.hash
2490 = iterative_hash_template_arg (new_call.bindings, new_call.hash);
2491 new_call.hash
2492 = iterative_hash_object (ctx->manifestly_const_eval, new_call.hash);
2493
2494 /* If we have seen this call before, we are done. */
2495 maybe_initialize_constexpr_call_table ();
2496 constexpr_call **slot
2497 = constexpr_call_table->find_slot (&new_call, INSERT);
2498 entry = *slot;
2499 if (entry == NULL)
2500 {
2501 /* Only cache up to constexpr_cache_depth to limit memory use. */
2502 if (depth_ok < constexpr_cache_depth)
2503 {
2504 /* We need to keep a pointer to the entry, not just the slot, as
2505 the slot can move during evaluation of the body. */
2506 *slot = entry = ggc_alloc<constexpr_call> ();
2507 *entry = new_call;
2508 fb.preserve ();
2509 }
2510 }
2511 /* Calls that are in progress have their result set to NULL, so that we
2512 can detect circular dependencies. Now that we only cache up to
2513 constexpr_cache_depth this won't catch circular dependencies that
2514 start deeper, but they'll hit the recursion or ops limit. */
2515 else if (entry->result == NULL)
2516 {
2517 if (!ctx->quiet)
2518 error ("call has circular dependency");
2519 *non_constant_p = true;
2520 entry->result = result = error_mark_node;
2521 }
2522 else
2523 result = entry->result;
2524 }
2525
2526 if (!depth_ok)
2527 {
2528 if (!ctx->quiet)
2529 error ("%<constexpr%> evaluation depth exceeds maximum of %d (use "
2530 "%<-fconstexpr-depth=%> to increase the maximum)",
2531 max_constexpr_depth);
2532 *non_constant_p = true;
2533 result = error_mark_node;
2534 }
2535 else
2536 {
2537 bool cacheable = true;
2538 if (result && result != error_mark_node)
2539 /* OK */;
2540 else if (!DECL_SAVED_TREE (fun))
2541 {
2542 /* When at_eof >= 2, cgraph has started throwing away
2543 DECL_SAVED_TREE, so fail quietly. FIXME we get here because of
2544 late code generation for VEC_INIT_EXPR, which needs to be
2545 completely reconsidered. */
2546 gcc_assert (at_eof >= 2 && ctx->quiet);
2547 *non_constant_p = true;
2548 }
2549 else if (tree copy = get_fundef_copy (ctx, new_call.fundef))
2550 {
2551 tree body, parms, res;
2552 releasing_vec ctors;
2553
2554 /* Reuse or create a new unshared copy of this function's body. */
2555 body = TREE_PURPOSE (copy);
2556 parms = TREE_VALUE (copy);
2557 res = TREE_TYPE (copy);
2558
2559 /* Associate the bindings with the remapped parms. */
2560 tree bound = new_call.bindings;
2561 tree remapped = parms;
2562 for (int i = 0; i < TREE_VEC_LENGTH (bound); ++i)
2563 {
2564 tree arg = TREE_VEC_ELT (bound, i);
2565 if (entry)
2566 {
2567 /* Unshare args going into the hash table to separate them
2568 from the caller's context, for better GC and to avoid
2569 problems with verify_gimple. */
2570 arg = unshare_expr_without_location (arg);
2571 TREE_VEC_ELT (bound, i) = arg;
2572 }
2573 /* Don't share a CONSTRUCTOR that might be changed. This is not
2574 redundant with the unshare just above; we also don't want to
2575 change the argument values in the hash table. XXX Could we
2576 unshare lazily in cxx_eval_store_expression? */
2577 arg = unshare_constructor (arg);
2578 if (TREE_CODE (arg) == CONSTRUCTOR)
2579 vec_safe_push (ctors, arg);
2580 ctx->global->values.put (remapped, arg);
2581 remapped = DECL_CHAIN (remapped);
2582 }
2583 /* Add the RESULT_DECL to the values map, too. */
2584 gcc_assert (!DECL_BY_REFERENCE (res));
2585 ctx->global->values.put (res, NULL_TREE);
2586
2587 /* Track the callee's evaluated SAVE_EXPRs and TARGET_EXPRs so that
2588 we can forget their values after the call. */
2589 constexpr_ctx ctx_with_save_exprs = *ctx;
2590 auto_vec<tree, 10> save_exprs;
2591 ctx_with_save_exprs.save_exprs = &save_exprs;
2592 ctx_with_save_exprs.call = &new_call;
2593 unsigned save_heap_alloc_count = ctx->global->heap_vars.length ();
2594 unsigned save_heap_dealloc_count = ctx->global->heap_dealloc_count;
2595
2596 /* If this is a constexpr destructor, the object's const and volatile
2597 semantics are no longer in effect; see [class.dtor]p5. */
2598 if (new_obj && DECL_DESTRUCTOR_P (fun))
2599 cxx_set_object_constness (ctx, new_obj, /*readonly_p=*/false,
2600 non_constant_p, overflow_p);
2601
2602 tree jump_target = NULL_TREE;
2603 cxx_eval_constant_expression (&ctx_with_save_exprs, body,
2604 lval, non_constant_p, overflow_p,
2605 &jump_target);
2606
2607 if (DECL_CONSTRUCTOR_P (fun))
2608 /* This can be null for a subobject constructor call, in
2609 which case what we care about is the initialization
2610 side-effects rather than the value. We could get at the
2611 value by evaluating *this, but we don't bother; there's
2612 no need to put such a call in the hash table. */
2613 result = lval ? ctx->object : ctx->ctor;
2614 else if (VOID_TYPE_P (TREE_TYPE (res)))
2615 result = void_node;
2616 else
2617 {
2618 result = *ctx->global->values.get (res);
2619 if (result == NULL_TREE && !*non_constant_p)
2620 {
2621 if (!ctx->quiet)
2622 error ("%<constexpr%> call flows off the end "
2623 "of the function");
2624 *non_constant_p = true;
2625 }
2626 }
2627
2628 /* At this point, the object's constructor will have run, so
2629 the object is no longer under construction, and its possible
2630 'const' semantics now apply. Make a note of this fact by
2631 marking the CONSTRUCTOR TREE_READONLY. */
2632 if (new_obj && DECL_CONSTRUCTOR_P (fun))
2633 cxx_set_object_constness (ctx, new_obj, /*readonly_p=*/true,
2634 non_constant_p, overflow_p);
2635
2636 /* Forget the saved values of the callee's SAVE_EXPRs and
2637 TARGET_EXPRs. */
2638 unsigned int i;
2639 tree save_expr;
2640 FOR_EACH_VEC_ELT (save_exprs, i, save_expr)
2641 ctx->global->values.remove (save_expr);
2642
2643 /* Remove the parms/result from the values map. Is it worth
2644 bothering to do this when the map itself is only live for
2645 one constexpr evaluation? If so, maybe also clear out
2646 other vars from call, maybe in BIND_EXPR handling? */
2647 ctx->global->values.remove (res);
2648 for (tree parm = parms; parm; parm = TREE_CHAIN (parm))
2649 ctx->global->values.remove (parm);
2650
2651 /* Free any parameter CONSTRUCTORs we aren't returning directly. */
2652 while (!ctors->is_empty ())
2653 {
2654 tree c = ctors->pop ();
2655 if (c != result)
2656 free_constructor (c);
2657 }
2658
2659 /* Make the unshared function copy we used available for re-use. */
2660 save_fundef_copy (fun, copy);
2661
2662 /* If the call allocated some heap object that hasn't been
2663 deallocated during the call, or if it deallocated some heap
2664 object it has not allocated, the call isn't really stateless
2665 for the constexpr evaluation and should not be cached.
2666 It is fine if the call allocates something and deallocates it
2667 too. */
2668 if (entry
2669 && (save_heap_alloc_count != ctx->global->heap_vars.length ()
2670 || (save_heap_dealloc_count
2671 != ctx->global->heap_dealloc_count)))
2672 {
2673 tree heap_var;
2674 unsigned int i;
2675 if ((ctx->global->heap_vars.length ()
2676 - ctx->global->heap_dealloc_count)
2677 != save_heap_alloc_count - save_heap_dealloc_count)
2678 cacheable = false;
2679 else
2680 FOR_EACH_VEC_ELT_FROM (ctx->global->heap_vars, i, heap_var,
2681 save_heap_alloc_count)
2682 if (DECL_NAME (heap_var) != heap_deleted_identifier)
2683 {
2684 cacheable = false;
2685 break;
2686 }
2687 }
2688
2689 /* Rewrite all occurrences of the function's RESULT_DECL with the
2690 current object under construction. */
2691 if (!*non_constant_p && ctx->object
2692 && CLASS_TYPE_P (TREE_TYPE (res))
2693 && !is_empty_class (TREE_TYPE (res)))
2694 if (replace_result_decl (&result, res, ctx->object))
2695 cacheable = false;
2696 }
2697 else
2698 /* Couldn't get a function copy to evaluate. */
2699 *non_constant_p = true;
2700
2701 if (result == error_mark_node)
2702 *non_constant_p = true;
2703 if (*non_constant_p || *overflow_p)
2704 result = error_mark_node;
2705 else if (!result)
2706 result = void_node;
2707 if (entry)
2708 entry->result = cacheable ? result : error_mark_node;
2709 }
2710
2711 /* The result of a constexpr function must be completely initialized.
2712
2713 However, in C++20, a constexpr constructor doesn't necessarily have
2714 to initialize all the fields, so we don't clear CONSTRUCTOR_NO_CLEARING
2715 in order to detect reading an unitialized object in constexpr instead
2716 of value-initializing it. (reduced_constant_expression_p is expected to
2717 take care of clearing the flag.) */
2718 if (TREE_CODE (result) == CONSTRUCTOR
2719 && (cxx_dialect < cxx2a
2720 || !DECL_CONSTRUCTOR_P (fun)))
2721 clear_no_implicit_zero (result);
2722
2723 pop_cx_call_context ();
2724 return result;
2725 }
2726
2727 /* Return true if T is a valid constant initializer. If a CONSTRUCTOR
2728 initializes all the members, the CONSTRUCTOR_NO_CLEARING flag will be
2729 cleared.
2730 FIXME speed this up, it's taking 16% of compile time on sieve testcase. */
2731
2732 bool
reduced_constant_expression_p(tree t)2733 reduced_constant_expression_p (tree t)
2734 {
2735 if (t == NULL_TREE)
2736 return false;
2737
2738 switch (TREE_CODE (t))
2739 {
2740 case PTRMEM_CST:
2741 /* Even if we can't lower this yet, it's constant. */
2742 return true;
2743
2744 case CONSTRUCTOR:
2745 /* And we need to handle PTRMEM_CST wrapped in a CONSTRUCTOR. */
2746 tree idx, val, field; unsigned HOST_WIDE_INT i;
2747 if (CONSTRUCTOR_NO_CLEARING (t))
2748 {
2749 if (TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
2750 /* An initialized vector would have a VECTOR_CST. */
2751 return false;
2752 else if (cxx_dialect >= cxx2a
2753 /* An ARRAY_TYPE doesn't have any TYPE_FIELDS. */
2754 && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
2755 field = NULL_TREE;
2756 else if (cxx_dialect >= cxx2a
2757 && TREE_CODE (TREE_TYPE (t)) == UNION_TYPE)
2758 {
2759 if (CONSTRUCTOR_NELTS (t) == 0)
2760 /* An initialized union has a constructor element. */
2761 return false;
2762 /* And it only initializes one member. */
2763 field = NULL_TREE;
2764 }
2765 else
2766 field = next_initializable_field (TYPE_FIELDS (TREE_TYPE (t)));
2767 }
2768 else
2769 field = NULL_TREE;
2770 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, idx, val)
2771 {
2772 /* If VAL is null, we're in the middle of initializing this
2773 element. */
2774 if (!reduced_constant_expression_p (val))
2775 return false;
2776 /* Empty class field may or may not have an initializer. */
2777 for (; field && idx != field;
2778 field = next_initializable_field (DECL_CHAIN (field)))
2779 if (!is_really_empty_class (TREE_TYPE (field),
2780 /*ignore_vptr*/false))
2781 return false;
2782 if (field)
2783 field = next_initializable_field (DECL_CHAIN (field));
2784 }
2785 /* There could be a non-empty field at the end. */
2786 for (; field; field = next_initializable_field (DECL_CHAIN (field)))
2787 if (!is_really_empty_class (TREE_TYPE (field), /*ignore_vptr*/false))
2788 return false;
2789 if (CONSTRUCTOR_NO_CLEARING (t))
2790 /* All the fields are initialized. */
2791 CONSTRUCTOR_NO_CLEARING (t) = false;
2792 return true;
2793
2794 default:
2795 /* FIXME are we calling this too much? */
2796 return initializer_constant_valid_p (t, TREE_TYPE (t)) != NULL_TREE;
2797 }
2798 }
2799
2800 /* Some expressions may have constant operands but are not constant
2801 themselves, such as 1/0. Call this function to check for that
2802 condition.
2803
2804 We only call this in places that require an arithmetic constant, not in
2805 places where we might have a non-constant expression that can be a
2806 component of a constant expression, such as the address of a constexpr
2807 variable that might be dereferenced later. */
2808
2809 static bool
verify_constant(tree t,bool allow_non_constant,bool * non_constant_p,bool * overflow_p)2810 verify_constant (tree t, bool allow_non_constant, bool *non_constant_p,
2811 bool *overflow_p)
2812 {
2813 if (!*non_constant_p && !reduced_constant_expression_p (t)
2814 && t != void_node)
2815 {
2816 if (!allow_non_constant)
2817 error ("%q+E is not a constant expression", t);
2818 *non_constant_p = true;
2819 }
2820 if (TREE_OVERFLOW_P (t))
2821 {
2822 if (!allow_non_constant)
2823 {
2824 permerror (input_location, "overflow in constant expression");
2825 /* If we're being permissive (and are in an enforcing
2826 context), ignore the overflow. */
2827 if (flag_permissive)
2828 return *non_constant_p;
2829 }
2830 *overflow_p = true;
2831 }
2832 return *non_constant_p;
2833 }
2834
2835 /* Check whether the shift operation with code CODE and type TYPE on LHS
2836 and RHS is undefined. If it is, give an error with an explanation,
2837 and return true; return false otherwise. */
2838
2839 static bool
cxx_eval_check_shift_p(location_t loc,const constexpr_ctx * ctx,enum tree_code code,tree type,tree lhs,tree rhs)2840 cxx_eval_check_shift_p (location_t loc, const constexpr_ctx *ctx,
2841 enum tree_code code, tree type, tree lhs, tree rhs)
2842 {
2843 if ((code != LSHIFT_EXPR && code != RSHIFT_EXPR)
2844 || TREE_CODE (lhs) != INTEGER_CST
2845 || TREE_CODE (rhs) != INTEGER_CST)
2846 return false;
2847
2848 tree lhstype = TREE_TYPE (lhs);
2849 unsigned HOST_WIDE_INT uprec = TYPE_PRECISION (TREE_TYPE (lhs));
2850
2851 /* [expr.shift] The behavior is undefined if the right operand
2852 is negative, or greater than or equal to the length in bits
2853 of the promoted left operand. */
2854 if (tree_int_cst_sgn (rhs) == -1)
2855 {
2856 if (!ctx->quiet)
2857 permerror (loc, "right operand of shift expression %q+E is negative",
2858 build2_loc (loc, code, type, lhs, rhs));
2859 return (!flag_permissive || ctx->quiet);
2860 }
2861 if (compare_tree_int (rhs, uprec) >= 0)
2862 {
2863 if (!ctx->quiet)
2864 permerror (loc, "right operand of shift expression %q+E is greater "
2865 "than or equal to the precision %wu of the left operand",
2866 build2_loc (loc, code, type, lhs, rhs), uprec);
2867 return (!flag_permissive || ctx->quiet);
2868 }
2869
2870 /* The value of E1 << E2 is E1 left-shifted E2 bit positions; [...]
2871 if E1 has a signed type and non-negative value, and E1x2^E2 is
2872 representable in the corresponding unsigned type of the result type,
2873 then that value, converted to the result type, is the resulting value;
2874 otherwise, the behavior is undefined.
2875 For C++2a:
2876 The value of E1 << E2 is the unique value congruent to E1 x 2^E2 modulo
2877 2^N, where N is the range exponent of the type of the result. */
2878 if (code == LSHIFT_EXPR
2879 && !TYPE_OVERFLOW_WRAPS (lhstype)
2880 && cxx_dialect >= cxx11
2881 && cxx_dialect < cxx2a)
2882 {
2883 if (tree_int_cst_sgn (lhs) == -1)
2884 {
2885 if (!ctx->quiet)
2886 permerror (loc,
2887 "left operand of shift expression %q+E is negative",
2888 build2_loc (loc, code, type, lhs, rhs));
2889 return (!flag_permissive || ctx->quiet);
2890 }
2891 /* For signed x << y the following:
2892 (unsigned) x >> ((prec (lhs) - 1) - y)
2893 if > 1, is undefined. The right-hand side of this formula
2894 is the highest bit of the LHS that can be set (starting from 0),
2895 so that the shift doesn't overflow. We then right-shift the LHS
2896 to see whether any other bit is set making the original shift
2897 undefined -- the result is not representable in the corresponding
2898 unsigned type. */
2899 tree t = build_int_cst (unsigned_type_node, uprec - 1);
2900 t = fold_build2 (MINUS_EXPR, unsigned_type_node, t, rhs);
2901 tree ulhs = fold_convert (unsigned_type_for (lhstype), lhs);
2902 t = fold_build2 (RSHIFT_EXPR, TREE_TYPE (ulhs), ulhs, t);
2903 if (tree_int_cst_lt (integer_one_node, t))
2904 {
2905 if (!ctx->quiet)
2906 permerror (loc, "shift expression %q+E overflows",
2907 build2_loc (loc, code, type, lhs, rhs));
2908 return (!flag_permissive || ctx->quiet);
2909 }
2910 }
2911 return false;
2912 }
2913
2914 /* Subroutine of cxx_eval_constant_expression.
2915 Attempt to reduce the unary expression tree T to a compile time value.
2916 If successful, return the value. Otherwise issue a diagnostic
2917 and return error_mark_node. */
2918
2919 static tree
cxx_eval_unary_expression(const constexpr_ctx * ctx,tree t,bool,bool * non_constant_p,bool * overflow_p)2920 cxx_eval_unary_expression (const constexpr_ctx *ctx, tree t,
2921 bool /*lval*/,
2922 bool *non_constant_p, bool *overflow_p)
2923 {
2924 tree r;
2925 tree orig_arg = TREE_OPERAND (t, 0);
2926 tree arg = cxx_eval_constant_expression (ctx, orig_arg, /*lval*/false,
2927 non_constant_p, overflow_p);
2928 VERIFY_CONSTANT (arg);
2929 location_t loc = EXPR_LOCATION (t);
2930 enum tree_code code = TREE_CODE (t);
2931 tree type = TREE_TYPE (t);
2932 r = fold_unary_loc (loc, code, type, arg);
2933 if (r == NULL_TREE)
2934 {
2935 if (arg == orig_arg)
2936 r = t;
2937 else
2938 r = build1_loc (loc, code, type, arg);
2939 }
2940 VERIFY_CONSTANT (r);
2941 return r;
2942 }
2943
2944 /* Helper function for cxx_eval_binary_expression. Try to optimize
2945 original POINTER_PLUS_EXPR T, LHS p+ RHS, return NULL_TREE if the
2946 generic folding should be used. */
2947
2948 static tree
cxx_fold_pointer_plus_expression(const constexpr_ctx * ctx,tree t,tree lhs,tree rhs,bool * non_constant_p,bool * overflow_p)2949 cxx_fold_pointer_plus_expression (const constexpr_ctx *ctx, tree t,
2950 tree lhs, tree rhs, bool *non_constant_p,
2951 bool *overflow_p)
2952 {
2953 STRIP_NOPS (lhs);
2954 if (TREE_CODE (lhs) != ADDR_EXPR)
2955 return NULL_TREE;
2956
2957 lhs = TREE_OPERAND (lhs, 0);
2958
2959 /* &A[i] p+ j => &A[i + j] */
2960 if (TREE_CODE (lhs) == ARRAY_REF
2961 && TREE_CODE (TREE_OPERAND (lhs, 1)) == INTEGER_CST
2962 && TREE_CODE (rhs) == INTEGER_CST
2963 && TYPE_SIZE_UNIT (TREE_TYPE (lhs))
2964 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (lhs))) == INTEGER_CST)
2965 {
2966 tree orig_type = TREE_TYPE (t);
2967 location_t loc = EXPR_LOCATION (t);
2968 tree type = TREE_TYPE (lhs);
2969
2970 t = fold_convert_loc (loc, ssizetype, TREE_OPERAND (lhs, 1));
2971 tree nelts = array_type_nelts_top (TREE_TYPE (TREE_OPERAND (lhs, 0)));
2972 nelts = cxx_eval_constant_expression (ctx, nelts, false, non_constant_p,
2973 overflow_p);
2974 if (*non_constant_p)
2975 return NULL_TREE;
2976 /* Don't fold an out-of-bound access. */
2977 if (!tree_int_cst_le (t, nelts))
2978 return NULL_TREE;
2979 rhs = cp_fold_convert (ssizetype, rhs);
2980 /* Don't fold if rhs can't be divided exactly by TYPE_SIZE_UNIT.
2981 constexpr int A[1]; ... (char *)&A[0] + 1 */
2982 if (!integer_zerop (fold_build2_loc (loc, TRUNC_MOD_EXPR, sizetype,
2983 rhs, TYPE_SIZE_UNIT (type))))
2984 return NULL_TREE;
2985 /* Make sure to treat the second operand of POINTER_PLUS_EXPR
2986 as signed. */
2987 rhs = fold_build2_loc (loc, EXACT_DIV_EXPR, ssizetype, rhs,
2988 TYPE_SIZE_UNIT (type));
2989 t = size_binop_loc (loc, PLUS_EXPR, rhs, t);
2990 t = build4_loc (loc, ARRAY_REF, type, TREE_OPERAND (lhs, 0),
2991 t, NULL_TREE, NULL_TREE);
2992 t = cp_build_addr_expr (t, tf_warning_or_error);
2993 t = cp_fold_convert (orig_type, t);
2994 return cxx_eval_constant_expression (ctx, t, /*lval*/false,
2995 non_constant_p, overflow_p);
2996 }
2997
2998 return NULL_TREE;
2999 }
3000
3001 /* Subroutine of cxx_eval_constant_expression.
3002 Like cxx_eval_unary_expression, except for binary expressions. */
3003
3004 static tree
cxx_eval_binary_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)3005 cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t,
3006 bool lval,
3007 bool *non_constant_p, bool *overflow_p)
3008 {
3009 tree r = NULL_TREE;
3010 tree orig_lhs = TREE_OPERAND (t, 0);
3011 tree orig_rhs = TREE_OPERAND (t, 1);
3012 tree lhs, rhs;
3013 lhs = cxx_eval_constant_expression (ctx, orig_lhs, /*lval*/false,
3014 non_constant_p, overflow_p);
3015 /* Don't VERIFY_CONSTANT here, it's unnecessary and will break pointer
3016 subtraction. */
3017 if (*non_constant_p)
3018 return t;
3019 rhs = cxx_eval_constant_expression (ctx, orig_rhs, /*lval*/false,
3020 non_constant_p, overflow_p);
3021 if (*non_constant_p)
3022 return t;
3023
3024 location_t loc = EXPR_LOCATION (t);
3025 enum tree_code code = TREE_CODE (t);
3026 tree type = TREE_TYPE (t);
3027
3028 if (code == EQ_EXPR || code == NE_EXPR)
3029 {
3030 bool is_code_eq = (code == EQ_EXPR);
3031
3032 if (TREE_CODE (lhs) == PTRMEM_CST
3033 && TREE_CODE (rhs) == PTRMEM_CST)
3034 {
3035 tree lmem = PTRMEM_CST_MEMBER (lhs);
3036 tree rmem = PTRMEM_CST_MEMBER (rhs);
3037 bool eq;
3038 if (TREE_CODE (lmem) == TREE_CODE (rmem)
3039 && TREE_CODE (lmem) == FIELD_DECL
3040 && TREE_CODE (DECL_CONTEXT (lmem)) == UNION_TYPE
3041 && same_type_p (DECL_CONTEXT (lmem),
3042 DECL_CONTEXT (rmem)))
3043 /* If both refer to (possibly different) members of the same union
3044 (12.3), they compare equal. */
3045 eq = true;
3046 else
3047 eq = cp_tree_equal (lhs, rhs);
3048 r = constant_boolean_node (eq == is_code_eq, type);
3049 }
3050 else if ((TREE_CODE (lhs) == PTRMEM_CST
3051 || TREE_CODE (rhs) == PTRMEM_CST)
3052 && (null_member_pointer_value_p (lhs)
3053 || null_member_pointer_value_p (rhs)))
3054 r = constant_boolean_node (!is_code_eq, type);
3055 else if (TREE_CODE (lhs) == PTRMEM_CST)
3056 lhs = cplus_expand_constant (lhs);
3057 else if (TREE_CODE (rhs) == PTRMEM_CST)
3058 rhs = cplus_expand_constant (rhs);
3059 }
3060 if (code == POINTER_PLUS_EXPR && !*non_constant_p
3061 && integer_zerop (lhs) && !integer_zerop (rhs))
3062 {
3063 if (!ctx->quiet)
3064 error ("arithmetic involving a null pointer in %qE", lhs);
3065 *non_constant_p = true;
3066 return t;
3067 }
3068 else if (code == POINTER_PLUS_EXPR)
3069 r = cxx_fold_pointer_plus_expression (ctx, t, lhs, rhs, non_constant_p,
3070 overflow_p);
3071 else if (code == SPACESHIP_EXPR)
3072 {
3073 r = genericize_spaceship (type, lhs, rhs);
3074 return cxx_eval_constant_expression (ctx, r, lval, non_constant_p,
3075 overflow_p);
3076 }
3077
3078 if (r == NULL_TREE)
3079 r = fold_binary_loc (loc, code, type, lhs, rhs);
3080
3081 if (r == NULL_TREE)
3082 {
3083 if (lhs == orig_lhs && rhs == orig_rhs)
3084 r = t;
3085 else
3086 r = build2_loc (loc, code, type, lhs, rhs);
3087 }
3088 else if (cxx_eval_check_shift_p (loc, ctx, code, type, lhs, rhs))
3089 *non_constant_p = true;
3090 /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
3091 a local array in a constexpr function. */
3092 bool ptr = INDIRECT_TYPE_P (TREE_TYPE (lhs));
3093 if (!ptr)
3094 VERIFY_CONSTANT (r);
3095 return r;
3096 }
3097
3098 /* Subroutine of cxx_eval_constant_expression.
3099 Attempt to evaluate condition expressions. Dead branches are not
3100 looked into. */
3101
3102 static tree
cxx_eval_conditional_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p,tree * jump_target)3103 cxx_eval_conditional_expression (const constexpr_ctx *ctx, tree t,
3104 bool lval,
3105 bool *non_constant_p, bool *overflow_p,
3106 tree *jump_target)
3107 {
3108 tree val = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
3109 /*lval*/false,
3110 non_constant_p, overflow_p);
3111 VERIFY_CONSTANT (val);
3112 /* Don't VERIFY_CONSTANT the other operands. */
3113 if (integer_zerop (val))
3114 val = TREE_OPERAND (t, 2);
3115 else
3116 val = TREE_OPERAND (t, 1);
3117 if (TREE_CODE (t) == IF_STMT && !val)
3118 val = void_node;
3119 return cxx_eval_constant_expression (ctx, val, lval, non_constant_p,
3120 overflow_p, jump_target);
3121 }
3122
3123 /* Subroutine of cxx_eval_constant_expression.
3124 Attempt to evaluate vector condition expressions. Unlike
3125 cxx_eval_conditional_expression, VEC_COND_EXPR acts like a normal
3126 ternary arithmetics operation, where all 3 arguments have to be
3127 evaluated as constants and then folding computes the result from
3128 them. */
3129
3130 static tree
cxx_eval_vector_conditional_expression(const constexpr_ctx * ctx,tree t,bool * non_constant_p,bool * overflow_p)3131 cxx_eval_vector_conditional_expression (const constexpr_ctx *ctx, tree t,
3132 bool *non_constant_p, bool *overflow_p)
3133 {
3134 tree arg1 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
3135 /*lval*/false,
3136 non_constant_p, overflow_p);
3137 VERIFY_CONSTANT (arg1);
3138 tree arg2 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
3139 /*lval*/false,
3140 non_constant_p, overflow_p);
3141 VERIFY_CONSTANT (arg2);
3142 tree arg3 = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 2),
3143 /*lval*/false,
3144 non_constant_p, overflow_p);
3145 VERIFY_CONSTANT (arg3);
3146 location_t loc = EXPR_LOCATION (t);
3147 tree type = TREE_TYPE (t);
3148 tree r = fold_ternary_loc (loc, VEC_COND_EXPR, type, arg1, arg2, arg3);
3149 if (r == NULL_TREE)
3150 {
3151 if (arg1 == TREE_OPERAND (t, 0)
3152 && arg2 == TREE_OPERAND (t, 1)
3153 && arg3 == TREE_OPERAND (t, 2))
3154 r = t;
3155 else
3156 r = build3_loc (loc, VEC_COND_EXPR, type, arg1, arg2, arg3);
3157 }
3158 VERIFY_CONSTANT (r);
3159 return r;
3160 }
3161
3162 /* Returns less than, equal to, or greater than zero if KEY is found to be
3163 less than, to match, or to be greater than the constructor_elt's INDEX. */
3164
3165 static int
array_index_cmp(tree key,tree index)3166 array_index_cmp (tree key, tree index)
3167 {
3168 gcc_assert (TREE_CODE (key) == INTEGER_CST);
3169
3170 switch (TREE_CODE (index))
3171 {
3172 case INTEGER_CST:
3173 return tree_int_cst_compare (key, index);
3174 case RANGE_EXPR:
3175 {
3176 tree lo = TREE_OPERAND (index, 0);
3177 tree hi = TREE_OPERAND (index, 1);
3178 if (tree_int_cst_lt (key, lo))
3179 return -1;
3180 else if (tree_int_cst_lt (hi, key))
3181 return 1;
3182 else
3183 return 0;
3184 }
3185 default:
3186 gcc_unreachable ();
3187 }
3188 }
3189
3190 /* Returns the index of the constructor_elt of ARY which matches DINDEX, or -1
3191 if none. If INSERT is true, insert a matching element rather than fail. */
3192
3193 static HOST_WIDE_INT
find_array_ctor_elt(tree ary,tree dindex,bool insert)3194 find_array_ctor_elt (tree ary, tree dindex, bool insert)
3195 {
3196 if (tree_int_cst_sgn (dindex) < 0)
3197 return -1;
3198
3199 unsigned HOST_WIDE_INT i = tree_to_uhwi (dindex);
3200 vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (ary);
3201 unsigned HOST_WIDE_INT len = vec_safe_length (elts);
3202
3203 unsigned HOST_WIDE_INT end = len;
3204 unsigned HOST_WIDE_INT begin = 0;
3205
3206 /* If the last element of the CONSTRUCTOR has its own index, we can assume
3207 that the same is true of the other elements and index directly. */
3208 if (end > 0)
3209 {
3210 tree cindex = (*elts)[end - 1].index;
3211 if (cindex == NULL_TREE)
3212 {
3213 /* Verify that if the last index is missing, all indexes
3214 are missing. */
3215 if (flag_checking)
3216 for (unsigned int j = 0; j < len - 1; ++j)
3217 gcc_assert ((*elts)[j].index == NULL_TREE);
3218 if (i < end)
3219 return i;
3220 else
3221 {
3222 begin = end;
3223 if (i == end)
3224 /* If the element is to be added right at the end,
3225 make sure it is added with cleared index too. */
3226 dindex = NULL_TREE;
3227 else if (insert)
3228 /* Otherwise, in order not to break the assumption
3229 that CONSTRUCTOR either has all indexes or none,
3230 we need to add indexes to all elements. */
3231 for (unsigned int j = 0; j < len; ++j)
3232 (*elts)[j].index = build_int_cst (TREE_TYPE (dindex), j);
3233 }
3234 }
3235 else if (TREE_CODE (cindex) == INTEGER_CST
3236 && compare_tree_int (cindex, end - 1) == 0)
3237 {
3238 if (i < end)
3239 return i;
3240 else
3241 begin = end;
3242 }
3243 }
3244
3245 /* Otherwise, find a matching index by means of a binary search. */
3246 while (begin != end)
3247 {
3248 unsigned HOST_WIDE_INT middle = (begin + end) / 2;
3249 constructor_elt &elt = (*elts)[middle];
3250 tree idx = elt.index;
3251
3252 int cmp = array_index_cmp (dindex, idx);
3253 if (cmp < 0)
3254 end = middle;
3255 else if (cmp > 0)
3256 begin = middle + 1;
3257 else
3258 {
3259 if (insert && TREE_CODE (idx) == RANGE_EXPR)
3260 {
3261 /* We need to split the range. */
3262 constructor_elt e;
3263 tree lo = TREE_OPERAND (idx, 0);
3264 tree hi = TREE_OPERAND (idx, 1);
3265 tree value = elt.value;
3266 dindex = fold_convert (sizetype, dindex);
3267 if (tree_int_cst_lt (lo, dindex))
3268 {
3269 /* There are still some lower elts; shorten the range. */
3270 tree new_hi = int_const_binop (MINUS_EXPR, dindex,
3271 size_one_node);
3272 if (tree_int_cst_equal (lo, new_hi))
3273 /* Only one element left, no longer a range. */
3274 elt.index = lo;
3275 else
3276 TREE_OPERAND (idx, 1) = new_hi;
3277 /* Append the element we want to insert. */
3278 ++middle;
3279 e.index = dindex;
3280 e.value = unshare_constructor (value);
3281 vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle, e);
3282 }
3283 else
3284 /* No lower elts, the range elt is now ours. */
3285 elt.index = dindex;
3286
3287 if (tree_int_cst_lt (dindex, hi))
3288 {
3289 /* There are still some higher elts; append a range. */
3290 tree new_lo = int_const_binop (PLUS_EXPR, dindex,
3291 size_one_node);
3292 if (tree_int_cst_equal (new_lo, hi))
3293 e.index = hi;
3294 else
3295 e.index = build2 (RANGE_EXPR, sizetype, new_lo, hi);
3296 e.value = unshare_constructor (value);
3297 vec_safe_insert (CONSTRUCTOR_ELTS (ary), middle + 1, e);
3298 }
3299 }
3300 return middle;
3301 }
3302 }
3303
3304 if (insert)
3305 {
3306 constructor_elt e = { dindex, NULL_TREE };
3307 vec_safe_insert (CONSTRUCTOR_ELTS (ary), end, e);
3308 return end;
3309 }
3310
3311 return -1;
3312 }
3313
3314 /* Return a pointer to the constructor_elt of CTOR which matches INDEX. If no
3315 matching constructor_elt exists, then add one to CTOR.
3316
3317 As an optimization, if POS_HINT is non-negative then it is used as a guess
3318 for the (integer) index of the matching constructor_elt within CTOR. */
3319
3320 static constructor_elt *
3321 get_or_insert_ctor_field (tree ctor, tree index, int pos_hint = -1)
3322 {
3323 /* Check the hint first. */
3324 if (pos_hint >= 0 && (unsigned)pos_hint < CONSTRUCTOR_NELTS (ctor)
3325 && CONSTRUCTOR_ELT (ctor, pos_hint)->index == index)
3326 return CONSTRUCTOR_ELT (ctor, pos_hint);
3327
3328 tree type = TREE_TYPE (ctor);
3329 if (TREE_CODE (type) == VECTOR_TYPE && index == NULL_TREE)
3330 {
3331 CONSTRUCTOR_APPEND_ELT (CONSTRUCTOR_ELTS (ctor), index, NULL_TREE);
3332 return &CONSTRUCTOR_ELTS (ctor)->last();
3333 }
3334 else if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == VECTOR_TYPE)
3335 {
3336 if (TREE_CODE (index) == RANGE_EXPR)
3337 {
3338 /* Support for RANGE_EXPR index lookups is currently limited to
3339 accessing an existing element via POS_HINT, or appending a new
3340 element to the end of CTOR. ??? Support for other access
3341 patterns may also be needed. */
3342 vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (ctor);
3343 if (vec_safe_length (elts))
3344 {
3345 tree lo = TREE_OPERAND (index, 0);
3346 gcc_assert (array_index_cmp (elts->last().index, lo) < 0);
3347 }
3348 CONSTRUCTOR_APPEND_ELT (elts, index, NULL_TREE);
3349 return &elts->last();
3350 }
3351
3352 HOST_WIDE_INT i = find_array_ctor_elt (ctor, index, /*insert*/true);
3353 gcc_assert (i >= 0);
3354 constructor_elt *cep = CONSTRUCTOR_ELT (ctor, i);
3355 gcc_assert (cep->index == NULL_TREE
3356 || TREE_CODE (cep->index) != RANGE_EXPR);
3357 return cep;
3358 }
3359 else
3360 {
3361 gcc_assert (TREE_CODE (index) == FIELD_DECL);
3362
3363 /* We must keep the CONSTRUCTOR's ELTS in FIELD order.
3364 Usually we meet initializers in that order, but it is
3365 possible for base types to be placed not in program
3366 order. */
3367 tree fields = TYPE_FIELDS (DECL_CONTEXT (index));
3368 unsigned HOST_WIDE_INT idx = 0;
3369 constructor_elt *cep = NULL;
3370
3371 /* Check if we're changing the active member of a union. */
3372 if (TREE_CODE (type) == UNION_TYPE && CONSTRUCTOR_NELTS (ctor)
3373 && CONSTRUCTOR_ELT (ctor, 0)->index != index)
3374 vec_safe_truncate (CONSTRUCTOR_ELTS (ctor), 0);
3375 /* If the bit offset of INDEX is larger than that of the last
3376 constructor_elt, then we can just immediately append a new
3377 constructor_elt to the end of CTOR. */
3378 else if (CONSTRUCTOR_NELTS (ctor)
3379 && tree_int_cst_compare (bit_position (index),
3380 bit_position (CONSTRUCTOR_ELTS (ctor)
3381 ->last().index)) > 0)
3382 {
3383 idx = CONSTRUCTOR_NELTS (ctor);
3384 goto insert;
3385 }
3386
3387 /* Otherwise, we need to iterate over CTOR to find or insert INDEX
3388 appropriately. */
3389
3390 for (; vec_safe_iterate (CONSTRUCTOR_ELTS (ctor), idx, &cep);
3391 idx++, fields = DECL_CHAIN (fields))
3392 {
3393 if (index == cep->index)
3394 goto found;
3395
3396 /* The field we're initializing must be on the field
3397 list. Look to see if it is present before the
3398 field the current ELT initializes. */
3399 for (; fields != cep->index; fields = DECL_CHAIN (fields))
3400 if (index == fields)
3401 goto insert;
3402 }
3403 /* We fell off the end of the CONSTRUCTOR, so insert a new
3404 entry at the end. */
3405
3406 insert:
3407 {
3408 constructor_elt ce = { index, NULL_TREE };
3409
3410 vec_safe_insert (CONSTRUCTOR_ELTS (ctor), idx, ce);
3411 cep = CONSTRUCTOR_ELT (ctor, idx);
3412 }
3413 found:;
3414
3415 return cep;
3416 }
3417 }
3418
3419 /* Under the control of CTX, issue a detailed diagnostic for
3420 an out-of-bounds subscript INDEX into the expression ARRAY. */
3421
3422 static void
diag_array_subscript(location_t loc,const constexpr_ctx * ctx,tree array,tree index)3423 diag_array_subscript (location_t loc, const constexpr_ctx *ctx, tree array, tree index)
3424 {
3425 if (!ctx->quiet)
3426 {
3427 tree arraytype = TREE_TYPE (array);
3428
3429 /* Convert the unsigned array subscript to a signed integer to avoid
3430 printing huge numbers for small negative values. */
3431 tree sidx = fold_convert (ssizetype, index);
3432 STRIP_ANY_LOCATION_WRAPPER (array);
3433 if (DECL_P (array))
3434 {
3435 if (TYPE_DOMAIN (arraytype))
3436 error_at (loc, "array subscript value %qE is outside the bounds "
3437 "of array %qD of type %qT", sidx, array, arraytype);
3438 else
3439 error_at (loc, "nonzero array subscript %qE is used with array %qD of "
3440 "type %qT with unknown bounds", sidx, array, arraytype);
3441 inform (DECL_SOURCE_LOCATION (array), "declared here");
3442 }
3443 else if (TYPE_DOMAIN (arraytype))
3444 error_at (loc, "array subscript value %qE is outside the bounds "
3445 "of array type %qT", sidx, arraytype);
3446 else
3447 error_at (loc, "nonzero array subscript %qE is used with array of type %qT "
3448 "with unknown bounds", sidx, arraytype);
3449 }
3450 }
3451
3452 /* Return the number of elements for TYPE (which is an ARRAY_TYPE or
3453 a VECTOR_TYPE). */
3454
3455 static tree
get_array_or_vector_nelts(const constexpr_ctx * ctx,tree type,bool * non_constant_p,bool * overflow_p)3456 get_array_or_vector_nelts (const constexpr_ctx *ctx, tree type,
3457 bool *non_constant_p, bool *overflow_p)
3458 {
3459 tree nelts;
3460 if (TREE_CODE (type) == ARRAY_TYPE)
3461 {
3462 if (TYPE_DOMAIN (type))
3463 nelts = array_type_nelts_top (type);
3464 else
3465 nelts = size_zero_node;
3466 }
3467 else if (VECTOR_TYPE_P (type))
3468 nelts = size_int (TYPE_VECTOR_SUBPARTS (type));
3469 else
3470 gcc_unreachable ();
3471
3472 /* For VLAs, the number of elements won't be an integer constant. */
3473 nelts = cxx_eval_constant_expression (ctx, nelts, false,
3474 non_constant_p, overflow_p);
3475 return nelts;
3476 }
3477
3478 /* Extract element INDEX consisting of CHARS_PER_ELT chars from
3479 STRING_CST STRING. */
3480
3481 static tree
extract_string_elt(tree string,unsigned chars_per_elt,unsigned index)3482 extract_string_elt (tree string, unsigned chars_per_elt, unsigned index)
3483 {
3484 tree type = cv_unqualified (TREE_TYPE (TREE_TYPE (string)));
3485 tree r;
3486
3487 if (chars_per_elt == 1)
3488 r = build_int_cst (type, TREE_STRING_POINTER (string)[index]);
3489 else
3490 {
3491 const unsigned char *ptr
3492 = ((const unsigned char *)TREE_STRING_POINTER (string)
3493 + index * chars_per_elt);
3494 r = native_interpret_expr (type, ptr, chars_per_elt);
3495 }
3496 return r;
3497 }
3498
3499 /* Subroutine of cxx_eval_array_reference. T is an ARRAY_REF; evaluate the
3500 subscript, diagnose any problems with it, and return the result. */
3501
3502 static tree
eval_and_check_array_index(const constexpr_ctx * ctx,tree t,bool allow_one_past,bool * non_constant_p,bool * overflow_p)3503 eval_and_check_array_index (const constexpr_ctx *ctx,
3504 tree t, bool allow_one_past,
3505 bool *non_constant_p, bool *overflow_p)
3506 {
3507 location_t loc = cp_expr_loc_or_input_loc (t);
3508 tree ary = TREE_OPERAND (t, 0);
3509 t = TREE_OPERAND (t, 1);
3510 tree index = cxx_eval_constant_expression (ctx, t, false,
3511 non_constant_p, overflow_p);
3512 VERIFY_CONSTANT (index);
3513
3514 if (!tree_fits_shwi_p (index)
3515 || tree_int_cst_sgn (index) < 0)
3516 {
3517 diag_array_subscript (loc, ctx, ary, index);
3518 *non_constant_p = true;
3519 return t;
3520 }
3521
3522 tree nelts = get_array_or_vector_nelts (ctx, TREE_TYPE (ary), non_constant_p,
3523 overflow_p);
3524 VERIFY_CONSTANT (nelts);
3525 if (allow_one_past
3526 ? !tree_int_cst_le (index, nelts)
3527 : !tree_int_cst_lt (index, nelts))
3528 {
3529 diag_array_subscript (loc, ctx, ary, index);
3530 *non_constant_p = true;
3531 return t;
3532 }
3533
3534 return index;
3535 }
3536
3537 /* Subroutine of cxx_eval_constant_expression.
3538 Attempt to reduce a reference to an array slot. */
3539
3540 static tree
cxx_eval_array_reference(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)3541 cxx_eval_array_reference (const constexpr_ctx *ctx, tree t,
3542 bool lval,
3543 bool *non_constant_p, bool *overflow_p)
3544 {
3545 tree oldary = TREE_OPERAND (t, 0);
3546 tree ary = cxx_eval_constant_expression (ctx, oldary,
3547 lval,
3548 non_constant_p, overflow_p);
3549 if (*non_constant_p)
3550 return t;
3551 if (!lval
3552 && TREE_CODE (ary) == VIEW_CONVERT_EXPR
3553 && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (ary, 0)))
3554 && TREE_TYPE (t) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (ary, 0))))
3555 ary = TREE_OPERAND (ary, 0);
3556
3557 tree oldidx = TREE_OPERAND (t, 1);
3558 tree index = eval_and_check_array_index (ctx, t, lval,
3559 non_constant_p, overflow_p);
3560 if (*non_constant_p)
3561 return t;
3562
3563 if (lval && ary == oldary && index == oldidx)
3564 return t;
3565 else if (lval)
3566 return build4 (ARRAY_REF, TREE_TYPE (t), ary, index, NULL, NULL);
3567
3568 unsigned len = 0, elem_nchars = 1;
3569 tree elem_type = TREE_TYPE (TREE_TYPE (ary));
3570 if (TREE_CODE (ary) == CONSTRUCTOR)
3571 len = CONSTRUCTOR_NELTS (ary);
3572 else if (TREE_CODE (ary) == STRING_CST)
3573 {
3574 elem_nchars = (TYPE_PRECISION (elem_type)
3575 / TYPE_PRECISION (char_type_node));
3576 len = (unsigned) TREE_STRING_LENGTH (ary) / elem_nchars;
3577 }
3578 else if (TREE_CODE (ary) == VECTOR_CST)
3579 /* We don't create variable-length VECTOR_CSTs. */
3580 len = VECTOR_CST_NELTS (ary).to_constant ();
3581 else
3582 {
3583 /* We can't do anything with other tree codes, so use
3584 VERIFY_CONSTANT to complain and fail. */
3585 VERIFY_CONSTANT (ary);
3586 gcc_unreachable ();
3587 }
3588
3589 bool found;
3590 HOST_WIDE_INT i = 0;
3591 if (TREE_CODE (ary) == CONSTRUCTOR)
3592 {
3593 HOST_WIDE_INT ix = find_array_ctor_elt (ary, index);
3594 found = (ix >= 0);
3595 if (found)
3596 i = ix;
3597 }
3598 else
3599 {
3600 i = tree_to_shwi (index);
3601 found = (i < len);
3602 }
3603
3604 if (found)
3605 {
3606 tree r;
3607 if (TREE_CODE (ary) == CONSTRUCTOR)
3608 r = (*CONSTRUCTOR_ELTS (ary))[i].value;
3609 else if (TREE_CODE (ary) == VECTOR_CST)
3610 r = VECTOR_CST_ELT (ary, i);
3611 else
3612 r = extract_string_elt (ary, elem_nchars, i);
3613
3614 if (r)
3615 /* Don't VERIFY_CONSTANT here. */
3616 return r;
3617
3618 /* Otherwise the element doesn't have a value yet. */
3619 }
3620
3621 /* Not found. */
3622
3623 if (TREE_CODE (ary) == CONSTRUCTOR
3624 && CONSTRUCTOR_NO_CLEARING (ary))
3625 {
3626 /* 'ary' is part of the aggregate initializer we're currently
3627 building; if there's no initializer for this element yet,
3628 that's an error. */
3629 if (!ctx->quiet)
3630 error ("accessing uninitialized array element");
3631 *non_constant_p = true;
3632 return t;
3633 }
3634
3635 /* If it's within the array bounds but doesn't have an explicit
3636 initializer, it's initialized from {}. But use build_value_init
3637 directly for non-aggregates to avoid creating a garbage CONSTRUCTOR. */
3638 tree val;
3639 constexpr_ctx new_ctx;
3640 if (is_really_empty_class (elem_type, /*ignore_vptr*/false))
3641 return build_constructor (elem_type, NULL);
3642 else if (CP_AGGREGATE_TYPE_P (elem_type))
3643 {
3644 tree empty_ctor = build_constructor (init_list_type_node, NULL);
3645 val = digest_init (elem_type, empty_ctor, tf_warning_or_error);
3646 new_ctx = *ctx;
3647 new_ctx.object = t;
3648 new_ctx.ctor = build_constructor (elem_type, NULL);
3649 ctx = &new_ctx;
3650 }
3651 else
3652 val = build_value_init (elem_type, tf_warning_or_error);
3653 t = cxx_eval_constant_expression (ctx, val, lval, non_constant_p,
3654 overflow_p);
3655 if (CP_AGGREGATE_TYPE_P (elem_type) && t != ctx->ctor)
3656 free_constructor (ctx->ctor);
3657 return t;
3658 }
3659
3660 /* Subroutine of cxx_eval_constant_expression.
3661 Attempt to reduce a field access of a value of class type. */
3662
3663 static tree
cxx_eval_component_reference(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)3664 cxx_eval_component_reference (const constexpr_ctx *ctx, tree t,
3665 bool lval,
3666 bool *non_constant_p, bool *overflow_p)
3667 {
3668 unsigned HOST_WIDE_INT i;
3669 tree field;
3670 tree value;
3671 tree part = TREE_OPERAND (t, 1);
3672 tree orig_whole = TREE_OPERAND (t, 0);
3673 tree whole = cxx_eval_constant_expression (ctx, orig_whole,
3674 lval,
3675 non_constant_p, overflow_p);
3676 if (INDIRECT_REF_P (whole)
3677 && integer_zerop (TREE_OPERAND (whole, 0)))
3678 {
3679 if (!ctx->quiet)
3680 error ("dereferencing a null pointer in %qE", orig_whole);
3681 *non_constant_p = true;
3682 return t;
3683 }
3684
3685 if (TREE_CODE (whole) == PTRMEM_CST)
3686 whole = cplus_expand_constant (whole);
3687 if (whole == orig_whole)
3688 return t;
3689 if (lval)
3690 return fold_build3 (COMPONENT_REF, TREE_TYPE (t),
3691 whole, part, NULL_TREE);
3692 /* Don't VERIFY_CONSTANT here; we only want to check that we got a
3693 CONSTRUCTOR. */
3694 if (!*non_constant_p && TREE_CODE (whole) != CONSTRUCTOR)
3695 {
3696 if (!ctx->quiet)
3697 error ("%qE is not a constant expression", orig_whole);
3698 *non_constant_p = true;
3699 }
3700 if (DECL_MUTABLE_P (part))
3701 {
3702 if (!ctx->quiet)
3703 error ("mutable %qD is not usable in a constant expression", part);
3704 *non_constant_p = true;
3705 }
3706 if (*non_constant_p)
3707 return t;
3708 bool pmf = TYPE_PTRMEMFUNC_P (TREE_TYPE (whole));
3709 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
3710 {
3711 /* Use name match for PMF fields, as a variant will have a
3712 different FIELD_DECL with a different type. */
3713 if (pmf ? DECL_NAME (field) == DECL_NAME (part)
3714 : field == part)
3715 {
3716 if (value)
3717 {
3718 STRIP_ANY_LOCATION_WRAPPER (value);
3719 return value;
3720 }
3721 else
3722 /* We're in the middle of initializing it. */
3723 break;
3724 }
3725 }
3726 if (TREE_CODE (TREE_TYPE (whole)) == UNION_TYPE
3727 && CONSTRUCTOR_NELTS (whole) > 0)
3728 {
3729 /* DR 1188 says we don't have to deal with this. */
3730 if (!ctx->quiet)
3731 {
3732 constructor_elt *cep = CONSTRUCTOR_ELT (whole, 0);
3733 if (cep->value == NULL_TREE)
3734 error ("accessing uninitialized member %qD", part);
3735 else
3736 error ("accessing %qD member instead of initialized %qD member in "
3737 "constant expression", part, cep->index);
3738 }
3739 *non_constant_p = true;
3740 return t;
3741 }
3742
3743 /* We only create a CONSTRUCTOR for a subobject when we modify it, so empty
3744 classes never get represented; throw together a value now. */
3745 if (is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
3746 return build_constructor (TREE_TYPE (t), NULL);
3747
3748 gcc_assert (DECL_CONTEXT (part) == TYPE_MAIN_VARIANT (TREE_TYPE (whole)));
3749
3750 if (CONSTRUCTOR_NO_CLEARING (whole))
3751 {
3752 /* 'whole' is part of the aggregate initializer we're currently
3753 building; if there's no initializer for this member yet, that's an
3754 error. */
3755 if (!ctx->quiet)
3756 error ("accessing uninitialized member %qD", part);
3757 *non_constant_p = true;
3758 return t;
3759 }
3760
3761 /* If there's no explicit init for this field, it's value-initialized. */
3762 value = build_value_init (TREE_TYPE (t), tf_warning_or_error);
3763 return cxx_eval_constant_expression (ctx, value,
3764 lval,
3765 non_constant_p, overflow_p);
3766 }
3767
3768 /* Subroutine of cxx_eval_constant_expression.
3769 Attempt to reduce a field access of a value of class type that is
3770 expressed as a BIT_FIELD_REF. */
3771
3772 static tree
cxx_eval_bit_field_ref(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)3773 cxx_eval_bit_field_ref (const constexpr_ctx *ctx, tree t,
3774 bool lval,
3775 bool *non_constant_p, bool *overflow_p)
3776 {
3777 tree orig_whole = TREE_OPERAND (t, 0);
3778 tree retval, fldval, utype, mask;
3779 bool fld_seen = false;
3780 HOST_WIDE_INT istart, isize;
3781 tree whole = cxx_eval_constant_expression (ctx, orig_whole,
3782 lval,
3783 non_constant_p, overflow_p);
3784 tree start, field, value;
3785 unsigned HOST_WIDE_INT i;
3786
3787 if (whole == orig_whole)
3788 return t;
3789 /* Don't VERIFY_CONSTANT here; we only want to check that we got a
3790 CONSTRUCTOR. */
3791 if (!*non_constant_p
3792 && TREE_CODE (whole) != VECTOR_CST
3793 && TREE_CODE (whole) != CONSTRUCTOR)
3794 {
3795 if (!ctx->quiet)
3796 error ("%qE is not a constant expression", orig_whole);
3797 *non_constant_p = true;
3798 }
3799 if (*non_constant_p)
3800 return t;
3801
3802 if (TREE_CODE (whole) == VECTOR_CST)
3803 return fold_ternary (BIT_FIELD_REF, TREE_TYPE (t), whole,
3804 TREE_OPERAND (t, 1), TREE_OPERAND (t, 2));
3805
3806 start = TREE_OPERAND (t, 2);
3807 istart = tree_to_shwi (start);
3808 isize = tree_to_shwi (TREE_OPERAND (t, 1));
3809 utype = TREE_TYPE (t);
3810 if (!TYPE_UNSIGNED (utype))
3811 utype = build_nonstandard_integer_type (TYPE_PRECISION (utype), 1);
3812 retval = build_int_cst (utype, 0);
3813 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (whole), i, field, value)
3814 {
3815 tree bitpos = bit_position (field);
3816 STRIP_ANY_LOCATION_WRAPPER (value);
3817 if (bitpos == start && DECL_SIZE (field) == TREE_OPERAND (t, 1))
3818 return value;
3819 if (TREE_CODE (TREE_TYPE (field)) == INTEGER_TYPE
3820 && TREE_CODE (value) == INTEGER_CST
3821 && tree_fits_shwi_p (bitpos)
3822 && tree_fits_shwi_p (DECL_SIZE (field)))
3823 {
3824 HOST_WIDE_INT bit = tree_to_shwi (bitpos);
3825 HOST_WIDE_INT sz = tree_to_shwi (DECL_SIZE (field));
3826 HOST_WIDE_INT shift;
3827 if (bit >= istart && bit + sz <= istart + isize)
3828 {
3829 fldval = fold_convert (utype, value);
3830 mask = build_int_cst_type (utype, -1);
3831 mask = fold_build2 (LSHIFT_EXPR, utype, mask,
3832 size_int (TYPE_PRECISION (utype) - sz));
3833 mask = fold_build2 (RSHIFT_EXPR, utype, mask,
3834 size_int (TYPE_PRECISION (utype) - sz));
3835 fldval = fold_build2 (BIT_AND_EXPR, utype, fldval, mask);
3836 shift = bit - istart;
3837 if (BYTES_BIG_ENDIAN)
3838 shift = TYPE_PRECISION (utype) - shift - sz;
3839 fldval = fold_build2 (LSHIFT_EXPR, utype, fldval,
3840 size_int (shift));
3841 retval = fold_build2 (BIT_IOR_EXPR, utype, retval, fldval);
3842 fld_seen = true;
3843 }
3844 }
3845 }
3846 if (fld_seen)
3847 return fold_convert (TREE_TYPE (t), retval);
3848 gcc_unreachable ();
3849 return error_mark_node;
3850 }
3851
3852 /* Subroutine of cxx_eval_constant_expression.
3853 Evaluate a short-circuited logical expression T in the context
3854 of a given constexpr CALL. BAILOUT_VALUE is the value for
3855 early return. CONTINUE_VALUE is used here purely for
3856 sanity check purposes. */
3857
3858 static tree
cxx_eval_logical_expression(const constexpr_ctx * ctx,tree t,tree bailout_value,tree continue_value,bool lval,bool * non_constant_p,bool * overflow_p)3859 cxx_eval_logical_expression (const constexpr_ctx *ctx, tree t,
3860 tree bailout_value, tree continue_value,
3861 bool lval,
3862 bool *non_constant_p, bool *overflow_p)
3863 {
3864 tree r;
3865 tree lhs = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
3866 lval,
3867 non_constant_p, overflow_p);
3868 VERIFY_CONSTANT (lhs);
3869 if (tree_int_cst_equal (lhs, bailout_value))
3870 return lhs;
3871 gcc_assert (tree_int_cst_equal (lhs, continue_value));
3872 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
3873 lval, non_constant_p,
3874 overflow_p);
3875 VERIFY_CONSTANT (r);
3876 return r;
3877 }
3878
3879 /* REF is a COMPONENT_REF designating a particular field. V is a vector of
3880 CONSTRUCTOR elements to initialize (part of) an object containing that
3881 field. Return a pointer to the constructor_elt corresponding to the
3882 initialization of the field. */
3883
3884 static constructor_elt *
base_field_constructor_elt(vec<constructor_elt,va_gc> * v,tree ref)3885 base_field_constructor_elt (vec<constructor_elt, va_gc> *v, tree ref)
3886 {
3887 tree aggr = TREE_OPERAND (ref, 0);
3888 tree field = TREE_OPERAND (ref, 1);
3889 HOST_WIDE_INT i;
3890 constructor_elt *ce;
3891
3892 gcc_assert (TREE_CODE (ref) == COMPONENT_REF);
3893
3894 if (TREE_CODE (aggr) == COMPONENT_REF)
3895 {
3896 constructor_elt *base_ce
3897 = base_field_constructor_elt (v, aggr);
3898 v = CONSTRUCTOR_ELTS (base_ce->value);
3899 }
3900
3901 for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
3902 if (ce->index == field)
3903 return ce;
3904
3905 gcc_unreachable ();
3906 return NULL;
3907 }
3908
3909 /* Some of the expressions fed to the constexpr mechanism are calls to
3910 constructors, which have type void. In that case, return the type being
3911 initialized by the constructor. */
3912
3913 static tree
initialized_type(tree t)3914 initialized_type (tree t)
3915 {
3916 if (TYPE_P (t))
3917 return t;
3918 tree type = TREE_TYPE (t);
3919 if (TREE_CODE (t) == CALL_EXPR)
3920 {
3921 /* A constructor call has void type, so we need to look deeper. */
3922 tree fn = get_function_named_in_call (t);
3923 if (fn && TREE_CODE (fn) == FUNCTION_DECL
3924 && DECL_CXX_CONSTRUCTOR_P (fn))
3925 type = DECL_CONTEXT (fn);
3926 }
3927 else if (TREE_CODE (t) == COMPOUND_EXPR)
3928 return initialized_type (TREE_OPERAND (t, 1));
3929 else if (TREE_CODE (t) == AGGR_INIT_EXPR)
3930 type = TREE_TYPE (AGGR_INIT_EXPR_SLOT (t));
3931 return cv_unqualified (type);
3932 }
3933
3934 /* We're about to initialize element INDEX of an array or class from VALUE.
3935 Set up NEW_CTX appropriately by adjusting .object to refer to the
3936 subobject and creating a new CONSTRUCTOR if the element is itself
3937 a class or array. */
3938
3939 static void
init_subob_ctx(const constexpr_ctx * ctx,constexpr_ctx & new_ctx,tree index,tree & value)3940 init_subob_ctx (const constexpr_ctx *ctx, constexpr_ctx &new_ctx,
3941 tree index, tree &value)
3942 {
3943 new_ctx = *ctx;
3944
3945 if (index && TREE_CODE (index) != INTEGER_CST
3946 && TREE_CODE (index) != FIELD_DECL
3947 && TREE_CODE (index) != RANGE_EXPR)
3948 /* This won't have an element in the new CONSTRUCTOR. */
3949 return;
3950
3951 tree type = initialized_type (value);
3952 if (!AGGREGATE_TYPE_P (type) && !VECTOR_TYPE_P (type))
3953 /* A non-aggregate member doesn't get its own CONSTRUCTOR. */
3954 return;
3955
3956 /* The sub-aggregate initializer might contain a placeholder;
3957 update object to refer to the subobject and ctor to refer to
3958 the (newly created) sub-initializer. */
3959 if (ctx->object)
3960 {
3961 if (index == NULL_TREE || TREE_CODE (index) == RANGE_EXPR)
3962 /* There's no well-defined subobject for this index. */
3963 new_ctx.object = NULL_TREE;
3964 else
3965 new_ctx.object = build_ctor_subob_ref (index, type, ctx->object);
3966 }
3967 tree elt = build_constructor (type, NULL);
3968 CONSTRUCTOR_NO_CLEARING (elt) = true;
3969 new_ctx.ctor = elt;
3970
3971 if (TREE_CODE (value) == TARGET_EXPR)
3972 /* Avoid creating another CONSTRUCTOR when we expand the TARGET_EXPR. */
3973 value = TARGET_EXPR_INITIAL (value);
3974 }
3975
3976 /* We're about to process an initializer for a class or array TYPE. Make
3977 sure that CTX is set up appropriately. */
3978
3979 static void
verify_ctor_sanity(const constexpr_ctx * ctx,tree type)3980 verify_ctor_sanity (const constexpr_ctx *ctx, tree type)
3981 {
3982 /* We don't bother building a ctor for an empty base subobject. */
3983 if (is_empty_class (type))
3984 return;
3985
3986 /* We're in the middle of an initializer that might involve placeholders;
3987 our caller should have created a CONSTRUCTOR for us to put the
3988 initializer into. We will either return that constructor or T. */
3989 gcc_assert (ctx->ctor);
3990 gcc_assert (same_type_ignoring_top_level_qualifiers_p
3991 (type, TREE_TYPE (ctx->ctor)));
3992 /* We used to check that ctx->ctor was empty, but that isn't the case when
3993 the object is zero-initialized before calling the constructor. */
3994 if (ctx->object)
3995 {
3996 tree otype = TREE_TYPE (ctx->object);
3997 gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, otype)
3998 /* Handle flexible array members. */
3999 || (TREE_CODE (otype) == ARRAY_TYPE
4000 && TYPE_DOMAIN (otype) == NULL_TREE
4001 && TREE_CODE (type) == ARRAY_TYPE
4002 && (same_type_ignoring_top_level_qualifiers_p
4003 (TREE_TYPE (type), TREE_TYPE (otype)))));
4004 }
4005 gcc_assert (!ctx->object || !DECL_P (ctx->object)
4006 || *(ctx->global->values.get (ctx->object)) == ctx->ctor);
4007 }
4008
4009 /* Subroutine of cxx_eval_constant_expression.
4010 The expression tree T denotes a C-style array or a C-style
4011 aggregate. Reduce it to a constant expression. */
4012
4013 static tree
cxx_eval_bare_aggregate(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)4014 cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t,
4015 bool lval,
4016 bool *non_constant_p, bool *overflow_p)
4017 {
4018 vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
4019 bool changed = false;
4020 gcc_assert (!BRACE_ENCLOSED_INITIALIZER_P (t));
4021 tree type = TREE_TYPE (t);
4022
4023 constexpr_ctx new_ctx;
4024 if (TYPE_PTRMEMFUNC_P (type) || VECTOR_TYPE_P (type))
4025 {
4026 /* We don't really need the ctx->ctor business for a PMF or
4027 vector, but it's simpler to use the same code. */
4028 new_ctx = *ctx;
4029 new_ctx.ctor = build_constructor (type, NULL);
4030 new_ctx.object = NULL_TREE;
4031 ctx = &new_ctx;
4032 };
4033 verify_ctor_sanity (ctx, type);
4034 vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
4035 vec_alloc (*p, vec_safe_length (v));
4036
4037 if (CONSTRUCTOR_PLACEHOLDER_BOUNDARY (t))
4038 CONSTRUCTOR_PLACEHOLDER_BOUNDARY (ctx->ctor) = 1;
4039
4040 unsigned i;
4041 tree index, value;
4042 bool constant_p = true;
4043 bool side_effects_p = false;
4044 FOR_EACH_CONSTRUCTOR_ELT (v, i, index, value)
4045 {
4046 tree orig_value = value;
4047 init_subob_ctx (ctx, new_ctx, index, value);
4048 int pos_hint = -1;
4049 if (new_ctx.ctor != ctx->ctor)
4050 {
4051 /* If we built a new CONSTRUCTOR, attach it now so that other
4052 initializers can refer to it. */
4053 constructor_elt *cep = get_or_insert_ctor_field (ctx->ctor, index);
4054 cep->value = new_ctx.ctor;
4055 pos_hint = cep - (*p)->begin();
4056 }
4057 else if (TREE_CODE (type) == UNION_TYPE)
4058 /* Otherwise if we're constructing a non-aggregate union member, set
4059 the active union member now so that we can later detect and diagnose
4060 if its initializer attempts to activate another member. */
4061 get_or_insert_ctor_field (ctx->ctor, index);
4062 tree elt = cxx_eval_constant_expression (&new_ctx, value,
4063 lval,
4064 non_constant_p, overflow_p);
4065 /* Don't VERIFY_CONSTANT here. */
4066 if (ctx->quiet && *non_constant_p)
4067 break;
4068 if (elt != orig_value)
4069 changed = true;
4070
4071 if (!TREE_CONSTANT (elt))
4072 constant_p = false;
4073 if (TREE_SIDE_EFFECTS (elt))
4074 side_effects_p = true;
4075 if (index && TREE_CODE (index) == COMPONENT_REF)
4076 {
4077 /* This is an initialization of a vfield inside a base
4078 subaggregate that we already initialized; push this
4079 initialization into the previous initialization. */
4080 constructor_elt *inner = base_field_constructor_elt (*p, index);
4081 inner->value = elt;
4082 changed = true;
4083 }
4084 else if (index
4085 && (TREE_CODE (index) == NOP_EXPR
4086 || TREE_CODE (index) == POINTER_PLUS_EXPR))
4087 {
4088 /* This is an initializer for an empty base; now that we've
4089 checked that it's constant, we can ignore it. */
4090 gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (index))));
4091 changed = true;
4092 }
4093 else
4094 {
4095 if (TREE_CODE (type) == UNION_TYPE
4096 && (*p)->last().index != index)
4097 /* The initializer erroneously changed the active union member that
4098 we're initializing. */
4099 gcc_assert (*non_constant_p);
4100 else
4101 {
4102 /* The initializer might have mutated the underlying CONSTRUCTOR,
4103 so recompute the location of the target constructer_elt. */
4104 constructor_elt *cep
4105 = get_or_insert_ctor_field (ctx->ctor, index, pos_hint);
4106 cep->value = elt;
4107 }
4108
4109 /* Adding or replacing an element might change the ctor's flags. */
4110 TREE_CONSTANT (ctx->ctor) = constant_p;
4111 TREE_SIDE_EFFECTS (ctx->ctor) = side_effects_p;
4112 }
4113 }
4114 if (*non_constant_p || !changed)
4115 return t;
4116 t = ctx->ctor;
4117 /* We're done building this CONSTRUCTOR, so now we can interpret an
4118 element without an explicit initializer as value-initialized. */
4119 CONSTRUCTOR_NO_CLEARING (t) = false;
4120 TREE_CONSTANT (t) = constant_p;
4121 TREE_SIDE_EFFECTS (t) = side_effects_p;
4122 if (VECTOR_TYPE_P (type))
4123 t = fold (t);
4124 return t;
4125 }
4126
4127 /* Subroutine of cxx_eval_constant_expression.
4128 The expression tree T is a VEC_INIT_EXPR which denotes the desired
4129 initialization of a non-static data member of array type. Reduce it to a
4130 CONSTRUCTOR.
4131
4132 Note that apart from value-initialization (when VALUE_INIT is true),
4133 this is only intended to support value-initialization and the
4134 initializations done by defaulted constructors for classes with
4135 non-static data members of array type. In this case, VEC_INIT_EXPR_INIT
4136 will either be NULL_TREE for the default constructor, or a COMPONENT_REF
4137 for the copy/move constructor. */
4138
4139 static tree
cxx_eval_vec_init_1(const constexpr_ctx * ctx,tree atype,tree init,bool value_init,bool lval,bool * non_constant_p,bool * overflow_p)4140 cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
4141 bool value_init, bool lval,
4142 bool *non_constant_p, bool *overflow_p)
4143 {
4144 tree elttype = TREE_TYPE (atype);
4145 verify_ctor_sanity (ctx, atype);
4146 vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
4147 bool pre_init = false;
4148 unsigned HOST_WIDE_INT i;
4149 tsubst_flags_t complain = ctx->quiet ? tf_none : tf_warning_or_error;
4150
4151 if (init && TREE_CODE (init) == CONSTRUCTOR)
4152 return cxx_eval_bare_aggregate (ctx, init, lval,
4153 non_constant_p, overflow_p);
4154
4155 /* For the default constructor, build up a call to the default
4156 constructor of the element type. We only need to handle class types
4157 here, as for a constructor to be constexpr, all members must be
4158 initialized, which for a defaulted default constructor means they must
4159 be of a class type with a constexpr default constructor. */
4160 if (TREE_CODE (elttype) == ARRAY_TYPE)
4161 /* We only do this at the lowest level. */;
4162 else if (value_init)
4163 {
4164 init = build_value_init (elttype, complain);
4165 pre_init = true;
4166 }
4167 else if (!init)
4168 {
4169 releasing_vec argvec;
4170 init = build_special_member_call (NULL_TREE, complete_ctor_identifier,
4171 &argvec, elttype, LOOKUP_NORMAL,
4172 complain);
4173 init = build_aggr_init_expr (elttype, init);
4174 pre_init = true;
4175 }
4176
4177 bool zeroed_out = false;
4178 if (!CONSTRUCTOR_NO_CLEARING (ctx->ctor))
4179 {
4180 /* We're initializing an array object that had been zero-initialized
4181 earlier. Truncate ctx->ctor, and propagate its zeroed state by
4182 clearing CONSTRUCTOR_NO_CLEARING on each of the aggregate element
4183 initializers we append to it. */
4184 gcc_checking_assert (initializer_zerop (ctx->ctor));
4185 zeroed_out = true;
4186 vec_safe_truncate (*p, 0);
4187 }
4188
4189 tree nelts = get_array_or_vector_nelts (ctx, atype, non_constant_p,
4190 overflow_p);
4191 unsigned HOST_WIDE_INT max = tree_to_uhwi (nelts);
4192 for (i = 0; i < max; ++i)
4193 {
4194 tree idx = build_int_cst (size_type_node, i);
4195 tree eltinit;
4196 bool reuse = false;
4197 constexpr_ctx new_ctx;
4198 init_subob_ctx (ctx, new_ctx, idx, pre_init ? init : elttype);
4199 if (new_ctx.ctor != ctx->ctor)
4200 {
4201 if (zeroed_out)
4202 CONSTRUCTOR_NO_CLEARING (new_ctx.ctor) = false;
4203 CONSTRUCTOR_APPEND_ELT (*p, idx, new_ctx.ctor);
4204 }
4205 if (TREE_CODE (elttype) == ARRAY_TYPE)
4206 {
4207 /* A multidimensional array; recurse. */
4208 if (value_init || init == NULL_TREE)
4209 {
4210 eltinit = NULL_TREE;
4211 reuse = i == 0;
4212 }
4213 else
4214 eltinit = cp_build_array_ref (input_location, init, idx, complain);
4215 eltinit = cxx_eval_vec_init_1 (&new_ctx, elttype, eltinit, value_init,
4216 lval,
4217 non_constant_p, overflow_p);
4218 }
4219 else if (pre_init)
4220 {
4221 /* Initializing an element using value or default initialization
4222 we just pre-built above. */
4223 if (init == void_node)
4224 /* Trivial default-init, don't do anything to the CONSTRUCTOR. */
4225 return ctx->ctor;
4226 eltinit = cxx_eval_constant_expression (&new_ctx, init, lval,
4227 non_constant_p, overflow_p);
4228 reuse = i == 0;
4229 }
4230 else
4231 {
4232 /* Copying an element. */
4233 gcc_assert (same_type_ignoring_top_level_qualifiers_p
4234 (atype, TREE_TYPE (init)));
4235 eltinit = cp_build_array_ref (input_location, init, idx, complain);
4236 if (!lvalue_p (init))
4237 eltinit = move (eltinit);
4238 eltinit = force_rvalue (eltinit, complain);
4239 eltinit = cxx_eval_constant_expression (&new_ctx, eltinit, lval,
4240 non_constant_p, overflow_p);
4241 }
4242 if (*non_constant_p)
4243 break;
4244 if (new_ctx.ctor != ctx->ctor)
4245 {
4246 /* We appended this element above; update the value. */
4247 gcc_assert ((*p)->last().index == idx);
4248 (*p)->last().value = eltinit;
4249 }
4250 else
4251 CONSTRUCTOR_APPEND_ELT (*p, idx, eltinit);
4252 /* Reuse the result of cxx_eval_constant_expression call
4253 from the first iteration to all others if it is a constant
4254 initializer that doesn't require relocations. */
4255 if (reuse
4256 && max > 1
4257 && (eltinit == NULL_TREE
4258 || (initializer_constant_valid_p (eltinit, TREE_TYPE (eltinit))
4259 == null_pointer_node)))
4260 {
4261 if (new_ctx.ctor != ctx->ctor)
4262 eltinit = new_ctx.ctor;
4263 tree range = build2 (RANGE_EXPR, size_type_node,
4264 build_int_cst (size_type_node, 1),
4265 build_int_cst (size_type_node, max - 1));
4266 CONSTRUCTOR_APPEND_ELT (*p, range, unshare_constructor (eltinit));
4267 break;
4268 }
4269 else if (i == 0)
4270 vec_safe_reserve (*p, max);
4271 }
4272
4273 if (!*non_constant_p)
4274 {
4275 init = ctx->ctor;
4276 CONSTRUCTOR_NO_CLEARING (init) = false;
4277 }
4278 return init;
4279 }
4280
4281 static tree
cxx_eval_vec_init(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)4282 cxx_eval_vec_init (const constexpr_ctx *ctx, tree t,
4283 bool lval,
4284 bool *non_constant_p, bool *overflow_p)
4285 {
4286 tree atype = TREE_TYPE (t);
4287 tree init = VEC_INIT_EXPR_INIT (t);
4288 tree r = cxx_eval_vec_init_1 (ctx, atype, init,
4289 VEC_INIT_EXPR_VALUE_INIT (t),
4290 lval, non_constant_p, overflow_p);
4291 if (*non_constant_p)
4292 return t;
4293 else
4294 return r;
4295 }
4296
4297 /* Like same_type_ignoring_top_level_qualifiers_p, but also handle the case
4298 where the desired type is an array of unknown bounds because the variable
4299 has had its bounds deduced since the wrapping expression was created. */
4300
4301 static bool
same_type_ignoring_tlq_and_bounds_p(tree type1,tree type2)4302 same_type_ignoring_tlq_and_bounds_p (tree type1, tree type2)
4303 {
4304 while (TREE_CODE (type1) == ARRAY_TYPE
4305 && TREE_CODE (type2) == ARRAY_TYPE
4306 && (!TYPE_DOMAIN (type1) || !TYPE_DOMAIN (type2)))
4307 {
4308 type1 = TREE_TYPE (type1);
4309 type2 = TREE_TYPE (type2);
4310 }
4311 return same_type_ignoring_top_level_qualifiers_p (type1, type2);
4312 }
4313
4314 /* Try to determine the currently active union member for an expression
4315 with UNION_TYPE. If it can be determined, return the FIELD_DECL,
4316 otherwise return NULL_TREE. */
4317
4318 static tree
cxx_union_active_member(const constexpr_ctx * ctx,tree t)4319 cxx_union_active_member (const constexpr_ctx *ctx, tree t)
4320 {
4321 constexpr_ctx new_ctx = *ctx;
4322 new_ctx.quiet = true;
4323 bool non_constant_p = false, overflow_p = false;
4324 tree ctor = cxx_eval_constant_expression (&new_ctx, t, false,
4325 &non_constant_p,
4326 &overflow_p);
4327 if (TREE_CODE (ctor) == CONSTRUCTOR
4328 && CONSTRUCTOR_NELTS (ctor) == 1
4329 && CONSTRUCTOR_ELT (ctor, 0)->index
4330 && TREE_CODE (CONSTRUCTOR_ELT (ctor, 0)->index) == FIELD_DECL)
4331 return CONSTRUCTOR_ELT (ctor, 0)->index;
4332 return NULL_TREE;
4333 }
4334
4335 /* Helper function for cxx_fold_indirect_ref_1, called recursively. */
4336
4337 static tree
cxx_fold_indirect_ref_1(const constexpr_ctx * ctx,location_t loc,tree type,tree op,unsigned HOST_WIDE_INT off,bool * empty_base)4338 cxx_fold_indirect_ref_1 (const constexpr_ctx *ctx, location_t loc, tree type,
4339 tree op, unsigned HOST_WIDE_INT off, bool *empty_base)
4340 {
4341 tree optype = TREE_TYPE (op);
4342 unsigned HOST_WIDE_INT const_nunits;
4343 if (off == 0)
4344 {
4345 if (similar_type_p (optype, type))
4346 return op;
4347 /* Also handle conversion to an empty base class, which
4348 is represented with a NOP_EXPR. */
4349 /* *(foo *)&complexfoo => __real__ complexfoo */
4350 else if (TREE_CODE (optype) == COMPLEX_TYPE
4351 && similar_type_p (type, TREE_TYPE (optype)))
4352 return build1_loc (loc, REALPART_EXPR, type, op);
4353 }
4354 /* ((foo*)&complexfoo)[1] => __imag__ complexfoo */
4355 else if (TREE_CODE (optype) == COMPLEX_TYPE
4356 && similar_type_p (type, TREE_TYPE (optype))
4357 && tree_to_uhwi (TYPE_SIZE_UNIT (type)) == off)
4358 return build1_loc (loc, IMAGPART_EXPR, type, op);
4359 if (is_empty_class (type)
4360 && CLASS_TYPE_P (optype)
4361 && DERIVED_FROM_P (type, optype))
4362 {
4363 *empty_base = true;
4364 return op;
4365 }
4366 /* ((foo*)&vectorfoo)[x] => BIT_FIELD_REF<vectorfoo,...> */
4367 else if (VECTOR_TYPE_P (optype)
4368 && similar_type_p (type, TREE_TYPE (optype))
4369 && TYPE_VECTOR_SUBPARTS (optype).is_constant (&const_nunits))
4370 {
4371 unsigned HOST_WIDE_INT part_width = tree_to_uhwi (TYPE_SIZE_UNIT (type));
4372 unsigned HOST_WIDE_INT max_offset = part_width * const_nunits;
4373 if (off < max_offset && off % part_width == 0)
4374 {
4375 tree index = bitsize_int (off * BITS_PER_UNIT);
4376 return build3_loc (loc, BIT_FIELD_REF, type, op,
4377 TYPE_SIZE (type), index);
4378 }
4379 }
4380 /* ((foo *)&fooarray)[x] => fooarray[x] */
4381 else if (TREE_CODE (optype) == ARRAY_TYPE
4382 && tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (optype)))
4383 && !integer_zerop (TYPE_SIZE_UNIT (TREE_TYPE (optype))))
4384 {
4385 tree type_domain = TYPE_DOMAIN (optype);
4386 tree min_val = size_zero_node;
4387 if (type_domain && TYPE_MIN_VALUE (type_domain))
4388 min_val = TYPE_MIN_VALUE (type_domain);
4389 unsigned HOST_WIDE_INT el_sz
4390 = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (optype)));
4391 unsigned HOST_WIDE_INT idx = off / el_sz;
4392 unsigned HOST_WIDE_INT rem = off % el_sz;
4393 if (tree_fits_uhwi_p (min_val))
4394 {
4395 tree index = size_int (idx + tree_to_uhwi (min_val));
4396 op = build4_loc (loc, ARRAY_REF, TREE_TYPE (optype), op, index,
4397 NULL_TREE, NULL_TREE);
4398 return cxx_fold_indirect_ref_1 (ctx, loc, type, op, rem,
4399 empty_base);
4400 }
4401 }
4402 /* ((foo *)&struct_with_foo_field)[x] => COMPONENT_REF */
4403 else if (TREE_CODE (optype) == RECORD_TYPE
4404 || TREE_CODE (optype) == UNION_TYPE)
4405 {
4406 if (TREE_CODE (optype) == UNION_TYPE)
4407 /* For unions prefer the currently active member. */
4408 if (tree field = cxx_union_active_member (ctx, op))
4409 {
4410 unsigned HOST_WIDE_INT el_sz
4411 = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (field)));
4412 if (off < el_sz)
4413 {
4414 tree cop = build3 (COMPONENT_REF, TREE_TYPE (field),
4415 op, field, NULL_TREE);
4416 if (tree ret = cxx_fold_indirect_ref_1 (ctx, loc, type, cop,
4417 off, empty_base))
4418 return ret;
4419 }
4420 }
4421 for (tree field = TYPE_FIELDS (optype);
4422 field; field = DECL_CHAIN (field))
4423 if (TREE_CODE (field) == FIELD_DECL
4424 && TREE_TYPE (field) != error_mark_node
4425 && tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (field))))
4426 {
4427 tree pos = byte_position (field);
4428 if (!tree_fits_uhwi_p (pos))
4429 continue;
4430 unsigned HOST_WIDE_INT upos = tree_to_uhwi (pos);
4431 unsigned HOST_WIDE_INT el_sz
4432 = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (field)));
4433 if (upos <= off && off < upos + el_sz)
4434 {
4435 tree cop = build3 (COMPONENT_REF, TREE_TYPE (field),
4436 op, field, NULL_TREE);
4437 if (tree ret = cxx_fold_indirect_ref_1 (ctx, loc, type, cop,
4438 off - upos,
4439 empty_base))
4440 return ret;
4441 }
4442 }
4443 }
4444
4445 return NULL_TREE;
4446 }
4447
4448 /* A less strict version of fold_indirect_ref_1, which requires cv-quals to
4449 match. We want to be less strict for simple *& folding; if we have a
4450 non-const temporary that we access through a const pointer, that should
4451 work. We handle this here rather than change fold_indirect_ref_1
4452 because we're dealing with things like ADDR_EXPR of INTEGER_CST which
4453 don't really make sense outside of constant expression evaluation. Also
4454 we want to allow folding to COMPONENT_REF, which could cause trouble
4455 with TBAA in fold_indirect_ref_1. */
4456
4457 static tree
cxx_fold_indirect_ref(const constexpr_ctx * ctx,location_t loc,tree type,tree op0,bool * empty_base)4458 cxx_fold_indirect_ref (const constexpr_ctx *ctx, location_t loc, tree type,
4459 tree op0, bool *empty_base)
4460 {
4461 tree sub = op0;
4462 tree subtype;
4463 poly_uint64 const_op01;
4464
4465 /* STRIP_NOPS, but stop if REINTERPRET_CAST_P. */
4466 while (CONVERT_EXPR_P (sub) || TREE_CODE (sub) == NON_LVALUE_EXPR
4467 || TREE_CODE (sub) == VIEW_CONVERT_EXPR)
4468 {
4469 if (TREE_CODE (sub) == NOP_EXPR
4470 && REINTERPRET_CAST_P (sub))
4471 return NULL_TREE;
4472 sub = TREE_OPERAND (sub, 0);
4473 }
4474
4475 subtype = TREE_TYPE (sub);
4476 if (!INDIRECT_TYPE_P (subtype))
4477 return NULL_TREE;
4478
4479 if (TREE_CODE (sub) == ADDR_EXPR)
4480 {
4481 tree op = TREE_OPERAND (sub, 0);
4482 tree optype = TREE_TYPE (op);
4483
4484 /* *&CONST_DECL -> to the value of the const decl. */
4485 if (TREE_CODE (op) == CONST_DECL)
4486 return DECL_INITIAL (op);
4487 /* *&p => p; make sure to handle *&"str"[cst] here. */
4488 if (similar_type_p (optype, type))
4489 {
4490 tree fop = fold_read_from_constant_string (op);
4491 if (fop)
4492 return fop;
4493 else
4494 return op;
4495 }
4496 else
4497 return cxx_fold_indirect_ref_1 (ctx, loc, type, op, 0, empty_base);
4498 }
4499 else if (TREE_CODE (sub) == POINTER_PLUS_EXPR
4500 && tree_fits_uhwi_p (TREE_OPERAND (sub, 1)))
4501 {
4502 tree op00 = TREE_OPERAND (sub, 0);
4503 tree op01 = TREE_OPERAND (sub, 1);
4504
4505 STRIP_NOPS (op00);
4506 if (TREE_CODE (op00) == ADDR_EXPR)
4507 return cxx_fold_indirect_ref_1 (ctx, loc, type, TREE_OPERAND (op00, 0),
4508 tree_to_uhwi (op01), empty_base);
4509 }
4510 /* *(foo *)fooarrptr => (*fooarrptr)[0] */
4511 else if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
4512 && similar_type_p (type, TREE_TYPE (TREE_TYPE (subtype))))
4513 {
4514 tree type_domain;
4515 tree min_val = size_zero_node;
4516 tree newsub
4517 = cxx_fold_indirect_ref (ctx, loc, TREE_TYPE (subtype), sub, NULL);
4518 if (newsub)
4519 sub = newsub;
4520 else
4521 sub = build1_loc (loc, INDIRECT_REF, TREE_TYPE (subtype), sub);
4522 type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
4523 if (type_domain && TYPE_MIN_VALUE (type_domain))
4524 min_val = TYPE_MIN_VALUE (type_domain);
4525 return build4_loc (loc, ARRAY_REF, type, sub, min_val, NULL_TREE,
4526 NULL_TREE);
4527 }
4528
4529 return NULL_TREE;
4530 }
4531
4532 static tree
cxx_eval_indirect_ref(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)4533 cxx_eval_indirect_ref (const constexpr_ctx *ctx, tree t,
4534 bool lval,
4535 bool *non_constant_p, bool *overflow_p)
4536 {
4537 tree orig_op0 = TREE_OPERAND (t, 0);
4538 bool empty_base = false;
4539
4540 /* We can handle a MEM_REF like an INDIRECT_REF, if MEM_REF's second
4541 operand is an integer-zero. Otherwise reject the MEM_REF for now. */
4542
4543 if (TREE_CODE (t) == MEM_REF
4544 && (!TREE_OPERAND (t, 1) || !integer_zerop (TREE_OPERAND (t, 1))))
4545 {
4546 gcc_assert (ctx->quiet);
4547 *non_constant_p = true;
4548 return t;
4549 }
4550
4551 /* First try to simplify it directly. */
4552 tree r = cxx_fold_indirect_ref (ctx, EXPR_LOCATION (t), TREE_TYPE (t),
4553 orig_op0, &empty_base);
4554 if (!r)
4555 {
4556 /* If that didn't work, evaluate the operand first. */
4557 tree op0 = cxx_eval_constant_expression (ctx, orig_op0,
4558 /*lval*/false, non_constant_p,
4559 overflow_p);
4560 /* Don't VERIFY_CONSTANT here. */
4561 if (*non_constant_p)
4562 return t;
4563
4564 if (!lval && integer_zerop (op0))
4565 {
4566 if (!ctx->quiet)
4567 error ("dereferencing a null pointer");
4568 *non_constant_p = true;
4569 return t;
4570 }
4571
4572 r = cxx_fold_indirect_ref (ctx, EXPR_LOCATION (t), TREE_TYPE (t), op0,
4573 &empty_base);
4574 if (r == NULL_TREE)
4575 {
4576 /* We couldn't fold to a constant value. Make sure it's not
4577 something we should have been able to fold. */
4578 tree sub = op0;
4579 STRIP_NOPS (sub);
4580 if (TREE_CODE (sub) == ADDR_EXPR)
4581 {
4582 gcc_assert (!similar_type_p
4583 (TREE_TYPE (TREE_TYPE (sub)), TREE_TYPE (t)));
4584 /* DR 1188 says we don't have to deal with this. */
4585 if (!ctx->quiet)
4586 error_at (cp_expr_loc_or_input_loc (t),
4587 "accessing value of %qE through a %qT glvalue in a "
4588 "constant expression", build_fold_indirect_ref (sub),
4589 TREE_TYPE (t));
4590 *non_constant_p = true;
4591 return t;
4592 }
4593
4594 if (lval && op0 != orig_op0)
4595 return build1 (INDIRECT_REF, TREE_TYPE (t), op0);
4596 if (!lval)
4597 VERIFY_CONSTANT (t);
4598 return t;
4599 }
4600 }
4601
4602 r = cxx_eval_constant_expression (ctx, r,
4603 lval, non_constant_p, overflow_p);
4604 if (*non_constant_p)
4605 return t;
4606
4607 /* If we're pulling out the value of an empty base, just return an empty
4608 CONSTRUCTOR. */
4609 if (empty_base && !lval)
4610 {
4611 r = build_constructor (TREE_TYPE (t), NULL);
4612 TREE_CONSTANT (r) = true;
4613 }
4614
4615 return r;
4616 }
4617
4618 /* Complain about R, a VAR_DECL, not being usable in a constant expression.
4619 Shared between potential_constant_expression and
4620 cxx_eval_constant_expression. */
4621
4622 static void
non_const_var_error(location_t loc,tree r)4623 non_const_var_error (location_t loc, tree r)
4624 {
4625 auto_diagnostic_group d;
4626 tree type = TREE_TYPE (r);
4627 if (DECL_NAME (r) == heap_uninit_identifier
4628 || DECL_NAME (r) == heap_identifier)
4629 {
4630 error_at (loc, "the content of uninitialized storage is not usable "
4631 "in a constant expression");
4632 inform (DECL_SOURCE_LOCATION (r), "allocated here");
4633 return;
4634 }
4635 if (DECL_NAME (r) == heap_deleted_identifier)
4636 {
4637 error_at (loc, "use of allocated storage after deallocation in a "
4638 "constant expression");
4639 inform (DECL_SOURCE_LOCATION (r), "allocated here");
4640 return;
4641 }
4642 error_at (loc, "the value of %qD is not usable in a constant "
4643 "expression", r);
4644 /* Avoid error cascade. */
4645 if (DECL_INITIAL (r) == error_mark_node)
4646 return;
4647 if (DECL_DECLARED_CONSTEXPR_P (r))
4648 inform (DECL_SOURCE_LOCATION (r),
4649 "%qD used in its own initializer", r);
4650 else if (INTEGRAL_OR_ENUMERATION_TYPE_P (type))
4651 {
4652 if (!CP_TYPE_CONST_P (type))
4653 inform (DECL_SOURCE_LOCATION (r),
4654 "%q#D is not const", r);
4655 else if (CP_TYPE_VOLATILE_P (type))
4656 inform (DECL_SOURCE_LOCATION (r),
4657 "%q#D is volatile", r);
4658 else if (!DECL_INITIAL (r)
4659 || !TREE_CONSTANT (DECL_INITIAL (r))
4660 || !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (r))
4661 inform (DECL_SOURCE_LOCATION (r),
4662 "%qD was not initialized with a constant "
4663 "expression", r);
4664 else
4665 gcc_unreachable ();
4666 }
4667 else if (TYPE_REF_P (type))
4668 inform (DECL_SOURCE_LOCATION (r),
4669 "%qD was not initialized with a constant "
4670 "expression", r);
4671 else
4672 {
4673 if (cxx_dialect >= cxx11 && !DECL_DECLARED_CONSTEXPR_P (r))
4674 inform (DECL_SOURCE_LOCATION (r),
4675 "%qD was not declared %<constexpr%>", r);
4676 else
4677 inform (DECL_SOURCE_LOCATION (r),
4678 "%qD does not have integral or enumeration type",
4679 r);
4680 }
4681 }
4682
4683 /* Subroutine of cxx_eval_constant_expression.
4684 Like cxx_eval_unary_expression, except for trinary expressions. */
4685
4686 static tree
cxx_eval_trinary_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)4687 cxx_eval_trinary_expression (const constexpr_ctx *ctx, tree t,
4688 bool lval,
4689 bool *non_constant_p, bool *overflow_p)
4690 {
4691 int i;
4692 tree args[3];
4693 tree val;
4694
4695 for (i = 0; i < 3; i++)
4696 {
4697 args[i] = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, i),
4698 lval,
4699 non_constant_p, overflow_p);
4700 VERIFY_CONSTANT (args[i]);
4701 }
4702
4703 val = fold_ternary_loc (EXPR_LOCATION (t), TREE_CODE (t), TREE_TYPE (t),
4704 args[0], args[1], args[2]);
4705 if (val == NULL_TREE)
4706 return t;
4707 VERIFY_CONSTANT (val);
4708 return val;
4709 }
4710
4711 /* True if T was declared in a function declared to be constexpr, and
4712 therefore potentially constant in C++14. */
4713
4714 bool
var_in_constexpr_fn(tree t)4715 var_in_constexpr_fn (tree t)
4716 {
4717 tree ctx = DECL_CONTEXT (t);
4718 return (ctx && TREE_CODE (ctx) == FUNCTION_DECL
4719 && DECL_DECLARED_CONSTEXPR_P (ctx));
4720 }
4721
4722 /* True if T was declared in a function that might be constexpr: either a
4723 function that was declared constexpr, or a C++17 lambda op(). */
4724
4725 bool
var_in_maybe_constexpr_fn(tree t)4726 var_in_maybe_constexpr_fn (tree t)
4727 {
4728 if (cxx_dialect >= cxx17
4729 && DECL_FUNCTION_SCOPE_P (t)
4730 && LAMBDA_FUNCTION_P (DECL_CONTEXT (t)))
4731 return true;
4732 return var_in_constexpr_fn (t);
4733 }
4734
4735 /* We're assigning INIT to TARGET. In do_build_copy_constructor and
4736 build_over_call we implement trivial copy of a class with tail padding using
4737 assignment of character arrays, which is valid in normal code, but not in
4738 constexpr evaluation. We don't need to worry about clobbering tail padding
4739 in constexpr evaluation, so strip the type punning. */
4740
4741 static void
maybe_simplify_trivial_copy(tree & target,tree & init)4742 maybe_simplify_trivial_copy (tree &target, tree &init)
4743 {
4744 if (TREE_CODE (target) == MEM_REF
4745 && TREE_CODE (init) == MEM_REF
4746 && TREE_TYPE (target) == TREE_TYPE (init)
4747 && TREE_CODE (TREE_TYPE (target)) == ARRAY_TYPE
4748 && TREE_TYPE (TREE_TYPE (target)) == unsigned_char_type_node)
4749 {
4750 target = build_fold_indirect_ref (TREE_OPERAND (target, 0));
4751 init = build_fold_indirect_ref (TREE_OPERAND (init, 0));
4752 }
4753 }
4754
4755 /* Returns true if REF, which is a COMPONENT_REF, has any fields
4756 of constant type. This does not check for 'mutable', so the
4757 caller is expected to be mindful of that. */
4758
4759 static bool
cref_has_const_field(tree ref)4760 cref_has_const_field (tree ref)
4761 {
4762 while (TREE_CODE (ref) == COMPONENT_REF)
4763 {
4764 if (CP_TYPE_CONST_P (TREE_TYPE (TREE_OPERAND (ref, 1))))
4765 return true;
4766 ref = TREE_OPERAND (ref, 0);
4767 }
4768 return false;
4769 }
4770
4771 /* Return true if we are modifying something that is const during constant
4772 expression evaluation. CODE is the code of the statement, OBJ is the
4773 object in question, MUTABLE_P is true if one of the subobjects were
4774 declared mutable. */
4775
4776 static bool
modifying_const_object_p(tree_code code,tree obj,bool mutable_p)4777 modifying_const_object_p (tree_code code, tree obj, bool mutable_p)
4778 {
4779 /* If this is initialization, there's no problem. */
4780 if (code != MODIFY_EXPR)
4781 return false;
4782
4783 /* [basic.type.qualifier] "A const object is an object of type
4784 const T or a non-mutable subobject of a const object." */
4785 if (mutable_p)
4786 return false;
4787
4788 if (TREE_READONLY (obj))
4789 return true;
4790
4791 if (CP_TYPE_CONST_P (TREE_TYPE (obj)))
4792 {
4793 /* Although a COMPONENT_REF may have a const type, we should
4794 only consider it modifying a const object when any of the
4795 field components is const. This can happen when using
4796 constructs such as const_cast<const T &>(m), making something
4797 const even though it wasn't declared const. */
4798 if (TREE_CODE (obj) == COMPONENT_REF)
4799 return cref_has_const_field (obj);
4800 else
4801 return true;
4802 }
4803
4804 return false;
4805 }
4806
4807 /* Evaluate an INIT_EXPR or MODIFY_EXPR. */
4808
4809 static tree
cxx_eval_store_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)4810 cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
4811 bool lval,
4812 bool *non_constant_p, bool *overflow_p)
4813 {
4814 constexpr_ctx new_ctx = *ctx;
4815
4816 tree init = TREE_OPERAND (t, 1);
4817 if (TREE_CLOBBER_P (init))
4818 /* Just ignore clobbers. */
4819 return void_node;
4820
4821 /* First we figure out where we're storing to. */
4822 tree target = TREE_OPERAND (t, 0);
4823
4824 maybe_simplify_trivial_copy (target, init);
4825
4826 tree type = TREE_TYPE (target);
4827 bool preeval = SCALAR_TYPE_P (type) || TREE_CODE (t) == MODIFY_EXPR;
4828 if (preeval)
4829 {
4830 /* Evaluate the value to be stored without knowing what object it will be
4831 stored in, so that any side-effects happen first. */
4832 if (!SCALAR_TYPE_P (type))
4833 new_ctx.ctor = new_ctx.object = NULL_TREE;
4834 init = cxx_eval_constant_expression (&new_ctx, init, false,
4835 non_constant_p, overflow_p);
4836 if (*non_constant_p)
4837 return t;
4838 }
4839
4840 bool evaluated = false;
4841 if (lval)
4842 {
4843 /* If we want to return a reference to the target, we need to evaluate it
4844 as a whole; otherwise, only evaluate the innermost piece to avoid
4845 building up unnecessary *_REFs. */
4846 target = cxx_eval_constant_expression (ctx, target, true,
4847 non_constant_p, overflow_p);
4848 evaluated = true;
4849 if (*non_constant_p)
4850 return t;
4851 }
4852
4853 /* Find the underlying variable. */
4854 releasing_vec refs;
4855 tree object = NULL_TREE;
4856 /* If we're modifying a const object, save it. */
4857 tree const_object_being_modified = NULL_TREE;
4858 bool mutable_p = false;
4859 for (tree probe = target; object == NULL_TREE; )
4860 {
4861 switch (TREE_CODE (probe))
4862 {
4863 case BIT_FIELD_REF:
4864 case COMPONENT_REF:
4865 case ARRAY_REF:
4866 {
4867 tree ob = TREE_OPERAND (probe, 0);
4868 tree elt = TREE_OPERAND (probe, 1);
4869 if (TREE_CODE (elt) == FIELD_DECL && DECL_MUTABLE_P (elt))
4870 mutable_p = true;
4871 if (TREE_CODE (probe) == ARRAY_REF)
4872 {
4873 elt = eval_and_check_array_index (ctx, probe, false,
4874 non_constant_p, overflow_p);
4875 if (*non_constant_p)
4876 return t;
4877 }
4878 /* We don't check modifying_const_object_p for ARRAY_REFs. Given
4879 "int a[10]", an ARRAY_REF "a[2]" can be "const int", even though
4880 the array isn't const. Instead, check "a" in the next iteration;
4881 that will detect modifying "const int a[10]". */
4882 else if (evaluated
4883 && modifying_const_object_p (TREE_CODE (t), probe,
4884 mutable_p)
4885 && const_object_being_modified == NULL_TREE)
4886 const_object_being_modified = probe;
4887 vec_safe_push (refs, elt);
4888 vec_safe_push (refs, TREE_TYPE (probe));
4889 probe = ob;
4890 }
4891 break;
4892
4893 default:
4894 if (evaluated)
4895 object = probe;
4896 else
4897 {
4898 probe = cxx_eval_constant_expression (ctx, probe, true,
4899 non_constant_p, overflow_p);
4900 evaluated = true;
4901 if (*non_constant_p)
4902 return t;
4903 }
4904 break;
4905 }
4906 }
4907
4908 if (modifying_const_object_p (TREE_CODE (t), object, mutable_p)
4909 && const_object_being_modified == NULL_TREE)
4910 const_object_being_modified = object;
4911
4912 /* And then find/build up our initializer for the path to the subobject
4913 we're initializing. */
4914 tree *valp;
4915 if (DECL_P (object))
4916 valp = ctx->global->values.get (object);
4917 else
4918 valp = NULL;
4919 if (!valp)
4920 {
4921 /* A constant-expression cannot modify objects from outside the
4922 constant-expression. */
4923 if (!ctx->quiet)
4924 error ("modification of %qE is not a constant expression", object);
4925 *non_constant_p = true;
4926 return t;
4927 }
4928 type = TREE_TYPE (object);
4929 bool no_zero_init = true;
4930
4931 releasing_vec ctors, indexes;
4932 auto_vec<int> index_pos_hints;
4933 bool activated_union_member_p = false;
4934 while (!refs->is_empty ())
4935 {
4936 if (*valp == NULL_TREE)
4937 {
4938 *valp = build_constructor (type, NULL);
4939 CONSTRUCTOR_NO_CLEARING (*valp) = no_zero_init;
4940 }
4941 else if (TREE_CODE (*valp) == STRING_CST)
4942 {
4943 /* An array was initialized with a string constant, and now
4944 we're writing into one of its elements. Explode the
4945 single initialization into a set of element
4946 initializations. */
4947 gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
4948
4949 tree string = *valp;
4950 tree elt_type = TREE_TYPE (type);
4951 unsigned chars_per_elt = (TYPE_PRECISION (elt_type)
4952 / TYPE_PRECISION (char_type_node));
4953 unsigned num_elts = TREE_STRING_LENGTH (string) / chars_per_elt;
4954 tree ary_ctor = build_constructor (type, NULL);
4955
4956 vec_safe_reserve (CONSTRUCTOR_ELTS (ary_ctor), num_elts);
4957 for (unsigned ix = 0; ix != num_elts; ix++)
4958 {
4959 constructor_elt elt =
4960 {
4961 build_int_cst (size_type_node, ix),
4962 extract_string_elt (string, chars_per_elt, ix)
4963 };
4964 CONSTRUCTOR_ELTS (ary_ctor)->quick_push (elt);
4965 }
4966
4967 *valp = ary_ctor;
4968 }
4969
4970 /* If the value of object is already zero-initialized, any new ctors for
4971 subobjects will also be zero-initialized. */
4972 no_zero_init = CONSTRUCTOR_NO_CLEARING (*valp);
4973
4974 enum tree_code code = TREE_CODE (type);
4975 type = refs->pop();
4976 tree index = refs->pop();
4977
4978 if (TREE_CODE (index) == FIELD_DECL
4979 && !(same_type_ignoring_top_level_qualifiers_p
4980 (DECL_CONTEXT (index), TREE_TYPE (*valp))))
4981 {
4982 /* INDEX isn't a member of *valp. This can happen if it's a member
4983 of an empty base which isn't represented with a FIELD_DECL. Stop
4984 trying to build a CONSTRUCTOR for the inner target; we'll notice
4985 this disconnect again below and just return init. */
4986 gcc_assert (is_empty_class (DECL_CONTEXT (index)));
4987 break;
4988 }
4989
4990 if (code == UNION_TYPE && CONSTRUCTOR_NELTS (*valp)
4991 && CONSTRUCTOR_ELT (*valp, 0)->index != index)
4992 {
4993 if (cxx_dialect < cxx2a)
4994 {
4995 if (!ctx->quiet)
4996 error_at (cp_expr_loc_or_input_loc (t),
4997 "change of the active member of a union "
4998 "from %qD to %qD",
4999 CONSTRUCTOR_ELT (*valp, 0)->index,
5000 index);
5001 *non_constant_p = true;
5002 }
5003 else if (TREE_CODE (t) == MODIFY_EXPR
5004 && CONSTRUCTOR_NO_CLEARING (*valp))
5005 {
5006 /* Diagnose changing the active union member while the union
5007 is in the process of being initialized. */
5008 if (!ctx->quiet)
5009 error_at (cp_expr_loc_or_input_loc (t),
5010 "change of the active member of a union "
5011 "from %qD to %qD during initialization",
5012 CONSTRUCTOR_ELT (*valp, 0)->index,
5013 index);
5014 *non_constant_p = true;
5015 }
5016 no_zero_init = true;
5017 }
5018
5019 vec_safe_push (ctors, *valp);
5020 vec_safe_push (indexes, index);
5021
5022 constructor_elt *cep
5023 = get_or_insert_ctor_field (*valp, index);
5024 index_pos_hints.safe_push (cep - CONSTRUCTOR_ELTS (*valp)->begin());
5025
5026 if (code == UNION_TYPE)
5027 activated_union_member_p = true;
5028
5029 valp = &cep->value;
5030 }
5031
5032 /* Detect modifying a constant object in constexpr evaluation.
5033 We have found a const object that is being modified. Figure out
5034 if we need to issue an error. Consider
5035
5036 struct A {
5037 int n;
5038 constexpr A() : n(1) { n = 2; } // #1
5039 };
5040 struct B {
5041 const A a;
5042 constexpr B() { a.n = 3; } // #2
5043 };
5044 constexpr B b{};
5045
5046 #1 is OK, since we're modifying an object under construction, but
5047 #2 is wrong, since "a" is const and has been fully constructed.
5048 To track it, we use the TREE_READONLY bit in the object's CONSTRUCTOR
5049 which means that the object is read-only. For the example above, the
5050 *ctors stack at the point of #2 will look like:
5051
5052 ctors[0] = {.a={.n=2}} TREE_READONLY = 0
5053 ctors[1] = {.n=2} TREE_READONLY = 1
5054
5055 and we're modifying "b.a", so we search the stack and see if the
5056 constructor for "b.a" has already run. */
5057 if (const_object_being_modified)
5058 {
5059 bool fail = false;
5060 tree const_objtype
5061 = strip_array_types (TREE_TYPE (const_object_being_modified));
5062 if (!CLASS_TYPE_P (const_objtype))
5063 fail = true;
5064 else
5065 {
5066 /* [class.ctor]p5 "A constructor can be invoked for a const,
5067 volatile, or const volatile object. const and volatile
5068 semantics are not applied on an object under construction.
5069 They come into effect when the constructor for the most
5070 derived object ends." */
5071 tree elt;
5072 unsigned int i;
5073 FOR_EACH_VEC_ELT (*ctors, i, elt)
5074 if (same_type_ignoring_top_level_qualifiers_p
5075 (TREE_TYPE (const_object_being_modified), TREE_TYPE (elt)))
5076 {
5077 fail = TREE_READONLY (elt);
5078 break;
5079 }
5080 }
5081 if (fail)
5082 {
5083 if (!ctx->quiet)
5084 modifying_const_object_error (t, const_object_being_modified);
5085 *non_constant_p = true;
5086 return t;
5087 }
5088 }
5089
5090 if (!preeval)
5091 {
5092 /* Create a new CONSTRUCTOR in case evaluation of the initializer
5093 wants to modify it. */
5094 if (*valp == NULL_TREE)
5095 {
5096 *valp = build_constructor (type, NULL);
5097 CONSTRUCTOR_NO_CLEARING (*valp) = no_zero_init;
5098 }
5099 new_ctx.ctor = *valp;
5100 new_ctx.object = target;
5101 /* Avoid temporary materialization when initializing from a TARGET_EXPR.
5102 We don't need to mess with AGGR_EXPR_SLOT/VEC_INIT_EXPR_SLOT because
5103 expansion of those trees uses ctx instead. */
5104 if (TREE_CODE (init) == TARGET_EXPR)
5105 if (tree tinit = TARGET_EXPR_INITIAL (init))
5106 init = tinit;
5107 init = cxx_eval_constant_expression (&new_ctx, init, false,
5108 non_constant_p, overflow_p);
5109 /* The hash table might have moved since the get earlier, and the
5110 initializer might have mutated the underlying CONSTRUCTORs, so we must
5111 recompute VALP. */
5112 valp = ctx->global->values.get (object);
5113 for (unsigned i = 0; i < vec_safe_length (indexes); i++)
5114 {
5115 constructor_elt *cep
5116 = get_or_insert_ctor_field (*valp, indexes[i], index_pos_hints[i]);
5117 valp = &cep->value;
5118 }
5119 }
5120
5121 /* Don't share a CONSTRUCTOR that might be changed later. */
5122 init = unshare_constructor (init);
5123
5124 if (*valp && TREE_CODE (*valp) == CONSTRUCTOR
5125 && TREE_CODE (init) == CONSTRUCTOR)
5126 {
5127 /* An outer ctx->ctor might be pointing to *valp, so replace
5128 its contents. */
5129 if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init),
5130 TREE_TYPE (*valp)))
5131 {
5132 /* For initialization of an empty base, the original target will be
5133 *(base*)this, evaluation of which resolves to the object
5134 argument, which has the derived type rather than the base type. In
5135 this situation, just evaluate the initializer and return, since
5136 there's no actual data to store. */
5137 gcc_assert (is_empty_class (TREE_TYPE (init)) && !lval);
5138 return init;
5139 }
5140 CONSTRUCTOR_ELTS (*valp) = CONSTRUCTOR_ELTS (init);
5141 TREE_CONSTANT (*valp) = TREE_CONSTANT (init);
5142 TREE_SIDE_EFFECTS (*valp) = TREE_SIDE_EFFECTS (init);
5143 CONSTRUCTOR_NO_CLEARING (*valp)
5144 = CONSTRUCTOR_NO_CLEARING (init);
5145 }
5146 else if (TREE_CODE (init) == CONSTRUCTOR
5147 && !same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (init),
5148 type))
5149 {
5150 /* See above on initialization of empty bases. */
5151 gcc_assert (is_empty_class (TREE_TYPE (init)) && !lval);
5152 if (!*valp)
5153 {
5154 /* But do make sure we have something in *valp. */
5155 *valp = build_constructor (type, NULL);
5156 CONSTRUCTOR_NO_CLEARING (*valp) = no_zero_init;
5157 }
5158 return init;
5159 }
5160 else
5161 *valp = init;
5162
5163 /* After initialization, 'const' semantics apply to the value of the
5164 object. Make a note of this fact by marking the CONSTRUCTOR
5165 TREE_READONLY. */
5166 if (TREE_CODE (t) == INIT_EXPR
5167 && TREE_CODE (*valp) == CONSTRUCTOR
5168 && TYPE_READONLY (type))
5169 {
5170 if (INDIRECT_REF_P (target)
5171 && (is_this_parameter
5172 (tree_strip_nop_conversions (TREE_OPERAND (target, 0)))))
5173 /* We've just initialized '*this' (perhaps via the target
5174 constructor of a delegating constructor). Leave it up to the
5175 caller that set 'this' to set TREE_READONLY appropriately. */
5176 gcc_checking_assert (same_type_ignoring_top_level_qualifiers_p
5177 (TREE_TYPE (target), type));
5178 else
5179 TREE_READONLY (*valp) = true;
5180 }
5181
5182 /* Update TREE_CONSTANT and TREE_SIDE_EFFECTS on enclosing
5183 CONSTRUCTORs, if any. */
5184 tree elt;
5185 unsigned i;
5186 bool c = TREE_CONSTANT (init);
5187 bool s = TREE_SIDE_EFFECTS (init);
5188 if (!c || s || activated_union_member_p)
5189 FOR_EACH_VEC_ELT (*ctors, i, elt)
5190 {
5191 if (!c)
5192 TREE_CONSTANT (elt) = false;
5193 if (s)
5194 TREE_SIDE_EFFECTS (elt) = true;
5195 /* Clear CONSTRUCTOR_NO_CLEARING since we've activated a member of
5196 this union. */
5197 if (TREE_CODE (TREE_TYPE (elt)) == UNION_TYPE)
5198 CONSTRUCTOR_NO_CLEARING (elt) = false;
5199 }
5200
5201 if (*non_constant_p)
5202 return t;
5203 else if (lval)
5204 return target;
5205 else
5206 return init;
5207 }
5208
5209 /* Evaluate a ++ or -- expression. */
5210
5211 static tree
cxx_eval_increment_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p)5212 cxx_eval_increment_expression (const constexpr_ctx *ctx, tree t,
5213 bool lval,
5214 bool *non_constant_p, bool *overflow_p)
5215 {
5216 enum tree_code code = TREE_CODE (t);
5217 tree type = TREE_TYPE (t);
5218 tree op = TREE_OPERAND (t, 0);
5219 tree offset = TREE_OPERAND (t, 1);
5220 gcc_assert (TREE_CONSTANT (offset));
5221
5222 /* OFFSET is constant, but perhaps not constant enough. We need to
5223 e.g. bash FLOAT_EXPRs to REAL_CSTs. */
5224 offset = fold_simple (offset);
5225
5226 /* The operand as an lvalue. */
5227 op = cxx_eval_constant_expression (ctx, op, true,
5228 non_constant_p, overflow_p);
5229
5230 /* The operand as an rvalue. */
5231 tree val
5232 = cxx_eval_constant_expression (ctx, op, false,
5233 non_constant_p, overflow_p);
5234 /* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
5235 a local array in a constexpr function. */
5236 bool ptr = INDIRECT_TYPE_P (TREE_TYPE (val));
5237 if (!ptr)
5238 VERIFY_CONSTANT (val);
5239
5240 /* The modified value. */
5241 bool inc = (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR);
5242 tree mod;
5243 if (INDIRECT_TYPE_P (type))
5244 {
5245 /* The middle end requires pointers to use POINTER_PLUS_EXPR. */
5246 offset = convert_to_ptrofftype (offset);
5247 if (!inc)
5248 offset = fold_build1 (NEGATE_EXPR, TREE_TYPE (offset), offset);
5249 mod = fold_build2 (POINTER_PLUS_EXPR, type, val, offset);
5250 }
5251 else if (c_promoting_integer_type_p (type)
5252 && !TYPE_UNSIGNED (type)
5253 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
5254 {
5255 offset = fold_convert (integer_type_node, offset);
5256 mod = fold_convert (integer_type_node, val);
5257 tree t = fold_build2 (inc ? PLUS_EXPR : MINUS_EXPR, integer_type_node,
5258 mod, offset);
5259 mod = fold_convert (type, t);
5260 if (TREE_OVERFLOW_P (mod) && !TREE_OVERFLOW_P (t))
5261 TREE_OVERFLOW (mod) = false;
5262 }
5263 else
5264 mod = fold_build2 (inc ? PLUS_EXPR : MINUS_EXPR, type, val, offset);
5265 if (!ptr)
5266 VERIFY_CONSTANT (mod);
5267
5268 /* Storing the modified value. */
5269 tree store = build2_loc (cp_expr_loc_or_loc (t, input_location),
5270 MODIFY_EXPR, type, op, mod);
5271 cxx_eval_constant_expression (ctx, store,
5272 true, non_constant_p, overflow_p);
5273 ggc_free (store);
5274
5275 /* And the value of the expression. */
5276 if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
5277 {
5278 /* Prefix ops are lvalues. */
5279 if (lval)
5280 return op;
5281 else
5282 /* But we optimize when the caller wants an rvalue. */
5283 return mod;
5284 }
5285 else
5286 /* Postfix ops are rvalues. */
5287 return val;
5288 }
5289
5290 /* Predicates for the meaning of *jump_target. */
5291
5292 static bool
returns(tree * jump_target)5293 returns (tree *jump_target)
5294 {
5295 return *jump_target
5296 && (TREE_CODE (*jump_target) == RETURN_EXPR
5297 || (TREE_CODE (*jump_target) == LABEL_DECL
5298 && LABEL_DECL_CDTOR (*jump_target)));
5299 }
5300
5301 static bool
breaks(tree * jump_target)5302 breaks (tree *jump_target)
5303 {
5304 return *jump_target
5305 && ((TREE_CODE (*jump_target) == LABEL_DECL
5306 && LABEL_DECL_BREAK (*jump_target))
5307 || TREE_CODE (*jump_target) == BREAK_STMT
5308 || TREE_CODE (*jump_target) == EXIT_EXPR);
5309 }
5310
5311 static bool
continues(tree * jump_target)5312 continues (tree *jump_target)
5313 {
5314 return *jump_target
5315 && ((TREE_CODE (*jump_target) == LABEL_DECL
5316 && LABEL_DECL_CONTINUE (*jump_target))
5317 || TREE_CODE (*jump_target) == CONTINUE_STMT);
5318
5319 }
5320
5321 static bool
switches(tree * jump_target)5322 switches (tree *jump_target)
5323 {
5324 return *jump_target
5325 && TREE_CODE (*jump_target) == INTEGER_CST;
5326 }
5327
5328 /* Subroutine of cxx_eval_statement_list. Determine whether the statement
5329 STMT matches *jump_target. If we're looking for a case label and we see
5330 the default label, note it in ctx->css_state. */
5331
5332 static bool
label_matches(const constexpr_ctx * ctx,tree * jump_target,tree stmt)5333 label_matches (const constexpr_ctx *ctx, tree *jump_target, tree stmt)
5334 {
5335 switch (TREE_CODE (*jump_target))
5336 {
5337 case LABEL_DECL:
5338 if (TREE_CODE (stmt) == LABEL_EXPR
5339 && LABEL_EXPR_LABEL (stmt) == *jump_target)
5340 return true;
5341 break;
5342
5343 case INTEGER_CST:
5344 if (TREE_CODE (stmt) == CASE_LABEL_EXPR)
5345 {
5346 gcc_assert (ctx->css_state != NULL);
5347 if (!CASE_LOW (stmt))
5348 {
5349 /* default: should appear just once in a SWITCH_EXPR
5350 body (excluding nested SWITCH_EXPR). */
5351 gcc_assert (*ctx->css_state != css_default_seen);
5352 /* When evaluating SWITCH_EXPR body for the second time,
5353 return true for the default: label. */
5354 if (*ctx->css_state == css_default_processing)
5355 return true;
5356 *ctx->css_state = css_default_seen;
5357 }
5358 else if (CASE_HIGH (stmt))
5359 {
5360 if (tree_int_cst_le (CASE_LOW (stmt), *jump_target)
5361 && tree_int_cst_le (*jump_target, CASE_HIGH (stmt)))
5362 return true;
5363 }
5364 else if (tree_int_cst_equal (*jump_target, CASE_LOW (stmt)))
5365 return true;
5366 }
5367 break;
5368
5369 case BREAK_STMT:
5370 case CONTINUE_STMT:
5371 /* These two are handled directly in cxx_eval_loop_expr by testing
5372 breaks (jump_target) or continues (jump_target). */
5373 break;
5374
5375 default:
5376 gcc_unreachable ();
5377 }
5378 return false;
5379 }
5380
5381 /* Evaluate a STATEMENT_LIST for side-effects. Handles various jump
5382 semantics, for switch, break, continue, and return. */
5383
5384 static tree
cxx_eval_statement_list(const constexpr_ctx * ctx,tree t,bool * non_constant_p,bool * overflow_p,tree * jump_target)5385 cxx_eval_statement_list (const constexpr_ctx *ctx, tree t,
5386 bool *non_constant_p, bool *overflow_p,
5387 tree *jump_target)
5388 {
5389 tree_stmt_iterator i;
5390 tree local_target;
5391 /* In a statement-expression we want to return the last value.
5392 For empty statement expression return void_node. */
5393 tree r = void_node;
5394 if (!jump_target)
5395 {
5396 local_target = NULL_TREE;
5397 jump_target = &local_target;
5398 }
5399 for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
5400 {
5401 tree stmt = tsi_stmt (i);
5402 /* We've found a continue, so skip everything until we reach
5403 the label its jumping to. */
5404 if (continues (jump_target))
5405 {
5406 if (label_matches (ctx, jump_target, stmt))
5407 /* Found it. */
5408 *jump_target = NULL_TREE;
5409 else
5410 continue;
5411 }
5412 if (TREE_CODE (stmt) == DEBUG_BEGIN_STMT)
5413 continue;
5414 r = cxx_eval_constant_expression (ctx, stmt, false,
5415 non_constant_p, overflow_p,
5416 jump_target);
5417 if (*non_constant_p)
5418 break;
5419 if (returns (jump_target) || breaks (jump_target))
5420 break;
5421 }
5422 if (*jump_target && jump_target == &local_target)
5423 {
5424 /* We aren't communicating the jump to our caller, so give up. We don't
5425 need to support evaluation of jumps out of statement-exprs. */
5426 if (!ctx->quiet)
5427 error_at (cp_expr_loc_or_input_loc (r),
5428 "statement is not a constant expression");
5429 *non_constant_p = true;
5430 }
5431 return r;
5432 }
5433
5434 /* Evaluate a LOOP_EXPR for side-effects. Handles break and return
5435 semantics; continue semantics are covered by cxx_eval_statement_list. */
5436
5437 static tree
cxx_eval_loop_expr(const constexpr_ctx * ctx,tree t,bool * non_constant_p,bool * overflow_p,tree * jump_target)5438 cxx_eval_loop_expr (const constexpr_ctx *ctx, tree t,
5439 bool *non_constant_p, bool *overflow_p,
5440 tree *jump_target)
5441 {
5442 constexpr_ctx new_ctx = *ctx;
5443 tree local_target;
5444 if (!jump_target)
5445 {
5446 local_target = NULL_TREE;
5447 jump_target = &local_target;
5448 }
5449
5450 tree body, cond = NULL_TREE, expr = NULL_TREE;
5451 int count = 0;
5452 switch (TREE_CODE (t))
5453 {
5454 case LOOP_EXPR:
5455 body = LOOP_EXPR_BODY (t);
5456 break;
5457 case DO_STMT:
5458 body = DO_BODY (t);
5459 cond = DO_COND (t);
5460 break;
5461 case WHILE_STMT:
5462 body = WHILE_BODY (t);
5463 cond = WHILE_COND (t);
5464 count = -1;
5465 break;
5466 case FOR_STMT:
5467 if (FOR_INIT_STMT (t))
5468 cxx_eval_constant_expression (ctx, FOR_INIT_STMT (t), /*lval*/false,
5469 non_constant_p, overflow_p, jump_target);
5470 if (*non_constant_p)
5471 return NULL_TREE;
5472 body = FOR_BODY (t);
5473 cond = FOR_COND (t);
5474 expr = FOR_EXPR (t);
5475 count = -1;
5476 break;
5477 default:
5478 gcc_unreachable ();
5479 }
5480 auto_vec<tree, 10> save_exprs;
5481 new_ctx.save_exprs = &save_exprs;
5482 do
5483 {
5484 if (count != -1)
5485 {
5486 if (body)
5487 cxx_eval_constant_expression (&new_ctx, body, /*lval*/false,
5488 non_constant_p, overflow_p,
5489 jump_target);
5490 if (breaks (jump_target))
5491 {
5492 *jump_target = NULL_TREE;
5493 break;
5494 }
5495
5496 if (TREE_CODE (t) != LOOP_EXPR && continues (jump_target))
5497 *jump_target = NULL_TREE;
5498
5499 if (expr)
5500 cxx_eval_constant_expression (&new_ctx, expr, /*lval*/false,
5501 non_constant_p, overflow_p,
5502 jump_target);
5503 }
5504
5505 if (cond)
5506 {
5507 tree res
5508 = cxx_eval_constant_expression (&new_ctx, cond, /*lval*/false,
5509 non_constant_p, overflow_p,
5510 jump_target);
5511 if (res)
5512 {
5513 if (verify_constant (res, ctx->quiet, non_constant_p,
5514 overflow_p))
5515 break;
5516 if (integer_zerop (res))
5517 break;
5518 }
5519 else
5520 gcc_assert (*jump_target);
5521 }
5522
5523 /* Forget saved values of SAVE_EXPRs and TARGET_EXPRs. */
5524 unsigned int i;
5525 tree save_expr;
5526 FOR_EACH_VEC_ELT (save_exprs, i, save_expr)
5527 ctx->global->values.remove (save_expr);
5528 save_exprs.truncate (0);
5529
5530 if (++count >= constexpr_loop_limit)
5531 {
5532 if (!ctx->quiet)
5533 error_at (cp_expr_loc_or_input_loc (t),
5534 "%<constexpr%> loop iteration count exceeds limit of %d "
5535 "(use %<-fconstexpr-loop-limit=%> to increase the limit)",
5536 constexpr_loop_limit);
5537 *non_constant_p = true;
5538 break;
5539 }
5540 }
5541 while (!returns (jump_target)
5542 && !breaks (jump_target)
5543 && !continues (jump_target)
5544 && (!switches (jump_target) || count == 0)
5545 && !*non_constant_p);
5546
5547 /* Forget saved values of SAVE_EXPRs and TARGET_EXPRs. */
5548 unsigned int i;
5549 tree save_expr;
5550 FOR_EACH_VEC_ELT (save_exprs, i, save_expr)
5551 ctx->global->values.remove (save_expr);
5552
5553 return NULL_TREE;
5554 }
5555
5556 /* Evaluate a SWITCH_EXPR for side-effects. Handles switch and break jump
5557 semantics. */
5558
5559 static tree
cxx_eval_switch_expr(const constexpr_ctx * ctx,tree t,bool * non_constant_p,bool * overflow_p,tree * jump_target)5560 cxx_eval_switch_expr (const constexpr_ctx *ctx, tree t,
5561 bool *non_constant_p, bool *overflow_p,
5562 tree *jump_target)
5563 {
5564 tree cond
5565 = TREE_CODE (t) == SWITCH_STMT ? SWITCH_STMT_COND (t) : SWITCH_COND (t);
5566 cond = cxx_eval_constant_expression (ctx, cond, false,
5567 non_constant_p, overflow_p);
5568 VERIFY_CONSTANT (cond);
5569 *jump_target = cond;
5570
5571 tree body
5572 = TREE_CODE (t) == SWITCH_STMT ? SWITCH_STMT_BODY (t) : SWITCH_BODY (t);
5573 constexpr_ctx new_ctx = *ctx;
5574 constexpr_switch_state css = css_default_not_seen;
5575 new_ctx.css_state = &css;
5576 cxx_eval_constant_expression (&new_ctx, body, false,
5577 non_constant_p, overflow_p, jump_target);
5578 if (switches (jump_target) && css == css_default_seen)
5579 {
5580 /* If the SWITCH_EXPR body has default: label, process it once again,
5581 this time instructing label_matches to return true for default:
5582 label on switches (jump_target). */
5583 css = css_default_processing;
5584 cxx_eval_constant_expression (&new_ctx, body, false,
5585 non_constant_p, overflow_p, jump_target);
5586 }
5587 if (breaks (jump_target) || switches (jump_target))
5588 *jump_target = NULL_TREE;
5589 return NULL_TREE;
5590 }
5591
5592 /* Find the object of TYPE under initialization in CTX. */
5593
5594 static tree
lookup_placeholder(const constexpr_ctx * ctx,bool lval,tree type)5595 lookup_placeholder (const constexpr_ctx *ctx, bool lval, tree type)
5596 {
5597 if (!ctx)
5598 return NULL_TREE;
5599
5600 /* Prefer the outermost matching object, but don't cross
5601 CONSTRUCTOR_PLACEHOLDER_BOUNDARY constructors. */
5602 if (ctx->ctor && !CONSTRUCTOR_PLACEHOLDER_BOUNDARY (ctx->ctor))
5603 if (tree outer_ob = lookup_placeholder (ctx->parent, lval, type))
5604 return outer_ob;
5605
5606 /* We could use ctx->object unconditionally, but using ctx->ctor when we
5607 can is a minor optimization. */
5608 if (!lval && ctx->ctor && same_type_p (TREE_TYPE (ctx->ctor), type))
5609 return ctx->ctor;
5610
5611 if (!ctx->object)
5612 return NULL_TREE;
5613
5614 /* Since an object cannot have a field of its own type, we can search outward
5615 from ctx->object to find the unique containing object of TYPE. */
5616 tree ob = ctx->object;
5617 while (ob)
5618 {
5619 if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (ob), type))
5620 break;
5621 if (handled_component_p (ob))
5622 ob = TREE_OPERAND (ob, 0);
5623 else
5624 ob = NULL_TREE;
5625 }
5626
5627 return ob;
5628 }
5629
5630 /* Complain about an attempt to evaluate inline assembly. */
5631
5632 static void
inline_asm_in_constexpr_error(location_t loc)5633 inline_asm_in_constexpr_error (location_t loc)
5634 {
5635 auto_diagnostic_group d;
5636 error_at (loc, "inline assembly is not a constant expression");
5637 inform (loc, "only unevaluated inline assembly is allowed in a "
5638 "%<constexpr%> function in C++2a");
5639 }
5640
5641 /* For element type ELT_TYPE, return the appropriate type of the heap object
5642 containing such element(s). COOKIE_SIZE is NULL or the size of cookie
5643 in bytes. If COOKIE_SIZE is NULL, return array type
5644 ELT_TYPE[FULL_SIZE / sizeof(ELT_TYPE)], otherwise return
5645 struct { size_t[COOKIE_SIZE/sizeof(size_t)]; ELT_TYPE[N]; }
5646 where N is is computed such that the size of the struct fits into FULL_SIZE.
5647 If ARG_SIZE is non-NULL, it is the first argument to the new operator.
5648 It should be passed if ELT_TYPE is zero sized type in which case FULL_SIZE
5649 will be also 0 and so it is not possible to determine the actual array
5650 size. CTX, NON_CONSTANT_P and OVERFLOW_P are used during constant
5651 expression evaluation of subexpressions of ARG_SIZE. */
5652
5653 static tree
build_new_constexpr_heap_type(const constexpr_ctx * ctx,tree elt_type,tree cookie_size,tree full_size,tree arg_size,bool * non_constant_p,bool * overflow_p)5654 build_new_constexpr_heap_type (const constexpr_ctx *ctx, tree elt_type,
5655 tree cookie_size, tree full_size, tree arg_size,
5656 bool *non_constant_p, bool *overflow_p)
5657 {
5658 gcc_assert (cookie_size == NULL_TREE || tree_fits_uhwi_p (cookie_size));
5659 gcc_assert (tree_fits_uhwi_p (full_size));
5660 unsigned HOST_WIDE_INT csz = cookie_size ? tree_to_uhwi (cookie_size) : 0;
5661 if (arg_size)
5662 {
5663 STRIP_NOPS (arg_size);
5664 if (cookie_size)
5665 {
5666 if (TREE_CODE (arg_size) != PLUS_EXPR)
5667 arg_size = NULL_TREE;
5668 else if (TREE_CODE (TREE_OPERAND (arg_size, 0)) == INTEGER_CST
5669 && tree_int_cst_equal (cookie_size,
5670 TREE_OPERAND (arg_size, 0)))
5671 {
5672 arg_size = TREE_OPERAND (arg_size, 1);
5673 STRIP_NOPS (arg_size);
5674 }
5675 else if (TREE_CODE (TREE_OPERAND (arg_size, 1)) == INTEGER_CST
5676 && tree_int_cst_equal (cookie_size,
5677 TREE_OPERAND (arg_size, 1)))
5678 {
5679 arg_size = TREE_OPERAND (arg_size, 0);
5680 STRIP_NOPS (arg_size);
5681 }
5682 else
5683 arg_size = NULL_TREE;
5684 }
5685 if (arg_size && TREE_CODE (arg_size) == MULT_EXPR)
5686 {
5687 tree op0 = TREE_OPERAND (arg_size, 0);
5688 tree op1 = TREE_OPERAND (arg_size, 1);
5689 if (integer_zerop (op0))
5690 arg_size
5691 = cxx_eval_constant_expression (ctx, op1, false, non_constant_p,
5692 overflow_p);
5693 else if (integer_zerop (op1))
5694 arg_size
5695 = cxx_eval_constant_expression (ctx, op0, false, non_constant_p,
5696 overflow_p);
5697 else
5698 arg_size = NULL_TREE;
5699 }
5700 else
5701 arg_size = NULL_TREE;
5702 }
5703
5704 unsigned HOST_WIDE_INT fsz = tree_to_uhwi (arg_size ? arg_size : full_size);
5705 if (!arg_size)
5706 {
5707 unsigned HOST_WIDE_INT esz = int_size_in_bytes (elt_type);
5708 gcc_assert (fsz >= csz);
5709 fsz -= csz;
5710 if (esz)
5711 fsz /= esz;
5712 }
5713 tree itype2 = build_index_type (size_int (fsz - 1));
5714 if (!cookie_size)
5715 return build_cplus_array_type (elt_type, itype2);
5716 return build_new_constexpr_heap_type (elt_type, cookie_size, itype2);
5717 }
5718
5719 /* Attempt to reduce the expression T to a constant value.
5720 On failure, issue diagnostic and return error_mark_node. */
5721 /* FIXME unify with c_fully_fold */
5722 /* FIXME overflow_p is too global */
5723
5724 static tree
cxx_eval_constant_expression(const constexpr_ctx * ctx,tree t,bool lval,bool * non_constant_p,bool * overflow_p,tree * jump_target)5725 cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
5726 bool lval,
5727 bool *non_constant_p, bool *overflow_p,
5728 tree *jump_target /* = NULL */)
5729 {
5730 if (jump_target && *jump_target)
5731 {
5732 /* If we are jumping, ignore all statements/expressions except those
5733 that could have LABEL_EXPR or CASE_LABEL_EXPR in their bodies. */
5734 switch (TREE_CODE (t))
5735 {
5736 case BIND_EXPR:
5737 case STATEMENT_LIST:
5738 case LOOP_EXPR:
5739 case COND_EXPR:
5740 case IF_STMT:
5741 case DO_STMT:
5742 case WHILE_STMT:
5743 case FOR_STMT:
5744 break;
5745 case LABEL_EXPR:
5746 case CASE_LABEL_EXPR:
5747 if (label_matches (ctx, jump_target, t))
5748 /* Found it. */
5749 *jump_target = NULL_TREE;
5750 return NULL_TREE;
5751 default:
5752 return NULL_TREE;
5753 }
5754 }
5755 if (error_operand_p (t))
5756 {
5757 *non_constant_p = true;
5758 return t;
5759 }
5760
5761 location_t loc = cp_expr_loc_or_input_loc (t);
5762
5763 STRIP_ANY_LOCATION_WRAPPER (t);
5764
5765 if (CONSTANT_CLASS_P (t))
5766 {
5767 if (TREE_OVERFLOW (t))
5768 {
5769 if (!ctx->quiet)
5770 permerror (input_location, "overflow in constant expression");
5771 if (!flag_permissive || ctx->quiet)
5772 *overflow_p = true;
5773 }
5774
5775 if (TREE_CODE (t) == INTEGER_CST
5776 && TYPE_PTR_P (TREE_TYPE (t))
5777 /* INTEGER_CST with pointer-to-method type is only used
5778 for a virtual method in a pointer to member function.
5779 Don't reject those. */
5780 && TREE_CODE (TREE_TYPE (TREE_TYPE (t))) != METHOD_TYPE
5781 && !integer_zerop (t))
5782 {
5783 if (!ctx->quiet)
5784 error ("value %qE of type %qT is not a constant expression",
5785 t, TREE_TYPE (t));
5786 *non_constant_p = true;
5787 }
5788
5789 return t;
5790 }
5791
5792 /* Avoid excessively long constexpr evaluations. */
5793 if (++ctx->global->constexpr_ops_count >= constexpr_ops_limit)
5794 {
5795 if (!ctx->quiet)
5796 error_at (loc,
5797 "%<constexpr%> evaluation operation count exceeds limit of "
5798 "%wd (use %<-fconstexpr-ops-limit=%> to increase the limit)",
5799 constexpr_ops_limit);
5800 ctx->global->constexpr_ops_count = INTTYPE_MINIMUM (HOST_WIDE_INT);
5801 *non_constant_p = true;
5802 return t;
5803 }
5804
5805 constexpr_ctx new_ctx;
5806 tree r = t;
5807
5808 tree_code tcode = TREE_CODE (t);
5809 switch (tcode)
5810 {
5811 case RESULT_DECL:
5812 if (lval)
5813 return t;
5814 /* We ask for an rvalue for the RESULT_DECL when indirecting
5815 through an invisible reference, or in named return value
5816 optimization. */
5817 if (tree *p = ctx->global->values.get (t))
5818 return *p;
5819 else
5820 {
5821 if (!ctx->quiet)
5822 error ("%qE is not a constant expression", t);
5823 *non_constant_p = true;
5824 }
5825 break;
5826
5827 case VAR_DECL:
5828 if (DECL_HAS_VALUE_EXPR_P (t))
5829 {
5830 if (is_normal_capture_proxy (t)
5831 && current_function_decl == DECL_CONTEXT (t))
5832 {
5833 /* Function parms aren't constexpr within the function
5834 definition, so don't try to look at the closure. But if the
5835 captured variable is constant, try to evaluate it directly. */
5836 r = DECL_CAPTURED_VARIABLE (t);
5837 tree type = TREE_TYPE (t);
5838 if (TYPE_REF_P (type) != TYPE_REF_P (TREE_TYPE (r)))
5839 {
5840 /* Adjust r to match the reference-ness of t. */
5841 if (TYPE_REF_P (type))
5842 r = build_address (r);
5843 else
5844 r = convert_from_reference (r);
5845 }
5846 }
5847 else
5848 r = DECL_VALUE_EXPR (t);
5849 return cxx_eval_constant_expression (ctx, r, lval, non_constant_p,
5850 overflow_p);
5851 }
5852 /* fall through */
5853 case CONST_DECL:
5854 /* We used to not check lval for CONST_DECL, but darwin.c uses
5855 CONST_DECL for aggregate constants. */
5856 if (lval)
5857 return t;
5858 else if (t == ctx->object)
5859 return ctx->ctor;
5860 if (VAR_P (t))
5861 if (tree *p = ctx->global->values.get (t))
5862 if (*p != NULL_TREE)
5863 {
5864 r = *p;
5865 break;
5866 }
5867 if (COMPLETE_TYPE_P (TREE_TYPE (t))
5868 && is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
5869 {
5870 /* If the class is empty, we aren't actually loading anything. */
5871 r = build_constructor (TREE_TYPE (t), NULL);
5872 TREE_CONSTANT (r) = true;
5873 }
5874 else if (ctx->strict)
5875 r = decl_really_constant_value (t, /*unshare_p=*/false);
5876 else
5877 r = decl_constant_value (t, /*unshare_p=*/false);
5878 if (TREE_CODE (r) == TARGET_EXPR
5879 && TREE_CODE (TARGET_EXPR_INITIAL (r)) == CONSTRUCTOR)
5880 r = TARGET_EXPR_INITIAL (r);
5881 if (DECL_P (r))
5882 {
5883 if (!ctx->quiet)
5884 non_const_var_error (loc, r);
5885 *non_constant_p = true;
5886 }
5887 break;
5888
5889 case DEBUG_BEGIN_STMT:
5890 /* ??? It might be nice to retain this information somehow, so
5891 as to be able to step into a constexpr function call. */
5892 /* Fall through. */
5893
5894 case FUNCTION_DECL:
5895 case TEMPLATE_DECL:
5896 case LABEL_DECL:
5897 case LABEL_EXPR:
5898 case CASE_LABEL_EXPR:
5899 case PREDICT_EXPR:
5900 return t;
5901
5902 case PARM_DECL:
5903 if (lval && !TYPE_REF_P (TREE_TYPE (t)))
5904 /* glvalue use. */;
5905 else if (tree *p = ctx->global->values.get (r))
5906 r = *p;
5907 else if (lval)
5908 /* Defer in case this is only used for its type. */;
5909 else if (COMPLETE_TYPE_P (TREE_TYPE (t))
5910 && is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
5911 {
5912 /* If the class is empty, we aren't actually loading anything. */
5913 r = build_constructor (TREE_TYPE (t), NULL);
5914 TREE_CONSTANT (r) = true;
5915 }
5916 else
5917 {
5918 if (!ctx->quiet)
5919 error ("%qE is not a constant expression", t);
5920 *non_constant_p = true;
5921 }
5922 break;
5923
5924 case CALL_EXPR:
5925 case AGGR_INIT_EXPR:
5926 r = cxx_eval_call_expression (ctx, t, lval,
5927 non_constant_p, overflow_p);
5928 break;
5929
5930 case DECL_EXPR:
5931 {
5932 r = DECL_EXPR_DECL (t);
5933 if (TREE_CODE (r) == USING_DECL)
5934 {
5935 r = void_node;
5936 break;
5937 }
5938 if (AGGREGATE_TYPE_P (TREE_TYPE (r))
5939 || VECTOR_TYPE_P (TREE_TYPE (r)))
5940 {
5941 new_ctx = *ctx;
5942 new_ctx.object = r;
5943 new_ctx.ctor = build_constructor (TREE_TYPE (r), NULL);
5944 CONSTRUCTOR_NO_CLEARING (new_ctx.ctor) = true;
5945 ctx->global->values.put (r, new_ctx.ctor);
5946 ctx = &new_ctx;
5947 }
5948
5949 if (tree init = DECL_INITIAL (r))
5950 {
5951 init = cxx_eval_constant_expression (ctx, init,
5952 false,
5953 non_constant_p, overflow_p);
5954 /* Don't share a CONSTRUCTOR that might be changed. */
5955 init = unshare_constructor (init);
5956 /* Remember that a constant object's constructor has already
5957 run. */
5958 if (CLASS_TYPE_P (TREE_TYPE (r))
5959 && CP_TYPE_CONST_P (TREE_TYPE (r)))
5960 TREE_READONLY (init) = true;
5961 ctx->global->values.put (r, init);
5962 }
5963 else if (ctx == &new_ctx)
5964 /* We gave it a CONSTRUCTOR above. */;
5965 else
5966 ctx->global->values.put (r, NULL_TREE);
5967 }
5968 break;
5969
5970 case TARGET_EXPR:
5971 {
5972 tree type = TREE_TYPE (t);
5973
5974 if (!literal_type_p (type))
5975 {
5976 if (!ctx->quiet)
5977 {
5978 auto_diagnostic_group d;
5979 error ("temporary of non-literal type %qT in a "
5980 "constant expression", type);
5981 explain_non_literal_class (type);
5982 }
5983 *non_constant_p = true;
5984 break;
5985 }
5986 gcc_checking_assert (!TARGET_EXPR_DIRECT_INIT_P (t));
5987 /* Avoid evaluating a TARGET_EXPR more than once. */
5988 tree slot = TARGET_EXPR_SLOT (t);
5989 if (tree *p = ctx->global->values.get (slot))
5990 {
5991 if (lval)
5992 return slot;
5993 r = *p;
5994 break;
5995 }
5996 if ((AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type)))
5997 {
5998 /* We're being expanded without an explicit target, so start
5999 initializing a new object; expansion with an explicit target
6000 strips the TARGET_EXPR before we get here. */
6001 new_ctx = *ctx;
6002 /* Link CTX to NEW_CTX so that lookup_placeholder can resolve
6003 any PLACEHOLDER_EXPR within the initializer that refers to the
6004 former object under construction. */
6005 new_ctx.parent = ctx;
6006 new_ctx.ctor = build_constructor (type, NULL);
6007 CONSTRUCTOR_NO_CLEARING (new_ctx.ctor) = true;
6008 new_ctx.object = slot;
6009 ctx->global->values.put (new_ctx.object, new_ctx.ctor);
6010 ctx = &new_ctx;
6011 }
6012 /* Pass false for 'lval' because this indicates
6013 initialization of a temporary. */
6014 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
6015 false,
6016 non_constant_p, overflow_p);
6017 if (*non_constant_p)
6018 break;
6019 /* Adjust the type of the result to the type of the temporary. */
6020 r = adjust_temp_type (type, r);
6021 if (TARGET_EXPR_CLEANUP (t) && !CLEANUP_EH_ONLY (t))
6022 ctx->global->cleanups->safe_push (TARGET_EXPR_CLEANUP (t));
6023 r = unshare_constructor (r);
6024 ctx->global->values.put (slot, r);
6025 if (ctx->save_exprs)
6026 ctx->save_exprs->safe_push (slot);
6027 if (lval)
6028 return slot;
6029 }
6030 break;
6031
6032 case INIT_EXPR:
6033 case MODIFY_EXPR:
6034 gcc_assert (jump_target == NULL || *jump_target == NULL_TREE);
6035 r = cxx_eval_store_expression (ctx, t, lval,
6036 non_constant_p, overflow_p);
6037 break;
6038
6039 case SCOPE_REF:
6040 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1),
6041 lval,
6042 non_constant_p, overflow_p);
6043 break;
6044
6045 case RETURN_EXPR:
6046 if (TREE_OPERAND (t, 0) != NULL_TREE)
6047 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
6048 lval,
6049 non_constant_p, overflow_p);
6050 /* FALLTHRU */
6051 case BREAK_STMT:
6052 case CONTINUE_STMT:
6053 if (jump_target)
6054 *jump_target = t;
6055 else
6056 {
6057 /* Can happen with ({ return true; }) && false; passed to
6058 maybe_constant_value. There is nothing to jump over in this
6059 case, and the bug will be diagnosed later. */
6060 gcc_assert (ctx->quiet);
6061 *non_constant_p = true;
6062 }
6063 break;
6064
6065 case SAVE_EXPR:
6066 /* Avoid evaluating a SAVE_EXPR more than once. */
6067 if (tree *p = ctx->global->values.get (t))
6068 r = *p;
6069 else
6070 {
6071 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), false,
6072 non_constant_p, overflow_p);
6073 if (*non_constant_p)
6074 break;
6075 ctx->global->values.put (t, r);
6076 if (ctx->save_exprs)
6077 ctx->save_exprs->safe_push (t);
6078 }
6079 break;
6080
6081 case TRY_CATCH_EXPR:
6082 if (TREE_OPERAND (t, 0) == NULL_TREE)
6083 {
6084 r = void_node;
6085 break;
6086 }
6087 /* FALLTHRU */
6088 case NON_LVALUE_EXPR:
6089 case TRY_BLOCK:
6090 case MUST_NOT_THROW_EXPR:
6091 case EXPR_STMT:
6092 case EH_SPEC_BLOCK:
6093 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
6094 lval,
6095 non_constant_p, overflow_p,
6096 jump_target);
6097 break;
6098
6099 case CLEANUP_POINT_EXPR:
6100 {
6101 auto_vec<tree, 2> cleanups;
6102 vec<tree> *prev_cleanups = ctx->global->cleanups;
6103 ctx->global->cleanups = &cleanups;
6104 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
6105 lval,
6106 non_constant_p, overflow_p,
6107 jump_target);
6108 ctx->global->cleanups = prev_cleanups;
6109 unsigned int i;
6110 tree cleanup;
6111 /* Evaluate the cleanups. */
6112 FOR_EACH_VEC_ELT_REVERSE (cleanups, i, cleanup)
6113 cxx_eval_constant_expression (ctx, cleanup, false,
6114 non_constant_p, overflow_p);
6115 }
6116 break;
6117
6118 case TRY_FINALLY_EXPR:
6119 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
6120 non_constant_p, overflow_p,
6121 jump_target);
6122 if (!*non_constant_p)
6123 /* Also evaluate the cleanup. */
6124 cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 1), true,
6125 non_constant_p, overflow_p);
6126 break;
6127
6128 case CLEANUP_STMT:
6129 r = cxx_eval_constant_expression (ctx, CLEANUP_BODY (t), lval,
6130 non_constant_p, overflow_p,
6131 jump_target);
6132 if (!CLEANUP_EH_ONLY (t) && !*non_constant_p)
6133 {
6134 iloc_sentinel ils (loc);
6135 /* Also evaluate the cleanup. */
6136 cxx_eval_constant_expression (ctx, CLEANUP_EXPR (t), true,
6137 non_constant_p, overflow_p);
6138 }
6139 break;
6140
6141 /* These differ from cxx_eval_unary_expression in that this doesn't
6142 check for a constant operand or result; an address can be
6143 constant without its operand being, and vice versa. */
6144 case MEM_REF:
6145 case INDIRECT_REF:
6146 r = cxx_eval_indirect_ref (ctx, t, lval,
6147 non_constant_p, overflow_p);
6148 break;
6149
6150 case ADDR_EXPR:
6151 {
6152 tree oldop = TREE_OPERAND (t, 0);
6153 tree op = cxx_eval_constant_expression (ctx, oldop,
6154 /*lval*/true,
6155 non_constant_p, overflow_p);
6156 /* Don't VERIFY_CONSTANT here. */
6157 if (*non_constant_p)
6158 return t;
6159 gcc_checking_assert (TREE_CODE (op) != CONSTRUCTOR);
6160 /* This function does more aggressive folding than fold itself. */
6161 r = build_fold_addr_expr_with_type (op, TREE_TYPE (t));
6162 if (TREE_CODE (r) == ADDR_EXPR && TREE_OPERAND (r, 0) == oldop)
6163 {
6164 ggc_free (r);
6165 return t;
6166 }
6167 break;
6168 }
6169
6170 case REALPART_EXPR:
6171 case IMAGPART_EXPR:
6172 if (lval)
6173 {
6174 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval,
6175 non_constant_p, overflow_p);
6176 if (r == error_mark_node)
6177 ;
6178 else if (r == TREE_OPERAND (t, 0))
6179 r = t;
6180 else
6181 r = fold_build1 (TREE_CODE (t), TREE_TYPE (t), r);
6182 break;
6183 }
6184 /* FALLTHRU */
6185 case CONJ_EXPR:
6186 case FIX_TRUNC_EXPR:
6187 case FLOAT_EXPR:
6188 case NEGATE_EXPR:
6189 case ABS_EXPR:
6190 case ABSU_EXPR:
6191 case BIT_NOT_EXPR:
6192 case TRUTH_NOT_EXPR:
6193 case FIXED_CONVERT_EXPR:
6194 r = cxx_eval_unary_expression (ctx, t, lval,
6195 non_constant_p, overflow_p);
6196 break;
6197
6198 case SIZEOF_EXPR:
6199 r = fold_sizeof_expr (t);
6200 /* In a template, fold_sizeof_expr may merely create a new SIZEOF_EXPR,
6201 which could lead to an infinite recursion. */
6202 if (TREE_CODE (r) != SIZEOF_EXPR)
6203 r = cxx_eval_constant_expression (ctx, r, lval,
6204 non_constant_p, overflow_p,
6205 jump_target);
6206 else
6207 {
6208 *non_constant_p = true;
6209 gcc_assert (ctx->quiet);
6210 }
6211
6212 break;
6213
6214 case COMPOUND_EXPR:
6215 {
6216 /* check_return_expr sometimes wraps a TARGET_EXPR in a
6217 COMPOUND_EXPR; don't get confused. Also handle EMPTY_CLASS_EXPR
6218 introduced by build_call_a. */
6219 tree op0 = TREE_OPERAND (t, 0);
6220 tree op1 = TREE_OPERAND (t, 1);
6221 STRIP_NOPS (op1);
6222 if ((TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
6223 || TREE_CODE (op1) == EMPTY_CLASS_EXPR)
6224 r = cxx_eval_constant_expression (ctx, op0,
6225 lval, non_constant_p, overflow_p,
6226 jump_target);
6227 else
6228 {
6229 /* Check that the LHS is constant and then discard it. */
6230 cxx_eval_constant_expression (ctx, op0,
6231 true, non_constant_p, overflow_p,
6232 jump_target);
6233 if (*non_constant_p)
6234 return t;
6235 op1 = TREE_OPERAND (t, 1);
6236 r = cxx_eval_constant_expression (ctx, op1,
6237 lval, non_constant_p, overflow_p,
6238 jump_target);
6239 }
6240 }
6241 break;
6242
6243 case POINTER_PLUS_EXPR:
6244 case POINTER_DIFF_EXPR:
6245 case PLUS_EXPR:
6246 case MINUS_EXPR:
6247 case MULT_EXPR:
6248 case TRUNC_DIV_EXPR:
6249 case CEIL_DIV_EXPR:
6250 case FLOOR_DIV_EXPR:
6251 case ROUND_DIV_EXPR:
6252 case TRUNC_MOD_EXPR:
6253 case CEIL_MOD_EXPR:
6254 case ROUND_MOD_EXPR:
6255 case RDIV_EXPR:
6256 case EXACT_DIV_EXPR:
6257 case MIN_EXPR:
6258 case MAX_EXPR:
6259 case LSHIFT_EXPR:
6260 case RSHIFT_EXPR:
6261 case LROTATE_EXPR:
6262 case RROTATE_EXPR:
6263 case BIT_IOR_EXPR:
6264 case BIT_XOR_EXPR:
6265 case BIT_AND_EXPR:
6266 case TRUTH_XOR_EXPR:
6267 case LT_EXPR:
6268 case LE_EXPR:
6269 case GT_EXPR:
6270 case GE_EXPR:
6271 case EQ_EXPR:
6272 case NE_EXPR:
6273 case SPACESHIP_EXPR:
6274 case UNORDERED_EXPR:
6275 case ORDERED_EXPR:
6276 case UNLT_EXPR:
6277 case UNLE_EXPR:
6278 case UNGT_EXPR:
6279 case UNGE_EXPR:
6280 case UNEQ_EXPR:
6281 case LTGT_EXPR:
6282 case RANGE_EXPR:
6283 case COMPLEX_EXPR:
6284 r = cxx_eval_binary_expression (ctx, t, lval,
6285 non_constant_p, overflow_p);
6286 break;
6287
6288 /* fold can introduce non-IF versions of these; still treat them as
6289 short-circuiting. */
6290 case TRUTH_AND_EXPR:
6291 case TRUTH_ANDIF_EXPR:
6292 r = cxx_eval_logical_expression (ctx, t, boolean_false_node,
6293 boolean_true_node,
6294 lval,
6295 non_constant_p, overflow_p);
6296 break;
6297
6298 case TRUTH_OR_EXPR:
6299 case TRUTH_ORIF_EXPR:
6300 r = cxx_eval_logical_expression (ctx, t, boolean_true_node,
6301 boolean_false_node,
6302 lval,
6303 non_constant_p, overflow_p);
6304 break;
6305
6306 case ARRAY_REF:
6307 r = cxx_eval_array_reference (ctx, t, lval,
6308 non_constant_p, overflow_p);
6309 break;
6310
6311 case COMPONENT_REF:
6312 if (is_overloaded_fn (t))
6313 {
6314 /* We can only get here in checking mode via
6315 build_non_dependent_expr, because any expression that
6316 calls or takes the address of the function will have
6317 pulled a FUNCTION_DECL out of the COMPONENT_REF. */
6318 gcc_checking_assert (ctx->quiet || errorcount);
6319 *non_constant_p = true;
6320 return t;
6321 }
6322 r = cxx_eval_component_reference (ctx, t, lval,
6323 non_constant_p, overflow_p);
6324 break;
6325
6326 case BIT_FIELD_REF:
6327 r = cxx_eval_bit_field_ref (ctx, t, lval,
6328 non_constant_p, overflow_p);
6329 break;
6330
6331 case COND_EXPR:
6332 case IF_STMT:
6333 if (jump_target && *jump_target)
6334 {
6335 tree orig_jump = *jump_target;
6336 tree arg = ((TREE_CODE (t) != IF_STMT || TREE_OPERAND (t, 1))
6337 ? TREE_OPERAND (t, 1) : void_node);
6338 /* When jumping to a label, the label might be either in the
6339 then or else blocks, so process then block first in skipping
6340 mode first, and if we are still in the skipping mode at its end,
6341 process the else block too. */
6342 r = cxx_eval_constant_expression (ctx, arg, lval, non_constant_p,
6343 overflow_p, jump_target);
6344 /* It's possible that we found the label in the then block. But
6345 it could have been followed by another jumping statement, e.g.
6346 say we're looking for case 1:
6347 if (cond)
6348 {
6349 // skipped statements
6350 case 1:; // clears up *jump_target
6351 return 1; // and sets it to a RETURN_EXPR
6352 }
6353 else { ... }
6354 in which case we need not go looking to the else block.
6355 (goto is not allowed in a constexpr function.) */
6356 if (*jump_target == orig_jump)
6357 {
6358 arg = ((TREE_CODE (t) != IF_STMT || TREE_OPERAND (t, 2))
6359 ? TREE_OPERAND (t, 2) : void_node);
6360 r = cxx_eval_constant_expression (ctx, arg, lval, non_constant_p,
6361 overflow_p, jump_target);
6362 }
6363 break;
6364 }
6365 r = cxx_eval_conditional_expression (ctx, t, lval,
6366 non_constant_p, overflow_p,
6367 jump_target);
6368 break;
6369 case VEC_COND_EXPR:
6370 r = cxx_eval_vector_conditional_expression (ctx, t, non_constant_p,
6371 overflow_p);
6372 break;
6373
6374 case CONSTRUCTOR:
6375 if (TREE_CONSTANT (t) && reduced_constant_expression_p (t))
6376 {
6377 /* Don't re-process a constant CONSTRUCTOR, but do fold it to
6378 VECTOR_CST if applicable. */
6379 verify_constructor_flags (t);
6380 if (TREE_CONSTANT (t))
6381 return fold (t);
6382 }
6383 r = cxx_eval_bare_aggregate (ctx, t, lval,
6384 non_constant_p, overflow_p);
6385 break;
6386
6387 case VEC_INIT_EXPR:
6388 /* We can get this in a defaulted constructor for a class with a
6389 non-static data member of array type. Either the initializer will
6390 be NULL, meaning default-initialization, or it will be an lvalue
6391 or xvalue of the same type, meaning direct-initialization from the
6392 corresponding member. */
6393 r = cxx_eval_vec_init (ctx, t, lval,
6394 non_constant_p, overflow_p);
6395 break;
6396
6397 case VEC_PERM_EXPR:
6398 r = cxx_eval_trinary_expression (ctx, t, lval,
6399 non_constant_p, overflow_p);
6400 break;
6401
6402 case NOP_EXPR:
6403 if (REINTERPRET_CAST_P (t))
6404 {
6405 if (!ctx->quiet)
6406 error_at (loc,
6407 "%<reinterpret_cast%> is not a constant expression");
6408 *non_constant_p = true;
6409 return t;
6410 }
6411 /* FALLTHROUGH. */
6412 case CONVERT_EXPR:
6413 case VIEW_CONVERT_EXPR:
6414 case UNARY_PLUS_EXPR:
6415 {
6416 tree oldop = TREE_OPERAND (t, 0);
6417
6418 tree op = cxx_eval_constant_expression (ctx, oldop,
6419 lval,
6420 non_constant_p, overflow_p);
6421 if (*non_constant_p)
6422 return t;
6423 tree type = TREE_TYPE (t);
6424
6425 if (VOID_TYPE_P (type))
6426 return void_node;
6427
6428 /* [expr.const]: a conversion from type cv void* to a pointer-to-object
6429 type cannot be part of a core constant expression as a resolution to
6430 DR 1312. */
6431 if (integer_zerop (op) /* FIXME: Remove in GCC 12. */
6432 && TYPE_PTROB_P (type)
6433 && TYPE_PTR_P (TREE_TYPE (op))
6434 && VOID_TYPE_P (TREE_TYPE (TREE_TYPE (op)))
6435 /* Inside a call to std::construct_at or to
6436 std::allocator<T>::{,de}allocate, we permit casting from void*
6437 because that is compiler-generated code. */
6438 && !is_std_construct_at (ctx->call)
6439 && !is_std_allocator_allocate (ctx->call))
6440 {
6441 /* Likewise, don't error when casting from void* when OP is
6442 &heap uninit and similar. */
6443 tree sop = tree_strip_nop_conversions (op);
6444 if (TREE_CODE (sop) == ADDR_EXPR
6445 && VAR_P (TREE_OPERAND (sop, 0))
6446 && DECL_ARTIFICIAL (TREE_OPERAND (sop, 0)))
6447 /* OK */;
6448 else
6449 {
6450 if (!ctx->quiet)
6451 error_at (loc, "cast from %qT is not allowed",
6452 TREE_TYPE (op));
6453 *non_constant_p = true;
6454 return t;
6455 }
6456 }
6457
6458 if (TREE_CODE (op) == PTRMEM_CST && !TYPE_PTRMEM_P (type))
6459 op = cplus_expand_constant (op);
6460
6461 if (TREE_CODE (op) == PTRMEM_CST && tcode == NOP_EXPR)
6462 {
6463 if (!same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (op))
6464 && !can_convert_qual (type, op))
6465 op = cplus_expand_constant (op);
6466 return cp_fold_convert (type, op);
6467 }
6468
6469 if (INDIRECT_TYPE_P (type) && TREE_CODE (op) == INTEGER_CST)
6470 {
6471 if (integer_zerop (op))
6472 {
6473 if (TYPE_REF_P (type))
6474 {
6475 if (!ctx->quiet)
6476 error_at (loc, "dereferencing a null pointer");
6477 *non_constant_p = true;
6478 return t;
6479 }
6480 }
6481 else
6482 {
6483 /* This detects for example:
6484 reinterpret_cast<void*>(sizeof 0)
6485 */
6486 if (!ctx->quiet)
6487 error_at (loc, "%<reinterpret_cast<%T>(%E)%> is not "
6488 "a constant expression",
6489 type, op);
6490 *non_constant_p = true;
6491 return t;
6492 }
6493 }
6494
6495 if (INDIRECT_TYPE_P (type)
6496 && TREE_CODE (op) == NOP_EXPR
6497 && TREE_TYPE (op) == ptr_type_node
6498 && TREE_CODE (TREE_OPERAND (op, 0)) == ADDR_EXPR
6499 && VAR_P (TREE_OPERAND (TREE_OPERAND (op, 0), 0))
6500 && DECL_NAME (TREE_OPERAND (TREE_OPERAND (op, 0),
6501 0)) == heap_uninit_identifier)
6502 {
6503 tree var = TREE_OPERAND (TREE_OPERAND (op, 0), 0);
6504 tree var_size = TYPE_SIZE_UNIT (TREE_TYPE (var));
6505 tree elt_type = TREE_TYPE (type);
6506 tree cookie_size = NULL_TREE;
6507 tree arg_size = NULL_TREE;
6508 if (TREE_CODE (elt_type) == RECORD_TYPE
6509 && TYPE_NAME (elt_type) == heap_identifier)
6510 {
6511 tree fld1 = TYPE_FIELDS (elt_type);
6512 tree fld2 = DECL_CHAIN (fld1);
6513 elt_type = TREE_TYPE (TREE_TYPE (fld2));
6514 cookie_size = TYPE_SIZE_UNIT (TREE_TYPE (fld1));
6515 }
6516 DECL_NAME (var) = heap_identifier;
6517 /* For zero sized elt_type, try to recover how many outer_nelts
6518 it should have. */
6519 if ((cookie_size ? tree_int_cst_equal (var_size, cookie_size)
6520 : integer_zerop (var_size))
6521 && !int_size_in_bytes (elt_type)
6522 && TREE_CODE (oldop) == CALL_EXPR
6523 && call_expr_nargs (oldop) >= 1)
6524 if (tree fun = get_function_named_in_call (oldop))
6525 if (cxx_replaceable_global_alloc_fn (fun)
6526 && IDENTIFIER_NEW_OP_P (DECL_NAME (fun)))
6527 arg_size = CALL_EXPR_ARG (oldop, 0);
6528 TREE_TYPE (var)
6529 = build_new_constexpr_heap_type (ctx, elt_type, cookie_size,
6530 var_size, arg_size,
6531 non_constant_p, overflow_p);
6532 TREE_TYPE (TREE_OPERAND (op, 0))
6533 = build_pointer_type (TREE_TYPE (var));
6534 }
6535
6536 if (op == oldop && tcode != UNARY_PLUS_EXPR)
6537 /* We didn't fold at the top so we could check for ptr-int
6538 conversion. */
6539 return fold (t);
6540
6541 tree sop;
6542
6543 /* Handle an array's bounds having been deduced after we built
6544 the wrapping expression. */
6545 if (same_type_ignoring_tlq_and_bounds_p (type, TREE_TYPE (op)))
6546 r = op;
6547 else if (sop = tree_strip_nop_conversions (op),
6548 sop != op && (same_type_ignoring_tlq_and_bounds_p
6549 (type, TREE_TYPE (sop))))
6550 r = sop;
6551 else if (tcode == UNARY_PLUS_EXPR)
6552 r = fold_convert (TREE_TYPE (t), op);
6553 else
6554 r = fold_build1 (tcode, type, op);
6555
6556 /* Conversion of an out-of-range value has implementation-defined
6557 behavior; the language considers it different from arithmetic
6558 overflow, which is undefined. */
6559 if (TREE_OVERFLOW_P (r) && !TREE_OVERFLOW_P (op))
6560 TREE_OVERFLOW (r) = false;
6561 }
6562 break;
6563
6564 case EMPTY_CLASS_EXPR:
6565 /* This is good enough for a function argument that might not get
6566 used, and they can't do anything with it, so just return it. */
6567 return t;
6568
6569 case STATEMENT_LIST:
6570 new_ctx = *ctx;
6571 new_ctx.ctor = new_ctx.object = NULL_TREE;
6572 return cxx_eval_statement_list (&new_ctx, t,
6573 non_constant_p, overflow_p, jump_target);
6574
6575 case BIND_EXPR:
6576 return cxx_eval_constant_expression (ctx, BIND_EXPR_BODY (t),
6577 lval,
6578 non_constant_p, overflow_p,
6579 jump_target);
6580
6581 case PREINCREMENT_EXPR:
6582 case POSTINCREMENT_EXPR:
6583 case PREDECREMENT_EXPR:
6584 case POSTDECREMENT_EXPR:
6585 return cxx_eval_increment_expression (ctx, t,
6586 lval, non_constant_p, overflow_p);
6587
6588 case LAMBDA_EXPR:
6589 case NEW_EXPR:
6590 case VEC_NEW_EXPR:
6591 case DELETE_EXPR:
6592 case VEC_DELETE_EXPR:
6593 case THROW_EXPR:
6594 case MODOP_EXPR:
6595 /* GCC internal stuff. */
6596 case VA_ARG_EXPR:
6597 case NON_DEPENDENT_EXPR:
6598 case BASELINK:
6599 case OFFSET_REF:
6600 if (!ctx->quiet)
6601 error_at (loc, "expression %qE is not a constant expression", t);
6602 *non_constant_p = true;
6603 break;
6604
6605 case OBJ_TYPE_REF:
6606 /* Virtual function lookup. We don't need to do anything fancy. */
6607 return cxx_eval_constant_expression (ctx, OBJ_TYPE_REF_EXPR (t),
6608 lval, non_constant_p, overflow_p);
6609
6610 case PLACEHOLDER_EXPR:
6611 /* Use of the value or address of the current object. */
6612 if (tree ctor = lookup_placeholder (ctx, lval, TREE_TYPE (t)))
6613 {
6614 if (TREE_CODE (ctor) == CONSTRUCTOR)
6615 return ctor;
6616 else
6617 return cxx_eval_constant_expression (ctx, ctor, lval,
6618 non_constant_p, overflow_p);
6619 }
6620 /* A placeholder without a referent. We can get here when
6621 checking whether NSDMIs are noexcept, or in massage_init_elt;
6622 just say it's non-constant for now. */
6623 gcc_assert (ctx->quiet);
6624 *non_constant_p = true;
6625 break;
6626
6627 case EXIT_EXPR:
6628 {
6629 tree cond = TREE_OPERAND (t, 0);
6630 cond = cxx_eval_constant_expression (ctx, cond, /*lval*/false,
6631 non_constant_p, overflow_p);
6632 VERIFY_CONSTANT (cond);
6633 if (integer_nonzerop (cond))
6634 *jump_target = t;
6635 }
6636 break;
6637
6638 case GOTO_EXPR:
6639 *jump_target = TREE_OPERAND (t, 0);
6640 gcc_assert (breaks (jump_target) || continues (jump_target)
6641 /* Allow for jumping to a cdtor_label. */
6642 || returns (jump_target));
6643 break;
6644
6645 case LOOP_EXPR:
6646 case DO_STMT:
6647 case WHILE_STMT:
6648 case FOR_STMT:
6649 cxx_eval_loop_expr (ctx, t,
6650 non_constant_p, overflow_p, jump_target);
6651 break;
6652
6653 case SWITCH_EXPR:
6654 case SWITCH_STMT:
6655 cxx_eval_switch_expr (ctx, t,
6656 non_constant_p, overflow_p, jump_target);
6657 break;
6658
6659 case REQUIRES_EXPR:
6660 /* It's possible to get a requires-expression in a constant
6661 expression. For example:
6662
6663 template<typename T> concept bool C() {
6664 return requires (T t) { t; };
6665 }
6666
6667 template<typename T> requires !C<T>() void f(T);
6668
6669 Normalization leaves f with the associated constraint
6670 '!requires (T t) { ... }' which is not transformed into
6671 a constraint. */
6672 if (!processing_template_decl)
6673 return satisfy_constraint_expression (t);
6674 else
6675 *non_constant_p = true;
6676 return t;
6677
6678 case ANNOTATE_EXPR:
6679 r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),
6680 lval,
6681 non_constant_p, overflow_p,
6682 jump_target);
6683 break;
6684
6685 case USING_STMT:
6686 r = void_node;
6687 break;
6688
6689 case TEMPLATE_ID_EXPR:
6690 {
6691 /* We can evaluate template-id that refers to a concept only if
6692 the template arguments are non-dependent. */
6693 tree id = unpack_concept_check (t);
6694 tree tmpl = TREE_OPERAND (id, 0);
6695 if (!concept_definition_p (tmpl))
6696 internal_error ("unexpected template-id %qE", t);
6697
6698 if (function_concept_p (tmpl))
6699 {
6700 if (!ctx->quiet)
6701 error_at (cp_expr_loc_or_input_loc (t),
6702 "function concept must be called");
6703 r = error_mark_node;
6704 break;
6705 }
6706
6707 if (!processing_template_decl)
6708 r = evaluate_concept_check (t, tf_warning_or_error);
6709 else
6710 *non_constant_p = true;
6711
6712 break;
6713 }
6714
6715 case ASM_EXPR:
6716 if (!ctx->quiet)
6717 inline_asm_in_constexpr_error (loc);
6718 *non_constant_p = true;
6719 return t;
6720
6721 case OMP_PARALLEL:
6722 case OMP_TASK:
6723 case OMP_FOR:
6724 case OMP_SIMD:
6725 case OMP_DISTRIBUTE:
6726 case OMP_TASKLOOP:
6727 case OMP_LOOP:
6728 case OMP_TEAMS:
6729 case OMP_TARGET_DATA:
6730 case OMP_TARGET:
6731 case OMP_SECTIONS:
6732 case OMP_ORDERED:
6733 case OMP_CRITICAL:
6734 case OMP_SINGLE:
6735 case OMP_SCAN:
6736 case OMP_SECTION:
6737 case OMP_MASTER:
6738 case OMP_TASKGROUP:
6739 case OMP_TARGET_UPDATE:
6740 case OMP_TARGET_ENTER_DATA:
6741 case OMP_TARGET_EXIT_DATA:
6742 case OMP_ATOMIC:
6743 case OMP_ATOMIC_READ:
6744 case OMP_ATOMIC_CAPTURE_OLD:
6745 case OMP_ATOMIC_CAPTURE_NEW:
6746 case OMP_DEPOBJ:
6747 case OACC_PARALLEL:
6748 case OACC_KERNELS:
6749 case OACC_SERIAL:
6750 case OACC_DATA:
6751 case OACC_HOST_DATA:
6752 case OACC_LOOP:
6753 case OACC_CACHE:
6754 case OACC_DECLARE:
6755 case OACC_ENTER_DATA:
6756 case OACC_EXIT_DATA:
6757 case OACC_UPDATE:
6758 if (!ctx->quiet)
6759 error_at (EXPR_LOCATION (t),
6760 "statement is not a constant expression");
6761 *non_constant_p = true;
6762 break;
6763
6764 default:
6765 if (STATEMENT_CODE_P (TREE_CODE (t)))
6766 {
6767 /* This function doesn't know how to deal with pre-genericize
6768 statements; this can only happen with statement-expressions,
6769 so for now just fail. */
6770 if (!ctx->quiet)
6771 error_at (EXPR_LOCATION (t),
6772 "statement is not a constant expression");
6773 }
6774 else
6775 internal_error ("unexpected expression %qE of kind %s", t,
6776 get_tree_code_name (TREE_CODE (t)));
6777 *non_constant_p = true;
6778 break;
6779 }
6780
6781 if (r == error_mark_node)
6782 *non_constant_p = true;
6783
6784 if (*non_constant_p)
6785 return t;
6786 else
6787 return r;
6788 }
6789
6790 /* P0859: A function is needed for constant evaluation if it is a constexpr
6791 function that is named by an expression ([basic.def.odr]) that is
6792 potentially constant evaluated.
6793
6794 So we need to instantiate any constexpr functions mentioned by the
6795 expression even if the definition isn't needed for evaluating the
6796 expression. */
6797
6798 static tree
instantiate_cx_fn_r(tree * tp,int * walk_subtrees,void *)6799 instantiate_cx_fn_r (tree *tp, int *walk_subtrees, void */*data*/)
6800 {
6801 if (TREE_CODE (*tp) == FUNCTION_DECL
6802 && DECL_DECLARED_CONSTEXPR_P (*tp)
6803 && !DECL_INITIAL (*tp)
6804 && !trivial_fn_p (*tp)
6805 && DECL_TEMPLOID_INSTANTIATION (*tp))
6806 {
6807 ++function_depth;
6808 instantiate_decl (*tp, /*defer_ok*/false, /*expl_inst*/false);
6809 --function_depth;
6810 }
6811 else if (TREE_CODE (*tp) == CALL_EXPR
6812 || TREE_CODE (*tp) == AGGR_INIT_EXPR)
6813 {
6814 if (EXPR_HAS_LOCATION (*tp))
6815 input_location = EXPR_LOCATION (*tp);
6816 }
6817
6818 if (!EXPR_P (*tp))
6819 *walk_subtrees = 0;
6820
6821 return NULL_TREE;
6822 }
6823
6824 static void
instantiate_constexpr_fns(tree t)6825 instantiate_constexpr_fns (tree t)
6826 {
6827 location_t loc = input_location;
6828 cp_walk_tree_without_duplicates (&t, instantiate_cx_fn_r, NULL);
6829 input_location = loc;
6830 }
6831
6832 /* Look for heap variables in the expression *TP. */
6833
6834 static tree
find_heap_var_refs(tree * tp,int * walk_subtrees,void *)6835 find_heap_var_refs (tree *tp, int *walk_subtrees, void */*data*/)
6836 {
6837 if (VAR_P (*tp)
6838 && (DECL_NAME (*tp) == heap_uninit_identifier
6839 || DECL_NAME (*tp) == heap_identifier
6840 || DECL_NAME (*tp) == heap_deleted_identifier))
6841 return *tp;
6842
6843 if (TYPE_P (*tp))
6844 *walk_subtrees = 0;
6845 return NULL_TREE;
6846 }
6847
6848 /* Find immediate function decls in *TP if any. */
6849
6850 static tree
find_immediate_fndecl(tree * tp,int *,void *)6851 find_immediate_fndecl (tree *tp, int */*walk_subtrees*/, void */*data*/)
6852 {
6853 if (TREE_CODE (*tp) == FUNCTION_DECL && DECL_IMMEDIATE_FUNCTION_P (*tp))
6854 return *tp;
6855 return NULL_TREE;
6856 }
6857
6858 /* ALLOW_NON_CONSTANT is false if T is required to be a constant expression.
6859 STRICT has the same sense as for constant_value_1: true if we only allow
6860 conforming C++ constant expressions, or false if we want a constant value
6861 even if it doesn't conform.
6862 MANIFESTLY_CONST_EVAL is true if T is manifestly const-evaluated as
6863 per P0595 even when ALLOW_NON_CONSTANT is true.
6864 CONSTEXPR_DTOR is true when evaluating the dtor of a constexpr variable.
6865 OBJECT must be non-NULL in that case. */
6866
6867 static tree
6868 cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
6869 bool strict = true,
6870 bool manifestly_const_eval = false,
6871 bool constexpr_dtor = false,
6872 tree object = NULL_TREE,
6873 bool uid_sensitive = false)
6874 {
6875 auto_timevar time (TV_CONSTEXPR);
6876
6877 bool non_constant_p = false;
6878 bool overflow_p = false;
6879
6880 if (BRACE_ENCLOSED_INITIALIZER_P (t))
6881 {
6882 gcc_checking_assert (allow_non_constant);
6883 return t;
6884 }
6885
6886 constexpr_global_ctx global_ctx;
6887 constexpr_ctx ctx = { &global_ctx, NULL, NULL, NULL, NULL, NULL, NULL,
6888 allow_non_constant, strict,
6889 manifestly_const_eval || !allow_non_constant,
6890 uid_sensitive };
6891
6892 /* Turn off -frounding-math for manifestly constant evaluation. */
6893 warning_sentinel rm (flag_rounding_math, ctx.manifestly_const_eval);
6894 tree type = initialized_type (t);
6895 tree r = t;
6896 bool is_consteval = false;
6897 if (VOID_TYPE_P (type))
6898 {
6899 if (constexpr_dtor)
6900 /* Used for destructors of array elements. */
6901 type = TREE_TYPE (object);
6902 else
6903 {
6904 if (cxx_dialect < cxx2a)
6905 return t;
6906 if (TREE_CODE (t) != CALL_EXPR && TREE_CODE (t) != AGGR_INIT_EXPR)
6907 return t;
6908 /* Calls to immediate functions returning void need to be
6909 evaluated. */
6910 tree fndecl = cp_get_callee_fndecl_nofold (t);
6911 if (fndecl == NULL_TREE || !DECL_IMMEDIATE_FUNCTION_P (fndecl))
6912 return t;
6913 else
6914 is_consteval = true;
6915 }
6916 }
6917 else if (cxx_dialect >= cxx2a
6918 && (TREE_CODE (t) == CALL_EXPR
6919 || TREE_CODE (t) == AGGR_INIT_EXPR
6920 || TREE_CODE (t) == TARGET_EXPR))
6921 {
6922 /* For non-concept checks, determine if it is consteval. */
6923 if (!concept_check_p (t))
6924 {
6925 tree x = t;
6926 if (TREE_CODE (x) == TARGET_EXPR)
6927 x = TARGET_EXPR_INITIAL (x);
6928 tree fndecl = cp_get_callee_fndecl_nofold (x);
6929 if (fndecl && DECL_IMMEDIATE_FUNCTION_P (fndecl))
6930 is_consteval = true;
6931 }
6932 }
6933 if (AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type))
6934 {
6935 /* In C++14 an NSDMI can participate in aggregate initialization,
6936 and can refer to the address of the object being initialized, so
6937 we need to pass in the relevant VAR_DECL if we want to do the
6938 evaluation in a single pass. The evaluation will dynamically
6939 update ctx.values for the VAR_DECL. We use the same strategy
6940 for C++11 constexpr constructors that refer to the object being
6941 initialized. */
6942 if (constexpr_dtor)
6943 {
6944 gcc_assert (object && VAR_P (object));
6945 gcc_assert (DECL_DECLARED_CONSTEXPR_P (object));
6946 gcc_assert (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object));
6947 if (error_operand_p (DECL_INITIAL (object)))
6948 return t;
6949 ctx.ctor = unshare_expr (DECL_INITIAL (object));
6950 TREE_READONLY (ctx.ctor) = false;
6951 /* Temporarily force decl_really_constant_value to return false
6952 for it, we want to use ctx.ctor for the current value instead. */
6953 DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object) = false;
6954 }
6955 else
6956 {
6957 ctx.ctor = build_constructor (type, NULL);
6958 CONSTRUCTOR_NO_CLEARING (ctx.ctor) = true;
6959 }
6960 if (!object)
6961 {
6962 if (TREE_CODE (t) == TARGET_EXPR)
6963 object = TARGET_EXPR_SLOT (t);
6964 else if (TREE_CODE (t) == AGGR_INIT_EXPR)
6965 object = AGGR_INIT_EXPR_SLOT (t);
6966 }
6967 ctx.object = object;
6968 if (object)
6969 gcc_assert (same_type_ignoring_top_level_qualifiers_p
6970 (type, TREE_TYPE (object)));
6971 if (object && DECL_P (object))
6972 global_ctx.values.put (object, ctx.ctor);
6973 if (TREE_CODE (r) == TARGET_EXPR)
6974 /* Avoid creating another CONSTRUCTOR when we expand the
6975 TARGET_EXPR. */
6976 r = TARGET_EXPR_INITIAL (r);
6977 }
6978
6979 auto_vec<tree, 16> cleanups;
6980 global_ctx.cleanups = &cleanups;
6981
6982 if (!uid_sensitive)
6983 instantiate_constexpr_fns (r);
6984 r = cxx_eval_constant_expression (&ctx, r,
6985 false, &non_constant_p, &overflow_p);
6986
6987 if (!constexpr_dtor)
6988 verify_constant (r, allow_non_constant, &non_constant_p, &overflow_p);
6989 else
6990 DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object) = true;
6991
6992 unsigned int i;
6993 tree cleanup;
6994 /* Evaluate the cleanups. */
6995 FOR_EACH_VEC_ELT_REVERSE (cleanups, i, cleanup)
6996 cxx_eval_constant_expression (&ctx, cleanup, false,
6997 &non_constant_p, &overflow_p);
6998
6999 /* Mutable logic is a bit tricky: we want to allow initialization of
7000 constexpr variables with mutable members, but we can't copy those
7001 members to another constexpr variable. */
7002 if (TREE_CODE (r) == CONSTRUCTOR && CONSTRUCTOR_MUTABLE_POISON (r))
7003 {
7004 if (!allow_non_constant)
7005 error ("%qE is not a constant expression because it refers to "
7006 "mutable subobjects of %qT", t, type);
7007 non_constant_p = true;
7008 }
7009
7010 if (TREE_CODE (r) == CONSTRUCTOR && CONSTRUCTOR_NO_CLEARING (r))
7011 {
7012 if (!allow_non_constant)
7013 error ("%qE is not a constant expression because it refers to "
7014 "an incompletely initialized variable", t);
7015 TREE_CONSTANT (r) = false;
7016 non_constant_p = true;
7017 }
7018
7019 if (!global_ctx.heap_vars.is_empty ())
7020 {
7021 tree heap_var = cp_walk_tree_without_duplicates (&r, find_heap_var_refs,
7022 NULL);
7023 unsigned int i;
7024 if (heap_var)
7025 {
7026 if (!allow_non_constant && !non_constant_p)
7027 error_at (DECL_SOURCE_LOCATION (heap_var),
7028 "%qE is not a constant expression because it refers to "
7029 "a result of %<operator new%>", t);
7030 r = t;
7031 non_constant_p = true;
7032 }
7033 FOR_EACH_VEC_ELT (global_ctx.heap_vars, i, heap_var)
7034 {
7035 if (DECL_NAME (heap_var) != heap_deleted_identifier)
7036 {
7037 if (!allow_non_constant && !non_constant_p)
7038 error_at (DECL_SOURCE_LOCATION (heap_var),
7039 "%qE is not a constant expression because allocated "
7040 "storage has not been deallocated", t);
7041 r = t;
7042 non_constant_p = true;
7043 }
7044 varpool_node::get (heap_var)->remove ();
7045 }
7046 }
7047
7048 /* Check that immediate invocation does not return an expression referencing
7049 any immediate function decls. They need to be allowed while parsing
7050 immediate functions, but can't leak outside of them. */
7051 if (is_consteval
7052 && t != r
7053 && (current_function_decl == NULL_TREE
7054 || !DECL_IMMEDIATE_FUNCTION_P (current_function_decl)))
7055 if (tree immediate_fndecl
7056 = cp_walk_tree_without_duplicates (&r, find_immediate_fndecl,
7057 NULL))
7058 {
7059 if (!allow_non_constant && !non_constant_p)
7060 error_at (cp_expr_loc_or_input_loc (t),
7061 "immediate evaluation returns address of immediate "
7062 "function %qD", immediate_fndecl);
7063 r = t;
7064 non_constant_p = true;
7065 }
7066
7067 /* Technically we should check this for all subexpressions, but that
7068 runs into problems with our internal representation of pointer
7069 subtraction and the 5.19 rules are still in flux. */
7070 if (CONVERT_EXPR_CODE_P (TREE_CODE (r))
7071 && ARITHMETIC_TYPE_P (TREE_TYPE (r))
7072 && TREE_CODE (TREE_OPERAND (r, 0)) == ADDR_EXPR)
7073 {
7074 if (!allow_non_constant)
7075 error ("conversion from pointer type %qT "
7076 "to arithmetic type %qT in a constant expression",
7077 TREE_TYPE (TREE_OPERAND (r, 0)), TREE_TYPE (r));
7078 non_constant_p = true;
7079 }
7080
7081 if (!non_constant_p && overflow_p)
7082 non_constant_p = true;
7083
7084 /* Unshare the result. */
7085 bool should_unshare = true;
7086 if (r == t || (TREE_CODE (t) == TARGET_EXPR
7087 && TARGET_EXPR_INITIAL (t) == r))
7088 should_unshare = false;
7089
7090 if (non_constant_p && !allow_non_constant)
7091 return error_mark_node;
7092 else if (constexpr_dtor)
7093 return r;
7094 else if (non_constant_p && TREE_CONSTANT (r))
7095 {
7096 /* If __builtin_is_constant_evaluated () was evaluated to true
7097 and the result is not a valid constant expression, we need to
7098 punt. */
7099 if (manifestly_const_eval)
7100 return cxx_eval_outermost_constant_expr (t, true, strict,
7101 false, false, object);
7102 /* This isn't actually constant, so unset TREE_CONSTANT.
7103 Don't clear TREE_CONSTANT on ADDR_EXPR, as the middle-end requires
7104 it to be set if it is invariant address, even when it is not
7105 a valid C++ constant expression. Wrap it with a NOP_EXPR
7106 instead. */
7107 if (EXPR_P (r) && TREE_CODE (r) != ADDR_EXPR)
7108 r = copy_node (r);
7109 else if (TREE_CODE (r) == CONSTRUCTOR)
7110 r = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (r), r);
7111 else
7112 r = build_nop (TREE_TYPE (r), r);
7113 TREE_CONSTANT (r) = false;
7114 }
7115 else if (non_constant_p)
7116 return t;
7117
7118 if (should_unshare)
7119 r = unshare_expr (r);
7120
7121 if (TREE_CODE (r) == CONSTRUCTOR && CLASS_TYPE_P (TREE_TYPE (r)))
7122 {
7123 r = adjust_temp_type (type, r);
7124 if (TREE_CODE (t) == TARGET_EXPR
7125 && TARGET_EXPR_INITIAL (t) == r)
7126 return t;
7127 else if (TREE_CODE (t) == CONSTRUCTOR)
7128 ;
7129 else if (TREE_CODE (t) == TARGET_EXPR && TARGET_EXPR_CLEANUP (t))
7130 r = get_target_expr (r);
7131 else
7132 {
7133 r = get_target_expr_sfinae (r, tf_warning_or_error | tf_no_cleanup);
7134 TREE_CONSTANT (r) = true;
7135 }
7136 }
7137
7138 return r;
7139 }
7140
7141 /* If T represents a constant expression returns its reduced value.
7142 Otherwise return error_mark_node. If T is dependent, then
7143 return NULL. */
7144
7145 tree
cxx_constant_value(tree t,tree decl)7146 cxx_constant_value (tree t, tree decl)
7147 {
7148 return cxx_eval_outermost_constant_expr (t, false, true, true, false, decl);
7149 }
7150
7151 /* Like cxx_constant_value, but used for evaluation of constexpr destructors
7152 of constexpr variables. The actual initializer of DECL is not modified. */
7153
7154 void
cxx_constant_dtor(tree t,tree decl)7155 cxx_constant_dtor (tree t, tree decl)
7156 {
7157 cxx_eval_outermost_constant_expr (t, false, true, true, true, decl);
7158 }
7159
7160 /* Helper routine for fold_simple function. Either return simplified
7161 expression T, otherwise NULL_TREE.
7162 In contrast to cp_fully_fold, and to maybe_constant_value, we try to fold
7163 even if we are within template-declaration. So be careful on call, as in
7164 such case types can be undefined. */
7165
7166 static tree
fold_simple_1(tree t)7167 fold_simple_1 (tree t)
7168 {
7169 tree op1;
7170 enum tree_code code = TREE_CODE (t);
7171
7172 switch (code)
7173 {
7174 case INTEGER_CST:
7175 case REAL_CST:
7176 case VECTOR_CST:
7177 case FIXED_CST:
7178 case COMPLEX_CST:
7179 return t;
7180
7181 case SIZEOF_EXPR:
7182 return fold_sizeof_expr (t);
7183
7184 case ABS_EXPR:
7185 case ABSU_EXPR:
7186 case CONJ_EXPR:
7187 case REALPART_EXPR:
7188 case IMAGPART_EXPR:
7189 case NEGATE_EXPR:
7190 case BIT_NOT_EXPR:
7191 case TRUTH_NOT_EXPR:
7192 case NOP_EXPR:
7193 case VIEW_CONVERT_EXPR:
7194 case CONVERT_EXPR:
7195 case FLOAT_EXPR:
7196 case FIX_TRUNC_EXPR:
7197 case FIXED_CONVERT_EXPR:
7198 case ADDR_SPACE_CONVERT_EXPR:
7199
7200 op1 = TREE_OPERAND (t, 0);
7201
7202 t = const_unop (code, TREE_TYPE (t), op1);
7203 if (!t)
7204 return NULL_TREE;
7205
7206 if (CONVERT_EXPR_CODE_P (code)
7207 && TREE_OVERFLOW_P (t) && !TREE_OVERFLOW_P (op1))
7208 TREE_OVERFLOW (t) = false;
7209 return t;
7210
7211 default:
7212 return NULL_TREE;
7213 }
7214 }
7215
7216 /* If T is a simple constant expression, returns its simplified value.
7217 Otherwise returns T. In contrast to maybe_constant_value we
7218 simplify only few operations on constant-expressions, and we don't
7219 try to simplify constexpressions. */
7220
7221 tree
fold_simple(tree t)7222 fold_simple (tree t)
7223 {
7224 if (processing_template_decl)
7225 return t;
7226
7227 tree r = fold_simple_1 (t);
7228 if (r)
7229 return r;
7230
7231 return t;
7232 }
7233
7234 /* If T is a constant expression, returns its reduced value.
7235 Otherwise, if T does not have TREE_CONSTANT set, returns T.
7236 Otherwise, returns a version of T without TREE_CONSTANT.
7237 MANIFESTLY_CONST_EVAL is true if T is manifestly const-evaluated
7238 as per P0595. UID_SENSITIVE is true if we can't do anything that
7239 would affect DECL_UID ordering. */
7240
7241 static GTY((deletable)) hash_map<tree, tree> *cv_cache;
7242
7243 tree
maybe_constant_value(tree t,tree decl,bool manifestly_const_eval,bool uid_sensitive)7244 maybe_constant_value (tree t, tree decl, bool manifestly_const_eval,
7245 bool uid_sensitive)
7246 {
7247 tree r;
7248
7249 if (!is_nondependent_constant_expression (t))
7250 {
7251 if (TREE_OVERFLOW_P (t))
7252 {
7253 t = build_nop (TREE_TYPE (t), t);
7254 TREE_CONSTANT (t) = false;
7255 }
7256 return t;
7257 }
7258 else if (CONSTANT_CLASS_P (t))
7259 /* No caching or evaluation needed. */
7260 return t;
7261
7262 if (manifestly_const_eval)
7263 return cxx_eval_outermost_constant_expr (t, true, true, true, false,
7264 decl, uid_sensitive);
7265
7266 if (cv_cache == NULL)
7267 cv_cache = hash_map<tree, tree>::create_ggc (101);
7268 if (tree *cached = cv_cache->get (t))
7269 {
7270 r = *cached;
7271 if (r != t)
7272 {
7273 r = break_out_target_exprs (r, /*clear_loc*/true);
7274 protected_set_expr_location (r, EXPR_LOCATION (t));
7275 }
7276 return r;
7277 }
7278
7279 r = cxx_eval_outermost_constant_expr (t, true, true, false, false,
7280 decl, uid_sensitive);
7281 gcc_checking_assert (r == t
7282 || CONVERT_EXPR_P (t)
7283 || TREE_CODE (t) == VIEW_CONVERT_EXPR
7284 || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
7285 || !cp_tree_equal (r, t));
7286 cv_cache->put (t, r);
7287 return r;
7288 }
7289
7290 /* Dispose of the whole CV_CACHE. */
7291
7292 static void
clear_cv_cache(void)7293 clear_cv_cache (void)
7294 {
7295 if (cv_cache != NULL)
7296 cv_cache->empty ();
7297 }
7298
7299 /* Dispose of the whole CV_CACHE, FOLD_CACHE, and satisfaction caches. */
7300
7301 void
clear_cv_and_fold_caches(bool sat)7302 clear_cv_and_fold_caches (bool sat /*= true*/)
7303 {
7304 clear_cv_cache ();
7305 clear_fold_cache ();
7306 if (sat)
7307 clear_satisfaction_cache ();
7308 }
7309
7310 /* Internal function handling expressions in templates for
7311 fold_non_dependent_expr and fold_non_dependent_init.
7312
7313 If we're in a template, but T isn't value dependent, simplify
7314 it. We're supposed to treat:
7315
7316 template <typename T> void f(T[1 + 1]);
7317 template <typename T> void f(T[2]);
7318
7319 as two declarations of the same function, for example. */
7320
7321 static tree
fold_non_dependent_expr_template(tree t,tsubst_flags_t complain,bool manifestly_const_eval,tree object)7322 fold_non_dependent_expr_template (tree t, tsubst_flags_t complain,
7323 bool manifestly_const_eval,
7324 tree object)
7325 {
7326 gcc_assert (processing_template_decl);
7327
7328 if (is_nondependent_constant_expression (t))
7329 {
7330 processing_template_decl_sentinel s;
7331 t = instantiate_non_dependent_expr_internal (t, complain);
7332
7333 if (type_unknown_p (t) || BRACE_ENCLOSED_INITIALIZER_P (t))
7334 {
7335 if (TREE_OVERFLOW_P (t))
7336 {
7337 t = build_nop (TREE_TYPE (t), t);
7338 TREE_CONSTANT (t) = false;
7339 }
7340 return t;
7341 }
7342
7343 tree r = cxx_eval_outermost_constant_expr (t, true, true,
7344 manifestly_const_eval,
7345 false, object);
7346 /* cp_tree_equal looks through NOPs, so allow them. */
7347 gcc_checking_assert (r == t
7348 || CONVERT_EXPR_P (t)
7349 || TREE_CODE (t) == VIEW_CONVERT_EXPR
7350 || (TREE_CONSTANT (t) && !TREE_CONSTANT (r))
7351 || !cp_tree_equal (r, t));
7352 return r;
7353 }
7354 else if (TREE_OVERFLOW_P (t))
7355 {
7356 t = build_nop (TREE_TYPE (t), t);
7357 TREE_CONSTANT (t) = false;
7358 }
7359
7360 return t;
7361 }
7362
7363 /* Like maybe_constant_value but first fully instantiate the argument.
7364
7365 Note: this is equivalent to instantiate_non_dependent_expr_sfinae
7366 (t, complain) followed by maybe_constant_value but is more efficient,
7367 because it calls instantiation_dependent_expression_p and
7368 potential_constant_expression at most once.
7369 The manifestly_const_eval argument is passed to maybe_constant_value.
7370
7371 Callers should generally pass their active complain, or if they are in a
7372 non-template, diagnosing context, they can use the default of
7373 tf_warning_or_error. Callers that might be within a template context, don't
7374 have a complain parameter, and aren't going to remember the result for long
7375 (e.g. null_ptr_cst_p), can pass tf_none and deal with error_mark_node
7376 appropriately. */
7377
7378 tree
fold_non_dependent_expr(tree t,tsubst_flags_t complain,bool manifestly_const_eval,tree object)7379 fold_non_dependent_expr (tree t,
7380 tsubst_flags_t complain /* = tf_warning_or_error */,
7381 bool manifestly_const_eval /* = false */,
7382 tree object /* = NULL_TREE */)
7383 {
7384 if (t == NULL_TREE)
7385 return NULL_TREE;
7386
7387 if (processing_template_decl)
7388 return fold_non_dependent_expr_template (t, complain,
7389 manifestly_const_eval, object);
7390
7391 return maybe_constant_value (t, object, manifestly_const_eval);
7392 }
7393
7394 /* Like fold_non_dependent_expr, but if EXPR couldn't be folded to a constant,
7395 return the original expression. */
7396
7397 tree
maybe_fold_non_dependent_expr(tree expr,tsubst_flags_t complain)7398 maybe_fold_non_dependent_expr (tree expr,
7399 tsubst_flags_t complain/*=tf_warning_or_error*/)
7400 {
7401 tree t = fold_non_dependent_expr (expr, complain);
7402 if (t && TREE_CONSTANT (t))
7403 return t;
7404
7405 return expr;
7406 }
7407
7408 /* Like maybe_constant_init but first fully instantiate the argument. */
7409
7410 tree
fold_non_dependent_init(tree t,tsubst_flags_t complain,bool manifestly_const_eval,tree object)7411 fold_non_dependent_init (tree t,
7412 tsubst_flags_t complain /*=tf_warning_or_error*/,
7413 bool manifestly_const_eval /*=false*/,
7414 tree object /* = NULL_TREE */)
7415 {
7416 if (t == NULL_TREE)
7417 return NULL_TREE;
7418
7419 if (processing_template_decl)
7420 {
7421 t = fold_non_dependent_expr_template (t, complain,
7422 manifestly_const_eval, object);
7423 /* maybe_constant_init does this stripping, so do it here too. */
7424 if (TREE_CODE (t) == TARGET_EXPR)
7425 {
7426 tree init = TARGET_EXPR_INITIAL (t);
7427 if (TREE_CODE (init) == CONSTRUCTOR)
7428 t = init;
7429 }
7430 return t;
7431 }
7432
7433 return maybe_constant_init (t, object, manifestly_const_eval);
7434 }
7435
7436 /* Like maybe_constant_value, but returns a CONSTRUCTOR directly, rather
7437 than wrapped in a TARGET_EXPR.
7438 ALLOW_NON_CONSTANT is false if T is required to be a constant expression.
7439 MANIFESTLY_CONST_EVAL is true if T is manifestly const-evaluated as
7440 per P0595 even when ALLOW_NON_CONSTANT is true. */
7441
7442 static tree
maybe_constant_init_1(tree t,tree decl,bool allow_non_constant,bool manifestly_const_eval)7443 maybe_constant_init_1 (tree t, tree decl, bool allow_non_constant,
7444 bool manifestly_const_eval)
7445 {
7446 if (!t)
7447 return t;
7448 if (TREE_CODE (t) == EXPR_STMT)
7449 t = TREE_OPERAND (t, 0);
7450 if (TREE_CODE (t) == CONVERT_EXPR
7451 && VOID_TYPE_P (TREE_TYPE (t)))
7452 t = TREE_OPERAND (t, 0);
7453 if (TREE_CODE (t) == INIT_EXPR)
7454 t = TREE_OPERAND (t, 1);
7455 if (TREE_CODE (t) == TARGET_EXPR)
7456 t = TARGET_EXPR_INITIAL (t);
7457 if (!is_nondependent_static_init_expression (t))
7458 /* Don't try to evaluate it. */;
7459 else if (CONSTANT_CLASS_P (t) && allow_non_constant)
7460 /* No evaluation needed. */;
7461 else
7462 t = cxx_eval_outermost_constant_expr (t, allow_non_constant,
7463 /*strict*/false,
7464 manifestly_const_eval, false, decl);
7465 if (TREE_CODE (t) == TARGET_EXPR)
7466 {
7467 tree init = TARGET_EXPR_INITIAL (t);
7468 if (TREE_CODE (init) == CONSTRUCTOR)
7469 t = init;
7470 }
7471 return t;
7472 }
7473
7474 /* Wrapper for maybe_constant_init_1 which permits non constants. */
7475
7476 tree
maybe_constant_init(tree t,tree decl,bool manifestly_const_eval)7477 maybe_constant_init (tree t, tree decl, bool manifestly_const_eval)
7478 {
7479 return maybe_constant_init_1 (t, decl, true, manifestly_const_eval);
7480 }
7481
7482 /* Wrapper for maybe_constant_init_1 which does not permit non constants. */
7483
7484 tree
cxx_constant_init(tree t,tree decl)7485 cxx_constant_init (tree t, tree decl)
7486 {
7487 return maybe_constant_init_1 (t, decl, false, true);
7488 }
7489
7490 #if 0
7491 /* FIXME see ADDR_EXPR section in potential_constant_expression_1. */
7492 /* Return true if the object referred to by REF has automatic or thread
7493 local storage. */
7494
7495 enum { ck_ok, ck_bad, ck_unknown };
7496 static int
7497 check_automatic_or_tls (tree ref)
7498 {
7499 machine_mode mode;
7500 poly_int64 bitsize, bitpos;
7501 tree offset;
7502 int volatilep = 0, unsignedp = 0;
7503 tree decl = get_inner_reference (ref, &bitsize, &bitpos, &offset,
7504 &mode, &unsignedp, &volatilep, false);
7505 duration_kind dk;
7506
7507 /* If there isn't a decl in the middle, we don't know the linkage here,
7508 and this isn't a constant expression anyway. */
7509 if (!DECL_P (decl))
7510 return ck_unknown;
7511 dk = decl_storage_duration (decl);
7512 return (dk == dk_auto || dk == dk_thread) ? ck_bad : ck_ok;
7513 }
7514 #endif
7515
7516 /* Data structure for passing data from potential_constant_expression_1
7517 to check_for_return_continue via cp_walk_tree. */
7518 struct check_for_return_continue_data {
7519 hash_set<tree> *pset;
7520 tree continue_stmt;
7521 tree break_stmt;
7522 };
7523
7524 /* Helper function for potential_constant_expression_1 SWITCH_STMT handling,
7525 called through cp_walk_tree. Return the first RETURN_EXPR found, or note
7526 the first CONTINUE_STMT and/or BREAK_STMT if RETURN_EXPR is not found. */
7527 static tree
check_for_return_continue(tree * tp,int * walk_subtrees,void * data)7528 check_for_return_continue (tree *tp, int *walk_subtrees, void *data)
7529 {
7530 tree t = *tp, s, b;
7531 check_for_return_continue_data *d = (check_for_return_continue_data *) data;
7532 switch (TREE_CODE (t))
7533 {
7534 case RETURN_EXPR:
7535 return t;
7536
7537 case CONTINUE_STMT:
7538 if (d->continue_stmt == NULL_TREE)
7539 d->continue_stmt = t;
7540 break;
7541
7542 case BREAK_STMT:
7543 if (d->break_stmt == NULL_TREE)
7544 d->break_stmt = t;
7545 break;
7546
7547 #define RECUR(x) \
7548 if (tree r = cp_walk_tree (&x, check_for_return_continue, data, \
7549 d->pset)) \
7550 return r
7551
7552 /* For loops, walk subtrees manually, so that continue stmts found
7553 inside of the bodies of the loops are ignored. */
7554 case DO_STMT:
7555 *walk_subtrees = 0;
7556 RECUR (DO_COND (t));
7557 s = d->continue_stmt;
7558 b = d->break_stmt;
7559 RECUR (DO_BODY (t));
7560 d->continue_stmt = s;
7561 d->break_stmt = b;
7562 break;
7563
7564 case WHILE_STMT:
7565 *walk_subtrees = 0;
7566 RECUR (WHILE_COND (t));
7567 s = d->continue_stmt;
7568 b = d->break_stmt;
7569 RECUR (WHILE_BODY (t));
7570 d->continue_stmt = s;
7571 d->break_stmt = b;
7572 break;
7573
7574 case FOR_STMT:
7575 *walk_subtrees = 0;
7576 RECUR (FOR_INIT_STMT (t));
7577 RECUR (FOR_COND (t));
7578 RECUR (FOR_EXPR (t));
7579 s = d->continue_stmt;
7580 b = d->break_stmt;
7581 RECUR (FOR_BODY (t));
7582 d->continue_stmt = s;
7583 d->break_stmt = b;
7584 break;
7585
7586 case RANGE_FOR_STMT:
7587 *walk_subtrees = 0;
7588 RECUR (RANGE_FOR_EXPR (t));
7589 s = d->continue_stmt;
7590 b = d->break_stmt;
7591 RECUR (RANGE_FOR_BODY (t));
7592 d->continue_stmt = s;
7593 d->break_stmt = b;
7594 break;
7595
7596 case SWITCH_STMT:
7597 *walk_subtrees = 0;
7598 RECUR (SWITCH_STMT_COND (t));
7599 b = d->break_stmt;
7600 RECUR (SWITCH_STMT_BODY (t));
7601 d->break_stmt = b;
7602 break;
7603 #undef RECUR
7604
7605 case STATEMENT_LIST:
7606 case CONSTRUCTOR:
7607 break;
7608
7609 default:
7610 if (!EXPR_P (t))
7611 *walk_subtrees = 0;
7612 break;
7613 }
7614
7615 return NULL_TREE;
7616 }
7617
7618 /* Return true if T denotes a potentially constant expression. Issue
7619 diagnostic as appropriate under control of FLAGS. If WANT_RVAL is true,
7620 an lvalue-rvalue conversion is implied. If NOW is true, we want to
7621 consider the expression in the current context, independent of constexpr
7622 substitution.
7623
7624 C++0x [expr.const] used to say
7625
7626 6 An expression is a potential constant expression if it is
7627 a constant expression where all occurrences of function
7628 parameters are replaced by arbitrary constant expressions
7629 of the appropriate type.
7630
7631 2 A conditional expression is a constant expression unless it
7632 involves one of the following as a potentially evaluated
7633 subexpression (3.2), but subexpressions of logical AND (5.14),
7634 logical OR (5.15), and conditional (5.16) operations that are
7635 not evaluated are not considered. */
7636
7637 static bool
potential_constant_expression_1(tree t,bool want_rval,bool strict,bool now,tsubst_flags_t flags,tree * jump_target)7638 potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
7639 tsubst_flags_t flags, tree *jump_target)
7640 {
7641 #define RECUR(T,RV) \
7642 potential_constant_expression_1 ((T), (RV), strict, now, flags, jump_target)
7643
7644 enum { any = false, rval = true };
7645 int i;
7646 tree tmp;
7647
7648 if (t == error_mark_node)
7649 return false;
7650 if (t == NULL_TREE)
7651 return true;
7652 location_t loc = cp_expr_loc_or_input_loc (t);
7653
7654 if (*jump_target)
7655 /* If we are jumping, ignore everything. This is simpler than the
7656 cxx_eval_constant_expression handling because we only need to be
7657 conservatively correct, and we don't necessarily have a constant value
7658 available, so we don't bother with switch tracking. */
7659 return true;
7660
7661 if (TREE_THIS_VOLATILE (t) && want_rval)
7662 {
7663 if (flags & tf_error)
7664 error_at (loc, "lvalue-to-rvalue conversion of a volatile lvalue "
7665 "%qE with type %qT", t, TREE_TYPE (t));
7666 return false;
7667 }
7668 if (CONSTANT_CLASS_P (t))
7669 return true;
7670 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPED)
7671 && TREE_TYPE (t) == error_mark_node)
7672 return false;
7673
7674 switch (TREE_CODE (t))
7675 {
7676 case FUNCTION_DECL:
7677 case BASELINK:
7678 case TEMPLATE_DECL:
7679 case OVERLOAD:
7680 case TEMPLATE_ID_EXPR:
7681 case LABEL_DECL:
7682 case LABEL_EXPR:
7683 case CASE_LABEL_EXPR:
7684 case PREDICT_EXPR:
7685 case CONST_DECL:
7686 case SIZEOF_EXPR:
7687 case ALIGNOF_EXPR:
7688 case OFFSETOF_EXPR:
7689 case NOEXCEPT_EXPR:
7690 case TEMPLATE_PARM_INDEX:
7691 case TRAIT_EXPR:
7692 case IDENTIFIER_NODE:
7693 case USERDEF_LITERAL:
7694 /* We can see a FIELD_DECL in a pointer-to-member expression. */
7695 case FIELD_DECL:
7696 case RESULT_DECL:
7697 case USING_DECL:
7698 case USING_STMT:
7699 case PLACEHOLDER_EXPR:
7700 case REQUIRES_EXPR:
7701 case STATIC_ASSERT:
7702 case DEBUG_BEGIN_STMT:
7703 return true;
7704
7705 case RETURN_EXPR:
7706 if (!RECUR (TREE_OPERAND (t, 0), any))
7707 return false;
7708 /* FALLTHROUGH */
7709
7710 case BREAK_STMT:
7711 case CONTINUE_STMT:
7712 *jump_target = t;
7713 return true;
7714
7715 case PARM_DECL:
7716 if (now && want_rval)
7717 {
7718 tree type = TREE_TYPE (t);
7719 if (dependent_type_p (type)
7720 || is_really_empty_class (type, /*ignore_vptr*/false))
7721 /* An empty class has no data to read. */
7722 return true;
7723 if (flags & tf_error)
7724 error ("%qE is not a constant expression", t);
7725 return false;
7726 }
7727 return true;
7728
7729 case AGGR_INIT_EXPR:
7730 case CALL_EXPR:
7731 /* -- an invocation of a function other than a constexpr function
7732 or a constexpr constructor. */
7733 {
7734 tree fun = get_function_named_in_call (t);
7735 const int nargs = call_expr_nargs (t);
7736 i = 0;
7737
7738 if (fun == NULL_TREE)
7739 {
7740 /* Reset to allow the function to continue past the end
7741 of the block below. Otherwise return early. */
7742 bool bail = true;
7743
7744 if (TREE_CODE (t) == CALL_EXPR
7745 && CALL_EXPR_FN (t) == NULL_TREE)
7746 switch (CALL_EXPR_IFN (t))
7747 {
7748 /* These should be ignored, they are optimized away from
7749 constexpr functions. */
7750 case IFN_UBSAN_NULL:
7751 case IFN_UBSAN_BOUNDS:
7752 case IFN_UBSAN_VPTR:
7753 case IFN_FALLTHROUGH:
7754 return true;
7755
7756 case IFN_ADD_OVERFLOW:
7757 case IFN_SUB_OVERFLOW:
7758 case IFN_MUL_OVERFLOW:
7759 case IFN_LAUNDER:
7760 case IFN_VEC_CONVERT:
7761 bail = false;
7762 break;
7763
7764 default:
7765 break;
7766 }
7767
7768 if (bail)
7769 {
7770 /* fold_call_expr can't do anything with IFN calls. */
7771 if (flags & tf_error)
7772 error_at (loc, "call to internal function %qE", t);
7773 return false;
7774 }
7775 }
7776
7777 if (fun && is_overloaded_fn (fun))
7778 {
7779 if (TREE_CODE (fun) == FUNCTION_DECL)
7780 {
7781 if (builtin_valid_in_constant_expr_p (fun))
7782 return true;
7783 if (!DECL_DECLARED_CONSTEXPR_P (fun)
7784 /* Allow any built-in function; if the expansion
7785 isn't constant, we'll deal with that then. */
7786 && !fndecl_built_in_p (fun)
7787 /* In C++2a, replaceable global allocation functions
7788 are constant expressions. */
7789 && (!cxx_replaceable_global_alloc_fn (fun)
7790 || TREE_CODE (t) != CALL_EXPR
7791 || (!CALL_FROM_NEW_OR_DELETE_P (t)
7792 && (current_function_decl == NULL_TREE
7793 || !is_std_allocator_allocate
7794 (current_function_decl))))
7795 /* Allow placement new in std::construct_at. */
7796 && (!cxx_placement_new_fn (fun)
7797 || TREE_CODE (t) != CALL_EXPR
7798 || current_function_decl == NULL_TREE
7799 || !is_std_construct_at (current_function_decl))
7800 && !cxx_dynamic_cast_fn_p (fun))
7801 {
7802 if (flags & tf_error)
7803 {
7804 error_at (loc, "call to non-%<constexpr%> function %qD",
7805 fun);
7806 explain_invalid_constexpr_fn (fun);
7807 }
7808 return false;
7809 }
7810 /* A call to a non-static member function takes the address
7811 of the object as the first argument. But in a constant
7812 expression the address will be folded away, so look
7813 through it now. */
7814 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun)
7815 && !DECL_CONSTRUCTOR_P (fun))
7816 {
7817 tree x = get_nth_callarg (t, 0);
7818 if (is_this_parameter (x))
7819 return true;
7820 /* Don't require an immediately constant value, as
7821 constexpr substitution might not use the value. */
7822 bool sub_now = false;
7823 if (!potential_constant_expression_1 (x, rval, strict,
7824 sub_now, flags,
7825 jump_target))
7826 return false;
7827 i = 1;
7828 }
7829 }
7830 else
7831 {
7832 if (!RECUR (fun, true))
7833 return false;
7834 fun = get_first_fn (fun);
7835 }
7836 /* Skip initial arguments to base constructors. */
7837 if (DECL_BASE_CONSTRUCTOR_P (fun))
7838 i = num_artificial_parms_for (fun);
7839 fun = DECL_ORIGIN (fun);
7840 }
7841 else if (fun)
7842 {
7843 if (RECUR (fun, rval))
7844 /* Might end up being a constant function pointer. */;
7845 else
7846 return false;
7847 }
7848 for (; i < nargs; ++i)
7849 {
7850 tree x = get_nth_callarg (t, i);
7851 /* In a template, reference arguments haven't been converted to
7852 REFERENCE_TYPE and we might not even know if the parameter
7853 is a reference, so accept lvalue constants too. */
7854 bool rv = processing_template_decl ? any : rval;
7855 /* Don't require an immediately constant value, as constexpr
7856 substitution might not use the value of the argument. */
7857 bool sub_now = false;
7858 if (!potential_constant_expression_1 (x, rv, strict,
7859 sub_now, flags, jump_target))
7860 return false;
7861 }
7862 return true;
7863 }
7864
7865 case NON_LVALUE_EXPR:
7866 /* -- an lvalue-to-rvalue conversion (4.1) unless it is applied to
7867 -- an lvalue of integral type that refers to a non-volatile
7868 const variable or static data member initialized with
7869 constant expressions, or
7870
7871 -- an lvalue of literal type that refers to non-volatile
7872 object defined with constexpr, or that refers to a
7873 sub-object of such an object; */
7874 return RECUR (TREE_OPERAND (t, 0), rval);
7875
7876 case VAR_DECL:
7877 if (DECL_HAS_VALUE_EXPR_P (t))
7878 {
7879 if (now && is_normal_capture_proxy (t))
7880 {
7881 /* -- in a lambda-expression, a reference to this or to a
7882 variable with automatic storage duration defined outside that
7883 lambda-expression, where the reference would be an
7884 odr-use. */
7885
7886 if (want_rval)
7887 /* Since we're doing an lvalue-rvalue conversion, this might
7888 not be an odr-use, so evaluate the variable directly. */
7889 return RECUR (DECL_CAPTURED_VARIABLE (t), rval);
7890
7891 if (flags & tf_error)
7892 {
7893 tree cap = DECL_CAPTURED_VARIABLE (t);
7894 error ("lambda capture of %qE is not a constant expression",
7895 cap);
7896 if (decl_constant_var_p (cap))
7897 inform (input_location, "because it is used as a glvalue");
7898 }
7899 return false;
7900 }
7901 return RECUR (DECL_VALUE_EXPR (t), rval);
7902 }
7903 if (want_rval
7904 && !var_in_maybe_constexpr_fn (t)
7905 && !type_dependent_expression_p (t)
7906 && !decl_maybe_constant_var_p (t)
7907 && (strict
7908 || !CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (t))
7909 || (DECL_INITIAL (t)
7910 && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (t)))
7911 && COMPLETE_TYPE_P (TREE_TYPE (t))
7912 && !is_really_empty_class (TREE_TYPE (t), /*ignore_vptr*/false))
7913 {
7914 if (flags & tf_error)
7915 non_const_var_error (loc, t);
7916 return false;
7917 }
7918 return true;
7919
7920 case NOP_EXPR:
7921 if (REINTERPRET_CAST_P (t))
7922 {
7923 if (flags & tf_error)
7924 error_at (loc, "%<reinterpret_cast%> is not a constant expression");
7925 return false;
7926 }
7927 /* FALLTHRU */
7928 case CONVERT_EXPR:
7929 case VIEW_CONVERT_EXPR:
7930 /* -- a reinterpret_cast. FIXME not implemented, and this rule
7931 may change to something more specific to type-punning (DR 1312). */
7932 {
7933 tree from = TREE_OPERAND (t, 0);
7934 if (location_wrapper_p (t))
7935 return (RECUR (from, want_rval));
7936 if (INDIRECT_TYPE_P (TREE_TYPE (t)))
7937 {
7938 STRIP_ANY_LOCATION_WRAPPER (from);
7939 if (TREE_CODE (from) == INTEGER_CST
7940 && !integer_zerop (from))
7941 {
7942 if (flags & tf_error)
7943 error_at (loc,
7944 "%<reinterpret_cast%> from integer to pointer");
7945 return false;
7946 }
7947 }
7948 return (RECUR (from, TREE_CODE (t) != VIEW_CONVERT_EXPR));
7949 }
7950
7951 case ADDRESSOF_EXPR:
7952 /* This is like ADDR_EXPR, except it won't form pointer-to-member. */
7953 t = TREE_OPERAND (t, 0);
7954 goto handle_addr_expr;
7955
7956 case ADDR_EXPR:
7957 /* -- a unary operator & that is applied to an lvalue that
7958 designates an object with thread or automatic storage
7959 duration; */
7960 t = TREE_OPERAND (t, 0);
7961
7962 if (TREE_CODE (t) == OFFSET_REF && PTRMEM_OK_P (t))
7963 /* A pointer-to-member constant. */
7964 return true;
7965
7966 handle_addr_expr:
7967 #if 0
7968 /* FIXME adjust when issue 1197 is fully resolved. For now don't do
7969 any checking here, as we might dereference the pointer later. If
7970 we remove this code, also remove check_automatic_or_tls. */
7971 i = check_automatic_or_tls (t);
7972 if (i == ck_ok)
7973 return true;
7974 if (i == ck_bad)
7975 {
7976 if (flags & tf_error)
7977 error ("address-of an object %qE with thread local or "
7978 "automatic storage is not a constant expression", t);
7979 return false;
7980 }
7981 #endif
7982 return RECUR (t, any);
7983
7984 case COMPONENT_REF:
7985 case ARROW_EXPR:
7986 case OFFSET_REF:
7987 /* -- a class member access unless its postfix-expression is
7988 of literal type or of pointer to literal type. */
7989 /* This test would be redundant, as it follows from the
7990 postfix-expression being a potential constant expression. */
7991 if (type_unknown_p (t))
7992 return true;
7993 if (is_overloaded_fn (t))
7994 /* In a template, a COMPONENT_REF of a function expresses ob.fn(),
7995 which uses ob as an lvalue. */
7996 want_rval = false;
7997 gcc_fallthrough ();
7998
7999 case REALPART_EXPR:
8000 case IMAGPART_EXPR:
8001 case BIT_FIELD_REF:
8002 return RECUR (TREE_OPERAND (t, 0), want_rval);
8003
8004 case EXPR_PACK_EXPANSION:
8005 return RECUR (PACK_EXPANSION_PATTERN (t), want_rval);
8006
8007 case INDIRECT_REF:
8008 {
8009 tree x = TREE_OPERAND (t, 0);
8010 STRIP_NOPS (x);
8011 if (is_this_parameter (x) && !is_capture_proxy (x))
8012 {
8013 if (!var_in_maybe_constexpr_fn (x))
8014 {
8015 if (flags & tf_error)
8016 error_at (loc, "use of %<this%> in a constant expression");
8017 return false;
8018 }
8019 return true;
8020 }
8021 return RECUR (x, rval);
8022 }
8023
8024 case STATEMENT_LIST:
8025 {
8026 tree_stmt_iterator i;
8027 for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i))
8028 {
8029 if (!RECUR (tsi_stmt (i), any))
8030 return false;
8031 }
8032 return true;
8033 }
8034 break;
8035
8036 case MODIFY_EXPR:
8037 if (cxx_dialect < cxx14)
8038 goto fail;
8039 if (!RECUR (TREE_OPERAND (t, 0), any))
8040 return false;
8041 /* Just ignore clobbers. */
8042 if (TREE_CLOBBER_P (TREE_OPERAND (t, 1)))
8043 return true;
8044 if (!RECUR (TREE_OPERAND (t, 1), rval))
8045 return false;
8046 return true;
8047
8048 case MODOP_EXPR:
8049 if (cxx_dialect < cxx14)
8050 goto fail;
8051 if (!RECUR (TREE_OPERAND (t, 0), rval))
8052 return false;
8053 if (!RECUR (TREE_OPERAND (t, 2), rval))
8054 return false;
8055 return true;
8056
8057 case DO_STMT:
8058 if (!RECUR (DO_COND (t), rval))
8059 return false;
8060 if (!RECUR (DO_BODY (t), any))
8061 return false;
8062 if (breaks (jump_target) || continues (jump_target))
8063 *jump_target = NULL_TREE;
8064 return true;
8065
8066 case FOR_STMT:
8067 if (!RECUR (FOR_INIT_STMT (t), any))
8068 return false;
8069 tmp = FOR_COND (t);
8070 if (!RECUR (tmp, rval))
8071 return false;
8072 if (tmp)
8073 {
8074 if (!processing_template_decl)
8075 tmp = cxx_eval_outermost_constant_expr (tmp, true);
8076 /* If we couldn't evaluate the condition, it might not ever be
8077 true. */
8078 if (!integer_onep (tmp))
8079 {
8080 /* Before returning true, check if the for body can contain
8081 a return. */
8082 hash_set<tree> pset;
8083 check_for_return_continue_data data = { &pset, NULL_TREE,
8084 NULL_TREE };
8085 if (tree ret_expr
8086 = cp_walk_tree (&FOR_BODY (t), check_for_return_continue,
8087 &data, &pset))
8088 *jump_target = ret_expr;
8089 return true;
8090 }
8091 }
8092 if (!RECUR (FOR_EXPR (t), any))
8093 return false;
8094 if (!RECUR (FOR_BODY (t), any))
8095 return false;
8096 if (breaks (jump_target) || continues (jump_target))
8097 *jump_target = NULL_TREE;
8098 return true;
8099
8100 case RANGE_FOR_STMT:
8101 if (!RECUR (RANGE_FOR_INIT_STMT (t), any))
8102 return false;
8103 if (!RECUR (RANGE_FOR_EXPR (t), any))
8104 return false;
8105 if (!RECUR (RANGE_FOR_BODY (t), any))
8106 return false;
8107 if (breaks (jump_target) || continues (jump_target))
8108 *jump_target = NULL_TREE;
8109 return true;
8110
8111 case WHILE_STMT:
8112 tmp = WHILE_COND (t);
8113 if (!RECUR (tmp, rval))
8114 return false;
8115 if (!processing_template_decl)
8116 tmp = cxx_eval_outermost_constant_expr (tmp, true);
8117 /* If we couldn't evaluate the condition, it might not ever be true. */
8118 if (!integer_onep (tmp))
8119 {
8120 /* Before returning true, check if the while body can contain
8121 a return. */
8122 hash_set<tree> pset;
8123 check_for_return_continue_data data = { &pset, NULL_TREE,
8124 NULL_TREE };
8125 if (tree ret_expr
8126 = cp_walk_tree (&WHILE_BODY (t), check_for_return_continue,
8127 &data, &pset))
8128 *jump_target = ret_expr;
8129 return true;
8130 }
8131 if (!RECUR (WHILE_BODY (t), any))
8132 return false;
8133 if (breaks (jump_target) || continues (jump_target))
8134 *jump_target = NULL_TREE;
8135 return true;
8136
8137 case SWITCH_STMT:
8138 if (!RECUR (SWITCH_STMT_COND (t), rval))
8139 return false;
8140 /* FIXME we don't check SWITCH_STMT_BODY currently, because even
8141 unreachable labels would be checked and it is enough if there is
8142 a single switch cond value for which it is a valid constant
8143 expression. We need to check if there are any RETURN_EXPRs
8144 or CONTINUE_STMTs inside of the body though, as in that case
8145 we need to set *jump_target. */
8146 else
8147 {
8148 hash_set<tree> pset;
8149 check_for_return_continue_data data = { &pset, NULL_TREE,
8150 NULL_TREE };
8151 if (tree ret_expr
8152 = cp_walk_tree (&SWITCH_STMT_BODY (t), check_for_return_continue,
8153 &data, &pset))
8154 /* The switch might return. */
8155 *jump_target = ret_expr;
8156 else if (data.continue_stmt)
8157 /* The switch can't return, but might continue. */
8158 *jump_target = data.continue_stmt;
8159 }
8160 return true;
8161
8162 case STMT_EXPR:
8163 return RECUR (STMT_EXPR_STMT (t), rval);
8164
8165 case LAMBDA_EXPR:
8166 if (cxx_dialect >= cxx17)
8167 /* In C++17 lambdas can be constexpr, don't give up yet. */
8168 return true;
8169 else if (flags & tf_error)
8170 error_at (loc, "lambda-expression is not a constant expression "
8171 "before C++17");
8172 return false;
8173
8174 case DYNAMIC_CAST_EXPR:
8175 case PSEUDO_DTOR_EXPR:
8176 case NEW_EXPR:
8177 case VEC_NEW_EXPR:
8178 case DELETE_EXPR:
8179 case VEC_DELETE_EXPR:
8180 case THROW_EXPR:
8181 case OMP_PARALLEL:
8182 case OMP_TASK:
8183 case OMP_FOR:
8184 case OMP_SIMD:
8185 case OMP_DISTRIBUTE:
8186 case OMP_TASKLOOP:
8187 case OMP_LOOP:
8188 case OMP_TEAMS:
8189 case OMP_TARGET_DATA:
8190 case OMP_TARGET:
8191 case OMP_SECTIONS:
8192 case OMP_ORDERED:
8193 case OMP_CRITICAL:
8194 case OMP_SINGLE:
8195 case OMP_SCAN:
8196 case OMP_SECTION:
8197 case OMP_MASTER:
8198 case OMP_TASKGROUP:
8199 case OMP_TARGET_UPDATE:
8200 case OMP_TARGET_ENTER_DATA:
8201 case OMP_TARGET_EXIT_DATA:
8202 case OMP_ATOMIC:
8203 case OMP_ATOMIC_READ:
8204 case OMP_ATOMIC_CAPTURE_OLD:
8205 case OMP_ATOMIC_CAPTURE_NEW:
8206 case OMP_DEPOBJ:
8207 case OACC_PARALLEL:
8208 case OACC_KERNELS:
8209 case OACC_SERIAL:
8210 case OACC_DATA:
8211 case OACC_HOST_DATA:
8212 case OACC_LOOP:
8213 case OACC_CACHE:
8214 case OACC_DECLARE:
8215 case OACC_ENTER_DATA:
8216 case OACC_EXIT_DATA:
8217 case OACC_UPDATE:
8218 /* GCC internal stuff. */
8219 case VA_ARG_EXPR:
8220 case TRANSACTION_EXPR:
8221 case AT_ENCODE_EXPR:
8222 fail:
8223 if (flags & tf_error)
8224 error_at (loc, "expression %qE is not a constant expression", t);
8225 return false;
8226
8227 case ASM_EXPR:
8228 if (flags & tf_error)
8229 inline_asm_in_constexpr_error (loc);
8230 return false;
8231
8232 case OBJ_TYPE_REF:
8233 if (cxx_dialect >= cxx2a)
8234 /* In C++2a virtual calls can be constexpr, don't give up yet. */
8235 return true;
8236 else if (flags & tf_error)
8237 error_at (loc,
8238 "virtual functions cannot be %<constexpr%> before C++2a");
8239 return false;
8240
8241 case TYPEID_EXPR:
8242 /* In C++20, a typeid expression whose operand is of polymorphic
8243 class type can be constexpr. */
8244 {
8245 tree e = TREE_OPERAND (t, 0);
8246 if (cxx_dialect < cxx2a
8247 && strict
8248 && !TYPE_P (e)
8249 && !type_dependent_expression_p (e)
8250 && TYPE_POLYMORPHIC_P (TREE_TYPE (e)))
8251 {
8252 if (flags & tf_error)
8253 error_at (loc, "%<typeid%> is not a constant expression "
8254 "because %qE is of polymorphic type", e);
8255 return false;
8256 }
8257 return true;
8258 }
8259
8260 case POINTER_DIFF_EXPR:
8261 case MINUS_EXPR:
8262 want_rval = true;
8263 goto binary;
8264
8265 case LT_EXPR:
8266 case LE_EXPR:
8267 case GT_EXPR:
8268 case GE_EXPR:
8269 case EQ_EXPR:
8270 case NE_EXPR:
8271 case SPACESHIP_EXPR:
8272 want_rval = true;
8273 goto binary;
8274
8275 case PREINCREMENT_EXPR:
8276 case POSTINCREMENT_EXPR:
8277 case PREDECREMENT_EXPR:
8278 case POSTDECREMENT_EXPR:
8279 if (cxx_dialect < cxx14)
8280 goto fail;
8281 goto unary;
8282
8283 case BIT_NOT_EXPR:
8284 /* A destructor. */
8285 if (TYPE_P (TREE_OPERAND (t, 0)))
8286 return true;
8287 /* fall through. */
8288
8289 case CONJ_EXPR:
8290 case SAVE_EXPR:
8291 case FIX_TRUNC_EXPR:
8292 case FLOAT_EXPR:
8293 case NEGATE_EXPR:
8294 case ABS_EXPR:
8295 case ABSU_EXPR:
8296 case TRUTH_NOT_EXPR:
8297 case FIXED_CONVERT_EXPR:
8298 case UNARY_PLUS_EXPR:
8299 case UNARY_LEFT_FOLD_EXPR:
8300 case UNARY_RIGHT_FOLD_EXPR:
8301 unary:
8302 return RECUR (TREE_OPERAND (t, 0), rval);
8303
8304 case CAST_EXPR:
8305 case CONST_CAST_EXPR:
8306 case STATIC_CAST_EXPR:
8307 case REINTERPRET_CAST_EXPR:
8308 case IMPLICIT_CONV_EXPR:
8309 if (cxx_dialect < cxx11
8310 && !dependent_type_p (TREE_TYPE (t))
8311 && !INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (t)))
8312 /* In C++98, a conversion to non-integral type can't be part of a
8313 constant expression. */
8314 {
8315 if (flags & tf_error)
8316 error_at (loc,
8317 "cast to non-integral type %qT in a constant expression",
8318 TREE_TYPE (t));
8319 return false;
8320 }
8321 /* This might be a conversion from a class to a (potentially) literal
8322 type. Let's consider it potentially constant since the conversion
8323 might be a constexpr user-defined conversion. */
8324 else if (cxx_dialect >= cxx11
8325 && (dependent_type_p (TREE_TYPE (t))
8326 || !COMPLETE_TYPE_P (TREE_TYPE (t))
8327 || literal_type_p (TREE_TYPE (t)))
8328 && TREE_OPERAND (t, 0))
8329 {
8330 tree type = TREE_TYPE (TREE_OPERAND (t, 0));
8331 /* If this is a dependent type, it could end up being a class
8332 with conversions. */
8333 if (type == NULL_TREE || WILDCARD_TYPE_P (type))
8334 return true;
8335 /* Or a non-dependent class which has conversions. */
8336 else if (CLASS_TYPE_P (type)
8337 && (TYPE_HAS_CONVERSION (type) || dependent_scope_p (type)))
8338 return true;
8339 }
8340
8341 return (RECUR (TREE_OPERAND (t, 0),
8342 !TYPE_REF_P (TREE_TYPE (t))));
8343
8344 case BIND_EXPR:
8345 return RECUR (BIND_EXPR_BODY (t), want_rval);
8346
8347 case CLEANUP_POINT_EXPR:
8348 case MUST_NOT_THROW_EXPR:
8349 case TRY_CATCH_EXPR:
8350 case TRY_BLOCK:
8351 case EH_SPEC_BLOCK:
8352 case EXPR_STMT:
8353 case PAREN_EXPR:
8354 case NON_DEPENDENT_EXPR:
8355 /* For convenience. */
8356 case LOOP_EXPR:
8357 case EXIT_EXPR:
8358 return RECUR (TREE_OPERAND (t, 0), want_rval);
8359
8360 case DECL_EXPR:
8361 tmp = DECL_EXPR_DECL (t);
8362 if (VAR_P (tmp) && !DECL_ARTIFICIAL (tmp))
8363 {
8364 if (CP_DECL_THREAD_LOCAL_P (tmp) && !DECL_REALLY_EXTERN (tmp))
8365 {
8366 if (flags & tf_error)
8367 error_at (DECL_SOURCE_LOCATION (tmp), "%qD declared "
8368 "%<thread_local%> in %<constexpr%> context", tmp);
8369 return false;
8370 }
8371 else if (TREE_STATIC (tmp))
8372 {
8373 if (flags & tf_error)
8374 error_at (DECL_SOURCE_LOCATION (tmp), "%qD declared "
8375 "%<static%> in %<constexpr%> context", tmp);
8376 return false;
8377 }
8378 else if (!check_for_uninitialized_const_var
8379 (tmp, /*constexpr_context_p=*/true, flags))
8380 return false;
8381 }
8382 return RECUR (tmp, want_rval);
8383
8384 case TRY_FINALLY_EXPR:
8385 return (RECUR (TREE_OPERAND (t, 0), want_rval)
8386 && RECUR (TREE_OPERAND (t, 1), any));
8387
8388 case SCOPE_REF:
8389 return RECUR (TREE_OPERAND (t, 1), want_rval);
8390
8391 case TARGET_EXPR:
8392 if (!TARGET_EXPR_DIRECT_INIT_P (t)
8393 && !literal_type_p (TREE_TYPE (t)))
8394 {
8395 if (flags & tf_error)
8396 {
8397 auto_diagnostic_group d;
8398 error_at (loc, "temporary of non-literal type %qT in a "
8399 "constant expression", TREE_TYPE (t));
8400 explain_non_literal_class (TREE_TYPE (t));
8401 }
8402 return false;
8403 }
8404 /* FALLTHRU */
8405 case INIT_EXPR:
8406 return RECUR (TREE_OPERAND (t, 1), rval);
8407
8408 case CONSTRUCTOR:
8409 {
8410 vec<constructor_elt, va_gc> *v = CONSTRUCTOR_ELTS (t);
8411 constructor_elt *ce;
8412 for (i = 0; vec_safe_iterate (v, i, &ce); ++i)
8413 if (!RECUR (ce->value, want_rval))
8414 return false;
8415 return true;
8416 }
8417
8418 case TREE_LIST:
8419 {
8420 gcc_assert (TREE_PURPOSE (t) == NULL_TREE
8421 || DECL_P (TREE_PURPOSE (t)));
8422 if (!RECUR (TREE_VALUE (t), want_rval))
8423 return false;
8424 if (TREE_CHAIN (t) == NULL_TREE)
8425 return true;
8426 return RECUR (TREE_CHAIN (t), want_rval);
8427 }
8428
8429 case TRUNC_DIV_EXPR:
8430 case CEIL_DIV_EXPR:
8431 case FLOOR_DIV_EXPR:
8432 case ROUND_DIV_EXPR:
8433 case TRUNC_MOD_EXPR:
8434 case CEIL_MOD_EXPR:
8435 case ROUND_MOD_EXPR:
8436 {
8437 tree denom = TREE_OPERAND (t, 1);
8438 if (!RECUR (denom, rval))
8439 return false;
8440 /* We can't call cxx_eval_outermost_constant_expr on an expression
8441 that hasn't been through instantiate_non_dependent_expr yet. */
8442 if (!processing_template_decl)
8443 denom = cxx_eval_outermost_constant_expr (denom, true);
8444 if (integer_zerop (denom))
8445 {
8446 if (flags & tf_error)
8447 error ("division by zero is not a constant expression");
8448 return false;
8449 }
8450 else
8451 {
8452 want_rval = true;
8453 return RECUR (TREE_OPERAND (t, 0), want_rval);
8454 }
8455 }
8456
8457 case COMPOUND_EXPR:
8458 {
8459 /* check_return_expr sometimes wraps a TARGET_EXPR in a
8460 COMPOUND_EXPR; don't get confused. Also handle EMPTY_CLASS_EXPR
8461 introduced by build_call_a. */
8462 tree op0 = TREE_OPERAND (t, 0);
8463 tree op1 = TREE_OPERAND (t, 1);
8464 STRIP_NOPS (op1);
8465 if ((TREE_CODE (op0) == TARGET_EXPR && op1 == TARGET_EXPR_SLOT (op0))
8466 || TREE_CODE (op1) == EMPTY_CLASS_EXPR)
8467 return RECUR (op0, want_rval);
8468 else
8469 goto binary;
8470 }
8471
8472 /* If the first operand is the non-short-circuit constant, look at
8473 the second operand; otherwise we only care about the first one for
8474 potentiality. */
8475 case TRUTH_AND_EXPR:
8476 case TRUTH_ANDIF_EXPR:
8477 tmp = boolean_true_node;
8478 goto truth;
8479 case TRUTH_OR_EXPR:
8480 case TRUTH_ORIF_EXPR:
8481 tmp = boolean_false_node;
8482 truth:
8483 {
8484 tree op0 = TREE_OPERAND (t, 0);
8485 tree op1 = TREE_OPERAND (t, 1);
8486 if (!RECUR (op0, rval))
8487 return false;
8488 if (!(flags & tf_error) && RECUR (op1, rval))
8489 /* When quiet, try to avoid expensive trial evaluation by first
8490 checking potentiality of the second operand. */
8491 return true;
8492 if (!processing_template_decl)
8493 op0 = cxx_eval_outermost_constant_expr (op0, true);
8494 if (tree_int_cst_equal (op0, tmp))
8495 return (flags & tf_error) ? RECUR (op1, rval) : false;
8496 else
8497 return true;
8498 }
8499
8500 case PLUS_EXPR:
8501 case MULT_EXPR:
8502 case POINTER_PLUS_EXPR:
8503 case RDIV_EXPR:
8504 case EXACT_DIV_EXPR:
8505 case MIN_EXPR:
8506 case MAX_EXPR:
8507 case LSHIFT_EXPR:
8508 case RSHIFT_EXPR:
8509 case LROTATE_EXPR:
8510 case RROTATE_EXPR:
8511 case BIT_IOR_EXPR:
8512 case BIT_XOR_EXPR:
8513 case BIT_AND_EXPR:
8514 case TRUTH_XOR_EXPR:
8515 case UNORDERED_EXPR:
8516 case ORDERED_EXPR:
8517 case UNLT_EXPR:
8518 case UNLE_EXPR:
8519 case UNGT_EXPR:
8520 case UNGE_EXPR:
8521 case UNEQ_EXPR:
8522 case LTGT_EXPR:
8523 case RANGE_EXPR:
8524 case COMPLEX_EXPR:
8525 want_rval = true;
8526 /* Fall through. */
8527 case ARRAY_REF:
8528 case ARRAY_RANGE_REF:
8529 case MEMBER_REF:
8530 case DOTSTAR_EXPR:
8531 case MEM_REF:
8532 case BINARY_LEFT_FOLD_EXPR:
8533 case BINARY_RIGHT_FOLD_EXPR:
8534 binary:
8535 for (i = 0; i < 2; ++i)
8536 if (!RECUR (TREE_OPERAND (t, i), want_rval))
8537 return false;
8538 return true;
8539
8540 case VEC_PERM_EXPR:
8541 for (i = 0; i < 3; ++i)
8542 if (!RECUR (TREE_OPERAND (t, i), true))
8543 return false;
8544 return true;
8545
8546 case COND_EXPR:
8547 if (COND_EXPR_IS_VEC_DELETE (t) && cxx_dialect < cxx2a)
8548 {
8549 if (flags & tf_error)
8550 error_at (loc, "%<delete[]%> is not a constant expression");
8551 return false;
8552 }
8553 /* Fall through. */
8554 case IF_STMT:
8555 case VEC_COND_EXPR:
8556 /* If the condition is a known constant, we know which of the legs we
8557 care about; otherwise we only require that the condition and
8558 either of the legs be potentially constant. */
8559 tmp = TREE_OPERAND (t, 0);
8560 if (!RECUR (tmp, rval))
8561 return false;
8562 if (!processing_template_decl)
8563 tmp = cxx_eval_outermost_constant_expr (tmp, true);
8564 if (integer_zerop (tmp))
8565 return RECUR (TREE_OPERAND (t, 2), want_rval);
8566 else if (TREE_CODE (tmp) == INTEGER_CST)
8567 return RECUR (TREE_OPERAND (t, 1), want_rval);
8568 tmp = *jump_target;
8569 for (i = 1; i < 3; ++i)
8570 {
8571 tree this_jump_target = tmp;
8572 if (potential_constant_expression_1 (TREE_OPERAND (t, i),
8573 want_rval, strict, now,
8574 tf_none, &this_jump_target))
8575 {
8576 if (returns (&this_jump_target))
8577 *jump_target = this_jump_target;
8578 else if (!returns (jump_target))
8579 {
8580 if (breaks (&this_jump_target)
8581 || continues (&this_jump_target))
8582 *jump_target = this_jump_target;
8583 if (i == 1)
8584 {
8585 /* If the then branch is potentially constant, but
8586 does not return, check if the else branch
8587 couldn't return, break or continue. */
8588 hash_set<tree> pset;
8589 check_for_return_continue_data data = { &pset, NULL_TREE,
8590 NULL_TREE };
8591 if (tree ret_expr
8592 = cp_walk_tree (&TREE_OPERAND (t, 2),
8593 check_for_return_continue, &data,
8594 &pset))
8595 *jump_target = ret_expr;
8596 else if (*jump_target == NULL_TREE)
8597 {
8598 if (data.continue_stmt)
8599 *jump_target = data.continue_stmt;
8600 else if (data.break_stmt)
8601 *jump_target = data.break_stmt;
8602 }
8603 }
8604 }
8605 return true;
8606 }
8607 }
8608 if (flags & tf_error)
8609 error_at (loc, "expression %qE is not a constant expression", t);
8610 return false;
8611
8612 case VEC_INIT_EXPR:
8613 if (VEC_INIT_EXPR_IS_CONSTEXPR (t))
8614 return true;
8615 if (flags & tf_error)
8616 {
8617 error_at (loc, "non-constant array initialization");
8618 diagnose_non_constexpr_vec_init (t);
8619 }
8620 return false;
8621
8622 case TYPE_DECL:
8623 case TAG_DEFN:
8624 /* We can see these in statement-expressions. */
8625 return true;
8626
8627 case CLEANUP_STMT:
8628 if (!RECUR (CLEANUP_BODY (t), any))
8629 return false;
8630 if (!CLEANUP_EH_ONLY (t) && !RECUR (CLEANUP_EXPR (t), any))
8631 return false;
8632 return true;
8633
8634 case EMPTY_CLASS_EXPR:
8635 return false;
8636
8637 case GOTO_EXPR:
8638 {
8639 tree *target = &TREE_OPERAND (t, 0);
8640 /* Gotos representing break, continue and cdtor return are OK. */
8641 if (breaks (target) || continues (target) || returns (target))
8642 {
8643 *jump_target = *target;
8644 return true;
8645 }
8646 if (flags & tf_error)
8647 error_at (loc, "%<goto%> is not a constant expression");
8648 return false;
8649 }
8650
8651 case ANNOTATE_EXPR:
8652 return RECUR (TREE_OPERAND (t, 0), rval);
8653
8654 /* Coroutine await, yield and return expressions are not. */
8655 case CO_AWAIT_EXPR:
8656 case CO_YIELD_EXPR:
8657 case CO_RETURN_EXPR:
8658 return false;
8659
8660 default:
8661 if (objc_non_constant_expr_p (t))
8662 return false;
8663
8664 sorry ("unexpected AST of kind %s", get_tree_code_name (TREE_CODE (t)));
8665 gcc_unreachable ();
8666 return false;
8667 }
8668 #undef RECUR
8669 }
8670
8671 bool
potential_constant_expression_1(tree t,bool want_rval,bool strict,bool now,tsubst_flags_t flags)8672 potential_constant_expression_1 (tree t, bool want_rval, bool strict, bool now,
8673 tsubst_flags_t flags)
8674 {
8675 if (flags & tf_error)
8676 {
8677 /* Check potentiality quietly first, as that could be performed more
8678 efficiently in some cases (currently only for TRUTH_*_EXPR). If
8679 that fails, replay the check noisily to give errors. */
8680 flags &= ~tf_error;
8681 if (potential_constant_expression_1 (t, want_rval, strict, now, flags))
8682 return true;
8683 flags |= tf_error;
8684 }
8685
8686 tree target = NULL_TREE;
8687 return potential_constant_expression_1 (t, want_rval, strict, now,
8688 flags, &target);
8689 }
8690
8691 /* The main entry point to the above. */
8692
8693 bool
potential_constant_expression(tree t)8694 potential_constant_expression (tree t)
8695 {
8696 return potential_constant_expression_1 (t, false, true, false, tf_none);
8697 }
8698
8699 /* As above, but require a constant rvalue. */
8700
8701 bool
potential_rvalue_constant_expression(tree t)8702 potential_rvalue_constant_expression (tree t)
8703 {
8704 return potential_constant_expression_1 (t, true, true, false, tf_none);
8705 }
8706
8707 /* Like above, but complain about non-constant expressions. */
8708
8709 bool
require_potential_constant_expression(tree t)8710 require_potential_constant_expression (tree t)
8711 {
8712 return potential_constant_expression_1 (t, false, true, false,
8713 tf_warning_or_error);
8714 }
8715
8716 /* Cross product of the above. */
8717
8718 bool
require_potential_rvalue_constant_expression(tree t)8719 require_potential_rvalue_constant_expression (tree t)
8720 {
8721 return potential_constant_expression_1 (t, true, true, false,
8722 tf_warning_or_error);
8723 }
8724
8725 /* Like above, but don't consider PARM_DECL a potential_constant_expression. */
8726
8727 bool
require_rvalue_constant_expression(tree t)8728 require_rvalue_constant_expression (tree t)
8729 {
8730 return potential_constant_expression_1 (t, true, true, true,
8731 tf_warning_or_error);
8732 }
8733
8734 /* Like potential_constant_expression, but don't consider possible constexpr
8735 substitution of the current function. That is, PARM_DECL qualifies under
8736 potential_constant_expression, but not here.
8737
8738 This is basically what you can check when any actual constant values might
8739 be value-dependent. */
8740
8741 bool
is_constant_expression(tree t)8742 is_constant_expression (tree t)
8743 {
8744 return potential_constant_expression_1 (t, false, true, true, tf_none);
8745 }
8746
8747 /* Like above, but complain about non-constant expressions. */
8748
8749 bool
require_constant_expression(tree t)8750 require_constant_expression (tree t)
8751 {
8752 return potential_constant_expression_1 (t, false, true, true,
8753 tf_warning_or_error);
8754 }
8755
8756 /* Like is_constant_expression, but allow const variables that are not allowed
8757 under constexpr rules. */
8758
8759 bool
is_static_init_expression(tree t)8760 is_static_init_expression (tree t)
8761 {
8762 return potential_constant_expression_1 (t, false, false, true, tf_none);
8763 }
8764
8765 /* Returns true if T is a potential constant expression that is not
8766 instantiation-dependent, and therefore a candidate for constant folding even
8767 in a template. */
8768
8769 bool
is_nondependent_constant_expression(tree t)8770 is_nondependent_constant_expression (tree t)
8771 {
8772 return (!type_unknown_p (t)
8773 && is_constant_expression (t)
8774 && !instantiation_dependent_expression_p (t));
8775 }
8776
8777 /* Returns true if T is a potential static initializer expression that is not
8778 instantiation-dependent. */
8779
8780 bool
is_nondependent_static_init_expression(tree t)8781 is_nondependent_static_init_expression (tree t)
8782 {
8783 return (!type_unknown_p (t)
8784 && is_static_init_expression (t)
8785 && !instantiation_dependent_expression_p (t));
8786 }
8787
8788 /* Finalize constexpr processing after parsing. */
8789
8790 void
fini_constexpr(void)8791 fini_constexpr (void)
8792 {
8793 /* The contexpr call and fundef copies tables are no longer needed. */
8794 constexpr_call_table = NULL;
8795 fundef_copies_table = NULL;
8796 }
8797
8798 #include "gt-cp-constexpr.h"
8799