1 /* Processing rules for constraints.
2 Copyright (C) 2013-2016 Free Software Foundation, Inc.
3 Contributed by Andrew Sutton (andrew.n.sutton@gmail.com)
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "timevar.h"
26 #include "hash-set.h"
27 #include "machmode.h"
28 #include "vec.h"
29 #include "double-int.h"
30 #include "input.h"
31 #include "alias.h"
32 #include "symtab.h"
33 #include "wide-int.h"
34 #include "inchash.h"
35 #include "tree.h"
36 #include "stringpool.h"
37 #include "attribs.h"
38 #include "intl.h"
39 #include "flags.h"
40 #include "cp-tree.h"
41 #include "c-family/c-common.h"
42 #include "c-family/c-objc.h"
43 #include "cp-objcp-common.h"
44 #include "tree-inline.h"
45 #include "decl.h"
46 #include "toplev.h"
47 #include "type-utils.h"
48
49 /*---------------------------------------------------------------------------
50 Operations on constraints
51 ---------------------------------------------------------------------------*/
52
53 /* Returns true if C is a constraint tree code. Note that ERROR_MARK
54 is a valid constraint. */
55
56 static inline bool
constraint_p(tree_code c)57 constraint_p (tree_code c)
58 {
59 return ((PRED_CONSTR <= c && c <= DISJ_CONSTR)
60 || c == EXPR_PACK_EXPANSION
61 || c == ERROR_MARK);
62 }
63
64 /* Returns true if T is a constraint. Note that error_mark_node
65 is a valid constraint. */
66
67 bool
constraint_p(tree t)68 constraint_p (tree t)
69 {
70 return constraint_p (TREE_CODE (t));
71 }
72
73 /* Returns the conjunction of two constraints A and B. Note that
74 conjoining a non-null constraint with NULL_TREE is an identity
75 operation. That is, for non-null A,
76
77 conjoin_constraints(a, NULL_TREE) == a
78
79 and
80
81 conjoin_constraints (NULL_TREE, a) == a
82
83 If both A and B are NULL_TREE, the result is also NULL_TREE. */
84
85 tree
conjoin_constraints(tree a,tree b)86 conjoin_constraints (tree a, tree b)
87 {
88 gcc_assert (a ? constraint_p (a) : true);
89 gcc_assert (b ? constraint_p (b) : true);
90 if (a)
91 return b ? build_nt (CONJ_CONSTR, a, b) : a;
92 else if (b)
93 return b;
94 else
95 return NULL_TREE;
96 }
97
98 /* Transform the vector of expressions in the T into a conjunction
99 of requirements. T must be a TREE_VEC. */
100
101 tree
conjoin_constraints(tree t)102 conjoin_constraints (tree t)
103 {
104 gcc_assert (TREE_CODE (t) == TREE_VEC);
105 tree r = NULL_TREE;
106 for (int i = 0; i < TREE_VEC_LENGTH (t); ++i)
107 r = conjoin_constraints (r, TREE_VEC_ELT (t, i));
108 return r;
109 }
110
111 /* Returns true if T is a call expression to a function
112 concept. */
113
114 bool
function_concept_check_p(tree t)115 function_concept_check_p (tree t)
116 {
117 gcc_assert (TREE_CODE (t) == CALL_EXPR);
118 tree fn = CALL_EXPR_FN (t);
119 if (TREE_CODE (fn) == TEMPLATE_ID_EXPR
120 && TREE_CODE (TREE_OPERAND (fn, 0)) == OVERLOAD)
121 {
122 tree f1 = get_first_fn (fn);
123 if (TREE_CODE (f1) == TEMPLATE_DECL
124 && DECL_DECLARED_CONCEPT_P (DECL_TEMPLATE_RESULT (f1)))
125 return true;
126 }
127 return false;
128 }
129
130 /* Returns true if any of the arguments in the template
131 argument list is a wildcard or wildcard pack. */
132
133 bool
contains_wildcard_p(tree args)134 contains_wildcard_p (tree args)
135 {
136 for (int i = 0; i < TREE_VEC_LENGTH (args); ++i)
137 {
138 tree arg = TREE_VEC_ELT (args, i);
139 if (TREE_CODE (arg) == WILDCARD_DECL)
140 return true;
141 }
142 return false;
143 }
144
145 /* Build a new call expression, but don't actually generate a
146 new function call. We just want the tree, not the semantics. */
147
148 inline tree
build_call_check(tree id)149 build_call_check (tree id)
150 {
151 ++processing_template_decl;
152 vec<tree, va_gc> *fargs = make_tree_vector();
153 tree call = finish_call_expr (id, &fargs, false, false, tf_none);
154 release_tree_vector (fargs);
155 --processing_template_decl;
156 return call;
157 }
158
159 /* Build an expression that will check a variable concept. If any
160 argument contains a wildcard, don't try to finish the variable
161 template because we can't substitute into a non-existent
162 declaration. */
163
164 tree
build_variable_check(tree id)165 build_variable_check (tree id)
166 {
167 gcc_assert (TREE_CODE (id) == TEMPLATE_ID_EXPR);
168 if (contains_wildcard_p (TREE_OPERAND (id, 1)))
169 return id;
170
171 ++processing_template_decl;
172 tree var = finish_template_variable (id);
173 --processing_template_decl;
174 return var;
175 }
176
177 /*---------------------------------------------------------------------------
178 Resolution of qualified concept names
179 ---------------------------------------------------------------------------*/
180
181 /* This facility is used to resolve constraint checks from
182 requirement expressions. A constraint check is a call to
183 a function template declared with the keyword 'concept'.
184
185 The result of resolution is a pair (a TREE_LIST) whose value
186 is the matched declaration, and whose purpose contains the
187 coerced template arguments that can be substituted into the
188 call. */
189
190 // Given an overload set OVL, try to find a unique definition that can be
191 // instantiated by the template arguments ARGS.
192 //
193 // This function is not called for arbitrary call expressions. In particular,
194 // the call expression must be written with explicit template arguments
195 // and no function arguments. For example:
196 //
197 // f<T, U>()
198 //
199 // If a single match is found, this returns a TREE_LIST whose VALUE
200 // is the constraint function (not the template), and its PURPOSE is
201 // the complete set of arguments substituted into the parameter list.
202 static tree
resolve_constraint_check(tree ovl,tree args)203 resolve_constraint_check (tree ovl, tree args)
204 {
205 int nerrs = 0;
206 tree cands = NULL_TREE;
207 for (tree p = ovl; p != NULL_TREE; p = OVL_NEXT (p))
208 {
209 // Get the next template overload.
210 tree tmpl = OVL_CURRENT (p);
211 if (TREE_CODE (tmpl) != TEMPLATE_DECL)
212 continue;
213
214 // Don't try to deduce checks for non-concepts. We often
215 // end up trying to resolve constraints in functional casts
216 // as part of a postfix-expression. We can save time and
217 // headaches by not instantiating those declarations.
218 //
219 // NOTE: This masks a potential error, caused by instantiating
220 // non-deduced contexts using placeholder arguments.
221 tree fn = DECL_TEMPLATE_RESULT (tmpl);
222 if (DECL_ARGUMENTS (fn))
223 continue;
224 if (!DECL_DECLARED_CONCEPT_P (fn))
225 continue;
226
227 // Remember the candidate if we can deduce a substitution.
228 ++processing_template_decl;
229 tree parms = TREE_VALUE (DECL_TEMPLATE_PARMS (tmpl));
230 if (tree subst = coerce_template_parms (parms, args, tmpl))
231 {
232 if (subst == error_mark_node)
233 ++nerrs;
234 else
235 cands = tree_cons (subst, fn, cands);
236 }
237 --processing_template_decl;
238 }
239
240 if (!cands)
241 /* We either had no candidates or failed deductions. */
242 return nerrs ? error_mark_node : NULL_TREE;
243 else if (TREE_CHAIN (cands))
244 /* There are multiple candidates. */
245 return error_mark_node;
246
247 return cands;
248 }
249
250 // Determine if the the call expression CALL is a constraint check, and
251 // return the concept declaration and arguments being checked. If CALL
252 // does not denote a constraint check, return NULL.
253 tree
resolve_constraint_check(tree call)254 resolve_constraint_check (tree call)
255 {
256 gcc_assert (TREE_CODE (call) == CALL_EXPR);
257
258 // A constraint check must be only a template-id expression. If
259 // it's a call to a base-link, its function(s) should be a
260 // template-id expression. If this is not a template-id, then it
261 // cannot be a concept-check.
262 tree target = CALL_EXPR_FN (call);
263 if (BASELINK_P (target))
264 target = BASELINK_FUNCTIONS (target);
265 if (TREE_CODE (target) != TEMPLATE_ID_EXPR)
266 return NULL_TREE;
267
268 // Get the overload set and template arguments and try to
269 // resolve the target.
270 tree ovl = TREE_OPERAND (target, 0);
271
272 /* This is a function call of a variable concept... ill-formed. */
273 if (TREE_CODE (ovl) == TEMPLATE_DECL)
274 {
275 error_at (location_of (call),
276 "function call of variable concept %qE", call);
277 return error_mark_node;
278 }
279
280 tree args = TREE_OPERAND (target, 1);
281 return resolve_constraint_check (ovl, args);
282 }
283
284 /* Returns a pair containing the checked variable concept
285 and its associated prototype parameter. The result
286 is a TREE_LIST whose TREE_VALUE is the variable concept
287 and whose TREE_PURPOSE is the prototype parameter. */
288
289 tree
resolve_variable_concept_check(tree id)290 resolve_variable_concept_check (tree id)
291 {
292 tree tmpl = TREE_OPERAND (id, 0);
293 tree args = TREE_OPERAND (id, 1);
294
295 if (!variable_concept_p (tmpl))
296 return NULL_TREE;
297
298 /* Make sure that we have the right parameters before
299 assuming that it works. Note that failing to deduce
300 will result in diagnostics. */
301 tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl));
302 ++processing_template_decl;
303 tree result = coerce_template_parms (parms, args, tmpl);
304 --processing_template_decl;
305 if (result != error_mark_node)
306 {
307 tree decl = DECL_TEMPLATE_RESULT (tmpl);
308 return build_tree_list (result, decl);
309 }
310 else
311 return error_mark_node;
312 }
313
314
315 /* Given a call expression or template-id expression to
316 a concept EXPR possibly including a wildcard, deduce
317 the concept being checked and the prototype parameter.
318 Returns true if the constraint and prototype can be
319 deduced and false otherwise. Note that the CHECK and
320 PROTO arguments are set to NULL_TREE if this returns
321 false. */
322
323 bool
deduce_constrained_parameter(tree expr,tree & check,tree & proto)324 deduce_constrained_parameter (tree expr, tree& check, tree& proto)
325 {
326 tree info = NULL_TREE;
327 if (TREE_CODE (expr) == TEMPLATE_ID_EXPR)
328 info = resolve_variable_concept_check (expr);
329 else if (TREE_CODE (expr) == CALL_EXPR)
330 info = resolve_constraint_check (expr);
331 else
332 gcc_unreachable ();
333
334 if (info && info != error_mark_node)
335 {
336 check = TREE_VALUE (info);
337 tree arg = TREE_VEC_ELT (TREE_PURPOSE (info), 0);
338 if (ARGUMENT_PACK_P (arg))
339 arg = TREE_VEC_ELT (ARGUMENT_PACK_ARGS (arg), 0);
340 proto = TREE_TYPE (arg);
341 return true;
342 }
343 check = proto = NULL_TREE;
344 return false;
345 }
346
347 // Given a call expression or template-id expression to a concept, EXPR,
348 // deduce the concept being checked and return the template arguments.
349 // Returns NULL_TREE if deduction fails.
350 static tree
deduce_concept_introduction(tree expr)351 deduce_concept_introduction (tree expr)
352 {
353 tree info = NULL_TREE;
354 if (TREE_CODE (expr) == TEMPLATE_ID_EXPR)
355 info = resolve_variable_concept_check (expr);
356 else if (TREE_CODE (expr) == CALL_EXPR)
357 info = resolve_constraint_check (expr);
358 else
359 gcc_unreachable ();
360
361 if (info && info != error_mark_node)
362 return TREE_PURPOSE (info);
363 return NULL_TREE;
364 }
365
366 namespace {
367
368 /*---------------------------------------------------------------------------
369 Constraint implication learning
370 ---------------------------------------------------------------------------*/
371
372 /* The implication context determines how we memoize concept checks.
373 Given two checks C1 and C2, the direction of implication depends
374 on whether we are learning implications of a conjunction or disjunction.
375 For example:
376
377 template<typename T> concept bool C = ...;
378 template<typenaem T> concept bool D = C<T> && true;
379
380 From this, we can learn that D<T> implies C<T>. We cannot learn,
381 without further testing, that C<T> does not imply D<T>. If, for
382 example, C<T> were defined as true, then these constraints would
383 be logically equivalent.
384
385 In rare cases, we may start with a logical equivalence. For example:
386
387 template<typename T> concept bool C = ...;
388 template<typename T> concept bool D = C<T>;
389
390 Here, we learn that C<T> implies D<T> and vice versa. */
391
392 enum implication_context
393 {
394 conjunction_cxt, /* C1 implies C2. */
395 disjunction_cxt, /* C2 implies C1. */
396 equivalence_cxt /* C1 implies C2, C2 implies C1. */
397 };
398
399 void learn_implications(tree, tree, implication_context);
400
401 void
learn_implication(tree parent,tree child,implication_context cxt)402 learn_implication (tree parent, tree child, implication_context cxt)
403 {
404 switch (cxt)
405 {
406 case conjunction_cxt:
407 save_subsumption_result (parent, child, true);
408 break;
409 case disjunction_cxt:
410 save_subsumption_result (child, parent, true);
411 break;
412 case equivalence_cxt:
413 save_subsumption_result (parent, child, true);
414 save_subsumption_result (child, parent, true);
415 break;
416 }
417 }
418
419 void
learn_logical_operation(tree parent,tree constr,implication_context cxt)420 learn_logical_operation (tree parent, tree constr, implication_context cxt)
421 {
422 learn_implications (parent, TREE_OPERAND (constr, 0), cxt);
423 learn_implications (parent, TREE_OPERAND (constr, 1), cxt);
424 }
425
426 void
learn_implications(tree parent,tree constr,implication_context cxt)427 learn_implications (tree parent, tree constr, implication_context cxt)
428 {
429 switch (TREE_CODE (constr))
430 {
431 case CHECK_CONSTR:
432 return learn_implication (parent, constr, cxt);
433
434 case CONJ_CONSTR:
435 if (cxt == disjunction_cxt)
436 return;
437 return learn_logical_operation (parent, constr, cxt);
438
439 case DISJ_CONSTR:
440 if (cxt == conjunction_cxt)
441 return;
442 return learn_logical_operation (parent, constr, cxt);
443
444 default:
445 break;
446 }
447 }
448
449 /* Quickly scan the top-level constraints of CONSTR to learn and
450 cache logical relations between concepts. The search does not
451 include conjunctions of disjunctions or vice versa. */
452
453 void
learn_implications(tree tmpl,tree args,tree constr)454 learn_implications (tree tmpl, tree args, tree constr)
455 {
456 /* Don't memoize relations between non-dependent arguemnts. It's not
457 helpful. */
458 if (!uses_template_parms (args))
459 return;
460
461 /* Build a check constraint for the purpose of caching. */
462 tree parent = build_nt (CHECK_CONSTR, tmpl, args);
463
464 /* Start learning based on the kind of the top-level contraint. */
465 if (TREE_CODE (constr) == CONJ_CONSTR)
466 return learn_logical_operation (parent, constr, conjunction_cxt);
467 else if (TREE_CODE (constr) == DISJ_CONSTR)
468 return learn_logical_operation (parent, constr, disjunction_cxt);
469 else if (TREE_CODE (constr) == CHECK_CONSTR)
470 /* This is the rare concept alias case. */
471 return learn_implication (parent, constr, equivalence_cxt);
472 }
473
474 /*---------------------------------------------------------------------------
475 Expansion of concept definitions
476 ---------------------------------------------------------------------------*/
477
478 /* Returns the expression of a function concept. */
479
480 tree
get_returned_expression(tree fn)481 get_returned_expression (tree fn)
482 {
483 /* Extract the body of the function minus the return expression. */
484 tree body = DECL_SAVED_TREE (fn);
485 if (!body)
486 return error_mark_node;
487 if (TREE_CODE (body) == BIND_EXPR)
488 body = BIND_EXPR_BODY (body);
489 if (TREE_CODE (body) != RETURN_EXPR)
490 return error_mark_node;
491
492 return TREE_OPERAND (body, 0);
493 }
494
495 /* Returns the initializer of a variable concept. */
496
497 tree
get_variable_initializer(tree var)498 get_variable_initializer (tree var)
499 {
500 tree init = DECL_INITIAL (var);
501 if (!init)
502 return error_mark_node;
503 return init;
504 }
505
506 /* Returns the definition of a variable or function concept. */
507
508 tree
get_concept_definition(tree decl)509 get_concept_definition (tree decl)
510 {
511 if (TREE_CODE (decl) == VAR_DECL)
512 return get_variable_initializer (decl);
513 else if (TREE_CODE (decl) == FUNCTION_DECL)
514 return get_returned_expression (decl);
515 gcc_unreachable ();
516 }
517
518 int expansion_level = 0;
519
520 struct expanding_concept_sentinel
521 {
expanding_concept_sentinel__anonbcfa89ab0111::expanding_concept_sentinel522 expanding_concept_sentinel ()
523 {
524 ++expansion_level;
525 }
526
~expanding_concept_sentinel__anonbcfa89ab0111::expanding_concept_sentinel527 ~expanding_concept_sentinel()
528 {
529 --expansion_level;
530 }
531 };
532
533
534 } /* namespace */
535
536 /* Returns true when a concept is being expanded. */
537
538 bool
expanding_concept()539 expanding_concept()
540 {
541 return expansion_level > 0;
542 }
543
544 /* Expand a concept declaration (not a template) and its arguments to
545 a constraint defined by the concept's initializer or definition. */
546
547 tree
expand_concept(tree decl,tree args)548 expand_concept (tree decl, tree args)
549 {
550 expanding_concept_sentinel sentinel;
551
552 if (TREE_CODE (decl) == TEMPLATE_DECL)
553 decl = DECL_TEMPLATE_RESULT (decl);
554 tree tmpl = DECL_TI_TEMPLATE (decl);
555
556 /* Check for a previous specialization. */
557 if (tree spec = get_concept_expansion (tmpl, args))
558 return spec;
559
560 /* Substitute the arguments to form a new definition expression. */
561 tree def = get_concept_definition (decl);
562
563 ++processing_template_decl;
564 tree result = tsubst_expr (def, args, tf_none, NULL_TREE, true);
565 --processing_template_decl;
566 if (result == error_mark_node)
567 return error_mark_node;
568
569 /* And lastly, normalize it, check for implications, and save
570 the specialization for later. */
571 tree norm = normalize_expression (result);
572 learn_implications (tmpl, args, norm);
573 return save_concept_expansion (tmpl, args, norm);
574 }
575
576
577 /*---------------------------------------------------------------------------
578 Stepwise normalization of expressions
579
580 This set of functions will transform an expression into a constraint
581 in a sequence of steps. Normalization does not not look into concept
582 definitions.
583 ---------------------------------------------------------------------------*/
584
585 /* Transform a logical-or or logical-and expression into either
586 a conjunction or disjunction. */
587
588 tree
normalize_logical_operation(tree t,tree_code c)589 normalize_logical_operation (tree t, tree_code c)
590 {
591 tree t0 = normalize_expression (TREE_OPERAND (t, 0));
592 tree t1 = normalize_expression (TREE_OPERAND (t, 1));
593 return build_nt (c, t0, t1);
594 }
595
596 /* A simple requirement T introduces an expression constraint
597 for its expression. */
598
599 inline tree
normalize_simple_requirement(tree t)600 normalize_simple_requirement (tree t)
601 {
602 return build_nt (EXPR_CONSTR, TREE_OPERAND (t, 0));
603 }
604
605 /* A type requirement T introduce a type constraint for its type. */
606
607 inline tree
normalize_type_requirement(tree t)608 normalize_type_requirement (tree t)
609 {
610 return build_nt (TYPE_CONSTR, TREE_OPERAND (t, 0));
611 }
612
613 /* A compound requirement T introduces a conjunction of constraints
614 depending on its form. The conjunction always includes an
615 expression constraint for the expression of the requirement.
616 If a trailing return type was specified, the conjunction includes
617 either an implicit conversion constraint or an argument deduction
618 constraint. If the noexcept specifier is present, the conjunction
619 includes an exception constraint. */
620
621 tree
normalize_compound_requirement(tree t)622 normalize_compound_requirement (tree t)
623 {
624 tree expr = TREE_OPERAND (t, 0);
625 tree constr = build_nt (EXPR_CONSTR, TREE_OPERAND (t, 0));
626
627 /* If a type is given, append an implicit conversion or
628 argument deduction constraint. */
629 if (tree type = TREE_OPERAND (t, 1))
630 {
631 tree type_constr;
632 /* TODO: We should be extracting a list of auto nodes
633 from type_uses_auto, not a single node */
634 if (tree placeholder = type_uses_auto (type))
635 type_constr = build_nt (DEDUCT_CONSTR, expr, type, placeholder);
636 else
637 type_constr = build_nt (ICONV_CONSTR, expr, type);
638 constr = conjoin_constraints (constr, type_constr);
639 }
640
641 /* If noexcept is present, append an exception constraint. */
642 if (COMPOUND_REQ_NOEXCEPT_P (t))
643 {
644 tree except = build_nt (EXCEPT_CONSTR, expr);
645 constr = conjoin_constraints (constr, except);
646 }
647
648 return constr;
649 }
650
651 /* A nested requirement T introduces a conjunction of constraints
652 corresponding to its constraint-expression.
653
654 If the result of transforming T is error_mark_node, the resulting
655 constraint is a predicate constraint whose operand is also
656 error_mark_node. This preserves the constraint structure, but
657 will guarantee that the constraint is never satisfied. */
658
659 inline tree
normalize_nested_requirement(tree t)660 normalize_nested_requirement (tree t)
661 {
662 return normalize_expression (TREE_OPERAND (t, 0));
663 }
664
665 /* Transform a requirement T into one or more constraints. */
666
667 tree
normalize_requirement(tree t)668 normalize_requirement (tree t)
669 {
670 switch (TREE_CODE (t))
671 {
672 case SIMPLE_REQ:
673 return normalize_simple_requirement (t);
674
675 case TYPE_REQ:
676 return normalize_type_requirement (t);
677
678 case COMPOUND_REQ:
679 return normalize_compound_requirement (t);
680
681 case NESTED_REQ:
682 return normalize_nested_requirement (t);
683
684 default:
685 gcc_unreachable ();
686 }
687 return error_mark_node;
688 }
689
690 /* Transform a sequence of requirements into a conjunction of
691 constraints. */
692
693 tree
normalize_requirements(tree t)694 normalize_requirements (tree t)
695 {
696 tree result = NULL_TREE;
697 for (; t; t = TREE_CHAIN (t))
698 {
699 tree constr = normalize_requirement (TREE_VALUE (t));
700 result = conjoin_constraints (result, constr);
701 }
702 return result;
703 }
704
705 /* The normal form of a requires-expression is a parameterized
706 constraint having the same parameters and a conjunction of
707 constraints representing the normal form of requirements. */
708
709 tree
normalize_requires_expression(tree t)710 normalize_requires_expression (tree t)
711 {
712 tree operand = normalize_requirements (TREE_OPERAND (t, 1));
713 if (tree parms = TREE_OPERAND (t, 0))
714 return build_nt (PARM_CONSTR, parms, operand);
715 else
716 return operand;
717 }
718
719 /* For a template-id referring to a variable concept, returns
720 a check constraint. Otherwise, returns a predicate constraint. */
721
722 tree
normalize_template_id_expression(tree t)723 normalize_template_id_expression (tree t)
724 {
725 if (tree info = resolve_variable_concept_check (t))
726 {
727 if (info == error_mark_node)
728 {
729 /* We get this when the template arguments don't match
730 the variable concept. */
731 error ("invalid reference to concept %qE", t);
732 return error_mark_node;
733 }
734
735 tree decl = TREE_VALUE (info);
736 tree args = TREE_PURPOSE (info);
737 return build_nt (CHECK_CONSTR, decl, args);
738 }
739
740 /* Check that we didn't refer to a function concept like a variable. */
741 tree tmpl = TREE_OPERAND (t, 0);
742 if (TREE_CODE (tmpl) == OVERLOAD)
743 {
744 tree fn = OVL_FUNCTION (tmpl);
745 if (TREE_CODE (fn) == TEMPLATE_DECL
746 && DECL_DECLARED_CONCEPT_P (DECL_TEMPLATE_RESULT (fn)))
747 {
748 error_at (location_of (t),
749 "invalid reference to function concept %qD", fn);
750 return error_mark_node;
751 }
752 }
753
754 return build_nt (PRED_CONSTR, t);
755 }
756
757 /* For a call expression to a function concept, returns a check
758 constraint. Otherwise, returns a predicate constraint. */
759
760 tree
normalize_call_expression(tree t)761 normalize_call_expression (tree t)
762 {
763 /* Try to resolve this function call as a concept. If not, then
764 it can be returned as a predicate constraint. */
765 tree check = resolve_constraint_check (t);
766 if (!check)
767 return build_nt (PRED_CONSTR, t);
768 if (check == error_mark_node)
769 {
770 /* TODO: Improve diagnostics. We could report why the reference
771 is invalid. */
772 error ("invalid reference to concept %qE", t);
773 return error_mark_node;
774 }
775
776 tree fn = TREE_VALUE (check);
777 tree args = TREE_PURPOSE (check);
778 return build_nt (CHECK_CONSTR, fn, args);
779 }
780
781 /* If T is a call to an overloaded && or || operator, diagnose that
782 as a non-SFINAEable error. Returns true if an error is emitted.
783
784 TODO: It would be better to diagnose this at the point of definition,
785 if possible. Perhaps we should immediately do a first-pass normalization
786 of a concept definition to catch obvious non-dependent errors like
787 this. */
788
789 bool
check_for_logical_overloads(tree t)790 check_for_logical_overloads (tree t)
791 {
792 if (TREE_CODE (t) != CALL_EXPR)
793 return false;
794
795 tree fn = CALL_EXPR_FN (t);
796
797 /* For member calls, try extracting the function from the
798 component ref. */
799 if (TREE_CODE (fn) == COMPONENT_REF)
800 {
801 fn = TREE_OPERAND (fn, 1);
802 if (TREE_CODE (fn) == BASELINK)
803 fn = BASELINK_FUNCTIONS (fn);
804 }
805
806 if (TREE_CODE (fn) != FUNCTION_DECL)
807 return false;
808
809 if (DECL_OVERLOADED_OPERATOR_P (fn))
810 {
811 location_t loc = EXPR_LOC_OR_LOC (t, input_location);
812 error_at (loc, "constraint %qE, uses overloaded operator", t);
813 return true;
814 }
815
816 return false;
817 }
818
819 /* The normal form of an atom depends on the expression. The normal
820 form of a function call to a function concept is a check constraint
821 for that concept. The normal form of a reference to a variable
822 concept is a check constraint for that concept. Otherwise, the
823 constraint is a predicate constraint. */
824
825 tree
normalize_atom(tree t)826 normalize_atom (tree t)
827 {
828 /* We can get constraints pushed down through pack expansions, so
829 just return them. */
830 if (constraint_p (t))
831 return t;
832
833 tree type = TREE_TYPE (t);
834 if (!type || type_unknown_p (t) || TREE_CODE (type) == TEMPLATE_TYPE_PARM)
835 ;
836 else if (!dependent_type_p (type))
837 {
838 if (check_for_logical_overloads (t))
839 return error_mark_node;
840
841 type = cv_unqualified (type);
842 if (!same_type_p (type, boolean_type_node))
843 {
844 error ("predicate constraint %q+E does not have type %<bool%>", t);
845 return error_mark_node;
846 }
847 }
848
849 if (TREE_CODE (t) == TEMPLATE_ID_EXPR)
850 return normalize_template_id_expression (t);
851 if (TREE_CODE (t) == CALL_EXPR)
852 return normalize_call_expression (t);
853 return build_nt (PRED_CONSTR, t);
854 }
855
856 /* Push down the pack expansion EXP into the leaves of the constraint PAT. */
857
858 tree
push_down_pack_expansion(tree exp,tree pat)859 push_down_pack_expansion (tree exp, tree pat)
860 {
861 switch (TREE_CODE (pat))
862 {
863 case CONJ_CONSTR:
864 case DISJ_CONSTR:
865 {
866 pat = copy_node (pat);
867 TREE_OPERAND (pat, 0)
868 = push_down_pack_expansion (exp, TREE_OPERAND (pat, 0));
869 TREE_OPERAND (pat, 1)
870 = push_down_pack_expansion (exp, TREE_OPERAND (pat, 1));
871 return pat;
872 }
873 default:
874 {
875 exp = copy_node (exp);
876 SET_PACK_EXPANSION_PATTERN (exp, pat);
877 return exp;
878 }
879 }
880 }
881
882 /* Transform a pack expansion into a constraint. First we transform the
883 pattern of the pack expansion, then we push the pack expansion down into the
884 leaves of the constraint so that partial ordering will work. */
885
886 tree
normalize_pack_expansion(tree t)887 normalize_pack_expansion (tree t)
888 {
889 tree pat = normalize_expression (PACK_EXPANSION_PATTERN (t));
890 return push_down_pack_expansion (t, pat);
891 }
892
893 /* Transform an expression into a constraint. */
894
895 tree
normalize_any_expression(tree t)896 normalize_any_expression (tree t)
897 {
898 switch (TREE_CODE (t))
899 {
900 case TRUTH_ANDIF_EXPR:
901 return normalize_logical_operation (t, CONJ_CONSTR);
902
903 case TRUTH_ORIF_EXPR:
904 return normalize_logical_operation (t, DISJ_CONSTR);
905
906 case REQUIRES_EXPR:
907 return normalize_requires_expression (t);
908
909 case BIND_EXPR:
910 return normalize_expression (BIND_EXPR_BODY (t));
911
912 case EXPR_PACK_EXPANSION:
913 return normalize_pack_expansion (t);
914
915 default:
916 /* All other constraints are atomic. */
917 return normalize_atom (t);
918 }
919 }
920
921 /* Transform a statement into an expression. */
922 tree
normalize_any_statement(tree t)923 normalize_any_statement (tree t)
924 {
925 switch (TREE_CODE (t))
926 {
927 case RETURN_EXPR:
928 return normalize_expression (TREE_OPERAND (t, 0));
929 default:
930 gcc_unreachable ();
931 }
932 return error_mark_node;
933 }
934
935 /* Reduction rules for the declaration T. */
936
937 tree
normalize_any_declaration(tree t)938 normalize_any_declaration (tree t)
939 {
940 switch (TREE_CODE (t))
941 {
942 case VAR_DECL:
943 return normalize_atom (t);
944 default:
945 gcc_unreachable ();
946 }
947 return error_mark_node;
948 }
949
950 /* Returns the normal form of a constraint expression. */
951
952 tree
normalize_expression(tree t)953 normalize_expression (tree t)
954 {
955 if (!t)
956 return NULL_TREE;
957
958 if (t == error_mark_node)
959 return error_mark_node;
960
961 switch (TREE_CODE_CLASS (TREE_CODE (t)))
962 {
963 case tcc_unary:
964 case tcc_binary:
965 case tcc_expression:
966 case tcc_vl_exp:
967 return normalize_any_expression (t);
968
969 case tcc_statement:
970 return normalize_any_statement (t);
971
972 case tcc_declaration:
973 return normalize_any_declaration (t);
974
975 case tcc_exceptional:
976 case tcc_constant:
977 case tcc_reference:
978 case tcc_comparison:
979 /* These are all atomic predicate constraints. */
980 return normalize_atom (t);
981
982 default:
983 /* Unhandled node kind. */
984 gcc_unreachable ();
985 }
986 return error_mark_node;
987 }
988
989
990 /*---------------------------------------------------------------------------
991 Constraint normalization
992 ---------------------------------------------------------------------------*/
993
994 tree normalize_constraint (tree);
995
996 /* The normal form of the disjunction T0 /\ T1 is the conjunction
997 of the normal form of T0 and the normal form of T1. */
998
999 inline tree
normalize_conjunction(tree t)1000 normalize_conjunction (tree t)
1001 {
1002 tree t0 = normalize_constraint (TREE_OPERAND (t, 0));
1003 tree t1 = normalize_constraint (TREE_OPERAND (t, 1));
1004 return build_nt (CONJ_CONSTR, t0, t1);
1005 }
1006
1007 /* The normal form of the disjunction T0 \/ T1 is the disjunction
1008 of the normal form of T0 and the normal form of T1. */
1009
1010 inline tree
normalize_disjunction(tree t)1011 normalize_disjunction (tree t)
1012 {
1013 tree t0 = normalize_constraint (TREE_OPERAND (t, 0));
1014 tree t1 = normalize_constraint (TREE_OPERAND (t, 1));
1015 return build_nt (DISJ_CONSTR, t0, t1);
1016 }
1017
1018 /* A predicate constraint is normalized in two stages. First all
1019 references specializations of concepts are replaced by their
1020 substituted definitions. Then, the resulting expression is
1021 transformed into a constraint by transforming && expressions
1022 into conjunctions and || into disjunctions. */
1023
1024 tree
normalize_predicate_constraint(tree t)1025 normalize_predicate_constraint (tree t)
1026 {
1027 ++processing_template_decl;
1028 tree expr = PRED_CONSTR_EXPR (t);
1029 tree constr = normalize_expression (expr);
1030 --processing_template_decl;
1031 return constr;
1032 }
1033
1034 /* The normal form of a parameterized constraint is the normal
1035 form of its operand. */
1036
1037 tree
normalize_parameterized_constraint(tree t)1038 normalize_parameterized_constraint (tree t)
1039 {
1040 tree parms = PARM_CONSTR_PARMS (t);
1041 tree operand = normalize_constraint (PARM_CONSTR_OPERAND (t));
1042 return build_nt (PARM_CONSTR, parms, operand);
1043 }
1044
1045 /* Normalize the constraint T by reducing it so that it is
1046 comprised of only conjunctions and disjunctions of atomic
1047 constraints. */
1048
1049 tree
normalize_constraint(tree t)1050 normalize_constraint (tree t)
1051 {
1052 if (!t)
1053 return NULL_TREE;
1054
1055 if (t == error_mark_node)
1056 return t;
1057
1058 switch (TREE_CODE (t))
1059 {
1060 case CONJ_CONSTR:
1061 return normalize_conjunction (t);
1062
1063 case DISJ_CONSTR:
1064 return normalize_disjunction (t);
1065
1066 case PRED_CONSTR:
1067 return normalize_predicate_constraint (t);
1068
1069 case PARM_CONSTR:
1070 return normalize_parameterized_constraint (t);
1071
1072 case EXPR_CONSTR:
1073 case TYPE_CONSTR:
1074 case ICONV_CONSTR:
1075 case DEDUCT_CONSTR:
1076 case EXCEPT_CONSTR:
1077 /* These constraints are defined to be atomic. */
1078 return t;
1079
1080 default:
1081 /* CONSTR was not a constraint. */
1082 gcc_unreachable();
1083 }
1084 return error_mark_node;
1085 }
1086
1087
1088
1089 // -------------------------------------------------------------------------- //
1090 // Constraint Semantic Processing
1091 //
1092 // The following functions are called by the parser and substitution rules
1093 // to create and evaluate constraint-related nodes.
1094
1095 // The constraints associated with the current template parameters.
1096 tree
current_template_constraints(void)1097 current_template_constraints (void)
1098 {
1099 if (!current_template_parms)
1100 return NULL_TREE;
1101 tree tmpl_constr = TEMPLATE_PARM_CONSTRAINTS (current_template_parms);
1102 return build_constraints (tmpl_constr, NULL_TREE);
1103 }
1104
1105 // If the recently parsed TYPE declares or defines a template or template
1106 // specialization, get its corresponding constraints from the current
1107 // template parameters and bind them to TYPE's declaration.
1108 tree
associate_classtype_constraints(tree type)1109 associate_classtype_constraints (tree type)
1110 {
1111 if (!type || type == error_mark_node || TREE_CODE (type) != RECORD_TYPE)
1112 return type;
1113
1114 // An explicit class template specialization has no template
1115 // parameters.
1116 if (!current_template_parms)
1117 return type;
1118
1119 if (CLASSTYPE_IS_TEMPLATE (type) || CLASSTYPE_TEMPLATE_SPECIALIZATION (type))
1120 {
1121 tree decl = TYPE_STUB_DECL (type);
1122 tree ci = current_template_constraints ();
1123
1124 // An implicitly instantiated member template declaration already
1125 // has associated constraints. If it is defined outside of its
1126 // class, then we need match these constraints against those of
1127 // original declaration.
1128 if (tree orig_ci = get_constraints (decl))
1129 {
1130 if (!equivalent_constraints (ci, orig_ci))
1131 {
1132 // FIXME: Improve diagnostics.
1133 error ("%qT does not match any declaration", type);
1134 return error_mark_node;
1135 }
1136 return type;
1137 }
1138 set_constraints (decl, ci);
1139 }
1140 return type;
1141 }
1142
1143 namespace {
1144
1145 // Create an empty constraint info block.
1146 inline tree_constraint_info*
build_constraint_info()1147 build_constraint_info ()
1148 {
1149 return (tree_constraint_info *)make_node (CONSTRAINT_INFO);
1150 }
1151
1152 } // namespace
1153
1154 /* Build a constraint-info object that contains the associated constraints
1155 of a declaration. This also includes the declaration's template
1156 requirements (TREQS) and any trailing requirements for a function
1157 declarator (DREQS). Note that both TREQS and DREQS must be constraints.
1158
1159 If the declaration has neither template nor declaration requirements
1160 this returns NULL_TREE, indicating an unconstrained declaration. */
1161
1162 tree
build_constraints(tree tmpl_reqs,tree decl_reqs)1163 build_constraints (tree tmpl_reqs, tree decl_reqs)
1164 {
1165 gcc_assert (tmpl_reqs ? constraint_p (tmpl_reqs) : true);
1166 gcc_assert (decl_reqs ? constraint_p (decl_reqs) : true);
1167
1168 if (!tmpl_reqs && !decl_reqs)
1169 return NULL_TREE;
1170
1171 tree_constraint_info* ci = build_constraint_info ();
1172 ci->template_reqs = tmpl_reqs;
1173 ci->declarator_reqs = decl_reqs;
1174 ci->associated_constr = conjoin_constraints (tmpl_reqs, decl_reqs);
1175
1176 return (tree)ci;
1177 }
1178
1179 namespace {
1180
1181 /* Construct a sequence of template arguments by prepending
1182 ARG to REST. Either ARG or REST may be null. */
1183 tree
build_concept_check_arguments(tree arg,tree rest)1184 build_concept_check_arguments (tree arg, tree rest)
1185 {
1186 gcc_assert (rest ? TREE_CODE (rest) == TREE_VEC : true);
1187 tree args;
1188 if (arg)
1189 {
1190 int n = rest ? TREE_VEC_LENGTH (rest) : 0;
1191 args = make_tree_vec (n + 1);
1192 TREE_VEC_ELT (args, 0) = arg;
1193 if (rest)
1194 for (int i = 0; i < n; ++i)
1195 TREE_VEC_ELT (args, i + 1) = TREE_VEC_ELT (rest, i);
1196 int def = rest ? GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (rest) : 0;
1197 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (args, def + 1);
1198 }
1199 else
1200 {
1201 gcc_assert (rest != NULL_TREE);
1202 args = rest;
1203 }
1204 return args;
1205 }
1206
1207 } // namespace
1208
1209 /* Construct an expression that checks the concept given by
1210 TARGET. The TARGET must be:
1211
1212 - an OVERLOAD referring to one or more function concepts
1213 - a BASELINK referring to an overload set of the above, or
1214 - a TEMPLTATE_DECL referring to a variable concept.
1215
1216 ARG and REST are the explicit template arguments for the
1217 eventual concept check. */
1218 tree
build_concept_check(tree target,tree arg,tree rest)1219 build_concept_check (tree target, tree arg, tree rest)
1220 {
1221 tree args = build_concept_check_arguments (arg, rest);
1222 if (variable_template_p (target))
1223 return build_variable_check (lookup_template_variable (target, args));
1224 else
1225 return build_call_check (lookup_template_function (target, args));
1226 }
1227
1228
1229 /* Returns a TYPE_DECL that contains sufficient information to
1230 build a template parameter of the same kind as PROTO and
1231 constrained by the concept declaration CNC. Note that PROTO
1232 is the first template parameter of CNC.
1233
1234 If specified, ARGS provides additional arguments to the
1235 constraint check. */
1236 tree
build_constrained_parameter(tree cnc,tree proto,tree args)1237 build_constrained_parameter (tree cnc, tree proto, tree args)
1238 {
1239 tree name = DECL_NAME (cnc);
1240 tree type = TREE_TYPE (proto);
1241 tree decl = build_decl (input_location, TYPE_DECL, name, type);
1242 CONSTRAINED_PARM_PROTOTYPE (decl) = proto;
1243 CONSTRAINED_PARM_CONCEPT (decl) = cnc;
1244 CONSTRAINED_PARM_EXTRA_ARGS (decl) = args;
1245 return decl;
1246 }
1247
1248 /* Create a constraint expression for the given DECL that
1249 evaluates the requirements specified by CONSTR, a TYPE_DECL
1250 that contains all the information necessary to build the
1251 requirements (see finish_concept_name for the layout of
1252 that TYPE_DECL).
1253
1254 Note that the constraints are neither reduced nor decomposed.
1255 That is done only after the requires clause has been parsed
1256 (or not).
1257
1258 This will always return a CHECK_CONSTR. */
1259 tree
finish_shorthand_constraint(tree decl,tree constr)1260 finish_shorthand_constraint (tree decl, tree constr)
1261 {
1262 /* No requirements means no constraints. */
1263 if (!constr)
1264 return NULL_TREE;
1265
1266 tree proto = CONSTRAINED_PARM_PROTOTYPE (constr);
1267 tree con = CONSTRAINED_PARM_CONCEPT (constr);
1268 tree args = CONSTRAINED_PARM_EXTRA_ARGS (constr);
1269
1270 /* If the parameter declaration is variadic, but the concept
1271 is not then we need to apply the concept to every element
1272 in the pack. */
1273 bool is_proto_pack = template_parameter_pack_p (proto);
1274 bool is_decl_pack = template_parameter_pack_p (decl);
1275 bool apply_to_all_p = is_decl_pack && !is_proto_pack;
1276
1277 /* Get the argument and overload used for the requirement
1278 and adjust it if we're going to expand later. */
1279 tree arg = template_parm_to_arg (build_tree_list (NULL_TREE, decl));
1280 if (apply_to_all_p)
1281 arg = PACK_EXPANSION_PATTERN (TREE_VEC_ELT (ARGUMENT_PACK_ARGS (arg), 0));
1282
1283 /* Build the concept check. If it the constraint needs to be
1284 applied to all elements of the parameter pack, then make
1285 the constraint an expansion. */
1286 tree check;
1287 tree tmpl = DECL_TI_TEMPLATE (con);
1288 if (TREE_CODE (con) == VAR_DECL)
1289 {
1290 check = build_concept_check (tmpl, arg, args);
1291 }
1292 else
1293 {
1294 tree ovl = build_overload (tmpl, NULL_TREE);
1295 check = build_concept_check (ovl, arg, args);
1296 }
1297
1298 /* Make the check a pack expansion if needed.
1299
1300 FIXME: We should be making a fold expression. */
1301 if (apply_to_all_p)
1302 {
1303 check = make_pack_expansion (check);
1304 TREE_TYPE (check) = boolean_type_node;
1305 }
1306
1307 return normalize_expression (check);
1308 }
1309
1310 /* Returns a conjunction of shorthand requirements for the template
1311 parameter list PARMS. Note that the requirements are stored in
1312 the TYPE of each tree node. */
1313 tree
get_shorthand_constraints(tree parms)1314 get_shorthand_constraints (tree parms)
1315 {
1316 tree result = NULL_TREE;
1317 parms = INNERMOST_TEMPLATE_PARMS (parms);
1318 for (int i = 0; i < TREE_VEC_LENGTH (parms); ++i)
1319 {
1320 tree parm = TREE_VEC_ELT (parms, i);
1321 tree constr = TEMPLATE_PARM_CONSTRAINTS (parm);
1322 result = conjoin_constraints (result, constr);
1323 }
1324 return result;
1325 }
1326
1327 // Returns and chains a new parameter for PARAMETER_LIST which will conform
1328 // to the prototype given by SRC_PARM. The new parameter will have its
1329 // identifier and location set according to IDENT and PARM_LOC respectively.
1330 static tree
process_introduction_parm(tree parameter_list,tree src_parm)1331 process_introduction_parm (tree parameter_list, tree src_parm)
1332 {
1333 // If we have a pack, we should have a single pack argument which is the
1334 // placeholder we want to look at.
1335 bool is_parameter_pack = ARGUMENT_PACK_P (src_parm);
1336 if (is_parameter_pack)
1337 src_parm = TREE_VEC_ELT (ARGUMENT_PACK_ARGS (src_parm), 0);
1338
1339 // At this point we should have a wildcard, but we want to
1340 // grab the associated decl from it. Also grab the stored
1341 // identifier and location that should be chained to it in
1342 // a PARM_DECL.
1343 gcc_assert (TREE_CODE (src_parm) == WILDCARD_DECL);
1344
1345 tree ident = DECL_NAME (src_parm);
1346 location_t parm_loc = DECL_SOURCE_LOCATION (src_parm);
1347
1348 // If we expect a pack and the deduced template is not a pack, or if the
1349 // template is using a pack and we didn't declare a pack, throw an error.
1350 if (is_parameter_pack != WILDCARD_PACK_P (src_parm))
1351 {
1352 error_at (parm_loc, "cannot match pack for introduced parameter");
1353 tree err_parm = build_tree_list (error_mark_node, error_mark_node);
1354 return chainon (parameter_list, err_parm);
1355 }
1356
1357 src_parm = TREE_TYPE (src_parm);
1358
1359 tree parm;
1360 bool is_non_type;
1361 if (TREE_CODE (src_parm) == TYPE_DECL)
1362 {
1363 is_non_type = false;
1364 parm = finish_template_type_parm (class_type_node, ident);
1365 }
1366 else if (TREE_CODE (src_parm) == TEMPLATE_DECL)
1367 {
1368 is_non_type = false;
1369 begin_template_parm_list ();
1370 current_template_parms = DECL_TEMPLATE_PARMS (src_parm);
1371 end_template_parm_list ();
1372 parm = finish_template_template_parm (class_type_node, ident);
1373 }
1374 else
1375 {
1376 is_non_type = true;
1377
1378 // Since we don't have a declarator, so we can copy the source
1379 // parameter and change the name and eventually the location.
1380 parm = copy_decl (src_parm);
1381 DECL_NAME (parm) = ident;
1382 }
1383
1384 // Wrap in a TREE_LIST for process_template_parm. Introductions do not
1385 // retain the defaults from the source template.
1386 parm = build_tree_list (NULL_TREE, parm);
1387
1388 return process_template_parm (parameter_list, parm_loc, parm,
1389 is_non_type, is_parameter_pack);
1390 }
1391
1392 /* Associates a constraint check to the current template based
1393 on the introduction parameters. INTRO_LIST must be a TREE_VEC
1394 of WILDCARD_DECLs containing a chained PARM_DECL which
1395 contains the identifier as well as the source location.
1396 TMPL_DECL is the decl for the concept being used. If we
1397 take a concept, C, this will form a check in the form of
1398 C<INTRO_LIST> filling in any extra arguments needed by the
1399 defaults deduced.
1400
1401 Returns NULL_TREE if no concept could be matched and
1402 error_mark_node if an error occurred when matching. */
1403 tree
finish_template_introduction(tree tmpl_decl,tree intro_list)1404 finish_template_introduction (tree tmpl_decl, tree intro_list)
1405 {
1406 /* Deduce the concept check. */
1407 tree expr = build_concept_check (tmpl_decl, NULL_TREE, intro_list);
1408 if (expr == error_mark_node)
1409 return NULL_TREE;
1410
1411 tree parms = deduce_concept_introduction (expr);
1412 if (!parms)
1413 return NULL_TREE;
1414
1415 /* Build template parameter scope for introduction. */
1416 tree parm_list = NULL_TREE;
1417 begin_template_parm_list ();
1418 int nargs = MIN (TREE_VEC_LENGTH (parms), TREE_VEC_LENGTH (intro_list));
1419 for (int n = 0; n < nargs; ++n)
1420 parm_list = process_introduction_parm (parm_list, TREE_VEC_ELT (parms, n));
1421 parm_list = end_template_parm_list (parm_list);
1422 for (int i = 0; i < TREE_VEC_LENGTH (parm_list); ++i)
1423 if (TREE_VALUE (TREE_VEC_ELT (parm_list, i)) == error_mark_node)
1424 {
1425 end_template_decl ();
1426 return error_mark_node;
1427 }
1428
1429 /* Build a concept check for our constraint. */
1430 tree check_args = make_tree_vec (TREE_VEC_LENGTH (parms));
1431 int n = 0;
1432 for (; n < TREE_VEC_LENGTH (parm_list); ++n)
1433 {
1434 tree parm = TREE_VEC_ELT (parm_list, n);
1435 TREE_VEC_ELT (check_args, n) = template_parm_to_arg (parm);
1436 }
1437 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (check_args, n);
1438
1439 /* If the template expects more parameters we should be able
1440 to use the defaults from our deduced concept. */
1441 for (; n < TREE_VEC_LENGTH (parms); ++n)
1442 TREE_VEC_ELT (check_args, n) = TREE_VEC_ELT (parms, n);
1443
1444 /* Associate the constraint. */
1445 tree check = build_concept_check (tmpl_decl, NULL_TREE, check_args);
1446 tree constr = normalize_expression (check);
1447 TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = constr;
1448
1449 return parm_list;
1450 }
1451
1452
1453 /* Given the predicate constraint T from a constrained-type-specifier, extract
1454 its TMPL and ARGS. FIXME why do we need two different forms of
1455 constrained-type-specifier? */
1456
1457 void
placeholder_extract_concept_and_args(tree t,tree & tmpl,tree & args)1458 placeholder_extract_concept_and_args (tree t, tree &tmpl, tree &args)
1459 {
1460 if (TREE_CODE (t) == TYPE_DECL)
1461 {
1462 /* A constrained parameter. Build a constraint check
1463 based on the prototype parameter and then extract the
1464 arguments from that. */
1465 tree proto = CONSTRAINED_PARM_PROTOTYPE (t);
1466 tree check = finish_shorthand_constraint (proto, t);
1467 placeholder_extract_concept_and_args (check, tmpl, args);
1468 return;
1469 }
1470
1471 if (TREE_CODE (t) == CHECK_CONSTR)
1472 {
1473 tree decl = CHECK_CONSTR_CONCEPT (t);
1474 tmpl = DECL_TI_TEMPLATE (decl);
1475 args = CHECK_CONSTR_ARGS (t);
1476 return;
1477 }
1478
1479 gcc_unreachable ();
1480 }
1481
1482 /* Returns true iff the placeholders C1 and C2 are equivalent. C1
1483 and C2 can be either CHECK_CONSTR or TEMPLATE_TYPE_PARM. */
1484
1485 bool
equivalent_placeholder_constraints(tree c1,tree c2)1486 equivalent_placeholder_constraints (tree c1, tree c2)
1487 {
1488 if (c1 && TREE_CODE (c1) == TEMPLATE_TYPE_PARM)
1489 /* A constrained auto. */
1490 c1 = PLACEHOLDER_TYPE_CONSTRAINTS (c1);
1491 if (c2 && TREE_CODE (c2) == TEMPLATE_TYPE_PARM)
1492 c2 = PLACEHOLDER_TYPE_CONSTRAINTS (c2);
1493
1494 if (c1 == c2)
1495 return true;
1496 if (!c1 || !c2)
1497 return false;
1498 if (c1 == error_mark_node || c2 == error_mark_node)
1499 /* We get here during satisfaction; when a deduction constraint
1500 fails, substitution can produce an error_mark_node for the
1501 placeholder constraints. */
1502 return false;
1503
1504 tree t1, t2, a1, a2;
1505 placeholder_extract_concept_and_args (c1, t1, a1);
1506 placeholder_extract_concept_and_args (c2, t2, a2);
1507
1508 if (t1 != t2)
1509 return false;
1510
1511 int len1 = TREE_VEC_LENGTH (a1);
1512 int len2 = TREE_VEC_LENGTH (a2);
1513 if (len1 != len2)
1514 return false;
1515
1516 /* Skip the first argument so we don't infinitely recurse.
1517 Also, they may differ in template parameter index. */
1518 for (int i = 1; i < len1; ++i)
1519 {
1520 tree t1 = TREE_VEC_ELT (a1, i);
1521 tree t2 = TREE_VEC_ELT (a2, i);
1522 if (!template_args_equal (t1, t2))
1523 return false;
1524 }
1525 return true;
1526 }
1527
1528 /* Return a hash value for the placeholder PRED_CONSTR C. */
1529
1530 hashval_t
hash_placeholder_constraint(tree c)1531 hash_placeholder_constraint (tree c)
1532 {
1533 tree t, a;
1534 placeholder_extract_concept_and_args (c, t, a);
1535
1536 /* Like hash_tmpl_and_args, but skip the first argument. */
1537 hashval_t val = iterative_hash_object (DECL_UID (t), 0);
1538
1539 for (int i = TREE_VEC_LENGTH (a)-1; i > 0; --i)
1540 val = iterative_hash_template_arg (TREE_VEC_ELT (a, i), val);
1541
1542 return val;
1543 }
1544
1545 /*---------------------------------------------------------------------------
1546 Constraint substitution
1547 ---------------------------------------------------------------------------*/
1548
1549 /* The following functions implement substitution rules for constraints.
1550 Substitution without checking constraints happens only in the
1551 instantiation of class templates. For example:
1552
1553 template<C1 T> struct S {
1554 void f(T) requires C2<T>;
1555 void g(T) requires T::value;
1556 };
1557
1558 S<int> s; // error instantiating S<int>::g(T)
1559
1560 When we instantiate S, we substitute into its member declarations,
1561 including their constraints. However, those constraints are not
1562 checked. Substituting int into C2<T> yields C2<int>, and substituting
1563 into T::value yields a substitution failure, making the program
1564 ill-formed.
1565
1566 Note that we only ever substitute into the associated constraints
1567 of a declaration. That is, substitution is defined only for predicate
1568 constraints and conjunctions. */
1569
1570 /* Substitute into the predicate constraints. Returns error_mark_node
1571 if the substitution into the expression fails. */
1572 tree
tsubst_predicate_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)1573 tsubst_predicate_constraint (tree t, tree args,
1574 tsubst_flags_t complain, tree in_decl)
1575 {
1576 tree expr = PRED_CONSTR_EXPR (t);
1577 ++processing_template_decl;
1578 tree result = tsubst_expr (expr, args, complain, in_decl, false);
1579 --processing_template_decl;
1580 return build_nt (PRED_CONSTR, result);
1581 }
1582
1583 /* Substitute into a check constraint. */
1584
1585 tree
tsubst_check_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)1586 tsubst_check_constraint (tree t, tree args,
1587 tsubst_flags_t complain, tree in_decl)
1588 {
1589 tree decl = CHECK_CONSTR_CONCEPT (t);
1590 tree tmpl = DECL_TI_TEMPLATE (decl);
1591 tree targs = CHECK_CONSTR_ARGS (t);
1592
1593 /* Substitute through by building an template-id expression
1594 and then substituting into that. */
1595 tree expr = build_nt(TEMPLATE_ID_EXPR, tmpl, targs);
1596 ++processing_template_decl;
1597 tree result = tsubst_expr (expr, args, complain, in_decl, false);
1598 --processing_template_decl;
1599
1600 if (result == error_mark_node)
1601 return error_mark_node;
1602
1603 /* Extract the results and rebuild the check constraint. */
1604 decl = DECL_TEMPLATE_RESULT (TREE_OPERAND (result, 0));
1605 args = TREE_OPERAND (result, 1);
1606
1607 return build_nt (CHECK_CONSTR, decl, args);
1608 }
1609
1610 /* Substitute into the conjunction of constraints. Returns
1611 error_mark_node if substitution into either operand fails. */
1612
1613 tree
tsubst_logical_operator(tree t,tree args,tsubst_flags_t complain,tree in_decl)1614 tsubst_logical_operator (tree t, tree args,
1615 tsubst_flags_t complain, tree in_decl)
1616 {
1617 tree t0 = TREE_OPERAND (t, 0);
1618 tree r0 = tsubst_constraint (t0, args, complain, in_decl);
1619 if (r0 == error_mark_node)
1620 return error_mark_node;
1621 tree t1 = TREE_OPERAND (t, 1);
1622 tree r1 = tsubst_constraint (t1, args, complain, in_decl);
1623 if (r1 == error_mark_node)
1624 return error_mark_node;
1625 return build_nt (TREE_CODE (t), r0, r1);
1626 }
1627
1628 namespace {
1629
1630 /* Substitute ARGS into the expression constraint T. */
1631
1632 tree
tsubst_expr_constr(tree t,tree args,tsubst_flags_t complain,tree in_decl)1633 tsubst_expr_constr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
1634 {
1635 cp_unevaluated guard;
1636 tree expr = EXPR_CONSTR_EXPR (t);
1637 tree ret = tsubst_expr (expr, args, complain, in_decl, false);
1638 if (ret == error_mark_node)
1639 return error_mark_node;
1640 return build_nt (EXPR_CONSTR, ret);
1641 }
1642
1643 /* Substitute ARGS into the type constraint T. */
1644
1645 tree
tsubst_type_constr(tree t,tree args,tsubst_flags_t complain,tree in_decl)1646 tsubst_type_constr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
1647 {
1648 tree type = TYPE_CONSTR_TYPE (t);
1649 tree ret = tsubst (type, args, complain, in_decl);
1650 if (ret == error_mark_node)
1651 return error_mark_node;
1652 return build_nt (TYPE_CONSTR, ret);
1653 }
1654
1655 /* Substitute ARGS into the implicit conversion constraint T. */
1656
1657 tree
tsubst_implicit_conversion_constr(tree t,tree args,tsubst_flags_t complain,tree in_decl)1658 tsubst_implicit_conversion_constr (tree t, tree args, tsubst_flags_t complain,
1659 tree in_decl)
1660 {
1661 cp_unevaluated guard;
1662 tree expr = ICONV_CONSTR_EXPR (t);
1663 tree type = ICONV_CONSTR_TYPE (t);
1664 tree new_expr = tsubst_expr (expr, args, complain, in_decl, false);
1665 if (new_expr == error_mark_node)
1666 return error_mark_node;
1667 tree new_type = tsubst (type, args, complain, in_decl);
1668 if (new_type == error_mark_node)
1669 return error_mark_node;
1670 return build_nt (ICONV_CONSTR, new_expr, new_type);
1671 }
1672
1673 /* Substitute ARGS into the argument deduction constraint T. */
1674
1675 tree
tsubst_argument_deduction_constr(tree t,tree args,tsubst_flags_t complain,tree in_decl)1676 tsubst_argument_deduction_constr (tree t, tree args, tsubst_flags_t complain,
1677 tree in_decl)
1678 {
1679 cp_unevaluated guard;
1680 tree expr = DEDUCT_CONSTR_EXPR (t);
1681 tree pattern = DEDUCT_CONSTR_PATTERN (t);
1682 tree autos = DEDUCT_CONSTR_PLACEHOLDER(t);
1683 tree new_expr = tsubst_expr (expr, args, complain, in_decl, false);
1684 if (new_expr == error_mark_node)
1685 return error_mark_node;
1686 /* It seems like substituting through the pattern will not affect the
1687 placeholders. We should (?) be able to reuse the existing list
1688 without any problems. If not, then we probably want to create a
1689 new list of placeholders and then instantiate the pattern using
1690 those. */
1691 tree new_pattern = tsubst (pattern, args, complain, in_decl);
1692 if (new_pattern == error_mark_node)
1693 return error_mark_node;
1694 return build_nt (DEDUCT_CONSTR, new_expr, new_pattern, autos);
1695 }
1696
1697 /* Substitute ARGS into the exception constraint T. */
1698
1699 tree
tsubst_exception_constr(tree t,tree args,tsubst_flags_t complain,tree in_decl)1700 tsubst_exception_constr (tree t, tree args, tsubst_flags_t complain,
1701 tree in_decl)
1702 {
1703 cp_unevaluated guard;
1704 tree expr = EXCEPT_CONSTR_EXPR (t);
1705 tree ret = tsubst_expr (expr, args, complain, in_decl, false);
1706 if (ret == error_mark_node)
1707 return error_mark_node;
1708 return build_nt (EXCEPT_CONSTR, ret);
1709 }
1710
1711 /* A subroutine of tsubst_constraint_variables. Register local
1712 specializations for each of parameter in PARMS and its
1713 corresponding substituted constraint variable in VARS.
1714 Returns VARS. */
1715
1716 tree
declare_constraint_vars(tree parms,tree vars)1717 declare_constraint_vars (tree parms, tree vars)
1718 {
1719 tree s = vars;
1720 for (tree t = parms; t; t = DECL_CHAIN (t))
1721 {
1722 if (DECL_PACK_P (t))
1723 {
1724 tree pack = extract_fnparm_pack (t, &s);
1725 register_local_specialization (pack, t);
1726 }
1727 else
1728 {
1729 register_local_specialization (s, t);
1730 s = DECL_CHAIN (s);
1731 }
1732 }
1733 return vars;
1734 }
1735
1736 /* A subroutine of tsubst_parameterized_constraint. Substitute ARGS
1737 into the parameter list T, producing a sequence of constraint
1738 variables, declared in the current scope.
1739
1740 Note that the caller must establish a local specialization stack
1741 prior to calling this function since this substitution will
1742 declare the substituted parameters. */
1743
1744 tree
tsubst_constraint_variables(tree t,tree args,tsubst_flags_t complain,tree in_decl)1745 tsubst_constraint_variables (tree t, tree args,
1746 tsubst_flags_t complain, tree in_decl)
1747 {
1748 /* Clear cp_unevaluated_operand across tsubst so that we get a proper chain
1749 of PARM_DECLs. */
1750 int saved_unevaluated_operand = cp_unevaluated_operand;
1751 cp_unevaluated_operand = 0;
1752 tree vars = tsubst (t, args, complain, in_decl);
1753 cp_unevaluated_operand = saved_unevaluated_operand;
1754 if (vars == error_mark_node)
1755 return error_mark_node;
1756 return declare_constraint_vars (t, vars);
1757 }
1758
1759 /* Substitute ARGS into the parameterized constraint T. */
1760
1761 tree
tsubst_parameterized_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)1762 tsubst_parameterized_constraint (tree t, tree args,
1763 tsubst_flags_t complain, tree in_decl)
1764 {
1765 local_specialization_stack stack;
1766 tree vars = tsubst_constraint_variables (PARM_CONSTR_PARMS (t),
1767 args, complain, in_decl);
1768 if (vars == error_mark_node)
1769 return error_mark_node;
1770 tree expr = tsubst_constraint (PARM_CONSTR_OPERAND (t), args,
1771 complain, in_decl);
1772 if (expr == error_mark_node)
1773 return error_mark_node;
1774 return build_nt (PARM_CONSTR, vars, expr);
1775 }
1776
1777 /* Substitute ARGS into the simple requirement T. Note that
1778 substitution may result in an ill-formed expression without
1779 causing the program to be ill-formed. In such cases, the
1780 requirement wraps an error_mark_node. */
1781
1782 inline tree
tsubst_simple_requirement(tree t,tree args,tsubst_flags_t complain,tree in_decl)1783 tsubst_simple_requirement (tree t, tree args,
1784 tsubst_flags_t complain, tree in_decl)
1785 {
1786 ++processing_template_decl;
1787 tree expr = tsubst_expr (TREE_OPERAND (t, 0), args, complain, in_decl, false);
1788 --processing_template_decl;
1789 return finish_simple_requirement (expr);
1790 }
1791
1792 /* Substitute ARGS into the type requirement T. Note that
1793 substitution may result in an ill-formed type without
1794 causing the program to be ill-formed. In such cases, the
1795 requirement wraps an error_mark_node. */
1796
1797 inline tree
tsubst_type_requirement(tree t,tree args,tsubst_flags_t complain,tree in_decl)1798 tsubst_type_requirement (tree t, tree args,
1799 tsubst_flags_t complain, tree in_decl)
1800 {
1801 ++processing_template_decl;
1802 tree type = tsubst (TREE_OPERAND (t, 0), args, complain, in_decl);
1803 --processing_template_decl;
1804 return finish_type_requirement (type);
1805 }
1806
1807 /* Substitute args into the compound requirement T. If substituting
1808 into either the expression or the type fails, the corresponding
1809 operands in the resulting node will be error_mark_node. This
1810 preserves a requirement for the purpose of partial ordering, but
1811 it will never be satisfied. */
1812
1813 tree
tsubst_compound_requirement(tree t,tree args,tsubst_flags_t complain,tree in_decl)1814 tsubst_compound_requirement (tree t, tree args,
1815 tsubst_flags_t complain, tree in_decl)
1816 {
1817 ++processing_template_decl;
1818 tree expr = tsubst_expr (TREE_OPERAND (t, 0), args, complain, in_decl, false);
1819 tree type = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl);
1820 --processing_template_decl;
1821 bool noexcept_p = COMPOUND_REQ_NOEXCEPT_P (t);
1822 return finish_compound_requirement (expr, type, noexcept_p);
1823 }
1824
1825 /* Substitute ARGS into the nested requirement T. */
1826
1827 tree
tsubst_nested_requirement(tree t,tree args,tsubst_flags_t complain,tree in_decl)1828 tsubst_nested_requirement (tree t, tree args,
1829 tsubst_flags_t complain, tree in_decl)
1830 {
1831 ++processing_template_decl;
1832 tree expr = tsubst_expr (TREE_OPERAND (t, 0), args, complain, in_decl, false);
1833 --processing_template_decl;
1834 return finish_nested_requirement (expr);
1835 }
1836
1837 /* Substitute ARGS into the requirement T. */
1838
1839 inline tree
tsubst_requirement(tree t,tree args,tsubst_flags_t complain,tree in_decl)1840 tsubst_requirement (tree t, tree args, tsubst_flags_t complain, tree in_decl)
1841 {
1842 switch (TREE_CODE (t))
1843 {
1844 case SIMPLE_REQ:
1845 return tsubst_simple_requirement (t, args, complain, in_decl);
1846 case TYPE_REQ:
1847 return tsubst_type_requirement (t, args, complain, in_decl);
1848 case COMPOUND_REQ:
1849 return tsubst_compound_requirement (t, args, complain, in_decl);
1850 case NESTED_REQ:
1851 return tsubst_nested_requirement (t, args, complain, in_decl);
1852 default:
1853 gcc_unreachable ();
1854 }
1855 return error_mark_node;
1856 }
1857
1858 /* Substitute ARGS into the list of requirements T. Note that
1859 substitution failures here result in ill-formed programs. */
1860
1861 tree
tsubst_requirement_body(tree t,tree args,tsubst_flags_t complain,tree in_decl)1862 tsubst_requirement_body (tree t, tree args,
1863 tsubst_flags_t complain, tree in_decl)
1864 {
1865 tree r = NULL_TREE;
1866 while (t)
1867 {
1868 tree e = tsubst_requirement (TREE_VALUE (t), args, complain, in_decl);
1869 if (e == error_mark_node)
1870 return error_mark_node;
1871 r = tree_cons (NULL_TREE, e, r);
1872 t = TREE_CHAIN (t);
1873 }
1874 /* Ensure that the order of constraints is the same as the original. */
1875 return nreverse (r);
1876 }
1877
1878 } /* namespace */
1879
1880 /* Substitute ARGS into the requires expression T. Note that this
1881 results in the re-declaration of local parameters when
1882 substituting through the parameter list. If either substitution
1883 fails, the program is ill-formed. */
1884
1885 tree
tsubst_requires_expr(tree t,tree args,tsubst_flags_t complain,tree in_decl)1886 tsubst_requires_expr (tree t, tree args,
1887 tsubst_flags_t complain, tree in_decl)
1888 {
1889 local_specialization_stack stack;
1890
1891 tree parms = TREE_OPERAND (t, 0);
1892 if (parms)
1893 {
1894 parms = tsubst_constraint_variables (parms, args, complain, in_decl);
1895 if (parms == error_mark_node)
1896 return error_mark_node;
1897 }
1898
1899 tree reqs = TREE_OPERAND (t, 1);
1900 reqs = tsubst_requirement_body (reqs, args, complain, in_decl);
1901 if (reqs == error_mark_node)
1902 return error_mark_node;
1903
1904 return finish_requires_expr (parms, reqs);
1905 }
1906
1907 /* Substitute ARGS into the constraint information CI, producing a new
1908 constraint record. */
1909
1910 tree
tsubst_constraint_info(tree t,tree args,tsubst_flags_t complain,tree in_decl)1911 tsubst_constraint_info (tree t, tree args,
1912 tsubst_flags_t complain, tree in_decl)
1913 {
1914 if (!t || t == error_mark_node || !check_constraint_info (t))
1915 return NULL_TREE;
1916
1917 tree tmpl_constr = NULL_TREE;
1918 if (tree r = CI_TEMPLATE_REQS (t))
1919 tmpl_constr = tsubst_constraint (r, args, complain, in_decl);
1920
1921 tree decl_constr = NULL_TREE;
1922 if (tree r = CI_DECLARATOR_REQS (t))
1923 decl_constr = tsubst_constraint (r, args, complain, in_decl);
1924
1925 return build_constraints (tmpl_constr, decl_constr);
1926 }
1927
1928 /* Substitute ARGS into the constraint T. */
1929
1930 tree
tsubst_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)1931 tsubst_constraint (tree t, tree args, tsubst_flags_t complain, tree in_decl)
1932 {
1933 if (t == NULL_TREE)
1934 return t;
1935 switch (TREE_CODE (t))
1936 {
1937 case PRED_CONSTR:
1938 return tsubst_predicate_constraint (t, args, complain, in_decl);
1939 case CHECK_CONSTR:
1940 return tsubst_check_constraint (t, args, complain, in_decl);
1941 case CONJ_CONSTR:
1942 case DISJ_CONSTR:
1943 return tsubst_logical_operator (t, args, complain, in_decl);
1944 case PARM_CONSTR:
1945 return tsubst_parameterized_constraint (t, args, complain, in_decl);
1946 case EXPR_CONSTR:
1947 return tsubst_expr_constr (t, args, complain, in_decl);
1948 case TYPE_CONSTR:
1949 return tsubst_type_constr (t, args, complain, in_decl);
1950 case ICONV_CONSTR:
1951 return tsubst_implicit_conversion_constr (t, args, complain, in_decl);
1952 case DEDUCT_CONSTR:
1953 return tsubst_argument_deduction_constr (t, args, complain, in_decl);
1954 case EXCEPT_CONSTR:
1955 return tsubst_exception_constr (t, args, complain, in_decl);
1956 default:
1957 gcc_unreachable ();
1958 }
1959 return error_mark_node;
1960 }
1961
1962 /*---------------------------------------------------------------------------
1963 Constraint satisfaction
1964 ---------------------------------------------------------------------------*/
1965
1966 /* The following functions determine if a constraint, when
1967 substituting template arguments, is satisfied. For convenience,
1968 satisfaction reduces a constraint to either true or false (and
1969 nothing else). */
1970
1971 namespace {
1972
1973 tree satisfy_constraint_1 (tree, tree, tsubst_flags_t, tree);
1974
1975 /* Check the constraint pack expansion. */
1976
1977 tree
satisfy_pack_expansion(tree t,tree args,tsubst_flags_t complain,tree in_decl)1978 satisfy_pack_expansion (tree t, tree args,
1979 tsubst_flags_t complain, tree in_decl)
1980 {
1981 /* Get the vector of satisfaction results.
1982 gen_elem_of_pack_expansion_instantiation will check that each element of
1983 the expansion is satisfied. */
1984 tree exprs = tsubst_pack_expansion (t, args, complain, in_decl);
1985
1986 if (exprs == error_mark_node)
1987 return boolean_false_node;
1988
1989 /* TODO: It might be better to normalize each expanded term
1990 and evaluate them separately. That would provide better
1991 opportunities for diagnostics. */
1992 for (int i = 0; i < TREE_VEC_LENGTH (exprs); ++i)
1993 if (TREE_VEC_ELT (exprs, i) != boolean_true_node)
1994 return boolean_false_node;
1995 return boolean_true_node;
1996 }
1997
1998 /* A predicate constraint is satisfied if its expression evaluates
1999 to true. If substitution into that node fails, the constraint
2000 is not satisfied ([temp.constr.pred]).
2001
2002 Note that a predicate constraint is a constraint expression
2003 of type bool. If neither of those are true, the program is
2004 ill-formed; they are not SFINAE'able errors. */
2005
2006 tree
satisfy_predicate_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)2007 satisfy_predicate_constraint (tree t, tree args,
2008 tsubst_flags_t complain, tree in_decl)
2009 {
2010 tree expr = TREE_OPERAND (t, 0);
2011
2012 /* We should never have a naked pack expansion in a predicate constraint. */
2013 gcc_assert (TREE_CODE (expr) != EXPR_PACK_EXPANSION);
2014
2015 /* If substitution into the expression fails, the constraint
2016 is not satisfied. */
2017 expr = tsubst_expr (expr, args, complain, in_decl, false);
2018 if (expr == error_mark_node)
2019 return boolean_false_node;
2020
2021 /* A predicate constraint shall have type bool. In some
2022 cases, substitution gives us const-qualified bool, which
2023 is also acceptable. */
2024 tree type = cv_unqualified (TREE_TYPE (expr));
2025 if (!same_type_p (type, boolean_type_node))
2026 {
2027 error_at (EXPR_LOC_OR_LOC (expr, input_location),
2028 "constraint %qE does not have type %qT",
2029 expr, boolean_type_node);
2030 return boolean_false_node;
2031 }
2032
2033 return cxx_constant_value (expr);
2034 }
2035
2036 /* A concept check constraint like C<CARGS> is satisfied if substituting ARGS
2037 into CARGS succeeds and C is satisfied for the resulting arguments. */
2038
2039 tree
satisfy_check_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)2040 satisfy_check_constraint (tree t, tree args,
2041 tsubst_flags_t complain, tree in_decl)
2042 {
2043 tree decl = CHECK_CONSTR_CONCEPT (t);
2044 tree tmpl = DECL_TI_TEMPLATE (decl);
2045 tree cargs = CHECK_CONSTR_ARGS (t);
2046
2047 /* Instantiate the concept check arguments. */
2048 tree targs = tsubst (cargs, args, tf_none, NULL_TREE);
2049 if (targs == error_mark_node)
2050 return boolean_false_node;
2051
2052 /* Search for a previous value. */
2053 if (tree prev = lookup_concept_satisfaction (tmpl, targs))
2054 return prev;
2055
2056 /* Expand the concept; failure here implies non-satisfaction. */
2057 tree def = expand_concept (decl, targs);
2058 if (def == error_mark_node)
2059 return memoize_concept_satisfaction (tmpl, args, boolean_false_node);
2060
2061 /* Recursively satisfy the constraint. */
2062 tree result = satisfy_constraint_1 (def, targs, complain, in_decl);
2063 return memoize_concept_satisfaction (tmpl, targs, result);
2064 }
2065
2066 /* Check an expression constraint. The constraint is satisfied if
2067 substitution succeeds ([temp.constr.expr]).
2068
2069 Note that the expression is unevaluated. */
2070
2071 tree
satisfy_expression_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)2072 satisfy_expression_constraint (tree t, tree args,
2073 tsubst_flags_t complain, tree in_decl)
2074 {
2075 cp_unevaluated guard;
2076 deferring_access_check_sentinel deferring;
2077
2078 tree expr = EXPR_CONSTR_EXPR (t);
2079 tree check = tsubst_expr (expr, args, complain, in_decl, false);
2080 if (check == error_mark_node)
2081 return boolean_false_node;
2082 if (!perform_deferred_access_checks (tf_none))
2083 return boolean_false_node;
2084 return boolean_true_node;
2085 }
2086
2087 /* Check a type constraint. The constraint is satisfied if
2088 substitution succeeds. */
2089
2090 inline tree
satisfy_type_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)2091 satisfy_type_constraint (tree t, tree args,
2092 tsubst_flags_t complain, tree in_decl)
2093 {
2094 deferring_access_check_sentinel deferring;
2095 tree type = TYPE_CONSTR_TYPE (t);
2096 gcc_assert (TYPE_P (type) || type == error_mark_node);
2097 tree check = tsubst (type, args, complain, in_decl);
2098 if (error_operand_p (check))
2099 return boolean_false_node;
2100 if (!perform_deferred_access_checks (complain))
2101 return boolean_false_node;
2102 return boolean_true_node;
2103 }
2104
2105 /* Check an implicit conversion constraint. */
2106
2107 tree
satisfy_implicit_conversion_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)2108 satisfy_implicit_conversion_constraint (tree t, tree args,
2109 tsubst_flags_t complain, tree in_decl)
2110 {
2111 /* Don't tsubst as if we're processing a template. If we try
2112 to we can end up generating template-like expressions
2113 (e.g., modop-exprs) that aren't properly typed. */
2114 tree expr =
2115 tsubst_expr (ICONV_CONSTR_EXPR (t), args, complain, in_decl, false);
2116 if (expr == error_mark_node)
2117 return boolean_false_node;
2118
2119 /* Get the transformed target type. */
2120 tree type = tsubst (ICONV_CONSTR_TYPE (t), args, complain, in_decl);
2121 if (type == error_mark_node)
2122 return boolean_false_node;
2123
2124 /* Attempt the conversion as a direct initialization
2125 of the form TYPE <unspecified> = EXPR. */
2126 tree conv =
2127 perform_direct_initialization_if_possible (type, expr, false, complain);
2128 if (conv == NULL_TREE || conv == error_mark_node)
2129 return boolean_false_node;
2130 else
2131 return boolean_true_node;
2132 }
2133
2134 /* Check an argument deduction constraint. */
2135
2136 tree
satisfy_argument_deduction_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)2137 satisfy_argument_deduction_constraint (tree t, tree args,
2138 tsubst_flags_t complain, tree in_decl)
2139 {
2140 /* Substitute through the expression. */
2141 tree expr = DEDUCT_CONSTR_EXPR (t);
2142 tree init = tsubst_expr (expr, args, complain, in_decl, false);
2143 if (expr == error_mark_node)
2144 return boolean_false_node;
2145
2146 /* Perform auto or decltype(auto) deduction to get the result. */
2147 tree pattern = DEDUCT_CONSTR_PATTERN (t);
2148 tree placeholder = DEDUCT_CONSTR_PLACEHOLDER (t);
2149 tree constr = PLACEHOLDER_TYPE_CONSTRAINTS (placeholder);
2150 tree type_canonical = TYPE_CANONICAL (placeholder);
2151 PLACEHOLDER_TYPE_CONSTRAINTS (placeholder)
2152 = tsubst_constraint (constr, args, complain|tf_partial, in_decl);
2153 TYPE_CANONICAL (placeholder) = NULL_TREE;
2154 tree type = do_auto_deduction (pattern, init, placeholder,
2155 complain, adc_requirement);
2156 PLACEHOLDER_TYPE_CONSTRAINTS (placeholder) = constr;
2157 TYPE_CANONICAL (placeholder) = type_canonical;
2158 if (type == error_mark_node)
2159 return boolean_false_node;
2160
2161 return boolean_true_node;
2162 }
2163
2164 /* Check an exception constraint. An exception constraint for an
2165 expression e is satisfied when noexcept(e) is true. */
2166
2167 tree
satisfy_exception_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)2168 satisfy_exception_constraint (tree t, tree args,
2169 tsubst_flags_t complain, tree in_decl)
2170 {
2171 tree expr = EXCEPT_CONSTR_EXPR (t);
2172 tree check = tsubst_expr (expr, args, complain, in_decl, false);
2173 if (check == error_mark_node)
2174 return boolean_false_node;
2175
2176 if (expr_noexcept_p (check, complain))
2177 return boolean_true_node;
2178 else
2179 return boolean_false_node;
2180 }
2181
2182 /* Check a parameterized constraint. */
2183
2184 tree
satisfy_parameterized_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)2185 satisfy_parameterized_constraint (tree t, tree args,
2186 tsubst_flags_t complain, tree in_decl)
2187 {
2188 local_specialization_stack stack;
2189 tree parms = PARM_CONSTR_PARMS (t);
2190 tree vars = tsubst_constraint_variables (parms, args, complain, in_decl);
2191 if (vars == error_mark_node)
2192 return boolean_false_node;
2193 tree constr = PARM_CONSTR_OPERAND (t);
2194 return satisfy_constraint_1 (constr, args, complain, in_decl);
2195 }
2196
2197 /* Check that the conjunction of constraints is satisfied. Note
2198 that if left operand is not satisfied, the right operand
2199 is not checked.
2200
2201 FIXME: Check that this wouldn't result in a user-defined
2202 operator. Note that this error is partially diagnosed in
2203 satisfy_predicate_constraint. It would be nice to diagnose
2204 the overload, but I don't think it's strictly necessary. */
2205
2206 tree
satisfy_conjunction(tree t,tree args,tsubst_flags_t complain,tree in_decl)2207 satisfy_conjunction (tree t, tree args, tsubst_flags_t complain, tree in_decl)
2208 {
2209 tree t0 = satisfy_constraint_1 (TREE_OPERAND (t, 0), args, complain, in_decl);
2210 if (t0 == boolean_false_node)
2211 return boolean_false_node;
2212 return satisfy_constraint_1 (TREE_OPERAND (t, 1), args, complain, in_decl);
2213 }
2214
2215 /* Check that the disjunction of constraints is satisfied. Note
2216 that if the left operand is satisfied, the right operand is not
2217 checked. */
2218
2219 tree
satisfy_disjunction(tree t,tree args,tsubst_flags_t complain,tree in_decl)2220 satisfy_disjunction (tree t, tree args, tsubst_flags_t complain, tree in_decl)
2221 {
2222 tree t0 = satisfy_constraint_1 (TREE_OPERAND (t, 0), args, complain, in_decl);
2223 if (t0 == boolean_true_node)
2224 return boolean_true_node;
2225 return satisfy_constraint_1 (TREE_OPERAND (t, 1), args, complain, in_decl);
2226 }
2227
2228 /* Dispatch to an appropriate satisfaction routine depending on the
2229 tree code of T. */
2230
2231 tree
satisfy_constraint_1(tree t,tree args,tsubst_flags_t complain,tree in_decl)2232 satisfy_constraint_1 (tree t, tree args, tsubst_flags_t complain, tree in_decl)
2233 {
2234 gcc_assert (!processing_template_decl);
2235
2236 if (!t)
2237 return boolean_false_node;
2238
2239 if (t == error_mark_node)
2240 return boolean_false_node;
2241
2242 switch (TREE_CODE (t))
2243 {
2244 case PRED_CONSTR:
2245 return satisfy_predicate_constraint (t, args, complain, in_decl);
2246
2247 case CHECK_CONSTR:
2248 return satisfy_check_constraint (t, args, complain, in_decl);
2249
2250 case EXPR_CONSTR:
2251 return satisfy_expression_constraint (t, args, complain, in_decl);
2252
2253 case TYPE_CONSTR:
2254 return satisfy_type_constraint (t, args, complain, in_decl);
2255
2256 case ICONV_CONSTR:
2257 return satisfy_implicit_conversion_constraint (t, args, complain, in_decl);
2258
2259 case DEDUCT_CONSTR:
2260 return satisfy_argument_deduction_constraint (t, args, complain, in_decl);
2261
2262 case EXCEPT_CONSTR:
2263 return satisfy_exception_constraint (t, args, complain, in_decl);
2264
2265 case PARM_CONSTR:
2266 return satisfy_parameterized_constraint (t, args, complain, in_decl);
2267
2268 case CONJ_CONSTR:
2269 return satisfy_conjunction (t, args, complain, in_decl);
2270
2271 case DISJ_CONSTR:
2272 return satisfy_disjunction (t, args, complain, in_decl);
2273
2274 case EXPR_PACK_EXPANSION:
2275 return satisfy_pack_expansion (t, args, complain, in_decl);
2276
2277 default:
2278 gcc_unreachable ();
2279 }
2280 return boolean_false_node;
2281 }
2282
2283 /* Check that the constraint is satisfied, according to the rules
2284 for that constraint. Note that each satisfy_* function returns
2285 true or false, depending on whether it is satisfied or not. */
2286
2287 tree
satisfy_constraint(tree t,tree args)2288 satisfy_constraint (tree t, tree args)
2289 {
2290 auto_timevar time (TV_CONSTRAINT_SAT);
2291
2292 /* Turn off template processing. Constraint satisfaction only applies
2293 to non-dependent terms, so we want to ensure full checking here. */
2294 processing_template_decl_sentinel proc (true);
2295
2296 /* Avoid early exit in tsubst and tsubst_copy from null args; since earlier
2297 substitution was done with processing_template_decl forced on, there will
2298 be expressions that still need semantic processing, possibly buried in
2299 decltype or a template argument. */
2300 if (args == NULL_TREE)
2301 args = make_tree_vec (1);
2302
2303 return satisfy_constraint_1 (t, args, tf_none, NULL_TREE);
2304 }
2305
2306 /* Check the associated constraints in CI against the given
2307 ARGS, returning true when the constraints are satisfied
2308 and false otherwise. */
2309
2310 tree
satisfy_associated_constraints(tree ci,tree args)2311 satisfy_associated_constraints (tree ci, tree args)
2312 {
2313 /* If there are no constraints then this is trivially satisfied. */
2314 if (!ci)
2315 return boolean_true_node;
2316
2317 /* If any arguments depend on template parameters, we can't
2318 check constraints. */
2319 if (args && uses_template_parms (args))
2320 return boolean_true_node;
2321
2322 /* Check if we've seen a previous result. */
2323 if (tree prev = lookup_constraint_satisfaction (ci, args))
2324 return prev;
2325
2326 /* Actually test for satisfaction. */
2327 tree result = satisfy_constraint (CI_ASSOCIATED_CONSTRAINTS (ci), args);
2328 return memoize_constraint_satisfaction (ci, args, result);
2329 }
2330
2331 } /* namespace */
2332
2333 /* Evaluate the given constraint, returning boolean_true_node
2334 if the constraint is satisfied and boolean_false_node
2335 otherwise. */
2336
2337 tree
evaluate_constraints(tree constr,tree args)2338 evaluate_constraints (tree constr, tree args)
2339 {
2340 gcc_assert (constraint_p (constr));
2341 return satisfy_constraint (constr, args);
2342 }
2343
2344 /* Evaluate the function concept FN by substituting its own args
2345 into its definition and evaluating that as the result. Returns
2346 boolean_true_node if the constraints are satisfied and
2347 boolean_false_node otherwise. */
2348
2349 tree
evaluate_function_concept(tree fn,tree args)2350 evaluate_function_concept (tree fn, tree args)
2351 {
2352 tree constr = build_nt (CHECK_CONSTR, fn, args);
2353 return satisfy_constraint (constr, args);
2354 }
2355
2356 /* Evaluate the variable concept VAR by substituting its own args into
2357 its initializer and checking the resulting constraint. Returns
2358 boolean_true_node if the constraints are satisfied and
2359 boolean_false_node otherwise. */
2360
2361 tree
evaluate_variable_concept(tree var,tree args)2362 evaluate_variable_concept (tree var, tree args)
2363 {
2364 tree constr = build_nt (CHECK_CONSTR, var, args);
2365 return satisfy_constraint (constr, args);
2366 }
2367
2368 /* Evaluate the given expression as if it were a predicate
2369 constraint. Returns boolean_true_node if the constraint
2370 is satisfied and boolean_false_node otherwise. */
2371
2372 tree
evaluate_constraint_expression(tree expr,tree args)2373 evaluate_constraint_expression (tree expr, tree args)
2374 {
2375 tree constr = normalize_expression (expr);
2376 return satisfy_constraint (constr, args);
2377 }
2378
2379 /* Returns true if the DECL's constraints are satisfied.
2380 This is used in cases where a declaration is formed but
2381 before it is used (e.g., overload resolution). */
2382
2383 bool
constraints_satisfied_p(tree decl)2384 constraints_satisfied_p (tree decl)
2385 {
2386 /* Get the constraints to check for satisfaction. This depends
2387 on whether we're looking at a template specialization or not. */
2388 tree ci;
2389 tree args = NULL_TREE;
2390 if (tree ti = DECL_TEMPLATE_INFO (decl))
2391 {
2392 ci = get_constraints (TI_TEMPLATE (ti));
2393 args = INNERMOST_TEMPLATE_ARGS (TI_ARGS (ti));
2394 }
2395 else
2396 {
2397 ci = get_constraints (decl);
2398 }
2399
2400 tree eval = satisfy_associated_constraints (ci, args);
2401 return eval == boolean_true_node;
2402 }
2403
2404 /* Returns true if the constraints are satisfied by ARGS.
2405 Here, T can be either a constraint or a constrained
2406 declaration. */
2407
2408 bool
constraints_satisfied_p(tree t,tree args)2409 constraints_satisfied_p (tree t, tree args)
2410 {
2411 tree eval;
2412 if (constraint_p (t))
2413 eval = evaluate_constraints (t, args);
2414 else
2415 eval = satisfy_associated_constraints (get_constraints (t), args);
2416 return eval == boolean_true_node;
2417 }
2418
2419 namespace
2420 {
2421
2422 /* Normalize EXPR and determine if the resulting constraint is
2423 satisfied by ARGS. Returns true if and only if the constraint
2424 is satisfied. This is used extensively by diagnostics to
2425 determine causes for failure. */
2426
2427 inline bool
constraint_expression_satisfied_p(tree expr,tree args)2428 constraint_expression_satisfied_p (tree expr, tree args)
2429 {
2430 return evaluate_constraint_expression (expr, args) == boolean_true_node;
2431 }
2432
2433 } /* namespace */
2434
2435 /*---------------------------------------------------------------------------
2436 Semantic analysis of requires-expressions
2437 ---------------------------------------------------------------------------*/
2438
2439 /* Finish a requires expression for the given PARMS (possibly
2440 null) and the non-empty sequence of requirements. */
2441 tree
finish_requires_expr(tree parms,tree reqs)2442 finish_requires_expr (tree parms, tree reqs)
2443 {
2444 /* Modify the declared parameters by removing their context
2445 so they don't refer to the enclosing scope and explicitly
2446 indicating that they are constraint variables. */
2447 for (tree parm = parms; parm; parm = DECL_CHAIN (parm))
2448 {
2449 DECL_CONTEXT (parm) = NULL_TREE;
2450 CONSTRAINT_VAR_P (parm) = true;
2451 }
2452
2453 /* Build the node. */
2454 tree r = build_min (REQUIRES_EXPR, boolean_type_node, parms, reqs);
2455 TREE_SIDE_EFFECTS (r) = false;
2456 TREE_CONSTANT (r) = true;
2457 return r;
2458 }
2459
2460 /* Construct a requirement for the validity of EXPR. */
2461 tree
finish_simple_requirement(tree expr)2462 finish_simple_requirement (tree expr)
2463 {
2464 return build_nt (SIMPLE_REQ, expr);
2465 }
2466
2467 /* Construct a requirement for the validity of TYPE. */
2468 tree
finish_type_requirement(tree type)2469 finish_type_requirement (tree type)
2470 {
2471 return build_nt (TYPE_REQ, type);
2472 }
2473
2474 /* Construct a requirement for the validity of EXPR, along with
2475 its properties. if TYPE is non-null, then it specifies either
2476 an implicit conversion or argument deduction constraint,
2477 depending on whether any placeholders occur in the type name.
2478 NOEXCEPT_P is true iff the noexcept keyword was specified. */
2479 tree
finish_compound_requirement(tree expr,tree type,bool noexcept_p)2480 finish_compound_requirement (tree expr, tree type, bool noexcept_p)
2481 {
2482 tree req = build_nt (COMPOUND_REQ, expr, type);
2483 COMPOUND_REQ_NOEXCEPT_P (req) = noexcept_p;
2484 return req;
2485 }
2486
2487 /* Finish a nested requirement. */
2488 tree
finish_nested_requirement(tree expr)2489 finish_nested_requirement (tree expr)
2490 {
2491 return build_nt (NESTED_REQ, expr);
2492 }
2493
2494 // Check that FN satisfies the structural requirements of a
2495 // function concept definition.
2496 tree
check_function_concept(tree fn)2497 check_function_concept (tree fn)
2498 {
2499 // Check that the function is comprised of only a single
2500 // return statement.
2501 tree body = DECL_SAVED_TREE (fn);
2502 if (TREE_CODE (body) == BIND_EXPR)
2503 body = BIND_EXPR_BODY (body);
2504
2505 // Sometimes a function call results in the creation of clean up
2506 // points. Allow these to be preserved in the body of the
2507 // constraint, as we might actually need them for some constexpr
2508 // evaluations.
2509 if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
2510 body = TREE_OPERAND (body, 0);
2511
2512 /* Check that the definition is written correctly. */
2513 if (TREE_CODE (body) != RETURN_EXPR)
2514 {
2515 location_t loc = DECL_SOURCE_LOCATION (fn);
2516 if (TREE_CODE (body) == STATEMENT_LIST && !STATEMENT_LIST_HEAD (body))
2517 error_at (loc, "definition of concept %qD is empty", fn);
2518 else
2519 error_at (loc, "definition of concept %qD has multiple statements", fn);
2520 }
2521
2522 return NULL_TREE;
2523 }
2524
2525
2526 // Check that a constrained friend declaration function declaration,
2527 // FN, is admissible. This is the case only when the declaration depends
2528 // on template parameters and does not declare a specialization.
2529 void
check_constrained_friend(tree fn,tree reqs)2530 check_constrained_friend (tree fn, tree reqs)
2531 {
2532 if (fn == error_mark_node)
2533 return;
2534 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
2535
2536 // If there are not constraints, this cannot be an error.
2537 if (!reqs)
2538 return;
2539
2540 // Constrained friend functions that don't depend on template
2541 // arguments are effectively meaningless.
2542 if (!uses_template_parms (TREE_TYPE (fn)))
2543 {
2544 error_at (location_of (fn),
2545 "constrained friend does not depend on template parameters");
2546 return;
2547 }
2548 }
2549
2550 /*---------------------------------------------------------------------------
2551 Equivalence of constraints
2552 ---------------------------------------------------------------------------*/
2553
2554 /* Returns true when A and B are equivalent constraints. */
2555 bool
equivalent_constraints(tree a,tree b)2556 equivalent_constraints (tree a, tree b)
2557 {
2558 gcc_assert (!a || TREE_CODE (a) == CONSTRAINT_INFO);
2559 gcc_assert (!b || TREE_CODE (b) == CONSTRAINT_INFO);
2560 return cp_tree_equal (a, b);
2561 }
2562
2563 /* Returns true if the template declarations A and B have equivalent
2564 constraints. This is the case when A's constraints subsume B's and
2565 when B's also constrain A's. */
2566 bool
equivalently_constrained(tree d1,tree d2)2567 equivalently_constrained (tree d1, tree d2)
2568 {
2569 gcc_assert (TREE_CODE (d1) == TREE_CODE (d2));
2570 return equivalent_constraints (get_constraints (d1), get_constraints (d2));
2571 }
2572
2573 /*---------------------------------------------------------------------------
2574 Partial ordering of constraints
2575 ---------------------------------------------------------------------------*/
2576
2577 /* Returns true when the the constraints in A subsume those in B. */
2578
2579 bool
subsumes_constraints(tree a,tree b)2580 subsumes_constraints (tree a, tree b)
2581 {
2582 gcc_assert (!a || TREE_CODE (a) == CONSTRAINT_INFO);
2583 gcc_assert (!b || TREE_CODE (b) == CONSTRAINT_INFO);
2584 return subsumes (a, b);
2585 }
2586
2587 /* Returns true when the the constraints in A subsume those in B, but
2588 the constraints in B do not subsume the constraints in A. */
2589
2590 bool
strictly_subsumes(tree a,tree b)2591 strictly_subsumes (tree a, tree b)
2592 {
2593 return subsumes (a, b) && !subsumes (b, a);
2594 }
2595
2596 /* Determines which of the declarations, A or B, is more constrained.
2597 That is, which declaration's constraints subsume but are not subsumed
2598 by the other's?
2599
2600 Returns 1 if A is more constrained than B, -1 if B is more constrained
2601 than A, and 0 otherwise. */
2602
2603 int
more_constrained(tree d1,tree d2)2604 more_constrained (tree d1, tree d2)
2605 {
2606 tree c1 = get_constraints (d1);
2607 tree c2 = get_constraints (d2);
2608 int winner = 0;
2609 if (subsumes_constraints (c1, c2))
2610 ++winner;
2611 if (subsumes_constraints (c2, c1))
2612 --winner;
2613 return winner;
2614 }
2615
2616 /* Returns true if D1 is at least as constrained as D2. That is, the
2617 associated constraints of D1 subsume those of D2, or both declarations
2618 are unconstrained. */
2619
2620 bool
at_least_as_constrained(tree d1,tree d2)2621 at_least_as_constrained (tree d1, tree d2)
2622 {
2623 tree c1 = get_constraints (d1);
2624 tree c2 = get_constraints (d2);
2625 return subsumes_constraints (c1, c2);
2626 }
2627
2628
2629 /*---------------------------------------------------------------------------
2630 Constraint diagnostics
2631
2632 FIXME: Normalize expressions into constraints before evaluating them.
2633 This should be the general pattern for all such diagnostics.
2634 ---------------------------------------------------------------------------*/
2635
2636 /* The number of detailed constraint failures. */
2637
2638 int constraint_errors = 0;
2639
2640 /* Do not generate errors after diagnosing this number of constraint
2641 failures.
2642
2643 FIXME: This is a really arbitrary number. Provide better control of
2644 constraint diagnostics with a command line option. */
2645
2646 int constraint_thresh = 20;
2647
2648
2649 /* Returns true if we should elide the diagnostic for a constraint failure.
2650 This is the case when the number of errors has exceeded the pre-configured
2651 threshold. */
2652
2653 inline bool
elide_constraint_failure_p()2654 elide_constraint_failure_p ()
2655 {
2656 bool ret = constraint_thresh <= constraint_errors;
2657 ++constraint_errors;
2658 return ret;
2659 }
2660
2661 /* Returns the number of undiagnosed errors. */
2662
2663 inline int
undiagnosed_constraint_failures()2664 undiagnosed_constraint_failures ()
2665 {
2666 return constraint_errors - constraint_thresh;
2667 }
2668
2669 /* The diagnosis of constraints performs a combination of normalization
2670 and satisfaction testing. We recursively walk through the conjunction or
2671 disjunction of associated constraints, testing each sub-constraint in
2672 turn. */
2673
2674 namespace {
2675
2676 void diagnose_constraint (location_t, tree, tree, tree);
2677
2678 /* Emit a specific diagnostics for a failed trait. */
2679
2680 void
diagnose_trait_expression(location_t loc,tree,tree cur,tree args)2681 diagnose_trait_expression (location_t loc, tree, tree cur, tree args)
2682 {
2683 if (constraint_expression_satisfied_p (cur, args))
2684 return;
2685 if (elide_constraint_failure_p())
2686 return;
2687
2688 tree expr = PRED_CONSTR_EXPR (cur);
2689 ++processing_template_decl;
2690 expr = tsubst_expr (expr, args, tf_none, NULL_TREE, false);
2691 --processing_template_decl;
2692
2693 tree t1 = TRAIT_EXPR_TYPE1 (expr);
2694 tree t2 = TRAIT_EXPR_TYPE2 (expr);
2695 switch (TRAIT_EXPR_KIND (expr))
2696 {
2697 case CPTK_HAS_NOTHROW_ASSIGN:
2698 inform (loc, " %qT is not nothrow copy assignable", t1);
2699 break;
2700 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
2701 inform (loc, " %qT is not nothrow default constructible", t1);
2702 break;
2703 case CPTK_HAS_NOTHROW_COPY:
2704 inform (loc, " %qT is not nothrow copy constructible", t1);
2705 break;
2706 case CPTK_HAS_TRIVIAL_ASSIGN:
2707 inform (loc, " %qT is not trivially copy assignable", t1);
2708 break;
2709 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
2710 inform (loc, " %qT is not trivially default constructible", t1);
2711 break;
2712 case CPTK_HAS_TRIVIAL_COPY:
2713 inform (loc, " %qT is not trivially copy constructible", t1);
2714 break;
2715 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
2716 inform (loc, " %qT is not trivially destructible", t1);
2717 break;
2718 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
2719 inform (loc, " %qT does not have a virtual destructor", t1);
2720 break;
2721 case CPTK_IS_ABSTRACT:
2722 inform (loc, " %qT is not an abstract class", t1);
2723 break;
2724 case CPTK_IS_BASE_OF:
2725 inform (loc, " %qT is not a base of %qT", t1, t2);
2726 break;
2727 case CPTK_IS_CLASS:
2728 inform (loc, " %qT is not a class", t1);
2729 break;
2730 case CPTK_IS_EMPTY:
2731 inform (loc, " %qT is not an empty class", t1);
2732 break;
2733 case CPTK_IS_ENUM:
2734 inform (loc, " %qT is not an enum", t1);
2735 break;
2736 case CPTK_IS_FINAL:
2737 inform (loc, " %qT is not a final class", t1);
2738 break;
2739 case CPTK_IS_LITERAL_TYPE:
2740 inform (loc, " %qT is not a literal type", t1);
2741 break;
2742 case CPTK_IS_POD:
2743 inform (loc, " %qT is not a POD type", t1);
2744 break;
2745 case CPTK_IS_POLYMORPHIC:
2746 inform (loc, " %qT is not a polymorphic type", t1);
2747 break;
2748 case CPTK_IS_SAME_AS:
2749 inform (loc, " %qT is not the same as %qT", t1, t2);
2750 break;
2751 case CPTK_IS_STD_LAYOUT:
2752 inform (loc, " %qT is not an standard layout type", t1);
2753 break;
2754 case CPTK_IS_TRIVIAL:
2755 inform (loc, " %qT is not a trivial type", t1);
2756 break;
2757 case CPTK_IS_UNION:
2758 inform (loc, " %qT is not a union", t1);
2759 break;
2760 default:
2761 gcc_unreachable ();
2762 }
2763 }
2764
2765 /* Diagnose the expression of a predicate constraint. */
2766
2767 void
diagnose_other_expression(location_t loc,tree,tree cur,tree args)2768 diagnose_other_expression (location_t loc, tree, tree cur, tree args)
2769 {
2770 if (constraint_expression_satisfied_p (cur, args))
2771 return;
2772 if (elide_constraint_failure_p())
2773 return;
2774 inform (loc, "%qE evaluated to false", cur);
2775 }
2776
2777 /* Do our best to infer meaning from predicates. */
2778
2779 inline void
diagnose_predicate_constraint(location_t loc,tree orig,tree cur,tree args)2780 diagnose_predicate_constraint (location_t loc, tree orig, tree cur, tree args)
2781 {
2782 if (TREE_CODE (PRED_CONSTR_EXPR (cur)) == TRAIT_EXPR)
2783 diagnose_trait_expression (loc, orig, cur, args);
2784 else
2785 diagnose_other_expression (loc, orig, cur, args);
2786 }
2787
2788 /* Diagnose a failed pack expansion, possibly containing constraints. */
2789
2790 void
diagnose_pack_expansion(location_t loc,tree,tree cur,tree args)2791 diagnose_pack_expansion (location_t loc, tree, tree cur, tree args)
2792 {
2793 if (constraint_expression_satisfied_p (cur, args))
2794 return;
2795 if (elide_constraint_failure_p())
2796 return;
2797
2798 /* Make sure that we don't have naked packs that we don't expect. */
2799 if (!same_type_p (TREE_TYPE (cur), boolean_type_node))
2800 {
2801 inform (loc, "invalid pack expansion in constraint %qE", cur);
2802 return;
2803 }
2804
2805 inform (loc, "in the expansion of %qE", cur);
2806
2807 /* Get the vector of expanded arguments. Note that n must not
2808 be 0 since this constraint is not satisfied. */
2809 ++processing_template_decl;
2810 tree exprs = tsubst_pack_expansion (cur, args, tf_none, NULL_TREE);
2811 --processing_template_decl;
2812 if (exprs == error_mark_node)
2813 {
2814 /* TODO: This error message could be better. */
2815 inform (loc, " substitution failure occurred during expansion");
2816 return;
2817 }
2818
2819 /* Check each expanded constraint separately. */
2820 int n = TREE_VEC_LENGTH (exprs);
2821 for (int i = 0; i < n; ++i)
2822 {
2823 tree expr = TREE_VEC_ELT (exprs, i);
2824 if (!constraint_expression_satisfied_p (expr, args))
2825 inform (loc, " %qE was not satisfied", expr);
2826 }
2827 }
2828
2829 /* Diagnose a potentially unsatisfied concept check constraint DECL<CARGS>.
2830 Parameters are as for diagnose_constraint. */
2831
2832 void
diagnose_check_constraint(location_t loc,tree orig,tree cur,tree args)2833 diagnose_check_constraint (location_t loc, tree orig, tree cur, tree args)
2834 {
2835 if (constraints_satisfied_p (cur, args))
2836 return;
2837
2838 tree decl = CHECK_CONSTR_CONCEPT (cur);
2839 tree cargs = CHECK_CONSTR_ARGS (cur);
2840 tree tmpl = DECL_TI_TEMPLATE (decl);
2841 tree check = build_nt (CHECK_CONSTR, decl, cargs);
2842
2843 /* Instantiate the concept check arguments. */
2844 tree targs = tsubst (cargs, args, tf_none, NULL_TREE);
2845 if (targs == error_mark_node)
2846 {
2847 if (elide_constraint_failure_p ())
2848 return;
2849 inform (loc, "invalid use of the concept %qE", check);
2850 tsubst (cargs, args, tf_warning_or_error, NULL_TREE);
2851 return;
2852 }
2853
2854 tree sub = build_tree_list (tmpl, targs);
2855 /* Update to the expanded definitions. */
2856 cur = expand_concept (decl, targs);
2857 if (cur == error_mark_node)
2858 {
2859 if (elide_constraint_failure_p ())
2860 return;
2861 inform (loc, "in the expansion of concept %qE %S", check, sub);
2862 cur = get_concept_definition (decl);
2863 tsubst_expr (cur, targs, tf_warning_or_error, NULL_TREE, false);
2864 return;
2865 }
2866
2867 orig = get_concept_definition (CHECK_CONSTR_CONCEPT (orig));
2868 orig = normalize_expression (orig);
2869
2870 location_t dloc = DECL_SOURCE_LOCATION (decl);
2871 inform (dloc, "within %qS", sub);
2872 diagnose_constraint (dloc, orig, cur, targs);
2873 }
2874
2875 /* Diagnose a potentially unsatisfied conjunction or disjunction. Parameters
2876 are as for diagnose_constraint. */
2877
2878 void
diagnose_logical_constraint(location_t loc,tree orig,tree cur,tree args)2879 diagnose_logical_constraint (location_t loc, tree orig, tree cur, tree args)
2880 {
2881 tree t0 = TREE_OPERAND (cur, 0);
2882 tree t1 = TREE_OPERAND (cur, 1);
2883 if (!constraints_satisfied_p (t0, args))
2884 diagnose_constraint (loc, TREE_OPERAND (orig, 0), t0, args);
2885 else if (TREE_CODE (orig) == TRUTH_ORIF_EXPR)
2886 return;
2887 if (!constraints_satisfied_p (t1, args))
2888 diagnose_constraint (loc, TREE_OPERAND (orig, 1), t1, args);
2889 }
2890
2891 /* Diagnose a potential expression constraint failure. */
2892
2893 void
diagnose_expression_constraint(location_t loc,tree orig,tree cur,tree args)2894 diagnose_expression_constraint (location_t loc, tree orig, tree cur, tree args)
2895 {
2896 if (constraints_satisfied_p (cur, args))
2897 return;
2898 if (elide_constraint_failure_p())
2899 return;
2900
2901 tree expr = EXPR_CONSTR_EXPR (orig);
2902 inform (loc, "the required expression %qE would be ill-formed", expr);
2903
2904 // TODO: We should have a flag that controls this substitution.
2905 // I'm finding it very useful for resolving concept check errors.
2906
2907 // inform (input_location, "==== BEGIN DUMP ====");
2908 // tsubst_expr (EXPR_CONSTR_EXPR (orig), args, tf_warning_or_error, NULL_TREE, false);
2909 // inform (input_location, "==== END DUMP ====");
2910 }
2911
2912 /* Diagnose a potentially failed type constraint. */
2913
2914 void
diagnose_type_constraint(location_t loc,tree orig,tree cur,tree args)2915 diagnose_type_constraint (location_t loc, tree orig, tree cur, tree args)
2916 {
2917 if (constraints_satisfied_p (cur, args))
2918 return;
2919 if (elide_constraint_failure_p())
2920 return;
2921
2922 tree type = TYPE_CONSTR_TYPE (orig);
2923 inform (loc, "the required type %qT would be ill-formed", type);
2924 }
2925
2926 /* Diagnose a potentially unsatisfied conversion constraint. */
2927
2928 void
diagnose_implicit_conversion_constraint(location_t loc,tree orig,tree cur,tree args)2929 diagnose_implicit_conversion_constraint (location_t loc, tree orig, tree cur,
2930 tree args)
2931 {
2932 if (constraints_satisfied_p (cur, args))
2933 return;
2934
2935 /* The expression and type will previously have been substituted into,
2936 and therefore may already be an error. Also, we will have already
2937 diagnosed substitution failures into an expression since this must be
2938 part of a compound requirement. */
2939 tree expr = ICONV_CONSTR_EXPR (cur);
2940 if (error_operand_p (expr))
2941 return;
2942
2943 /* Don't elide a previously diagnosed failure. */
2944 if (elide_constraint_failure_p())
2945 return;
2946
2947 tree type = ICONV_CONSTR_TYPE (cur);
2948 if (error_operand_p (type))
2949 {
2950 inform (loc, "substitution into type %qT failed",
2951 ICONV_CONSTR_TYPE (orig));
2952 return;
2953 }
2954
2955 inform(loc, "%qE is not implicitly convertible to %qT", expr, type);
2956 }
2957
2958 /* Diagnose an argument deduction constraint. */
2959
2960 void
diagnose_argument_deduction_constraint(location_t loc,tree orig,tree cur,tree args)2961 diagnose_argument_deduction_constraint (location_t loc, tree orig, tree cur,
2962 tree args)
2963 {
2964 if (constraints_satisfied_p (cur, args))
2965 return;
2966
2967 /* The expression and type will previously have been substituted into,
2968 and therefore may already be an error. Also, we will have already
2969 diagnosed substution failures into an expression since this must be
2970 part of a compound requirement. */
2971 tree expr = DEDUCT_CONSTR_EXPR (cur);
2972 if (error_operand_p (expr))
2973 return;
2974
2975 /* Don't elide a previously diagnosed failure. */
2976 if (elide_constraint_failure_p ())
2977 return;
2978
2979 tree pattern = DEDUCT_CONSTR_PATTERN (cur);
2980 if (error_operand_p (pattern))
2981 {
2982 inform (loc, "substitution into type %qT failed",
2983 DEDUCT_CONSTR_PATTERN (orig));
2984 return;
2985 }
2986
2987 inform (loc, "unable to deduce placeholder type %qT from %qE",
2988 pattern, expr);
2989 }
2990
2991 /* Diagnose an exception constraint. */
2992
2993 void
diagnose_exception_constraint(location_t loc,tree orig,tree cur,tree args)2994 diagnose_exception_constraint (location_t loc, tree orig, tree cur, tree args)
2995 {
2996 if (constraints_satisfied_p (cur, args))
2997 return;
2998 if (elide_constraint_failure_p ())
2999 return;
3000
3001 /* Rebuild a noexcept expression. */
3002 tree expr = EXCEPT_CONSTR_EXPR (cur);
3003 if (error_operand_p (expr))
3004 return;
3005
3006 inform (loc, "%qE evaluated to false", EXCEPT_CONSTR_EXPR (orig));
3007 }
3008
3009 /* Diagnose a potentially unsatisfied parameterized constraint. */
3010
3011 void
diagnose_parameterized_constraint(location_t loc,tree orig,tree cur,tree args)3012 diagnose_parameterized_constraint (location_t loc, tree orig, tree cur,
3013 tree args)
3014 {
3015 if (constraints_satisfied_p (cur, args))
3016 return;
3017
3018 local_specialization_stack stack;
3019 tree parms = PARM_CONSTR_PARMS (cur);
3020 tree vars = tsubst_constraint_variables (parms, args, tf_warning_or_error,
3021 NULL_TREE);
3022 if (vars == error_mark_node)
3023 {
3024 if (elide_constraint_failure_p ())
3025 return;
3026
3027 /* TODO: Check which variable failed and use orig to diagnose
3028 that substitution error. */
3029 inform (loc, "failed to instantiate constraint variables");
3030 return;
3031 }
3032
3033 /* TODO: It would be better write these in a list. */
3034 while (vars)
3035 {
3036 inform (loc, " with %q#D", vars);
3037 vars = TREE_CHAIN (vars);
3038 }
3039 orig = PARM_CONSTR_OPERAND (orig);
3040 cur = PARM_CONSTR_OPERAND (cur);
3041 return diagnose_constraint (loc, orig, cur, args);
3042 }
3043
3044 /* Diagnose the constraint CUR for the given ARGS. This is only ever invoked
3045 on the associated constraints, so we can only have conjunctions of
3046 predicate constraints. The ORIGinal (dependent) constructs follow
3047 the current constraints to enable better diagnostics. Note that ORIG
3048 and CUR must be the same kinds of node, except when CUR is an error. */
3049
3050 void
diagnose_constraint(location_t loc,tree orig,tree cur,tree args)3051 diagnose_constraint (location_t loc, tree orig, tree cur, tree args)
3052 {
3053 switch (TREE_CODE (cur))
3054 {
3055 case EXPR_CONSTR:
3056 diagnose_expression_constraint (loc, orig, cur, args);
3057 break;
3058
3059 case TYPE_CONSTR:
3060 diagnose_type_constraint (loc, orig, cur, args);
3061 break;
3062
3063 case ICONV_CONSTR:
3064 diagnose_implicit_conversion_constraint (loc, orig, cur, args);
3065 break;
3066
3067 case DEDUCT_CONSTR:
3068 diagnose_argument_deduction_constraint (loc, orig, cur, args);
3069 break;
3070
3071 case EXCEPT_CONSTR:
3072 diagnose_exception_constraint (loc, orig, cur, args);
3073 break;
3074
3075 case CONJ_CONSTR:
3076 case DISJ_CONSTR:
3077 diagnose_logical_constraint (loc, orig, cur, args);
3078 break;
3079
3080 case PRED_CONSTR:
3081 diagnose_predicate_constraint (loc, orig, cur, args);
3082 break;
3083
3084 case PARM_CONSTR:
3085 diagnose_parameterized_constraint (loc, orig, cur, args);
3086 break;
3087
3088 case CHECK_CONSTR:
3089 diagnose_check_constraint (loc, orig, cur, args);
3090 break;
3091
3092 case EXPR_PACK_EXPANSION:
3093 diagnose_pack_expansion (loc, orig, cur, args);
3094 break;
3095
3096 case ERROR_MARK:
3097 /* TODO: Can we improve the diagnostic with the original? */
3098 inform (input_location, "ill-formed constraint");
3099 break;
3100
3101 default:
3102 gcc_unreachable ();
3103 break;
3104 }
3105 }
3106
3107 /* Diagnose the reason(s) why ARGS do not satisfy the constraints
3108 of declaration DECL. */
3109
3110 void
diagnose_declaration_constraints(location_t loc,tree decl,tree args)3111 diagnose_declaration_constraints (location_t loc, tree decl, tree args)
3112 {
3113 inform (loc, " constraints not satisfied");
3114
3115 /* Constraints are attached to the template. */
3116 if (tree ti = DECL_TEMPLATE_INFO (decl))
3117 {
3118 decl = TI_TEMPLATE (ti);
3119 if (!args)
3120 args = TI_ARGS (ti);
3121 }
3122
3123 /* Recursively diagnose the associated constraints. */
3124 tree ci = get_constraints (decl);
3125 tree t = CI_ASSOCIATED_CONSTRAINTS (ci);
3126 diagnose_constraint (loc, t, t, args);
3127 }
3128
3129 } // namespace
3130
3131 /* Emit diagnostics detailing the failure ARGS to satisfy the
3132 constraints of T. Here, T can be either a constraint
3133 or a declaration. */
3134
3135 void
diagnose_constraints(location_t loc,tree t,tree args)3136 diagnose_constraints (location_t loc, tree t, tree args)
3137 {
3138 constraint_errors = 0;
3139
3140 if (constraint_p (t))
3141 diagnose_constraint (loc, t, t, args);
3142 else if (DECL_P (t))
3143 diagnose_declaration_constraints (loc, t, args);
3144 else
3145 gcc_unreachable ();
3146
3147 /* Note the number of elided failures. */
3148 int n = undiagnosed_constraint_failures ();
3149 if (n > 0)
3150 inform (loc, "... and %d more constraint errors not shown", n);
3151 }
3152