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