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