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