xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/cp/constraint.cc (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
1 /* Processing rules for constraints.
2    Copyright (C) 2013-2020 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 static tree satisfaction_value (tree t);
50 
51 /* When we're parsing or substuting a constraint expression, we have slightly
52    different expression semantics.  In particular, we don't want to reduce a
53    concept-id to a satisfaction value.  */
54 
55 processing_constraint_expression_sentinel::
processing_constraint_expression_sentinel()56 processing_constraint_expression_sentinel ()
57 {
58   ++scope_chain->x_processing_constraint;
59 }
60 
61 processing_constraint_expression_sentinel::
~processing_constraint_expression_sentinel()62 ~processing_constraint_expression_sentinel ()
63 {
64   --scope_chain->x_processing_constraint;
65 }
66 
67 bool
processing_constraint_expression_p()68 processing_constraint_expression_p ()
69 {
70   return scope_chain->x_processing_constraint != 0;
71 }
72 
73 /*---------------------------------------------------------------------------
74 		       Constraint expressions
75 ---------------------------------------------------------------------------*/
76 
77 /* Information provided to substitution.  */
78 
79 struct subst_info
80 {
subst_infosubst_info81   subst_info (tsubst_flags_t cmp, tree in)
82     : complain (cmp), in_decl (in)
83   { }
84 
85   /* True if we should not diagnose errors.  */
quietsubst_info86   bool quiet() const
87   {
88     return complain == tf_none;
89   }
90 
91   /* True if we should diagnose errors.  */
noisysubst_info92   bool noisy() const
93   {
94     return !quiet ();
95   }
96 
97   tsubst_flags_t complain;
98   tree in_decl;
99 };
100 
101 static tree satisfy_constraint (tree, tree, subst_info);
102 
103 /* True if T is known to be some type other than bool. Note that this
104    is false for dependent types and errors.  */
105 
106 static inline bool
known_non_bool_p(tree t)107 known_non_bool_p (tree t)
108 {
109   return (t && !WILDCARD_TYPE_P (t) && TREE_CODE (t) != BOOLEAN_TYPE);
110 }
111 
112 static bool
check_constraint_atom(cp_expr expr)113 check_constraint_atom (cp_expr expr)
114 {
115   if (known_non_bool_p (TREE_TYPE (expr)))
116     {
117       error_at (expr.get_location (),
118 		"constraint expression does not have type %<bool%>");
119       return false;
120     }
121 
122   /* Check that we're using function concepts correctly.  */
123   if (concept_check_p (expr))
124     {
125       tree id = unpack_concept_check (expr);
126       tree tmpl = TREE_OPERAND (id, 0);
127       if (OVL_P (tmpl) && TREE_CODE (expr) == TEMPLATE_ID_EXPR)
128         {
129 	  error_at (EXPR_LOC_OR_LOC (expr, input_location),
130 		    "function concept must be called");
131 	  return false;
132 	}
133     }
134 
135   return true;
136 }
137 
138 static bool
check_constraint_operands(location_t,cp_expr lhs,cp_expr rhs)139 check_constraint_operands (location_t, cp_expr lhs, cp_expr rhs)
140 {
141   return check_constraint_atom (lhs) && check_constraint_atom (rhs);
142 }
143 
144 /* Validate the semantic properties of the constraint expression.  */
145 
146 static cp_expr
finish_constraint_binary_op(location_t loc,tree_code code,cp_expr lhs,cp_expr rhs)147 finish_constraint_binary_op (location_t loc,
148 			     tree_code code,
149 			     cp_expr lhs,
150 			     cp_expr rhs)
151 {
152   gcc_assert (processing_constraint_expression_p ());
153   if (lhs == error_mark_node || rhs == error_mark_node)
154     return error_mark_node;
155   if (!check_constraint_operands (loc, lhs, rhs))
156     return error_mark_node;
157   tree overload;
158   cp_expr expr = build_x_binary_op (loc, code,
159 				    lhs, TREE_CODE (lhs),
160 				    rhs, TREE_CODE (rhs),
161 				    &overload, tf_none);
162   /* When either operand is dependent, the overload set may be non-empty.  */
163   if (expr == error_mark_node)
164     return error_mark_node;
165   expr.set_location (loc);
166   expr.set_range (lhs.get_start (), rhs.get_finish ());
167   return expr;
168 }
169 
170 cp_expr
finish_constraint_or_expr(location_t loc,cp_expr lhs,cp_expr rhs)171 finish_constraint_or_expr (location_t loc, cp_expr lhs, cp_expr rhs)
172 {
173   return finish_constraint_binary_op (loc, TRUTH_ORIF_EXPR, lhs, rhs);
174 }
175 
176 cp_expr
finish_constraint_and_expr(location_t loc,cp_expr lhs,cp_expr rhs)177 finish_constraint_and_expr (location_t loc, cp_expr lhs, cp_expr rhs)
178 {
179   return finish_constraint_binary_op (loc, TRUTH_ANDIF_EXPR, lhs, rhs);
180 }
181 
182 cp_expr
finish_constraint_primary_expr(cp_expr expr)183 finish_constraint_primary_expr (cp_expr expr)
184 {
185   if (expr == error_mark_node)
186     return error_mark_node;
187   if (!check_constraint_atom (expr))
188     return cp_expr (error_mark_node, expr.get_location ());
189   return expr;
190 }
191 
192 /* Combine two constraint-expressions with a logical-and.  */
193 
194 tree
combine_constraint_expressions(tree lhs,tree rhs)195 combine_constraint_expressions (tree lhs, tree rhs)
196 {
197   processing_constraint_expression_sentinel pce;
198   if (!lhs)
199     return rhs;
200   if (!rhs)
201     return lhs;
202   return finish_constraint_and_expr (input_location, lhs, rhs);
203 }
204 
205 /* Extract the template-id from a concept check. For standard and variable
206    checks, this is simply T. For function concept checks, this is the
207    called function.  */
208 
209 tree
unpack_concept_check(tree t)210 unpack_concept_check (tree t)
211 {
212   gcc_assert (concept_check_p (t));
213 
214   if (TREE_CODE (t) == CALL_EXPR)
215     t = CALL_EXPR_FN (t);
216 
217   gcc_assert (TREE_CODE (t) == TEMPLATE_ID_EXPR);
218   return t;
219 }
220 
221 /* Extract the TEMPLATE_DECL from a concept check.  */
222 
223 tree
get_concept_check_template(tree t)224 get_concept_check_template (tree t)
225 {
226   tree id = unpack_concept_check (t);
227   tree tmpl = TREE_OPERAND (id, 0);
228   if (OVL_P (tmpl))
229     tmpl = OVL_FIRST (tmpl);
230   return tmpl;
231 }
232 
233 /* Returns true if any of the arguments in the template argument list is
234    a wildcard or wildcard pack.  */
235 
236 bool
contains_wildcard_p(tree args)237 contains_wildcard_p (tree args)
238 {
239   for (int i = 0; i < TREE_VEC_LENGTH (args); ++i)
240     {
241       tree arg = TREE_VEC_ELT (args, i);
242       if (TREE_CODE (arg) == WILDCARD_DECL)
243 	return true;
244     }
245   return false;
246 }
247 
248 /*---------------------------------------------------------------------------
249                     Resolution of qualified concept names
250 ---------------------------------------------------------------------------*/
251 
252 /* This facility is used to resolve constraint checks from requirement
253    expressions. A constraint check is a call to a function template declared
254    with the keyword 'concept'.
255 
256    The result of resolution is a pair (a TREE_LIST) whose value is the
257    matched declaration, and whose purpose contains the coerced template
258    arguments that can be substituted into the call.  */
259 
260 /* Given an overload set OVL, try to find a unique definition that can be
261    instantiated by the template arguments ARGS.
262 
263    This function is not called for arbitrary call expressions. In particular,
264    the call expression must be written with explicit template arguments
265    and no function arguments. For example:
266 
267         f<T, U>()
268 
269    If a single match is found, this returns a TREE_LIST whose VALUE
270    is the constraint function (not the template), and its PURPOSE is
271    the complete set of arguments substituted into the parameter list.  */
272 
273 static tree
resolve_function_concept_overload(tree ovl,tree args)274 resolve_function_concept_overload (tree ovl, tree args)
275 {
276   int nerrs = 0;
277   tree cands = NULL_TREE;
278   for (lkp_iterator iter (ovl); iter; ++iter)
279     {
280       tree tmpl = *iter;
281       if (TREE_CODE (tmpl) != TEMPLATE_DECL)
282         continue;
283 
284       /* Don't try to deduce checks for non-concepts. We often end up trying
285          to resolve constraints in functional casts as part of a
286          postfix-expression. We can save time and headaches by not
287          instantiating those declarations.
288 
289          NOTE: This masks a potential error, caused by instantiating
290          non-deduced contexts using placeholder arguments. */
291       tree fn = DECL_TEMPLATE_RESULT (tmpl);
292       if (DECL_ARGUMENTS (fn))
293         continue;
294       if (!DECL_DECLARED_CONCEPT_P (fn))
295         continue;
296 
297       /* Remember the candidate if we can deduce a substitution.  */
298       ++processing_template_decl;
299       tree parms = TREE_VALUE (DECL_TEMPLATE_PARMS (tmpl));
300       if (tree subst = coerce_template_parms (parms, args, tmpl))
301         {
302           if (subst == error_mark_node)
303             ++nerrs;
304           else
305 	    cands = tree_cons (subst, fn, cands);
306         }
307       --processing_template_decl;
308     }
309 
310   if (!cands)
311     /* We either had no candidates or failed deductions.  */
312     return nerrs ? error_mark_node : NULL_TREE;
313   else if (TREE_CHAIN (cands))
314     /* There are multiple candidates.  */
315     return error_mark_node;
316 
317   return cands;
318 }
319 
320 /* Determine if the call expression CALL is a constraint check, and
321    return the concept declaration and arguments being checked. If CALL
322    does not denote a constraint check, return NULL.  */
323 
324 tree
resolve_function_concept_check(tree call)325 resolve_function_concept_check (tree call)
326 {
327   gcc_assert (TREE_CODE (call) == CALL_EXPR);
328 
329   /* A constraint check must be only a template-id expression.
330      If it's a call to a base-link, its function(s) should be a
331      template-id expression. If this is not a template-id, then
332      it cannot be a concept-check.  */
333   tree target = CALL_EXPR_FN (call);
334   if (BASELINK_P (target))
335     target = BASELINK_FUNCTIONS (target);
336   if (TREE_CODE (target) != TEMPLATE_ID_EXPR)
337     return NULL_TREE;
338 
339   /* Get the overload set and template arguments and try to
340      resolve the target.  */
341   tree ovl = TREE_OPERAND (target, 0);
342 
343   /* This is a function call of a variable concept... ill-formed.  */
344   if (TREE_CODE (ovl) == TEMPLATE_DECL)
345     {
346       error_at (location_of (call),
347 		"function call of variable concept %qE", call);
348       return error_mark_node;
349     }
350 
351   tree args = TREE_OPERAND (target, 1);
352   return resolve_function_concept_overload (ovl, args);
353 }
354 
355 /* Returns a pair containing the checked concept and its associated
356    prototype parameter. The result is a TREE_LIST whose TREE_VALUE
357    is the concept (non-template) and whose TREE_PURPOSE contains
358    the converted template arguments, including the deduced prototype
359    parameter (in position 0). */
360 
361 tree
resolve_concept_check(tree check)362 resolve_concept_check (tree check)
363 {
364   gcc_assert (concept_check_p (check));
365   tree id = unpack_concept_check (check);
366   tree tmpl = TREE_OPERAND (id, 0);
367 
368   /* If this is an overloaded function concept, perform overload
369      resolution (this only happens when deducing prototype parameters
370      and template introductions).  */
371   if (TREE_CODE (tmpl) == OVERLOAD)
372     {
373       if (OVL_CHAIN (tmpl))
374 	return resolve_function_concept_check (check);
375       tmpl = OVL_FIRST (tmpl);
376     }
377 
378   tree args = TREE_OPERAND (id, 1);
379   tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl));
380   ++processing_template_decl;
381   tree result = coerce_template_parms (parms, args, tmpl);
382   --processing_template_decl;
383   if (result == error_mark_node)
384     return error_mark_node;
385   return build_tree_list (result, DECL_TEMPLATE_RESULT (tmpl));
386 }
387 
388 /* Given a call expression or template-id expression to a concept EXPR
389    possibly including a wildcard, deduce the concept being checked and
390    the prototype parameter. Returns true if the constraint and prototype
391    can be deduced and false otherwise.  Note that the CHECK and PROTO
392    arguments are set to NULL_TREE if this returns false.  */
393 
394 bool
deduce_constrained_parameter(tree expr,tree & check,tree & proto)395 deduce_constrained_parameter (tree expr, tree& check, tree& proto)
396 {
397   tree info = resolve_concept_check (expr);
398   if (info && info != error_mark_node)
399     {
400       check = TREE_VALUE (info);
401       tree arg = TREE_VEC_ELT (TREE_PURPOSE (info), 0);
402       if (ARGUMENT_PACK_P (arg))
403 	arg = TREE_VEC_ELT (ARGUMENT_PACK_ARGS (arg), 0);
404       proto = TREE_TYPE (arg);
405       return true;
406     }
407 
408   check = proto = NULL_TREE;
409   return false;
410 }
411 
412 /* Given a call expression or template-id expression to a concept, EXPR,
413    deduce the concept being checked and return the template arguments.
414    Returns NULL_TREE if deduction fails.  */
415 static tree
deduce_concept_introduction(tree check)416 deduce_concept_introduction (tree check)
417 {
418   tree info = resolve_concept_check (check);
419   if (info && info != error_mark_node)
420     return TREE_PURPOSE (info);
421   return NULL_TREE;
422 }
423 
424 /* Build a constrained placeholder type where SPEC is a type-constraint.
425    SPEC can be anything were concept_definition_p is true.
426 
427    If DECLTYPE_P is true, then the placeholder is decltype(auto).
428 
429    Returns a pair whose FIRST is the concept being checked and whose
430    SECOND is the prototype parameter.  */
431 
432 tree_pair
finish_type_constraints(tree spec,tree args,tsubst_flags_t complain)433 finish_type_constraints (tree spec, tree args, tsubst_flags_t complain)
434 {
435   gcc_assert (concept_definition_p (spec));
436 
437   /* Build an initial concept check.  */
438   tree check = build_type_constraint (spec, args, complain);
439   if (check == error_mark_node)
440     return std::make_pair (error_mark_node, NULL_TREE);
441 
442   /* Extract the concept and prototype parameter from the check. */
443   tree con;
444   tree proto;
445   if (!deduce_constrained_parameter (check, con, proto))
446     return std::make_pair (error_mark_node, NULL_TREE);
447 
448   return std::make_pair (con, proto);
449 }
450 
451 /*---------------------------------------------------------------------------
452                        Expansion of concept definitions
453 ---------------------------------------------------------------------------*/
454 
455 /* Returns the expression of a function concept. */
456 
457 static tree
get_returned_expression(tree fn)458 get_returned_expression (tree fn)
459 {
460   /* Extract the body of the function minus the return expression.  */
461   tree body = DECL_SAVED_TREE (fn);
462   if (!body)
463     return error_mark_node;
464   if (TREE_CODE (body) == BIND_EXPR)
465     body = BIND_EXPR_BODY (body);
466   if (TREE_CODE (body) != RETURN_EXPR)
467     return error_mark_node;
468 
469   return TREE_OPERAND (body, 0);
470 }
471 
472 /* Returns the initializer of a variable concept. */
473 
474 static tree
get_variable_initializer(tree var)475 get_variable_initializer (tree var)
476 {
477   tree init = DECL_INITIAL (var);
478   if (!init)
479     return error_mark_node;
480   if (BRACE_ENCLOSED_INITIALIZER_P (init)
481       && CONSTRUCTOR_NELTS (init) == 1)
482     init = CONSTRUCTOR_ELT (init, 0)->value;
483   return init;
484 }
485 
486 /* Returns the definition of a variable or function concept.  */
487 
488 static tree
get_concept_definition(tree decl)489 get_concept_definition (tree decl)
490 {
491   if (TREE_CODE (decl) == OVERLOAD)
492     decl = OVL_FIRST (decl);
493 
494   if (TREE_CODE (decl) == TEMPLATE_DECL)
495     decl = DECL_TEMPLATE_RESULT (decl);
496 
497   if (TREE_CODE (decl) == CONCEPT_DECL)
498     return DECL_INITIAL (decl);
499   if (VAR_P (decl))
500     return get_variable_initializer (decl);
501   if (TREE_CODE (decl) == FUNCTION_DECL)
502     return get_returned_expression (decl);
503   gcc_unreachable ();
504 }
505 
506 /*---------------------------------------------------------------------------
507 		      Normalization of expressions
508 
509 This set of functions will transform an expression into a constraint
510 in a sequence of steps.
511 ---------------------------------------------------------------------------*/
512 
513 void
debug_parameter_mapping(tree map)514 debug_parameter_mapping (tree map)
515 {
516   for (tree p = map; p; p = TREE_CHAIN (p))
517     {
518       tree parm = TREE_VALUE (p);
519       tree arg = TREE_PURPOSE (p);
520       if (TYPE_P (parm))
521 	verbatim ("MAP %qD TO %qT", TEMPLATE_TYPE_DECL (parm), arg);
522       else
523 	verbatim ("MAP %qD TO %qE", TEMPLATE_PARM_DECL (parm), arg);
524       // debug_tree (parm);
525       // debug_tree (arg);
526     }
527 }
528 
529 void
debug_argument_list(tree args)530 debug_argument_list (tree args)
531 {
532   for (int i = 0; i < TREE_VEC_LENGTH (args); ++i)
533     {
534       tree arg = TREE_VEC_ELT (args, i);
535       if (TYPE_P (arg))
536 	verbatim ("ARG %qT", arg);
537       else
538 	verbatim ("ARG %qE", arg);
539     }
540 }
541 
542 /* Associate each parameter in PARMS with its corresponding template
543    argument in ARGS.  */
544 
545 static tree
map_arguments(tree parms,tree args)546 map_arguments (tree parms, tree args)
547 {
548   for (tree p = parms; p; p = TREE_CHAIN (p))
549     if (args)
550       {
551 	int level;
552 	int index;
553 	template_parm_level_and_index (TREE_VALUE (p), &level, &index);
554 	TREE_PURPOSE (p) = TMPL_ARG (args, level, index);
555       }
556     else
557       TREE_PURPOSE (p) = template_parm_to_arg (p);
558 
559   return parms;
560 }
561 
562 /* Build the parameter mapping for EXPR using ARGS.  */
563 
564 static tree
build_parameter_mapping(tree expr,tree args,tree decl)565 build_parameter_mapping (tree expr, tree args, tree decl)
566 {
567   tree ctx_parms = NULL_TREE;
568   if (decl)
569     {
570       gcc_assert (TREE_CODE (decl) == TEMPLATE_DECL);
571       ctx_parms = DECL_TEMPLATE_PARMS (decl);
572     }
573   else if (current_template_parms)
574     {
575       /* TODO: This should probably be the only case, but because the
576 	 point of declaration of concepts is currently set after the
577 	 initializer, the template parameter lists are not available
578 	 when normalizing concept definitions, hence the case above.  */
579       ctx_parms = current_template_parms;
580     }
581 
582   tree parms = find_template_parameters (expr, ctx_parms);
583   tree map = map_arguments (parms, args);
584   return map;
585 }
586 
587 /* True if the parameter mappings of two atomic constraints are equivalent.  */
588 
589 static bool
parameter_mapping_equivalent_p(tree t1,tree t2)590 parameter_mapping_equivalent_p (tree t1, tree t2)
591 {
592   tree map1 = ATOMIC_CONSTR_MAP (t1);
593   tree map2 = ATOMIC_CONSTR_MAP (t2);
594   while (map1 && map2)
595     {
596       tree arg1 = TREE_PURPOSE (map1);
597       tree arg2 = TREE_PURPOSE (map2);
598       if (!template_args_equal (arg1, arg2))
599         return false;
600       map1 = TREE_CHAIN (map1);
601       map2 = TREE_CHAIN (map2);
602     }
603   return true;
604 }
605 
606 /* Provides additional context for normalization.  */
607 
608 struct norm_info : subst_info
609 {
norm_infonorm_info610   explicit norm_info (tsubst_flags_t complain)
611     : subst_info (tf_warning_or_error | complain, NULL_TREE),
612       context()
613   {}
614 
615   /* Construct a top-level context for DECL.  */
616 
norm_infonorm_info617   norm_info (tree in_decl, tsubst_flags_t complain)
618     : subst_info (tf_warning_or_error | complain, in_decl),
619       context (make_context (in_decl))
620   {}
621 
generate_diagnosticsnorm_info622   bool generate_diagnostics() const
623   {
624     return complain & tf_norm;
625   }
626 
make_contextnorm_info627   tree make_context(tree in_decl)
628   {
629     if (generate_diagnostics ())
630       return build_tree_list (NULL_TREE, in_decl);
631     return NULL_TREE;
632   }
633 
update_contextnorm_info634   void update_context(tree expr, tree args)
635   {
636     if (generate_diagnostics ())
637       {
638 	tree map = build_parameter_mapping (expr, args, in_decl);
639 	context = tree_cons (map, expr, context);
640       }
641     in_decl = get_concept_check_template (expr);
642   }
643 
644   /* Provides information about the source of a constraint. This is a
645      TREE_LIST whose VALUE is either a concept check or a constrained
646      declaration. The PURPOSE, for concept checks is a parameter mapping
647      for that check.  */
648 
649   tree context;
650 };
651 
652 static tree normalize_expression (tree, tree, norm_info);
653 
654 /* Transform a logical-or or logical-and expression into either
655    a conjunction or disjunction. */
656 
657 static tree
normalize_logical_operation(tree t,tree args,tree_code c,norm_info info)658 normalize_logical_operation (tree t, tree args, tree_code c, norm_info info)
659 {
660   tree t0 = normalize_expression (TREE_OPERAND (t, 0), args, info);
661   tree t1 = normalize_expression (TREE_OPERAND (t, 1), args, info);
662 
663   /* Build a new info object for the constraint.  */
664   tree ci = info.generate_diagnostics()
665     ? build_tree_list (t, info.context)
666     : NULL_TREE;
667 
668   return build2 (c, ci, t0, t1);
669 }
670 
671 static tree
normalize_concept_check(tree check,tree args,norm_info info)672 normalize_concept_check (tree check, tree args, norm_info info)
673 {
674   tree id = unpack_concept_check (check);
675   tree tmpl = TREE_OPERAND (id, 0);
676   tree targs = TREE_OPERAND (id, 1);
677 
678   /* A function concept is wrapped in an overload.  */
679   if (TREE_CODE (tmpl) == OVERLOAD)
680     {
681       /* TODO: Can we diagnose this error during parsing?  */
682       if (TREE_CODE (check) == TEMPLATE_ID_EXPR)
683 	error_at (EXPR_LOC_OR_LOC (check, input_location),
684 		  "function concept must be called");
685       tmpl = OVL_FIRST (tmpl);
686     }
687 
688   /* Substitute through the arguments of the concept check. */
689   if (args)
690     targs = tsubst_template_args (targs, args, info.complain, info.in_decl);
691   if (targs == error_mark_node)
692     return error_mark_node;
693 
694   /* Build the substitution for the concept definition.  */
695   tree parms = TREE_VALUE (DECL_TEMPLATE_PARMS (tmpl));
696   /* Turn on template processing; coercing non-type template arguments
697      will automatically assume they're non-dependent.  */
698   ++processing_template_decl;
699   tree subst = coerce_template_parms (parms, targs, tmpl);
700   --processing_template_decl;
701   if (subst == error_mark_node)
702     return error_mark_node;
703 
704   /* The concept may have been ill-formed.  */
705   tree def = get_concept_definition (DECL_TEMPLATE_RESULT (tmpl));
706   if (def == error_mark_node)
707     return error_mark_node;
708 
709   info.update_context (check, args);
710   return normalize_expression (def, subst, info);
711 }
712 
713 /* The normal form of an atom depends on the expression. The normal
714    form of a function call to a function concept is a check constraint
715    for that concept. The normal form of a reference to a variable
716    concept is a check constraint for that concept. Otherwise, the
717    constraint is a predicate constraint.  */
718 
719 static tree
normalize_atom(tree t,tree args,norm_info info)720 normalize_atom (tree t, tree args, norm_info info)
721 {
722   /* Concept checks are not atomic.  */
723   if (concept_check_p (t))
724     return normalize_concept_check (t, args, info);
725 
726   /* Build the parameter mapping for the atom.  */
727   tree map = build_parameter_mapping (t, args, info.in_decl);
728 
729   /* Build a new info object for the atom.  */
730   tree ci = build_tree_list (t, info.context);
731 
732   return build1 (ATOMIC_CONSTR, ci, map);
733 }
734 
735 /* Returns the normal form of an expression. */
736 
737 static tree
normalize_expression(tree t,tree args,norm_info info)738 normalize_expression (tree t, tree args, norm_info info)
739 {
740   if (!t)
741     return NULL_TREE;
742 
743   if (t == error_mark_node)
744     return error_mark_node;
745 
746   switch (TREE_CODE (t))
747     {
748     case TRUTH_ANDIF_EXPR:
749       return normalize_logical_operation (t, args, CONJ_CONSTR, info);
750     case TRUTH_ORIF_EXPR:
751       return normalize_logical_operation (t, args, DISJ_CONSTR, info);
752     default:
753       return normalize_atom (t, args, info);
754     }
755 }
756 
757 /* Cache of the normalized form of constraints.  Marked as deletable because it
758    can all be recalculated.  */
759 static GTY((deletable)) hash_map<tree,tree> *normalized_map;
760 
761 static tree
get_normalized_constraints(tree t,tree args,norm_info info)762 get_normalized_constraints (tree t, tree args, norm_info info)
763 {
764   auto_timevar time (TV_CONSTRAINT_NORM);
765   return normalize_expression (t, args, info);
766 }
767 
768 /* Returns the normalized constraints from a constraint-info object
769    or NULL_TREE if the constraints are null. ARGS provide the initial
770    arguments for normalization and IN_DECL provides the declaration
771    to which the constraints belong.  */
772 
773 static tree
get_normalized_constraints_from_info(tree ci,tree args,tree in_decl,bool diag=false)774 get_normalized_constraints_from_info (tree ci, tree args, tree in_decl,
775 				      bool diag = false)
776 {
777   if (ci == NULL_TREE)
778     return NULL_TREE;
779 
780   /* Substitution errors during normalization are fatal.  */
781   ++processing_template_decl;
782   norm_info info (in_decl, diag ? tf_norm : tf_none);
783   tree t = get_normalized_constraints (CI_ASSOCIATED_CONSTRAINTS (ci),
784 				       args, info);
785   --processing_template_decl;
786 
787   return t;
788 }
789 
790 /* Returns the normalized constraints for the declaration D.  */
791 
792 static tree
get_normalized_constraints_from_decl(tree d,bool diag=false)793 get_normalized_constraints_from_decl (tree d, bool diag = false)
794 {
795   tree tmpl;
796   tree decl;
797 
798   /* For inherited constructors, consider the original declaration;
799      it has the correct template information attached. */
800   d = strip_inheriting_ctors (d);
801 
802   if (TREE_CODE (d) == TEMPLATE_DECL)
803     {
804       tmpl = d;
805       decl = DECL_TEMPLATE_RESULT (tmpl);
806     }
807   else
808     {
809       if (tree ti = DECL_TEMPLATE_INFO (d))
810 	tmpl = TI_TEMPLATE (ti);
811       else
812 	tmpl = NULL_TREE;
813       decl = d;
814     }
815 
816   /* Get the most general template for the declaration, and compute
817      arguments from that. This ensures that the arguments used for
818      normalization are always template parameters and not arguments
819      used for outer specializations.  For example:
820 
821         template<typename T>
822         struct S {
823 	  template<typename U> requires C<T, U> void f(U);
824         };
825 
826         S<int>::f(0);
827 
828      When we normalize the requirements for S<int>::f, we want the
829      arguments to be {T, U}, not {int, U}. One reason for this is that
830      accepting the latter causes the template parameter level of U
831      to be reduced in a way that makes it overly difficult substitute
832      concrete arguments (i.e., eventually {int, int} during satisfaction.  */
833   if (tmpl)
834   {
835     if (DECL_LANG_SPECIFIC(tmpl) && !DECL_TEMPLATE_SPECIALIZATION (tmpl))
836       tmpl = most_general_template (tmpl);
837   }
838 
839   /* If we're not diagnosing errors, use cached constraints, if any.  */
840   if (!diag)
841     if (tree *p = hash_map_safe_get (normalized_map, tmpl))
842       return *p;
843 
844   push_nested_class_guard pncs (DECL_CONTEXT (d));
845 
846   tree args = generic_targs_for (tmpl);
847   tree ci = get_constraints (decl);
848   tree norm = get_normalized_constraints_from_info (ci, args, tmpl, diag);
849 
850   if (!diag)
851     hash_map_safe_put<hm_ggc> (normalized_map, tmpl, norm);
852 
853   return norm;
854 }
855 
856 /* Returns the normal form of TMPL's definition.  */
857 
858 static tree
normalize_concept_definition(tree tmpl,bool diag=false)859 normalize_concept_definition (tree tmpl, bool diag = false)
860 {
861   if (!diag)
862     if (tree *p = hash_map_safe_get (normalized_map, tmpl))
863       return *p;
864 
865   gcc_assert (concept_definition_p (tmpl));
866   if (OVL_P (tmpl))
867     tmpl = OVL_FIRST (tmpl);
868   gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL);
869   tree args = generic_targs_for (tmpl);
870   tree def = get_concept_definition (DECL_TEMPLATE_RESULT (tmpl));
871   ++processing_template_decl;
872   norm_info info (tmpl, diag ? tf_norm : tf_none);
873   tree norm = get_normalized_constraints (def, args, info);
874   --processing_template_decl;
875 
876   if (!diag)
877     hash_map_safe_put<hm_ggc> (normalized_map, tmpl, norm);
878 
879   return norm;
880 }
881 
882 /* Returns the normal form of TMPL's requirements.  */
883 
884 static tree
normalize_template_requirements(tree tmpl,bool diag=false)885 normalize_template_requirements (tree tmpl, bool diag = false)
886 {
887   return get_normalized_constraints_from_decl (tmpl, diag);
888 }
889 
890 /* Returns the normal form of TMPL's requirements.  */
891 
892 static tree
normalize_nontemplate_requirements(tree decl,bool diag=false)893 normalize_nontemplate_requirements (tree decl, bool diag = false)
894 {
895   return get_normalized_constraints_from_decl (decl, diag);
896 }
897 
898 /* Normalize an EXPR as a constraint using ARGS.  */
899 
900 static tree
normalize_constraint_expression(tree expr,tree args,bool diag=false)901 normalize_constraint_expression (tree expr, tree args, bool diag = false)
902 {
903   if (!expr || expr == error_mark_node)
904     return expr;
905   ++processing_template_decl;
906   norm_info info (diag ? tf_norm : tf_none);
907   tree norm = get_normalized_constraints (expr, args, info);
908   --processing_template_decl;
909   return norm;
910 }
911 
912 /* Normalize an EXPR as a constraint.  */
913 
914 static tree
normalize_constraint_expression(tree expr,bool diag=false)915 normalize_constraint_expression (tree expr, bool diag = false)
916 {
917   if (!expr || expr == error_mark_node)
918     return expr;
919 
920   /* For concept checks, use the supplied template arguments as those used
921      for normalization. Otherwise, there are no template arguments.  */
922   tree args;
923   if (concept_check_p (expr))
924     {
925       tree id = unpack_concept_check (expr);
926       args = TREE_OPERAND (id, 1);
927     }
928   else
929     args = NULL_TREE;
930 
931   return normalize_constraint_expression (expr, args, diag);
932 }
933 
934 /* 17.4.1.2p2. Two constraints are identical if they are formed
935    from the same expression and the targets of the parameter mapping
936    are equivalent.  */
937 
938 bool
atomic_constraints_identical_p(tree t1,tree t2)939 atomic_constraints_identical_p (tree t1, tree t2)
940 {
941   gcc_assert (TREE_CODE (t1) == ATOMIC_CONSTR);
942   gcc_assert (TREE_CODE (t2) == ATOMIC_CONSTR);
943 
944   if (ATOMIC_CONSTR_EXPR (t1) != ATOMIC_CONSTR_EXPR (t2))
945     return false;
946 
947   if (!parameter_mapping_equivalent_p (t1, t2))
948     return false;
949 
950   return true;
951 }
952 
953 /* True if T1 and T2 are equivalent, meaning they have the same syntactic
954    structure and all corresponding constraints are identical.  */
955 
956 bool
constraints_equivalent_p(tree t1,tree t2)957 constraints_equivalent_p (tree t1, tree t2)
958 {
959   gcc_assert (CONSTR_P (t1));
960   gcc_assert (CONSTR_P (t2));
961 
962   if (TREE_CODE (t1) != TREE_CODE (t2))
963     return false;
964 
965   switch (TREE_CODE (t1))
966   {
967   case CONJ_CONSTR:
968   case DISJ_CONSTR:
969     if (!constraints_equivalent_p (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)))
970       return false;
971     if (!constraints_equivalent_p (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)))
972       return false;
973     break;
974   case ATOMIC_CONSTR:
975     if (!atomic_constraints_identical_p(t1, t2))
976       return false;
977     break;
978   default:
979     gcc_unreachable ();
980   }
981   return true;
982 }
983 
984 /* Compute the hash value for T.  */
985 
986 hashval_t
hash_atomic_constraint(tree t)987 hash_atomic_constraint (tree t)
988 {
989   gcc_assert (TREE_CODE (t) == ATOMIC_CONSTR);
990 
991   /* Hash the identity of the expression.  */
992   hashval_t val = htab_hash_pointer (ATOMIC_CONSTR_EXPR (t));
993 
994   /* Hash the targets of the parameter map.  */
995   tree p = ATOMIC_CONSTR_MAP (t);
996   while (p)
997     {
998       val = iterative_hash_template_arg (TREE_PURPOSE (p), val);
999       p = TREE_CHAIN (p);
1000     }
1001 
1002   return val;
1003 }
1004 
1005 namespace inchash
1006 {
1007 
1008 static void
add_constraint(tree t,hash & h)1009 add_constraint (tree t, hash& h)
1010 {
1011   h.add_int(TREE_CODE (t));
1012   switch (TREE_CODE (t))
1013   {
1014   case CONJ_CONSTR:
1015   case DISJ_CONSTR:
1016     add_constraint (TREE_OPERAND (t, 0), h);
1017     add_constraint (TREE_OPERAND (t, 1), h);
1018     break;
1019   case ATOMIC_CONSTR:
1020     h.merge_hash (hash_atomic_constraint (t));
1021     break;
1022   default:
1023     gcc_unreachable ();
1024   }
1025 }
1026 
1027 }
1028 
1029 /* Computes a hash code for the constraint T.  */
1030 
1031 hashval_t
iterative_hash_constraint(tree t,hashval_t val)1032 iterative_hash_constraint (tree t, hashval_t val)
1033 {
1034   gcc_assert (CONSTR_P (t));
1035   inchash::hash h (val);
1036   inchash::add_constraint (t, h);
1037   return h.end ();
1038 }
1039 
1040 // -------------------------------------------------------------------------- //
1041 // Constraint Semantic Processing
1042 //
1043 // The following functions are called by the parser and substitution rules
1044 // to create and evaluate constraint-related nodes.
1045 
1046 // The constraints associated with the current template parameters.
1047 tree
current_template_constraints(void)1048 current_template_constraints (void)
1049 {
1050   if (!current_template_parms)
1051     return NULL_TREE;
1052   tree tmpl_constr = TEMPLATE_PARMS_CONSTRAINTS (current_template_parms);
1053   return build_constraints (tmpl_constr, NULL_TREE);
1054 }
1055 
1056 /* If the recently parsed TYPE declares or defines a template or
1057    template specialization, get its corresponding constraints from the
1058    current template parameters and bind them to TYPE's declaration.  */
1059 
1060 tree
associate_classtype_constraints(tree type)1061 associate_classtype_constraints (tree type)
1062 {
1063   if (!type || type == error_mark_node || !CLASS_TYPE_P (type))
1064     return type;
1065 
1066   /* An explicit class template specialization has no template parameters.  */
1067   if (!current_template_parms)
1068     return type;
1069 
1070   if (CLASSTYPE_IS_TEMPLATE (type) || CLASSTYPE_TEMPLATE_SPECIALIZATION (type))
1071     {
1072       tree decl = TYPE_STUB_DECL (type);
1073       tree ci = current_template_constraints ();
1074 
1075       /* An implicitly instantiated member template declaration already
1076 	 has associated constraints. If it is defined outside of its
1077 	 class, then we need match these constraints against those of
1078 	 original declaration.  */
1079       if (tree orig_ci = get_constraints (decl))
1080         {
1081 	  if (int extra_levels = (TMPL_PARMS_DEPTH (current_template_parms)
1082 				  - TMPL_ARGS_DEPTH (TYPE_TI_ARGS (type))))
1083 	    {
1084 	      /* If there is a discrepancy between the current template depth
1085 		 and the template depth of the original declaration, then we
1086 		 must be redeclaring a class template as part of a friend
1087 		 declaration within another class template.  Before matching
1088 		 constraints, we need to reduce the template parameter level
1089 		 within the current constraints via substitution.  */
1090 	      tree outer_gtargs = template_parms_to_args (current_template_parms);
1091 	      TREE_VEC_LENGTH (outer_gtargs) = extra_levels;
1092 	      ci = tsubst_constraint_info (ci, outer_gtargs, tf_none, NULL_TREE);
1093 	    }
1094           if (!equivalent_constraints (ci, orig_ci))
1095             {
1096 	      error ("%qT does not match original declaration", type);
1097 	      tree tmpl = CLASSTYPE_TI_TEMPLATE (type);
1098 	      location_t loc = DECL_SOURCE_LOCATION (tmpl);
1099 	      inform (loc, "original template declaration here");
1100 	      /* Fall through, so that we define the type anyway.  */
1101             }
1102           return type;
1103         }
1104       set_constraints (decl, ci);
1105     }
1106   return type;
1107 }
1108 
1109 /* Create an empty constraint info block.  */
1110 
1111 static inline tree_constraint_info*
build_constraint_info()1112 build_constraint_info ()
1113 {
1114   return (tree_constraint_info *)make_node (CONSTRAINT_INFO);
1115 }
1116 
1117 /* Build a constraint-info object that contains the associated constraints
1118    of a declaration.  This also includes the declaration's template
1119    requirements (TREQS) and any trailing requirements for a function
1120    declarator (DREQS).  Note that both TREQS and DREQS must be constraints.
1121 
1122    If the declaration has neither template nor declaration requirements
1123    this returns NULL_TREE, indicating an unconstrained declaration.  */
1124 
1125 tree
build_constraints(tree tr,tree dr)1126 build_constraints (tree tr, tree dr)
1127 {
1128   if (!tr && !dr)
1129     return NULL_TREE;
1130 
1131   tree_constraint_info* ci = build_constraint_info ();
1132   ci->template_reqs = tr;
1133   ci->declarator_reqs = dr;
1134   ci->associated_constr = combine_constraint_expressions (tr, dr);
1135 
1136   return (tree)ci;
1137 }
1138 
1139 /* Add constraint RHS to the end of CONSTRAINT_INFO ci.  */
1140 
1141 tree
append_constraint(tree ci,tree rhs)1142 append_constraint (tree ci, tree rhs)
1143 {
1144   tree tr = ci ? CI_TEMPLATE_REQS (ci) : NULL_TREE;
1145   tree dr = ci ? CI_DECLARATOR_REQS (ci) : NULL_TREE;
1146   dr = combine_constraint_expressions (dr, rhs);
1147   if (ci)
1148     {
1149       CI_DECLARATOR_REQS (ci) = dr;
1150       tree ac = combine_constraint_expressions (tr, dr);
1151       CI_ASSOCIATED_CONSTRAINTS (ci) = ac;
1152     }
1153   else
1154     ci = build_constraints (tr, dr);
1155   return ci;
1156 }
1157 
1158 /* A mapping from declarations to constraint information.  */
1159 
1160 static GTY ((cache)) decl_tree_cache_map *decl_constraints;
1161 
1162 /* Returns the template constraints of declaration T. If T is not
1163    constrained, return NULL_TREE. Note that T must be non-null. */
1164 
1165 tree
get_constraints(const_tree t)1166 get_constraints (const_tree t)
1167 {
1168   if (!flag_concepts)
1169     return NULL_TREE;
1170   if (!decl_constraints)
1171     return NULL_TREE;
1172 
1173   gcc_assert (DECL_P (t));
1174   if (TREE_CODE (t) == TEMPLATE_DECL)
1175     t = DECL_TEMPLATE_RESULT (t);
1176   tree* found = decl_constraints->get (CONST_CAST_TREE (t));
1177   if (found)
1178     return *found;
1179   else
1180     return NULL_TREE;
1181 }
1182 
1183 /* Associate the given constraint information CI with the declaration
1184    T. If T is a template, then the constraints are associated with
1185    its underlying declaration. Don't build associations if CI is
1186    NULL_TREE.  */
1187 
1188 void
set_constraints(tree t,tree ci)1189 set_constraints (tree t, tree ci)
1190 {
1191   if (!ci)
1192     return;
1193   gcc_assert (t && flag_concepts);
1194   if (TREE_CODE (t) == TEMPLATE_DECL)
1195     t = DECL_TEMPLATE_RESULT (t);
1196   bool found = hash_map_safe_put<hm_ggc> (decl_constraints, t, ci);
1197   gcc_assert (!found);
1198 }
1199 
1200 /* Remove the associated constraints of the declaration T.  */
1201 
1202 void
remove_constraints(tree t)1203 remove_constraints (tree t)
1204 {
1205   gcc_assert (DECL_P (t));
1206   if (TREE_CODE (t) == TEMPLATE_DECL)
1207     t = DECL_TEMPLATE_RESULT (t);
1208 
1209   if (decl_constraints)
1210     decl_constraints->remove (t);
1211 }
1212 
1213 /* If DECL is a friend, substitute into REQS to produce requirements suitable
1214    for declaration matching.  */
1215 
1216 tree
maybe_substitute_reqs_for(tree reqs,const_tree decl_)1217 maybe_substitute_reqs_for (tree reqs, const_tree decl_)
1218 {
1219   if (reqs == NULL_TREE)
1220     return NULL_TREE;
1221   tree decl = CONST_CAST_TREE (decl_);
1222   tree result = STRIP_TEMPLATE (decl);
1223   if (DECL_FRIEND_P (result))
1224     {
1225       tree tmpl = decl == result ? DECL_TI_TEMPLATE (result) : decl;
1226       tree gargs = generic_targs_for (tmpl);
1227       processing_template_decl_sentinel s;
1228       if (uses_template_parms (gargs))
1229 	++processing_template_decl;
1230       reqs = tsubst_constraint (reqs, gargs,
1231 				tf_warning_or_error, NULL_TREE);
1232     }
1233   return reqs;
1234 }
1235 
1236 /* Returns the template-head requires clause for the template
1237    declaration T or NULL_TREE if none.  */
1238 
1239 tree
get_template_head_requirements(tree t)1240 get_template_head_requirements (tree t)
1241 {
1242   tree ci = get_constraints (t);
1243   if (!ci)
1244     return NULL_TREE;
1245   return CI_TEMPLATE_REQS (ci);
1246 }
1247 
1248 /* Returns the trailing requires clause of the declarator of
1249    a template declaration T or NULL_TREE if none.  */
1250 
1251 tree
get_trailing_function_requirements(tree t)1252 get_trailing_function_requirements (tree t)
1253 {
1254   tree ci = get_constraints (t);
1255   if (!ci)
1256     return NULL_TREE;
1257   return CI_DECLARATOR_REQS (ci);
1258 }
1259 
1260 /* Construct a sequence of template arguments by prepending
1261    ARG to REST. Either ARG or REST may be null. */
1262 static tree
build_concept_check_arguments(tree arg,tree rest)1263 build_concept_check_arguments (tree arg, tree rest)
1264 {
1265   gcc_assert (rest ? TREE_CODE (rest) == TREE_VEC : true);
1266   tree args;
1267   if (arg)
1268     {
1269       int n = rest ? TREE_VEC_LENGTH (rest) : 0;
1270       args = make_tree_vec (n + 1);
1271       TREE_VEC_ELT (args, 0) = arg;
1272       if (rest)
1273         for (int i = 0; i < n; ++i)
1274           TREE_VEC_ELT (args, i + 1) = TREE_VEC_ELT (rest, i);
1275       int def = rest ? GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (rest) : 0;
1276       SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (args, def + 1);
1277     }
1278   else
1279     {
1280       args = rest;
1281     }
1282   return args;
1283 }
1284 
1285 /* Builds an id-expression of the form `C<Args...>()` where C is a function
1286    concept.  */
1287 
1288 static tree
build_function_check(tree tmpl,tree args,tsubst_flags_t)1289 build_function_check (tree tmpl, tree args, tsubst_flags_t /*complain*/)
1290 {
1291   if (TREE_CODE (tmpl) == TEMPLATE_DECL)
1292     {
1293       /* If we just got a template, wrap it in an overload so it looks like any
1294 	 other template-id. */
1295       tmpl = ovl_make (tmpl);
1296       TREE_TYPE (tmpl) = boolean_type_node;
1297     }
1298 
1299   /* Perform function concept resolution now so we always have a single
1300      function of the overload set (even if we started with only one; the
1301      resolution function converts template arguments). Note that we still
1302      wrap this in an overload set so we don't upset other parts of the
1303      compiler that expect template-ids referring to function concepts
1304      to have an overload set.  */
1305   tree info = resolve_function_concept_overload (tmpl, args);
1306   if (info == error_mark_node)
1307     return error_mark_node;
1308   if (!info)
1309     {
1310       error ("no matching concepts for %qE", tmpl);
1311       return error_mark_node;
1312     }
1313   args = TREE_PURPOSE (info);
1314   tmpl = DECL_TI_TEMPLATE (TREE_VALUE (info));
1315 
1316   /* Rebuild the singleton overload set; mark the type bool.  */
1317   tmpl = ovl_make (tmpl, NULL_TREE);
1318   TREE_TYPE (tmpl) = boolean_type_node;
1319 
1320   /* Build the id-expression around the overload set.  */
1321   tree id = build2 (TEMPLATE_ID_EXPR, boolean_type_node, tmpl, args);
1322 
1323   /* Finally, build the call expression around the overload.  */
1324   ++processing_template_decl;
1325   vec<tree, va_gc> *fargs = make_tree_vector ();
1326   tree call = build_min_nt_call_vec (id, fargs);
1327   TREE_TYPE (call) = boolean_type_node;
1328   release_tree_vector (fargs);
1329   --processing_template_decl;
1330 
1331   return call;
1332 }
1333 
1334 /* Builds an id-expression of the form `C<Args...>` where C is a variable
1335    concept.  */
1336 
1337 static tree
build_variable_check(tree tmpl,tree args,tsubst_flags_t complain)1338 build_variable_check (tree tmpl, tree args, tsubst_flags_t complain)
1339 {
1340   gcc_assert (variable_concept_p (tmpl));
1341   gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL);
1342   tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl));
1343   args = coerce_template_parms (parms, args, tmpl, complain);
1344   if (args == error_mark_node)
1345     return error_mark_node;
1346   return build2 (TEMPLATE_ID_EXPR, boolean_type_node, tmpl, args);
1347 }
1348 
1349 /* Builds an id-expression of the form `C<Args...>` where C is a standard
1350    concept.  */
1351 
1352 static tree
build_standard_check(tree tmpl,tree args,tsubst_flags_t complain)1353 build_standard_check (tree tmpl, tree args, tsubst_flags_t complain)
1354 {
1355   gcc_assert (standard_concept_p (tmpl));
1356   gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL);
1357   tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl));
1358   args = coerce_template_parms (parms, args, tmpl, complain);
1359   if (args == error_mark_node)
1360     return error_mark_node;
1361   return build2 (TEMPLATE_ID_EXPR, boolean_type_node, tmpl, args);
1362 }
1363 
1364 /* Construct an expression that checks TARGET using ARGS.  */
1365 
1366 tree
build_concept_check(tree target,tree args,tsubst_flags_t complain)1367 build_concept_check (tree target, tree args, tsubst_flags_t complain)
1368 {
1369   return build_concept_check (target, NULL_TREE, args, complain);
1370 }
1371 
1372 /* Construct an expression that checks the concept given by DECL. If
1373    concept_definition_p (DECL) is false, this returns null.  */
1374 
1375 tree
build_concept_check(tree decl,tree arg,tree rest,tsubst_flags_t complain)1376 build_concept_check (tree decl, tree arg, tree rest, tsubst_flags_t complain)
1377 {
1378   tree args = build_concept_check_arguments (arg, rest);
1379 
1380   if (standard_concept_p (decl))
1381     return build_standard_check (decl, args, complain);
1382   if (variable_concept_p (decl))
1383     return build_variable_check (decl, args, complain);
1384   if (function_concept_p (decl))
1385     return build_function_check (decl, args, complain);
1386 
1387   return error_mark_node;
1388 }
1389 
1390 /* Build a template-id that can participate in a concept check.  */
1391 
1392 static tree
build_concept_id(tree decl,tree args)1393 build_concept_id (tree decl, tree args)
1394 {
1395   tree check = build_concept_check (decl, args, tf_warning_or_error);
1396   if (check == error_mark_node)
1397     return error_mark_node;
1398   return unpack_concept_check (check);
1399 }
1400 
1401 /* Build a template-id that can participate in a concept check, preserving
1402    the source location of the original template-id.  */
1403 
1404 tree
build_concept_id(tree expr)1405 build_concept_id (tree expr)
1406 {
1407   gcc_assert (TREE_CODE (expr) == TEMPLATE_ID_EXPR);
1408   tree id = build_concept_id (TREE_OPERAND (expr, 0), TREE_OPERAND (expr, 1));
1409   protected_set_expr_location (id, cp_expr_location (expr));
1410   return id;
1411 }
1412 
1413 /* Build as template-id with a placeholder that can be used as a
1414    type constraint.
1415 
1416    Note that this will diagnose errors if the initial concept check
1417    cannot be built.  */
1418 
1419 tree
build_type_constraint(tree decl,tree args,tsubst_flags_t complain)1420 build_type_constraint (tree decl, tree args, tsubst_flags_t complain)
1421 {
1422   tree wildcard = build_nt (WILDCARD_DECL);
1423   ++processing_template_decl;
1424   tree check = build_concept_check (decl, wildcard, args, complain);
1425   --processing_template_decl;
1426   if (check == error_mark_node)
1427     return error_mark_node;
1428   return unpack_concept_check (check);
1429 }
1430 
1431 /* Returns a TYPE_DECL that contains sufficient information to
1432    build a template parameter of the same kind as PROTO and
1433    constrained by the concept declaration CNC.  Note that PROTO
1434    is the first template parameter of CNC.
1435 
1436    If specified, ARGS provides additional arguments to the
1437    constraint check.  */
1438 tree
build_constrained_parameter(tree cnc,tree proto,tree args)1439 build_constrained_parameter (tree cnc, tree proto, tree args)
1440 {
1441   tree name = DECL_NAME (cnc);
1442   tree type = TREE_TYPE (proto);
1443   tree decl = build_decl (input_location, TYPE_DECL, name, type);
1444   CONSTRAINED_PARM_PROTOTYPE (decl) = proto;
1445   CONSTRAINED_PARM_CONCEPT (decl) = cnc;
1446   CONSTRAINED_PARM_EXTRA_ARGS (decl) = args;
1447   return decl;
1448 }
1449 
1450 /* Create a constraint expression for the given DECL that evaluates the
1451    requirements specified by CONSTR, a TYPE_DECL that contains all the
1452    information necessary to build the requirements (see finish_concept_name
1453    for the layout of that TYPE_DECL).
1454 
1455    Note that the constraints are neither reduced nor decomposed. That is
1456    done only after the requires clause has been parsed (or not).  */
1457 
1458 tree
finish_shorthand_constraint(tree decl,tree constr)1459 finish_shorthand_constraint (tree decl, tree constr)
1460 {
1461   /* No requirements means no constraints.  */
1462   if (!constr)
1463     return NULL_TREE;
1464 
1465   if (error_operand_p (constr))
1466     return NULL_TREE;
1467 
1468   tree proto = CONSTRAINED_PARM_PROTOTYPE (constr);
1469   tree con = CONSTRAINED_PARM_CONCEPT (constr);
1470   tree args = CONSTRAINED_PARM_EXTRA_ARGS (constr);
1471 
1472   /* The TS lets use shorthand to constrain a pack of arguments, but the
1473      standard does not.
1474 
1475      For the TS, consider:
1476 
1477 	template<C... Ts> struct s;
1478 
1479      If C is variadic (and because Ts is a pack), we associate the
1480      constraint C<Ts...>. In all other cases, we associate
1481      the constraint (C<Ts> && ...).
1482 
1483      The standard behavior cannot be overridden by -fconcepts-ts.  */
1484   bool variadic_concept_p = template_parameter_pack_p (proto);
1485   bool declared_pack_p = template_parameter_pack_p (decl);
1486   bool apply_to_each_p = (cxx_dialect >= cxx2a) ? true : !variadic_concept_p;
1487 
1488   /* Get the argument and overload used for the requirement
1489      and adjust it if we're going to expand later.  */
1490   tree arg = template_parm_to_arg (decl);
1491   if (apply_to_each_p && declared_pack_p)
1492     arg = PACK_EXPANSION_PATTERN (TREE_VEC_ELT (ARGUMENT_PACK_ARGS (arg), 0));
1493 
1494   /* Build the concept constraint-expression.  */
1495   tree tmpl = DECL_TI_TEMPLATE (con);
1496   tree check = tmpl;
1497   if (TREE_CODE (con) == FUNCTION_DECL)
1498     check = ovl_make (tmpl);
1499   check = build_concept_check (check, arg, args, tf_warning_or_error);
1500 
1501   /* Make the check a fold-expression if needed.  */
1502   if (apply_to_each_p && declared_pack_p)
1503     check = finish_left_unary_fold_expr (check, TRUTH_ANDIF_EXPR);
1504 
1505   return check;
1506 }
1507 
1508 /* Returns a conjunction of shorthand requirements for the template
1509    parameter list PARMS. Note that the requirements are stored in
1510    the TYPE of each tree node. */
1511 
1512 tree
get_shorthand_constraints(tree parms)1513 get_shorthand_constraints (tree parms)
1514 {
1515   tree result = NULL_TREE;
1516   parms = INNERMOST_TEMPLATE_PARMS (parms);
1517   for (int i = 0; i < TREE_VEC_LENGTH (parms); ++i)
1518     {
1519       tree parm = TREE_VEC_ELT (parms, i);
1520       tree constr = TEMPLATE_PARM_CONSTRAINTS (parm);
1521       result = combine_constraint_expressions (result, constr);
1522     }
1523   return result;
1524 }
1525 
1526 /* Get the deduced wildcard from a DEDUCED placeholder.  If the deduced
1527    wildcard is a pack, return the first argument of that pack.  */
1528 
1529 static tree
get_deduced_wildcard(tree wildcard)1530 get_deduced_wildcard (tree wildcard)
1531 {
1532   if (ARGUMENT_PACK_P (wildcard))
1533     wildcard = TREE_VEC_ELT (ARGUMENT_PACK_ARGS (wildcard), 0);
1534   gcc_assert (TREE_CODE (wildcard) == WILDCARD_DECL);
1535   return wildcard;
1536 }
1537 
1538 /* Returns the prototype parameter for the nth deduced wildcard.  */
1539 
1540 static tree
get_introduction_prototype(tree wildcards,int index)1541 get_introduction_prototype (tree wildcards, int index)
1542 {
1543   return TREE_TYPE (get_deduced_wildcard (TREE_VEC_ELT (wildcards, index)));
1544 }
1545 
1546 /* Introduce a type template parameter.  */
1547 
1548 static tree
introduce_type_template_parameter(tree wildcard,bool & non_type_p)1549 introduce_type_template_parameter (tree wildcard, bool& non_type_p)
1550 {
1551   non_type_p = false;
1552   return finish_template_type_parm (class_type_node, DECL_NAME (wildcard));
1553 }
1554 
1555 /* Introduce a template template parameter.  */
1556 
1557 static tree
introduce_template_template_parameter(tree wildcard,bool & non_type_p)1558 introduce_template_template_parameter (tree wildcard, bool& non_type_p)
1559 {
1560   non_type_p = false;
1561   begin_template_parm_list ();
1562   current_template_parms = DECL_TEMPLATE_PARMS (TREE_TYPE (wildcard));
1563   end_template_parm_list ();
1564   return finish_template_template_parm (class_type_node, DECL_NAME (wildcard));
1565 }
1566 
1567 /* Introduce a template non-type parameter.  */
1568 
1569 static tree
introduce_nontype_template_parameter(tree wildcard,bool & non_type_p)1570 introduce_nontype_template_parameter (tree wildcard, bool& non_type_p)
1571 {
1572   non_type_p = true;
1573   tree parm = copy_decl (TREE_TYPE (wildcard));
1574   DECL_NAME (parm) = DECL_NAME (wildcard);
1575   return parm;
1576 }
1577 
1578 /* Introduce a single template parameter.  */
1579 
1580 static tree
build_introduced_template_parameter(tree wildcard,bool & non_type_p)1581 build_introduced_template_parameter (tree wildcard, bool& non_type_p)
1582 {
1583   tree proto = TREE_TYPE (wildcard);
1584 
1585   tree parm;
1586   if (TREE_CODE (proto) == TYPE_DECL)
1587     parm = introduce_type_template_parameter (wildcard, non_type_p);
1588   else if (TREE_CODE (proto) == TEMPLATE_DECL)
1589     parm = introduce_template_template_parameter (wildcard, non_type_p);
1590   else
1591     parm = introduce_nontype_template_parameter (wildcard, non_type_p);
1592 
1593   /* Wrap in a TREE_LIST for process_template_parm. Note that introduced
1594      parameters do not retain the defaults from the source parameter.  */
1595   return build_tree_list (NULL_TREE, parm);
1596 }
1597 
1598 /* Introduce a single template parameter.  */
1599 
1600 static tree
introduce_template_parameter(tree parms,tree wildcard)1601 introduce_template_parameter (tree parms, tree wildcard)
1602 {
1603   gcc_assert (!ARGUMENT_PACK_P (wildcard));
1604   tree proto = TREE_TYPE (wildcard);
1605   location_t loc = DECL_SOURCE_LOCATION (wildcard);
1606 
1607   /* Diagnose the case where we have C{...Args}.  */
1608   if (WILDCARD_PACK_P (wildcard))
1609     {
1610       tree id = DECL_NAME (wildcard);
1611       error_at (loc, "%qE cannot be introduced with an ellipsis %<...%>", id);
1612       inform (DECL_SOURCE_LOCATION (proto), "prototype declared here");
1613     }
1614 
1615   bool non_type_p;
1616   tree parm = build_introduced_template_parameter (wildcard, non_type_p);
1617   return process_template_parm (parms, loc, parm, non_type_p, false);
1618 }
1619 
1620 /* Introduce a template parameter pack.  */
1621 
1622 static tree
introduce_template_parameter_pack(tree parms,tree wildcard)1623 introduce_template_parameter_pack (tree parms, tree wildcard)
1624 {
1625   bool non_type_p;
1626   tree parm = build_introduced_template_parameter (wildcard, non_type_p);
1627   location_t loc = DECL_SOURCE_LOCATION (wildcard);
1628   return process_template_parm (parms, loc, parm, non_type_p, true);
1629 }
1630 
1631 /* Introduce the nth template parameter.  */
1632 
1633 static tree
introduce_template_parameter(tree parms,tree wildcards,int & index)1634 introduce_template_parameter (tree parms, tree wildcards, int& index)
1635 {
1636   tree deduced = TREE_VEC_ELT (wildcards, index++);
1637   return introduce_template_parameter (parms, deduced);
1638 }
1639 
1640 /* Introduce either a template parameter pack or a list of template
1641    parameters.  */
1642 
1643 static tree
introduce_template_parameters(tree parms,tree wildcards,int & index)1644 introduce_template_parameters (tree parms, tree wildcards, int& index)
1645 {
1646   /* If the prototype was a parameter, we better have deduced an
1647      argument pack, and that argument must be the last deduced value
1648      in the wildcard vector.  */
1649   tree deduced = TREE_VEC_ELT (wildcards, index++);
1650   gcc_assert (ARGUMENT_PACK_P (deduced));
1651   gcc_assert (index == TREE_VEC_LENGTH (wildcards));
1652 
1653   /* Introduce each element in the pack.  */
1654   tree args = ARGUMENT_PACK_ARGS (deduced);
1655   for (int i = 0; i < TREE_VEC_LENGTH (args); ++i)
1656     {
1657       tree arg = TREE_VEC_ELT (args, i);
1658       if (WILDCARD_PACK_P (arg))
1659 	parms = introduce_template_parameter_pack (parms, arg);
1660       else
1661 	parms = introduce_template_parameter (parms, arg);
1662     }
1663 
1664   return parms;
1665 }
1666 
1667 /* Builds the template parameter list PARMS by chaining introduced
1668    parameters from the WILDCARD vector.  INDEX is the position of
1669    the current parameter.  */
1670 
1671 static tree
process_introduction_parms(tree parms,tree wildcards,int & index)1672 process_introduction_parms (tree parms, tree wildcards, int& index)
1673 {
1674   tree proto = get_introduction_prototype (wildcards, index);
1675   if (template_parameter_pack_p (proto))
1676     return introduce_template_parameters (parms, wildcards, index);
1677   else
1678     return introduce_template_parameter (parms, wildcards, index);
1679 }
1680 
1681 /* Ensure that all template parameters have been introduced for the concept
1682    named in CHECK.  If not, emit a diagnostic.
1683 
1684    Note that implicitly introducing a parameter with a default argument
1685      creates a case where a parameter is declared, but unnamed, making
1686      it unusable in the definition.  */
1687 
1688 static bool
check_introduction_list(tree intros,tree check)1689 check_introduction_list (tree intros, tree check)
1690 {
1691   check = unpack_concept_check (check);
1692   tree tmpl = TREE_OPERAND (check, 0);
1693   if (OVL_P (tmpl))
1694     tmpl = OVL_FIRST (tmpl);
1695 
1696   tree parms = DECL_INNERMOST_TEMPLATE_PARMS (tmpl);
1697   if (TREE_VEC_LENGTH (intros) < TREE_VEC_LENGTH (parms))
1698     {
1699       error_at (input_location, "all template parameters of %qD must "
1700 				"be introduced", tmpl);
1701       return false;
1702     }
1703 
1704    return true;
1705 }
1706 
1707 /* Associates a constraint check to the current template based on the
1708    introduction parameters.  INTRO_LIST must be a TREE_VEC of WILDCARD_DECLs
1709    containing a chained PARM_DECL which contains the identifier as well as
1710    the source location. TMPL_DECL is the decl for the concept being used.
1711    If we take a concept, C, this will form a check in the form of
1712    C<INTRO_LIST> filling in any extra arguments needed by the defaults
1713    deduced.
1714 
1715    Returns NULL_TREE if no concept could be matched and error_mark_node if
1716    an error occurred when matching.  */
1717 
1718 tree
finish_template_introduction(tree tmpl_decl,tree intro_list,location_t intro_loc)1719 finish_template_introduction (tree tmpl_decl,
1720 			      tree intro_list,
1721 			      location_t intro_loc)
1722 {
1723   /* Build a concept check to deduce the actual parameters.  */
1724   tree expr = build_concept_check (tmpl_decl, intro_list, tf_none);
1725   if (expr == error_mark_node)
1726     {
1727       error_at (intro_loc, "cannot deduce template parameters from "
1728 			   "introduction list");
1729       return error_mark_node;
1730     }
1731 
1732   if (!check_introduction_list (intro_list, expr))
1733     return error_mark_node;
1734 
1735   tree parms = deduce_concept_introduction (expr);
1736   if (!parms)
1737     return NULL_TREE;
1738 
1739   /* Build template parameter scope for introduction.  */
1740   tree parm_list = NULL_TREE;
1741   begin_template_parm_list ();
1742   int nargs = MIN (TREE_VEC_LENGTH (parms), TREE_VEC_LENGTH (intro_list));
1743   for (int n = 0; n < nargs; )
1744     parm_list = process_introduction_parms (parm_list, parms, n);
1745   parm_list = end_template_parm_list (parm_list);
1746 
1747   /* Update the number of arguments to reflect the number of deduced
1748      template parameter introductions.  */
1749   nargs = TREE_VEC_LENGTH (parm_list);
1750 
1751   /* Determine if any errors occurred during matching.  */
1752   for (int i = 0; i < TREE_VEC_LENGTH (parm_list); ++i)
1753     if (TREE_VALUE (TREE_VEC_ELT (parm_list, i)) == error_mark_node)
1754       {
1755         end_template_decl ();
1756         return error_mark_node;
1757       }
1758 
1759   /* Build a concept check for our constraint.  */
1760   tree check_args = make_tree_vec (nargs);
1761   int n = 0;
1762   for (; n < TREE_VEC_LENGTH (parm_list); ++n)
1763     {
1764       tree parm = TREE_VEC_ELT (parm_list, n);
1765       TREE_VEC_ELT (check_args, n) = template_parm_to_arg (parm);
1766     }
1767   SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (check_args, n);
1768 
1769   /* If the template expects more parameters we should be able
1770      to use the defaults from our deduced concept.  */
1771   for (; n < TREE_VEC_LENGTH (parms); ++n)
1772     TREE_VEC_ELT (check_args, n) = TREE_VEC_ELT (parms, n);
1773 
1774   /* Associate the constraint.  */
1775   tree check = build_concept_check (tmpl_decl,
1776 				    check_args,
1777 				    tf_warning_or_error);
1778   TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = check;
1779 
1780   return parm_list;
1781 }
1782 
1783 
1784 /* Given the concept check T from a constrained-type-specifier, extract
1785    its TMPL and ARGS.  FIXME why do we need two different forms of
1786    constrained-type-specifier?  */
1787 
1788 void
placeholder_extract_concept_and_args(tree t,tree & tmpl,tree & args)1789 placeholder_extract_concept_and_args (tree t, tree &tmpl, tree &args)
1790 {
1791   if (concept_check_p (t))
1792     {
1793       t = unpack_concept_check (t);
1794       tmpl = TREE_OPERAND (t, 0);
1795       if (TREE_CODE (tmpl) == OVERLOAD)
1796         tmpl = OVL_FIRST (tmpl);
1797       args = TREE_OPERAND (t, 1);
1798       return;
1799     }
1800 
1801   if (TREE_CODE (t) == TYPE_DECL)
1802     {
1803       /* A constrained parameter.  Build a constraint check
1804          based on the prototype parameter and then extract the
1805          arguments from that.  */
1806       tree proto = CONSTRAINED_PARM_PROTOTYPE (t);
1807       tree check = finish_shorthand_constraint (proto, t);
1808       placeholder_extract_concept_and_args (check, tmpl, args);
1809       return;
1810     }
1811 }
1812 
1813 /* Returns true iff the placeholders C1 and C2 are equivalent.  C1
1814    and C2 can be either TEMPLATE_TYPE_PARM or template-ids.  */
1815 
1816 bool
equivalent_placeholder_constraints(tree c1,tree c2)1817 equivalent_placeholder_constraints (tree c1, tree c2)
1818 {
1819   if (c1 && TREE_CODE (c1) == TEMPLATE_TYPE_PARM)
1820     /* A constrained auto.  */
1821     c1 = PLACEHOLDER_TYPE_CONSTRAINTS (c1);
1822   if (c2 && TREE_CODE (c2) == TEMPLATE_TYPE_PARM)
1823     c2 = PLACEHOLDER_TYPE_CONSTRAINTS (c2);
1824 
1825   if (c1 == c2)
1826     return true;
1827   if (!c1 || !c2)
1828     return false;
1829   if (c1 == error_mark_node || c2 == error_mark_node)
1830     /* We get here during satisfaction; when a deduction constraint
1831        fails, substitution can produce an error_mark_node for the
1832        placeholder constraints.  */
1833     return false;
1834 
1835   tree t1, t2, a1, a2;
1836   placeholder_extract_concept_and_args (c1, t1, a1);
1837   placeholder_extract_concept_and_args (c2, t2, a2);
1838 
1839   if (t1 != t2)
1840     return false;
1841 
1842   int len1 = TREE_VEC_LENGTH (a1);
1843   int len2 = TREE_VEC_LENGTH (a2);
1844   if (len1 != len2)
1845     return false;
1846 
1847   /* Skip the first argument so we don't infinitely recurse.
1848      Also, they may differ in template parameter index.  */
1849   for (int i = 1; i < len1; ++i)
1850     {
1851       tree t1 = TREE_VEC_ELT (a1, i);
1852       tree t2 = TREE_VEC_ELT (a2, i);
1853       if (!template_args_equal (t1, t2))
1854       return false;
1855     }
1856   return true;
1857 }
1858 
1859 /* Return a hash value for the placeholder ATOMIC_CONSTR C.  */
1860 
1861 hashval_t
hash_placeholder_constraint(tree c)1862 hash_placeholder_constraint (tree c)
1863 {
1864   tree t, a;
1865   placeholder_extract_concept_and_args (c, t, a);
1866 
1867   /* Like hash_tmpl_and_args, but skip the first argument.  */
1868   hashval_t val = iterative_hash_object (DECL_UID (t), 0);
1869 
1870   for (int i = TREE_VEC_LENGTH (a)-1; i > 0; --i)
1871     val = iterative_hash_template_arg (TREE_VEC_ELT (a, i), val);
1872 
1873   return val;
1874 }
1875 
1876 /* Substitute through the simple requirement.  */
1877 
1878 static tree
tsubst_valid_expression_requirement(tree t,tree args,subst_info info)1879 tsubst_valid_expression_requirement (tree t, tree args, subst_info info)
1880 {
1881   tree r = tsubst_expr (t, args, info.complain, info.in_decl, false);
1882   if (convert_to_void (r, ICV_STATEMENT, info.complain) == error_mark_node)
1883     return error_mark_node;
1884   return r;
1885 }
1886 
1887 
1888 /* Substitute through the simple requirement.  */
1889 
1890 static tree
tsubst_simple_requirement(tree t,tree args,subst_info info)1891 tsubst_simple_requirement (tree t, tree args, subst_info info)
1892 {
1893   tree t0 = TREE_OPERAND (t, 0);
1894   tree expr = tsubst_valid_expression_requirement (t0, args, info);
1895   if (expr == error_mark_node)
1896     return error_mark_node;
1897   return finish_simple_requirement (EXPR_LOCATION (t), expr);
1898 }
1899 
1900 /* Substitute through the type requirement.  */
1901 
1902 static tree
tsubst_type_requirement(tree t,tree args,subst_info info)1903 tsubst_type_requirement (tree t, tree args, subst_info info)
1904 {
1905   tree t0 = TREE_OPERAND (t, 0);
1906   tree type = tsubst (t0, args, info.complain, info.in_decl);
1907   if (type == error_mark_node)
1908     return error_mark_node;
1909   return finish_type_requirement (EXPR_LOCATION (t), type);
1910 }
1911 
1912 /* True if TYPE can be deduced from EXPR.  */
1913 
1914 static bool
type_deducible_p(tree expr,tree type,tree placeholder,tree args,subst_info info)1915 type_deducible_p (tree expr, tree type, tree placeholder, tree args,
1916                   subst_info info)
1917 {
1918   /* Make sure deduction is performed against ( EXPR ), so that
1919      references are preserved in the result.  */
1920   expr = force_paren_expr_uneval (expr);
1921 
1922   /* Replace the constraints with the instantiated constraints. This
1923      substitutes args into any template parameters in the trailing
1924      result type.  */
1925   tree saved_constr = PLACEHOLDER_TYPE_CONSTRAINTS (placeholder);
1926   tree subst_constr
1927     = tsubst_constraint (saved_constr,
1928 			 args,
1929 			 info.complain | tf_partial,
1930 			 info.in_decl);
1931 
1932   if (subst_constr == error_mark_node)
1933     return false;
1934 
1935   PLACEHOLDER_TYPE_CONSTRAINTS (placeholder) = subst_constr;
1936 
1937   /* Temporarily unlink the canonical type.  */
1938   tree saved_type = TYPE_CANONICAL (placeholder);
1939   TYPE_CANONICAL (placeholder) = NULL_TREE;
1940 
1941   tree deduced_type
1942     = do_auto_deduction (type,
1943 			 expr,
1944 			 placeholder,
1945 			 info.complain,
1946 			 adc_requirement);
1947 
1948   PLACEHOLDER_TYPE_CONSTRAINTS (placeholder) = saved_constr;
1949   TYPE_CANONICAL (placeholder) = saved_type;
1950 
1951   if (deduced_type == error_mark_node)
1952     return false;
1953 
1954   return true;
1955 }
1956 
1957 /* True if EXPR can not be converted to TYPE.  */
1958 
1959 static bool
expression_convertible_p(tree expr,tree type,subst_info info)1960 expression_convertible_p (tree expr, tree type, subst_info info)
1961 {
1962   tree conv =
1963     perform_direct_initialization_if_possible (type, expr, false,
1964 					       info.complain);
1965   if (conv == error_mark_node)
1966     return false;
1967   if (conv == NULL_TREE)
1968     {
1969       if (info.complain & tf_error)
1970         {
1971           location_t loc = EXPR_LOC_OR_LOC (expr, input_location);
1972           error_at (loc, "cannot convert %qE to %qT", expr, type);
1973         }
1974       return false;
1975     }
1976   return true;
1977 }
1978 
1979 
1980 /* Substitute through the compound requirement.  */
1981 
1982 static tree
tsubst_compound_requirement(tree t,tree args,subst_info info)1983 tsubst_compound_requirement (tree t, tree args, subst_info info)
1984 {
1985   tree t0 = TREE_OPERAND (t, 0);
1986   tree t1 = TREE_OPERAND (t, 1);
1987   tree expr = tsubst_valid_expression_requirement (t0, args, info);
1988   if (expr == error_mark_node)
1989     return error_mark_node;
1990 
1991   /* Check the noexcept condition.  */
1992   bool noexcept_p = COMPOUND_REQ_NOEXCEPT_P (t);
1993   if (noexcept_p && !expr_noexcept_p (expr, tf_none))
1994     return error_mark_node;
1995 
1996   /* Substitute through the type expression, if any.  */
1997   tree type = tsubst (t1, args, info.complain, info.in_decl);
1998   if (type == error_mark_node)
1999     return error_mark_node;
2000 
2001   subst_info quiet (tf_none, info.in_decl);
2002 
2003   /* Check expression against the result type.  */
2004   if (type)
2005     {
2006       if (tree placeholder = type_uses_auto (type))
2007 	{
2008 	  if (!type_deducible_p (expr, type, placeholder, args, quiet))
2009 	    return error_mark_node;
2010 	}
2011       else if (!expression_convertible_p (expr, type, quiet))
2012 	return error_mark_node;
2013     }
2014 
2015   return finish_compound_requirement (EXPR_LOCATION (t),
2016 				      expr, type, noexcept_p);
2017 }
2018 
2019 static tree
tsubst_nested_requirement(tree t,tree args,subst_info info)2020 tsubst_nested_requirement (tree t, tree args, subst_info info)
2021 {
2022   /* Ensure that we're in an evaluation context prior to satisfaction.  */
2023   tree norm = TREE_VALUE (TREE_TYPE (t));
2024   tree result = satisfy_constraint (norm, args, info);
2025   if (result == error_mark_node && info.quiet ())
2026     {
2027       subst_info noisy (tf_warning_or_error, info.in_decl);
2028       satisfy_constraint (norm, args, noisy);
2029     }
2030   if (result != boolean_true_node)
2031     return error_mark_node;
2032   return result;
2033 }
2034 
2035 /* Substitute ARGS into the requirement T.  */
2036 
2037 static tree
tsubst_requirement(tree t,tree args,subst_info info)2038 tsubst_requirement (tree t, tree args, subst_info info)
2039 {
2040   iloc_sentinel loc_s (cp_expr_location (t));
2041   switch (TREE_CODE (t))
2042     {
2043     case SIMPLE_REQ:
2044       return tsubst_simple_requirement (t, args, info);
2045     case TYPE_REQ:
2046       return tsubst_type_requirement (t, args, info);
2047     case COMPOUND_REQ:
2048       return tsubst_compound_requirement (t, args, info);
2049     case NESTED_REQ:
2050       return tsubst_nested_requirement (t, args, info);
2051     default:
2052       break;
2053     }
2054   gcc_unreachable ();
2055 }
2056 
2057 /* Substitute ARGS into the list of requirements T. Note that
2058    substitution failures here result in ill-formed programs. */
2059 
2060 static tree
tsubst_requirement_body(tree t,tree args,subst_info info)2061 tsubst_requirement_body (tree t, tree args, subst_info info)
2062 {
2063   tree result = NULL_TREE;
2064   while (t)
2065     {
2066       tree req = tsubst_requirement (TREE_VALUE (t), args, info);
2067       if (req == error_mark_node)
2068 	return error_mark_node;
2069       result = tree_cons (NULL_TREE, req, result);
2070       t = TREE_CHAIN (t);
2071     }
2072   return nreverse (result);
2073 }
2074 
2075 static tree
declare_constraint_vars(tree parms,tree vars)2076 declare_constraint_vars (tree parms, tree vars)
2077 {
2078   tree s = vars;
2079   for (tree t = parms; t; t = DECL_CHAIN (t))
2080     {
2081       if (DECL_PACK_P (t))
2082         {
2083           tree pack = extract_fnparm_pack (t, &s);
2084           register_local_specialization (pack, t);
2085         }
2086       else
2087         {
2088           register_local_specialization (s, t);
2089           s = DECL_CHAIN (s);
2090         }
2091     }
2092   return vars;
2093 }
2094 
2095 /* Substitute through as if checking function parameter types. This
2096    will diagnose common parameter type errors.  Returns error_mark_node
2097    if an error occurred.  */
2098 
2099 static tree
check_constaint_variables(tree t,tree args,subst_info info)2100 check_constaint_variables (tree t, tree args, subst_info info)
2101 {
2102   tree types = NULL_TREE;
2103   tree p = t;
2104   while (p && !VOID_TYPE_P (p))
2105     {
2106       types = tree_cons (NULL_TREE, TREE_TYPE (p), types);
2107       p = TREE_CHAIN (p);
2108     }
2109   types = chainon (nreverse (types), void_list_node);
2110   return tsubst_function_parms (types, args, info.complain, info.in_decl);
2111 }
2112 
2113 /* A subroutine of tsubst_parameterized_constraint. Substitute ARGS
2114    into the parameter list T, producing a sequence of constraint
2115    variables, declared in the current scope.
2116 
2117    Note that the caller must establish a local specialization stack
2118    prior to calling this function since this substitution will
2119    declare the substituted parameters. */
2120 
2121 static tree
tsubst_constraint_variables(tree t,tree args,subst_info info)2122 tsubst_constraint_variables (tree t, tree args, subst_info info)
2123 {
2124   /* Perform a trial substitution to check for type errors.  */
2125   tree parms = check_constaint_variables (t, args, info);
2126   if (parms == error_mark_node)
2127     return error_mark_node;
2128 
2129   /* Clear cp_unevaluated_operand across tsubst so that we get a proper chain
2130      of PARM_DECLs.  */
2131   int saved_unevaluated_operand = cp_unevaluated_operand;
2132   cp_unevaluated_operand = 0;
2133   tree vars = tsubst (t, args, info.complain, info.in_decl);
2134   cp_unevaluated_operand = saved_unevaluated_operand;
2135   if (vars == error_mark_node)
2136     return error_mark_node;
2137   return declare_constraint_vars (t, vars);
2138 }
2139 
2140 /* Substitute ARGS into the requires-expression T. [8.4.7]p6. The
2141    substitution of template arguments into a requires-expression
2142    may result in the formation of invalid types or expressions
2143    in its requirements ... In such cases, the expression evaluates
2144    to false; it does not cause the program to be ill-formed.
2145 
2146    However, there are cases where substitution must produce a
2147    new requires-expression, that is not a template constraint.
2148    For example:
2149 
2150         template<typename T>
2151         class X {
2152           template<typename U>
2153           static constexpr bool var = requires (U u) { T::fn(u); };
2154         };
2155 
2156    In the instantiation of X<Y> (assuming Y defines fn), then the
2157    instantiated requires-expression would include Y::fn(u). If any
2158    substitution in the requires-expression fails, we can immediately
2159    fold the expression to false, as would be the case e.g., when
2160    instantiation X<int>.  */
2161 
2162 tree
tsubst_requires_expr(tree t,tree args,tsubst_flags_t complain,tree in_decl)2163 tsubst_requires_expr (tree t, tree args,
2164 		      tsubst_flags_t complain, tree in_decl)
2165 {
2166   local_specialization_stack stack (lss_copy);
2167 
2168   subst_info info (complain, in_decl);
2169 
2170   /* A requires-expression is an unevaluated context.  */
2171   cp_unevaluated u;
2172 
2173   tree parms = TREE_OPERAND (t, 0);
2174   if (parms)
2175     {
2176       parms = tsubst_constraint_variables (parms, args, info);
2177       if (parms == error_mark_node)
2178 	return boolean_false_node;
2179     }
2180 
2181   tree reqs = TREE_OPERAND (t, 1);
2182   reqs = tsubst_requirement_body (reqs, args, info);
2183   if (reqs == error_mark_node)
2184     return boolean_false_node;
2185 
2186   if (processing_template_decl)
2187     return finish_requires_expr (cp_expr_location (t), parms, reqs);
2188 
2189   return boolean_true_node;
2190 }
2191 
2192 /* Substitute ARGS into the constraint information CI, producing a new
2193    constraint record.  */
2194 
2195 tree
tsubst_constraint_info(tree t,tree args,tsubst_flags_t complain,tree in_decl)2196 tsubst_constraint_info (tree t, tree args,
2197                         tsubst_flags_t complain, tree in_decl)
2198 {
2199   if (!t || t == error_mark_node || !check_constraint_info (t))
2200     return NULL_TREE;
2201 
2202   tree tr = tsubst_constraint (CI_TEMPLATE_REQS (t), args, complain, in_decl);
2203   tree dr = tsubst_constraint (CI_DECLARATOR_REQS (t), args, complain, in_decl);
2204   return build_constraints (tr, dr);
2205 }
2206 
2207 /* Substitute through a parameter mapping, in order to get the actual
2208    arguments used to instantiate an atomic constraint.  This may fail
2209    if the substitution into arguments produces something ill-formed.  */
2210 
2211 static tree
tsubst_parameter_mapping(tree map,tree args,subst_info info)2212 tsubst_parameter_mapping (tree map, tree args, subst_info info)
2213 {
2214   if (!map)
2215     return NULL_TREE;
2216 
2217   tsubst_flags_t complain = info.complain;
2218   tree in_decl = info.in_decl;
2219 
2220   tree result = NULL_TREE;
2221   for (tree p = map; p; p = TREE_CHAIN (p))
2222     {
2223       if (p == error_mark_node)
2224         return error_mark_node;
2225       tree parm = TREE_VALUE (p);
2226       tree arg = TREE_PURPOSE (p);
2227       tree new_arg = NULL_TREE;
2228       if (TYPE_P (arg))
2229         {
2230           /* If a template parameter is declared with a placeholder, we can
2231              get those in the argument list if decltype is applied to the
2232              placeholder. For example:
2233 
2234 		template<auto T>
2235 		  requires C<decltype(T)>
2236 		void f() { }
2237 
2238 	     The normalized argument for C will be an auto type, so we'll
2239              need to deduce the actual argument from the corresponding
2240              initializer (whatever argument is provided for T), and use
2241              that result in the instantiated parameter mapping.  */
2242           if (tree auto_node = type_uses_auto (arg))
2243             {
2244               int level;
2245               int index;
2246 	      template_parm_level_and_index (parm, &level, &index);
2247 	      tree init = TMPL_ARG (args, level, index);
2248               new_arg = do_auto_deduction (arg, init, auto_node,
2249 					   complain, adc_variable_type,
2250 					   make_tree_vec (0));
2251             }
2252         }
2253       else if (ARGUMENT_PACK_P (arg))
2254 	new_arg = tsubst_argument_pack (arg, args, complain, in_decl);
2255       if (!new_arg)
2256 	{
2257 	  new_arg = tsubst_template_arg (arg, args, complain, in_decl);
2258 	  if (TYPE_P (new_arg))
2259 	    new_arg = canonicalize_type_argument (new_arg, complain);
2260 	}
2261       if (new_arg == error_mark_node)
2262 	return error_mark_node;
2263 
2264       result = tree_cons (new_arg, parm, result);
2265     }
2266   return nreverse (result);
2267 }
2268 
2269 tree
tsubst_parameter_mapping(tree map,tree args,tsubst_flags_t complain,tree in_decl)2270 tsubst_parameter_mapping (tree map, tree args, tsubst_flags_t complain, tree in_decl)
2271 {
2272   return tsubst_parameter_mapping (map, args, subst_info (complain, in_decl));
2273 }
2274 
2275 /*---------------------------------------------------------------------------
2276                         Constraint satisfaction
2277 ---------------------------------------------------------------------------*/
2278 
2279 /* Hash functions for satisfaction entries.  */
2280 
2281 struct GTY((for_user)) sat_entry
2282 {
2283   tree constr;
2284   tree args;
2285   tree result;
2286 };
2287 
2288 struct sat_hasher : ggc_ptr_hash<sat_entry>
2289 {
hashsat_hasher2290   static hashval_t hash (sat_entry *e)
2291   {
2292     hashval_t value = hash_atomic_constraint (e->constr);
2293     return iterative_hash_template_arg (e->args, value);
2294   }
2295 
equalsat_hasher2296   static bool equal (sat_entry *e1, sat_entry *e2)
2297   {
2298     if (!atomic_constraints_identical_p (e1->constr, e2->constr))
2299       return false;
2300     return template_args_equal (e1->args, e2->args);
2301   }
2302 };
2303 
2304 /* Cache the result of satisfy_atom.  */
2305 static GTY((deletable)) hash_table<sat_hasher> *sat_cache;
2306 
2307 /* Cache the result of constraint_satisfaction_value.  */
2308 static GTY((deletable)) hash_map<tree, tree> *decl_satisfied_cache;
2309 
2310 static tree
get_satisfaction(tree constr,tree args)2311 get_satisfaction (tree constr, tree args)
2312 {
2313   if (!sat_cache)
2314     return NULL_TREE;
2315   sat_entry elt = { constr, args, NULL_TREE };
2316   sat_entry* found = sat_cache->find (&elt);
2317   if (found)
2318     return found->result;
2319   else
2320     return NULL_TREE;
2321 }
2322 
2323 static void
save_satisfaction(tree constr,tree args,tree result)2324 save_satisfaction (tree constr, tree args, tree result)
2325 {
2326   if (!sat_cache)
2327     sat_cache = hash_table<sat_hasher>::create_ggc (31);
2328   sat_entry elt = {constr, args, result};
2329   sat_entry** slot = sat_cache->find_slot (&elt, INSERT);
2330   sat_entry* entry = ggc_alloc<sat_entry> ();
2331   *entry = elt;
2332   *slot = entry;
2333 }
2334 
2335 void
clear_satisfaction_cache()2336 clear_satisfaction_cache ()
2337 {
2338   if (sat_cache)
2339     sat_cache->empty ();
2340   if (decl_satisfied_cache)
2341     decl_satisfied_cache->empty ();
2342 }
2343 
2344 /* A tool to help manage satisfaction caching in satisfy_constraint_r.
2345    Note the cache is only used when not diagnosing errors.  */
2346 
2347 struct satisfaction_cache
2348 {
satisfaction_cachesatisfaction_cache2349   satisfaction_cache (tree constr, tree args, tsubst_flags_t complain)
2350     : constr(constr), args(args), complain(complain)
2351   { }
2352 
getsatisfaction_cache2353   tree get ()
2354   {
2355     if (complain == tf_none)
2356       return get_satisfaction (constr, args);
2357     return NULL_TREE;
2358   }
2359 
savesatisfaction_cache2360   tree save (tree result)
2361   {
2362     if (complain == tf_none)
2363       save_satisfaction (constr, args, result);
2364     return result;
2365   }
2366 
2367   tree constr;
2368   tree args;
2369   tsubst_flags_t complain;
2370 };
2371 
2372 static int satisfying_constraint = 0;
2373 
2374 /* Returns true if we are currently satisfying a constraint.
2375 
2376    This is used to guard against recursive calls to evaluate_concept_check
2377    during template argument substitution.
2378 
2379    TODO: Do we need this now that we fully normalize prior to evaluation?
2380    I think not. */
2381 
2382 bool
satisfying_constraint_p()2383 satisfying_constraint_p ()
2384 {
2385   return satisfying_constraint;
2386 }
2387 
2388 /* Substitute ARGS into constraint-expression T during instantiation of
2389    a member of a class template.  */
2390 
2391 tree
tsubst_constraint(tree t,tree args,tsubst_flags_t complain,tree in_decl)2392 tsubst_constraint (tree t, tree args, tsubst_flags_t complain, tree in_decl)
2393 {
2394   /* We also don't want to evaluate concept-checks when substituting the
2395      constraint-expressions of a declaration.  */
2396   processing_constraint_expression_sentinel s;
2397   tree expr = tsubst_expr (t, args, complain, in_decl, false);
2398   return expr;
2399 }
2400 
2401 static tree satisfy_constraint_r (tree, tree, subst_info info);
2402 
2403 /* Compute the satisfaction of a conjunction.  */
2404 
2405 static tree
satisfy_conjunction(tree t,tree args,subst_info info)2406 satisfy_conjunction (tree t, tree args, subst_info info)
2407 {
2408   tree lhs = satisfy_constraint_r (TREE_OPERAND (t, 0), args, info);
2409   if (lhs == error_mark_node || lhs == boolean_false_node)
2410     return lhs;
2411   return satisfy_constraint_r (TREE_OPERAND (t, 1), args, info);
2412 }
2413 
2414 /* The current depth at which we're replaying an error during recursive
2415    diagnosis of a constraint satisfaction failure.  */
2416 
2417 static int current_constraint_diagnosis_depth;
2418 
2419 /* Whether CURRENT_CONSTRAINT_DIAGNOSIS_DEPTH has ever exceeded
2420    CONCEPTS_DIAGNOSTICS_MAX_DEPTH during recursive diagnosis of a constraint
2421    satisfaction error.  */
2422 
2423 static bool concepts_diagnostics_max_depth_exceeded_p;
2424 
2425 /* Recursive subroutine of collect_operands_of_disjunction.  T is a normalized
2426    subexpression of a constraint (composed of CONJ_CONSTRs and DISJ_CONSTRs)
2427    and E is the corresponding unnormalized subexpression (composed of
2428    TRUTH_ANDIF_EXPRs and TRUTH_ORIF_EXPRs).  */
2429 
2430 static void
collect_operands_of_disjunction_r(tree t,tree e,auto_vec<tree_pair> * operands)2431 collect_operands_of_disjunction_r (tree t, tree e,
2432 				   auto_vec<tree_pair> *operands)
2433 {
2434   if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
2435     {
2436       collect_operands_of_disjunction_r (TREE_OPERAND (t, 0),
2437 					 TREE_OPERAND (e, 0), operands);
2438       collect_operands_of_disjunction_r (TREE_OPERAND (t, 1),
2439 					 TREE_OPERAND (e, 1), operands);
2440     }
2441   else
2442     {
2443       tree_pair p = std::make_pair (t, e);
2444       operands->safe_push (p);
2445     }
2446 }
2447 
2448 /* Recursively collect the normalized and unnormalized operands of the
2449    disjunction T and append them to OPERANDS in order.  */
2450 
2451 static void
collect_operands_of_disjunction(tree t,auto_vec<tree_pair> * operands)2452 collect_operands_of_disjunction (tree t, auto_vec<tree_pair> *operands)
2453 {
2454   collect_operands_of_disjunction_r (t, CONSTR_EXPR (t), operands);
2455 }
2456 
2457 /* Compute the satisfaction of a disjunction.  */
2458 
2459 static tree
satisfy_disjunction(tree t,tree args,subst_info info)2460 satisfy_disjunction (tree t, tree args, subst_info info)
2461 {
2462   /* Evaluate the operands quietly.  */
2463   subst_info quiet (tf_none, NULL_TREE);
2464 
2465   /* Register the constraint for diagnostics, if needed.  */
2466   diagnosing_failed_constraint failure (t, args, info.noisy ());
2467 
2468   tree lhs = satisfy_constraint_r (TREE_OPERAND (t, 0), args, quiet);
2469   if (lhs == boolean_true_node)
2470     return boolean_true_node;
2471   tree rhs = satisfy_constraint_r (TREE_OPERAND (t, 1), args, quiet);
2472   if (rhs != boolean_true_node && info.noisy ())
2473     {
2474       cp_expr disj_expr = CONSTR_EXPR (t);
2475       inform (disj_expr.get_location (),
2476 	      "no operand of the disjunction is satisfied");
2477       if (diagnosing_failed_constraint::replay_errors_p ())
2478 	{
2479 	  /* Replay the error in each branch of the disjunction.  */
2480 	  auto_vec<tree_pair> operands;
2481 	  collect_operands_of_disjunction (t, &operands);
2482 	  for (unsigned i = 0; i < operands.length (); i++)
2483 	    {
2484 	      tree norm_op = operands[i].first;
2485 	      tree op = operands[i].second;
2486 	      location_t loc = make_location (cp_expr_location (op),
2487 					      disj_expr.get_start (),
2488 					      disj_expr.get_finish ());
2489 	      inform (loc, "the operand %qE is unsatisfied because", op);
2490 	      satisfy_constraint_r (norm_op, args, info);
2491 	    }
2492 	}
2493     }
2494   return rhs;
2495 }
2496 
2497 /* Ensures that T is a truth value and not (accidentally, as sometimes
2498    happens) an integer value.  */
2499 
2500 tree
satisfaction_value(tree t)2501 satisfaction_value (tree t)
2502 {
2503   if (t == error_mark_node || t == boolean_true_node || t == boolean_false_node)
2504     return t;
2505   gcc_assert (TREE_CODE (t) == INTEGER_CST);
2506   if (integer_onep (t))
2507     return boolean_true_node;
2508   if (integer_zerop (t))
2509     return boolean_false_node;
2510 
2511   /* Anything else should be invalid.  */
2512   gcc_assert (false);
2513 }
2514 
2515 /* Build a new template argument list with template arguments corresponding
2516    to the parameters used in an atomic constraint.  */
2517 
2518 tree
get_mapped_args(tree map)2519 get_mapped_args (tree map)
2520 {
2521   /* No map, no arguments.  */
2522   if (!map)
2523     return NULL_TREE;
2524 
2525   /* Find the mapped parameter with the highest level.  */
2526   int count = 0;
2527   for (tree p = map; p; p = TREE_CHAIN (p))
2528     {
2529       int level;
2530       int index;
2531       template_parm_level_and_index (TREE_VALUE (p), &level, &index);
2532       if (level > count)
2533         count = level;
2534     }
2535 
2536   /* Place each argument at its corresponding position in the argument
2537      list. Note that the list will be sparse (not all arguments supplied),
2538      but instantiation is guaranteed to only use the parameters in the
2539      mapping, so null arguments would never be used.  */
2540   auto_vec< vec<tree> > lists (count);
2541   lists.quick_grow_cleared (count);
2542   for (tree p = map; p; p = TREE_CHAIN (p))
2543     {
2544       int level;
2545       int index;
2546       template_parm_level_and_index (TREE_VALUE (p), &level, &index);
2547 
2548       /* Insert the argument into its corresponding position.  */
2549       vec<tree> &list = lists[level - 1];
2550       if (index >= (int)list.length ())
2551 	list.safe_grow_cleared (index + 1);
2552       list[index] = TREE_PURPOSE (p);
2553     }
2554 
2555   /* Build the new argument list.  */
2556   tree args = make_tree_vec (lists.length ());
2557   for (unsigned i = 0; i != lists.length (); ++i)
2558     {
2559       vec<tree> &list = lists[i];
2560       tree level = make_tree_vec (list.length ());
2561       for (unsigned j = 0; j < list.length(); ++j)
2562 	TREE_VEC_ELT (level, j) = list[j];
2563       SET_TMPL_ARGS_LEVEL (args, i + 1, level);
2564       list.release ();
2565     }
2566   SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (args, 0);
2567 
2568   return args;
2569 }
2570 
2571 static void diagnose_atomic_constraint (tree, tree, tree, subst_info);
2572 
2573 /* Compute the satisfaction of an atomic constraint.  */
2574 
2575 static tree
satisfy_atom(tree t,tree args,subst_info info)2576 satisfy_atom (tree t, tree args, subst_info info)
2577 {
2578   satisfaction_cache cache (t, args, info.complain);
2579   if (tree r = cache.get ())
2580     return r;
2581 
2582   /* Perform substitution quietly.  */
2583   subst_info quiet (tf_none, NULL_TREE);
2584 
2585   /* In case there is a diagnostic, we want to establish the context
2586      prior to printing errors.  If no errors occur, this context is
2587      removed before returning.  */
2588   diagnosing_failed_constraint failure (t, args, info.noisy ());
2589 
2590   /* Instantiate the parameter mapping.  */
2591   tree map = tsubst_parameter_mapping (ATOMIC_CONSTR_MAP (t), args, quiet);
2592   if (map == error_mark_node)
2593     {
2594       /* If instantiation of the parameter mapping fails, the program
2595          is ill-formed.  */
2596       if (info.noisy())
2597 	tsubst_parameter_mapping (ATOMIC_CONSTR_MAP (t), args, info);
2598       return cache.save (boolean_false_node);
2599     }
2600 
2601   /* Rebuild the argument vector from the parameter mapping.  */
2602   args = get_mapped_args (map);
2603 
2604   /* Apply the parameter mapping (i.e., just substitute).  */
2605   tree expr = ATOMIC_CONSTR_EXPR (t);
2606   tree result = tsubst_expr (expr, args, quiet.complain, quiet.in_decl, false);
2607   if (result == error_mark_node)
2608     {
2609       /* If substitution results in an invalid type or expression, the constraint
2610 	 is not satisfied. Replay the substitution.  */
2611       if (info.noisy ())
2612 	tsubst_expr (expr, args, info.complain, info.in_decl, false);
2613       return cache.save (boolean_false_node);
2614     }
2615 
2616   /* [17.4.1.2] ... lvalue-to-rvalue conversion is performed as necessary,
2617      and EXPR shall be a constant expression of type bool.  */
2618   result = force_rvalue (result, info.complain);
2619   if (result == error_mark_node)
2620     return cache.save (error_mark_node);
2621   if (!same_type_p (TREE_TYPE (result), boolean_type_node))
2622     {
2623       if (info.noisy ())
2624 	diagnose_atomic_constraint (t, map, result, info);
2625       return cache.save (error_mark_node);
2626     }
2627 
2628   /* Compute the value of the constraint.  */
2629   if (info.noisy ())
2630     result = cxx_constant_value (result);
2631   else
2632     {
2633       result = maybe_constant_value (result, NULL_TREE,
2634 				     /*manifestly_const_eval=*/true);
2635       if (!TREE_CONSTANT (result))
2636 	result = error_mark_node;
2637     }
2638   result = satisfaction_value (result);
2639   if (result == boolean_false_node && info.noisy ())
2640     diagnose_atomic_constraint (t, map, result, info);
2641 
2642   return cache.save (result);
2643 }
2644 
2645 /* Determine if the normalized constraint T is satisfied.
2646    Returns boolean_true_node if the expression/constraint is
2647    satisfied, boolean_false_node if not, and error_mark_node
2648    if the there was an error evaluating the constraint.
2649 
2650    The parameter mapping of atomic constraints is simply the
2651    set of template arguments that will be substituted into
2652    the expression, regardless of template parameters appearing
2653    withing. Whether a template argument is used in the atomic
2654    constraint only matters for subsumption.  */
2655 
2656 static tree
satisfy_constraint_r(tree t,tree args,subst_info info)2657 satisfy_constraint_r (tree t, tree args, subst_info info)
2658 {
2659   if (t == error_mark_node)
2660     return error_mark_node;
2661 
2662   switch (TREE_CODE (t))
2663     {
2664     case CONJ_CONSTR:
2665       return satisfy_conjunction (t, args, info);
2666     case DISJ_CONSTR:
2667       return satisfy_disjunction (t, args, info);
2668     case ATOMIC_CONSTR:
2669       return satisfy_atom (t, args, info);
2670     default:
2671       gcc_unreachable ();
2672     }
2673 }
2674 
2675 /* Check that the normalized constraint T is satisfied for ARGS.  */
2676 
2677 static tree
satisfy_constraint(tree t,tree args,subst_info info)2678 satisfy_constraint (tree t, tree args, subst_info info)
2679 {
2680   auto_timevar time (TV_CONSTRAINT_SAT);
2681 
2682   /* Turn off template processing. Constraint satisfaction only applies
2683      to non-dependent terms, so we want to ensure full checking here.  */
2684   processing_template_decl_sentinel proc (true);
2685 
2686   /* We need to check access during satisfaction.  */
2687   deferring_access_check_sentinel acs (dk_no_deferred);
2688 
2689   return satisfy_constraint_r (t, args, info);
2690 }
2691 
2692 /* Check the normalized constraints T against ARGS, returning a satisfaction
2693    value (either true, false, or error).  */
2694 
2695 static tree
satisfy_associated_constraints(tree t,tree args,subst_info info)2696 satisfy_associated_constraints (tree t, tree args, subst_info info)
2697 {
2698   /* If there are no constraints then this is trivially satisfied.  */
2699   if (!t)
2700     return boolean_true_node;
2701 
2702   /* If any arguments depend on template parameters, we can't
2703      check constraints. Pretend they're satisfied for now.  */
2704   if (args && uses_template_parms (args))
2705     return boolean_true_node;
2706 
2707   return satisfy_constraint (t, args, info);
2708 }
2709 
2710 /* Evaluate EXPR as a constraint expression using ARGS, returning a
2711    satisfaction value. */
2712 
2713 static tree
satisfy_constraint_expression(tree t,tree args,subst_info info)2714 satisfy_constraint_expression (tree t, tree args, subst_info info)
2715 {
2716   if (t == error_mark_node)
2717     return error_mark_node;
2718 
2719   gcc_assert (EXPR_P (t));
2720 
2721   /* Get the normalized constraints.  */
2722   tree norm;
2723   if (args == NULL_TREE && concept_check_p (t))
2724     {
2725       tree id = unpack_concept_check (t);
2726       args = TREE_OPERAND (id, 1);
2727       tree tmpl = get_concept_check_template (id);
2728       norm = normalize_concept_definition (tmpl, info.noisy ());
2729     }
2730   else
2731     norm = normalize_constraint_expression (t, info.noisy ());
2732 
2733   /* Perform satisfaction.  */
2734   return satisfy_constraint (norm, args, info);
2735 }
2736 
2737 /* Used only to evaluate requires-expressions during constant expression
2738    evaluation.  */
2739 
2740 tree
satisfy_constraint_expression(tree expr)2741 satisfy_constraint_expression (tree expr)
2742 {
2743   subst_info info (tf_none, NULL_TREE);
2744   return satisfy_constraint_expression (expr, NULL_TREE, info);
2745 }
2746 
2747 static tree
satisfy_declaration_constraints(tree t,subst_info info)2748 satisfy_declaration_constraints (tree t, subst_info info)
2749 {
2750   gcc_assert (DECL_P (t));
2751   const tree saved_t = t;
2752 
2753   /* For inherited constructors, consider the original declaration;
2754      it has the correct template information attached. */
2755   t = strip_inheriting_ctors (t);
2756   tree inh_ctor_targs = NULL_TREE;
2757   if (t != saved_t)
2758     if (tree ti = DECL_TEMPLATE_INFO (saved_t))
2759       /* The inherited constructor points to an instantiation of a constructor
2760 	 template; remember its template arguments.  */
2761       inh_ctor_targs = TI_ARGS (ti);
2762 
2763   /* Update the declaration for diagnostics.  */
2764   info.in_decl = t;
2765 
2766   if (info.quiet ())
2767     if (tree *result = hash_map_safe_get (decl_satisfied_cache, saved_t))
2768       return *result;
2769 
2770   /* Get the normalized constraints.  */
2771   tree norm = NULL_TREE;
2772   tree args = NULL_TREE;
2773   if (tree ti = DECL_TEMPLATE_INFO (t))
2774     {
2775       tree tmpl = TI_TEMPLATE (ti);
2776       norm = normalize_template_requirements (tmpl, info.noisy ());
2777 
2778       /* The initial parameter mapping is the complete set of
2779 	 template arguments substituted into the declaration.  */
2780       args = TI_ARGS (ti);
2781       if (inh_ctor_targs)
2782 	args = add_outermost_template_args (args, inh_ctor_targs);
2783     }
2784   else
2785     {
2786       /* These should be empty until we allow constraints on non-templates.  */
2787       norm = normalize_nontemplate_requirements (t, info.noisy ());
2788     }
2789 
2790   tree result = boolean_true_node;
2791   if (norm)
2792     {
2793       if (!push_tinst_level (t))
2794 	return result;
2795       push_access_scope (t);
2796       result = satisfy_associated_constraints (norm, args, info);
2797       pop_access_scope (t);
2798       pop_tinst_level ();
2799     }
2800 
2801   if (info.quiet ())
2802     hash_map_safe_put<hm_ggc> (decl_satisfied_cache, saved_t, result);
2803 
2804   return result;
2805 }
2806 
2807 static tree
satisfy_declaration_constraints(tree t,tree args,subst_info info)2808 satisfy_declaration_constraints (tree t, tree args, subst_info info)
2809 {
2810   /* Update the declaration for diagnostics.  */
2811   info.in_decl = t;
2812 
2813   gcc_assert (TREE_CODE (t) == TEMPLATE_DECL);
2814   if (tree norm = normalize_template_requirements (t, info.noisy ()))
2815     {
2816       tree pattern = DECL_TEMPLATE_RESULT (t);
2817       push_access_scope (pattern);
2818       tree result = satisfy_associated_constraints (norm, args, info);
2819       pop_access_scope (pattern);
2820       return result;
2821     }
2822 
2823   return boolean_true_node;
2824 }
2825 
2826 static tree
constraint_satisfaction_value(tree t,tsubst_flags_t complain)2827 constraint_satisfaction_value (tree t, tsubst_flags_t complain)
2828 {
2829   subst_info info (complain, NULL_TREE);
2830   tree r;
2831   if (DECL_P (t))
2832     r = satisfy_declaration_constraints (t, info);
2833   else
2834     r = satisfy_constraint_expression (t, NULL_TREE, info);
2835   if (r == error_mark_node && info.quiet ()
2836       && !(DECL_P (t) && TREE_NO_WARNING (t)))
2837       {
2838 	constraint_satisfaction_value (t, tf_warning_or_error);
2839 	if (DECL_P (t))
2840 	  /* Avoid giving these errors again.  */
2841 	  TREE_NO_WARNING (t) = true;
2842       }
2843   return r;
2844 }
2845 
2846 static tree
constraint_satisfaction_value(tree t,tree args,tsubst_flags_t complain)2847 constraint_satisfaction_value (tree t, tree args, tsubst_flags_t complain)
2848 {
2849   subst_info info (complain, NULL_TREE);
2850   tree r;
2851   if (DECL_P (t))
2852     r = satisfy_declaration_constraints (t, args, info);
2853   else
2854     r = satisfy_constraint_expression (t, args, info);
2855   if (r == error_mark_node && info.quiet ())
2856     constraint_satisfaction_value (t, args, tf_warning_or_error);
2857   return r;
2858 }
2859 
2860 /* True iff the result of satisfying T is BOOLEAN_TRUE_NODE and false
2861    otherwise, even in the case of errors.  */
2862 
2863 bool
constraints_satisfied_p(tree t)2864 constraints_satisfied_p (tree t)
2865 {
2866   if (!flag_concepts)
2867     return true;
2868 
2869   return constraint_satisfaction_value (t, tf_none) == boolean_true_node;
2870 }
2871 
2872 /* True iff the result of satisfying T with ARGS is BOOLEAN_TRUE_NODE
2873     and false otherwise, even in the case of errors.  */
2874 
2875 bool
constraints_satisfied_p(tree t,tree args)2876 constraints_satisfied_p (tree t, tree args)
2877 {
2878   if (!flag_concepts)
2879     return true;
2880 
2881   return constraint_satisfaction_value (t, args, tf_none) == boolean_true_node;
2882 }
2883 
2884 /* Evaluate a concept check of the form C<ARGS>. This is only used for the
2885    evaluation of template-ids as id-expressions.  */
2886 
2887 tree
evaluate_concept_check(tree check,tsubst_flags_t complain)2888 evaluate_concept_check (tree check, tsubst_flags_t complain)
2889 {
2890   if (check == error_mark_node)
2891     return error_mark_node;
2892 
2893   gcc_assert (concept_check_p (check));
2894 
2895   /* Check for satisfaction without diagnostics.  */
2896   subst_info quiet (tf_none, NULL_TREE);
2897   tree result = satisfy_constraint_expression (check, NULL_TREE, quiet);
2898   if (result == error_mark_node && (complain & tf_error))
2899   {
2900     /* Replay the error with re-normalized requirements.  */
2901     subst_info noisy (tf_warning_or_error, NULL_TREE);
2902     satisfy_constraint_expression (check, NULL_TREE, noisy);
2903   }
2904   return result;
2905 }
2906 
2907 /*---------------------------------------------------------------------------
2908                 Semantic analysis of requires-expressions
2909 ---------------------------------------------------------------------------*/
2910 
2911 /* Finish a requires expression for the given PARMS (possibly
2912    null) and the non-empty sequence of requirements.  */
2913 
2914 tree
finish_requires_expr(location_t loc,tree parms,tree reqs)2915 finish_requires_expr (location_t loc, tree parms, tree reqs)
2916 {
2917   /* Modify the declared parameters by removing their context
2918      so they don't refer to the enclosing scope and explicitly
2919      indicating that they are constraint variables. */
2920   for (tree parm = parms; parm; parm = DECL_CHAIN (parm))
2921     {
2922       DECL_CONTEXT (parm) = NULL_TREE;
2923       CONSTRAINT_VAR_P (parm) = true;
2924     }
2925 
2926   /* Build the node. */
2927   tree r = build_min (REQUIRES_EXPR, boolean_type_node, parms, reqs);
2928   TREE_SIDE_EFFECTS (r) = false;
2929   TREE_CONSTANT (r) = true;
2930   SET_EXPR_LOCATION (r, loc);
2931   return r;
2932 }
2933 
2934 /* Construct a requirement for the validity of EXPR.   */
2935 
2936 tree
finish_simple_requirement(location_t loc,tree expr)2937 finish_simple_requirement (location_t loc, tree expr)
2938 {
2939   tree r = build_nt (SIMPLE_REQ, expr);
2940   SET_EXPR_LOCATION (r, loc);
2941   return r;
2942 }
2943 
2944 /* Construct a requirement for the validity of TYPE.  */
2945 
2946 tree
finish_type_requirement(location_t loc,tree type)2947 finish_type_requirement (location_t loc, tree type)
2948 {
2949   tree r = build_nt (TYPE_REQ, type);
2950   SET_EXPR_LOCATION (r, loc);
2951   return r;
2952 }
2953 
2954 /* Construct a requirement for the validity of EXPR, along with
2955    its properties. if TYPE is non-null, then it specifies either
2956    an implicit conversion or argument deduction constraint,
2957    depending on whether any placeholders occur in the type name.
2958    NOEXCEPT_P is true iff the noexcept keyword was specified.  */
2959 
2960 tree
finish_compound_requirement(location_t loc,tree expr,tree type,bool noexcept_p)2961 finish_compound_requirement (location_t loc, tree expr, tree type, bool noexcept_p)
2962 {
2963   tree req = build_nt (COMPOUND_REQ, expr, type);
2964   SET_EXPR_LOCATION (req, loc);
2965   COMPOUND_REQ_NOEXCEPT_P (req) = noexcept_p;
2966   return req;
2967 }
2968 
2969 /* Finish a nested requirement.  */
2970 
2971 tree
finish_nested_requirement(location_t loc,tree expr)2972 finish_nested_requirement (location_t loc, tree expr)
2973 {
2974   /* Currently open template headers have dummy arg vectors, so don't
2975      pass into normalization.  */
2976   tree norm = normalize_constraint_expression (expr, NULL_TREE, false);
2977   tree args = current_template_parms
2978     ? template_parms_to_args (current_template_parms) : NULL_TREE;
2979 
2980   /* Save the normalized constraint and complete set of normalization
2981      arguments with the requirement.  We keep the complete set of arguments
2982      around for re-normalization during diagnostics.  */
2983   tree info = build_tree_list (args, norm);
2984 
2985   /* Build the constraint, saving its normalization as its type.  */
2986   tree r = build1 (NESTED_REQ, info, expr);
2987   SET_EXPR_LOCATION (r, loc);
2988   return r;
2989 }
2990 
2991 /* Check that FN satisfies the structural requirements of a
2992    function concept definition.  */
2993 tree
check_function_concept(tree fn)2994 check_function_concept (tree fn)
2995 {
2996   /* Check that the function is comprised of only a return statement.  */
2997   tree body = DECL_SAVED_TREE (fn);
2998   if (TREE_CODE (body) == BIND_EXPR)
2999     body = BIND_EXPR_BODY (body);
3000 
3001   /* Sometimes a function call results in the creation of clean up
3002      points. Allow these to be preserved in the body of the
3003      constraint, as we might actually need them for some constexpr
3004      evaluations.  */
3005   if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
3006     body = TREE_OPERAND (body, 0);
3007 
3008   /* Check that the definition is written correctly.  */
3009   if (TREE_CODE (body) != RETURN_EXPR)
3010     {
3011       location_t loc = DECL_SOURCE_LOCATION (fn);
3012       if (TREE_CODE (body) == STATEMENT_LIST && !STATEMENT_LIST_HEAD (body))
3013 	{
3014 	  if (seen_error ())
3015 	    /* The definition was probably erroneous, not empty.  */;
3016 	  else
3017 	    error_at (loc, "definition of concept %qD is empty", fn);
3018 	}
3019       else
3020         error_at (loc, "definition of concept %qD has multiple statements", fn);
3021     }
3022 
3023   return NULL_TREE;
3024 }
3025 
3026 
3027 // Check that a constrained friend declaration function declaration,
3028 // FN, is admissible. This is the case only when the declaration depends
3029 // on template parameters and does not declare a specialization.
3030 void
check_constrained_friend(tree fn,tree reqs)3031 check_constrained_friend (tree fn, tree reqs)
3032 {
3033   if (fn == error_mark_node)
3034     return;
3035   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
3036 
3037   // If there are not constraints, this cannot be an error.
3038   if (!reqs)
3039     return;
3040 
3041   // Constrained friend functions that don't depend on template
3042   // arguments are effectively meaningless.
3043   if (!uses_template_parms (TREE_TYPE (fn)))
3044     {
3045       error_at (location_of (fn),
3046 		"constrained friend does not depend on template parameters");
3047       return;
3048     }
3049 }
3050 
3051 /*---------------------------------------------------------------------------
3052                         Equivalence of constraints
3053 ---------------------------------------------------------------------------*/
3054 
3055 /* Returns true when A and B are equivalent constraints.  */
3056 bool
equivalent_constraints(tree a,tree b)3057 equivalent_constraints (tree a, tree b)
3058 {
3059   gcc_assert (!a || TREE_CODE (a) == CONSTRAINT_INFO);
3060   gcc_assert (!b || TREE_CODE (b) == CONSTRAINT_INFO);
3061   return cp_tree_equal (a, b);
3062 }
3063 
3064 /* Returns true if the template declarations A and B have equivalent
3065    constraints. This is the case when A's constraints subsume B's and
3066    when B's also constrain A's.  */
3067 bool
equivalently_constrained(tree d1,tree d2)3068 equivalently_constrained (tree d1, tree d2)
3069 {
3070   gcc_assert (TREE_CODE (d1) == TREE_CODE (d2));
3071   return equivalent_constraints (get_constraints (d1), get_constraints (d2));
3072 }
3073 
3074 /*---------------------------------------------------------------------------
3075                      Partial ordering of constraints
3076 ---------------------------------------------------------------------------*/
3077 
3078 /* Returns true when the constraints in A subsume those in B.  */
3079 
3080 bool
subsumes_constraints(tree a,tree b)3081 subsumes_constraints (tree a, tree b)
3082 {
3083   gcc_assert (!a || TREE_CODE (a) == CONSTRAINT_INFO);
3084   gcc_assert (!b || TREE_CODE (b) == CONSTRAINT_INFO);
3085   return subsumes (a, b);
3086 }
3087 
3088 /* Returns true when the constraints in CI (with arguments
3089    ARGS) strictly subsume the associated constraints of TMPL.  */
3090 
3091 bool
strictly_subsumes(tree ci,tree args,tree tmpl)3092 strictly_subsumes (tree ci, tree args, tree tmpl)
3093 {
3094   tree n1 = get_normalized_constraints_from_info (ci, args, NULL_TREE);
3095   tree n2 = get_normalized_constraints_from_decl (tmpl);
3096 
3097   return subsumes (n1, n2) && !subsumes (n2, n1);
3098 }
3099 
3100 /* REturns true when the constraints in CI (with arguments ARGS) subsume
3101    the associated constraints of TMPL.  */
3102 
3103 bool
weakly_subsumes(tree ci,tree args,tree tmpl)3104 weakly_subsumes (tree ci, tree args, tree tmpl)
3105 {
3106   tree n1 = get_normalized_constraints_from_info (ci, args, NULL_TREE);
3107   tree n2 = get_normalized_constraints_from_decl (tmpl);
3108 
3109   return subsumes (n1, n2);
3110 }
3111 
3112 /* Determines which of the declarations, A or B, is more constrained.
3113    That is, which declaration's constraints subsume but are not subsumed
3114    by the other's?
3115 
3116    Returns 1 if D1 is more constrained than D2, -1 if D2 is more constrained
3117    than D1, and 0 otherwise. */
3118 
3119 int
more_constrained(tree d1,tree d2)3120 more_constrained (tree d1, tree d2)
3121 {
3122   tree n1 = get_normalized_constraints_from_decl (d1);
3123   tree n2 = get_normalized_constraints_from_decl (d2);
3124 
3125   int winner = 0;
3126   if (subsumes (n1, n2))
3127     ++winner;
3128   if (subsumes (n2, n1))
3129     --winner;
3130   return winner;
3131 }
3132 
3133 /* Return whether D1 is at least as constrained as D2.  */
3134 
3135 bool
at_least_as_constrained(tree d1,tree d2)3136 at_least_as_constrained (tree d1, tree d2)
3137 {
3138   tree n1 = get_normalized_constraints_from_decl (d1);
3139   tree n2 = get_normalized_constraints_from_decl (d2);
3140 
3141   return subsumes (n1, n2);
3142 }
3143 
3144 /*---------------------------------------------------------------------------
3145                         Constraint diagnostics
3146 ---------------------------------------------------------------------------*/
3147 
3148 /* Returns the best location to diagnose a constraint error.  */
3149 
3150 static location_t
get_constraint_error_location(tree t)3151 get_constraint_error_location (tree t)
3152 {
3153   if (location_t loc = cp_expr_location (t))
3154     return loc;
3155 
3156   /* If we have a specific location give it.  */
3157   tree expr = CONSTR_EXPR (t);
3158   if (location_t loc = cp_expr_location (expr))
3159     return loc;
3160 
3161   /* If the constraint is normalized from a requires-clause, give
3162      the location as that of the constrained declaration.  */
3163   tree cxt = CONSTR_CONTEXT (t);
3164   tree src = cxt ? TREE_VALUE (cxt) : NULL_TREE;
3165   if (!src)
3166     /* TODO: This only happens for constrained non-template declarations.  */
3167     ;
3168   else if (DECL_P (src))
3169     return DECL_SOURCE_LOCATION (src);
3170   /* Otherwise, give the location as the defining concept.  */
3171   else if (concept_check_p (src))
3172     {
3173       tree id = unpack_concept_check (src);
3174       tree tmpl = TREE_OPERAND (id, 0);
3175       if (OVL_P (tmpl))
3176 	tmpl = OVL_FIRST (tmpl);
3177       return DECL_SOURCE_LOCATION (tmpl);
3178     }
3179 
3180   return input_location;
3181 }
3182 
3183 /* Emit a diagnostic for a failed trait.  */
3184 
3185 void
diagnose_trait_expr(tree expr,tree map)3186 diagnose_trait_expr (tree expr, tree map)
3187 {
3188   location_t loc = cp_expr_location (expr);
3189   tree args = get_mapped_args (map);
3190 
3191   /* Build a "fake" version of the instantiated trait, so we can
3192      get the instantiated types from result.  */
3193   ++processing_template_decl;
3194   expr = tsubst_expr (expr, args, tf_none, NULL_TREE, false);
3195   --processing_template_decl;
3196 
3197   tree t1 = TRAIT_EXPR_TYPE1 (expr);
3198   tree t2 = TRAIT_EXPR_TYPE2 (expr);
3199   switch (TRAIT_EXPR_KIND (expr))
3200     {
3201     case CPTK_HAS_NOTHROW_ASSIGN:
3202       inform (loc, "  %qT is not %<nothrow%> copy assignable", t1);
3203       break;
3204     case CPTK_HAS_NOTHROW_CONSTRUCTOR:
3205       inform (loc, "  %qT is not %<nothrow%> default constructible", t1);
3206       break;
3207     case CPTK_HAS_NOTHROW_COPY:
3208       inform (loc, "  %qT is not %<nothrow%> copy constructible", t1);
3209       break;
3210     case CPTK_HAS_TRIVIAL_ASSIGN:
3211       inform (loc, "  %qT is not trivially copy assignable", t1);
3212       break;
3213     case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
3214       inform (loc, "  %qT is not trivially default constructible", t1);
3215       break;
3216     case CPTK_HAS_TRIVIAL_COPY:
3217       inform (loc, "  %qT is not trivially copy constructible", t1);
3218       break;
3219     case CPTK_HAS_TRIVIAL_DESTRUCTOR:
3220       inform (loc, "  %qT is not trivially destructible", t1);
3221       break;
3222     case CPTK_HAS_VIRTUAL_DESTRUCTOR:
3223       inform (loc, "  %qT does not have a virtual destructor", t1);
3224       break;
3225     case CPTK_IS_ABSTRACT:
3226       inform (loc, "  %qT is not an abstract class", t1);
3227       break;
3228     case CPTK_IS_BASE_OF:
3229       inform (loc, "  %qT is not a base of %qT", t1, t2);
3230       break;
3231     case CPTK_IS_CLASS:
3232       inform (loc, "  %qT is not a class", t1);
3233       break;
3234     case CPTK_IS_EMPTY:
3235       inform (loc, "  %qT is not an empty class", t1);
3236       break;
3237     case CPTK_IS_ENUM:
3238       inform (loc, "  %qT is not an enum", t1);
3239       break;
3240     case CPTK_IS_FINAL:
3241       inform (loc, "  %qT is not a final class", t1);
3242       break;
3243     case CPTK_IS_LITERAL_TYPE:
3244       inform (loc, "  %qT is not a literal type", t1);
3245       break;
3246     case CPTK_IS_POD:
3247       inform (loc, "  %qT is not a POD type", t1);
3248       break;
3249     case CPTK_IS_POLYMORPHIC:
3250       inform (loc, "  %qT is not a polymorphic type", t1);
3251       break;
3252     case CPTK_IS_SAME_AS:
3253       inform (loc, "  %qT is not the same as %qT", t1, t2);
3254       break;
3255     case CPTK_IS_STD_LAYOUT:
3256       inform (loc, "  %qT is not an standard layout type", t1);
3257       break;
3258     case CPTK_IS_TRIVIAL:
3259       inform (loc, "  %qT is not a trivial type", t1);
3260       break;
3261     case CPTK_IS_UNION:
3262       inform (loc, "  %qT is not a union", t1);
3263       break;
3264     default:
3265       gcc_unreachable ();
3266     }
3267 }
3268 
3269 static tree
diagnose_valid_expression(tree expr,tree args,tree in_decl)3270 diagnose_valid_expression (tree expr, tree args, tree in_decl)
3271 {
3272   tree result = tsubst_expr (expr, args, tf_none, in_decl, false);
3273   if (result != error_mark_node
3274       && convert_to_void (result, ICV_STATEMENT, tf_none) != error_mark_node)
3275     return result;
3276 
3277   location_t loc = cp_expr_loc_or_input_loc (expr);
3278   if (diagnosing_failed_constraint::replay_errors_p ())
3279     {
3280       /* Replay the substitution error.  */
3281       inform (loc, "the required expression %qE is invalid, because", expr);
3282       if (result == error_mark_node)
3283 	tsubst_expr (expr, args, tf_error, in_decl, false);
3284       else
3285 	convert_to_void (result, ICV_STATEMENT, tf_error);
3286     }
3287   else
3288     inform (loc, "the required expression %qE is invalid", expr);
3289 
3290   return error_mark_node;
3291 }
3292 
3293 static tree
diagnose_valid_type(tree type,tree args,tree in_decl)3294 diagnose_valid_type (tree type, tree args, tree in_decl)
3295 {
3296   tree result = tsubst (type, args, tf_none, in_decl);
3297   if (result != error_mark_node)
3298     return result;
3299 
3300   location_t loc = cp_expr_loc_or_input_loc (type);
3301   if (diagnosing_failed_constraint::replay_errors_p ())
3302     {
3303       /* Replay the substitution error.  */
3304       inform (loc, "the required type %qT is invalid, because", type);
3305       tsubst (type, args, tf_error, in_decl);
3306     }
3307   else
3308     inform (loc, "the required type %qT is invalid", type);
3309 
3310   return error_mark_node;
3311 }
3312 
3313 static void
diagnose_simple_requirement(tree req,tree args,tree in_decl)3314 diagnose_simple_requirement (tree req, tree args, tree in_decl)
3315 {
3316   diagnose_valid_expression (TREE_OPERAND (req, 0), args, in_decl);
3317 }
3318 
3319 static void
diagnose_compound_requirement(tree req,tree args,tree in_decl)3320 diagnose_compound_requirement (tree req, tree args, tree in_decl)
3321 {
3322   tree expr = TREE_OPERAND (req, 0);
3323   expr = diagnose_valid_expression (expr, args, in_decl);
3324   if (expr == error_mark_node)
3325     return;
3326 
3327   location_t loc = cp_expr_loc_or_input_loc (expr);
3328 
3329   /* Check the noexcept condition.  */
3330   if (COMPOUND_REQ_NOEXCEPT_P (req) && !expr_noexcept_p (expr, tf_none))
3331     inform (loc, "%qE is not %<noexcept%>", expr);
3332 
3333   tree type = TREE_OPERAND (req, 1);
3334   type = diagnose_valid_type (type, args, in_decl);
3335   if (type == error_mark_node)
3336     return;
3337 
3338   if (type)
3339     {
3340       subst_info quiet (tf_none, in_decl);
3341       subst_info noisy (tf_error, in_decl);
3342 
3343       /* Check the expression against the result type.  */
3344       if (tree placeholder = type_uses_auto (type))
3345 	{
3346 	  if (!type_deducible_p (expr, type, placeholder, args, quiet))
3347 	    {
3348 	      tree orig_expr = TREE_OPERAND (req, 0);
3349 	      if (diagnosing_failed_constraint::replay_errors_p ())
3350 		{
3351 		  inform (loc,
3352 			  "%qE does not satisfy return-type-requirement, "
3353 			  "because", orig_expr);
3354 		  /* Further explain the reason for the error.  */
3355 		  type_deducible_p (expr, type, placeholder, args, noisy);
3356 		}
3357 	      else
3358 		inform (loc, "%qE does not satisfy return-type-requirement",
3359 			orig_expr);
3360 	    }
3361 	}
3362       else if (!expression_convertible_p (expr, type, quiet))
3363 	{
3364 	  tree orig_expr = TREE_OPERAND (req, 0);
3365 	  if (diagnosing_failed_constraint::replay_errors_p ())
3366 	    {
3367 	      inform (loc, "cannot convert %qE to %qT because", orig_expr, type);
3368 	      /* Further explain the reason for the error.  */
3369 	      expression_convertible_p (expr, type, noisy);
3370 	    }
3371 	  else
3372 	    inform (loc, "cannot convert %qE to %qT", orig_expr, type);
3373 	}
3374     }
3375 }
3376 
3377 static void
diagnose_type_requirement(tree req,tree args,tree in_decl)3378 diagnose_type_requirement (tree req, tree args, tree in_decl)
3379 {
3380   tree type = TREE_OPERAND (req, 0);
3381   diagnose_valid_type (type, args, in_decl);
3382 }
3383 
3384 static void
diagnose_nested_requirement(tree req,tree args)3385 diagnose_nested_requirement (tree req, tree args)
3386 {
3387   /* Quietly check for satisfaction first. We can elaborate details
3388      later if needed.  */
3389   tree norm = TREE_VALUE (TREE_TYPE (req));
3390   subst_info info (tf_none, NULL_TREE);
3391   tree result = satisfy_constraint (norm, args, info);
3392   if (result == boolean_true_node)
3393     return;
3394 
3395   tree expr = TREE_OPERAND (req, 0);
3396   location_t loc = cp_expr_location (expr);
3397   if (diagnosing_failed_constraint::replay_errors_p ())
3398     {
3399       /* Replay the substitution error.  */
3400       inform (loc, "nested requirement %qE is not satisfied, because", expr);
3401       subst_info noisy (tf_warning_or_error, NULL_TREE);
3402       satisfy_constraint_expression (expr, args, noisy);
3403     }
3404   else
3405     inform (loc, "nested requirement %qE is not satisfied", expr);
3406 
3407 }
3408 
3409 static void
diagnose_requirement(tree req,tree args,tree in_decl)3410 diagnose_requirement (tree req, tree args, tree in_decl)
3411 {
3412   iloc_sentinel loc_s (cp_expr_location (req));
3413   switch (TREE_CODE (req))
3414     {
3415     case SIMPLE_REQ:
3416       return diagnose_simple_requirement (req, args, in_decl);
3417     case COMPOUND_REQ:
3418       return diagnose_compound_requirement (req, args, in_decl);
3419     case TYPE_REQ:
3420       return diagnose_type_requirement (req, args, in_decl);
3421     case NESTED_REQ:
3422       return diagnose_nested_requirement (req, args);
3423     default:
3424        gcc_unreachable ();
3425     }
3426 }
3427 
3428 static void
diagnose_requires_expr(tree expr,tree map,tree in_decl)3429 diagnose_requires_expr (tree expr, tree map, tree in_decl)
3430 {
3431   local_specialization_stack stack (lss_copy);
3432   tree parms = TREE_OPERAND (expr, 0);
3433   tree body = TREE_OPERAND (expr, 1);
3434   tree args = get_mapped_args (map);
3435 
3436   cp_unevaluated u;
3437   subst_info info (tf_warning_or_error, NULL_TREE);
3438   tree vars = tsubst_constraint_variables (parms, args, info);
3439   if (vars == error_mark_node)
3440     return;
3441 
3442   tree p = body;
3443   while (p)
3444     {
3445       tree req = TREE_VALUE (p);
3446       diagnose_requirement (req, args, in_decl);
3447       p = TREE_CHAIN (p);
3448     }
3449 }
3450 
3451 /* Diagnose a substitution failure in the atomic constraint T when applied
3452    with the instantiated parameter mapping MAP.  */
3453 
3454 static void
diagnose_atomic_constraint(tree t,tree map,tree result,subst_info info)3455 diagnose_atomic_constraint (tree t, tree map, tree result, subst_info info)
3456 {
3457   /* If the constraint is already ill-formed, we've previously diagnosed
3458      the reason. We should still say why the constraints aren't satisfied.  */
3459   if (t == error_mark_node)
3460     {
3461       location_t loc;
3462       if (info.in_decl)
3463         loc = DECL_SOURCE_LOCATION (info.in_decl);
3464       else
3465         loc = input_location;
3466       inform (loc, "invalid constraints");
3467       return;
3468     }
3469 
3470   location_t loc = get_constraint_error_location (t);
3471   iloc_sentinel loc_s (loc);
3472 
3473   /* Generate better diagnostics for certain kinds of expressions.  */
3474   tree expr = ATOMIC_CONSTR_EXPR (t);
3475   STRIP_ANY_LOCATION_WRAPPER (expr);
3476   switch (TREE_CODE (expr))
3477     {
3478     case TRAIT_EXPR:
3479       diagnose_trait_expr (expr, map);
3480       break;
3481     case REQUIRES_EXPR:
3482       diagnose_requires_expr (expr, map, info.in_decl);
3483       break;
3484     default:
3485       tree a = copy_node (t);
3486       ATOMIC_CONSTR_MAP (a) = map;
3487       if (!same_type_p (TREE_TYPE (result), boolean_type_node))
3488 	error_at (loc, "constraint %qE has type %qT, not %<bool%>",
3489 		  a, TREE_TYPE (result));
3490       else
3491 	inform (loc, "the expression %qE evaluated to %<false%>", a);
3492       ggc_free (a);
3493     }
3494 }
3495 
3496 GTY(()) tree current_failed_constraint;
3497 
3498 diagnosing_failed_constraint::
diagnosing_failed_constraint(tree t,tree args,bool diag)3499 diagnosing_failed_constraint (tree t, tree args, bool diag)
3500   : diagnosing_error (diag)
3501 {
3502   if (diagnosing_error)
3503     {
3504       current_failed_constraint
3505 	= tree_cons (args, t, current_failed_constraint);
3506       ++current_constraint_diagnosis_depth;
3507     }
3508 }
3509 
3510 diagnosing_failed_constraint::
~diagnosing_failed_constraint()3511 ~diagnosing_failed_constraint ()
3512 {
3513   if (diagnosing_error)
3514     {
3515       --current_constraint_diagnosis_depth;
3516       if (current_failed_constraint)
3517 	current_failed_constraint = TREE_CHAIN (current_failed_constraint);
3518     }
3519 
3520 }
3521 
3522 /* Whether we are allowed to replay an error that underlies a constraint failure
3523    at the current diagnosis depth.  */
3524 
3525 bool
replay_errors_p()3526 diagnosing_failed_constraint::replay_errors_p ()
3527 {
3528   if (current_constraint_diagnosis_depth >= concepts_diagnostics_max_depth)
3529     {
3530       concepts_diagnostics_max_depth_exceeded_p = true;
3531       return false;
3532     }
3533   else
3534     return true;
3535 }
3536 
3537 /* Emit diagnostics detailing the failure ARGS to satisfy the constraints
3538    of T. Here, T can be either a constraint or a declaration.  */
3539 
3540 void
diagnose_constraints(location_t loc,tree t,tree args)3541 diagnose_constraints (location_t loc, tree t, tree args)
3542 {
3543   inform (loc, "constraints not satisfied");
3544 
3545   if (concepts_diagnostics_max_depth == 0)
3546     return;
3547 
3548   /* Replay satisfaction, but diagnose errors.  */
3549   if (!args)
3550     constraint_satisfaction_value (t, tf_warning_or_error);
3551   else
3552     constraint_satisfaction_value (t, args, tf_warning_or_error);
3553 
3554   static bool suggested_p;
3555   if (concepts_diagnostics_max_depth_exceeded_p
3556       && current_constraint_diagnosis_depth == 0
3557       && !suggested_p)
3558     {
3559       inform (UNKNOWN_LOCATION,
3560 	      "set %qs to at least %d for more detail",
3561 	      "-fconcepts-diagnostics-depth=",
3562 	      concepts_diagnostics_max_depth + 1);
3563       suggested_p = true;
3564     }
3565 }
3566 
3567 #include "gt-cp-constraint.h"
3568