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