1 /* Processing rules for constraints.
2 Copyright (C) 2013-2016 Free Software Foundation, Inc.
3 Contributed by Andrew Sutton (andrew.n.sutton@gmail.com)
5 This file is part of GCC.
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)
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.
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/>. */
23 #include "coretypes.h"
29 #include "double-int.h"
36 #include "stringpool.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"
47 #include "type-utils.h"
49 /*---------------------------------------------------------------------------
50 Operations on constraints
51 ---------------------------------------------------------------------------*/
53 /* Returns true if C is a constraint tree code. Note that ERROR_MARK
54 is a valid constraint. */
57 constraint_p (tree_code c
)
59 return ((PRED_CONSTR
<= c
&& c
<= DISJ_CONSTR
)
60 || c
== EXPR_PACK_EXPANSION
64 /* Returns true if T is a constraint. Note that error_mark_node
65 is a valid constraint. */
70 return constraint_p (TREE_CODE (t
));
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,
77 conjoin_constraints(a, NULL_TREE) == a
81 conjoin_constraints (NULL_TREE, a) == a
83 If both A and B are NULL_TREE, the result is also NULL_TREE. */
86 conjoin_constraints (tree a
, tree b
)
88 gcc_assert (a
? constraint_p (a
) : true);
89 gcc_assert (b
? constraint_p (b
) : true);
91 return b
? build_nt (CONJ_CONSTR
, a
, b
) : a
;
98 /* Transform the vector of expressions in the T into a conjunction
99 of requirements. T must be a TREE_VEC. */
102 conjoin_constraints (tree t
)
104 gcc_assert (TREE_CODE (t
) == TREE_VEC
);
106 for (int i
= 0; i
< TREE_VEC_LENGTH (t
); ++i
)
107 r
= conjoin_constraints (r
, TREE_VEC_ELT (t
, i
));
111 /* Returns true if T is a call expression to a function
115 function_concept_check_p (tree t
)
117 gcc_assert (TREE_CODE (t
) == CALL_EXPR
);
118 tree fn
= CALL_EXPR_FN (t
);
120 && TREE_CODE (fn
) == TEMPLATE_ID_EXPR
121 && TREE_CODE (TREE_OPERAND (fn
, 0)) == OVERLOAD
)
123 tree f1
= get_first_fn (fn
);
124 if (TREE_CODE (f1
) == TEMPLATE_DECL
125 && DECL_DECLARED_CONCEPT_P (DECL_TEMPLATE_RESULT (f1
)))
131 /* Returns true if any of the arguments in the template
132 argument list is a wildcard or wildcard pack. */
135 contains_wildcard_p (tree args
)
137 for (int i
= 0; i
< TREE_VEC_LENGTH (args
); ++i
)
139 tree arg
= TREE_VEC_ELT (args
, i
);
140 if (TREE_CODE (arg
) == WILDCARD_DECL
)
146 /* Build a new call expression, but don't actually generate a
147 new function call. We just want the tree, not the semantics. */
150 build_call_check (tree id
)
152 ++processing_template_decl
;
153 vec
<tree
, va_gc
> *fargs
= make_tree_vector();
154 tree call
= finish_call_expr (id
, &fargs
, false, false, tf_none
);
155 release_tree_vector (fargs
);
156 --processing_template_decl
;
160 /* Build an expression that will check a variable concept. If any
161 argument contains a wildcard, don't try to finish the variable
162 template because we can't substitute into a non-existent
166 build_variable_check (tree id
)
168 gcc_assert (TREE_CODE (id
) == TEMPLATE_ID_EXPR
);
169 if (contains_wildcard_p (TREE_OPERAND (id
, 1)))
172 ++processing_template_decl
;
173 tree var
= finish_template_variable (id
);
174 --processing_template_decl
;
178 /*---------------------------------------------------------------------------
179 Resolution of qualified concept names
180 ---------------------------------------------------------------------------*/
182 /* This facility is used to resolve constraint checks from
183 requirement expressions. A constraint check is a call to
184 a function template declared with the keyword 'concept'.
186 The result of resolution is a pair (a TREE_LIST) whose value
187 is the matched declaration, and whose purpose contains the
188 coerced template arguments that can be substituted into the
191 // Given an overload set OVL, try to find a unique definition that can be
192 // instantiated by the template arguments ARGS.
194 // This function is not called for arbitrary call expressions. In particular,
195 // the call expression must be written with explicit template arguments
196 // and no function arguments. For example:
200 // If a single match is found, this returns a TREE_LIST whose VALUE
201 // is the constraint function (not the template), and its PURPOSE is
202 // the complete set of arguments substituted into the parameter list.
204 resolve_constraint_check (tree ovl
, tree args
)
207 tree cands
= NULL_TREE
;
208 for (tree p
= ovl
; p
!= NULL_TREE
; p
= OVL_NEXT (p
))
210 // Get the next template overload.
211 tree tmpl
= OVL_CURRENT (p
);
212 if (TREE_CODE (tmpl
) != TEMPLATE_DECL
)
215 // Don't try to deduce checks for non-concepts. We often
216 // end up trying to resolve constraints in functional casts
217 // as part of a postfix-expression. We can save time and
218 // headaches by not instantiating those declarations.
220 // NOTE: This masks a potential error, caused by instantiating
221 // non-deduced contexts using placeholder arguments.
222 tree fn
= DECL_TEMPLATE_RESULT (tmpl
);
223 if (DECL_ARGUMENTS (fn
))
225 if (!DECL_DECLARED_CONCEPT_P (fn
))
228 // Remember the candidate if we can deduce a substitution.
229 ++processing_template_decl
;
230 tree parms
= TREE_VALUE (DECL_TEMPLATE_PARMS (tmpl
));
231 if (tree subst
= coerce_template_parms (parms
, args
, tmpl
))
233 if (subst
== error_mark_node
)
236 cands
= tree_cons (subst
, fn
, cands
);
238 --processing_template_decl
;
242 /* We either had no candidates or failed deductions. */
243 return nerrs
? error_mark_node
: NULL_TREE
;
244 else if (TREE_CHAIN (cands
))
245 /* There are multiple candidates. */
246 return error_mark_node
;
251 // Determine if the the call expression CALL is a constraint check, and
252 // return the concept declaration and arguments being checked. If CALL
253 // does not denote a constraint check, return NULL.
255 resolve_constraint_check (tree call
)
257 gcc_assert (TREE_CODE (call
) == CALL_EXPR
);
259 // A constraint check must be only a template-id expression. If
260 // it's a call to a base-link, its function(s) should be a
261 // template-id expression. If this is not a template-id, then it
262 // cannot be a concept-check.
263 tree target
= CALL_EXPR_FN (call
);
264 if (BASELINK_P (target
))
265 target
= BASELINK_FUNCTIONS (target
);
266 if (TREE_CODE (target
) != TEMPLATE_ID_EXPR
)
269 // Get the overload set and template arguments and try to
270 // resolve the target.
271 tree ovl
= TREE_OPERAND (target
, 0);
273 /* This is a function call of a variable concept... ill-formed. */
274 if (TREE_CODE (ovl
) == TEMPLATE_DECL
)
276 error_at (location_of (call
),
277 "function call of variable concept %qE", call
);
278 return error_mark_node
;
281 tree args
= TREE_OPERAND (target
, 1);
282 return resolve_constraint_check (ovl
, args
);
285 /* Returns a pair containing the checked variable concept
286 and its associated prototype parameter. The result
287 is a TREE_LIST whose TREE_VALUE is the variable concept
288 and whose TREE_PURPOSE is the prototype parameter. */
291 resolve_variable_concept_check (tree id
)
293 tree tmpl
= TREE_OPERAND (id
, 0);
294 tree args
= TREE_OPERAND (id
, 1);
296 if (!variable_concept_p (tmpl
))
299 /* Make sure that we have the right parameters before
300 assuming that it works. Note that failing to deduce
301 will result in diagnostics. */
302 tree parms
= INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl
));
303 ++processing_template_decl
;
304 tree result
= coerce_template_parms (parms
, args
, tmpl
);
305 --processing_template_decl
;
306 if (result
!= error_mark_node
)
308 tree decl
= DECL_TEMPLATE_RESULT (tmpl
);
309 return build_tree_list (result
, decl
);
312 return error_mark_node
;
316 /* Given a call expression or template-id expression to
317 a concept EXPR possibly including a wildcard, deduce
318 the concept being checked and the prototype parameter.
319 Returns true if the constraint and prototype can be
320 deduced and false otherwise. Note that the CHECK and
321 PROTO arguments are set to NULL_TREE if this returns
325 deduce_constrained_parameter (tree expr
, tree
& check
, tree
& proto
)
327 tree info
= NULL_TREE
;
328 if (TREE_CODE (expr
) == TEMPLATE_ID_EXPR
)
329 info
= resolve_variable_concept_check (expr
);
330 else if (TREE_CODE (expr
) == CALL_EXPR
)
331 info
= resolve_constraint_check (expr
);
335 if (info
&& info
!= error_mark_node
)
337 check
= TREE_VALUE (info
);
338 tree arg
= TREE_VEC_ELT (TREE_PURPOSE (info
), 0);
339 if (ARGUMENT_PACK_P (arg
))
340 arg
= TREE_VEC_ELT (ARGUMENT_PACK_ARGS (arg
), 0);
341 proto
= TREE_TYPE (arg
);
344 check
= proto
= NULL_TREE
;
348 // Given a call expression or template-id expression to a concept, EXPR,
349 // deduce the concept being checked and return the template arguments.
350 // Returns NULL_TREE if deduction fails.
352 deduce_concept_introduction (tree expr
)
354 tree info
= NULL_TREE
;
355 if (TREE_CODE (expr
) == TEMPLATE_ID_EXPR
)
356 info
= resolve_variable_concept_check (expr
);
357 else if (TREE_CODE (expr
) == CALL_EXPR
)
358 info
= resolve_constraint_check (expr
);
362 if (info
&& info
!= error_mark_node
)
363 return TREE_PURPOSE (info
);
369 /*---------------------------------------------------------------------------
370 Constraint implication learning
371 ---------------------------------------------------------------------------*/
373 /* The implication context determines how we memoize concept checks.
374 Given two checks C1 and C2, the direction of implication depends
375 on whether we are learning implications of a conjunction or disjunction.
378 template<typename T> concept bool C = ...;
379 template<typenaem T> concept bool D = C<T> && true;
381 From this, we can learn that D<T> implies C<T>. We cannot learn,
382 without further testing, that C<T> does not imply D<T>. If, for
383 example, C<T> were defined as true, then these constraints would
384 be logically equivalent.
386 In rare cases, we may start with a logical equivalence. For example:
388 template<typename T> concept bool C = ...;
389 template<typename T> concept bool D = C<T>;
391 Here, we learn that C<T> implies D<T> and vice versa. */
393 enum implication_context
395 conjunction_cxt
, /* C1 implies C2. */
396 disjunction_cxt
, /* C2 implies C1. */
397 equivalence_cxt
/* C1 implies C2, C2 implies C1. */
400 void learn_implications(tree
, tree
, implication_context
);
403 learn_implication (tree parent
, tree child
, implication_context cxt
)
407 case conjunction_cxt
:
408 save_subsumption_result (parent
, child
, true);
410 case disjunction_cxt
:
411 save_subsumption_result (child
, parent
, true);
413 case equivalence_cxt
:
414 save_subsumption_result (parent
, child
, true);
415 save_subsumption_result (child
, parent
, true);
421 learn_logical_operation (tree parent
, tree constr
, implication_context cxt
)
423 learn_implications (parent
, TREE_OPERAND (constr
, 0), cxt
);
424 learn_implications (parent
, TREE_OPERAND (constr
, 1), cxt
);
428 learn_implications (tree parent
, tree constr
, implication_context cxt
)
430 switch (TREE_CODE (constr
))
433 return learn_implication (parent
, constr
, cxt
);
436 if (cxt
== disjunction_cxt
)
438 return learn_logical_operation (parent
, constr
, cxt
);
441 if (cxt
== conjunction_cxt
)
443 return learn_logical_operation (parent
, constr
, cxt
);
450 /* Quickly scan the top-level constraints of CONSTR to learn and
451 cache logical relations between concepts. The search does not
452 include conjunctions of disjunctions or vice versa. */
455 learn_implications (tree tmpl
, tree args
, tree constr
)
457 /* Don't memoize relations between non-dependent arguemnts. It's not
459 if (!uses_template_parms (args
))
462 /* Build a check constraint for the purpose of caching. */
463 tree parent
= build_nt (CHECK_CONSTR
, tmpl
, args
);
465 /* Start learning based on the kind of the top-level contraint. */
466 if (TREE_CODE (constr
) == CONJ_CONSTR
)
467 return learn_logical_operation (parent
, constr
, conjunction_cxt
);
468 else if (TREE_CODE (constr
) == DISJ_CONSTR
)
469 return learn_logical_operation (parent
, constr
, disjunction_cxt
);
470 else if (TREE_CODE (constr
) == CHECK_CONSTR
)
471 /* This is the rare concept alias case. */
472 return learn_implication (parent
, constr
, equivalence_cxt
);
475 /*---------------------------------------------------------------------------
476 Expansion of concept definitions
477 ---------------------------------------------------------------------------*/
479 /* Returns the expression of a function concept. */
482 get_returned_expression (tree fn
)
484 /* Extract the body of the function minus the return expression. */
485 tree body
= DECL_SAVED_TREE (fn
);
487 return error_mark_node
;
488 if (TREE_CODE (body
) == BIND_EXPR
)
489 body
= BIND_EXPR_BODY (body
);
490 if (TREE_CODE (body
) != RETURN_EXPR
)
491 return error_mark_node
;
493 return TREE_OPERAND (body
, 0);
496 /* Returns the initializer of a variable concept. */
499 get_variable_initializer (tree var
)
501 tree init
= DECL_INITIAL (var
);
503 return error_mark_node
;
507 /* Returns the definition of a variable or function concept. */
510 get_concept_definition (tree decl
)
513 return get_variable_initializer (decl
);
514 else if (TREE_CODE (decl
) == FUNCTION_DECL
)
515 return get_returned_expression (decl
);
519 int expansion_level
= 0;
521 struct expanding_concept_sentinel
523 expanding_concept_sentinel ()
528 ~expanding_concept_sentinel()
537 /* Returns true when a concept is being expanded. */
542 return expansion_level
> 0;
545 /* Expand a concept declaration (not a template) and its arguments to
546 a constraint defined by the concept's initializer or definition. */
549 expand_concept (tree decl
, tree args
)
551 expanding_concept_sentinel sentinel
;
553 if (TREE_CODE (decl
) == TEMPLATE_DECL
)
554 decl
= DECL_TEMPLATE_RESULT (decl
);
555 tree tmpl
= DECL_TI_TEMPLATE (decl
);
557 /* Check for a previous specialization. */
558 if (tree spec
= get_concept_expansion (tmpl
, args
))
561 /* Substitute the arguments to form a new definition expression. */
562 tree def
= get_concept_definition (decl
);
564 ++processing_template_decl
;
565 tree result
= tsubst_expr (def
, args
, tf_none
, NULL_TREE
, true);
566 --processing_template_decl
;
567 if (result
== error_mark_node
)
568 return error_mark_node
;
570 /* And lastly, normalize it, check for implications, and save
571 the specialization for later. */
572 tree norm
= normalize_expression (result
);
573 learn_implications (tmpl
, args
, norm
);
574 return save_concept_expansion (tmpl
, args
, norm
);
578 /*---------------------------------------------------------------------------
579 Stepwise normalization of expressions
581 This set of functions will transform an expression into a constraint
582 in a sequence of steps. Normalization does not not look into concept
584 ---------------------------------------------------------------------------*/
586 /* Transform a logical-or or logical-and expression into either
587 a conjunction or disjunction. */
590 normalize_logical_operation (tree t
, tree_code c
)
592 tree t0
= normalize_expression (TREE_OPERAND (t
, 0));
593 tree t1
= normalize_expression (TREE_OPERAND (t
, 1));
594 return build_nt (c
, t0
, t1
);
597 /* A simple requirement T introduces an expression constraint
598 for its expression. */
601 normalize_simple_requirement (tree t
)
603 return build_nt (EXPR_CONSTR
, TREE_OPERAND (t
, 0));
606 /* A type requirement T introduce a type constraint for its type. */
609 normalize_type_requirement (tree t
)
611 return build_nt (TYPE_CONSTR
, TREE_OPERAND (t
, 0));
614 /* A compound requirement T introduces a conjunction of constraints
615 depending on its form. The conjunction always includes an
616 expression constraint for the expression of the requirement.
617 If a trailing return type was specified, the conjunction includes
618 either an implicit conversion constraint or an argument deduction
619 constraint. If the noexcept specifier is present, the conjunction
620 includes an exception constraint. */
623 normalize_compound_requirement (tree t
)
625 tree expr
= TREE_OPERAND (t
, 0);
626 tree constr
= build_nt (EXPR_CONSTR
, TREE_OPERAND (t
, 0));
628 /* If a type is given, append an implicit conversion or
629 argument deduction constraint. */
630 if (tree type
= TREE_OPERAND (t
, 1))
633 /* TODO: We should be extracting a list of auto nodes
634 from type_uses_auto, not a single node */
635 if (tree placeholder
= type_uses_auto (type
))
636 type_constr
= build_nt (DEDUCT_CONSTR
, expr
, type
, placeholder
);
638 type_constr
= build_nt (ICONV_CONSTR
, expr
, type
);
639 constr
= conjoin_constraints (constr
, type_constr
);
642 /* If noexcept is present, append an exception constraint. */
643 if (COMPOUND_REQ_NOEXCEPT_P (t
))
645 tree except
= build_nt (EXCEPT_CONSTR
, expr
);
646 constr
= conjoin_constraints (constr
, except
);
652 /* A nested requirement T introduces a conjunction of constraints
653 corresponding to its constraint-expression.
655 If the result of transforming T is error_mark_node, the resulting
656 constraint is a predicate constraint whose operand is also
657 error_mark_node. This preserves the constraint structure, but
658 will guarantee that the constraint is never satisfied. */
661 normalize_nested_requirement (tree t
)
663 return normalize_expression (TREE_OPERAND (t
, 0));
666 /* Transform a requirement T into one or more constraints. */
669 normalize_requirement (tree t
)
671 switch (TREE_CODE (t
))
674 return normalize_simple_requirement (t
);
677 return normalize_type_requirement (t
);
680 return normalize_compound_requirement (t
);
683 return normalize_nested_requirement (t
);
688 return error_mark_node
;
691 /* Transform a sequence of requirements into a conjunction of
695 normalize_requirements (tree t
)
697 tree result
= NULL_TREE
;
698 for (; t
; t
= TREE_CHAIN (t
))
700 tree constr
= normalize_requirement (TREE_VALUE (t
));
701 result
= conjoin_constraints (result
, constr
);
706 /* The normal form of a requires-expression is a parameterized
707 constraint having the same parameters and a conjunction of
708 constraints representing the normal form of requirements. */
711 normalize_requires_expression (tree t
)
713 tree operand
= normalize_requirements (TREE_OPERAND (t
, 1));
714 if (tree parms
= TREE_OPERAND (t
, 0))
715 return build_nt (PARM_CONSTR
, parms
, operand
);
720 /* For a template-id referring to a variable concept, returns
721 a check constraint. Otherwise, returns a predicate constraint. */
724 normalize_template_id_expression (tree t
)
726 if (tree info
= resolve_variable_concept_check (t
))
728 if (info
== error_mark_node
)
730 /* We get this when the template arguments don't match
731 the variable concept. */
732 error ("invalid reference to concept %qE", t
);
733 return error_mark_node
;
736 tree decl
= TREE_VALUE (info
);
737 tree args
= TREE_PURPOSE (info
);
738 return build_nt (CHECK_CONSTR
, decl
, args
);
741 /* Check that we didn't refer to a function concept like a variable. */
742 tree tmpl
= TREE_OPERAND (t
, 0);
743 if (TREE_CODE (tmpl
) == OVERLOAD
)
745 tree fn
= OVL_FUNCTION (tmpl
);
746 if (TREE_CODE (fn
) == TEMPLATE_DECL
747 && DECL_DECLARED_CONCEPT_P (DECL_TEMPLATE_RESULT (fn
)))
749 error_at (location_of (t
),
750 "invalid reference to function concept %qD", fn
);
751 return error_mark_node
;
755 return build_nt (PRED_CONSTR
, t
);
758 /* For a call expression to a function concept, returns a check
759 constraint. Otherwise, returns a predicate constraint. */
762 normalize_call_expression (tree t
)
764 /* Try to resolve this function call as a concept. If not, then
765 it can be returned as a predicate constraint. */
766 tree check
= resolve_constraint_check (t
);
768 return build_nt (PRED_CONSTR
, t
);
769 if (check
== error_mark_node
)
771 /* TODO: Improve diagnostics. We could report why the reference
773 error ("invalid reference to concept %qE", t
);
774 return error_mark_node
;
777 tree fn
= TREE_VALUE (check
);
778 tree args
= TREE_PURPOSE (check
);
779 return build_nt (CHECK_CONSTR
, fn
, args
);
782 /* If T is a call to an overloaded && or || operator, diagnose that
783 as a non-SFINAEable error. Returns true if an error is emitted.
785 TODO: It would be better to diagnose this at the point of definition,
786 if possible. Perhaps we should immediately do a first-pass normalization
787 of a concept definition to catch obvious non-dependent errors like
791 check_for_logical_overloads (tree t
)
793 if (TREE_CODE (t
) != CALL_EXPR
)
796 tree fn
= CALL_EXPR_FN (t
);
798 /* For member calls, try extracting the function from the
800 if (TREE_CODE (fn
) == COMPONENT_REF
)
802 fn
= TREE_OPERAND (fn
, 1);
803 if (TREE_CODE (fn
) == BASELINK
)
804 fn
= BASELINK_FUNCTIONS (fn
);
807 if (TREE_CODE (fn
) != FUNCTION_DECL
)
810 if (DECL_OVERLOADED_OPERATOR_P (fn
))
812 location_t loc
= EXPR_LOC_OR_LOC (t
, input_location
);
813 error_at (loc
, "constraint %qE, uses overloaded operator", t
);
820 /* The normal form of an atom depends on the expression. The normal
821 form of a function call to a function concept is a check constraint
822 for that concept. The normal form of a reference to a variable
823 concept is a check constraint for that concept. Otherwise, the
824 constraint is a predicate constraint. */
827 normalize_atom (tree t
)
829 /* We can get constraints pushed down through pack expansions, so
831 if (constraint_p (t
))
834 tree type
= TREE_TYPE (t
);
835 if (!type
|| type_unknown_p (t
) || TREE_CODE (type
) == TEMPLATE_TYPE_PARM
)
837 else if (!dependent_type_p (type
))
839 if (check_for_logical_overloads (t
))
840 return error_mark_node
;
842 type
= cv_unqualified (type
);
843 if (!same_type_p (type
, boolean_type_node
))
845 error ("predicate constraint %q+E does not have type %<bool%>", t
);
846 return error_mark_node
;
850 if (TREE_CODE (t
) == TEMPLATE_ID_EXPR
)
851 return normalize_template_id_expression (t
);
852 if (TREE_CODE (t
) == CALL_EXPR
)
853 return normalize_call_expression (t
);
854 return build_nt (PRED_CONSTR
, t
);
857 /* Push down the pack expansion EXP into the leaves of the constraint PAT. */
860 push_down_pack_expansion (tree exp
, tree pat
)
862 switch (TREE_CODE (pat
))
867 pat
= copy_node (pat
);
868 TREE_OPERAND (pat
, 0)
869 = push_down_pack_expansion (exp
, TREE_OPERAND (pat
, 0));
870 TREE_OPERAND (pat
, 1)
871 = push_down_pack_expansion (exp
, TREE_OPERAND (pat
, 1));
876 exp
= copy_node (exp
);
877 SET_PACK_EXPANSION_PATTERN (exp
, pat
);
883 /* Transform a pack expansion into a constraint. First we transform the
884 pattern of the pack expansion, then we push the pack expansion down into the
885 leaves of the constraint so that partial ordering will work. */
888 normalize_pack_expansion (tree t
)
890 tree pat
= normalize_expression (PACK_EXPANSION_PATTERN (t
));
891 return push_down_pack_expansion (t
, pat
);
894 /* Transform an expression into a constraint. */
897 normalize_any_expression (tree t
)
899 switch (TREE_CODE (t
))
901 case TRUTH_ANDIF_EXPR
:
902 return normalize_logical_operation (t
, CONJ_CONSTR
);
904 case TRUTH_ORIF_EXPR
:
905 return normalize_logical_operation (t
, DISJ_CONSTR
);
908 return normalize_requires_expression (t
);
911 return normalize_expression (BIND_EXPR_BODY (t
));
913 case EXPR_PACK_EXPANSION
:
914 return normalize_pack_expansion (t
);
917 /* All other constraints are atomic. */
918 return normalize_atom (t
);
922 /* Transform a statement into an expression. */
924 normalize_any_statement (tree t
)
926 switch (TREE_CODE (t
))
929 return normalize_expression (TREE_OPERAND (t
, 0));
933 return error_mark_node
;
936 /* Reduction rules for the declaration T. */
939 normalize_any_declaration (tree t
)
941 switch (TREE_CODE (t
))
944 return normalize_atom (t
);
948 return error_mark_node
;
951 /* Returns the normal form of a constraint expression. */
954 normalize_expression (tree t
)
959 if (t
== error_mark_node
)
960 return error_mark_node
;
962 switch (TREE_CODE_CLASS (TREE_CODE (t
)))
968 return normalize_any_expression (t
);
971 return normalize_any_statement (t
);
973 case tcc_declaration
:
974 return normalize_any_declaration (t
);
976 case tcc_exceptional
:
980 /* These are all atomic predicate constraints. */
981 return normalize_atom (t
);
984 /* Unhandled node kind. */
987 return error_mark_node
;
991 /*---------------------------------------------------------------------------
992 Constraint normalization
993 ---------------------------------------------------------------------------*/
995 tree
normalize_constraint (tree
);
997 /* The normal form of the disjunction T0 /\ T1 is the conjunction
998 of the normal form of T0 and the normal form of T1. */
1001 normalize_conjunction (tree t
)
1003 tree t0
= normalize_constraint (TREE_OPERAND (t
, 0));
1004 tree t1
= normalize_constraint (TREE_OPERAND (t
, 1));
1005 return build_nt (CONJ_CONSTR
, t0
, t1
);
1008 /* The normal form of the disjunction T0 \/ T1 is the disjunction
1009 of the normal form of T0 and the normal form of T1. */
1012 normalize_disjunction (tree t
)
1014 tree t0
= normalize_constraint (TREE_OPERAND (t
, 0));
1015 tree t1
= normalize_constraint (TREE_OPERAND (t
, 1));
1016 return build_nt (DISJ_CONSTR
, t0
, t1
);
1019 /* A predicate constraint is normalized in two stages. First all
1020 references specializations of concepts are replaced by their
1021 substituted definitions. Then, the resulting expression is
1022 transformed into a constraint by transforming && expressions
1023 into conjunctions and || into disjunctions. */
1026 normalize_predicate_constraint (tree t
)
1028 ++processing_template_decl
;
1029 tree expr
= PRED_CONSTR_EXPR (t
);
1030 tree constr
= normalize_expression (expr
);
1031 --processing_template_decl
;
1035 /* The normal form of a parameterized constraint is the normal
1036 form of its operand. */
1039 normalize_parameterized_constraint (tree t
)
1041 tree parms
= PARM_CONSTR_PARMS (t
);
1042 tree operand
= normalize_constraint (PARM_CONSTR_OPERAND (t
));
1043 return build_nt (PARM_CONSTR
, parms
, operand
);
1046 /* Normalize the constraint T by reducing it so that it is
1047 comprised of only conjunctions and disjunctions of atomic
1051 normalize_constraint (tree t
)
1056 if (t
== error_mark_node
)
1059 switch (TREE_CODE (t
))
1062 return normalize_conjunction (t
);
1065 return normalize_disjunction (t
);
1068 return normalize_predicate_constraint (t
);
1071 return normalize_parameterized_constraint (t
);
1078 /* These constraints are defined to be atomic. */
1082 /* CONSTR was not a constraint. */
1085 return error_mark_node
;
1090 // -------------------------------------------------------------------------- //
1091 // Constraint Semantic Processing
1093 // The following functions are called by the parser and substitution rules
1094 // to create and evaluate constraint-related nodes.
1096 // The constraints associated with the current template parameters.
1098 current_template_constraints (void)
1100 if (!current_template_parms
)
1102 tree tmpl_constr
= TEMPLATE_PARM_CONSTRAINTS (current_template_parms
);
1103 return build_constraints (tmpl_constr
, NULL_TREE
);
1106 // If the recently parsed TYPE declares or defines a template or template
1107 // specialization, get its corresponding constraints from the current
1108 // template parameters and bind them to TYPE's declaration.
1110 associate_classtype_constraints (tree type
)
1112 if (!type
|| type
== error_mark_node
|| TREE_CODE (type
) != RECORD_TYPE
)
1115 // An explicit class template specialization has no template
1117 if (!current_template_parms
)
1120 if (CLASSTYPE_IS_TEMPLATE (type
) || CLASSTYPE_TEMPLATE_SPECIALIZATION (type
))
1122 tree decl
= TYPE_STUB_DECL (type
);
1123 tree ci
= current_template_constraints ();
1125 // An implicitly instantiated member template declaration already
1126 // has associated constraints. If it is defined outside of its
1127 // class, then we need match these constraints against those of
1128 // original declaration.
1129 if (tree orig_ci
= get_constraints (decl
))
1131 if (!equivalent_constraints (ci
, orig_ci
))
1133 // FIXME: Improve diagnostics.
1134 error ("%qT does not match any declaration", type
);
1135 return error_mark_node
;
1139 set_constraints (decl
, ci
);
1146 // Create an empty constraint info block.
1147 inline tree_constraint_info
*
1148 build_constraint_info ()
1150 return (tree_constraint_info
*)make_node (CONSTRAINT_INFO
);
1155 /* Build a constraint-info object that contains the associated constraints
1156 of a declaration. This also includes the declaration's template
1157 requirements (TREQS) and any trailing requirements for a function
1158 declarator (DREQS). Note that both TREQS and DREQS must be constraints.
1160 If the declaration has neither template nor declaration requirements
1161 this returns NULL_TREE, indicating an unconstrained declaration. */
1164 build_constraints (tree tmpl_reqs
, tree decl_reqs
)
1166 gcc_assert (tmpl_reqs
? constraint_p (tmpl_reqs
) : true);
1167 gcc_assert (decl_reqs
? constraint_p (decl_reqs
) : true);
1169 if (!tmpl_reqs
&& !decl_reqs
)
1172 tree_constraint_info
* ci
= build_constraint_info ();
1173 ci
->template_reqs
= tmpl_reqs
;
1174 ci
->declarator_reqs
= decl_reqs
;
1175 ci
->associated_constr
= conjoin_constraints (tmpl_reqs
, decl_reqs
);
1182 /* Construct a sequence of template arguments by prepending
1183 ARG to REST. Either ARG or REST may be null. */
1185 build_concept_check_arguments (tree arg
, tree rest
)
1187 gcc_assert (rest
? TREE_CODE (rest
) == TREE_VEC
: true);
1191 int n
= rest
? TREE_VEC_LENGTH (rest
) : 0;
1192 args
= make_tree_vec (n
+ 1);
1193 TREE_VEC_ELT (args
, 0) = arg
;
1195 for (int i
= 0; i
< n
; ++i
)
1196 TREE_VEC_ELT (args
, i
+ 1) = TREE_VEC_ELT (rest
, i
);
1197 int def
= rest
? GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (rest
) : 0;
1198 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (args
, def
+ 1);
1202 gcc_assert (rest
!= NULL_TREE
);
1210 /* Construct an expression that checks the concept given by
1211 TARGET. The TARGET must be:
1213 - an OVERLOAD referring to one or more function concepts
1214 - a BASELINK referring to an overload set of the above, or
1215 - a TEMPLTATE_DECL referring to a variable concept.
1217 ARG and REST are the explicit template arguments for the
1218 eventual concept check. */
1220 build_concept_check (tree target
, tree arg
, tree rest
)
1222 tree args
= build_concept_check_arguments (arg
, rest
);
1223 if (variable_template_p (target
))
1224 return build_variable_check (lookup_template_variable (target
, args
));
1226 return build_call_check (lookup_template_function (target
, args
));
1230 /* Returns a TYPE_DECL that contains sufficient information to
1231 build a template parameter of the same kind as PROTO and
1232 constrained by the concept declaration CNC. Note that PROTO
1233 is the first template parameter of CNC.
1235 If specified, ARGS provides additional arguments to the
1236 constraint check. */
1238 build_constrained_parameter (tree cnc
, tree proto
, tree args
)
1240 tree name
= DECL_NAME (cnc
);
1241 tree type
= TREE_TYPE (proto
);
1242 tree decl
= build_decl (input_location
, TYPE_DECL
, name
, type
);
1243 CONSTRAINED_PARM_PROTOTYPE (decl
) = proto
;
1244 CONSTRAINED_PARM_CONCEPT (decl
) = cnc
;
1245 CONSTRAINED_PARM_EXTRA_ARGS (decl
) = args
;
1249 /* Create a constraint expression for the given DECL that
1250 evaluates the requirements specified by CONSTR, a TYPE_DECL
1251 that contains all the information necessary to build the
1252 requirements (see finish_concept_name for the layout of
1255 Note that the constraints are neither reduced nor decomposed.
1256 That is done only after the requires clause has been parsed
1259 This will always return a CHECK_CONSTR. */
1261 finish_shorthand_constraint (tree decl
, tree constr
)
1263 /* No requirements means no constraints. */
1267 tree proto
= CONSTRAINED_PARM_PROTOTYPE (constr
);
1268 tree con
= CONSTRAINED_PARM_CONCEPT (constr
);
1269 tree args
= CONSTRAINED_PARM_EXTRA_ARGS (constr
);
1271 /* If the parameter declaration is variadic, but the concept
1272 is not then we need to apply the concept to every element
1274 bool is_proto_pack
= template_parameter_pack_p (proto
);
1275 bool is_decl_pack
= template_parameter_pack_p (decl
);
1276 bool apply_to_all_p
= is_decl_pack
&& !is_proto_pack
;
1278 /* Get the argument and overload used for the requirement
1279 and adjust it if we're going to expand later. */
1280 tree arg
= template_parm_to_arg (build_tree_list (NULL_TREE
, decl
));
1282 arg
= PACK_EXPANSION_PATTERN (TREE_VEC_ELT (ARGUMENT_PACK_ARGS (arg
), 0));
1284 /* Build the concept check. If it the constraint needs to be
1285 applied to all elements of the parameter pack, then make
1286 the constraint an expansion. */
1288 tree tmpl
= DECL_TI_TEMPLATE (con
);
1290 check
= build_concept_check (tmpl
, arg
, args
);
1293 tree ovl
= build_overload (tmpl
, NULL_TREE
);
1294 check
= build_concept_check (ovl
, arg
, args
);
1297 /* Make the check a pack expansion if needed.
1299 FIXME: We should be making a fold expression. */
1302 check
= make_pack_expansion (check
);
1303 TREE_TYPE (check
) = boolean_type_node
;
1306 return normalize_expression (check
);
1309 /* Returns a conjunction of shorthand requirements for the template
1310 parameter list PARMS. Note that the requirements are stored in
1311 the TYPE of each tree node. */
1313 get_shorthand_constraints (tree parms
)
1315 tree result
= NULL_TREE
;
1316 parms
= INNERMOST_TEMPLATE_PARMS (parms
);
1317 for (int i
= 0; i
< TREE_VEC_LENGTH (parms
); ++i
)
1319 tree parm
= TREE_VEC_ELT (parms
, i
);
1320 tree constr
= TEMPLATE_PARM_CONSTRAINTS (parm
);
1321 result
= conjoin_constraints (result
, constr
);
1326 // Returns and chains a new parameter for PARAMETER_LIST which will conform
1327 // to the prototype given by SRC_PARM. The new parameter will have its
1328 // identifier and location set according to IDENT and PARM_LOC respectively.
1330 process_introduction_parm (tree parameter_list
, tree src_parm
)
1332 // If we have a pack, we should have a single pack argument which is the
1333 // placeholder we want to look at.
1334 bool is_parameter_pack
= ARGUMENT_PACK_P (src_parm
);
1335 if (is_parameter_pack
)
1336 src_parm
= TREE_VEC_ELT (ARGUMENT_PACK_ARGS (src_parm
), 0);
1338 // At this point we should have a wildcard, but we want to
1339 // grab the associated decl from it. Also grab the stored
1340 // identifier and location that should be chained to it in
1342 gcc_assert (TREE_CODE (src_parm
) == WILDCARD_DECL
);
1344 tree ident
= DECL_NAME (src_parm
);
1345 location_t parm_loc
= DECL_SOURCE_LOCATION (src_parm
);
1347 // If we expect a pack and the deduced template is not a pack, or if the
1348 // template is using a pack and we didn't declare a pack, throw an error.
1349 if (is_parameter_pack
!= WILDCARD_PACK_P (src_parm
))
1351 error_at (parm_loc
, "cannot match pack for introduced parameter");
1352 tree err_parm
= build_tree_list (error_mark_node
, error_mark_node
);
1353 return chainon (parameter_list
, err_parm
);
1356 src_parm
= TREE_TYPE (src_parm
);
1360 if (TREE_CODE (src_parm
) == TYPE_DECL
)
1362 is_non_type
= false;
1363 parm
= finish_template_type_parm (class_type_node
, ident
);
1365 else if (TREE_CODE (src_parm
) == TEMPLATE_DECL
)
1367 is_non_type
= false;
1368 begin_template_parm_list ();
1369 current_template_parms
= DECL_TEMPLATE_PARMS (src_parm
);
1370 end_template_parm_list ();
1371 parm
= finish_template_template_parm (class_type_node
, ident
);
1377 // Since we don't have a declarator, so we can copy the source
1378 // parameter and change the name and eventually the location.
1379 parm
= copy_decl (src_parm
);
1380 DECL_NAME (parm
) = ident
;
1383 // Wrap in a TREE_LIST for process_template_parm. Introductions do not
1384 // retain the defaults from the source template.
1385 parm
= build_tree_list (NULL_TREE
, parm
);
1387 return process_template_parm (parameter_list
, parm_loc
, parm
,
1388 is_non_type
, is_parameter_pack
);
1391 /* Associates a constraint check to the current template based
1392 on the introduction parameters. INTRO_LIST must be a TREE_VEC
1393 of WILDCARD_DECLs containing a chained PARM_DECL which
1394 contains the identifier as well as the source location.
1395 TMPL_DECL is the decl for the concept being used. If we
1396 take a concept, C, this will form a check in the form of
1397 C<INTRO_LIST> filling in any extra arguments needed by the
1400 Returns NULL_TREE if no concept could be matched and
1401 error_mark_node if an error occurred when matching. */
1403 finish_template_introduction (tree tmpl_decl
, tree intro_list
)
1405 /* Deduce the concept check. */
1406 tree expr
= build_concept_check (tmpl_decl
, NULL_TREE
, intro_list
);
1407 if (expr
== error_mark_node
)
1410 tree parms
= deduce_concept_introduction (expr
);
1414 /* Build template parameter scope for introduction. */
1415 tree parm_list
= NULL_TREE
;
1416 begin_template_parm_list ();
1417 int nargs
= MIN (TREE_VEC_LENGTH (parms
), TREE_VEC_LENGTH (intro_list
));
1418 for (int n
= 0; n
< nargs
; ++n
)
1419 parm_list
= process_introduction_parm (parm_list
, TREE_VEC_ELT (parms
, n
));
1420 parm_list
= end_template_parm_list (parm_list
);
1421 for (int i
= 0; i
< TREE_VEC_LENGTH (parm_list
); ++i
)
1422 if (TREE_VALUE (TREE_VEC_ELT (parm_list
, i
)) == error_mark_node
)
1424 end_template_decl ();
1425 return error_mark_node
;
1428 /* Build a concept check for our constraint. */
1429 tree check_args
= make_tree_vec (TREE_VEC_LENGTH (parms
));
1431 for (; n
< TREE_VEC_LENGTH (parm_list
); ++n
)
1433 tree parm
= TREE_VEC_ELT (parm_list
, n
);
1434 TREE_VEC_ELT (check_args
, n
) = template_parm_to_arg (parm
);
1436 SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (check_args
, n
);
1438 /* If the template expects more parameters we should be able
1439 to use the defaults from our deduced concept. */
1440 for (; n
< TREE_VEC_LENGTH (parms
); ++n
)
1441 TREE_VEC_ELT (check_args
, n
) = TREE_VEC_ELT (parms
, n
);
1443 /* Associate the constraint. */
1444 tree check
= build_concept_check (tmpl_decl
, NULL_TREE
, check_args
);
1445 tree constr
= normalize_expression (check
);
1446 TEMPLATE_PARMS_CONSTRAINTS (current_template_parms
) = constr
;
1452 /* Given the predicate constraint T from a constrained-type-specifier, extract
1453 its TMPL and ARGS. FIXME why do we need two different forms of
1454 constrained-type-specifier? */
1457 placeholder_extract_concept_and_args (tree t
, tree
&tmpl
, tree
&args
)
1459 if (TREE_CODE (t
) == TYPE_DECL
)
1461 /* A constrained parameter. Build a constraint check
1462 based on the prototype parameter and then extract the
1463 arguments from that. */
1464 tree proto
= CONSTRAINED_PARM_PROTOTYPE (t
);
1465 tree check
= finish_shorthand_constraint (proto
, t
);
1466 placeholder_extract_concept_and_args (check
, tmpl
, args
);
1470 if (TREE_CODE (t
) == CHECK_CONSTR
)
1472 tree decl
= CHECK_CONSTR_CONCEPT (t
);
1473 tmpl
= DECL_TI_TEMPLATE (decl
);
1474 args
= CHECK_CONSTR_ARGS (t
);
1481 /* Returns true iff the placeholders C1 and C2 are equivalent. C1
1482 and C2 can be either CHECK_CONSTR or TEMPLATE_TYPE_PARM. */
1485 equivalent_placeholder_constraints (tree c1
, tree c2
)
1487 if (c1
&& TREE_CODE (c1
) == TEMPLATE_TYPE_PARM
)
1488 /* A constrained auto. */
1489 c1
= PLACEHOLDER_TYPE_CONSTRAINTS (c1
);
1490 if (c2
&& TREE_CODE (c2
) == TEMPLATE_TYPE_PARM
)
1491 c2
= PLACEHOLDER_TYPE_CONSTRAINTS (c2
);
1497 if (c1
== error_mark_node
|| c2
== error_mark_node
)
1498 /* We get here during satisfaction; when a deduction constraint
1499 fails, substitution can produce an error_mark_node for the
1500 placeholder constraints. */
1503 tree t1
, t2
, a1
, a2
;
1504 placeholder_extract_concept_and_args (c1
, t1
, a1
);
1505 placeholder_extract_concept_and_args (c2
, t2
, a2
);
1510 int len1
= TREE_VEC_LENGTH (a1
);
1511 int len2
= TREE_VEC_LENGTH (a2
);
1515 /* Skip the first argument so we don't infinitely recurse.
1516 Also, they may differ in template parameter index. */
1517 for (int i
= 1; i
< len1
; ++i
)
1519 tree t1
= TREE_VEC_ELT (a1
, i
);
1520 tree t2
= TREE_VEC_ELT (a2
, i
);
1521 if (!template_args_equal (t1
, t2
))
1527 /* Return a hash value for the placeholder PRED_CONSTR C. */
1530 hash_placeholder_constraint (tree c
)
1533 placeholder_extract_concept_and_args (c
, t
, a
);
1535 /* Like hash_tmpl_and_args, but skip the first argument. */
1536 hashval_t val
= iterative_hash_object (DECL_UID (t
), 0);
1538 for (int i
= TREE_VEC_LENGTH (a
)-1; i
> 0; --i
)
1539 val
= iterative_hash_template_arg (TREE_VEC_ELT (a
, i
), val
);
1544 /*---------------------------------------------------------------------------
1545 Constraint substitution
1546 ---------------------------------------------------------------------------*/
1548 /* The following functions implement substitution rules for constraints.
1549 Substitution without checking constraints happens only in the
1550 instantiation of class templates. For example:
1552 template<C1 T> struct S {
1553 void f(T) requires C2<T>;
1554 void g(T) requires T::value;
1557 S<int> s; // error instantiating S<int>::g(T)
1559 When we instantiate S, we substitute into its member declarations,
1560 including their constraints. However, those constraints are not
1561 checked. Substituting int into C2<T> yields C2<int>, and substituting
1562 into T::value yields a substitution failure, making the program
1565 Note that we only ever substitute into the associated constraints
1566 of a declaration. That is, substitution is defined only for predicate
1567 constraints and conjunctions. */
1569 /* Substitute into the predicate constraints. Returns error_mark_node
1570 if the substitution into the expression fails. */
1572 tsubst_predicate_constraint (tree t
, tree args
,
1573 tsubst_flags_t complain
, tree in_decl
)
1575 tree expr
= PRED_CONSTR_EXPR (t
);
1576 ++processing_template_decl
;
1577 tree result
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
1578 --processing_template_decl
;
1579 return build_nt (PRED_CONSTR
, result
);
1582 /* Substitute into a check constraint. */
1585 tsubst_check_constraint (tree t
, tree args
,
1586 tsubst_flags_t complain
, tree in_decl
)
1588 tree decl
= CHECK_CONSTR_CONCEPT (t
);
1589 tree tmpl
= DECL_TI_TEMPLATE (decl
);
1590 tree targs
= CHECK_CONSTR_ARGS (t
);
1592 /* Substitute through by building an template-id expression
1593 and then substituting into that. */
1594 tree expr
= build_nt(TEMPLATE_ID_EXPR
, tmpl
, targs
);
1595 ++processing_template_decl
;
1596 tree result
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
1597 --processing_template_decl
;
1599 if (result
== error_mark_node
)
1600 return error_mark_node
;
1602 /* Extract the results and rebuild the check constraint. */
1603 decl
= DECL_TEMPLATE_RESULT (TREE_OPERAND (result
, 0));
1604 args
= TREE_OPERAND (result
, 1);
1606 return build_nt (CHECK_CONSTR
, decl
, args
);
1609 /* Substitute into the conjunction of constraints. Returns
1610 error_mark_node if substitution into either operand fails. */
1613 tsubst_logical_operator (tree t
, tree args
,
1614 tsubst_flags_t complain
, tree in_decl
)
1616 tree t0
= TREE_OPERAND (t
, 0);
1617 tree r0
= tsubst_constraint (t0
, args
, complain
, in_decl
);
1618 if (r0
== error_mark_node
)
1619 return error_mark_node
;
1620 tree t1
= TREE_OPERAND (t
, 1);
1621 tree r1
= tsubst_constraint (t1
, args
, complain
, in_decl
);
1622 if (r1
== error_mark_node
)
1623 return error_mark_node
;
1624 return build_nt (TREE_CODE (t
), r0
, r1
);
1629 /* Substitute ARGS into the expression constraint T. */
1632 tsubst_expr_constr (tree t
, tree args
, tsubst_flags_t complain
, tree in_decl
)
1634 cp_unevaluated guard
;
1635 tree expr
= EXPR_CONSTR_EXPR (t
);
1636 tree ret
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
1637 if (ret
== error_mark_node
)
1638 return error_mark_node
;
1639 return build_nt (EXPR_CONSTR
, ret
);
1642 /* Substitute ARGS into the type constraint T. */
1645 tsubst_type_constr (tree t
, tree args
, tsubst_flags_t complain
, tree in_decl
)
1647 tree type
= TYPE_CONSTR_TYPE (t
);
1648 tree ret
= tsubst (type
, args
, complain
, in_decl
);
1649 if (ret
== error_mark_node
)
1650 return error_mark_node
;
1651 return build_nt (TYPE_CONSTR
, ret
);
1654 /* Substitute ARGS into the implicit conversion constraint T. */
1657 tsubst_implicit_conversion_constr (tree t
, tree args
, tsubst_flags_t complain
,
1660 cp_unevaluated guard
;
1661 tree expr
= ICONV_CONSTR_EXPR (t
);
1662 tree type
= ICONV_CONSTR_TYPE (t
);
1663 tree new_expr
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
1664 if (new_expr
== error_mark_node
)
1665 return error_mark_node
;
1666 tree new_type
= tsubst (type
, args
, complain
, in_decl
);
1667 if (new_type
== error_mark_node
)
1668 return error_mark_node
;
1669 return build_nt (ICONV_CONSTR
, new_expr
, new_type
);
1672 /* Substitute ARGS into the argument deduction constraint T. */
1675 tsubst_argument_deduction_constr (tree t
, tree args
, tsubst_flags_t complain
,
1678 cp_unevaluated guard
;
1679 tree expr
= DEDUCT_CONSTR_EXPR (t
);
1680 tree pattern
= DEDUCT_CONSTR_PATTERN (t
);
1681 tree autos
= DEDUCT_CONSTR_PLACEHOLDER(t
);
1682 tree new_expr
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
1683 if (new_expr
== error_mark_node
)
1684 return error_mark_node
;
1685 /* It seems like substituting through the pattern will not affect the
1686 placeholders. We should (?) be able to reuse the existing list
1687 without any problems. If not, then we probably want to create a
1688 new list of placeholders and then instantiate the pattern using
1690 tree new_pattern
= tsubst (pattern
, args
, complain
, in_decl
);
1691 if (new_pattern
== error_mark_node
)
1692 return error_mark_node
;
1693 return build_nt (DEDUCT_CONSTR
, new_expr
, new_pattern
, autos
);
1696 /* Substitute ARGS into the exception constraint T. */
1699 tsubst_exception_constr (tree t
, tree args
, tsubst_flags_t complain
,
1702 cp_unevaluated guard
;
1703 tree expr
= EXCEPT_CONSTR_EXPR (t
);
1704 tree ret
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
1705 if (ret
== error_mark_node
)
1706 return error_mark_node
;
1707 return build_nt (EXCEPT_CONSTR
, ret
);
1710 /* A subroutine of tsubst_constraint_variables. Register local
1711 specializations for each of parameter in PARMS and its
1712 corresponding substituted constraint variable in VARS.
1716 declare_constraint_vars (tree parms
, tree vars
)
1719 for (tree t
= parms
; t
; t
= DECL_CHAIN (t
))
1721 if (DECL_PACK_P (t
))
1723 tree pack
= extract_fnparm_pack (t
, &s
);
1724 register_local_specialization (pack
, t
);
1728 register_local_specialization (s
, t
);
1735 /* A subroutine of tsubst_parameterized_constraint. Substitute ARGS
1736 into the parameter list T, producing a sequence of constraint
1737 variables, declared in the current scope.
1739 Note that the caller must establish a local specialization stack
1740 prior to calling this function since this substitution will
1741 declare the substituted parameters. */
1744 tsubst_constraint_variables (tree t
, tree args
,
1745 tsubst_flags_t complain
, tree in_decl
)
1747 /* Clear cp_unevaluated_operand across tsubst so that we get a proper chain
1749 int saved_unevaluated_operand
= cp_unevaluated_operand
;
1750 cp_unevaluated_operand
= 0;
1751 tree vars
= tsubst (t
, args
, complain
, in_decl
);
1752 cp_unevaluated_operand
= saved_unevaluated_operand
;
1753 if (vars
== error_mark_node
)
1754 return error_mark_node
;
1755 return declare_constraint_vars (t
, vars
);
1758 /* Substitute ARGS into the parameterized constraint T. */
1761 tsubst_parameterized_constraint (tree t
, tree args
,
1762 tsubst_flags_t complain
, tree in_decl
)
1764 local_specialization_stack stack
;
1765 tree vars
= tsubst_constraint_variables (PARM_CONSTR_PARMS (t
),
1766 args
, complain
, in_decl
);
1767 if (vars
== error_mark_node
)
1768 return error_mark_node
;
1769 tree expr
= tsubst_constraint (PARM_CONSTR_OPERAND (t
), args
,
1771 if (expr
== error_mark_node
)
1772 return error_mark_node
;
1773 return build_nt (PARM_CONSTR
, vars
, expr
);
1776 /* Substitute ARGS into the simple requirement T. Note that
1777 substitution may result in an ill-formed expression without
1778 causing the program to be ill-formed. In such cases, the
1779 requirement wraps an error_mark_node. */
1782 tsubst_simple_requirement (tree t
, tree args
,
1783 tsubst_flags_t complain
, tree in_decl
)
1785 ++processing_template_decl
;
1786 tree expr
= tsubst_expr (TREE_OPERAND (t
, 0), args
, complain
, in_decl
, false);
1787 --processing_template_decl
;
1788 return finish_simple_requirement (expr
);
1791 /* Substitute ARGS into the type requirement T. Note that
1792 substitution may result in an ill-formed type without
1793 causing the program to be ill-formed. In such cases, the
1794 requirement wraps an error_mark_node. */
1797 tsubst_type_requirement (tree t
, tree args
,
1798 tsubst_flags_t complain
, tree in_decl
)
1800 ++processing_template_decl
;
1801 tree type
= tsubst (TREE_OPERAND (t
, 0), args
, complain
, in_decl
);
1802 --processing_template_decl
;
1803 return finish_type_requirement (type
);
1806 /* Substitute args into the compound requirement T. If substituting
1807 into either the expression or the type fails, the corresponding
1808 operands in the resulting node will be error_mark_node. This
1809 preserves a requirement for the purpose of partial ordering, but
1810 it will never be satisfied. */
1813 tsubst_compound_requirement (tree t
, tree args
,
1814 tsubst_flags_t complain
, tree in_decl
)
1816 ++processing_template_decl
;
1817 tree expr
= tsubst_expr (TREE_OPERAND (t
, 0), args
, complain
, in_decl
, false);
1818 tree type
= tsubst (TREE_OPERAND (t
, 1), args
, complain
, in_decl
);
1819 --processing_template_decl
;
1820 bool noexcept_p
= COMPOUND_REQ_NOEXCEPT_P (t
);
1821 return finish_compound_requirement (expr
, type
, noexcept_p
);
1824 /* Substitute ARGS into the nested requirement T. */
1827 tsubst_nested_requirement (tree t
, tree args
,
1828 tsubst_flags_t complain
, tree in_decl
)
1830 ++processing_template_decl
;
1831 tree expr
= tsubst_expr (TREE_OPERAND (t
, 0), args
, complain
, in_decl
, false);
1832 --processing_template_decl
;
1833 return finish_nested_requirement (expr
);
1836 /* Substitute ARGS into the requirement T. */
1839 tsubst_requirement (tree t
, tree args
, tsubst_flags_t complain
, tree in_decl
)
1841 switch (TREE_CODE (t
))
1844 return tsubst_simple_requirement (t
, args
, complain
, in_decl
);
1846 return tsubst_type_requirement (t
, args
, complain
, in_decl
);
1848 return tsubst_compound_requirement (t
, args
, complain
, in_decl
);
1850 return tsubst_nested_requirement (t
, args
, complain
, in_decl
);
1854 return error_mark_node
;
1857 /* Substitute ARGS into the list of requirements T. Note that
1858 substitution failures here result in ill-formed programs. */
1861 tsubst_requirement_body (tree t
, tree args
,
1862 tsubst_flags_t complain
, tree in_decl
)
1867 tree e
= tsubst_requirement (TREE_VALUE (t
), args
, complain
, in_decl
);
1868 if (e
== error_mark_node
)
1869 return error_mark_node
;
1870 r
= tree_cons (NULL_TREE
, e
, r
);
1873 /* Ensure that the order of constraints is the same as the original. */
1874 return nreverse (r
);
1879 /* Substitute ARGS into the requires expression T. Note that this
1880 results in the re-declaration of local parameters when
1881 substituting through the parameter list. If either substitution
1882 fails, the program is ill-formed. */
1885 tsubst_requires_expr (tree t
, tree args
,
1886 tsubst_flags_t complain
, tree in_decl
)
1888 local_specialization_stack stack
;
1890 tree parms
= TREE_OPERAND (t
, 0);
1893 parms
= tsubst_constraint_variables (parms
, args
, complain
, in_decl
);
1894 if (parms
== error_mark_node
)
1895 return error_mark_node
;
1898 tree reqs
= TREE_OPERAND (t
, 1);
1899 reqs
= tsubst_requirement_body (reqs
, args
, complain
, in_decl
);
1900 if (reqs
== error_mark_node
)
1901 return error_mark_node
;
1903 return finish_requires_expr (parms
, reqs
);
1906 /* Substitute ARGS into the constraint information CI, producing a new
1907 constraint record. */
1910 tsubst_constraint_info (tree t
, tree args
,
1911 tsubst_flags_t complain
, tree in_decl
)
1913 if (!t
|| t
== error_mark_node
|| !check_constraint_info (t
))
1916 tree tmpl_constr
= NULL_TREE
;
1917 if (tree r
= CI_TEMPLATE_REQS (t
))
1918 tmpl_constr
= tsubst_constraint (r
, args
, complain
, in_decl
);
1920 tree decl_constr
= NULL_TREE
;
1921 if (tree r
= CI_DECLARATOR_REQS (t
))
1922 decl_constr
= tsubst_constraint (r
, args
, complain
, in_decl
);
1924 return build_constraints (tmpl_constr
, decl_constr
);
1927 /* Substitute ARGS into the constraint T. */
1930 tsubst_constraint (tree t
, tree args
, tsubst_flags_t complain
, tree in_decl
)
1934 switch (TREE_CODE (t
))
1937 return tsubst_predicate_constraint (t
, args
, complain
, in_decl
);
1939 return tsubst_check_constraint (t
, args
, complain
, in_decl
);
1942 return tsubst_logical_operator (t
, args
, complain
, in_decl
);
1944 return tsubst_parameterized_constraint (t
, args
, complain
, in_decl
);
1946 return tsubst_expr_constr (t
, args
, complain
, in_decl
);
1948 return tsubst_type_constr (t
, args
, complain
, in_decl
);
1950 return tsubst_implicit_conversion_constr (t
, args
, complain
, in_decl
);
1952 return tsubst_argument_deduction_constr (t
, args
, complain
, in_decl
);
1954 return tsubst_exception_constr (t
, args
, complain
, in_decl
);
1958 return error_mark_node
;
1961 /*---------------------------------------------------------------------------
1962 Constraint satisfaction
1963 ---------------------------------------------------------------------------*/
1965 /* The following functions determine if a constraint, when
1966 substituting template arguments, is satisfied. For convenience,
1967 satisfaction reduces a constraint to either true or false (and
1972 tree
satisfy_constraint_1 (tree
, tree
, tsubst_flags_t
, tree
);
1974 /* Check the constraint pack expansion. */
1977 satisfy_pack_expansion (tree t
, tree args
,
1978 tsubst_flags_t complain
, tree in_decl
)
1980 /* Get the vector of satisfaction results.
1981 gen_elem_of_pack_expansion_instantiation will check that each element of
1982 the expansion is satisfied. */
1983 tree exprs
= tsubst_pack_expansion (t
, args
, complain
, in_decl
);
1985 if (exprs
== error_mark_node
)
1986 return boolean_false_node
;
1988 /* TODO: It might be better to normalize each expanded term
1989 and evaluate them separately. That would provide better
1990 opportunities for diagnostics. */
1991 for (int i
= 0; i
< TREE_VEC_LENGTH (exprs
); ++i
)
1992 if (TREE_VEC_ELT (exprs
, i
) != boolean_true_node
)
1993 return boolean_false_node
;
1994 return boolean_true_node
;
1997 /* A predicate constraint is satisfied if its expression evaluates
1998 to true. If substitution into that node fails, the constraint
1999 is not satisfied ([temp.constr.pred]).
2001 Note that a predicate constraint is a constraint expression
2002 of type bool. If neither of those are true, the program is
2003 ill-formed; they are not SFINAE'able errors. */
2006 satisfy_predicate_constraint (tree t
, tree args
,
2007 tsubst_flags_t complain
, tree in_decl
)
2009 tree expr
= TREE_OPERAND (t
, 0);
2011 /* We should never have a naked pack expansion in a predicate constraint. */
2012 gcc_assert (TREE_CODE (expr
) != EXPR_PACK_EXPANSION
);
2014 /* If substitution into the expression fails, the constraint
2015 is not satisfied. */
2016 expr
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
2017 if (expr
== error_mark_node
)
2018 return boolean_false_node
;
2020 /* A predicate constraint shall have type bool. In some
2021 cases, substitution gives us const-qualified bool, which
2022 is also acceptable. */
2023 tree type
= cv_unqualified (TREE_TYPE (expr
));
2024 if (!same_type_p (type
, boolean_type_node
))
2026 error_at (EXPR_LOC_OR_LOC (expr
, input_location
),
2027 "constraint %qE does not have type %qT",
2028 expr
, boolean_type_node
);
2029 return boolean_false_node
;
2032 return cxx_constant_value (expr
);
2035 /* A concept check constraint like C<CARGS> is satisfied if substituting ARGS
2036 into CARGS succeeds and C is satisfied for the resulting arguments. */
2039 satisfy_check_constraint (tree t
, tree args
,
2040 tsubst_flags_t complain
, tree in_decl
)
2042 tree decl
= CHECK_CONSTR_CONCEPT (t
);
2043 tree tmpl
= DECL_TI_TEMPLATE (decl
);
2044 tree cargs
= CHECK_CONSTR_ARGS (t
);
2046 /* Instantiate the concept check arguments. */
2047 tree targs
= tsubst (cargs
, args
, tf_none
, NULL_TREE
);
2048 if (targs
== error_mark_node
)
2049 return boolean_false_node
;
2051 /* Search for a previous value. */
2052 if (tree prev
= lookup_concept_satisfaction (tmpl
, targs
))
2055 /* Expand the concept; failure here implies non-satisfaction. */
2056 tree def
= expand_concept (decl
, targs
);
2057 if (def
== error_mark_node
)
2058 return memoize_concept_satisfaction (tmpl
, args
, boolean_false_node
);
2060 /* Recursively satisfy the constraint. */
2061 tree result
= satisfy_constraint_1 (def
, targs
, complain
, in_decl
);
2062 return memoize_concept_satisfaction (tmpl
, targs
, result
);
2065 /* Check an expression constraint. The constraint is satisfied if
2066 substitution succeeds ([temp.constr.expr]).
2068 Note that the expression is unevaluated. */
2071 satisfy_expression_constraint (tree t
, tree args
,
2072 tsubst_flags_t complain
, tree in_decl
)
2074 cp_unevaluated guard
;
2075 deferring_access_check_sentinel deferring
;
2077 tree expr
= EXPR_CONSTR_EXPR (t
);
2078 tree check
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
2079 if (check
== error_mark_node
)
2080 return boolean_false_node
;
2081 if (!perform_deferred_access_checks (tf_none
))
2082 return boolean_false_node
;
2083 return boolean_true_node
;
2086 /* Check a type constraint. The constraint is satisfied if
2087 substitution succeeds. */
2090 satisfy_type_constraint (tree t
, tree args
,
2091 tsubst_flags_t complain
, tree in_decl
)
2093 deferring_access_check_sentinel deferring
;
2094 tree type
= TYPE_CONSTR_TYPE (t
);
2095 gcc_assert (TYPE_P (type
) || type
== error_mark_node
);
2096 tree check
= tsubst (type
, args
, complain
, in_decl
);
2097 if (error_operand_p (check
))
2098 return boolean_false_node
;
2099 if (!perform_deferred_access_checks (complain
))
2100 return boolean_false_node
;
2101 return boolean_true_node
;
2104 /* Check an implicit conversion constraint. */
2107 satisfy_implicit_conversion_constraint (tree t
, tree args
,
2108 tsubst_flags_t complain
, tree in_decl
)
2110 /* Don't tsubst as if we're processing a template. If we try
2111 to we can end up generating template-like expressions
2112 (e.g., modop-exprs) that aren't properly typed. */
2114 tsubst_expr (ICONV_CONSTR_EXPR (t
), args
, complain
, in_decl
, false);
2115 if (expr
== error_mark_node
)
2116 return boolean_false_node
;
2118 /* Get the transformed target type. */
2119 tree type
= tsubst (ICONV_CONSTR_TYPE (t
), args
, complain
, in_decl
);
2120 if (type
== error_mark_node
)
2121 return boolean_false_node
;
2123 /* Attempt the conversion as a direct initialization
2124 of the form TYPE <unspecified> = EXPR. */
2126 perform_direct_initialization_if_possible (type
, expr
, false, complain
);
2127 if (conv
== NULL_TREE
|| conv
== error_mark_node
)
2128 return boolean_false_node
;
2130 return boolean_true_node
;
2133 /* Check an argument deduction constraint. */
2136 satisfy_argument_deduction_constraint (tree t
, tree args
,
2137 tsubst_flags_t complain
, tree in_decl
)
2139 /* Substitute through the expression. */
2140 tree expr
= DEDUCT_CONSTR_EXPR (t
);
2141 tree init
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
2142 if (expr
== error_mark_node
)
2143 return boolean_false_node
;
2145 /* Perform auto or decltype(auto) deduction to get the result. */
2146 tree pattern
= DEDUCT_CONSTR_PATTERN (t
);
2147 tree placeholder
= DEDUCT_CONSTR_PLACEHOLDER (t
);
2148 tree constr
= PLACEHOLDER_TYPE_CONSTRAINTS (placeholder
);
2149 tree type_canonical
= TYPE_CANONICAL (placeholder
);
2150 PLACEHOLDER_TYPE_CONSTRAINTS (placeholder
)
2151 = tsubst_constraint (constr
, args
, complain
|tf_partial
, in_decl
);
2152 TYPE_CANONICAL (placeholder
) = NULL_TREE
;
2153 tree type
= do_auto_deduction (pattern
, init
, placeholder
,
2154 complain
, adc_requirement
);
2155 PLACEHOLDER_TYPE_CONSTRAINTS (placeholder
) = constr
;
2156 TYPE_CANONICAL (placeholder
) = type_canonical
;
2157 if (type
== error_mark_node
)
2158 return boolean_false_node
;
2160 return boolean_true_node
;
2163 /* Check an exception constraint. An exception constraint for an
2164 expression e is satisfied when noexcept(e) is true. */
2167 satisfy_exception_constraint (tree t
, tree args
,
2168 tsubst_flags_t complain
, tree in_decl
)
2170 tree expr
= EXCEPT_CONSTR_EXPR (t
);
2171 tree check
= tsubst_expr (expr
, args
, complain
, in_decl
, false);
2172 if (check
== error_mark_node
)
2173 return boolean_false_node
;
2175 if (expr_noexcept_p (check
, complain
))
2176 return boolean_true_node
;
2178 return boolean_false_node
;
2181 /* Check a parameterized constraint. */
2184 satisfy_parameterized_constraint (tree t
, tree args
,
2185 tsubst_flags_t complain
, tree in_decl
)
2187 local_specialization_stack stack
;
2188 tree parms
= PARM_CONSTR_PARMS (t
);
2189 tree vars
= tsubst_constraint_variables (parms
, args
, complain
, in_decl
);
2190 if (vars
== error_mark_node
)
2191 return boolean_false_node
;
2192 tree constr
= PARM_CONSTR_OPERAND (t
);
2193 return satisfy_constraint_1 (constr
, args
, complain
, in_decl
);
2196 /* Check that the conjunction of constraints is satisfied. Note
2197 that if left operand is not satisfied, the right operand
2200 FIXME: Check that this wouldn't result in a user-defined
2201 operator. Note that this error is partially diagnosed in
2202 satisfy_predicate_constraint. It would be nice to diagnose
2203 the overload, but I don't think it's strictly necessary. */
2206 satisfy_conjunction (tree t
, tree args
, tsubst_flags_t complain
, tree in_decl
)
2208 tree t0
= satisfy_constraint_1 (TREE_OPERAND (t
, 0), args
, complain
, in_decl
);
2209 if (t0
== boolean_false_node
)
2210 return boolean_false_node
;
2211 return satisfy_constraint_1 (TREE_OPERAND (t
, 1), args
, complain
, in_decl
);
2214 /* Check that the disjunction of constraints is satisfied. Note
2215 that if the left operand is satisfied, the right operand is not
2219 satisfy_disjunction (tree t
, tree args
, tsubst_flags_t complain
, tree in_decl
)
2221 tree t0
= satisfy_constraint_1 (TREE_OPERAND (t
, 0), args
, complain
, in_decl
);
2222 if (t0
== boolean_true_node
)
2223 return boolean_true_node
;
2224 return satisfy_constraint_1 (TREE_OPERAND (t
, 1), args
, complain
, in_decl
);
2227 /* Dispatch to an appropriate satisfaction routine depending on the
2231 satisfy_constraint_1 (tree t
, tree args
, tsubst_flags_t complain
, tree in_decl
)
2233 gcc_assert (!processing_template_decl
);
2236 return boolean_false_node
;
2238 if (t
== error_mark_node
)
2239 return boolean_false_node
;
2241 switch (TREE_CODE (t
))
2244 return satisfy_predicate_constraint (t
, args
, complain
, in_decl
);
2247 return satisfy_check_constraint (t
, args
, complain
, in_decl
);
2250 return satisfy_expression_constraint (t
, args
, complain
, in_decl
);
2253 return satisfy_type_constraint (t
, args
, complain
, in_decl
);
2256 return satisfy_implicit_conversion_constraint (t
, args
, complain
, in_decl
);
2259 return satisfy_argument_deduction_constraint (t
, args
, complain
, in_decl
);
2262 return satisfy_exception_constraint (t
, args
, complain
, in_decl
);
2265 return satisfy_parameterized_constraint (t
, args
, complain
, in_decl
);
2268 return satisfy_conjunction (t
, args
, complain
, in_decl
);
2271 return satisfy_disjunction (t
, args
, complain
, in_decl
);
2273 case EXPR_PACK_EXPANSION
:
2274 return satisfy_pack_expansion (t
, args
, complain
, in_decl
);
2279 return boolean_false_node
;
2282 /* Check that the constraint is satisfied, according to the rules
2283 for that constraint. Note that each satisfy_* function returns
2284 true or false, depending on whether it is satisfied or not. */
2287 satisfy_constraint (tree t
, tree args
)
2289 auto_timevar
time (TV_CONSTRAINT_SAT
);
2291 /* Turn off template processing. Constraint satisfaction only applies
2292 to non-dependent terms, so we want to ensure full checking here. */
2293 processing_template_decl_sentinel
proc (true);
2295 /* Avoid early exit in tsubst and tsubst_copy from null args; since earlier
2296 substitution was done with processing_template_decl forced on, there will
2297 be expressions that still need semantic processing, possibly buried in
2298 decltype or a template argument. */
2299 if (args
== NULL_TREE
)
2300 args
= make_tree_vec (1);
2302 return satisfy_constraint_1 (t
, args
, tf_none
, NULL_TREE
);
2305 /* Check the associated constraints in CI against the given
2306 ARGS, returning true when the constraints are satisfied
2307 and false otherwise. */
2310 satisfy_associated_constraints (tree ci
, tree args
)
2312 /* If there are no constraints then this is trivially satisfied. */
2314 return boolean_true_node
;
2316 /* If any arguments depend on template parameters, we can't
2317 check constraints. */
2318 if (args
&& uses_template_parms (args
))
2319 return boolean_true_node
;
2321 /* Check if we've seen a previous result. */
2322 if (tree prev
= lookup_constraint_satisfaction (ci
, args
))
2325 /* Actually test for satisfaction. */
2326 tree result
= satisfy_constraint (CI_ASSOCIATED_CONSTRAINTS (ci
), args
);
2327 return memoize_constraint_satisfaction (ci
, args
, result
);
2332 /* Evaluate the given constraint, returning boolean_true_node
2333 if the constraint is satisfied and boolean_false_node
2337 evaluate_constraints (tree constr
, tree args
)
2339 gcc_assert (constraint_p (constr
));
2340 return satisfy_constraint (constr
, args
);
2343 /* Evaluate the function concept FN by substituting its own args
2344 into its definition and evaluating that as the result. Returns
2345 boolean_true_node if the constraints are satisfied and
2346 boolean_false_node otherwise. */
2349 evaluate_function_concept (tree fn
, tree args
)
2351 tree constr
= build_nt (CHECK_CONSTR
, fn
, args
);
2352 return satisfy_constraint (constr
, args
);
2355 /* Evaluate the variable concept VAR by substituting its own args into
2356 its initializer and checking the resulting constraint. Returns
2357 boolean_true_node if the constraints are satisfied and
2358 boolean_false_node otherwise. */
2361 evaluate_variable_concept (tree var
, tree args
)
2363 tree constr
= build_nt (CHECK_CONSTR
, var
, args
);
2364 return satisfy_constraint (constr
, args
);
2367 /* Evaluate the given expression as if it were a predicate
2368 constraint. Returns boolean_true_node if the constraint
2369 is satisfied and boolean_false_node otherwise. */
2372 evaluate_constraint_expression (tree expr
, tree args
)
2374 tree constr
= normalize_expression (expr
);
2375 return satisfy_constraint (constr
, args
);
2378 /* Returns true if the DECL's constraints are satisfied.
2379 This is used in cases where a declaration is formed but
2380 before it is used (e.g., overload resolution). */
2383 constraints_satisfied_p (tree decl
)
2385 /* Get the constraints to check for satisfaction. This depends
2386 on whether we're looking at a template specialization or not. */
2388 tree args
= NULL_TREE
;
2389 if (tree ti
= DECL_TEMPLATE_INFO (decl
))
2391 tree tmpl
= TI_TEMPLATE (ti
);
2392 ci
= get_constraints (tmpl
);
2393 int depth
= TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl
));
2394 args
= get_innermost_template_args (TI_ARGS (ti
), depth
);
2398 ci
= get_constraints (decl
);
2401 tree eval
= satisfy_associated_constraints (ci
, args
);
2402 return eval
== boolean_true_node
;
2405 /* Returns true if the constraints are satisfied by ARGS.
2406 Here, T can be either a constraint or a constrained
2410 constraints_satisfied_p (tree t
, tree args
)
2413 if (constraint_p (t
))
2414 eval
= evaluate_constraints (t
, args
);
2416 eval
= satisfy_associated_constraints (get_constraints (t
), args
);
2417 return eval
== boolean_true_node
;
2423 /* Normalize EXPR and determine if the resulting constraint is
2424 satisfied by ARGS. Returns true if and only if the constraint
2425 is satisfied. This is used extensively by diagnostics to
2426 determine causes for failure. */
2429 constraint_expression_satisfied_p (tree expr
, tree args
)
2431 return evaluate_constraint_expression (expr
, args
) == boolean_true_node
;
2436 /*---------------------------------------------------------------------------
2437 Semantic analysis of requires-expressions
2438 ---------------------------------------------------------------------------*/
2440 /* Finish a requires expression for the given PARMS (possibly
2441 null) and the non-empty sequence of requirements. */
2443 finish_requires_expr (tree parms
, tree reqs
)
2445 /* Modify the declared parameters by removing their context
2446 so they don't refer to the enclosing scope and explicitly
2447 indicating that they are constraint variables. */
2448 for (tree parm
= parms
; parm
; parm
= DECL_CHAIN (parm
))
2450 DECL_CONTEXT (parm
) = NULL_TREE
;
2451 CONSTRAINT_VAR_P (parm
) = true;
2454 /* Build the node. */
2455 tree r
= build_min (REQUIRES_EXPR
, boolean_type_node
, parms
, reqs
);
2456 TREE_SIDE_EFFECTS (r
) = false;
2457 TREE_CONSTANT (r
) = true;
2461 /* Construct a requirement for the validity of EXPR. */
2463 finish_simple_requirement (tree expr
)
2465 return build_nt (SIMPLE_REQ
, expr
);
2468 /* Construct a requirement for the validity of TYPE. */
2470 finish_type_requirement (tree type
)
2472 return build_nt (TYPE_REQ
, type
);
2475 /* Construct a requirement for the validity of EXPR, along with
2476 its properties. if TYPE is non-null, then it specifies either
2477 an implicit conversion or argument deduction constraint,
2478 depending on whether any placeholders occur in the type name.
2479 NOEXCEPT_P is true iff the noexcept keyword was specified. */
2481 finish_compound_requirement (tree expr
, tree type
, bool noexcept_p
)
2483 tree req
= build_nt (COMPOUND_REQ
, expr
, type
);
2484 COMPOUND_REQ_NOEXCEPT_P (req
) = noexcept_p
;
2488 /* Finish a nested requirement. */
2490 finish_nested_requirement (tree expr
)
2492 return build_nt (NESTED_REQ
, expr
);
2495 // Check that FN satisfies the structural requirements of a
2496 // function concept definition.
2498 check_function_concept (tree fn
)
2500 // Check that the function is comprised of only a single
2501 // return statement.
2502 tree body
= DECL_SAVED_TREE (fn
);
2503 if (TREE_CODE (body
) == BIND_EXPR
)
2504 body
= BIND_EXPR_BODY (body
);
2506 // Sometimes a function call results in the creation of clean up
2507 // points. Allow these to be preserved in the body of the
2508 // constraint, as we might actually need them for some constexpr
2510 if (TREE_CODE (body
) == CLEANUP_POINT_EXPR
)
2511 body
= TREE_OPERAND (body
, 0);
2513 /* Check that the definition is written correctly. */
2514 if (TREE_CODE (body
) != RETURN_EXPR
)
2516 location_t loc
= DECL_SOURCE_LOCATION (fn
);
2517 if (TREE_CODE (body
) == STATEMENT_LIST
&& !STATEMENT_LIST_HEAD (body
))
2518 error_at (loc
, "definition of concept %qD is empty", fn
);
2520 error_at (loc
, "definition of concept %qD has multiple statements", fn
);
2527 // Check that a constrained friend declaration function declaration,
2528 // FN, is admissible. This is the case only when the declaration depends
2529 // on template parameters and does not declare a specialization.
2531 check_constrained_friend (tree fn
, tree reqs
)
2533 if (fn
== error_mark_node
)
2535 gcc_assert (TREE_CODE (fn
) == FUNCTION_DECL
);
2537 // If there are not constraints, this cannot be an error.
2541 // Constrained friend functions that don't depend on template
2542 // arguments are effectively meaningless.
2543 if (!uses_template_parms (TREE_TYPE (fn
)))
2545 error_at (location_of (fn
),
2546 "constrained friend does not depend on template parameters");
2551 /*---------------------------------------------------------------------------
2552 Equivalence of constraints
2553 ---------------------------------------------------------------------------*/
2555 /* Returns true when A and B are equivalent constraints. */
2557 equivalent_constraints (tree a
, tree b
)
2559 gcc_assert (!a
|| TREE_CODE (a
) == CONSTRAINT_INFO
);
2560 gcc_assert (!b
|| TREE_CODE (b
) == CONSTRAINT_INFO
);
2561 return cp_tree_equal (a
, b
);
2564 /* Returns true if the template declarations A and B have equivalent
2565 constraints. This is the case when A's constraints subsume B's and
2566 when B's also constrain A's. */
2568 equivalently_constrained (tree d1
, tree d2
)
2570 gcc_assert (TREE_CODE (d1
) == TREE_CODE (d2
));
2571 return equivalent_constraints (get_constraints (d1
), get_constraints (d2
));
2574 /*---------------------------------------------------------------------------
2575 Partial ordering of constraints
2576 ---------------------------------------------------------------------------*/
2578 /* Returns true when the the constraints in A subsume those in B. */
2581 subsumes_constraints (tree a
, tree b
)
2583 gcc_assert (!a
|| TREE_CODE (a
) == CONSTRAINT_INFO
);
2584 gcc_assert (!b
|| TREE_CODE (b
) == CONSTRAINT_INFO
);
2585 return subsumes (a
, b
);
2588 /* Returns true when the the constraints in A subsume those in B, but
2589 the constraints in B do not subsume the constraints in A. */
2592 strictly_subsumes (tree a
, tree b
)
2594 return subsumes (a
, b
) && !subsumes (b
, a
);
2597 /* Determines which of the declarations, A or B, is more constrained.
2598 That is, which declaration's constraints subsume but are not subsumed
2601 Returns 1 if A is more constrained than B, -1 if B is more constrained
2602 than A, and 0 otherwise. */
2605 more_constrained (tree d1
, tree d2
)
2607 tree c1
= get_constraints (d1
);
2608 tree c2
= get_constraints (d2
);
2610 if (subsumes_constraints (c1
, c2
))
2612 if (subsumes_constraints (c2
, c1
))
2617 /* Returns true if D1 is at least as constrained as D2. That is, the
2618 associated constraints of D1 subsume those of D2, or both declarations
2619 are unconstrained. */
2622 at_least_as_constrained (tree d1
, tree d2
)
2624 tree c1
= get_constraints (d1
);
2625 tree c2
= get_constraints (d2
);
2626 return subsumes_constraints (c1
, c2
);
2630 /*---------------------------------------------------------------------------
2631 Constraint diagnostics
2633 FIXME: Normalize expressions into constraints before evaluating them.
2634 This should be the general pattern for all such diagnostics.
2635 ---------------------------------------------------------------------------*/
2637 /* The number of detailed constraint failures. */
2639 int constraint_errors
= 0;
2641 /* Do not generate errors after diagnosing this number of constraint
2644 FIXME: This is a really arbitrary number. Provide better control of
2645 constraint diagnostics with a command line option. */
2647 int constraint_thresh
= 20;
2650 /* Returns true if we should elide the diagnostic for a constraint failure.
2651 This is the case when the number of errors has exceeded the pre-configured
2655 elide_constraint_failure_p ()
2657 bool ret
= constraint_thresh
<= constraint_errors
;
2658 ++constraint_errors
;
2662 /* Returns the number of undiagnosed errors. */
2665 undiagnosed_constraint_failures ()
2667 return constraint_errors
- constraint_thresh
;
2670 /* The diagnosis of constraints performs a combination of normalization
2671 and satisfaction testing. We recursively walk through the conjunction or
2672 disjunction of associated constraints, testing each sub-constraint in
2677 void diagnose_constraint (location_t
, tree
, tree
, tree
);
2679 /* Emit a specific diagnostics for a failed trait. */
2682 diagnose_trait_expression (location_t loc
, tree
, tree cur
, tree args
)
2684 if (constraint_expression_satisfied_p (cur
, args
))
2686 if (elide_constraint_failure_p())
2689 tree expr
= PRED_CONSTR_EXPR (cur
);
2690 ++processing_template_decl
;
2691 expr
= tsubst_expr (expr
, args
, tf_none
, NULL_TREE
, false);
2692 --processing_template_decl
;
2694 tree t1
= TRAIT_EXPR_TYPE1 (expr
);
2695 tree t2
= TRAIT_EXPR_TYPE2 (expr
);
2696 switch (TRAIT_EXPR_KIND (expr
))
2698 case CPTK_HAS_NOTHROW_ASSIGN
:
2699 inform (loc
, " %qT is not nothrow copy assignable", t1
);
2701 case CPTK_HAS_NOTHROW_CONSTRUCTOR
:
2702 inform (loc
, " %qT is not nothrow default constructible", t1
);
2704 case CPTK_HAS_NOTHROW_COPY
:
2705 inform (loc
, " %qT is not nothrow copy constructible", t1
);
2707 case CPTK_HAS_TRIVIAL_ASSIGN
:
2708 inform (loc
, " %qT is not trivially copy assignable", t1
);
2710 case CPTK_HAS_TRIVIAL_CONSTRUCTOR
:
2711 inform (loc
, " %qT is not trivially default constructible", t1
);
2713 case CPTK_HAS_TRIVIAL_COPY
:
2714 inform (loc
, " %qT is not trivially copy constructible", t1
);
2716 case CPTK_HAS_TRIVIAL_DESTRUCTOR
:
2717 inform (loc
, " %qT is not trivially destructible", t1
);
2719 case CPTK_HAS_VIRTUAL_DESTRUCTOR
:
2720 inform (loc
, " %qT does not have a virtual destructor", t1
);
2722 case CPTK_IS_ABSTRACT
:
2723 inform (loc
, " %qT is not an abstract class", t1
);
2725 case CPTK_IS_BASE_OF
:
2726 inform (loc
, " %qT is not a base of %qT", t1
, t2
);
2729 inform (loc
, " %qT is not a class", t1
);
2732 inform (loc
, " %qT is not an empty class", t1
);
2735 inform (loc
, " %qT is not an enum", t1
);
2738 inform (loc
, " %qT is not a final class", t1
);
2740 case CPTK_IS_LITERAL_TYPE
:
2741 inform (loc
, " %qT is not a literal type", t1
);
2744 inform (loc
, " %qT is not a POD type", t1
);
2746 case CPTK_IS_POLYMORPHIC
:
2747 inform (loc
, " %qT is not a polymorphic type", t1
);
2749 case CPTK_IS_SAME_AS
:
2750 inform (loc
, " %qT is not the same as %qT", t1
, t2
);
2752 case CPTK_IS_STD_LAYOUT
:
2753 inform (loc
, " %qT is not an standard layout type", t1
);
2755 case CPTK_IS_TRIVIAL
:
2756 inform (loc
, " %qT is not a trivial type", t1
);
2759 inform (loc
, " %qT is not a union", t1
);
2766 /* Diagnose the expression of a predicate constraint. */
2769 diagnose_other_expression (location_t loc
, tree
, tree cur
, tree args
)
2771 if (constraint_expression_satisfied_p (cur
, args
))
2773 if (elide_constraint_failure_p())
2775 inform (loc
, "%qE evaluated to false", cur
);
2778 /* Do our best to infer meaning from predicates. */
2781 diagnose_predicate_constraint (location_t loc
, tree orig
, tree cur
, tree args
)
2783 if (TREE_CODE (PRED_CONSTR_EXPR (cur
)) == TRAIT_EXPR
)
2784 diagnose_trait_expression (loc
, orig
, cur
, args
);
2786 diagnose_other_expression (loc
, orig
, cur
, args
);
2789 /* Diagnose a failed pack expansion, possibly containing constraints. */
2792 diagnose_pack_expansion (location_t loc
, tree
, tree cur
, tree args
)
2794 if (constraint_expression_satisfied_p (cur
, args
))
2796 if (elide_constraint_failure_p())
2799 /* Make sure that we don't have naked packs that we don't expect. */
2800 if (!same_type_p (TREE_TYPE (cur
), boolean_type_node
))
2802 inform (loc
, "invalid pack expansion in constraint %qE", cur
);
2806 inform (loc
, "in the expansion of %qE", cur
);
2808 /* Get the vector of expanded arguments. Note that n must not
2809 be 0 since this constraint is not satisfied. */
2810 ++processing_template_decl
;
2811 tree exprs
= tsubst_pack_expansion (cur
, args
, tf_none
, NULL_TREE
);
2812 --processing_template_decl
;
2813 if (exprs
== error_mark_node
)
2815 /* TODO: This error message could be better. */
2816 inform (loc
, " substitution failure occurred during expansion");
2820 /* Check each expanded constraint separately. */
2821 int n
= TREE_VEC_LENGTH (exprs
);
2822 for (int i
= 0; i
< n
; ++i
)
2824 tree expr
= TREE_VEC_ELT (exprs
, i
);
2825 if (!constraint_expression_satisfied_p (expr
, args
))
2826 inform (loc
, " %qE was not satisfied", expr
);
2830 /* Diagnose a potentially unsatisfied concept check constraint DECL<CARGS>.
2831 Parameters are as for diagnose_constraint. */
2834 diagnose_check_constraint (location_t loc
, tree orig
, tree cur
, tree args
)
2836 if (constraints_satisfied_p (cur
, args
))
2839 tree decl
= CHECK_CONSTR_CONCEPT (cur
);
2840 tree cargs
= CHECK_CONSTR_ARGS (cur
);
2841 tree tmpl
= DECL_TI_TEMPLATE (decl
);
2842 tree check
= build_nt (CHECK_CONSTR
, decl
, cargs
);
2844 /* Instantiate the concept check arguments. */
2845 tree targs
= tsubst (cargs
, args
, tf_none
, NULL_TREE
);
2846 if (targs
== error_mark_node
)
2848 if (elide_constraint_failure_p ())
2850 inform (loc
, "invalid use of the concept %qE", check
);
2851 tsubst (cargs
, args
, tf_warning_or_error
, NULL_TREE
);
2855 tree sub
= build_tree_list (tmpl
, targs
);
2856 /* Update to the expanded definitions. */
2857 cur
= expand_concept (decl
, targs
);
2858 if (cur
== error_mark_node
)
2860 if (elide_constraint_failure_p ())
2862 inform (loc
, "in the expansion of concept %qE %S", check
, sub
);
2863 cur
= get_concept_definition (decl
);
2864 tsubst_expr (cur
, targs
, tf_warning_or_error
, NULL_TREE
, false);
2868 orig
= get_concept_definition (CHECK_CONSTR_CONCEPT (orig
));
2869 orig
= normalize_expression (orig
);
2871 location_t dloc
= DECL_SOURCE_LOCATION (decl
);
2872 inform (dloc
, "within %qS", sub
);
2873 diagnose_constraint (dloc
, orig
, cur
, targs
);
2876 /* Diagnose a potentially unsatisfied conjunction or disjunction. Parameters
2877 are as for diagnose_constraint. */
2880 diagnose_logical_constraint (location_t loc
, tree orig
, tree cur
, tree args
)
2882 tree t0
= TREE_OPERAND (cur
, 0);
2883 tree t1
= TREE_OPERAND (cur
, 1);
2884 if (!constraints_satisfied_p (t0
, args
))
2885 diagnose_constraint (loc
, TREE_OPERAND (orig
, 0), t0
, args
);
2886 else if (TREE_CODE (orig
) == TRUTH_ORIF_EXPR
)
2888 if (!constraints_satisfied_p (t1
, args
))
2889 diagnose_constraint (loc
, TREE_OPERAND (orig
, 1), t1
, args
);
2892 /* Diagnose a potential expression constraint failure. */
2895 diagnose_expression_constraint (location_t loc
, tree orig
, tree cur
, tree args
)
2897 if (constraints_satisfied_p (cur
, args
))
2899 if (elide_constraint_failure_p())
2902 tree expr
= EXPR_CONSTR_EXPR (orig
);
2903 inform (loc
, "the required expression %qE would be ill-formed", expr
);
2905 // TODO: We should have a flag that controls this substitution.
2906 // I'm finding it very useful for resolving concept check errors.
2908 // inform (input_location, "==== BEGIN DUMP ====");
2909 // tsubst_expr (EXPR_CONSTR_EXPR (orig), args, tf_warning_or_error, NULL_TREE, false);
2910 // inform (input_location, "==== END DUMP ====");
2913 /* Diagnose a potentially failed type constraint. */
2916 diagnose_type_constraint (location_t loc
, tree orig
, tree cur
, tree args
)
2918 if (constraints_satisfied_p (cur
, args
))
2920 if (elide_constraint_failure_p())
2923 tree type
= TYPE_CONSTR_TYPE (orig
);
2924 inform (loc
, "the required type %qT would be ill-formed", type
);
2927 /* Diagnose a potentially unsatisfied conversion constraint. */
2930 diagnose_implicit_conversion_constraint (location_t loc
, tree orig
, tree cur
,
2933 if (constraints_satisfied_p (cur
, args
))
2936 /* The expression and type will previously have been substituted into,
2937 and therefore may already be an error. Also, we will have already
2938 diagnosed substitution failures into an expression since this must be
2939 part of a compound requirement. */
2940 tree expr
= ICONV_CONSTR_EXPR (cur
);
2941 if (error_operand_p (expr
))
2944 /* Don't elide a previously diagnosed failure. */
2945 if (elide_constraint_failure_p())
2948 tree type
= ICONV_CONSTR_TYPE (cur
);
2949 if (error_operand_p (type
))
2951 inform (loc
, "substitution into type %qT failed",
2952 ICONV_CONSTR_TYPE (orig
));
2956 inform(loc
, "%qE is not implicitly convertible to %qT", expr
, type
);
2959 /* Diagnose an argument deduction constraint. */
2962 diagnose_argument_deduction_constraint (location_t loc
, tree orig
, tree cur
,
2965 if (constraints_satisfied_p (cur
, args
))
2968 /* The expression and type will previously have been substituted into,
2969 and therefore may already be an error. Also, we will have already
2970 diagnosed substution failures into an expression since this must be
2971 part of a compound requirement. */
2972 tree expr
= DEDUCT_CONSTR_EXPR (cur
);
2973 if (error_operand_p (expr
))
2976 /* Don't elide a previously diagnosed failure. */
2977 if (elide_constraint_failure_p ())
2980 tree pattern
= DEDUCT_CONSTR_PATTERN (cur
);
2981 if (error_operand_p (pattern
))
2983 inform (loc
, "substitution into type %qT failed",
2984 DEDUCT_CONSTR_PATTERN (orig
));
2988 inform (loc
, "unable to deduce placeholder type %qT from %qE",
2992 /* Diagnose an exception constraint. */
2995 diagnose_exception_constraint (location_t loc
, tree orig
, tree cur
, tree args
)
2997 if (constraints_satisfied_p (cur
, args
))
2999 if (elide_constraint_failure_p ())
3002 /* Rebuild a noexcept expression. */
3003 tree expr
= EXCEPT_CONSTR_EXPR (cur
);
3004 if (error_operand_p (expr
))
3007 inform (loc
, "%qE evaluated to false", EXCEPT_CONSTR_EXPR (orig
));
3010 /* Diagnose a potentially unsatisfied parameterized constraint. */
3013 diagnose_parameterized_constraint (location_t loc
, tree orig
, tree cur
,
3016 if (constraints_satisfied_p (cur
, args
))
3019 local_specialization_stack stack
;
3020 tree parms
= PARM_CONSTR_PARMS (cur
);
3021 tree vars
= tsubst_constraint_variables (parms
, args
, tf_warning_or_error
,
3023 if (vars
== error_mark_node
)
3025 if (elide_constraint_failure_p ())
3028 /* TODO: Check which variable failed and use orig to diagnose
3029 that substitution error. */
3030 inform (loc
, "failed to instantiate constraint variables");
3034 /* TODO: It would be better write these in a list. */
3037 inform (loc
, " with %q#D", vars
);
3038 vars
= TREE_CHAIN (vars
);
3040 orig
= PARM_CONSTR_OPERAND (orig
);
3041 cur
= PARM_CONSTR_OPERAND (cur
);
3042 return diagnose_constraint (loc
, orig
, cur
, args
);
3045 /* Diagnose the constraint CUR for the given ARGS. This is only ever invoked
3046 on the associated constraints, so we can only have conjunctions of
3047 predicate constraints. The ORIGinal (dependent) constructs follow
3048 the current constraints to enable better diagnostics. Note that ORIG
3049 and CUR must be the same kinds of node, except when CUR is an error. */
3052 diagnose_constraint (location_t loc
, tree orig
, tree cur
, tree args
)
3054 switch (TREE_CODE (cur
))
3057 diagnose_expression_constraint (loc
, orig
, cur
, args
);
3061 diagnose_type_constraint (loc
, orig
, cur
, args
);
3065 diagnose_implicit_conversion_constraint (loc
, orig
, cur
, args
);
3069 diagnose_argument_deduction_constraint (loc
, orig
, cur
, args
);
3073 diagnose_exception_constraint (loc
, orig
, cur
, args
);
3078 diagnose_logical_constraint (loc
, orig
, cur
, args
);
3082 diagnose_predicate_constraint (loc
, orig
, cur
, args
);
3086 diagnose_parameterized_constraint (loc
, orig
, cur
, args
);
3090 diagnose_check_constraint (loc
, orig
, cur
, args
);
3093 case EXPR_PACK_EXPANSION
:
3094 diagnose_pack_expansion (loc
, orig
, cur
, args
);
3098 /* TODO: Can we improve the diagnostic with the original? */
3099 inform (input_location
, "ill-formed constraint");
3108 /* Diagnose the reason(s) why ARGS do not satisfy the constraints
3109 of declaration DECL. */
3112 diagnose_declaration_constraints (location_t loc
, tree decl
, tree args
)
3114 inform (loc
, " constraints not satisfied");
3116 /* Constraints are attached to the template. */
3117 if (tree ti
= DECL_TEMPLATE_INFO (decl
))
3119 decl
= TI_TEMPLATE (ti
);
3121 args
= TI_ARGS (ti
);
3124 /* Recursively diagnose the associated constraints. */
3125 tree ci
= get_constraints (decl
);
3126 tree t
= CI_ASSOCIATED_CONSTRAINTS (ci
);
3127 diagnose_constraint (loc
, t
, t
, args
);
3132 /* Emit diagnostics detailing the failure ARGS to satisfy the
3133 constraints of T. Here, T can be either a constraint
3134 or a declaration. */
3137 diagnose_constraints (location_t loc
, tree t
, tree args
)
3139 constraint_errors
= 0;
3141 if (constraint_p (t
))
3142 diagnose_constraint (loc
, t
, t
, args
);
3143 else if (DECL_P (t
))
3144 diagnose_declaration_constraints (loc
, t
, args
);
3148 /* Note the number of elided failures. */
3149 int n
= undiagnosed_constraint_failures ();
3151 inform (loc
, "... and %d more constraint errors not shown", n
);